Browse Source

用户管理

CzRger 11 months ago
parent
commit
762b2a51f4

+ 8 - 0
src/router/modules/manage.ts

@@ -76,6 +76,14 @@ export default {
             title: '日志管理',
           }
         },
+        {
+          path: 'dict',
+          name: '0fb9a792-68ec-48d0-8ede-d9d3fc2ecbc0',
+          component: () => import('@/views/manage/system/dict/index.vue'),
+          meta: {
+            title: '字典管理',
+          }
+        },
       ]
     }
   ]

+ 2 - 2
src/views/manage/index/index.vue

@@ -78,8 +78,8 @@ const state: any = reactive({
       {value: "columnModelNum", label: "列模式列数", width: 180},
       {value: "num", label: "数据量", width: 180},
       {value: "linkTypeNum", label: "关联分类数量", width: 180},
-      {value: "createTime", label: "创建时间", width: 180},
-      {value: "updateTime", label: "最后修改时间", width: 180},
+      {value: "createTime", label: "创建时间", width: 200},
+      {value: "updateTime", label: "最后修改时间", width: 200},
       {value: "remark", label: "备注", width: 200},
       {value: "do", label: "操作", width: 320, fixed: 'right'},
     ],

+ 165 - 0
src/views/manage/system/dict/detail.vue

@@ -0,0 +1,165 @@
+<template>
+  <CusDialog
+    :show="show"
+    :title="titleCpt"
+    @onClose="$emit('update:show', false)"
+    width="1000px"
+    height="auto"
+    @onSubmit="onSubmit"
+    :loading="state.loading"
+  >
+    <div class="__cus-dialog-form">
+      <CusForm ref="ref_form">
+        <CusFormColumn
+          :span="24"
+          required
+          label="类型"
+          v-model:param="state.form.labelType"
+          link="radio"
+          :options="DictionaryStore.labelTypeList"
+          :disabled="true"
+        />
+        <CusFormColumn
+          :span="24"
+          required
+          label="名称"
+          v-model:param="state.form.labelName"
+        />
+        <CusFormColumn
+          :span="24"
+          required
+          label="层级"
+          v-model:param="state.form.labelLevel"
+          link="radio"
+          :options="DictionaryStore.typeLevelList"
+          :disabled="true"
+        />
+        <CusFormColumn
+          :span="8"
+          required
+          label="排序"
+          v-model:param="state.form.labelOrder"
+          link="input-number"
+          :min="0"
+          :max="999"
+        />
+        <CusFormColumn
+          :span="24"
+          label="备注"
+          v-model:param="state.form.remark"
+          type="textarea"
+          :rows="5"
+        />
+      </CusForm>
+    </div>
+  </CusDialog>
+</template>
+
+<script setup lang="ts">
+import {computed, getCurrentInstance, nextTick, reactive, ref, watch} from "vue";
+import {useDictionaryStore} from "@/stores";
+import {ElMessage, ElMessageBox} from "element-plus";
+import {sysLabelDetail, sysLabelSave, sysLabelUpdate} from "@/api/modules/manage/type";
+
+const emit = defineEmits(['update:show', 'refresh'])
+const {proxy} = getCurrentInstance()
+const DictionaryStore = useDictionaryStore()
+const props = defineProps({
+  show: {default: false},
+  transfer: {}
+ })
+const state: any = reactive({
+  form: {},
+  loading: false
+})
+const ref_form = ref()
+const titleCpt = computed(() => {
+  let t = ''
+  switch (props.transfer.mode) {
+    case 'add': t = '新增分类'
+      break
+    case 'edit': t = '编辑分类'
+      break
+  }
+  return t
+})
+const onSubmit = () => {
+  ref_form.value.submit().then(() => {
+    ElMessageBox.confirm("是否提交?", "提示", {
+      confirmButtonText: "确定",
+      cancelButtonText: "取消",
+      type: "warning",
+    } as any).then(() => {
+      state.loading = true
+      switch (props.transfer.mode) {
+        case 'add': {
+          sysLabelSave(state.form).then(res => {
+            if (res.code === 200) {
+              ElMessage.success('新增成功!')
+              emit('update:show', false)
+              emit('refresh')
+            } else {
+              ElMessage.error(res.msg)
+            }
+            state.loading = false
+          })
+        } break
+        case 'edit': {
+          sysLabelUpdate(state.form).then(res => {
+            if (res.code === 200) {
+              ElMessage.success('编辑成功!')
+              emit('update:show', false)
+              emit('refresh')
+            } else {
+              ElMessage.error(res.msg)
+            }
+            state.loading = false
+          })
+        } break
+      }
+    }).catch(() => {})
+  }).catch((e) => {
+    ElMessage({
+      message: e[0].message,
+      grouping: true,
+      type: 'warning',
+    })
+  })
+}
+const initDetail = () => {
+  state.loading = true
+  sysLabelDetail(props.transfer.id).then(res => {
+    if (res.code === 200) {
+      state.form = res.data
+      state.loading = false
+    } else {
+      ElMessage.error(res.msg)
+    }
+  })
+}
+watch(() => props.show, (n) => {
+  if (n) {
+    initDictionary()
+    if (props.transfer.mode === 'add') {
+      state.form = {
+        labelParentId: props.transfer.labelParentId,
+        labelType: props.transfer.labelType,
+        labelLevel: 3,
+        labelOrder: 999
+      }
+    } else {
+      initDetail()
+    }
+    nextTick(() => {
+      ref_form.value.reset()
+    })
+  }
+})
+const initDictionary = () => {
+  DictionaryStore.initDict('label_type')
+  DictionaryStore.initDict('label_level')
+}
+</script>
+
+<style lang="scss" scoped>
+</style>

+ 164 - 0
src/views/manage/system/dict/index.vue

@@ -0,0 +1,164 @@
+<template>
+  <div class="__cus-manage_content">
+    <div class="__cus-manage_content-title"><SvgIcon class="flag" name="flag_1" color="var(--cus-main-color)"/>{{$route.meta.title}}</div>
+    <div class="__cus-manage_content-main" v-loading="state.query.loading">
+      <div class="tree">
+        <div class="tree-filter">
+          <el-input v-model="state.tree.filter"/>
+        </div>
+        <div class="tree-main">
+          <el-tree
+            ref="ref_tree"
+            style="max-width: 600px"
+            class="filter-tree"
+            :data="state.tree.options"
+            :props="state.tree.defaultProps"
+            default-expand-all
+            :filter-node-method="filterNode"
+          />
+        </div>
+      </div>
+      <div class="table">
+        <CusTable
+          :data="state.query.result.data"
+          :table-head="state.query.tableHead"
+          :no-page="true"
+          default-expand-all
+        >
+          <template #labelType-column-value="{scope}">
+            {{DictionaryStore.labelTypeMap.get(scope.row.labelType)}}
+          </template>
+          <template #do-column-value="{scope}">
+            <template v-if="scope.row.labelLevel == 2">
+              <CusButton type="table-add" title="新增下级" @click="onAdd(scope.row)"/>
+            </template>
+            <template v-else>
+              <CusButton type="table-edit" @click="onEdit(scope.row)"/>
+              <CusButton type="table-del" @click="onDel(scope.row)"/>
+            </template>
+          </template>
+        </CusTable>
+      </div>
+    </div>
+    <DetailCom v-model:show="state.detail.show" :transfer="state.detail.transfer" @refresh="initTree"/>
+  </div>
+</template>
+
+<script setup lang="ts">
+import {getCurrentInstance, onMounted, reactive, ref, watch} from "vue";
+import DetailCom from './detail.vue'
+import {useDictionaryStore} from "@/stores";
+import {ElMessage, ElMessageBox} from "element-plus";
+import {sysLabelDelete, sysLabelGetAllSysLabels} from "@/api/modules/manage/type";
+
+const {proxy} = getCurrentInstance()
+const DictionaryStore = useDictionaryStore()
+const state: any = reactive({
+  query: {
+    loading: false,
+    tableHead: [
+      {value: "labelName", label: "名称", align: 'left', headerAlign: 'left', minWidth: 400},
+      {value: "labelType", label: "类型", width: 120},
+      {value: "labelOrder", label: "排序", width: 120},
+      {value: "indexNum", label: "索引数量", width: 120},
+      {value: "createTime", label: "创建时间", width: 200},
+      {value: "updateTime", label: "最后修改时间", width: 200},
+      {value: "remark", label: "备注", width: 200},
+      {value: "do", label: "操作", width: 220, fixed: 'right'},
+    ],
+    result: {
+      data: []
+    }
+  },
+  detail: {
+    show: false,
+    transfer: {}
+  },
+  relation: {
+    show: false,
+    transfer: {}
+  },
+  tree: {
+    filter: '',
+    defaultProps: {
+      children: 'children',
+      label: 'label',
+    },
+    options: []
+  }
+})
+const ref_tree = ref()
+const initTree = () => {
+  state.query.loading = true
+  sysLabelGetAllSysLabels().then(res => {
+    if (res.code === 200) {
+      state.query.result.data = res.data.map(v => ({...v, children: v.sysLabels}))
+      state.query.loading = false
+    } else {
+      ElMessage.error(res.msg)
+    }
+  })
+}
+const onAdd = (row) => {
+  state.detail.transfer = {
+    mode: 'add',
+    labelParentId: row.id,
+    labelType: row.labelType
+  }
+  state.detail.show = true
+}
+const onEdit = (row) => {
+  state.detail.transfer = {
+    mode: 'edit',
+    id: row.id,
+  }
+  state.detail.show = true
+}
+const onDel = (row) => {
+  ElMessageBox.confirm(`请确认是否删除${row.labelName}?`, "提示", {
+    confirmButtonText: "确定",
+    cancelButtonText: "取消",
+    type: "warning",
+  } as any).then(() => {
+    state.loading = true
+    sysLabelDelete(row.id).then(res => {
+      if (res.code === 200) {
+        ElMessage.success('删除成功!')
+      } else {
+        ElMessage.error(res.msg)
+      }
+      initTree()
+    })
+  }).catch(() => {})
+}
+const filterNode = (value, data) => {
+  if (!value) return true
+  return data.label.includes(value)
+}
+watch(() => state.tree.filter, (n) => {
+  ref_tree.value?.filter(n)
+})
+const initDictionary = () => {
+  DictionaryStore.initDict('label_type')
+}
+onMounted(() => {
+  initDictionary()
+  initTree()
+})
+</script>
+
+<style lang="scss" scoped>
+.__cus-manage_content-main {
+  display: flex;
+  width: 100%;
+  height: 100%;
+  gap: 10px;
+  .tree {
+    width: 300px;
+  }
+  .table {
+    overflow: hidden;
+    flex: 1;
+  }
+}
+</style>

+ 122 - 0
src/views/manage/system/user/detail.vue

@@ -0,0 +1,122 @@
+<template>
+  <CusDialog
+    :show="show"
+    :title="titleCpt"
+    @onClose="$emit('update:show', false)"
+    width="400px"
+    height="auto"
+    @onSubmit="onSubmit"
+    :loading="state.loading"
+  >
+    <div class="__cus-dialog-form">
+      <CusForm ref="ref_form" label-width="80">
+        <CusFormColumn
+          :span="24"
+          required
+          label="账号"
+          v-model:param="state.form.indexName"
+        />
+        <CusFormColumn
+          :span="24"
+          required
+          label="用户名"
+          v-model:param="state.form.indexName"
+        />
+        <CusFormColumn
+          :span="24"
+          required
+          label="状态"
+          v-model:param="state.form.shareMethod"
+          link="select"
+          :options="DictionaryStore.gxMethodList"
+        />
+      </CusForm>
+    </div>
+  </CusDialog>
+</template>
+
+<script setup lang="ts">
+import {computed, getCurrentInstance, nextTick, reactive, ref, watch} from "vue";
+import {useDictionaryStore} from "@/stores";
+import {ElMessage, ElMessageBox} from "element-plus";
+
+const emit = defineEmits(['update:show', 'refresh'])
+const {proxy} = getCurrentInstance()
+const DictionaryStore = useDictionaryStore()
+const props = defineProps({
+  show: {default: false},
+  transfer: {}
+ })
+const state: any = reactive({
+  form: {},
+  loading: false
+})
+const ref_form = ref()
+const titleCpt = computed(() => {
+  let t = ''
+  switch (props.transfer.mode) {
+    case 'add': t = '新增用户'
+      break
+    case 'edit': t = '编辑用户'
+      break
+  }
+  return t
+})
+const onSubmit = () => {
+  ref_form.value.submit().then(() => {
+    ElMessageBox.confirm("是否提交?", "提示", {
+      confirmButtonText: "确定",
+      cancelButtonText: "取消",
+      type: "warning",
+    } as any).then(() => {
+      // state.loading = true
+      // sysIndexSaveOrUpdate(state.form).then(res => {
+      //   if (res.code === 200) {
+      //     ElMessage.success(props.transfer.mode === 'add' ? '新增成功!' : '编辑成功!')
+      //     emit('update:show', false)
+      //     emit('refresh')
+      //   } else {
+      //     ElMessage.error(res.msg)
+      //   }
+      //   state.loading = false
+      // })
+    }).catch(() => {})
+  }).catch((e) => {
+    ElMessage({
+      message: e[0].message,
+      grouping: true,
+      type: 'warning',
+    })
+  })
+}
+const initDetail = () => {
+  // state.loading = true
+  // sysIndexGetDetail(props.transfer.id).then(res => {
+  //   if (res.code === 200) {
+  //     state.form = res.data
+  //     state.loading = false
+  //   } else {
+  //     ElMessage.error(res.msg)
+  //   }
+  // })
+}
+watch(() => props.show, (n) => {
+  if (n) {
+    initDictionary()
+    if (props.transfer.mode === 'add') {
+      state.form = {}
+    } else {
+      initDetail()
+    }
+    nextTick(() => {
+      ref_form.value.reset()
+    })
+  }
+})
+const initDictionary = () => {
+  DictionaryStore.initDict('gx_method')
+}
+</script>
+
+<style lang="scss" scoped>
+</style>

+ 163 - 4
src/views/manage/system/user/index.vue

@@ -1,14 +1,173 @@
 <template>
-  <div>
-    <h1>这是后台-用户管理页面</h1>
+  <div class="__cus-manage_content">
+    <div class="__cus-manage_content-title"><SvgIcon class="flag" name="flag_1" color="var(--cus-main-color)"/>{{$route.meta.title}}</div>
+    <div class="__cus-manage_content-filters">
+      <CusForm labelWidth="50px" @handleEnter="onSearch">
+        <CusFormColumn
+          :span="4"
+          label="账号"
+          v-model:param="state.query.form.keyword"
+        />
+        <CusFormColumn
+          label-width="65px"
+          :span="4"
+          label="用户名"
+          v-model:param="state.query.form.keyword"
+        />
+        <CusFormColumn
+          :span="4"
+          label="状态"
+          v-model:param="state.query.form.keyword"
+          link="select"
+          :options="DictionaryStore.trueFalseList"
+        />
+        <CusButton type="main" title="搜索" @click="onSearch"/>
+        <CusButton type="main" title="重置" @click="onReset"/>
+        <CusButton type="main" title="新增" style="margin-left: auto" @click="onAdd"/>
+      </CusForm>
+    </div>
+    <div class="__cus-manage_content-main" v-loading="state.query.loading">
+      <CusTable
+        :page-num="state.query.page.pageNum"
+        :page-size="state.query.page.pageSize"
+        :total="state.query.result.total"
+        :data="state.query.result.data"
+        :table-head="state.query.tableHead"
+        @handlePage="onPage"
+      >
+        <template #shareMethod-column-value="{scope}">
+          {{DictionaryStore.gxMethodMap.get(scope.row.shareMethod)}}
+        </template>
+        <template #do-column-value="{scope}">
+          <CusButton type="table-edit" @click="onEdit(scope.row)"/>
+          <CusButton type="table-del" @click="onDel(scope.row)"/>
+          <CusButton type="table-edit" title="修改密码" @click="onPassword(scope.row)"/>
+          <CusButton type="table" icon="relation" title="授权"  @click="onRole(scope.row)"/>
+        </template>
+      </CusTable>
+    </div>
+    <DetailCom v-model:show="state.detail.show" :transfer="state.detail.transfer" @refresh="onSearch"/>
+    <PasswordCom v-model:show="state.password.show" :transfer="state.password.transfer"/>
+    <RoleCom v-model:show="state.role.show" :transfer="state.role.transfer"/>
   </div>
 </template>
 
 <script setup lang="ts">
-import {getCurrentInstance, reactive} from "vue";
+import {getCurrentInstance, onMounted, reactive} from "vue";
+import {ElMessage} from "element-plus";
+import DetailCom from "./detail.vue";
+import PasswordCom from "./password.vue";
+import RoleCom from "./role.vue";
+import {useDictionaryStore} from "@/stores";
 
 const {proxy} = getCurrentInstance()
-const state: any = reactive({})
+const DictionaryStore = useDictionaryStore()
+const state: any = reactive({
+  query: {
+    loading: false,
+    page: {
+      pageNum: 1,
+      pageSize: 10
+    },
+    tableHead: [
+      {value: "indexName", label: "账号", fixed: 'left'},
+      {value: "indexName", label: "用户名", fixed: 'left'},
+      {value: "dataSource", label: "状态"},
+      {value: "createTime", label: "创建时间", width: 200},
+      {value: "indexName", label: "创建人"},
+      {value: "updateTime", label: "最后修改时间", width: 200},
+      {value: "updateTime", label: "最后修改人"},
+      {value: "do", label: "操作", width: 320, fixed: 'right'},
+    ],
+    form: {},
+    formReal: {},
+    result: {
+      total: 0,
+      data: [{}]
+    }
+  },
+  detail: {
+    show: false,
+    transfer: {}
+  },
+  password: {
+    show: false,
+    transfer: {}
+  },
+  role: {
+    show: false,
+    transfer: {}
+  },
+})
+const onPage = (pageNum, pageSize) => {
+  state.query.page = {
+    pageNum: pageNum,
+    pageSize: pageSize
+  }
+  const params = {
+    page: state.query.page.pageNum,
+    size: state.query.page.pageSize,
+  }
+  if (proxy.$util.isValue(state.query.formReal.keyword)) {
+    params.keyword = state.query.formReal.keyword
+  }
+  // state.query.loading = true
+  // sysIndexFindIndexByPage(proxy.$util.formatGetParam(params)).then(res => {
+  //   if (res.code === 200) {
+  //     state.query.result.total = res.data.totalElements
+  //     state.query.result.data = res.data.content
+  //     state.query.loading = false
+  //   } else {
+  //     ElMessage.error(res.msg)
+  //   }
+  // })
+}
+const onSearch = () => {
+  state.query.formReal = JSON.parse(JSON.stringify(state.query.form))
+  onPage(1, state.query.page.pageSize)
+}
+const onReset = () => {
+  state.query.page = {
+    pageNum: 1,
+    pageSize: 10
+  }
+  state.query.form = {}
+  onSearch()
+}
+const onAdd = () => {
+  state.detail.transfer = {
+    mode: 'add'
+  }
+  state.detail.show = true
+}
+const onEdit = (row) => {
+  state.detail.transfer = {
+    mode: 'edit',
+    id: row.id,
+  }
+  state.detail.show = true
+}
+const onPassword = (row) => {
+  state.password.transfer = {
+    id: row.id,
+  }
+  state.password.show = true
+}
+const onRole = (row) => {
+  state.role.transfer = {
+    id: row.id,
+  }
+  state.role.show = true
+}
+const onDel = (row) => {
+}
+const initDictionary = () => {
+  DictionaryStore.initDict('true_false')
+}
+onMounted(() => {
+  initDictionary()
+  onReset()
+})
 </script>
 
 <style lang="scss" scoped>

+ 109 - 0
src/views/manage/system/user/password.vue

@@ -0,0 +1,109 @@
+<template>
+  <CusDialog
+    :show="show"
+    :title="titleCpt"
+    @onClose="$emit('update:show', false)"
+    width="400px"
+    height="auto"
+    @onSubmit="onSubmit"
+    :loading="state.loading"
+  >
+    <div class="__cus-dialog-form">
+      <CusForm ref="ref_form" label-width="100px">
+        <CusFormColumn
+          :span="24"
+          required
+          label="密码"
+          v-model:param="state.form.indexName"
+          type="password"
+          show-password
+        />
+        <CusFormColumn
+          :span="24"
+          required
+          label="确认密码"
+          v-model:param="state.form.indexName"
+          type="password"
+          show-password
+          :rules="[
+              {
+                handle: (val) => val == state.form.indexName,
+                message: '两次输入的密码不一致'
+              }
+          ]"
+        />
+      </CusForm>
+    </div>
+  </CusDialog>
+</template>
+
+<script setup lang="ts">
+import {computed, getCurrentInstance, nextTick, reactive, ref, watch} from "vue";
+import {useDictionaryStore} from "@/stores";
+import {ElMessage, ElMessageBox} from "element-plus";
+
+const emit = defineEmits(['update:show', 'refresh'])
+const {proxy} = getCurrentInstance()
+const DictionaryStore = useDictionaryStore()
+const props = defineProps({
+  show: {default: false},
+  transfer: {}
+ })
+const state: any = reactive({
+  form: {},
+  loading: false
+})
+const ref_form = ref()
+const titleCpt = computed(() => {
+  let t = '修改密码'
+  return t
+})
+const onSubmit = () => {
+  ref_form.value.submit().then(() => {
+    ElMessageBox.confirm("是否提交?", "提示", {
+      confirmButtonText: "确定",
+      cancelButtonText: "取消",
+      type: "warning",
+    } as any).then(() => {
+      // state.loading = true
+      // sysIndexSaveOrUpdate(state.form).then(res => {
+      //   if (res.code === 200) {
+      //     ElMessage.success(props.transfer.mode === 'add' ? '新增成功!' : '编辑成功!')
+      //     emit('update:show', false)
+      //   } else {
+      //     ElMessage.error(res.msg)
+      //   }
+      //   state.loading = false
+      // })
+    }).catch(() => {})
+  }).catch((e) => {
+    ElMessage({
+      message: e[0].message,
+      grouping: true,
+      type: 'warning',
+    })
+  })
+}
+const initPassword = () => {
+  // state.loading = true
+  // sysIndexGetDetail(props.transfer.id).then(res => {
+  //   if (res.code === 200) {
+  //     state.form = res.data
+  //     state.loading = false
+  //   } else {
+  //     ElMessage.error(res.msg)
+  //   }
+  // })
+}
+watch(() => props.show, (n) => {
+  if (n) {
+    initPassword()
+    nextTick(() => {
+      ref_form.value.reset()
+    })
+  }
+})
+</script>
+
+<style lang="scss" scoped>
+</style>

