v3.15.0【新增】升级SaToken到最新版本;【新增】重磅优化 数据字典;【新增】升级wangEditor-next;【新增】优化缓存实现redis与caffeine

This commit is contained in:
zhuoda
2025-03-31 23:19:41 +08:00
parent 7ef9000c62
commit 4683e31290
347 changed files with 4203 additions and 3792 deletions

View File

@@ -1,28 +0,0 @@
<template>
<div>
<template v-for="(item, index) in options">
<template v-if="values.includes(item.valueCode)">
{{ item.valueName }}
<span> </span>
</template>
</template>
</div>
</template>
<script setup>
import { computed } from 'vue';
const props = defineProps({
// 数据
options: {
type: Array,
default: null,
},
// 当前的值
value: [Number, String, Array],
});
const values = computed(() => {
if (props.value === null || typeof props.value === 'undefined' || props.value === '') return [];
return Array.isArray(props.value) ? props.value.map((item) => item.valueCode) : props.value.split(',');
});
</script>

View File

@@ -29,7 +29,7 @@
import { ref, watch } from 'vue';
const props = defineProps({
value: Number,
value: Boolean,
width: {
type: Number,
default: 100,

View File

@@ -24,7 +24,7 @@
import { onMounted, ref, nextTick } from 'vue';
import { Modal } from 'ant-design-vue';
import { v4 as uuid } from 'uuid';
import SmartCopyIcon from '/@/components/smart-copy-icon/index.vue';
import SmartCopyIcon from '/@/components/framework/smart-copy-icon/index.vue';
const props = defineProps({
text: {

View File

@@ -25,8 +25,8 @@
import { shallowRef, onBeforeUnmount, watch, ref } from 'vue';
import { FILE_FOLDER_TYPE_ENUM } from '/@/constants/support/file-const';
import { fileApi } from '/@/api/support/file-api';
import '@wangeditor/editor/dist/css/style.css';
import { Editor, Toolbar } from '@wangeditor/editor-for-vue';
import '@wangeditor-next/editor/dist/css/style.css';
import { Editor, Toolbar } from '@wangeditor-next/editor-for-vue';
import { smartSentry } from '/@/lib/smart-sentry';
//菜单

View File

@@ -20,8 +20,8 @@
@change="onChange"
:disabled="disabled"
>
<a-select-option v-for="item in dictKeyCodeList" :key="item.keyCode" :value="item.keyCode">
{{ item.keyName }}
<a-select-option v-for="item in dictList" :key="item.dictCode" :value="item.dictCode">
{{ item.dictName }}
</a-select-option>
</a-select>
</div>
@@ -58,10 +58,10 @@
// -------------------------- --------------------------
const dictKeyCodeList = ref([]);
const dictList = ref([]);
async function queryDict() {
let responseModel = await dictApi.queryAllKey();
dictKeyCodeList.value = responseModel.data;
let response = await dictApi.getAllDict();
dictList.value = response.data;
}
onMounted(queryDict);

View File

@@ -0,0 +1,16 @@
<template>
<span>{{ dataLabels }}</span>
</template>
<script setup>
import { computed } from 'vue';
import { useDictStore } from '/@/store/modules/system/dict.js';
const props = defineProps({
dictCode: String,
dataValue: String,
});
const dataLabels = computed(() => {
return useDictStore().getDataLabels(props.dictCode, props.dataValue);
});
</script>

View File

@@ -20,13 +20,8 @@
@change="onChange"
:disabled="disabled"
>
<a-select-option
v-for="item in dictValueList"
:key="item.valueCode"
:value="item.valueCode"
:disabled="disabledOption.includes(item.valueCode)"
>
{{ item.valueName }}
<a-select-option v-for="item in dictDataList" :key="item.dataValue" :value="item.dataValue" :disabled="disabledOption.includes(item.valueCode)">
{{ item.dataLabel }}
</a-select-option>
</a-select>
</div>
@@ -34,10 +29,10 @@
<script setup>
import { onMounted, ref, watch } from 'vue';
import { dictApi } from '/@/api/support/dict-api';
import { useDictStore } from '/@/store/modules/system/dict.js';
const props = defineProps({
keyCode: String,
dictCode: String,
value: [Array, String],
mode: {
type: String,
@@ -74,13 +69,13 @@
// -------------------------- 查询 字典数据 --------------------------
const dictValueList = ref([]);
async function queryDict() {
let res = await dictApi.valueList(props.keyCode);
dictValueList.value = res.data.filter((item) => !props.hiddenOption.includes(item.valueCode));
const dictDataList = ref([]);
function initDictData() {
let list = useDictStore().getDictData(props.dictCode);
dictDataList.value = list.filter((item) => !props.hiddenOption.includes(item.dataValue) && !item.disabledFlag);
}
onMounted(queryDict);
onMounted(initDictData);
// -------------------------- 选中 相关、事件 --------------------------

View File

@@ -47,7 +47,7 @@
width="100%"
v-model:value="modelValue"
:multiple="column.filterOptions.multiple"
:keyCode="column.filterOptions.keyCode"
:dictCode="column.filterOptions.dictCode"
:enumName="column.filterOptions.enumName"
:systemConfigKey="column.filterOptions.systemConfigKey"
:placeholder="column.placeholder"
@@ -78,12 +78,12 @@
});
const components = {
'enum-select': defineAsyncComponent(() => import('/@/components/framework/smart-enum-select/index.vue')),
'dict-select': defineAsyncComponent(() => import('/@/components/support/dict-select/index.vue')),
'employee-select': defineAsyncComponent(() => import('/@/components/system/employee-select/index.vue')),
'enterprise-select': defineAsyncComponent(() => import('/@/components/business/oa/enterprise-select/index.vue')),
'boolean-select': defineAsyncComponent(() => import('/@/components/framework/boolean-select/index.vue')),
'category-tree': defineAsyncComponent(() => import('/@/components/business/category-tree-select/index.vue')),
'enum-select': defineAsyncComponent(() => import('/src/components/framework/smart-enum-select/index.vue')),
'dict-select': defineAsyncComponent(() => import('/src/components/support/dict-select/index.vue')),
'employee-select': defineAsyncComponent(() => import('/src/components/system/employee-select/index.vue')),
'enterprise-select': defineAsyncComponent(() => import('/src/components/business/oa/enterprise-select/index.vue')),
'boolean-select': defineAsyncComponent(() => import('/src/components/framework/boolean-select/index.vue')),
'category-tree': defineAsyncComponent(() => import('/src/components/business/category-tree-select/index.vue')),
};
const componentsKey = Object.keys(components);

View File

@@ -61,16 +61,25 @@
type: Number,
require: true,
},
//如果开启表格scroll需要传递 scroll标识,由于main.js中设置的全局默认的表格高度所以scroll默认值设置为true
scroll: {
type: Boolean,
default: true,
},
});
const emit = defineEmits(['update:modelValue']);
// 原始表格列数据复制一份最原始的columns集合以供后续各个地方使用
let originalColumn = reactive(_.cloneDeep(props.modelValue));
// 存储最新的列数据
let newColumn = reactive(_.cloneDeep(props.modelValue));
// 用于监听表格拖拽后新的列数据
watch(
() => props.modelValue,
(value) => {
originalColumn = value;
newColumn = value;
},
{
deep: true,
@@ -170,13 +179,19 @@
const smartTableColumnModal = ref();
function showModal() {
smartTableColumnModal.value.show(originalColumn, props.tableId);
smartTableColumnModal.value.show(newColumn, props.tableId,props.scroll);
}
// 将弹窗修改的列数据,赋值给原表格 列数组
function updateColumn(changeColumnArray) {
let obj={}
// 如果为空数组代表恢复默认,使用原始表格数据
//合并列
let obj = mergeColumn(_.cloneDeep(originalColumn), changeColumnArray);
if(_.isEmpty(changeColumnArray)){
obj = mergeColumn(_.cloneDeep(originalColumn), changeColumnArray);
}else{
obj = mergeColumn(_.cloneDeep(newColumn), changeColumnArray);
}
const newColumns = obj.newColumns;
emit(
'update:modelValue',
@@ -190,6 +205,7 @@
(e) => {
if (e) {
originalColumn = _.cloneDeep(props.modelValue);
newColumn = _.cloneDeep(props.modelValue);
buildUserTableColumns();
}
},

View File

@@ -93,9 +93,11 @@
// ---------------- 显示 / 隐藏 --------------------
let tableId = null;
const visible = ref(false);
const scroll = ref(true);
//显示
function show(columns, showTableId) {
function show(columns, showTableId,scrollFlag) {
tableId = showTableId;
scroll.value = scrollFlag;
visible.value = true;
getUserTableColumns(tableId, _.cloneDeep(columns));
}
@@ -181,7 +183,12 @@
if (newIndex === oldIndex) {
return;
}
moveTableData(oldIndex, newIndex);
// 如果表格开启scroll会多一个虚拟列所以要减1
if(scroll.value){
moveTableData(oldIndex-1, newIndex-1);
}else{
moveTableData(oldIndex, newIndex);
}
},
});
}