Files
mayfly-go/frontend/src/views/system/config/ConfigList.vue
meilin.huang 99a746085b feat: i18n
2024-11-20 22:43:53 +08:00

217 lines
7.1 KiB
Vue
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<div>
<page-table
ref="pageTableRef"
:search-items="searchItems"
:page-api="configApi.list"
:columns="columns"
v-model:query-form="query"
:data-handler-fn="handleData"
>
<template #tableHeader>
<el-button v-auth="perms.saveConfig" type="primary" icon="plus" @click="editConfig(false)">{{ $t('common.create') }}</el-button>
</template>
<template #status="{ data }">
<el-tag v-if="data.status == 1" type="success">{{ $t('common.enable') }}</el-tag>
<el-tag v-if="data.status == -1" type="danger">{{ $t('common.disable') }}</el-tag>
</template>
<template #action="{ data }">
<el-button :disabled="data.status == -1" type="warning" @click="showSetConfigDialog(data)" link>{{ $t('system.sysconf.conf') }}</el-button>
<el-button v-if="actionBtns[perms.saveConfig]" @click="editConfig(data)" type="primary" link>{{ $t('common.edit') }}</el-button>
</template>
</page-table>
<el-dialog @close="closeSetConfigDialog" :title="$t('system.sysconf.confItemSetting')" v-model="paramsDialog.visible" width="700px">
<dynamic-form
ref="paramsFormRef"
v-if="paramsDialog.paramsFormItem.length > 0"
:form-items="paramsDialog.paramsFormItem"
v-model="paramsDialog.params"
/>
<el-form v-else ref="paramsFormRef" label-width="auto">
<el-form-item :label="$t('system.sysconf.confValue')" required>
<el-input v-model="paramsDialog.params" :placeholder="paramsDialog.config.remark" autocomplete="off" clearable></el-input>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="closeSetConfigDialog()">{{ $t('common.cancel') }}</el-button>
<el-button v-auth="'config:save'" type="primary" @click="setConfig()">{{ $t('common.confirm') }}</el-button>
</span>
</template>
</el-dialog>
<config-edit :title="$t(configEdit.title)" v-model:visible="configEdit.visible" :data="configEdit.config" @val-change="configEditChange" />
</div>
</template>
<script lang="ts" setup>
import { ref, toRefs, reactive, onMounted, Ref } from 'vue';
import ConfigEdit from './ConfigEdit.vue';
import { configApi } from '../api';
import { ElMessage } from 'element-plus';
import PageTable from '@/components/pagetable/PageTable.vue';
import { TableColumn } from '@/components/pagetable';
import { hasPerms } from '@/components/auth/auth';
import { DynamicForm } from '@/components/dynamic-form';
import { SearchItem } from '@/components/SearchForm';
import { useI18n } from 'vue-i18n';
import { useI18nSaveSuccessMsg } from '@/hooks/useI18n';
const { t } = useI18n();
const perms = {
saveConfig: 'config:save',
};
const searchItems = [SearchItem.input('key', 'system.sysconf.confKey')];
const columns = ref([
TableColumn.new('i18nName', 'system.sysconf.confItem'),
TableColumn.new('key', 'system.sysconf.confKey'),
TableColumn.new('value', 'system.sysconf.confValue').canBeautify(),
TableColumn.new('i18nRemark', 'common.remark'),
TableColumn.new('modifier', 'common.modifier'),
TableColumn.new('updateTime', 'common.updateTime').isTime(),
]);
const actionColumn = TableColumn.new('action', 'common.operation').isSlot().fixedRight().setMinWidth(130).noShowOverflowTooltip().alignCenter();
const actionBtns = hasPerms([perms.saveConfig]);
const pageTableRef: Ref<any> = ref(null);
const paramsFormRef: any = ref(null);
const state = reactive({
query: {
pageNum: 1,
pageSize: 0,
name: null,
},
selectionData: [],
paramsDialog: {
visible: false,
config: null as any,
params: {},
paramsFormItem: [] as any,
},
configEdit: {
title: 'common.edit',
visible: false,
config: {},
},
});
const { query, paramsDialog, configEdit } = toRefs(state);
onMounted(() => {
if (Object.keys(actionBtns).length > 0) {
columns.value.push(actionColumn);
}
});
const search = async () => {
pageTableRef.value.search();
};
const handleData = (res: any) => {
const dataList = res.list;
// 内容国际化
for (let x of dataList) {
x.i18nName = t(x.name);
x.i18nRemark = t(x.remark);
}
return res;
};
const showSetConfigDialog = (row: any) => {
state.paramsDialog.config = row;
// 存在配置项则弹窗提示输入对应的配置项
if (row.params) {
state.paramsDialog.paramsFormItem = JSON.parse(row.params);
if (state.paramsDialog.paramsFormItem && state.paramsDialog.paramsFormItem.length > 0) {
if (row.value) {
state.paramsDialog.params = JSON.parse(row.value);
}
} else {
state.paramsDialog.params = row.value;
}
} else {
state.paramsDialog.params = row.value;
}
state.paramsDialog.visible = true;
};
const closeSetConfigDialog = () => {
state.paramsDialog.visible = false;
setTimeout(() => {
state.paramsDialog.config = {};
state.paramsDialog.params = {};
state.paramsDialog.paramsFormItem = [];
}, 300);
};
const setConfig = async () => {
let paramsValue: any = state.paramsDialog.params;
if (state.paramsDialog.paramsFormItem.length > 0) {
await paramsFormRef.value.validate((valid: boolean) => {
if (!valid) {
paramsValue = null as any;
return false;
}
if (state.paramsDialog.paramsFormItem.length > 0) {
// 如果配置项删除则需要将value中对应的字段移除
for (let paramKey in paramsValue) {
if (!hasParam(paramKey, state.paramsDialog.paramsFormItem)) {
delete paramsValue[paramKey];
}
}
paramsValue = JSON.stringify(paramsValue);
}
});
}
// 说明校验失败
if (paramsValue == null) {
return;
}
await configApi.save.request({
id: state.paramsDialog.config.id,
key: state.paramsDialog.config.key,
name: state.paramsDialog.config.name,
value: paramsValue,
});
useI18nSaveSuccessMsg();
closeSetConfigDialog();
search();
};
const hasParam = (paramKey: string, paramItems: any) => {
for (let paramItem of paramItems) {
if (paramItem.model == paramKey) {
return true;
}
}
return false;
};
const configEditChange = () => {
useI18nSaveSuccessMsg();
search();
};
const editConfig = (data: any) => {
if (data) {
state.configEdit.title = 'common.edit';
state.configEdit.config = data;
} else {
state.configEdit.title = 'common.create';
state.configEdit.config = false;
}
state.configEdit.visible = true;
};
</script>
<style lang="scss"></style>