Pārlūkot izejas kodu

Merge branch 'master' of http://192.168.101.4:3000/jiaxiaoqiang/JG-ADMIN-TEMP

# Conflicts:
#	src/common/configs/dictDataUtil.ts
qinhb 1 gadu atpakaļ
vecāks
revīzija
3ade8d9cd3

+ 1 - 1
README.md

@@ -19,4 +19,4 @@ pnpm run dev
 和crud相关代码可以参看hooksDemo.vue (目前不够特别全面,需要什么后续可以在userCrud.ts里面添加)
 
 功能示例:
-1. v-debounce:click防抖。2.按钮权限。v-hasPerm或者checkPerm
+1. v-debounce:click防抖。2.按钮权限。v-hasPerm或者checkPerm 3.数据字典在dictionary里面添加type。

+ 1 - 0
package.json

@@ -57,6 +57,7 @@
     "path-browserify": "^1.0.1",
     "path-to-regexp": "^6.2.1",
     "pinia": "^2.1.7",
+    "pinia-plugin-persist": "^1.0.0",
     "sockjs-client": "1.6.1",
     "sortablejs": "^1.15.2",
     "stompjs": "^2.3.3",

+ 11 - 0
src/api/auth/index.ts

@@ -44,6 +44,17 @@ export function getCaptchaApi(): AxiosPromise<CaptchaResult> {
   });
 }
 