+ 82 - 0
src/views/manage/system/user/role.vue

@@ -0,0 +1,82 @@
+<template>
+  <CusDialog
+    :show="show"
+    title="授权角色"
+    @onClose="$emit('update:show', false)"
+    width="600px"
+    height="auto"
+    max-height="90%"
+  >
+    <div class="__cus-manage_content">
+      <div class="__cus-manage_content-main" v-loading="state.query.loading">
+        <CusTable
+          :data="state.query.result.data"
+          :table-head="state.query.tableHead"
+          :no-page="true"
+          :selected="state.query.selected"
+        >
+        </CusTable>
+      </div>
+    </div>
+  </CusDialog>
+</template>
+
+<script setup lang="ts">
+import {computed, getCurrentInstance, nextTick, reactive, ref, watch} from "vue";
+import {useDictionaryStore} from "@/stores";
+import {ElMessage, ElMessageBox} from "element-plus";
+
+const emit = defineEmits(['update:show', 'refresh'])
+const {proxy} = getCurrentInstance()
+const DictionaryStore = useDictionaryStore()
+const props = defineProps({
+  show: {default: false},
+  transfer: {}
+})
+const state: any = reactive({
+  query: {
+    loading: false,
+    tableHead: [
+      {value: "fieldNameCn", label: "角色名称"},
+    ],
+    result: {
+      data: [{},{}]
+    },
+    selected: []
+  },
+  detail: {
+    show: false,
+    transfer: {}
+  },
+})
+const initRoles = () => {
+  // state.query.loading = true
+  // sysIndexFieldList(proxy.$util.formatGetParam({
+  //   indexId: props.transfer.id
+  // })).then(res => {
+  //   if (res.code === 200) {
+  //     state.query.result.data = res.data
+  //     state.query.loading = false
+  //   } else {
+  //     ElMessage.error(res.msg)
+  //   }
+  // })
+}
+watch(() => props.show, (n) => {
+  if (n) {
+    initDictionary()
+    initRoles()
+  }
+})
+const initDictionary = () => {
+  DictionaryStore.initDict('true_false')
+  DictionaryStore.initDict('fie_type')
+}
+</script>
+
+<style lang="scss" scoped>
+.__cus-manage_content {
+  margin-bottom: 0;
+  height: calc(100% - 24px);
+}
+</style>

+ 2 - 2
src/views/web/archive/people/index.vue

@@ -96,8 +96,8 @@ const state: any = reactive({
       {value: "columnModelNum", label: "列模式列数", width: 180},
       {value: "num", label: "数据量", width: 180},
       {value: "linkTypeNum", label: "关联分类数量", width: 180},
-      {value: "createTime", label: "创建时间", width: 180},
-      {value: "updateTime", label: "最后修改时间", width: 180},
+      {value: "createTime", label: "创建时间", width: 200},
+      {value: "updateTime", label: "最后修改时间", width: 200},
       {value: "remark", label: "备注", width: 200},
     ],
     form: {},