提交 2d749d76 authored 作者: taojinlong's avatar taojinlong

Merge branch 'main' of github.com:dataease/dataease into main

package io.dataease.auth.service.impl; package io.dataease.auth.service.impl;
import com.google.gson.Gson;
import io.dataease.auth.api.dto.CurrentRoleDto; import io.dataease.auth.api.dto.CurrentRoleDto;
import io.dataease.auth.entity.SysUserEntity; import io.dataease.auth.entity.SysUserEntity;
import io.dataease.base.domain.SysUser; import io.dataease.base.domain.SysUser;
...@@ -34,7 +33,7 @@ public class AuthUserServiceImpl implements AuthUserService { ...@@ -34,7 +33,7 @@ public class AuthUserServiceImpl implements AuthUserService {
@Resource @Resource
private SysUserMapper sysUserMapper; private SysUserMapper sysUserMapper;
@Resource @Resource
private ExtPluginSysMenuMapper extPluginSysMenuMapper; private DynamicMenuServiceImpl dynamicMenuService;
/** /**
* 此处需被F2CRealm登录认证调用 也就是说每次请求都会被调用 所以最好加上缓存 * 此处需被F2CRealm登录认证调用 也就是说每次请求都会被调用 所以最好加上缓存
...@@ -66,7 +65,7 @@ public class AuthUserServiceImpl implements AuthUserService { ...@@ -66,7 +65,7 @@ public class AuthUserServiceImpl implements AuthUserService {
@Override @Override
public List<String> permissions(Long userId){ public List<String> permissions(Long userId){
// 用户登录获取菜单权限时同时更新插件菜单表 // 用户登录获取菜单权限时同时更新插件菜单表
this.syncPluginMenu(); dynamicMenuService.syncPluginMenu();
List<String> permissions; List<String> permissions;
SysUser sysUser = sysUserMapper.selectByPrimaryKey(userId); SysUser sysUser = sysUserMapper.selectByPrimaryKey(userId);
if(sysUser.getIsAdmin()!=null&&sysUser.getIsAdmin()){ if(sysUser.getIsAdmin()!=null&&sysUser.getIsAdmin()){
...@@ -103,15 +102,4 @@ public class AuthUserServiceImpl implements AuthUserService { ...@@ -103,15 +102,4 @@ public class AuthUserServiceImpl implements AuthUserService {
LogUtil.info("正在清除用户缓存【{}】",userId); LogUtil.info("正在清除用户缓存【{}】",userId);
} }
@Transactional
public void syncPluginMenu() {
List<PluginSysMenu> pluginSysMenuList = PluginUtils.pluginMenus();
int i = extPluginSysMenuMapper.deletePluginMenu();
LogUtil.info("删除插件菜单记录数{}", i);
if(CollectionUtils.isNotEmpty(pluginSysMenuList)){
LogUtil.info("待插入插件菜单记录是"+new Gson().toJson(pluginSysMenuList));
extPluginSysMenuMapper.savePluginMenu(pluginSysMenuList);
}
}
} }
...@@ -6,11 +6,15 @@ import io.dataease.auth.service.DynamicMenuService; ...@@ -6,11 +6,15 @@ import io.dataease.auth.service.DynamicMenuService;
import io.dataease.base.domain.SysMenu; import io.dataease.base.domain.SysMenu;
import io.dataease.base.domain.SysMenuExample; import io.dataease.base.domain.SysMenuExample;
import io.dataease.base.mapper.SysMenuMapper; import io.dataease.base.mapper.SysMenuMapper;
import io.dataease.base.mapper.ext.ExtPluginSysMenuMapper;
import io.dataease.plugins.common.dto.PluginSysMenu; import io.dataease.plugins.common.dto.PluginSysMenu;
import io.dataease.plugins.util.PluginUtils; import io.dataease.plugins.util.PluginUtils;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -22,6 +26,9 @@ public class DynamicMenuServiceImpl implements DynamicMenuService { ...@@ -22,6 +26,9 @@ public class DynamicMenuServiceImpl implements DynamicMenuService {
@Autowired(required = false) @Autowired(required = false)
private SysMenuMapper sysMenuMapper; private SysMenuMapper sysMenuMapper;
@Resource
private ExtPluginSysMenuMapper extPluginSysMenuMapper;
@Override @Override
public List<DynamicMenuDto> load(String userId) { public List<DynamicMenuDto> load(String userId) {
SysMenuExample sysMenuExample = new SysMenuExample(); SysMenuExample sysMenuExample = new SysMenuExample();
...@@ -109,4 +116,13 @@ public class DynamicMenuServiceImpl implements DynamicMenuService { ...@@ -109,4 +116,13 @@ public class DynamicMenuServiceImpl implements DynamicMenuService {
private Boolean isParent(Long pid){ private Boolean isParent(Long pid){
return null == pid || pid==0L; return null == pid || pid==0L;
} }
@Transactional
public void syncPluginMenu() {
List<PluginSysMenu> pluginSysMenuList = PluginUtils.pluginMenus();
extPluginSysMenuMapper.deletePluginMenu();
if(CollectionUtils.isNotEmpty(pluginSysMenuList)){
extPluginSysMenuMapper.savePluginMenu(pluginSysMenuList);
}
}
} }
...@@ -6,6 +6,7 @@ import io.dataease.dto.chart.ChartCustomFilterDTO; ...@@ -6,6 +6,7 @@ import io.dataease.dto.chart.ChartCustomFilterDTO;
import io.dataease.dto.chart.ChartViewFieldDTO; import io.dataease.dto.chart.ChartViewFieldDTO;
import io.dataease.provider.QueryProvider; import io.dataease.provider.QueryProvider;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -366,6 +367,9 @@ public class DorisQueryProvider extends QueryProvider { ...@@ -366,6 +367,9 @@ public class DorisQueryProvider extends QueryProvider {
for (ChartCustomFilterDTO request : requestList) { for (ChartCustomFilterDTO request : requestList) {
String value = request.getValue(); String value = request.getValue();
DatasetTableField field = request.getField(); DatasetTableField field = request.getField();
if (ObjectUtils.isEmpty(field)) {
continue;
}
if (field.getDeType() == 1 && field.getDeExtractType() != 1) { if (field.getDeType() == 1 && field.getDeExtractType() != 1) {
filter.append(" AND FROM_UNIXTIME(cast(") filter.append(" AND FROM_UNIXTIME(cast(")
.append(field.getDataeaseName()) .append(field.getDataeaseName())
......
...@@ -6,6 +6,7 @@ import io.dataease.dto.chart.ChartCustomFilterDTO; ...@@ -6,6 +6,7 @@ import io.dataease.dto.chart.ChartCustomFilterDTO;
import io.dataease.dto.chart.ChartViewFieldDTO; import io.dataease.dto.chart.ChartViewFieldDTO;
import io.dataease.provider.QueryProvider; import io.dataease.provider.QueryProvider;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -374,6 +375,9 @@ public class MysqlQueryProvider extends QueryProvider { ...@@ -374,6 +375,9 @@ public class MysqlQueryProvider extends QueryProvider {
for (ChartCustomFilterDTO request : requestList) { for (ChartCustomFilterDTO request : requestList) {
String value = request.getValue(); String value = request.getValue();
DatasetTableField field = request.getField(); DatasetTableField field = request.getField();
if (ObjectUtils.isEmpty(field)) {
continue;
}
if (field.getDeType() == 1 && field.getDeExtractType() != 1) { if (field.getDeType() == 1 && field.getDeExtractType() != 1) {
filter.append(" AND FROM_UNIXTIME(cast(") filter.append(" AND FROM_UNIXTIME(cast(")
.append(field.getOriginName()) .append(field.getOriginName())
......
...@@ -261,4 +261,4 @@ i18n_custom_ds_delete=自定義數據集所關聯數據被刪除,無法正常 ...@@ -261,4 +261,4 @@ i18n_custom_ds_delete=自定義數據集所關聯數據被刪除,無法正常
i18n_sql_add_not_matching=增量添加 sql 的數據列與數據集不匹配, i18n_sql_add_not_matching=增量添加 sql 的數據列與數據集不匹配,
i18n_sql_delete_not_matching=增量刪除 sql 的數據列與數據集不匹配, i18n_sql_delete_not_matching=增量刪除 sql 的數據列與數據集不匹配,
i18n_cst_ds_tb_or_field_deleted=自定義數據集所關聯數據被刪除或字段發生變化,無法正常顯示 i18n_cst_ds_tb_or_field_deleted=自定義數據集所關聯數據被刪除或字段發生變化,無法正常顯示
i18n_no_all_delete_privilege_folder=该目录下存在没有管理权限或查看权限的资源,无法删 i18n_no_all_delete_privilege_folder=該目錄下存在沒有管理權限或查看權限的資源,無法刪
...@@ -68,11 +68,12 @@ export function listDatasource() { ...@@ -68,11 +68,12 @@ export function listDatasource() {
}) })
} }
export function getTable(id) { export function getTable(id, hideMsg = false) {
return request({ return request({
url: '/dataset/table/get/' + id, url: '/dataset/table/get/' + id,
loading: true, loading: true,
method: 'post' method: 'post',
hideMsg: hideMsg
}) })
} }
......
...@@ -3,13 +3,13 @@ ...@@ -3,13 +3,13 @@
<div class="toolbar"> <div class="toolbar">
<div class="canvas-config" style="margin-right: 10px"> <div class="canvas-config" style="margin-right: 10px">
<el-switch v-model="canvasStyleData.auxiliaryMatrix" :width="35" label="矩阵设计" name="auxiliaryMatrix" /> <el-switch v-model="canvasStyleData.auxiliaryMatrix" :width="35" name="auxiliaryMatrix" />
<span>矩阵设计</span> <span>{{ $t('panel.matrix_design') }}</span>
</div> </div>
<div class="canvas-config" style="margin-right: 10px"> <div class="canvas-config" style="margin-right: 10px">
<el-switch v-model="canvasStyleData.selfAdaption" :width="35" label="自适应画布区域" name="selfAdaption" /> <el-switch v-model="canvasStyleData.selfAdaption" :width="35" name="selfAdaption" />
<span>自适应画布区域 </span> <span>{{ $t('panel.canvas_self_adaption') }} </span>
</div> </div>
<div class="canvas-config" style="margin-right: 55px"> <div class="canvas-config" style="margin-right: 55px">
......
...@@ -999,6 +999,7 @@ export default { ...@@ -999,6 +999,7 @@ export default {
default_panel_name: 'Default Dashboard Name', default_panel_name: 'Default Dashboard Name',
source_panel_name: 'Source Dashboard Name', source_panel_name: 'Source Dashboard Name',
content_style: 'Content Style', content_style: 'Content Style',
canvas_self_adaption: 'Canvas Self Adaption'
}, },
plugin: { plugin: {
local_install: 'Local installation', local_install: 'Local installation',
......
...@@ -37,31 +37,31 @@ export default { ...@@ -37,31 +37,31 @@ export default {
'menu1-3': '菜單 1-3', 'menu1-3': '菜單 1-3',
menu2: '菜單 2', menu2: '菜單 2',
Table: 'Table', Table: 'Table',
dynamicTable: '动态 Table', dynamicTable: '動態 Table',
dragTable: '拖拽 Table', dragTable: '拖拽 Table',
inlineEditTable: 'Table 編輯', inlineEditTable: 'Table 編輯',
complexTable: '合 Table', complexTable: '合 Table',
tab: 'Tab', tab: 'Tab',
form: '表', form: '表',
createArticle: '建文章', createArticle: '建文章',
editArticle: '編輯文章', editArticle: '編輯文章',
articleList: '文章列表', articleList: '文章列表',
errorPages: '错误页面', errorPages: '錯誤頁面',
page401: '401', page401: '401',
page404: '404', page404: '404',
errorLog: '错误日志', errorLog: '錯誤日誌',
excel: 'Excel', excel: 'Excel',
exportExcel: '出 Excel', exportExcel: '出 Excel',
selectExcel: '导出 已選擇项', selectExcel: '導出 已選擇項',
mergeHeader: '导出 多级表头', mergeHeader: '導出 多級表頭',
uploadExcel: '上 Excel', uploadExcel: '上 Excel',
zip: 'Zip', zip: 'Zip',
pdf: 'PDF', pdf: 'PDF',
exportZip: 'Export Zip', exportZip: 'Export Zip',
theme: '膚', theme: '膚',
clipboardDemo: 'Clipboard', clipboardDemo: 'Clipboard',
i18n: '國際化', i18n: '國際化',
externalLink: '外', externalLink: '外',
profile: '個人中心' profile: '個人中心'
}, },
navbar: { navbar: {
...@@ -69,7 +69,7 @@ export default { ...@@ -69,7 +69,7 @@ export default {
github: '項目地址', github: '項目地址',
logOut: '退出登陸', logOut: '退出登陸',
profile: '個人中心', profile: '個人中心',
theme: '膚', theme: '膚',
size: '佈局大小' size: '佈局大小'
}, },
login: { login: {
...@@ -80,15 +80,15 @@ export default { ...@@ -80,15 +80,15 @@ export default {
password: '密碼', password: '密碼',
any: '任意字符', any: '任意字符',
thirdparty: '第三方登陸', thirdparty: '第三方登陸',
thirdpartyTips: '本地不能模拟,请结合自己业务进行模拟!!!', thirdpartyTips: '本地不能模擬,請結合自己業務進行模擬!!!',
expires: '登陸信息过期,请重新登陸', expires: '登陸信息過期,請重新登陸',
tokenError: '信息错误,请重新登陸', tokenError: '信息錯誤,請重新登陸',
username_error: '請輸入正確的 ID', username_error: '請輸入正確的 ID',
password_error: '密碼不小於 8 位' password_error: '密碼不小於 8 位'
}, },
commons: { commons: {
switch_lang: '切換語言成功', switch_lang: '切換語言成功',
close: '关闭', close: '關閉',
icon: '圖標', icon: '圖標',
all: '全部', all: '全部',
enable: '啟用', enable: '啟用',
...@@ -115,7 +115,7 @@ export default { ...@@ -115,7 +115,7 @@ export default {
examples: '示例', examples: '示例',
help_documentation: '幫助文檔', help_documentation: '幫助文檔',
api_help_documentation: 'API文檔', api_help_documentation: 'API文檔',
delete_cancelled: '已取消除', delete_cancelled: '已取消除',
workspace: '工作空開你', workspace: '工作空開你',
organization: '組織', organization: '組織',
menu: '菜單', menu: '菜單',
...@@ -130,23 +130,23 @@ export default { ...@@ -130,23 +130,23 @@ export default {
save: '保存', save: '保存',
update: '更新', update: '更新',
save_success: '保存成功', save_success: '保存成功',
delete_success: '除成功', delete_success: '除成功',
copy_success: '複製成功', copy_success: '複製成功',
modify_success: '修改成功', modify_success: '修改成功',
delete_cancel: '已取消除', delete_cancel: '已取消除',
confirm: '確定', confirm: '確定',
cancel: '取消', cancel: '取消',
prompt: '提示', prompt: '提示',
operating: '操作', operating: '操作',
input_limit: '長度在 {0} 到 {1} 個字符', input_limit: '長度在 {0} 到 {1} 個字符',
login: '登陸', login: '登陸',
welcome: '一站式開源數據分析平', welcome: '一站式開源數據分析平',
username: '姓名', username: '姓名',
password: '密碼', password: '密碼',
input_username: '請輸入用戶姓名', input_username: '請輸入用戶姓名',
input_password: '請輸入密碼', input_password: '請輸入密碼',
test: '測試', test: '測試',
create_time: '建時間', create_time: '建時間',
update_time: '更新時間', update_time: '更新時間',
add: '添加', add: '添加',
member: '成員', member: '成員',
...@@ -164,18 +164,18 @@ export default { ...@@ -164,18 +164,18 @@ export default {
system: '系統', system: '系統',
personal_setting: '個人設置', personal_setting: '個人設置',
test_resource_pool: '測試資源池', test_resource_pool: '測試資源池',
system_setting: '系設置', system_setting: '系設置',
input_content: '請輸入內容', input_content: '請輸入內容',
create: '新建', create: '新建',
edit: '編輯', edit: '編輯',
copy: '複製', copy: '複製',
refresh: '刷新', refresh: '刷新',
remark: '備註', remark: '備註',
delete: '除', delete: '除',
reduction: '恢復', reduction: '恢復',
not_filled: '未填寫', not_filled: '未填寫',
please_select: '選擇', please_select: '選擇',
search_by_name: '根名稱搜索', search_by_name: '根名稱搜索',
personal_information: '個人信息', personal_information: '個人信息',
exit_system: '退出系統', exit_system: '退出系統',
verification: '驗證', verification: '驗證',
...@@ -205,24 +205,24 @@ export default { ...@@ -205,24 +205,24 @@ export default {
connection_successful: '連接成功', connection_successful: '連接成功',
connection_failed: '連接失敗', connection_failed: '連接失敗',
save_failed: '保存失敗', save_failed: '保存失敗',
host_cannot_be_empty: '主不能為空', host_cannot_be_empty: '主不能為空',
port_cannot_be_empty: '端口不能為空', port_cannot_be_empty: '端口不能為空',
account_cannot_be_empty: '帐户不能為空', account_cannot_be_empty: '帳戶不能為空',
remove: '移除', remove: '移除',
remove_cancel: '移除取消', remove_cancel: '移除取消',
remove_success: '移除成功', remove_success: '移除成功',
tips: '認證信息已過期,請重新登陸', tips: '認證信息已過期,請重新登陸',
not_performed_yet: '尚未執行', not_performed_yet: '尚未執行',
incorrect_input: '輸入內容不正確', incorrect_input: '輸入內容不正確',
delete_confirm: '請輸入以下內容,確認除:', delete_confirm: '請輸入以下內容,確認除:',
login_username: 'ID 或 郵箱', login_username: 'ID 或 郵箱',
input_login_username: '請輸入用戶 ID 或 郵箱', input_login_username: '請輸入用戶 ID 或 郵箱',
input_name: '請輸入名稱', input_name: '請輸入名稱',
please_upload: '上傳文件', please_upload: '上傳文件',
please_fill_path: '填寫url 路徑', please_fill_path: '填寫url 路徑',
formatErr: '格式錯誤', formatErr: '格式錯誤',
please_save: '先保存', please_save: '先保存',
reference_documentation: '考文檔', reference_documentation: '考文檔',
id: 'ID', id: 'ID',
millisecond: '毫秒', millisecond: '毫秒',
cannot_be_null: '不能為空', cannot_be_null: '不能為空',
...@@ -231,56 +231,56 @@ export default { ...@@ -231,56 +231,56 @@ export default {
modifier: '修改人', modifier: '修改人',
validate: '校驗', validate: '校驗',
batch_add: '批量添加', batch_add: '批量添加',
tag_tip: '输入回车添加标签', tag_tip: '輸入回車添加標簽',
table: { table: {
select_tip: '已选中 {0} 条數据' select_tip: '已選中 {0} 條數據'
}, },
date: { date: {
select_date: '選擇日期', select_date: '選擇日期',
start_date: '始日期', start_date: '始日期',
end_date: '束日期', end_date: '束日期',
select_date_time: '選擇日期時間', select_date_time: '選擇日期時間',
start_date_time: '始日期時間', start_date_time: '始日期時間',
end_date_time: '束日期時間', end_date_time: '束日期時間',
range_separator: '至', range_separator: '至',
data_time_error: '开始日期不能大與结束日期' data_time_error: '開始日期不能大與結束日期'
}, },
adv_search: { adv_search: {
title: '高搜索', title: '高搜索',
combine: '组合查询', combine: '組合查詢',
test: '所属测试', test: '所屬測試',
project: '所属项目', project: '所屬項目',
search: '查', search: '查',
reset: '重置', reset: '重置',
and: '所有', and: '所有',
or: '任意一', or: '任意一',
operators: { operators: {
is_empty: '空', is_empty: '空',
is_not_empty: '非空', is_not_empty: '非空',
like: '包含', like: '包含',
not_like: '不包含', not_like: '不包含',
in: '與', in: '與',
not_in: '不與', not_in: '不與',
gt: '大與', gt: '大與',
ge: '大與等與', ge: '大與等與',
lt: '小與', lt: '小與',
le: '小與等與', le: '小與等與',
equals: '等與', equals: '等與',
not_equals: '不等與', not_equals: '不等與',
between: '之', between: '之',
current_user: '是前用戶' current_user: '是前用戶'
}, },
message_box: { message_box: {
alert: '警告', alert: '警告',
confirm: '確認' confirm: '確認'
} }
}, },
monitor: '控', monitor: '控',
image: '像', image: '像',
tag: '标签', tag: '標簽',
module: { module: {
select_module: '選擇模', select_module: '選擇模',
default_module: '默认模块' default_module: '默認模塊'
}, },
datasource: '數據源', datasource: '數據源',
char_can_not_more_50: '不能超過50字符', char_can_not_more_50: '不能超過50字符',
...@@ -301,23 +301,23 @@ export default { ...@@ -301,23 +301,23 @@ export default {
editPermission: '編輯權限', editPermission: '編輯權限',
roles: '你的權限', roles: '你的權限',
switchRoles: '切換權限', switchRoles: '切換權限',
tips: '在某些情况下,不适合使用 v-permission。例如:Element-UI 的 el-tab 或 el-table-column 以及其它动态渲染 dom 的场景。你只能通过手动设置 v-if 来实现。', tips: '在某些情況下,不適合使用 v-permission。例如:Element-UI 的 el-tab 或 el-table-column 以及其它動態渲染 dom 的場景。你只能通過手動設置 v-if 來實現。',
delete: '除', delete: '除',
confirm: '確定', confirm: '確定',
cancel: '取消' cancel: '取消'
}, },
guide: { guide: {
description: '引导页对與一些第一次进入项目的人很有用,你可以简单介绍下项目的功能。本 Demo 是基與', description: '引導頁對與一些第一次進入項目的人很有用,你可以簡單介紹下項目的功能。本 Demo 是基與',
button: '打开引导' button: '打開引導'
}, },
components: { components: {
documentation: '文檔', documentation: '文檔',
tinymceTips: '富文本是管理后台一个核心的功能,但同时又是一个有很多坑的地方。在選擇富文本的过程中我也走了不少的弯路,市面上常见的富文本都基本用过了,最终权衡了一下選擇了Tinymce。更详细的富文本比较和介绍见', tinymceTips: '富文本是管理後臺一個核心的功能,但同時又是一個有很多坑的地方。在選擇富文本的過程中我也走了不少的彎路,市面上常見的富文本都基本用過了,最終權衡了一下選擇了Tinymce。更詳細的富文本比較和介紹見',
dropzoneTips: '由與我司业务有特殊需求,而且要传七牛 所以没用第三方,選擇了自己封装。代码非常的简单,具体代码你可以在这里看到 @/components/Dropzone', dropzoneTips: '由與我司業務有特殊需求,而且要傳七牛 所以沒用第三方,選擇了自己封裝。代碼非常的簡單,具體代碼你可以在這裏看到 @/components/Dropzone',
stickyTips: '当页面滚动到预设的位置会吸附在顶部', stickyTips: '當頁面滾動到預設的位置會吸附在頂部',
backToTopTips1: '页面滚动到指定位置会在右下角出现返回顶部按钮', backToTopTips1: '頁面滾動到指定位置會在右下角出現返回頂部按鈕',
backToTopTips2: '可自定义按钮的样式、show/hide、出现的高度、返回的位置 如需文字提示,可在外部使用Element的el-tooltip元素', backToTopTips2: '可自定義按鈕的樣式、show/hide、出現的高度、返回的位置 如需文字提示,可在外部使用Element的el-tooltip元素',
imageUploadTips: '由與我在使用时它只有vue@1版本,而且和mockjs不兼容,所以自己改造了一下,如果大家要使用的话,优先还是使用官方版本。' imageUploadTips: '由與我在使用時它只有vue@1版本,而且和mockjs不兼容,所以自己改造了一下,如果大家要使用的話,優先還是使用官方版本。'
}, },
table: { table: {
dynamicTips1: '固定標頭,按照表頭順序排序', dynamicTips1: '固定標頭,按照表頭順序排序',
...@@ -346,28 +346,28 @@ export default { ...@@ -346,28 +346,28 @@ export default {
confirm: '確定' confirm: '確定'
}, },
example: { example: {
warning: '创建和編輯页面是不能被 keep-alive 缓存的,因为keep-alive 的 include 目前不支持根据路由来缓存,所以目前都是基與 component name 来进行缓存的。如果你想类似的实现缓存效果,可以使用 localStorage 等浏览器缓存方案。或者不要使用 keep-alive 的 include,直接缓存所有页面。详情见' warning: '創建和編輯頁面是不能被 keep-alive 緩存的,因為keep-alive 的 include 目前不支持根據路由來緩存,所以目前都是基與 component name 來進行緩存的。如果你想類似的實現緩存效果,可以使用 localStorage 等瀏覽器緩存方案。或者不要使用 keep-alive 的 include,直接緩存所有頁面。詳情見'
}, },
errorLog: { errorLog: {
tips: '请点击右上角bug小图标', tips: '請點擊右上角bug小圖標',
description: '现在的管理后台基本都是spa的形式了,它增强了用戶体验,但同时也会增加页面出问题的可能性,可能一个小小的疏忽就导致整个页面的死锁。好在 Vue 官网提供了一个方法来捕获处理异常,你可以在其中进行错误处理或者异常上报。', description: '現在的管理後臺基本都是spa的形式了,它增強了用戶體驗,但同時也會增加頁面出問題的可能性,可能一個小小的疏忽就導致整個頁面的死鎖。好在 Vue 官網提供了一個方法來捕獲處理異常,你可以在其中進行錯誤處理或者異常上報。',
documentation: '文檔介' documentation: '文檔介'
}, },
excel: { excel: {
export: '導出', export: '導出',
selectedExport: '導出已選擇', selectedExport: '導出已選擇',
placeholder: '請輸入文件名(默excel-list)' placeholder: '請輸入文件名(默excel-list)'
}, },
zip: { zip: {
export: '導出', export: '導出',
placeholder: '請輸入文件名(默file)' placeholder: '請輸入文件名(默file)'
}, },
pdf: { pdf: {
tips: '這裏使用 window.print() 來實現下載pdf的功能' tips: '這裏使用 window.print() 來實現下載pdf的功能'
}, },
theme: { theme: {
change: '換膚', change: '換膚',
documentation: '膚文檔', documentation: '膚文檔',
tips: 'Tips: 它區別於 navbar 上的 theme-pick, 是兩種不同的換膚方法,各自有不同的應用場景,具體請參考文檔。' tips: 'Tips: 它區別於 navbar 上的 theme-pick, 是兩種不同的換膚方法,各自有不同的應用場景,具體請參考文檔。'
}, },
tagsView: { tagsView: {
...@@ -387,7 +387,7 @@ export default { ...@@ -387,7 +387,7 @@ export default {
i18n_no_license_record: '沒有 License 紀錄', i18n_no_license_record: '沒有 License 紀錄',
i18n_license_is_empty: 'License 為空', i18n_license_is_empty: 'License 為空',
title: '授權管理', title: '授權管理',
corporation: '客名稱', corporation: '客名稱',
time: '授權時間', time: '授權時間',
product: '產品名稱', product: '產品名稱',
edition: '產品版本', edition: '產品版本',
...@@ -404,9 +404,9 @@ export default { ...@@ -404,9 +404,9 @@ export default {
member: { member: {
create: '添加成員', create: '添加成員',
modify: '修改成員', modify: '修改成員',
delete_confirm: '这个用戶確定要删除吗?', delete_confirm: '這個用戶確定要刪除嗎?',
please_choose_member: '選擇成員', please_choose_member: '選擇成員',
search_by_name: '根名稱搜索', search_by_name: '根名稱搜索',
modify_personal_info: '修改個人信息', modify_personal_info: '修改個人信息',
edit_password: '修改密碼', edit_password: '修改密碼',
edit_information: '編輯信息', edit_information: '編輯信息',
...@@ -415,15 +415,15 @@ export default { ...@@ -415,15 +415,15 @@ export default {
special_characters_are_not_supported: '不支持特殊字符', special_characters_are_not_supported: '不支持特殊字符',
mobile_number_format_is_incorrect: '手機號碼格式不正確', mobile_number_format_is_incorrect: '手機號碼格式不正確',
email_format_is_incorrect: '郵箱格式不正確', email_format_is_incorrect: '郵箱格式不正確',
password_format_is_incorrect: '有效密碼:8-30位,英文大小寫字母+數字+特殊字符(可)', password_format_is_incorrect: '有效密碼:8-30位,英文大小寫字母+數字+特殊字符(可)',
old_password: '密碼', old_password: '密碼',
new_password: '新密碼', new_password: '新密碼',
repeat_password: '確認密碼', repeat_password: '確認密碼',
inconsistent_passwords: '两次输入的密碼不一致', inconsistent_passwords: '兩次輸入的密碼不一致',
remove_member: '確定要移除该成員吗', remove_member: '確定要移除該成員嗎',
org_remove_member: '確定要移除该成員吗?', org_remove_member: '確定要移除該成員嗎?',
input_id_or_email: '請輸入用戶 ID, 或者 用戶郵箱', input_id_or_email: '請輸入用戶 ID, 或者 用戶郵箱',
no_such_user: '无此用戶信息, 請輸入正确的用戶 ID 或者 用戶郵箱!' no_such_user: '無此用戶信息, 請輸入正確的用戶 ID 或者 用戶郵箱!'
}, },
user: { user: {
create: '新建用戶', create: '新建用戶',
...@@ -433,12 +433,12 @@ export default { ...@@ -433,12 +433,12 @@ export default {
input_email: '請輸入郵箱', input_email: '請輸入郵箱',
input_password: '請輸入密碼', input_password: '請輸入密碼',
input_phone: '請輸入電話號碼', input_phone: '請輸入電話號碼',
input_roles: '選擇角色', input_roles: '選擇角色',
special_characters_are_not_supported: '不支持特殊字符', special_characters_are_not_supported: '不支持特殊字符',
mobile_number_format_is_incorrect: '手機號碼格式不正確', mobile_number_format_is_incorrect: '手機號碼格式不正確',
email_format_is_incorrect: '郵箱格式不正確', email_format_is_incorrect: '郵箱格式不正確',
delete_confirm: '这个用戶確定要删除吗?', delete_confirm: '這個用戶確定要刪除嗎?',
apikey_delete_confirm: '这个 API Key 確定要删除吗?', apikey_delete_confirm: '這個 API Key 確定要刪除嗎?',
input_id_placeholder: '請輸入ID (不支持中文)', input_id_placeholder: '請輸入ID (不支持中文)',
source: '用戶來源', source: '用戶來源',
choose_org: '選擇組織', choose_org: '選擇組織',
...@@ -452,16 +452,16 @@ export default { ...@@ -452,16 +452,16 @@ export default {
}, },
role: { role: {
menu_authorization: '菜單授權', menu_authorization: '菜單授權',
data_authorization: '數授權', data_authorization: '數授權',
please_choose_role: '選擇角色', please_choose_role: '選擇角色',
admin: '系統管理員', admin: '系統管理員',
org_admin: '組織管理', org_admin: '組織管理',
org_member: '組織成員', org_member: '組織成員',
add: '新建角色', add: '新建角色',
delete: '除角色', delete: '除角色',
modify: '修改角色', modify: '修改角色',
tips: '提示', tips: '提示',
confirm_delete: '確認除角色 ', confirm_delete: '確認除角色 ',
role_name: '角色名稱', role_name: '角色名稱',
search_by_name: '按名稱搜索', search_by_name: '按名稱搜索',
pls_input_name: '請輸入名稱' pls_input_name: '請輸入名稱'
...@@ -469,7 +469,7 @@ export default { ...@@ -469,7 +469,7 @@ export default {
menu: { menu: {
parent_category: '上級目錄', parent_category: '上級目錄',
module_name: '組件名稱', module_name: '組件名稱',
module_path: '組件路', module_path: '組件路',
route_addr: '路由地址', route_addr: '路由地址',
menu_sort: '菜單排序', menu_sort: '菜單排序',
authority_identification: '權限標識', authority_identification: '權限標識',
...@@ -479,8 +479,8 @@ export default { ...@@ -479,8 +479,8 @@ export default {
tile: '菜單標題', tile: '菜單標題',
create: '創建菜單', create: '創建菜單',
modify: '修改菜單', modify: '修改菜單',
delete: '除菜單', delete: '除菜單',
delete_confirm: '確定删除菜單吗?', delete_confirm: '確定刪除菜單嗎?',
menu_type: '菜單類型' menu_type: '菜單類型'
}, },
organization: { organization: {
...@@ -493,11 +493,11 @@ export default { ...@@ -493,11 +493,11 @@ export default {
create_time: '創建日期', create_time: '創建日期',
create: '新建組織', create: '新建組織',
modify: '修改組織', modify: '修改組織',
delete: '除組織', delete: '除組織',
delete_confirm: '删除該組織會關聯刪除該組織的下屬組織,確定要删除吗?', delete_confirm: '刪除該組織會關聯刪除該組織的下屬組織,確定要刪除嗎?',
input_name: '請輸入組織名稱', input_name: '請輸入組織名稱',
select_organization: '選擇組織', select_organization: '選擇組織',
search_by_name: '根名稱搜索', search_by_name: '根名稱搜索',
special_characters_are_not_supported: '格式錯誤(不支持特殊字符,且不能以\'-\'開頭結尾)', special_characters_are_not_supported: '格式錯誤(不支持特殊字符,且不能以\'-\'開頭結尾)',
select: '選擇組織' select: '選擇組織'
}, },
...@@ -518,7 +518,7 @@ export default { ...@@ -518,7 +518,7 @@ export default {
tip: ' 提示: 僅用來作為測試郵件收件人' tip: ' 提示: 僅用來作為測試郵件收件人'
}, },
chart: { chart: {
save_snapshot: '保存缩略图', save_snapshot: '保存縮略圖',
datalist: '視圖', datalist: '視圖',
add_group: '添加分組', add_group: '添加分組',
add_scene: '添加場景', add_scene: '添加場景',
...@@ -667,7 +667,7 @@ export default { ...@@ -667,7 +667,7 @@ export default {
rose_radius: '園角', rose_radius: '園角',
view_name: '視圖標題', view_name: '視圖標題',
name_can_not_empty: '名稱不能為空', name_can_not_empty: '名稱不能為空',
template_can_not_empty: '请选择仪表板', template_can_not_empty: '請選擇儀表板',
custom_count: '記錄數', custom_count: '記錄數',
table_title_fontsize: '表頭字體大小', table_title_fontsize: '表頭字體大小',
table_item_fontsize: '表格字體大小', table_item_fontsize: '表格字體大小',
...@@ -781,7 +781,7 @@ export default { ...@@ -781,7 +781,7 @@ export default {
execute_rate: '執行頻率', execute_rate: '執行頻率',
execute_once: '立即執行', execute_once: '立即執行',
cron_config: '表達時設定', cron_config: '表達時設定',
no_limit: '無限', no_limit: '無限',
set_end_time: '設定結束時間', set_end_time: '設定結束時間',
operate: '操作', operate: '操作',
save_success: '保存成功', save_success: '保存成功',
...@@ -892,7 +892,7 @@ export default { ...@@ -892,7 +892,7 @@ export default {
delete: '刪除', delete: '刪除',
move_to: '移動到', move_to: '移動到',
rename: '重命名', rename: '重命名',
import: '入模板', import: '入模板',
tips: '提示', tips: '提示',
confirm_delete: '確認刪除', confirm_delete: '確認刪除',
delete_success: '刪除成功', delete_success: '刪除成功',
...@@ -917,14 +917,14 @@ export default { ...@@ -917,14 +917,14 @@ export default {
photo: '圖片', photo: '圖片',
default_panel: '默認儀表板', default_panel: '默認儀表板',
create_public_links: '創建公共鏈接', create_public_links: '創建公共鏈接',
to_default: '另存为默认', to_default: '另存為默認',
to_default_panel: '另存为默认儀表板', to_default_panel: '另存為默認儀表板',
store: '收藏', store: '收藏',
save_to_panel: '保存為模板', save_to_panel: '保存為模板',
export_to_panel: '導出為模板', export_to_panel: '導出為模板',
preview: '預覽', preview: '預覽',
fullscreen_preview: '全屏预览', fullscreen_preview: '全屏預覽',
new_tab_preview: '新Tab页预览', new_tab_preview: '新Tab頁預覽',
select_panel_from_left: '請從左側選擇儀表板', select_panel_from_left: '請從左側選擇儀表板',
template_nale: '模板名稱', template_nale: '模板名稱',
template: '模板', template: '模板',
...@@ -940,7 +940,7 @@ export default { ...@@ -940,7 +940,7 @@ export default {
select_by_table: '列表選擇', select_by_table: '列表選擇',
data_list: '數據列表', data_list: '數據列表',
component_list: '組件列表', component_list: '組件列表',
custom_scope: '自定義控範圍', custom_scope: '自定義控範圍',
multiple_choice: '多選', multiple_choice: '多選',
single_choice: '單選', single_choice: '單選',
field: '字段', field: '字段',
...@@ -954,51 +954,52 @@ export default { ...@@ -954,51 +954,52 @@ export default {
insert_picture: '插入圖片', insert_picture: '插入圖片',
redo: '重做', redo: '重做',
undo: '撤銷', undo: '撤銷',
panelNull: '这是个空的儀表板,可以通过编辑来丰富内容', panelNull: '這是個空的儀表板,可以通過編輯來豐富內容',
copy: '复制', copy: '復製',
paste: '粘', paste: '粘',
cut: '剪切', cut: '剪切',
lock: '定', lock: '定',
topComponent: '置于顶层', topComponent: '置於頂層',
bottomComponent: '置于底层', bottomComponent: '置於底層',
upComponent: '上移一', upComponent: '上移一',
downComponent: '下移一', downComponent: '下移一',
open_aided_design: '打开组件辅助设计', open_aided_design: '打開組件輔助設計',
close_aided_design: '关闭组件辅助设计', close_aided_design: '關閉組件輔助設計',
open_style_design: '打开样式设计', open_style_design: '打開樣式設計',
close_style_design: '关闭样式设计', close_style_design: '關閉樣式設計',
matrix_design: '矩阵设计', matrix_design: '矩陣設計',
left: 'x 坐', left: 'x 坐',
top: 'y 坐', top: 'y 坐',
height: '高', height: '高',
width: '', width: '',
color: '色', color: '色',
backgroundColor: '背景色', backgroundColor: '背景色',
borderStyle: '边框风格', borderStyle: '邊框風格',
borderWidth: '边框宽度', borderWidth: '邊框寬度',
borderColor: '边框颜色', borderColor: '邊框顏色',
borderRadius: '边框半径', borderRadius: '邊框半徑',
fontSize: '字大小', fontSize: '字大小',
fontWeight: '字体粗细', fontWeight: '字體粗細',
lineHeight: '行高', lineHeight: '行高',
letterSpacing: '字距', letterSpacing: '字距',
textAlign: '左右对齐', textAlign: '左右對齊',
opacity: '透明度', opacity: '透明度',
verticalAlign: '上下对齐', verticalAlign: '上下對齊',
text_align_left: '左对齐', text_align_left: '左對齊',
text_align_center: '左右居中', text_align_center: '左右居中',
text_align_right: '右对齐', text_align_right: '右對齊',
vertical_align_top: '上对齐', vertical_align_top: '上對齊',
vertical_align_middle: '居中对齐', vertical_align_middle: '居中對齊',
vertical_align_bottom: '下对齐', vertical_align_bottom: '下對齊',
border_style_solid: '实线', border_style_solid: '實線',
border_style_dashed: '虚线', border_style_dashed: '虛線',
select_component: '请选择组件', select_component: '請選擇組件',
other_module: '其他', other_module: '其他',
content: '内容', content: '內容',
default_panel_name: '默认仪表板名称', default_panel_name: '默認儀表板名稱',
source_panel_name: '原仪表板名称', source_panel_name: '原儀表板名稱',
content_style: '内容样式' content_style: '內容樣式',
canvas_self_adaption: '自適應畫布區域'
}, },
plugin: { plugin: {
local_install: '本地安裝', local_install: '本地安裝',
...@@ -1026,7 +1027,7 @@ export default { ...@@ -1026,7 +1027,7 @@ export default {
auth: { auth: {
authConfig: '權限配置', authConfig: '權限配置',
authQuickConfig: '權限快捷配置', authQuickConfig: '權限快捷配置',
dept: '组织', dept: '組織',
role: '角色', role: '角色',
user: '用戶', user: '用戶',
linkAuth: '數據源權限', linkAuth: '數據源權限',
...@@ -1034,7 +1035,7 @@ export default { ...@@ -1034,7 +1035,7 @@ export default {
chartAuth: '視圖權限', chartAuth: '視圖權限',
panelAuth: '儀表板權限', panelAuth: '儀表板權限',
menuAuth: '菜單和操作權限', menuAuth: '菜單和操作權限',
deptHead: '所有组织', deptHead: '所有組織',
roleHead: '所有角色', roleHead: '所有角色',
userHead: '所有用戶', userHead: '所有用戶',
linkAuthHead: '所有數據源', linkAuthHead: '所有數據源',
...@@ -1061,10 +1062,10 @@ export default { ...@@ -1061,10 +1062,10 @@ export default {
update_success: '更新成功' update_success: '更新成功'
}, },
template: { template: {
exit_same_template_check: '当前存在相同名称模板,是否覆盖?', exit_same_template_check: '當前存在相同名稱模板,是否覆蓋?',
override: '覆', override: '覆',
cancel: '取消', cancel: '取消',
confirm_upload: '上传确认' confirm_upload: '上傳確認'
}, },
cron: { cron: {
second: '秒', second: '秒',
......
...@@ -998,7 +998,8 @@ export default { ...@@ -998,7 +998,8 @@ export default {
content: '内容', content: '内容',
default_panel_name: '默认仪表板名称', default_panel_name: '默认仪表板名称',
source_panel_name: '原仪表板名称', source_panel_name: '原仪表板名称',
content_style: '内容样式' content_style: '内容样式',
canvas_self_adaption: '自适应画布区域'
}, },
plugin: { plugin: {
local_install: '本地安装', local_install: '本地安装',
......
...@@ -53,6 +53,7 @@ export const filterAsyncRouter = (routers) => { // 遍历后台传来的路由 ...@@ -53,6 +53,7 @@ export const filterAsyncRouter = (routers) => { // 遍历后台传来的路由
router.component = loadView(component) router.component = loadView(component)
} }
} }
router.name && fillMeta(router)
if (router.children && router.children.length) { if (router.children && router.children.length) {
router.children = filterAsyncRouter(router.children) router.children = filterAsyncRouter(router.children)
} }
...@@ -66,6 +67,14 @@ export const filterAsyncRouter = (routers) => { // 遍历后台传来的路由 ...@@ -66,6 +67,14 @@ export const filterAsyncRouter = (routers) => { // 遍历后台传来的路由
}) })
} }
// 后台设计时未考虑activeMenu字段 这里先前端处理一下
export const fillMeta = (router) => {
router.name.includes('system-user-form') && (router.meta.activeMenu = '/system/user')
router.name.includes('system-role-form') && (router.meta.activeMenu = '/system/role')
router.name.includes('system-dept-form') && (router.meta.activeMenu = '/system/dept')
// return router
}
// 包装一层父级目录 // 包装一层父级目录
export const decorate = (router) => { export const decorate = (router) => {
const parent = { const parent = {
......
<template> <template>
<el-row style="height: 100%;overflow-y: hidden;width: 100%;"> <el-row style="height: 100%;overflow-y: hidden;width: 100%;">
<span v-show="false">{{ tableRefresh }}</span>
<el-row style="height: 26px;"> <el-row style="height: 26px;">
<el-popover <el-popover
placement="right-start" placement="right-start"
...@@ -92,6 +93,12 @@ export default { ...@@ -92,6 +93,12 @@ export default {
tabStatus: false tabStatus: false
} }
}, },
computed: {
tableRefresh() {
this.initTable(this.param)
return this.$store.state.dataset.table
}
},
watch: { watch: {
'param': function() { 'param': function() {
this.initTable(this.param) this.initTable(this.param)
...@@ -107,9 +114,11 @@ export default { ...@@ -107,9 +114,11 @@ export default {
if (id !== null) { if (id !== null) {
this.fields = [] this.fields = []
this.data = [] this.data = []
getTable(id).then(response => { getTable(id, true).then(response => {
this.table = response.data this.table = response.data
this.initPreviewData(this.page) this.initPreviewData(this.page)
}).catch(res => {
this.$emit('switchComponent', { name: '' })
}) })
} }
}, },
......
...@@ -561,8 +561,8 @@ export default { ...@@ -561,8 +561,8 @@ export default {
// this.tableTree() // this.tableTree()
this.refreshNodeBy(table.sceneId) this.refreshNodeBy(table.sceneId)
// this.$router.push('/dataset/home') // this.$router.push('/dataset/home')
this.$emit('switchComponent', { name: '' }) // this.$emit('switchComponent', { name: 'ViewTable', param: table.id })
this.$store.dispatch('dataset/setTable', null) this.$store.dispatch('dataset/setTable', new Date().getTime())
}) })
} else { } else {
// this.$message({ // this.$message({
...@@ -609,8 +609,8 @@ export default { ...@@ -609,8 +609,8 @@ export default {
// this.tableTree() // this.tableTree()
this.refreshNodeBy(data.sceneId) this.refreshNodeBy(data.sceneId)
// this.$router.push('/dataset/home') // this.$router.push('/dataset/home')
this.$emit('switchComponent', { name: '' }) // this.$emit('switchComponent', { name: '' })
this.$store.dispatch('dataset/setTable', null) this.$store.dispatch('dataset/setTable', new Date().getTime())
}) })
}).catch(() => { }).catch(() => {
}) })
......
...@@ -20,14 +20,14 @@ ...@@ -20,14 +20,14 @@
<background-color-selector v-if="chart" class="attr-selector" :chart="chart" @onChangeBackgroundForm="onChangeBackgroundForm" /> <background-color-selector v-if="chart" class="attr-selector" :chart="chart" @onChangeBackgroundForm="onChangeBackgroundForm" />
</el-row> </el-row>
</el-collapse-item> </el-collapse-item>
<el-collapse-item :title="$t('chart.shape_attr')" name="graphical"> <el-collapse-item :title="$t('panel.table')" name="table">
<el-row style="background-color: #f7f8fa; margin: 5px"> <el-row style="background-color: #f7f8fa; margin: 5px">
<color-selector :source-type="'panelEchart'" class="attr-selector" :chart="chart" @onColorChange="onColorChange" /> <color-selector index="10002" :source-type="'panelTable'" class="attr-selector" :chart="tableChart" @onColorChange="onTableColorChange" />
</el-row> </el-row>
</el-collapse-item> </el-collapse-item>
<el-collapse-item :title="$t('panel.table')" name="table"> <el-collapse-item :title="$t('chart.shape_attr')" name="graphical">
<el-row style="background-color: #f7f8fa; margin: 5px"> <el-row style="background-color: #f7f8fa; margin: 5px">
<color-selector index="10002" :source-type="'panelTable'" class="attr-selector" :chart="tableChart" @onColorChange="onTableColorChange" /> <color-selector :source-type="'panelEchart'" class="attr-selector" :chart="chart" @onColorChange="onColorChange" />
</el-row> </el-row>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
......
...@@ -141,7 +141,7 @@ export default { ...@@ -141,7 +141,7 @@ export default {
if (!(element.type in types)) { if (!(element.type in types)) {
types[element.type] = [] types[element.type] = []
// newArr.push(...element, ...{ children: types[element.type] }) // newArr.push(...element, ...{ children: types[element.type] })
newArr.push({ id: element.type, name: element.type, type: 'folder', children: types[element.type] }) newArr.push({ id: element.type, name: this.transTypeToName(element.type), type: 'folder', children: types[element.type] })
} }
types[element.type].push(element) types[element.type].push(element)
// newArr.children.push({ id: element.id, label: element.name }) // newArr.children.push({ id: element.id, label: element.name })
...@@ -149,6 +149,14 @@ export default { ...@@ -149,6 +149,14 @@ export default {
return newArr return newArr
}, },
transTypeToName(type) {
if (type === 'mysql') {
return 'MySQL'
} else if (type === 'sqlServer') {
return 'SQL Server'
}
},
addFolder() { addFolder() {
this.switchMain('DsForm') this.switchMain('DsForm')
}, },
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论