+/**
+ * 登录成功后获取用户字典
+ */
+export function getUserDicts(data: string[]): AxiosPromise {
+  return request({
+    url: "/api/v1/sys/dictData/queryByTypes",
+    method: "post",
+    data: data,
+  });
+}
+
 export function getOrgListApi(): AxiosPromise<any[]> {
   return request({
     url: "/api/v1/sys/dept/orgList",

+ 41 - 13
src/common/configs/dictDataUtil.ts

@@ -1,33 +1,61 @@
-// 所有的字典类型typeCode都要在这里面写。
+// 所有的字典类型typeCode都要在这里面写。
 
 const DictDataUtil = {
   request_url:
     import.meta.env.VITE_APP_BASE_API + "/api/v1/sys/dictData/queryByType/",
   TYPE_CODE: {
-    //璁㈠崟绫诲瀷
+    //订单类型
     plan_order_type: "plan_order_type",
-    //订单优先级
+    //订单优先级
     plan_order_priority: "plan_order_priority",
-    //订单状态
+    //订单状态
     plan_order_state: "plan_order_state",
-    //璁惧�绫诲瀷
+    //设备类型
     device_type: "device_type",
-    //设备状态
+    //设备状态
+    device_status: "device_status"
+  },
+  EXPAND_FIELD_TABLE: {
+    //映射表列表
+    expand_table_list: "expand_field_table",
+    //订单计划表
+    plan_order_info: "plan_order_info",
+    //映射字段列表
+    expand_field_list: "expand_field_list",
+  },
+};
+
+export default DictDataUtil;
+// 所有的字典类型typeCode都要在这里面写。
+
+const DictDataUtil = {
+  request_url:
+    import.meta.env.VITE_APP_BASE_API + "/api/v1/sys/dictData/queryByType/",
+  TYPE_CODE: {
+    //订单类型
+    plan_order_type: "plan_order_type",
+    //订单优先级
+    plan_order_priority: "plan_order_priority",
+    //订单状态
+    plan_order_state: "plan_order_state",
+    //设备类型
+    device_type: "device_type",
+    //设备状态
     device_status: "device_status",
-    //设备运行状态
+    //设备运行状态
     device_run_status: "device_run_status",
-    //璁惧�缁存姢棰戠巼
+    //设备维护频率
     device_maintenance_cycle: "device_maintenance_cycle",
-    //璁惧�
+    //设备
   },
   EXPAND_FIELD_TABLE: {
-    //映射表列表
+    //映射表列表
     expand_table_list: "expand_field_table",
-    //订单计划表
+    //订单计划表
     plan_order_info: "plan_order_info",
-    //鏄犲皠瀛楁�鍒楄〃
+    //映射字段列表
     expand_field_list: "expand_field_list",
   },
 };
 
-export default DictDataUtil;
+export default DictDataUtil;

+ 3 - 0
src/store/index.ts

@@ -1,7 +1,9 @@
 import type { App } from "vue";
 import { createPinia } from "pinia";
+import piniaPersist from "pinia-plugin-persist";
 
 const store = createPinia();
+store.use(piniaPersist);
 
 // 全局注册 store
 export function setupStore(app: App<Element>) {
@@ -14,4 +16,5 @@ export * from "./modules/settings";
 export * from "./modules/tagsView";
 export * from "./modules/user";
 export * from "./modules/common";
+export * from "./modules/dictionary";
 export { store };

+ 26 - 0
src/store/modules/dictionary.ts

@@ -0,0 +1,26 @@
+import { store } from "@/store";
+import { defineStore } from "pinia";
+
+export const useDictionaryStore = defineStore("dictionaryStore", {
+  state: () => ({
+    /**
+     * 需要后端返回的type
+     */
+    types: ["station_type", "station_operate_type"],
+    dicts: [],
+  }),
+  persist: {
+    enabled: true,
+    strategies: [
+      {
+        key: "dicts",
+        storage: sessionStorage,
+        paths: ["dicts"],
+      },
+    ],
+  },
+});
+
+export function useDictionaryStoreHook() {
+  return useDictionaryStore(store);
+}

+ 139 - 0
src/views/base/factory/index.vue

@@ -0,0 +1,139 @@
+<template>
+
+
+  <div class="mainContentBox">
+
+    <avue-crud
+      ref="crudRef"
+      v-model:search="search"
+      v-model="form"
+      :data="data"
+      :option="option"
+      v-model:page="page"
+      @row-save="createRow"
+      @row-update="updateRow"
+      @row-del="deleteRow"
+      @selection-change="selectionChange"
+    >
+      <template #menu-left="{ size }">
+        <el-button
+          :disabled="toDeleteIds.length < 1"
+          type="danger"
+          icon="el-icon-delete"
+          :size="size"
+          @click="multipleDelete"
+        >删除</el-button
+        >
+      </template>
+    </avue-crud>
+  </div>
+</template>
+<script setup>
+  import { ref, getCurrentInstance } from "vue";
+  import { useCrud } from "@/hooks/userCrud";
+  import ButtonPermKeys from "@/common/configs/buttonPermission";
+
+  // import { useCommonStoreHook } from "@/store";
+  import { useCommonStoreHook } from "@/store";
+  const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+  // const isShowTable = ref(false);
+  const test = () => {
+    isShowTable.value = true;
+    tableType.value = tableType.value == 1 ? 2 : 1;
+  };
+
+  // 传入一个url,后面不带/
+  const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+    useCrud({
+      src: "/api/v1/base/workShop",
+    });
+  const { dataList, createRow, updateRow, deleteRow } = Methords; //增删改查
+  const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+  const { checkBtnPerm } = Utils; //按钮权限等工具
+  // checkBtnPerm(ButtonPermKeys.PLAN.BTNS.order_add) :permission="permission"
+  // const permission = reactive({
+  //   delBtn: checkPerm(buttonPermission.PLAN.BTNS.order_del),
+  //   addBtn: checkPerm(buttonPermission.PLAN.BTNS.order_add),
+  //   editBtn: checkPerm(buttonPermission.PLAN.BTNS.order_edit),
+  //   menu: true,
+  // });
+
+  const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+
+  // 设置表格列或者其他自定义的option
+  option.value = Object.assign(option.value, {
+    selection: true,
+    viewBtn: true,
+    column: [
+      // 添加一个自增列
+      {
+        label: "id",
+        prop: "id",
+        hide:true,
+        display:false
+
+      },
+      {
+        label: "厂区名称",
+        prop: "factoryName",
+        search: true,
+        span: 24,
+        labelWidth: 100,
+        rules: [{
+          required: true,
+          message: "请输入工厂名称",
+          trigger: "blur"
+        }]
+      },
+      {
+        label: "厂区负责人",
+        prop: "factoryManager",
+        span: 24,
+        labelWidth: 100,
+        rules: [{
+          required: true,
+          message: "请选择厂区负责人",
+          trigger: "blur"
+        }],
+        type: 'select',
+        dicUrl:import.meta.env.VITE_APP_BASE_API+"/api/v1/sys/user/list",
+        dicMethod:"post",
+        props: {
+          label: "userName", // 下拉菜单显示的字段
+          value: "userName" // 下拉菜单值的字段
+        },
+      },
+      {
+        label: "厂区位置",
+        prop: "factoryPosition",
+        span: 24,
+        labelWidth: 100,
+        rules: [{
+          required: true,
+          message: "请输入厂区位置",
+          trigger: "blur"
+        }]
+      },
+      {
+        label: "创建时间",
+        prop: "created",
+        display:false
+      },
+      {
+        label: "备注",
+        span: 24,
+        labelWidth: 100,
+        prop: "remark",
+        type: 'textarea',
+      },
+    ],
+  });
+
+  onMounted(() => {
+    // console.log("crudRef", crudRef)
+    dataList();
+  });
+</script>
+
+
+

+ 160 - 0
src/views/base/production-line/index.vue

@@ -0,0 +1,160 @@
+<template>
+  <div class="mainContentBox">
+    <avue-crud
+      ref="crudRef"
+      v-model:search="search"
+      v-model="form"
+      :data="data"
+      :option="option"
+      v-model:page="page"
+      @row-save="createRow"
+      @row-update="updateRow"
+      @row-del="deleteRow"
+      @search-change="searchChange"
+      @search-reset="resetChange"
+      @size-change="dataList"
+      @current-change="dataList"
+      @selection-change="selectionChange"
+    >
+      <template #menu-left="{ size }">
+        <el-button
+          :disabled="toDeleteIds.length < 1"
+          type="danger"
+          icon="el-icon-delete"
+          :size="size"
+          @click="multipleDelete"
+        >删除</el-button
+        >
+      </template>
+      <template #menu-right="{}">
+        <el-dropdown split-button
+        >导入
+          <template #dropdown>
+            <el-dropdown-menu>
+              <el-dropdown-item
+                @click="downloadTemplate('/api/v1/plan/order/template')"
+              >
+                <i-ep-download />下载模板
+              </el-dropdown-item>
+              <el-dropdown-item @click="importExcelData">
+                <i-ep-top />导入数据
+              </el-dropdown-item>
+            </el-dropdown-menu>
+          </template>
+        </el-dropdown>
+        <el-button class="ml-3" @click="exportData">
+          <template #icon> <i-ep-download /> </template>导出
+        </el-button>
+      </template>
+    </avue-crud>
+    <ExcelUpload ref="uploadRef" @finished="uploadFinished" />
+  </div>
+</template>
+<script setup>
+  import { ref, getCurrentInstance } from "vue";
+  import { useCrud } from "@/hooks/userCrud";
+  import ButtonPermKeys from "@/common/configs/buttonPermission";
+  import { useCommonStoreHook } from "@/store";
+  const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+
+  const test = () => {
+    isShowTable.value = true;
+    tableType.value = tableType.value == 1 ? 2 : 1;
+  };
+
+  // 传入一个url,后面不带/
+  const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+    useCrud({
+      src: "/api/v1/base/productionLine",
+    });
+  const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
+    Methords; //增删改查
+  const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+  const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
+  // checkBtnPerm(ButtonPermKeys.PLAN.BTNS.order_add) :permission="permission"
+  // const permission = reactive({
+  //   delBtn: checkPerm(buttonPermission.PLAN.BTNS.order_del),
+  //   addBtn: checkPerm(buttonPermission.PLAN.BTNS.order_add),
+  //   editBtn: checkPerm(buttonPermission.PLAN.BTNS.order_edit),
+  //   menu: true,
+  // });
+
+  const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+
+  onMounted(() => {
+    // console.log("crudRef", crudRef)
+    dataList();
+  });
+
+  /**
+   * 上传excel相关
+   */
+  const uploadRef = ref(null);
+  const uploadFinished = () => {
+    // 上传完成后的刷新操作
+    page.currentPage = 1;
+    dataList();
+  };
+  const importExcelData = () => {
+    if (uploadRef.value) {
+      uploadRef.value.show("/api/v1/plan/order/import");
+    }
+  };
+
+  // 设置表格列或者其他自定义的option
+  option.value = Object.assign(option.value, {
+    selection: true,
+    column: [
+      {
+        label: "产线名称",
+        prop: "productionLineName",
+        search: true,
+        rules: [{
+          required: true,
+          message: "请填写产线名称",
+          trigger: "blur"
+        }],
+      },
+      {
+        label: "产线负责人",
+        prop: "productionLineManager",
+        rules: [{
+          required: true,
+          message: "请选择产线负责人",
+          trigger: "blur"
+        }],
+        type: 'select',
+        dicUrl:import.meta.env.VITE_APP_BASE_API+"/api/v1/sys/user/list",
+        dicMethod:"post",
+        props: {
+          label: "userName", // 下拉菜单显示的字段
+          value: "userName" // 下拉菜单值的字段
+        },
+      },
+      {
+        label: "产线位置",
+        prop: "productionLinePosition",
+      },
+      {
+        label: "所属车间",
+        prop: "workShopName",
+        display:false
+      },
+      {
+        label: "产线描述",
+        prop: "remark",
+      },
+      {
+        label: "创建人",
+        prop: "creator",
+        display:false
+      },
+      {
+        label: "创建时间",
+        prop: "created",
+        display:false
+      },
+    ],
+  });
+</script>
+

+ 220 - 0
src/views/base/station/index.vue

@@ -0,0 +1,220 @@
+<template>
+  <div class="mainContentBox">
+    <avue-crud
+      ref="crudRef"
+      v-model:search="search"
+      v-model="form"
+      :data="data"
+      :option="option"
+      v-model:page="page"
+      @row-save="createRow"
+      @row-update="updateRow"
+      @row-del="deleteRow"
+      @search-change="searchChange"
+      @search-reset="resetChange"
+      @size-change="dataList"
+      @current-change="dataList"
+      @selection-change="selectionChange"
+    >
+      <template #menu-left="{ size }">
+        <el-button
+          :disabled="toDeleteIds.length < 1"
+          type="danger"
+          icon="el-icon-delete"
+          :size="size"
+          @click="multipleDelete"
+        >删除</el-button
+        >
+      </template>
+      <template #menu-right="{}">
+        <el-dropdown split-button
+        >导入
+          <template #dropdown>
+            <el-dropdown-menu>
+              <el-dropdown-item
+                @click="downloadTemplate('/api/v1/plan/order/template')"
+              >
+                <i-ep-download />下载模板
+              </el-dropdown-item>
+              <el-dropdown-item @click="importExcelData">
+                <i-ep-top />导入数据
+              </el-dropdown-item>
+            </el-dropdown-menu>
+          </template>
+        </el-dropdown>
+        <el-button class="ml-3" @click="exportData">
+          <template #icon> <i-ep-download /> </template>导出
+        </el-button>
+      </template>
+    </avue-crud>
+    <ExcelUpload ref="uploadRef" @finished="uploadFinished" />
+  </div>
+</template>
+<script setup>
+  import { ref, getCurrentInstance } from "vue";
+  import { useCrud } from "@/hooks/userCrud";
+  import dictDataUtil from "@/common/configs/dictDataUtil";
+  import ButtonPermKeys from "@/common/configs/buttonPermission";
+  import { useCommonStoreHook } from "@/store";
+  const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+
+  const test = () => {
+    isShowTable.value = true;
+    tableType.value = tableType.value == 1 ? 2 : 1;
+  };
+
+  // 传入一个url,后面不带/
+  const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+    useCrud({
+      src: "/api/v1/base/station",
+    });
+  const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
+    Methords; //增删改查
+  const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+  const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
+  // checkBtnPerm(ButtonPermKeys.PLAN.BTNS.order_add) :permission="permission"
+  // const permission = reactive({
+  //   delBtn: checkPerm(buttonPermission.PLAN.BTNS.order_del),
+  //   addBtn: checkPerm(buttonPermission.PLAN.BTNS.order_add),
+  //   editBtn: checkPerm(buttonPermission.PLAN.BTNS.order_edit),
+  //   menu: true,
+  // });
+
+  const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+
+  onMounted(() => {
+    // console.log("crudRef", crudRef)
+    dataList();
+  });
+
+  /**
+   * 上传excel相关
+   */
+  const uploadRef = ref(null);
+  const uploadFinished = () => {
+    // 上传完成后的刷新操作
+    page.currentPage = 1;
+    dataList();
+  };
+  const importExcelData = () => {
+    if (uploadRef.value) {
+      uploadRef.value.show("/api/v1/base/station");
+    }
+  };
+
+  // 设置表格列或者其他自定义的option
+  option.value = Object.assign(option.value, {
+    selection: true,
+    column: [
+      {
+        label: "工位编号",
+        prop: "stationCode",
+        search: true,
+        rules: [{
+          required: true,
+          message: "请填写工位编号",
+          trigger: "blur"
+        }],
+      },
+      {
+        label: "工位名称",
+        prop: "stationName",
+        search: true,
+        rules: [{
+          required: true,
+          message: "请填写工位名称",
+          trigger: "blur"
+        }],
+      },
+      {
+        label: "工位类型",
+        prop: "stationDictValue",
+        search: true,
+        rules: [{
+          required: true,
+          message: "请选择工位类型",
+          trigger: "blur"
+        }],
+        type: 'select',
+        dicUrl:dictDataUtil.request_url+dictDataUtil.TYPE_CODE.station_type,
+        searchClearable: false, //可清空的输入框,默认为true
+        filterable: true, //添加filterable属性即可启用搜索功能
+        props: {
+          label: "dictLabel", // 下拉菜单显示的字段
+          value: "dictValue" // 下拉菜单值的字段
+        },
+      },
+      {
+        label: "工位操作方式",
+        prop: "operateDictValue",
+        rules: [{
+          required: true,
+          message: "请选择工位方式",
+          trigger: "blur"
+        }],
+        type: 'select',
+        dicUrl:dictDataUtil.request_url+dictDataUtil.TYPE_CODE.station_operate_type,
+        props: {
+          label: "dictLabel", // 下拉菜单显示的字段
+          value: "dictValue" // 下拉菜单值的字
+        },
+      },
+      {
+        label: "工位负责人",
+        prop: "stationManager",
+        rules: [{
+          required: true,
+          message: "请选择工位负责人",
+          trigger: "blur"
+        }],
+        type: 'select',
+        dicUrl:import.meta.env.VITE_APP_BASE_API+"/api/v1/sys/user/list",
+        dicMethod:"post",
+        props: {
+          label: "userName", // 下拉菜单显示的字段
+          value: "userName" // 下拉菜单值的字段
+        },
+      },
+      {
+        label: "所属产线",
+        prop: "productionLineName",
+        display:false
+      },
+      {
+        label: "工位地址",
+        prop: "stationPosition",
+        rules: [{
+          required: true,
+          message: "请填写工位地址",
+          trigger: "blur"
+        }],
+      },
+      {
+        label: "工位IP地址",
+        prop: "stationIp",
+        rules: [{
+          required: true,
+          message: "请填写工位IP地址",
+          trigger: "blur"
+        }],
+      },
+      {
+        label: "工位描述",
+        prop: "remark",
+        type: 'textarea',
+        span: 24,
+      },
+      {
+        label: "创建人",
+        prop: "creator",
+        display:false
+      },
+      {
+        label: "创建时间",
+        prop: "created",
+        display:false
+      },
+    ],
+  });
+</script>
+

+ 119 - 0
src/views/base/work-shop/index.vue

@@ -0,0 +1,119 @@
+<template>
+
+
+  <div class="mainContentBox">
+
+    <avue-crud
+      ref="crudRef"
+      v-model:search="search"
+      v-model="form"
+      :data="data"
+      :option="option"
+      v-model:page="page"
+      @row-save="createRow"
+      @row-update="updateRow"
+      @row-del="deleteRow"
+      @selection-change="selectionChange"
+    >
+      <template #menu-left="{ size }">
+        <el-button
+          :disabled="toDeleteIds.length < 1"
+          type="danger"
+          icon="el-icon-delete"
+          :size="size"
+          @click="multipleDelete"
+          >删除</el-button
+        >
+      </template>
+    </avue-crud>
+  </div>
+</template>
+<script setup>
+  import { ref, getCurrentInstance } from "vue";
+  import { useCrud } from "@/hooks/userCrud";
+  import ButtonPermKeys from "@/common/configs/buttonPermission";
+
+  // import { useCommonStoreHook } from "@/store";
+  import { useCommonStoreHook } from "@/store";
+  const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+  // const isShowTable = ref(false);
+  const test = () => {
+    isShowTable.value = true;
+    tableType.value = tableType.value == 1 ? 2 : 1;
+  };
+
+  // 传入一个url,后面不带/
+  const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+    useCrud({
+      src: "/api/v1/base/workShop",
+    });
+  const { dataList, createRow, updateRow, deleteRow } = Methords; //增删改查
+  const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+  const { checkBtnPerm } = Utils; //按钮权限等工具
+  // checkBtnPerm(ButtonPermKeys.PLAN.BTNS.order_add) :permission="permission"
+  // const permission = reactive({
+  //   delBtn: checkPerm(buttonPermission.PLAN.BTNS.order_del),
+  //   addBtn: checkPerm(buttonPermission.PLAN.BTNS.order_add),
+  //   editBtn: checkPerm(buttonPermission.PLAN.BTNS.order_edit),
+  //   menu: true,
+  // });
+
+  const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+
+  // 设置表格列或者其他自定义的option
+  option.value = Object.assign(option.value, {
+    selection: true,
+    viewBtn: true,
+    column: [
+      {
+        label: "车间名称",
+        prop: "workShopName",
+        search: true,
+      },
+      {
+        label: "车间负责人",
+        prop: "workShopManager",
+        rules: [{
+          required: true,
+          message: "请选择厂区负责人",
+          trigger: "blur"
+        }],
+        type: 'select',
+        dicUrl:import.meta.env.VITE_APP_BASE_API+"/api/v1/sys/user/list",
+        dicMethod:"post",
+        props: {
+          label: "userName", // 下拉菜单显示的字段
+          value: "userName" // 下拉菜单值的字段
+        },
+      },
+      {
+        label: "车间位置",
+        prop: "workShopPosition",
+      },
+      {
+        label: "所属工厂",
+        prop: "factoryName",
+        display:false
+      },
+      {
+        label: "车间描述",
+        prop: "remark",
+      },
+      {
+        label: "创建人",
+        prop: "creator",
+        display:false
+      },
+      {
+        label: "创建时间",
+        prop: "created",
+        display:false
+      },
+    ],
+  });
+
+  onMounted(() => {
+    // console.log("crudRef", crudRef)
+    dataList();
+  });
+</script>

+ 13 - 1
src/views/demo/hooksDemo.vue

@@ -61,8 +61,10 @@
 import { ref, getCurrentInstance } from "vue";
 import { useCrud } from "@/hooks/userCrud";
 import ButtonPermKeys from "@/common/configs/buttonPermission";
-import { useCommonStoreHook } from "@/store";
+import { useCommonStoreHook, useDictionaryStoreHook } from "@/store";
 const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+// 数据字典相关
+const { dicts } = useDictionaryStoreHook();
 
 const test = () => {
   isShowTable.value = true;
@@ -132,6 +134,16 @@ option.value = Object.assign(option.value, {
       search: true,
     },
     {
+      label: "网络字典",
+      prop: "province",
+      type: "select",
+      dicData: dicts.station_operate_type,
+      props: {
+        label: "dictLabel",
+        value: "dictValue",
+      },
+    },
+    {
       label: "身高",
       prop: "projectCode",
       search: true,

+ 13 - 4
src/views/login/index.vue

@@ -110,8 +110,8 @@
 </template>
 
 <script setup lang="ts">
-import { useSettingsStore, useUserStore } from "@/store";
-import { getCaptchaApi, getOrgListApi } from "@/api/auth";
+import { useSettingsStore, useUserStore, useDictionaryStore } from "@/store";
+import { getCaptchaApi, getOrgListApi, getUserDicts } from "@/api/auth";
 import { LoginData } from "@/api/auth/types";
 import { Sunny, Moon } from "@element-plus/icons-vue";
 import { LocationQuery, LocationQueryValue, useRoute } from "vue-router";
@@ -122,6 +122,8 @@ import { usePermissionStore } from "@/store/modules/permission";
 // Stores
 const userStore = useUserStore();
 const settingsStore = useSettingsStore();
+// 数据字典相关
+const dictStore = useDictionaryStore();
 
 // Internationalization
 const { t } = useI18n();
@@ -129,14 +131,14 @@ const { t } = useI18n();
 // Reactive states
 const isDark = ref(settingsStore.theme === ThemeEnum.DARK);
 const icpVisible = ref(true);
-const orgList = ref([]);
+const orgList = ref<any>([]);
 const loading = ref(false); // 按钮loading
 const isCapslock = ref(false); // 是否大写锁定
 const captchaBase64 = ref(); // 验证码图片Base64字符串
 const loginFormRef = ref(ElForm); // 登录表单ref
 const { height } = useWindowSize();
 
-const loginData = ref<LoginData>({
+const loginData = ref<any>({
   userName: "admin",
   password: "admin@123",
 });
@@ -212,6 +214,13 @@ function handleLogin() {
             },
             {}
           );
+          // 获取字典
+          getUserDicts(dictStore.types).then((res) => {
+            if (res.data) {
+              dictStore.dicts = res?.data ?? [];
+            }
+          });
+
           router.push({ path: redirect, query: otherQueryParams });
         })
         .catch(() => {