Merge branch 'dev' into pr@dev_dataset_source

This commit is contained in:
dataeaseShu 2022-09-26 16:36:40 +08:00
commit f0ea548a03
29 changed files with 139 additions and 84 deletions

View File

@ -26,7 +26,7 @@ public class TableUtils {
return "f_" + Md5Utils.md5(dorisName).substring(8, 24);
}
public static String columnName(String filedName) {
return "C_" + Md5Utils.md5(filedName);
public static String columnName(String fieldName) {
return "C_" + Md5Utils.md5(fieldName);
}
}

View File

@ -173,6 +173,9 @@ public class JdbcProvider extends DefaultJdbcProvider {
}
}
}
if(StringUtils.isNotEmpty(tableField.getFieldType()) && tableField.getFieldType().equalsIgnoreCase("DECIMAL")){
tableField.setAccuracy(Integer.valueOf(resultSet.getString("DECIMAL_DIGITS")));
}
return tableField;
}

View File

@ -72,7 +72,11 @@ public class DorisDDLProvider extends DDLProviderImpl {
Column_Fields.append("bigint").append(",`");
break;
case 3:
Column_Fields.append("DOUBLE").append(",`");
if(datasetTableField.getType().equalsIgnoreCase("DECIMAL") && datasetTableField.getAccuracy() != 0){
Column_Fields.append("DECIMAL(" + datasetTableField.getSize() + "," + datasetTableField.getAccuracy() + ")").append(",`");
}else {
Column_Fields.append("DOUBLE").append(",`");
}
break;
case 4:
Column_Fields.append("TINYINT(length)".replace("length", String.valueOf(size))).append(",`");

View File

@ -1768,16 +1768,16 @@ public class DataSetTableService {
List<DatasetTableField> datasetTableFields = new ArrayList<>();
if (CollectionUtils.isNotEmpty(fields)) {
for (int i = 0; i < fields.size(); i++) {
TableField filed = fields.get(i);
TableField field = fields.get(i);
DatasetTableField datasetTableField = DatasetTableField.builder().build();
datasetTableField.setTableId(datasetTableId);
datasetTableField.setOriginName(filed.getFieldName());
datasetTableField.setName(filed.getRemarks());
datasetTableField.setDataeaseName(TableUtils.columnName(filed.getFieldName()));
datasetTableField.setType(filed.getFieldType());
datasetTableField.setDeType(transFieldType(filed.getFieldType()));
datasetTableField.setDeExtractType(transFieldType(filed.getFieldType()));
datasetTableField.setSize(filed.getFieldSize());
datasetTableField.setOriginName(field.getFieldName());
datasetTableField.setName(field.getRemarks());
datasetTableField.setDataeaseName(TableUtils.columnName(field.getFieldName()));
datasetTableField.setType(field.getFieldType());
datasetTableField.setDeType(transFieldType(field.getFieldType()));
datasetTableField.setDeExtractType(transFieldType(field.getFieldType()));
datasetTableField.setSize(field.getFieldSize());
datasetTableField.setChecked(true);
datasetTableField.setColumnIndex(i);
datasetTableField.setLastSyncTime(System.currentTimeMillis());
@ -1939,44 +1939,46 @@ public class DataSetTableService {
if (CollectionUtils.isNotEmpty(fields)) {
List<String> originNameList = new ArrayList<>();
for (int i = 0; i < fields.size(); i++) {
TableField filed = fields.get(i);
originNameList.add(filed.getFieldName());
TableField field = fields.get(i);
originNameList.add(field.getFieldName());
DatasetTableField datasetTableField = DatasetTableField.builder().build();
// 物理字段名设定为唯一查询当前数据集下是否已存在该字段存在则update不存在则insert
DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample();
// 字段名一致认为字段没有改变
datasetTableFieldExample.createCriteria().andTableIdEqualTo(datasetTable.getId()).andOriginNameEqualTo(filed.getFieldName());
datasetTableFieldExample.createCriteria().andTableIdEqualTo(datasetTable.getId()).andOriginNameEqualTo(field.getFieldName());
List<DatasetTableField> datasetTableFields = datasetTableFieldMapper.selectByExample(datasetTableFieldExample);
if (CollectionUtils.isNotEmpty(datasetTableFields)) {
datasetTableField.setId(datasetTableFields.get(0).getId());
datasetTableField.setOriginName(filed.getFieldName());
datasetTableField.setType(filed.getFieldType());
datasetTableField.setSize(filed.getFieldSize());
datasetTableField.setOriginName(field.getFieldName());
datasetTableField.setType(field.getFieldType());
datasetTableField.setSize(field.getFieldSize());
datasetTableField.setAccuracy(field.getAccuracy());
if (ObjectUtils.isEmpty(ds)) {
datasetTableField.setDeExtractType(transFieldType(filed.getFieldType()));
datasetTableField.setDeExtractType(transFieldType(field.getFieldType()));
} else {
Integer fieldType = qp.transFieldType(filed.getFieldType());
Integer fieldType = qp.transFieldType(field.getFieldType());
datasetTableField.setDeExtractType(fieldType);
}
} else {
datasetTableField.setTableId(datasetTable.getId());
datasetTableField.setOriginName(filed.getFieldName());
datasetTableField.setName(filed.getRemarks());
datasetTableField.setOriginName(field.getFieldName());
datasetTableField.setName(field.getRemarks());
if (datasetTable.getMode() == 1 && StringUtils.equalsIgnoreCase("union", datasetTable.getType())) {
datasetTableField.setDataeaseName(filed.getFieldName());
datasetTableField.setDataeaseName(field.getFieldName());
} else {
datasetTableField.setDataeaseName(TableUtils.columnName(filed.getFieldName()));
datasetTableField.setDataeaseName(TableUtils.columnName(field.getFieldName()));
}
datasetTableField.setType(filed.getFieldType());
datasetTableField.setType(field.getFieldType());
if (ObjectUtils.isEmpty(ds)) {
datasetTableField.setDeType(transFieldType(filed.getFieldType()));
datasetTableField.setDeExtractType(transFieldType(filed.getFieldType()));
datasetTableField.setDeType(transFieldType(field.getFieldType()));
datasetTableField.setDeExtractType(transFieldType(field.getFieldType()));
} else {
Integer fieldType = qp.transFieldType(filed.getFieldType());
Integer fieldType = qp.transFieldType(field.getFieldType());
datasetTableField.setDeType(fieldType == 4 ? 2 : (fieldType == 6 ? 0 : fieldType));
datasetTableField.setDeExtractType(fieldType);
}
datasetTableField.setSize(filed.getFieldSize());
datasetTableField.setSize(field.getFieldSize());
datasetTableField.setAccuracy(field.getAccuracy());
datasetTableField.setChecked(true);
datasetTableField.setLastSyncTime(syncTime);
datasetTableField.setExtField(0);
@ -2094,8 +2096,8 @@ public class DataSetTableService {
List<String> sqlFileds = new ArrayList<>();
try {
datasourceProvider.fetchResultField(datasourceRequest).stream().map(TableField::getFieldName)
.forEach(filed -> {
sqlFileds.add(filed);
.forEach(field -> {
sqlFileds.add(field);
});
} catch (Exception e) {
DataEaseException.throwException(Translator.get("i18n_check_sql_error") + e.getMessage());
@ -2114,7 +2116,7 @@ public class DataSetTableService {
List<String> sqlFileds = new ArrayList<>();
try {
datasourceProvider.fetchResultField(datasourceRequest).stream().map(TableField::getFieldName)
.forEach(filed -> sqlFileds.add(filed));
.forEach(field -> sqlFileds.add(field));
} catch (Exception e) {
DataEaseException.throwException(Translator.get("i18n_check_sql_error") + e.getMessage());
}

View File

@ -198,25 +198,25 @@ public class ExtractDataService {
saveSuccessLog(datasetTableTaskLog, false);
updateTableStatus(datasetTableId, JobStatus.Completed, execTime);
if (ops.equalsIgnoreCase("替换")) {
List<DatasetTableField> oldFileds = getDatasetTableFields(datasetTable.getId());
List<DatasetTableField> oldFields = getDatasetTableFields(datasetTable.getId());
List<DatasetTableField> toAdd = new ArrayList<>();
List<DatasetTableField> toDelete = new ArrayList<>();
for (DatasetTableField oldFiled : oldFileds) {
for (DatasetTableField oldField : oldFields) {
boolean delete = true;
for (DatasetTableField datasetTableField : datasetTableFields) {
if (oldFiled.getDataeaseName().equalsIgnoreCase(datasetTableField.getDataeaseName()) && oldFiled.getDeExtractType().equals(datasetTableField.getDeExtractType())) {
if (oldField.getDataeaseName().equalsIgnoreCase(datasetTableField.getDataeaseName()) && oldField.getDeExtractType().equals(datasetTableField.getDeExtractType())) {
delete = false;
}
}
if (delete) {
toDelete.add(oldFiled);
toDelete.add(oldField);
}
}
for (DatasetTableField datasetTableField : datasetTableFields) {
boolean add = true;
for (DatasetTableField oldFiled : oldFileds) {
if (oldFiled.getDataeaseName().equalsIgnoreCase(datasetTableField.getDataeaseName()) && oldFiled.getDeExtractType().equals(datasetTableField.getDeExtractType())) {
for (DatasetTableField oldField : oldFields) {
if (oldField.getDataeaseName().equalsIgnoreCase(datasetTableField.getDataeaseName()) && oldField.getDeExtractType().equals(datasetTableField.getDeExtractType())) {
add = false;
}
}
@ -887,8 +887,8 @@ public class ExtractDataService {
datasourceRequest.setDatasource(ds);
datasourceRequest.setQuery(qp.wrapSql(sql));
List<String> dorisFields = new ArrayList<>();
datasourceProvider.fetchResultField(datasourceRequest).stream().map(TableField::getFieldName).forEach(filed -> {
dorisFields.add(TableUtils.columnName(filed));
datasourceProvider.fetchResultField(datasourceRequest).stream().map(TableField::getFieldName).forEach(field -> {
dorisFields.add(TableUtils.columnName(field));
});
return String.join(",", dorisFields);
}

View File

@ -54,16 +54,16 @@ public class DirectFieldService implements DataSetFieldService {
@Override
public List<Object> fieldValues(String fieldId, Long userId, Boolean userPermissions, Boolean rowAndColumnMgm) throws Exception {
List<String> filedIds = new ArrayList<>();
filedIds.add(fieldId);
return fieldValues(filedIds, null, userId, userPermissions, false, rowAndColumnMgm);
List<String> fieldIds = new ArrayList<>();
fieldIds.add(fieldId);
return fieldValues(fieldIds, null, userId, userPermissions, false, rowAndColumnMgm);
}
@Override
public List<Object> fieldValues(String fieldId, DeSortDTO sortDTO, Long userId, Boolean userPermissions, Boolean rowAndColumnMgm) throws Exception {
List<String> filedIds = new ArrayList<>();
filedIds.add(fieldId);
return fieldValues(filedIds, sortDTO, userId, userPermissions, false, rowAndColumnMgm);
List<String> fieldIds = new ArrayList<>();
fieldIds.add(fieldId);
return fieldValues(fieldIds, sortDTO, userId, userPermissions, false, rowAndColumnMgm);
}
public List<DeSortField> buildSorts(List<DatasetTableField> allFields, DeSortDTO sortDTO) {

View File

@ -119,6 +119,8 @@ ALTER TABLE `sys_user_assist`
ADD COLUMN `dingtalk_id` varchar(255) NULL COMMENT '钉钉账号' AFTER `wecom_id`,
ADD COLUMN `lark_id` varchar(255) NULL COMMENT '飞书账号' AFTER `dingtalk_id`;
ALTER TABLE `dataset_table_field` ADD COLUMN `accuracy` INT(11) NULL DEFAULT 0 COMMENT '精度' AFTER `last_sync_time`;
INSERT INTO `sys_auth_detail` (`id`, `auth_id`, `privilege_name`, `privilege_type`, `privilege_value`, `privilege_extend`, `remark`, `create_user`, `create_time`, `update_time`, `copy_from`, `copy_id`) VALUES ('d55c4585-3b0a-11ed-8009-0242ac130005', '379c3124-7a30-4c1b-8ae4-de23eaf34b71', 'i18n_auth_grant', 15, 0, 'grant', '基础权限-授权', 'admin', 1663915323000, NULL, NULL, NULL);
INSERT INTO `sys_auth_detail` (`id`, `auth_id`, `privilege_name`, `privilege_type`, `privilege_value`, `privilege_extend`, `remark`, `create_user`, `create_time`, `update_time`, `copy_from`, `copy_id`) VALUES ('d55c4c0d-3b0a-11ed-8009-0242ac130005', '379c3124-7a30-4c1b-8ae4-de23eaf34b71', 'i18n_auth_manage', 3, 0, 'manage', '基础权限-管理', 'admin', 1663915323000, NULL, NULL, NULL);
INSERT INTO `sys_auth_detail` (`id`, `auth_id`, `privilege_name`, `privilege_type`, `privilege_value`, `privilege_extend`, `remark`, `create_user`, `create_time`, `update_time`, `copy_from`, `copy_id`) VALUES ('d55c4d88-3b0a-11ed-8009-0242ac130005', '379c3124-7a30-4c1b-8ae4-de23eaf34b71', 'i18n_auth_use', 1, 1, 'use', '基础权限-使用', 'admin', 1663915323000, NULL, NULL, NULL);

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -1,6 +1,6 @@
<template>
<div @mousedown="fieldsAreaDown">
<el-button v-for="(field) in fields" :key="field.id" size="mini" class="field-area" @click="fieldSelect(field)">
<el-button v-for="(field) in fields" :title="field.name" :key="field.id" size="mini" class="field-area" @click="fieldSelect(field)">
{{ field.name }}
</el-button>
</div>
@ -51,6 +51,9 @@ export default {
margin: 4px 0 0 0;
text-align: left;
margin-left: 0px!important;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
</style>

View File

@ -69,6 +69,7 @@ export default {
data() {
return {
initReady: false,
editReady: false,
editShow: true,
canEdit: false,
//
@ -109,6 +110,9 @@ export default {
//
active(val) {
if (!val) {
if (this.canEdit) {
this.element.propValue.textValue = this.myValue
}
this.canEdit = false
this.reShow()
this.myValue = this.assignment(this.element.propValue.textValue)
@ -117,9 +121,6 @@ export default {
}
},
myValue(newValue) {
if (this.canEdit) {
this.element.propValue.textValue = newValue
}
this.initReady&&this.$store.commit('canvasChange')
}
},
@ -195,6 +196,8 @@ export default {
this.canEdit = true
this.element['editing'] = true
this.myValue = this.element.propValue.textValue
const ed = tinymce.editors[this.tinymceId]
ed.setContent(this.myValue)
this.reShow()
}
},

View File

@ -141,6 +141,7 @@ import { viewEditSave, viewPropsSave } from '@/api/chart/chart'
import { checkAddHttp } from '@/utils/urlUtils'
import DeRichTextView from '@/components/canvas/custom-component/DeRichTextView'
import Vue from 'vue'
import { formatterItem, valueFormatter } from '@/views/chart/chart/formatter'
export default {
name: 'UserView',
@ -654,6 +655,21 @@ export default {
return pre
}, {})
const rowData = chartDetails.data.tableRow[0]
if(chartDetails.type === 'richTextView'){
let yAxis = []
try {
yAxis = JSON.parse(chartDetails.yaxis)
} catch (err) {
yAxis = JSON.parse(JSON.stringify(chartDetails.yaxis))
}
let yDataeaseNames = []
let yDataeaseNamesCfg = []
yAxis.forEach(yItem => {
yDataeaseNames.push(yItem.dataeaseName)
yDataeaseNamesCfg[yItem.dataeaseName]=yItem.formatterCfg
})
this.rowDataFormat(rowData,yDataeaseNames,yDataeaseNamesCfg)
}
for (const key in rowData) {
this.dataRowSelect[nameIdMap[key]] = rowData[key]
this.dataRowNameSelect[sourceFieldNameIdMap[key]] = rowData[key]
@ -666,6 +682,25 @@ export default {
})
}
},
rowDataFormat(rowData,yDataeaseNames,yDataeaseNamesCfg) {
for (const key in rowData) {
if(yDataeaseNames.includes(key)){
let formatterCfg = yDataeaseNamesCfg[key]
let value = rowData[key]
if (value === null || value === undefined) {
rowData[key] = '-'
}
if (formatterCfg) {
const v = valueFormatter(value, formatterCfg)
rowData[key] = v.includes('NaN') ? value : v
} else {
const v = valueFormatter(value, formatterItem)
rowData[key] = v.includes('NaN') ? value : v
}
}
}
},
viewIdMatch(viewIds, viewId) {
return !viewIds || viewIds.length === 0 || viewIds.includes(viewId)
},

View File

@ -94,7 +94,7 @@
<el-dropdown-item :command="beforeSort('none')">{{ $t('chart.none') }}</el-dropdown-item>
<el-dropdown-item :command="beforeSort('asc')">{{ $t('chart.asc') }}</el-dropdown-item>
<el-dropdown-item :command="beforeSort('desc')">{{ $t('chart.desc') }}</el-dropdown-item>
<el-dropdown-item v-show="!item.chartId && (item.deType === 0 || item.deType === 5)" :command="beforeSort('custom_sort')">{{ $t('chart.custom_sort') }}...</el-dropdown-item>
<el-dropdown-item v-show="!item.chartId" :command="beforeSort('custom_sort')">{{ $t('chart.custom_sort') }}...</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</el-dropdown-item>

View File

@ -1,7 +1,7 @@
<template xmlns:el-col="http://www.w3.org/1999/html">
<el-col class="tree-style">
<el-col>
<el-row class="title-css" v-show="showView === 'Datasource'">
<el-row v-show="showView === 'Datasource'" class="title-css">
<el-col class="title-text" :span="12">
{{ $t('commons.datasource') }}
</el-col>
@ -13,10 +13,10 @@
placement="top"
>
<i
@click="driverMgm"
v-show="user.isAdmin"
class="el-icon-setting"
></i>
@click="driverMgm"
/>
</el-tooltip>
<el-tooltip
class="item"
@ -24,7 +24,7 @@
:content="$t('datasource.create')"
placement="top"
>
<i @click="addFolder" class="el-icon-plus"></i>
<i class="el-icon-plus" @click="addFolder" />
</el-tooltip>
</el-col>
</el-row>
@ -54,8 +54,8 @@
<span
v-if="
data.type !== 'folder' &&
data.status !== 'Error' &&
data.status !== 'Warning'
data.status !== 'Error' &&
data.status !== 'Warning'
"
>
<svg-icon
@ -87,8 +87,8 @@
"
>
<el-tooltip
effect="dark"
v-if="['Error', 'Warning'].includes(data.status)"
effect="dark"
:content="
data.status === 'Warning'
? $t('datasource.warning')
@ -107,8 +107,8 @@
</span>
<span class="child">
<el-tooltip
class="item"
v-if="data.type === 'folder'"
class="item"
effect="dark"
:content="
$t(
@ -120,10 +120,10 @@
placement="top"
>
<i
class="el-icon-plus"
@click.stop
@click="addFolderWithType(data)"
class="el-icon-plus"
></i>
/>
</el-tooltip>
<el-dropdown
@ -132,15 +132,15 @@
trigger="click"
@command="(type) => handleCommand(type, data)"
>
<i @click.stop class="el-icon-more"></i>
<el-dropdown-menu class="de-card-dropdown" slot="dropdown">
<i class="el-icon-more" @click.stop />
<el-dropdown-menu slot="dropdown" class="de-card-dropdown">
<slot>
<el-dropdown-item command="edit">
<i class="el-icon-edit"></i>
<i class="el-icon-edit" />
{{ $t('chart.edit') }}
</el-dropdown-item>
<el-dropdown-item command="delete">
<i class="el-icon-delete"></i>
<i class="el-icon-delete" />
{{ $t('chart.delete') }}
</el-dropdown-item>
</slot>
@ -192,13 +192,16 @@
</el-select>
</el-form-item>
<el-form-item :label="$t('commons.description')">
<deTextarea v-model="driverForm.desc"></deTextarea>
<deTextarea v-model="driverForm.desc" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<deBtn secondary @click="close()">{{ $t('commons.cancel') }}</deBtn>
<deBtn type="primary" size="mini" @click="saveDriver(driverForm)"
>{{ $t('commons.save') }}
<deBtn
type="primary"
size="mini"
@click="saveDriver(driverForm)"
>{{ $t('commons.save') }}
</deBtn>
</div>
</el-dialog>
@ -212,32 +215,34 @@
append-to-body
>
<el-tabs v-model="tabActive">
<el-tab-pane :label="$t('datasource.all')" name="all"> </el-tab-pane>
<el-tab-pane :label="$t('datasource.all')" name="all" />
<el-tab-pane
:label="$t('datasource.relational_database')"
name="RDBMS"
>
</el-tab-pane>
/>
<el-tab-pane
:label="$t('datasource.non_relational_database')"
name="NORDBMS"
>
</el-tab-pane>
<el-tab-pane :label="$t('datasource.other')" name="OTHER">
</el-tab-pane>
/>
<el-tab-pane :label="$t('datasource.other')" name="OTHER" />
</el-tabs>
<div class="db-container">
<div
@click="addDb(db)"
v-for="(db, index) in databaseList"
:key="db.type"
class="db-card"
:class="[{ marLeft: index % 4 === 0 }]"
@click="addDb(db)"
>
<img
src="https://gimg3.baidu.com/search/src=http%3A%2F%2Fgips0.baidu.com%2Fit%2Fu%3D3429312337%2C2430696955%26fm%3D3030%26app%3D3030%26f%3DJPEG%3Fw%3D121%26h%3D74%26s%3D51321C7281B1598818E875C1030010B0&refer=http%3A%2F%2Fwww.baidu.com&app=2021&size=f242,150&n=0&g=0n&q=100&fmt=auto?sec=1662483600&t=53d1d1fe51561bb626c94ce63b5b31b8"
v-if="!db.isPlugin"
:src="require('../../../assets/datasource/' + db.type + '.jpg')"
alt=""
/>
>
<img
v-if="db.isPlugin"
:src="`/api/pluginCommon/staticInfo/${db.type}/jpg`"
>
<p class="db-name">{{ db.name }}</p>
</div>
</div>
@ -259,13 +264,12 @@ import {
listDriverByType,
updateDriver
} from '@/api/system/datasource'
import { ApplicationContext } from '@/utils/ApplicationContext'
import deTextarea from '@/components/deCustomCm/deTextarea.vue'
import msgCfm from '@/components/msgCfm'
export default {
name: 'DsTree',
mixins: [msgCfm],
components: { deTextarea },
mixins: [msgCfm],
props: {
datasource: {
type: Object,
@ -502,7 +506,7 @@ export default {
},
showInfo(row) {
if (this.showView === 'Driver') {
const param = { ...row.data, ...{ showModel: 'show' } }
const param = { ...row.data, ...{ showModel: 'show' }}
this.switchMain(
this.showView === 'Datasource' ? 'DsForm' : 'DriverForm',
param,
@ -527,7 +531,7 @@ export default {
},
_handleEditer(row) {
if (this.showView === 'Datasource') {
const param = { ...row, ...{ showModel: 'show' } }
const param = { ...row, ...{ showModel: 'show' }}
this.switchMain('DsForm', param, this.tData, this.dsTypes)
return
}
@ -716,4 +720,4 @@ export default {
margin-left: 0;
}
}
</style>
</style>

View File

@ -149,8 +149,7 @@ export default {
message: this.$t('member.password_format_is_incorrect'),
trigger: 'blur'
}
],
roleIds: [{ required: true, message: this.$t('user.input_roles'), trigger: 'change' }]
]
},
defaultForm: { id: null, username: null, nickName: null, gender: '男', email: null, enabled: 1, deptId: null, phone: null, roleIds: [] },