完成环境变量

main
expressgy 3 months ago
parent 22f298529a
commit d8783898f4
  1. 13
      src/components/AntDesignVue/CustomAntDesignVue/TableColumChoose/index.vue
  2. 14
      src/components/AntDesignVue/index.js
  3. 3
      src/components/Custom/Framework/Pacman/index.vue
  4. 3
      src/components/Custom/index.js
  5. 11
      src/main.js
  6. 17
      src/utils/logger.js
  7. 5
      src/views/Auth/Dict/DictForm.vue
  8. 5
      src/views/Auth/Dict/DictTree.vue
  9. 2
      src/views/Auth/Dict/index.vue
  10. 107
      src/views/Auth/Env/DataModal.js
  11. 19
      src/views/Auth/Env/EnvForm.vue
  12. 76
      src/views/Auth/Env/EnvPage.vue
  13. 77
      src/views/Auth/Env/EnvTable.vue
  14. 34
      src/views/Auth/Env/EnvTree.vue

@ -13,8 +13,7 @@ const props = defineProps({
const status = ref(false); const status = ref(false);
const checkedKeys = ref(props.columnList.filter((item) => item.status === true).map((item) => item.key)); const checkedKeys = ref(props.columnList.filter((item) => item.status === true).map((item) => item.key));
const handleClose = () => { const handleClose = () => {};
};
watch(checkedKeys, (newVal) => { watch(checkedKeys, (newVal) => {
props.columnList.forEach((item) => { props.columnList.forEach((item) => {
if (checkedKeys.value.includes(item.key)) { if (checkedKeys.value.includes(item.key)) {
@ -24,18 +23,28 @@ watch(checkedKeys, (newVal) => {
} }
}); });
}); });
// !
const onDrop = (info) => { const onDrop = (info) => {
const before = info.dragNode.pos.split('-').slice(-1)[0]; const before = info.dragNode.pos.split('-').slice(-1)[0];
const after = info.node.pos.split('-').slice(-1)[0]; const after = info.node.pos.split('-').slice(-1)[0];
const target = props.columnList.splice(before, 1)[0]; const target = props.columnList.splice(before, 1)[0];
props.columnList.splice(after, 0, target); props.columnList.splice(after, 0, target);
}; };
// !
function chooseAll() {
checkedKeys.value = props.columnList.map((item) => {
item.status = true;
return item.key;
});
}
</script> </script>
<template> <template>
<div> <div>
<AButton shape="circle" :icon="h(BgColorsOutlined)" @click="status = true" /> <AButton shape="circle" :icon="h(BgColorsOutlined)" @click="status = true" />
<a-drawer v-model:open="status" title="表格列选择" placement="right" :fieldNames="{ title: 'name' }" @close="handleClose"> <a-drawer v-model:open="status" title="表格列选择" placement="right" :fieldNames="{ title: 'name' }" @close="handleClose">
<AButton @click="chooseAll">全选</AButton>
<ADivider />
<a-tree class="draggable-tree" draggable block-node checkable v-model:checkedKeys="checkedKeys" :tree-data="props.columnList" @drop="onDrop" /> <a-tree class="draggable-tree" draggable block-node checkable v-model:checkedKeys="checkedKeys" :tree-data="props.columnList" @drop="onDrop" />
<!-- @dragenter="onDragEnter"--> <!-- @dragenter="onDragEnter"-->
</a-drawer> </a-drawer>

@ -28,7 +28,18 @@ import {
Input, Input,
Radio, Radio,
RadioGroup, RadioGroup,
InputNumber, Affix, Anchor, AnchorLink, Tree, InputSearch, Tooltip, Drawer, Checkbox, CheckboxGroup, Popconfirm, InputNumber,
Affix,
Anchor,
AnchorLink,
Tree,
InputSearch,
Tooltip,
Drawer,
Checkbox,
CheckboxGroup,
Popconfirm,
Divider,
} from 'ant-design-vue'; } from 'ant-design-vue';
import 'ant-design-vue/dist/reset.css'; import 'ant-design-vue/dist/reset.css';
@ -73,6 +84,7 @@ export function setupCustomAntDesignVueComponents(app) {
Checkbox, // ! 多选 Checkbox, // ! 多选
CheckboxGroup, CheckboxGroup,
Popconfirm, // ! 气泡确认框 Popconfirm, // ! 气泡确认框
Divider, // ! 分割线
]; ];
for (let component of componentList) { for (let component of componentList) {
app.component(component.name, component); app.component(component.name, component);

@ -1,5 +1,6 @@
<script setup name="Pacman"> <script setup name="PacmanLoading">
defineOptions({ name: 'PacmanLoading' });
defineProps(['loading']); defineProps(['loading']);
</script> </script>

@ -13,6 +13,7 @@
import ModalTemplate from '@/components/Custom/Framework/ModalTemplate/index.vue'; import ModalTemplate from '@/components/Custom/Framework/ModalTemplate/index.vue';
import WorkContainer from '@/components/Custom/Framework/WorkContainer/index.vue'; import WorkContainer from '@/components/Custom/Framework/WorkContainer/index.vue';
import Pacman from '@CustomComponents/Framework/Pacman/index.vue';
// 自定义组件挂载到APP // 自定义组件挂载到APP
export function setupCustomComponents(app){ export function setupCustomComponents(app){
@ -20,4 +21,6 @@ export function setupCustomComponents(app){
app.component('ModalTemplate', ModalTemplate); app.component('ModalTemplate', ModalTemplate);
// ! 框架结构 // ! 框架结构
app.component('WorkContainer', WorkContainer); app.component('WorkContainer', WorkContainer);
// ! 框架结构
app.component('PacmanLoading', Pacman);
} }

@ -1,7 +1,14 @@
// ! 日志记录 // ! 日志记录
import Pino from 'pino'; import Pino from 'pino';
window.pino = new Pino({ window.pino = Pino({
level: 'trace' level: 'trace',
customLevels: {
deb: 20,
},
browser: {
asObject: true,
serialize: true
},
}); });
import './assets/main.css'; import './assets/main.css';
import { createApp } from 'vue'; import { createApp } from 'vue';

@ -0,0 +1,17 @@
// | ------------------------------------------------------------
// | @版本: version 0.1
// | @创建人: 【Nie-x7129】
// | @E-mail: x71291@outlook.com
// | @所在项目: hoto-auth-vue3
// | @文件描述: logger.js -
// | @创建时间: 2024-07-10 18:08
// | @更新时间: 2024-07-10 18:08
// | @修改记录:
// | -*-*-*- (时间--修改人--修改说明) -*-*-*-
// | =
// | ------------------------------------------------------------
export class initLogger{
constructor() {
}
}

@ -90,8 +90,9 @@ const handleAck = () => {
if (Array.isArray(value.pid) && value.pid.length > 0) { if (Array.isArray(value.pid) && value.pid.length > 0) {
data.pid = value.pid.slice(-1)[0]; data.pid = value.pid.slice(-1)[0];
} }
props.data.handleAck(data); props.data.handleAck(data).then(() => {
clearInput(); clearInput();
}).catch(e => e);
}) })
.catch((err) => { .catch((err) => {
formRef.value.scrollToField(err.errorFields[0]?.name); formRef.value.scrollToField(err.errorFields[0]?.name);

@ -1,4 +1,7 @@
<script setup> <script setup name="DictTree">
defineOptions({
name: 'DictTree',
});
import { useBaseDataStore } from '@/stores/baseData.js'; import { useBaseDataStore } from '@/stores/baseData.js';
import { onMounted, reactive } from 'vue'; import { onMounted, reactive } from 'vue';
import { IconPool } from '@/components/AntDesignVue/Icon/index.js'; import { IconPool } from '@/components/AntDesignVue/Icon/index.js';

@ -111,6 +111,7 @@ async function handleUpdate(data) {
formData.isUpdate = true; formData.isUpdate = true;
formData.dictId = data.dictId; formData.dictId = data.dictId;
formData.formData.pid = data.pid; formData.formData.pid = data.pid;
formData.handleAck = handleUpdateAck;
formData.formData.dictKey = data.dictKey; formData.formData.dictKey = data.dictKey;
formData.formData.dictDesc = data.dictDesc; formData.formData.dictDesc = data.dictDesc;
formData.formData.dictName = data.dictName; formData.formData.dictName = data.dictName;
@ -119,7 +120,6 @@ async function handleUpdate(data) {
formData.formData.serviceKey = data.serviceKey; formData.formData.serviceKey = data.serviceKey;
formData.formData.root = data.root; formData.formData.root = data.root;
formData.formData.orderNum = data.orderNum; formData.formData.orderNum = data.orderNum;
formData.handleAck = handleUpdateAck;
} }
// ! // !
async function handleUpdateAck(data) { async function handleUpdateAck(data) {

@ -12,6 +12,9 @@
// | ------------------------------------------------------------ // | ------------------------------------------------------------
// Env表单数据 // Env表单数据
import { IconPool } from '@/components/AntDesignVue/Icon/index.js';
import { h } from 'vue';
export class EnvFormType { export class EnvFormType {
constructor() { constructor() {
return new Object({ return new Object({
@ -19,9 +22,9 @@ export class EnvFormType {
envName: '', envName: '',
envKey: '', envKey: '',
envVal: '', envVal: '',
valIsDict: false, valIsDict: 0,
envDesc: '', envDesc: '',
root: false, root: 0,
orderNum: 0, orderNum: 0,
serviceKey: undefined, serviceKey: undefined,
}); });
@ -40,7 +43,7 @@ export class EnvSearchType {
root: undefined, root: undefined,
serviceKey: undefined, serviceKey: undefined,
status: undefined, status: undefined,
hierarchy: undefined, hierarchy: [],
}); });
} }
} }
@ -64,5 +67,101 @@ export class EnvFormRulesType {
// Env表格列数据 // Env表格列数据
export class EnvTableColumnType { export class EnvTableColumnType {
constructor() {} constructor() {
return new Object({
index: {
title: '序号',
key: 'index',
width: 70, // 你可以根据需要设置列宽
customRender: ({ text, record, index, column }) => `${index + 1}`, // 使用索引 + 1 来显示序号
},
envKey: {
title: '变量标识',
dataIndex: 'envKey',
key: 'envKey',
},
envName: {
title: '变量名称',
dataIndex: 'envName',
key: 'envName',
resizable: true,
width: 200,
},
envVal: {
title: '变量值',
dataIndex: 'envVal',
key: 'envVal',
customRender: ({ text, record, index, column }) => (record.valIsDict == 1 ? record.envDictName : text),
},
valIsDict: {
title: '字典',
dataIndex: 'valIsDict',
key: 'valIsDict',
customRender: ({ text, record, index, column }) => (text == '1' ? '是' : '否'),
width: '45px',
},
root: {
title: 'Root',
dataIndex: 'root',
key: 'root',
customRender: ({ text, record, index, column }) => (text == '1' ? '是' : '否'),
width: '50px',
},
serviceKey: {
title: '所属服务',
dataIndex: 'serviceKey',
key: 'serviceKey',
},
haveChildren: {
title: '子项',
dataIndex: 'haveChildren',
key: 'haveChildren',
width: '50px',
},
createtime: {
title: '创建时间',
dataIndex: 'createtime',
key: 'createtime',
width: '140px',
sorter: true,
},
createName: {
title: '创建人',
dataIndex: 'createName',
key: 'createName',
},
updatetime: {
title: '更新时间',
dataIndex: 'updatetime',
key: 'updatetime',
maxWidth: '140px',
minWidth: '140px',
},
updateName: {
title: '更新人',
dataIndex: 'updateName',
key: 'updateName',
},
action: {
title: '操作',
dataIndex: 'action',
key: 'action',
width: 100,
align: 'center',
},
});
}
}
// Env可选表格列
export class EnvTableColumnChooseType {
constructor() {
const excludeColumn = ['updateName', 'updatetime', 'createName'];
const tableColumn = new EnvTableColumnType();
return Object.keys(tableColumn).map((i) => ({
title: tableColumn[i].title,
key: tableColumn[i].key,
status: excludeColumn.includes(i) ? false : true,
}));
}
} }

@ -44,12 +44,12 @@ const handleAck = () => {
if (Array.isArray(value.envVal) && value.envVal.length > 0) { if (Array.isArray(value.envVal) && value.envVal.length > 0) {
data.envVal = value.envVal.slice(-1)[0]; data.envVal = value.envVal.slice(-1)[0];
} }
props.data.handleAck(data); props.data.handleAck(data).then(() => {
clearInput(); clearInput();
}).catch(e => e);
}) })
.catch((err) => { .catch((err) => {
console.log(err); formRef.value.scrollToField(err?.errorFields[0]?.name);
formRef.value.scrollToField(err.errorFields[0]?.name);
}); });
}; };
// ! // !
@ -86,6 +86,7 @@ watch(props.data.formData, (newVal, oldVal) => {
}); });
onMounted(() => { onMounted(() => {
window.pino.info('@3 EnvForm Mounted!');
// ! Env // ! Env
if (baseDataStore.state.envList.length == 0) { if (baseDataStore.state.envList.length == 0) {
baseDataStore.getEnvList(); baseDataStore.getEnvList();
@ -139,10 +140,10 @@ onMounted(() => {
<AInput style="width: 100%" v-model:value="props.data.formData.envName" placeholder="请输入变量名称" :maxlength="32" showCount /> <AInput style="width: 100%" v-model:value="props.data.formData.envName" placeholder="请输入变量名称" :maxlength="32" showCount />
</AFormItem> </AFormItem>
<AFormItem label="数据来源于变量" name="root"> <AFormItem label="数据来源于变量" name="valIsDict">
<ARadioGroup v-model:value="props.data.formData.valIsDict" name="radioGroup"> <ARadioGroup v-model:value="props.data.formData.valIsDict" name="radioGroup">
<ARadio :value="true"></ARadio> <ARadio :value="1"></ARadio>
<ARadio :value="false"></ARadio> <ARadio :value="0"></ARadio>
</ARadioGroup> </ARadioGroup>
</AFormItem> </AFormItem>
@ -169,8 +170,8 @@ onMounted(() => {
<AFormItem label="原始数据Root" name="root"> <AFormItem label="原始数据Root" name="root">
<ARadioGroup v-model:value="props.data.formData.root" name="radioGroup"> <ARadioGroup v-model:value="props.data.formData.root" name="radioGroup">
<ARadio :value="true"></ARadio> <ARadio :value="1"></ARadio>
<ARadio :value="false"></ARadio> <ARadio :value="0"></ARadio>
</ARadioGroup> </ARadioGroup>
</AFormItem> </AFormItem>

@ -1,10 +1,13 @@
<script setup name="EnvPage"> <script setup name="EnvPage">
import { onMounted, reactive, watch } from 'vue'; import { onMounted, reactive, watch } from 'vue';
import { EnvFormType, EnvSearchType } from './DataModal.js'; import { EnvFormType, EnvSearchType, EnvTableColumnChooseType } from './DataModal.js';
import EnvForm from './EnvForm.vue'; import EnvForm from './EnvForm.vue';
import { CoreDict, CoreEnv } from '@/api/index.js'; import EnvTable from './EnvTable.vue';
import EnvTree from './EnvTree.vue';
import { CoreEnv } from '@/api/index.js';
import { useMessage } from 'naive-ui'; import { useMessage } from 'naive-ui';
import { useBaseDataStore } from '@/stores/baseData.js'; import { useBaseDataStore } from '@/stores/baseData.js';
import DictTable from '@/views/Auth/Dict/DictTable.vue';
const baseDataStore = useBaseDataStore(); const baseDataStore = useBaseDataStore();
const Message = useMessage(); const Message = useMessage();
defineOptions({ defineOptions({
@ -12,7 +15,18 @@ defineOptions({
}); });
onMounted(() => { onMounted(() => {
window.pino.info('EnvPage Mounted!'); window.pino.info('@1 EnvPage Mounted!');
window.pino.deb('debug@1 EnvPage Mounted!');
window.pino.error('error@1 EnvPage Mounted!');
window.pino.fatal('fatal@1 EnvPage Mounted!');
window.pino.info('info@1 EnvPage Mounted!');
window.pino.warn('warn@1 EnvPage Mounted!');
window.pino.trace('trace@1 EnvPage Mounted!');
console.log(window.pino);
getPage();
if(baseDataStore.state.serviceList.length == 0){
baseDataStore.getServiceList();
}
}); });
// //
@ -45,7 +59,7 @@ const tableData = reactive({
handleRemoveAck, handleRemoveAck,
handleUpdate, handleUpdate,
}, },
tableColumnList: [], columnList: new EnvTableColumnChooseType(),
}); });
// @1 // @1
async function handleCreateAck(data) { async function handleCreateAck(data) {
@ -67,9 +81,24 @@ async function handleRemoveAck(data) {
baseDataStore.getEnvList(); baseDataStore.getEnvList();
} }
// @3 todo // @3 todo
async function handleUpdate(data) {} async function handleUpdate(data) {
formData.modelName = '更新变量';
formData.status = true;
formData.isUpdate = true;
formData.envId = data.envId;
formData.handleAck = handleUpdateAck;
Object.keys(formData.formData).forEach(key => {
formData.formData[key] = data[key];
});
}
// @4 todo // @4 todo
async function handleUpdateAck(data) {} async function handleUpdateAck(data) {
await CoreEnv.updateEnv(formData.envId, data);
Message.success('更新变量成功!');
clearFormData();
getPage();
baseDataStore.getEnvList();
}
// @5 todo // @5 todo
watch(tableData.pageInfo, () => { watch(tableData.pageInfo, () => {
if (searchCount === 0) { if (searchCount === 0) {
@ -84,7 +113,9 @@ watch(tableData.pageInfo, () => {
}); });
// @6 // @6
async function getPage() { async function getPage() {
const resd = await CoreEnv.getEnv(tableData.pageInfo); const pageInfo = {...tableData.pageInfo};
pageInfo.hierarchy = pageInfo.hierarchy.length > 0 ? pageInfo.hierarchy[0] : undefined
const resd = await CoreEnv.getEnv(pageInfo);
tableData.dataSource = resd.rowData; tableData.dataSource = resd.rowData;
tableData.total = Number(resd.total); tableData.total = Number(resd.total);
} }
@ -130,9 +161,38 @@ function clearFormData() {
<template #header> <template #header>
<ASpace> <ASpace>
<CreateAntdButton name="变量" @click="formData.status = true" /> <CreateAntdButton name="变量" @click="formData.status = true" />
<TableColumChoose v-model:columnList="tableData.columnList" />
<AInputSearch v-model:value="tableData.pageInfo.envInfo" placeholder="变量名称/标识/描述/值" style="width: 200px" @search="getPage" />
<ASelect
style="width: 150px"
placeholder="请选择所属服务"
allowClear
v-model:value="tableData.pageInfo.serviceKey"
:options="baseDataStore.state.serviceList"
:field-names="{ label: 'serviceName', value: 'serviceKey', options: 'children' }"
/>
<ASelect
placeholder="是否为原始数据"
style="width: 150px"
allowClear
v-model:value="tableData.pageInfo.root"
:options="[
{ label: '是', value: 1 },
{ label: '否', value: 0 },
]"
/>
</ASpace> </ASpace>
</template> </template>
<template #main></template> <template #main>
<div class="envBody">
<div class="tree">
<EnvTree v-model:selectedKeys="tableData.pageInfo.hierarchy"/>
</div>
<div class="table">
<EnvTable :tableData="tableData"/>
</div>
</div>
</template>
<template #footer> <template #footer>
<APagination <APagination
v-model:current="tableData.pageInfo.pageNumber" v-model:current="tableData.pageInfo.pageNumber"

@ -0,0 +1,77 @@
<script setup name="EnvTable">
import { computed, onMounted, ref } from 'vue';
import { EnvTableColumnType } from '@/views/Auth/Env/DataModal.js';
import PacmanLoading from '@/components/Custom/Framework/Pacman/index.vue';
defineOptions({
name: 'EnvTable',
});
onMounted(() => {
window.pino.info('@2 EnvTable Mounted!');
});
const props = defineProps({
tableData: {
type: Object,
required: true,
},
});
const isLoading = ref(true);
// !
const tableColumnObject = new EnvTableColumnType();
const tableColumns = computed(() => {
// !
setTableAuto();
if (props.tableData.columnList && props.tableData.columnList.length > 0) {
// !
const existColumn = props.tableData.columnList.filter((i) => i.status === true);
if (existColumn.length == 0) {
// !
return Object.keys(tableColumnObject).map((column) => tableColumnObject[column]);
} else {
// !
return existColumn.map((column) => tableColumnObject[column.key]);
}
} else {
//
return Object.keys(tableColumnObject).map((column) => tableColumnObject[column]);
}
});
function setTableAuto(){
isLoading.value = false;
setTimeout(() => {
isLoading.value = true;
}, 100);
}
function handleResizeColumn(w, col) {
col.width = w;
}
</script>
<template>
<PacmanLoading v-if="!isLoading" loading="1"/>
<ATable
v-if="isLoading"
style="height: 100%"
:dataSource="props.tableData.dataSource"
:columns="tableColumns"
@change="props.tableData.methods.handleTableChange"
:pagination="false"
sticky
tableLayout="auto"
@resizeColumn="handleResizeColumn"
:row-class-name="(_record, index) => (index % 2 === 1 ? 'table-striped' : null)"
:scroll="{ scrollToFirstRowOnChange: true }"
>
<template #bodyCell="{ column, record }">
<template v-if="column?.key === 'action'">
<ASpace>
<TableRemoveButton :ackDelete="() => props.tableData.methods.handleRemoveAck(record)" />
<TableUpdateButton @click="props.tableData.methods.handleUpdate(record)" />
</ASpace>
</template>
</template>
</ATable>
</template>
<style scoped></style>

@ -0,0 +1,34 @@
<script setup name="EnvTree">
defineOptions({
name: 'EnvTree',
});
import { useBaseDataStore } from '@/stores/baseData.js';
import { onMounted, reactive } from 'vue';
const baseDataStore = useBaseDataStore();
// !
const fieldNames = reactive({
children:'children', title:'label', key:'id'
});
//
onMounted(() => {
window.pino.info('@4 EnvTree Mounted');
// !
if (baseDataStore.state.envList?.length == 0) {
baseDataStore.getEnvList();
}
});
</script>
<template>
<ATree
:treeData="baseDataStore.state.envTree"
:show-line="true"
show-icon
:fieldNames="fieldNames"
/>
</template>
<style scoped></style>
Loading…
Cancel
Save