diff --git a/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java b/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java index e24464bf55..916c3a5457 100644 --- a/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java +++ b/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java @@ -5,6 +5,7 @@ import io.dataease.auth.entity.TokenInfo; import io.dataease.auth.service.AuthUserService; import io.dataease.auth.service.impl.AuthUserServiceImpl; import io.dataease.auth.util.JWTUtils; +import io.dataease.dto.PermissionProxy; import io.dataease.ext.ExtTaskMapper; import io.dataease.commons.utils.CommonBeanFactory; import io.dataease.commons.utils.CronUtils; @@ -19,6 +20,7 @@ import io.dataease.plugins.xpack.email.dto.request.XpackEmailTaskRequest; import io.dataease.plugins.xpack.email.dto.request.XpackPixelEntity; import io.dataease.plugins.xpack.email.dto.response.XpackEmailTemplateDTO; import io.dataease.plugins.xpack.email.service.EmailXpackService; +import io.dataease.service.chart.ViewExportExcel; import io.dataease.service.system.EmailService; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; @@ -27,7 +29,11 @@ import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.io.File; +import java.util.Arrays; +import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; @Service("emailTaskHandler") public class EmailTaskHandler extends TaskHandler implements Job { @@ -39,6 +45,9 @@ public class EmailTaskHandler extends TaskHandler implements Job { @Resource private AuthUserServiceImpl authUserServiceImpl; + @Resource + private ViewExportExcel viewExportExcel; + @Override protected JobDataMap jobDataMap(GlobalTaskEntity taskEntity) { JobDataMap jobDataMap = new JobDataMap(); @@ -132,8 +141,8 @@ public class EmailTaskHandler extends TaskHandler implements Job { } @Async("priorityExecutor") - public void sendReport(GlobalTaskInstance taskInstance, XpackEmailTemplateDTO emailTemplateDTO, - SysUserEntity user) { + public void sendReport(GlobalTaskInstance taskInstance, XpackEmailTemplateDTO emailTemplateDTO, SysUserEntity user) { + EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class); try { XpackEmailTaskRequest taskForm = emailXpackService.taskForm(taskInstance.getTaskId()); @@ -158,8 +167,14 @@ public class EmailTaskHandler extends TaskHandler implements Job { if (ObjectUtils.isNotEmpty(content)) { contentStr = new String(content, "UTF-8"); } - emailService.sendWithImage(recipients, emailTemplateDTO.getTitle(), - contentStr, bytes); + + String viewIds = emailTemplateDTO.getViewIds(); + List viewIdList = Arrays.asList(viewIds.split(",")).stream().map(s -> (s.trim())).collect(Collectors.toList()); + + PermissionProxy proxy = new PermissionProxy(); + proxy.setUserId(user.getUserId()); + List files = viewExportExcel.export(panelId, viewIdList, proxy); + emailService.sendWithImageAndFiles(recipients, emailTemplateDTO.getTitle(), contentStr, bytes, files); success(taskInstance); } catch (Exception e) { diff --git a/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskViewHandler.java b/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskViewHandler.java index 34881d2881..dbb2cbe65f 100644 --- a/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskViewHandler.java +++ b/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskViewHandler.java @@ -1,74 +1,24 @@ package io.dataease.job.sechedule.strategy.impl; import io.dataease.auth.entity.SysUserEntity; -import io.dataease.commons.utils.CronUtils; -import io.dataease.commons.utils.LogUtil; -import io.dataease.dto.PermissionProxy; + import io.dataease.plugins.common.entity.GlobalTaskInstance; -import io.dataease.plugins.config.SpringContextUtil; -import io.dataease.plugins.xpack.email.dto.request.XpackEmailTaskRequest; + import io.dataease.plugins.xpack.email.dto.response.XpackEmailTemplateDTO; -import io.dataease.plugins.xpack.email.service.EmailXpackService; -import io.dataease.service.chart.ViewExportExcel; -import io.dataease.service.system.EmailService; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.ObjectUtils; + import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import javax.annotation.Resource; -import java.io.File; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; + @Service("emailTaskViewHandler") public class EmailTaskViewHandler extends EmailTaskHandler { - @Resource - private ViewExportExcel viewExportExcel; + @Async("priorityExecutor") - public void sendReport(GlobalTaskInstance taskInstance, XpackEmailTemplateDTO emailTemplateDTO, - SysUserEntity user) { - EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class); - List files = null; - try { - XpackEmailTaskRequest taskForm = emailXpackService.taskForm(taskInstance.getTaskId()); - if (ObjectUtils.isEmpty(taskForm) || CronUtils.taskExpire(taskForm.getEndTime())) { - removeInstance(taskInstance); - return; - } - String panelId = emailTemplateDTO.getPanelId(); - - // 下面继续执行发送邮件的 - byte[] content = emailTemplateDTO.getContent(); - EmailService emailService = SpringContextUtil.getBean(EmailService.class); - - String contentStr = ""; - if (ObjectUtils.isNotEmpty(content)) { - contentStr = new String(content, "UTF-8"); - } - String viewIds = emailTemplateDTO.getPixel(); - List viewIdList = Arrays.asList(viewIds.split(",")).stream().map(s -> (s.trim())) - .collect(Collectors.toList()); - PermissionProxy proxy = new PermissionProxy(); - proxy.setUserId(user.getUserId()); - files = viewExportExcel.export(panelId, viewIdList, proxy); - emailService.sendWithFiles(emailTemplateDTO.getRecipients(), emailTemplateDTO.getTitle(), contentStr, files); - success(taskInstance); - } catch (Exception e) { - error(taskInstance, e); - LogUtil.error(e.getMessage(), e); - } finally { - if (CollectionUtils.isNotEmpty(files)) { - for (int i = 0; i < files.size(); i++) { - File file = files.get(i); - if (file.exists()) { - file.delete(); - } - } - } - } + public void sendReport(GlobalTaskInstance taskInstance, XpackEmailTemplateDTO emailTemplateDTO, SysUserEntity user) { + super.sendReport(taskInstance, emailTemplateDTO, user); } } diff --git a/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java b/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java index df7fdf2d04..d22f24dad6 100644 --- a/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java +++ b/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java @@ -136,6 +136,8 @@ public class PanelGroupService { public String update(PanelGroupRequest request) { String panelId = request.getId(); + request.setUpdateTime(System.currentTimeMillis()); + request.setUpdateBy(AuthUtils.getUser().getUsername()); panelViewService.syncPanelViews(request); if ("toDefaultPanel".equals(request.getOptType())) { // 转存为默认仪表板 panelId = UUID.randomUUID().toString(); @@ -148,6 +150,7 @@ public class PanelGroupService { newDefaultPanel.setLevel(0); newDefaultPanel.setSource(request.getId()); newDefaultPanel.setCreateBy(AuthUtils.getUser().getUsername()); + newDefaultPanel.setCreateTime(System.currentTimeMillis()); checkPanelName(newDefaultPanel.getName(), newDefaultPanel.getPid(), PanelConstants.OPT_TYPE_INSERT, newDefaultPanel.getId(), newDefaultPanel.getNodeType()); panelGroupMapper.insertSelective(newDefaultPanel); // 清理权限缓存 @@ -179,6 +182,8 @@ public class PanelGroupService { record.setName(request.getName()); record.setId(request.getId()); record.setPid(request.getPid()); + record.setUpdateTime(request.getUpdateTime()); + record.setUpdateBy(request.getUpdateBy()); panelGroupMapper.updateByPrimaryKeySelective(record); DeLogUtils.save(SysLogConstants.OPERATE_TYPE.MODIFY, sourceType, request.getId(), panelInfo.getPid(), request.getPid(), sourceType); @@ -338,6 +343,7 @@ public class PanelGroupService { newPanel.setName(request.getName()); newPanel.setId(newPanelId); newPanel.setCreateBy(AuthUtils.getUser().getUsername()); + newPanel.setCreateTime(System.currentTimeMillis()); //TODO copy panelView extPanelViewMapper.copyFromPanel(newPanelId, sourcePanelId, copyId); //TODO 复制视图 chart_view diff --git a/backend/src/main/java/io/dataease/service/system/EmailService.java b/backend/src/main/java/io/dataease/service/system/EmailService.java index ade9939eb8..483ddd4056 100644 --- a/backend/src/main/java/io/dataease/service/system/EmailService.java +++ b/backend/src/main/java/io/dataease/service/system/EmailService.java @@ -1,5 +1,6 @@ package io.dataease.service.system; +import cn.hutool.core.util.ArrayUtil; import io.dataease.commons.constants.ParamConstants; import io.dataease.commons.exception.DEException; import io.dataease.commons.utils.CommonBeanFactory; @@ -81,10 +82,15 @@ public class EmailService { } } - public void sendWithFiles(String to, String title, String content, List files) { + + + + + public void sendWithImageAndFiles(String to, String title, String content, byte[] bytes, List files) { if (StringUtils.isBlank(to)) return; - if (CollectionUtils.isEmpty(files)) { + + if (ArrayUtil.isEmpty(bytes)) { send(to, title, content); return; } @@ -92,19 +98,12 @@ public class EmailService { checkMailInfo(mailInfo); JavaMailSenderImpl driver = driver(mailInfo); MimeMessage mimeMessage = driver.createMimeMessage(); - MimeBodyPart text = new MimeBodyPart(); + MimeMultipart multipart = new MimeMultipart(); + try { - MimeMultipart multipart = new MimeMultipart(); - text.setText(content, "gb2312"); - multipart.addBodyPart(text); - multipart.setSubType("related"); - for (int i = 0; i < files.size(); i++) { - File file = files.get(i); - MimeBodyPart attach = new MimeBodyPart(); - FileDataSource fileDataSource = new FileDataSource(file); - attach.setDataHandler(new DataHandler(fileDataSource)); - attach.setFileName(MimeUtility.encodeText(file.getName())); - multipart.addBodyPart(attach); + multipart = addImage(multipart, bytes, content); + if (CollectionUtils.isNotEmpty(files)) { + multipart = addFiles(multipart, files); } mimeMessage.setFrom(driver.getUsername()); mimeMessage.setSubject(title); @@ -117,38 +116,33 @@ public class EmailService { } } - public void sendWithImage(String to, String title, String content, byte[] bytes) { - if (StringUtils.isBlank(to)) - return; - MailInfo mailInfo = proxy().mailInfo(); - checkMailInfo(mailInfo); - JavaMailSenderImpl driver = driver(mailInfo); - MimeMessage mimeMessage = driver.createMimeMessage(); - + private MimeMultipart addImage(MimeMultipart multipart, byte[] bytes, String content) throws Exception{ MimeBodyPart image = new MimeBodyPart(); DataHandler png = new DataHandler(new ByteArrayDataSource(bytes, "image/png")); - String uuid = UUID.randomUUID().toString(); MimeBodyPart text = new MimeBodyPart(); - try { + text.setContent(content + "
", "text/html; charset=gb2312"); + image.setDataHandler(png); + image.setContentID(uuid); - text.setContent(content + "
", - "text/html; charset=gb2312"); - image.setDataHandler(png); - image.setContentID(uuid); - MimeMultipart multipart = new MimeMultipart(); - multipart.addBodyPart(text); - multipart.addBodyPart(image); - multipart.setSubType("related"); - mimeMessage.setFrom(driver.getUsername()); - mimeMessage.setSubject(title); - mimeMessage.setRecipients(Message.RecipientType.TO, to); - mimeMessage.setContent(multipart); - driver.send(mimeMessage); - } catch (Exception e) { - LogUtil.error(e.getMessage(), e); - throw new RuntimeException(e); + multipart.addBodyPart(text); + multipart.addBodyPart(image); + multipart.setSubType("related"); + return multipart; + } + + private MimeMultipart addFiles(MimeMultipart multipart, List files) throws Exception{ + for (int i = 0; i < files.size(); i++) { + File file = files.get(i); + MimeBodyPart attach = new MimeBodyPart(); + FileDataSource fileDataSource = new FileDataSource(file); + attach.setDataHandler(new DataHandler(fileDataSource)); + attach.setFileName(MimeUtility.encodeText(file.getName())); + multipart.addBodyPart(attach); } + System.getProperties().setProperty("mail.mime.splitlongparameters", "false"); + multipart.setSubType("related"); + return multipart; } public JavaMailSenderImpl driver(MailInfo mailInfo) { diff --git a/backend/src/main/resources/db/migration/V38__1.13.sql b/backend/src/main/resources/db/migration/V38__1.13.sql index 943be293a4..05d1a9ec6f 100644 --- a/backend/src/main/resources/db/migration/V38__1.13.sql +++ b/backend/src/main/resources/db/migration/V38__1.13.sql @@ -72,4 +72,13 @@ INSERT INTO `system_parameter` (`param_key`, `param_value`, `type`, `sort`) VALU INSERT INTO `system_parameter` (`param_key`, `param_value`, `type`, `sort`) VALUES ('basic.templateMarketUlr', 'https://dataease.io/templates', 'text', 4); -ALTER TABLE `dataset_column_permissions` ADD COLUMN `white_list_user` longtext DEFAULT NULL COMMENT '白名单' AFTER `permissions` ; \ No newline at end of file + +ALTER TABLE `dataset_column_permissions` ADD COLUMN `white_list_user` longtext DEFAULT NULL COMMENT '白名单' AFTER `permissions` ; + +ALTER TABLE `panel_group` + ADD COLUMN `update_by` varchar(255) NULL COMMENT '更新人' AFTER `status`, +ADD COLUMN `update_time` bigint(13) NULL COMMENT '更新时间' AFTER `update_by`; + +ALTER TABLE `sys_task_email` +ADD COLUMN `view_ids` varchar(255) NULL COMMENT '视图ID集合' AFTER `task_id`; + diff --git a/frontend/src/api/panel/panel.js b/frontend/src/api/panel/panel.js index d97c41b615..0827fa10b1 100644 --- a/frontend/src/api/panel/panel.js +++ b/frontend/src/api/panel/panel.js @@ -154,7 +154,11 @@ export function initPanelData(panelId, callback) { name: response.data.name, privileges: response.data.privileges, sourcePanelName: response.data.sourcePanelName, - status: response.data.status + status: response.data.status, + createBy: response.data.createBy, + createTime: response.data.createTime, + updateBy: response.data.updateBy, + updateTime: response.data.updateTime }) // 刷新联动信息 getPanelAllLinkageInfo(panelId).then(rsp => { diff --git a/frontend/src/api/panel/shareProxy.js b/frontend/src/api/panel/shareProxy.js index c47d5b3fb4..f171f73429 100644 --- a/frontend/src/api/panel/shareProxy.js +++ b/frontend/src/api/panel/shareProxy.js @@ -13,7 +13,11 @@ export function proxyInitPanelData(panelId, proxy, callback) { name: response.data.name, privileges: response.data.privileges, proxy: proxy.userId, - status: response.data.status + status: response.data.status, + createBy: response.data.createBy, + createTime: response.data.createTime, + updateBy: response.data.updateBy, + updateTime: response.data.updateTime }) // 刷新联动信息 getPanelAllLinkageInfo(panelId, proxy).then(rsp => { diff --git a/frontend/src/api/staticResource/staticResource.js b/frontend/src/api/staticResource/staticResource.js index 40ee10055e..9af311c16d 100644 --- a/frontend/src/api/staticResource/staticResource.js +++ b/frontend/src/api/staticResource/staticResource.js @@ -2,9 +2,7 @@ import request from '@/utils/request' import { uuid } from 'vue-uuid' import store from '@/store' -export function uploadFile(fileId, file) { - const param = new FormData() - param.append('file', file.file) +export function uploadFile(fileId, param) { return request({ url: '/static/resource/upload/' + fileId, method: 'post', @@ -16,10 +14,12 @@ export function uploadFile(fileId, file) { export function uploadFileResult(file, callback) { const fileId = uuid.v1() - const fileName = file.file.name + const fileName = file.name const newFileName = fileId + fileName.substr(fileName.lastIndexOf('.'), fileName.length) const fileUrl = store.state.staticResourcePath + newFileName - uploadFile(fileId, file).then(() => { + const param = new FormData() + param.append('file', file) + uploadFile(fileId, param).then(() => { callback(fileUrl) }) } diff --git a/frontend/src/components/DeDrag/index.vue b/frontend/src/components/DeDrag/index.vue index 96a4026158..58572224d4 100644 --- a/frontend/src/components/DeDrag/index.vue +++ b/frontend/src/components/DeDrag/index.vue @@ -595,14 +595,14 @@ export default { return (this.canvasStyleData.panel.gap === 'yes' && this.element.auxiliaryMatrix) ? this.componentGap : 0 }, miniWidth() { - return this.element.auxiliaryMatrix ? this.curCanvasScale.matrixStyleWidth * (this.element.miniSizex || 1) : 0 + return this.element.auxiliaryMatrix ? this.curCanvasScale.matrixStyleWidth * 4 : 0 }, miniHeight() { if (this.element.auxiliaryMatrix) { if (this.element.component === 'de-number-range') { - return this.element.auxiliaryMatrix ? this.curCanvasScale.matrixStyleHeight * (this.element.miniSizey || 2) : 0 + return this.element.auxiliaryMatrix ? this.curCanvasScale.matrixStyleHeight * 4 : 0 } else { - return this.element.auxiliaryMatrix ? this.curCanvasScale.matrixStyleHeight * (this.element.miniSizey || 1) : 0 + return this.element.auxiliaryMatrix ? this.curCanvasScale.matrixStyleHeight * 4 : 0 } } else { return 0 diff --git a/frontend/src/components/DeViewSelect/index.bak.vue b/frontend/src/components/DeViewSelect/index.bak.vue new file mode 100644 index 0000000000..40160056f6 --- /dev/null +++ b/frontend/src/components/DeViewSelect/index.bak.vue @@ -0,0 +1,238 @@ + + + + + diff --git a/frontend/src/components/DeViewSelect/index.vue b/frontend/src/components/DeViewSelect/index.vue index 40160056f6..e532e9a95e 100644 --- a/frontend/src/components/DeViewSelect/index.vue +++ b/frontend/src/components/DeViewSelect/index.vue @@ -3,7 +3,6 @@ - - -
- -
+ -
- - -
+ + +
+ +
+ + +
+ + \ No newline at end of file diff --git a/frontend/src/components/widget/serviceImpl/ButtonSureServiceImpl.js b/frontend/src/components/widget/serviceImpl/ButtonSureServiceImpl.js index 5b0f627444..e107121d86 100644 --- a/frontend/src/components/widget/serviceImpl/ButtonSureServiceImpl.js +++ b/frontend/src/components/widget/serviceImpl/ButtonSureServiceImpl.js @@ -2,15 +2,15 @@ import { WidgetService } from '../service/WidgetService' const leftPanel = { icon: 'iconfont icon-chaxunsousuo', - label: '确定', + label: '查询按钮', defaultClass: 'time-filter' } const drawPanel = { - type: 'custom', + type: 'custom-button', style: { - width: 300, - height: 47, + width: 150, + height: 60, fontSize: 14, fontWeight: 500, lineHeight: '', @@ -21,9 +21,12 @@ const drawPanel = { options: { attrs: { type: 'primary', - round: true + round: false, + plain: true, + customRange: false, + filterIds: [] }, - value: '测试按钮' + value: '查询' }, component: 'de-button', miniSizex: 1, @@ -35,6 +38,7 @@ class ButtonSureServiceImpl extends WidgetService { Object.assign(options, { name: 'buttonSureWidget' }) super(options) this.filterDialog = false + this.buttonDialog = true this.showSwitch = false } diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js index c6d407daaa..429ffa0efa 100644 --- a/frontend/src/lang/en.js +++ b/frontend/src/lang/en.js @@ -132,7 +132,7 @@ export default { }, commons: { manage_member: 'Managing members', - user_confirm_remove_cancel:'Are you sure you want to remove the user from the role?', + user_confirm_remove_cancel: 'Are you sure you want to remove the user from the role?', confirm_remove_cancel: 'Are you sure to delete the role?', default_value: 'Default Value', params_value: 'Param Value', @@ -623,12 +623,11 @@ export default { can_not_move: `Can't be removed, keep at least one administrator`, manage_can_not_move: 'Administrator is a preset role of the system. By default, he has all the permissions of system management and cannot be deleted', manage_can_not_update: 'Administrator is a preset role of the system. By default, he has all the permissions of system management and cannot be edit', - role_name: 'Role name', role_description: 'Role description', editer_role: 'Edit role', add_role: 'Add role', role_name_exist: 'The role name already exists', - search_by_role: 'Search by role name', + search_by_role: 'Search by role name' }, menu: { parent_category: 'Parent Category', @@ -667,7 +666,6 @@ export default { member: 'member', organization: 'organization', add_user: 'Add user', - search_by_name: 'Search by organization name', sure_move_user: 'Are you sure to remove this user from the organization?', move_success: 'Removed successfully', user: 'user', @@ -680,9 +678,8 @@ export default { canot_delete: 'Cannot delete', remove_user_first: 'Please remove all users in the organization before deleting the organization', sure_delete_organization: 'Are you sure to delete this organization?', - delete: 'delete', add_child_org: 'Add sub organization', - edite_organization: 'Edit organization', + edite_organization: 'Edit organization' }, system_parameter_setting: { mailbox_service_settings: 'Mail Settings', @@ -1179,6 +1176,7 @@ export default { remark_bg_color: 'Background Fill' }, dataset: { + parse_filed: 'Parse Field', field_rename: 'Rename Field', params_work: 'Effective only when editing SQL', sql_variable_limit_1: '1、SQL variables can only be used in where conditions', @@ -1546,6 +1544,13 @@ export default { sure_bt: 'Confirm' }, panel: { + panel_background_item: 'Customize panel background', + panel_background_image_tips: 'Currently.Jpeg,.Jpg,.Png,.Gif files are supported, and the size should not exceed 15m', + reUpload: 'reUpload', + create_by: 'Create By', + create_time: 'Create Time', + update_by: 'Update By', + update_time: 'Update Time', target_url: 'Target Url', target_url_tips: 'You can click fields to splice URLs or parameters', select_world: 'Select World', @@ -1919,8 +1924,6 @@ export default { column_permission: 'Column permission rule', enable_column: 'Enable column permissions', search_by_field: 'Search by field name', - add_condition: 'Add condition', - add_relationship: 'Add relationship', filter_fields: 'Filter fields', selct_filter_fields: 'Please select a filter field', enter_keywords: 'Please enter keywords', @@ -1934,7 +1937,7 @@ export default { please_fill: 'Please fill in one line and add 500 at most. Duplicate options and added options will be automatically filtered when identifying and entering', close: 'close', add: 'add to', - sure: 'determine', + sure: 'determine' }, about: { auth_to: 'Authorized to', diff --git a/frontend/src/lang/tw.js b/frontend/src/lang/tw.js index 49f37db3be..82b5fa89e7 100644 --- a/frontend/src/lang/tw.js +++ b/frontend/src/lang/tw.js @@ -624,12 +624,11 @@ export default { can_not_move: '不可移除,至少保留一位管理員', manage_can_not_move: '管理員是系統預置角色,默認擁有系統管理全部權限,無法刪除', manage_can_not_update: '管理員是系統預置角色,默認擁有系統管理全部權限,無法編輯', - role_name: '角色名稱', role_description: '角色描述', editer_role: '編輯角色', add_role: '添加角色', role_name_exist: '該角色名稱已存在', - search_by_role: '通過角色名稱搜索', + search_by_role: '通過角色名稱搜索' }, menu: { parent_category: '上級目錄', @@ -658,7 +657,6 @@ export default { create_time: '創建日期', create: '新建組織', modify: '修改組織', - delete: '刪除組織', delete_confirm: '確定要刪除該組織嗎?', input_name: '請輸入組織名稱', select_organization: '請選擇組織', @@ -668,7 +666,6 @@ export default { member: '成員', organization: '組織', add_user: '添加用戶', - search_by_name: '通過組織名稱搜索', sure_move_user: '確定將該用戶從組織中移除嗎?', move_success: '移除成功', user: '用戶', @@ -683,7 +680,7 @@ export default { sure_delete_organization: '確定刪除該組織嗎?', delete: '刪除', add_child_org: '添加子組織', - edite_organization: '編輯組織', + edite_organization: '編輯組織' }, system_parameter_setting: { mailbox_service_settings: '郵件設置', @@ -1178,6 +1175,7 @@ export default { remark_bg_color: '背景填充' }, dataset: { + parse_filed: '解析字段', field_rename: '字段重命名', params_work: '僅在編輯 sql 時生效', sql_variable_limit_1: '1、SQL變數只能在WHERE條件中使用', @@ -1546,6 +1544,13 @@ export default { sure_bt: '確定' }, panel: { + panel_background_item: '自定义仪表板背景', + panel_background_image_tips: '当前支持.jpeg,.jpg,.png,.gif文件,大小不要超过15M', + reUpload: '重新上传', + create_by: '创建人', + create_time: '创建时间', + update_by: '最近修改人', + update_time: '最近修改时间', target_url: '目标URL', target_url_tips: '可以点击字段用来拼接URL或者参数', select_world: '点击选择字段', @@ -1930,8 +1935,6 @@ export default { column_permission: '列權限規則', enable_column: '啟用列權限', search_by_field: '通過字段名稱搜索', - add_condition: '添加條件', - add_relationship: '添加關系', filter_fields: '篩選字段', selct_filter_fields: '請選擇篩選字段', enter_keywords: '請輸關鍵字', @@ -1945,7 +1948,7 @@ export default { please_fill: '請一行填一個,最多添加500個,識別錄入時會自動過濾重復的選項和已經添加過的選項', close: '關 閉', add: '添 加', - sure: '確 定', + sure: '確 定' }, about: { auth_to: '授權給', diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index 4a4e92425c..4bc67a27ac 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -133,7 +133,7 @@ export default { commons: { manage_member: '管理成员', confirm_remove_cancel: '确定删除该角色吗?', - user_confirm_remove_cancel:'确定将该用户从角色中移除吗?', + user_confirm_remove_cancel: '确定将该用户从角色中移除吗?', default_value: '默认值', params_value: '参数值', input_role_name: '请输入角色名称', @@ -615,7 +615,6 @@ export default { modify: '修改角色', tips: '提示', confirm_delete: '确认删除角色 ', - role_name: '角色名称', search_by_name: '按名称搜索', pls_input_name: '请输入名称', search_by_name_email: '通过姓名或邮箱搜索', @@ -630,7 +629,7 @@ export default { editer_role: '编辑角色', add_role: '添加角色', role_name_exist: '该角色名称已存在', - search_by_role: '通过角色名称搜索', + search_by_role: '通过角色名称搜索' }, menu: { parent_category: '上级目录', @@ -659,7 +658,6 @@ export default { create_time: '创建日期', create: '新建组织', modify: '修改组织', - delete: '删除组织', delete_confirm: '确定要删除该组织吗?', input_name: '请输入组织名称', select_organization: '请选择组织', @@ -669,7 +667,6 @@ export default { member: '成员', organization: '组织', add_user: '添加用户', - search_by_name: '通过组织名称搜索', sure_move_user: '确定将该用户从组织中移除吗?', move_success: '移除成功', user: '用户', @@ -684,7 +681,7 @@ export default { sure_delete_organization: '确定删除该组织吗?', delete: '删除', add_child_org: '添加子组织', - edite_organization: '编辑组织', + edite_organization: '编辑组织' }, system_parameter_setting: { mailbox_service_settings: '邮件设置', @@ -1180,6 +1177,7 @@ export default { remark_bg_color: '背景填充' }, dataset: { + parse_filed: '解析字段', field_rename: '字段重命名', params_work: '仅在编辑sql时生效', select_year: '选择年', @@ -1554,6 +1552,13 @@ export default { sure_bt: '确定' }, panel: { + panel_background_item: '自定义仪表板背景', + panel_background_image_tips: '当前支持.jpeg,.jpg,.png,.gif文件,大小不要超过15M', + reUpload: '重新上传', + create_by: '创建人', + create_time: '创建时间', + update_by: '最近修改人', + update_time: '最近修改时间', target_url: '目标URL', target_url_tips: '可以点击字段用来拼接URL或者参数', select_world: '点击选择字段', @@ -1931,8 +1936,6 @@ export default { row_column: '行列权限设置', row_permission: '行权限规则', enable_row: '启用行权限', - add_condition: '添加条件', - add_relationship: '添加关系', white_list: '白名单', white_user_not: '以上权限规则对白名单用户不生效', organization_or_role: '请选择组织或角色', @@ -1954,7 +1957,7 @@ export default { please_fill: '请一行填一个,最多添加500个,识别录入时会自动过滤重复的选项和已经添加过的选项', close: '关 闭', add: '添 加', - sure: '确 定', + sure: '确 定' }, about: { auth_to: '授权给', diff --git a/frontend/src/layout/components/Topbar.vue b/frontend/src/layout/components/Topbar.vue index 9459ee439d..5786652d3d 100644 --- a/frontend/src/layout/components/Topbar.vue +++ b/frontend/src/layout/components/Topbar.vue @@ -329,7 +329,7 @@ export default { if (result !== 'success' && result !== 'fail') { window.location.href = result } else { - this.$router.push(`/login?redirect=${this.$route.fullPath}`) + this.$router.push('/login') } }, loadUiInfo() { diff --git a/frontend/src/permission.js b/frontend/src/permission.js index e06dc31f53..a2898d8ab1 100644 --- a/frontend/src/permission.js +++ b/frontend/src/permission.js @@ -92,7 +92,8 @@ router.beforeEach(async(to, from, next) => { next() } else { // other pages that do not have permission to access are redirected to the login page. - next(`/login?redirect=${to.path}`) + // next(`/login?redirect=${to.path}`) + next('/login') NProgress.done() } } diff --git a/frontend/src/styles/index.scss b/frontend/src/styles/index.scss index 45f0623dee..a75619b95b 100644 --- a/frontend/src/styles/index.scss +++ b/frontend/src/styles/index.scss @@ -110,6 +110,23 @@ div:focus { } } +.de-button-dialog { + min-width: 250px !important; + width: 30% !important; + + .el-dialog__header { + padding: 10px 20px !important; + + .el-dialog__headerbtn { + top: 15px !important; + } + } + + .el-dialog__body { + padding: 1px 15px !important; + } +} + .de-style-dialog { width: 600px !important; diff --git a/frontend/src/views/background/index.vue b/frontend/src/views/background/index.vue index c1659f9d3b..df0ed3d101 100644 --- a/frontend/src/views/background/index.vue +++ b/frontend/src/views/background/index.vue @@ -213,7 +213,7 @@ export default { }, upload(file) { const _this = this - uploadFileResult(file, (fileUrl) => { + uploadFileResult(file.file, (fileUrl) => { _this.curComponent.commonBackground.outerImage = fileUrl }) } diff --git a/frontend/src/views/chart/chart/common/common_table.js b/frontend/src/views/chart/chart/common/common_table.js index 23f1a32b73..32c26e808a 100644 --- a/frontend/src/views/chart/chart/common/common_table.js +++ b/frontend/src/views/chart/chart/common/common_table.js @@ -31,6 +31,11 @@ export function getCustomTheme(chart) { fill: DEFAULT_COLOR_CASE.tableFontColor, fontSize: DEFAULT_SIZE.tableTitleFontSize, textAlign: headerAlign + }, + measureText: { + fill: DEFAULT_COLOR_CASE.tableFontColor, + fontSize: DEFAULT_SIZE.tableTitleFontSize, + textAlign: headerAlign } }, rowCell: { @@ -48,6 +53,11 @@ export function getCustomTheme(chart) { fill: DEFAULT_COLOR_CASE.tableFontColor, fontSize: DEFAULT_SIZE.tableTitleFontSize, textAlign: headerAlign + }, + measureText: { + fill: DEFAULT_COLOR_CASE.tableFontColor, + fontSize: DEFAULT_SIZE.tableTitleFontSize, + textAlign: headerAlign } }, colCell: { @@ -65,6 +75,11 @@ export function getCustomTheme(chart) { fill: DEFAULT_COLOR_CASE.tableFontColor, fontSize: DEFAULT_SIZE.tableTitleFontSize, textAlign: headerAlign + }, + measureText: { + fill: DEFAULT_COLOR_CASE.tableFontColor, + fontSize: DEFAULT_SIZE.tableTitleFontSize, + textAlign: headerAlign } }, dataCell: { @@ -82,6 +97,11 @@ export function getCustomTheme(chart) { fill: DEFAULT_COLOR_CASE.tableFontColor, fontSize: DEFAULT_SIZE.tableItemFontSize, textAlign: itemAlign + }, + measureText: { + fill: DEFAULT_COLOR_CASE.tableFontColor, + fontSize: DEFAULT_SIZE.tableItemFontSize, + textAlign: headerAlign } } } @@ -103,24 +123,28 @@ export function getCustomTheme(chart) { theme.cornerCell.cell.verticalBorderColor = b_c theme.cornerCell.bolderText.fill = c.tableFontColor theme.cornerCell.text.fill = c.tableFontColor + theme.cornerCell.measureText.fill = c.tableFontColor theme.rowCell.cell.backgroundColor = h_c theme.rowCell.cell.horizontalBorderColor = b_c theme.rowCell.cell.verticalBorderColor = b_c theme.rowCell.bolderText.fill = c.tableFontColor theme.rowCell.text.fill = c.tableFontColor + theme.rowCell.measureText.fill = c.tableFontColor theme.colCell.cell.backgroundColor = h_c theme.colCell.cell.horizontalBorderColor = b_c theme.colCell.cell.verticalBorderColor = b_c theme.colCell.bolderText.fill = c.tableFontColor theme.colCell.text.fill = c.tableFontColor + theme.colCell.measureText.fill = c.tableFontColor theme.dataCell.cell.backgroundColor = i_c theme.dataCell.cell.horizontalBorderColor = b_c theme.dataCell.cell.verticalBorderColor = b_c theme.dataCell.bolderText.fill = c.tableFontColor theme.dataCell.text.fill = c.tableFontColor + theme.dataCell.measureText.fill = c.tableFontColor } // size if (customAttr.size) { @@ -132,21 +156,29 @@ export function getCustomTheme(chart) { theme.cornerCell.bolderText.textAlign = h_a theme.cornerCell.text.fontSize = parseInt(s.tableTitleFontSize) theme.cornerCell.text.textAlign = h_a + theme.cornerCell.measureText.fontSize = parseInt(s.tableTitleFontSize) + theme.cornerCell.measureText.textAlign = h_a theme.rowCell.bolderText.fontSize = parseInt(s.tableTitleFontSize) theme.rowCell.bolderText.textAlign = h_a theme.rowCell.text.fontSize = parseInt(s.tableTitleFontSize) theme.rowCell.text.textAlign = h_a + theme.rowCell.measureText.fontSize = parseInt(s.tableTitleFontSize) + theme.rowCell.measureText.textAlign = h_a theme.colCell.bolderText.fontSize = parseInt(s.tableTitleFontSize) theme.colCell.bolderText.textAlign = h_a theme.colCell.text.fontSize = parseInt(s.tableTitleFontSize) theme.colCell.text.textAlign = h_a + theme.colCell.measureText.fontSize = parseInt(s.tableTitleFontSize) + theme.colCell.measureText.textAlign = h_a theme.dataCell.bolderText.fontSize = parseInt(s.tableItemFontSize) theme.dataCell.bolderText.textAlign = i_a theme.dataCell.text.fontSize = parseInt(s.tableItemFontSize) theme.dataCell.text.textAlign = i_a + theme.dataCell.measureText.fontSize = parseInt(s.tableItemFontSize) + theme.dataCell.measureText.textAlign = i_a } } diff --git a/frontend/src/views/chart/chart/gauge/gauge_antv.js b/frontend/src/views/chart/chart/gauge/gauge_antv.js index 7349aee01a..3f7f255244 100644 --- a/frontend/src/views/chart/chart/gauge/gauge_antv.js +++ b/frontend/src/views/chart/chart/gauge/gauge_antv.js @@ -29,6 +29,7 @@ export function baseGaugeOptionAntV(plot, container, chart, action, scale = 1) { // label if (customAttr.label) { const label = JSON.parse(JSON.stringify(customAttr.label)) + labelFormatter = label.gaugeLabelFormatter ? label.gaugeLabelFormatter : DEFAULT_LABEL.gaugeLabelFormatter if (label.show) { labelContent = { style: ({ percent }) => ({ @@ -48,7 +49,6 @@ export function baseGaugeOptionAntV(plot, container, chart, action, scale = 1) { } else { labelContent = false } - labelFormatter = label.gaugeLabelFormatter ? label.gaugeLabelFormatter : DEFAULT_LABEL.gaugeLabelFormatter } const range = [0] diff --git a/frontend/src/views/chart/chart/liquid/liquid.js b/frontend/src/views/chart/chart/liquid/liquid.js index 2d61bc2066..e1b7435a14 100644 --- a/frontend/src/views/chart/chart/liquid/liquid.js +++ b/frontend/src/views/chart/chart/liquid/liquid.js @@ -1,6 +1,9 @@ import { Liquid } from '@antv/g2plot' import { hexColorToRGBA } from '@/views/chart/chart/util' -import { DEFAULT_SIZE } from '@/views/chart/chart/chart' +import { DEFAULT_LABEL, DEFAULT_SIZE } from '@/views/chart/chart/chart' +import { valueFormatter } from '@/views/chart/chart/formatter' + +let labelFormatter = null export function baseLiquid(plot, container, chart) { let value = 0 @@ -31,12 +34,17 @@ export function baseLiquid(plot, container, chart) { // label if (customAttr.label) { const label = JSON.parse(JSON.stringify(customAttr.label)) + labelFormatter = label.gaugeLabelFormatter ? label.gaugeLabelFormatter : DEFAULT_LABEL.gaugeLabelFormatter if (label.show) { labelContent = { style: ({ percent }) => ({ fontSize: parseInt(label.fontSize), color: label.color - }) + }), + formatter: function(v) { + const value = v.percent + return valueFormatter(value, labelFormatter) + } } } else { labelContent = false diff --git a/frontend/src/views/chart/chart/util.js b/frontend/src/views/chart/chart/util.js index 80eb8bb82f..aae1e199ff 100644 --- a/frontend/src/views/chart/chart/util.js +++ b/frontend/src/views/chart/chart/util.js @@ -1,3 +1,5 @@ +import { DEFAULT_TITLE_STYLE } from '@/views/chart/chart/chart' + export function hexColorToRGBA(hex, alpha) { const rgb = [] // 定义rgb数组 if (/^\#[0-9A-F]{3}$/i.test(hex)) { // 判断传入是否为#三位十六进制数 @@ -63,7 +65,8 @@ export const TYPE_CONFIGS = [ 'color', 'hPosition', 'isItalic', - 'isBolder' + 'isBolder', + 'remarkShow' ] } }, @@ -104,7 +107,8 @@ export const TYPE_CONFIGS = [ 'color', 'hPosition', 'isItalic', - 'isBolder' + 'isBolder', + 'remarkShow' ] } }, @@ -148,7 +152,8 @@ export const TYPE_CONFIGS = [ 'color', 'hPosition', 'isItalic', - 'isBolder' + 'isBolder', + 'remarkShow' ] } }, @@ -181,7 +186,8 @@ export const TYPE_CONFIGS = [ 'color', 'hPosition', 'isItalic', - 'isBolder' + 'isBolder', + 'remarkShow' ] } }, @@ -214,7 +220,8 @@ export const TYPE_CONFIGS = [ 'color', 'hPosition', 'isItalic', - 'isBolder' + 'isBolder', + 'remarkShow' ] } }, @@ -253,7 +260,8 @@ export const TYPE_CONFIGS = [ 'color', 'hPosition', 'isItalic', - 'isBolder' + 'isBolder', + 'remarkShow' ] } }, @@ -281,9 +289,7 @@ export const TYPE_CONFIGS = [ 'liquidSize' ], 'label-selector-ant-v': [ - 'show', - 'fontSize', - 'color' + 'labelGauge' ], 'title-selector-ant-v': [ 'show', @@ -292,7 +298,8 @@ export const TYPE_CONFIGS = [ 'color', 'hPosition', 'isItalic', - 'isBolder' + 'isBolder', + 'remarkShow' ] } }, @@ -360,7 +367,8 @@ export const TYPE_CONFIGS = [ 'color', 'hPosition', 'isItalic', - 'isBolder' + 'isBolder', + 'remarkShow' ], 'legend-selector-ant-v': [ 'show', @@ -436,7 +444,8 @@ export const TYPE_CONFIGS = [ 'color', 'hPosition', 'isItalic', - 'isBolder' + 'isBolder', + 'remarkShow' ], 'legend-selector-ant-v': [ 'show', @@ -512,7 +521,8 @@ export const TYPE_CONFIGS = [ 'color', 'hPosition', 'isItalic', - 'isBolder' + 'isBolder', + 'remarkShow' ], 'legend-selector-ant-v': [ 'show', @@ -587,7 +597,8 @@ export const TYPE_CONFIGS = [ 'color', 'hPosition', 'isItalic', - 'isBolder' + 'isBolder', + 'remarkShow' ], 'legend-selector-ant-v': [ 'show', @@ -655,7 +666,8 @@ export const TYPE_CONFIGS = [ 'color', 'hPosition', 'isItalic', - 'isBolder' + 'isBolder', + 'remarkShow' ] } }, @@ -722,7 +734,8 @@ export const TYPE_CONFIGS = [ 'color', 'hPosition', 'isItalic', - 'isBolder' + 'isBolder', + 'remarkShow' ], 'legend-selector-ant-v': [ 'show', @@ -797,7 +810,8 @@ export const TYPE_CONFIGS = [ 'color', 'hPosition', 'isItalic', - 'isBolder' + 'isBolder', + 'remarkShow' ], 'legend-selector-ant-v': [ 'show', @@ -851,7 +865,8 @@ export const TYPE_CONFIGS = [ 'color', 'hPosition', 'isItalic', - 'isBolder' + 'isBolder', + 'remarkShow' ], 'legend-selector-ant-v': [ 'show', @@ -905,7 +920,8 @@ export const TYPE_CONFIGS = [ 'color', 'hPosition', 'isItalic', - 'isBolder' + 'isBolder', + 'remarkShow' ], 'legend-selector-ant-v': [ 'show', @@ -960,7 +976,8 @@ export const TYPE_CONFIGS = [ 'color', 'hPosition', 'isItalic', - 'isBolder' + 'isBolder', + 'remarkShow' ], 'legend-selector-ant-v': [ 'show', @@ -1012,7 +1029,8 @@ export const TYPE_CONFIGS = [ 'color', 'hPosition', 'isItalic', - 'isBolder' + 'isBolder', + 'remarkShow' ], 'legend-selector-ant-v': [ 'show', @@ -1051,7 +1069,8 @@ export const TYPE_CONFIGS = [ 'color', 'hPosition', 'isItalic', - 'isBolder' + 'isBolder', + 'remarkShow' ] } }, @@ -1118,7 +1137,8 @@ export const TYPE_CONFIGS = [ 'color', 'hPosition', 'isItalic', - 'isBolder' + 'isBolder', + 'remarkShow' ], 'legend-selector-ant-v': [ 'show', @@ -1167,7 +1187,8 @@ export const TYPE_CONFIGS = [ 'color', 'hPosition', 'isItalic', - 'isBolder' + 'isBolder', + 'remarkShow' ], 'legend-selector-ant-v': [ 'show', @@ -1351,8 +1372,6 @@ export const TYPE_CONFIGS = [ 'show', 'fontSize', 'color', - 'position-v', - 'formatter', 'gaugeFormatter' ], 'title-selector': [ @@ -2496,3 +2515,17 @@ export function antVCustomColor(chart) { } return colors } + +export function getRemark(chart) { + const remark = {} + if (chart.customStyle) { + const customStyle = JSON.parse(chart.customStyle) + if (customStyle.text) { + const title = JSON.parse(JSON.stringify(customStyle.text)) + remark.show = title.remarkShow ? title.remarkShow : DEFAULT_TITLE_STYLE.remarkShow + remark.content = title.remark ? title.remark : DEFAULT_TITLE_STYLE.remark + remark.bgFill = title.remarkBackgroundColor ? title.remarkBackgroundColor : DEFAULT_TITLE_STYLE.remarkBackgroundColor + } + } + return remark +} diff --git a/frontend/src/views/chart/components/ChartComponentG2.vue b/frontend/src/views/chart/components/ChartComponentG2.vue index 1c22f98532..447faf672e 100644 --- a/frontend/src/views/chart/components/ChartComponentG2.vue +++ b/frontend/src/views/chart/components/ChartComponentG2.vue @@ -2,7 +2,10 @@
-

{{ chart.title }}

+
+

{{ chart.title }}

+ +
@@ -12,7 +15,7 @@ import { baseLiquid } from '@/views/chart/chart/liquid/liquid' import { uuid } from 'vue-uuid' import ViewTrackBar from '@/components/canvas/components/Editor/ViewTrackBar' -import { hexColorToRGBA } from '@/views/chart/chart/util' +import { getRemark, hexColorToRGBA } from '@/views/chart/chart/util' import { baseBarOptionAntV, hBaseBarOptionAntV } from '@/views/chart/chart/bar/bar_antv' import { baseAreaOptionAntV, baseLineOptionAntV } from '@/views/chart/chart/line/line_antv' import { basePieOptionAntV, basePieRoseOptionAntV } from '@/views/chart/chart/pie/pie_antv' @@ -23,10 +26,11 @@ import { baseTreemapOptionAntV } from '@/views/chart/chart/treemap/treemap_antv' import { baseRadarOptionAntV } from '@/views/chart/chart/radar/radar_antv' import { baseWaterfallOptionAntV } from '@/views/chart/chart/waterfall/waterfall' import { baseWordCloudOptionAntV } from '@/views/chart/chart/wordCloud/word_cloud' +import TitleRemark from '@/views/chart/view/TitleRemark' export default { name: 'ChartComponentG2', - components: { ViewTrackBar }, + components: { TitleRemark, ViewTrackBar }, props: { chart: { type: Object, @@ -84,7 +88,11 @@ export default { title_show: true, antVRenderStatus: false, linkageActiveParam: null, - linkageActiveHistory: false + linkageActiveHistory: false, + remarkCfg: { + show: false, + content: '' + } } }, @@ -320,6 +328,7 @@ export default { this.borderRadius = (customStyle.background.borderRadius || 0) + 'px' } } + this.initRemark() }, calcHeightRightNow() { @@ -337,6 +346,9 @@ export default { setTimeout(() => { this.calcHeightRightNow() }, 100) + }, + initRemark() { + this.remarkCfg = getRemark(this.chart) } } } diff --git a/frontend/src/views/chart/components/ChartComponentS2.vue b/frontend/src/views/chart/components/ChartComponentS2.vue index 489f6b8f20..39426a84c6 100644 --- a/frontend/src/views/chart/components/ChartComponentS2.vue +++ b/frontend/src/views/chart/components/ChartComponentS2.vue @@ -2,7 +2,10 @@
-

{{ chart.title }}

+
+

{{ chart.title }}

+ +
@@ -34,12 +37,13 @@ + + diff --git a/frontend/src/views/chart/components/drag-item/QuotaExtItem.vue b/frontend/src/views/chart/components/drag-item/QuotaExtItem.vue index be3fae9759..28911cc2d3 100644 --- a/frontend/src/views/chart/components/drag-item/QuotaExtItem.vue +++ b/frontend/src/views/chart/components/drag-item/QuotaExtItem.vue @@ -100,7 +100,7 @@ {{ $t('chart.filter') }}... - + {{ $t('chart.value_formatter') }}... diff --git a/frontend/src/views/chart/components/drag-item/QuotaItem.vue b/frontend/src/views/chart/components/drag-item/QuotaItem.vue index c24a7d61c8..78c78dad68 100644 --- a/frontend/src/views/chart/components/drag-item/QuotaItem.vue +++ b/frontend/src/views/chart/components/drag-item/QuotaItem.vue @@ -100,7 +100,7 @@ {{ $t('chart.filter') }}... - + {{ $t('chart.value_formatter') }}... diff --git a/frontend/src/views/chart/components/normal/LabelNormal.vue b/frontend/src/views/chart/components/normal/LabelNormal.vue index bc9754d1d4..f1707beeac 100644 --- a/frontend/src/views/chart/components/normal/LabelNormal.vue +++ b/frontend/src/views/chart/components/normal/LabelNormal.vue @@ -1,6 +1,11 @@ + \ No newline at end of file diff --git a/frontend/src/views/system/user/userEditer.vue b/frontend/src/views/system/user/userEditer.vue index d416887bb0..8dfe9bed70 100644 --- a/frontend/src/views/system/user/userEditer.vue +++ b/frontend/src/views/system/user/userEditer.vue @@ -502,11 +502,11 @@ export default { font-weight: 400; line-height: 22px; text-align: left; - color: #1f2329; } .pwd { margin: 0 8px; + color: #1f2329; } .btn-text {