From aa3d3ad8fdb71c9cdbc05ae46270cbcddff0a6f1 Mon Sep 17 00:00:00 2001
From: wjt <1797368093@qq.com>
Date: 星期二, 18 六月 2024 16:56:10 +0800
Subject: [PATCH] t调整菜单

---
 src/views/infomanger/companymanger/components/export.vue       |   56 ++
 src/utils/mapList/index.ts                                     |   20 
 src/views/infomanger/policy/components/addNews.vue             |   42 +
 src/views/index/index.vue                                      |    3 
 .env.staging                                                   |    4 
 src/config/menuSettings.ts                                     |   10 
 src/layout/components/Sidebar/Logo.vue                         |    8 
 src/views/error/401.vue                                        |    2 
 index.html                                                     |    2 
 src/views/infomanger/companymanger/index.vue                   |  330 +++++++++++++
 src/views/system/dictManger/data.vue                           |  350 ++++++++++++++
 src/views/system/dictManger/index.vue                          |  315 ++++++++++++
 src/layout/components/Sidebar/index.vue                        |    9 
 src/router/index.ts                                            |   12 
 src/assets/styles/sidebar.scss                                 |   23 
 src/utils/request.ts                                           |   37 +
 src/api/system/company/company.ts                              |   81 +++
 src/views/error/404.vue                                        |    2 
 src/permission.ts                                              |    1 
 .env.development                                               |    6 
 src/views/infomanger/companymanger/components/exportRecord.vue |   32 +
 src/views/login.vue                                            |    2 
 package.json                                                   |    2 
 src/views/infomanger/policy/index.vue                          |   94 +++
 .env.production                                                |    4 
 src/views/system/dict/index.vue                                |   20 
 26 files changed, 1,433 insertions(+), 34 deletions(-)

diff --git a/.env.development b/.env.development
index 0ecae2f..7b8fc5a 100644
--- a/.env.development
+++ b/.env.development
@@ -1,14 +1,14 @@
 # 椤甸潰鏍囬
-VITE_APP_TITLE = 涓師閲戣瀺绠$悊绯荤粺
+VITE_APP_TITLE = 鍏ヤ紒鎵爜
 
 # 寮�鍙戠幆澧冮厤缃�
 VITE_APP_ENV = 'development'
 
-VITE_APP_BASE = 'http://121.43.62.184/prod-api'
+VITE_APP_BASE = 'http://172.16.61.34:8089'
 # VITE_APP_BASE = 'http://172.16.61.34:8089'
 #VITE_APP_BASE = 'http://localhost:8089'
 
 
 # VITE_APP_BASE = 'http://ss.mantanghui.com:8089'
-# 涓師閲戣瀺绠$悊绯荤粺/寮�鍙戠幆澧�
+# 鍏ヤ紒鎵爜/寮�鍙戠幆澧�
 VITE_APP_BASE_API = '/dev-api'
diff --git a/.env.production b/.env.production
index 18cd00f..ed6151a 100644
--- a/.env.production
+++ b/.env.production
@@ -1,5 +1,5 @@
 # 椤甸潰鏍囬
-VITE_APP_TITLE = 涓師閲戣瀺绠$悊绯荤粺
+VITE_APP_TITLE = 鍏ヤ紒鎵爜
 
 # 鐢熶骇鐜閰嶇疆
 VITE_APP_ENV = 'production'
@@ -7,7 +7,7 @@
 #鍩虹鍩熷悕
 VITE_APP_BASE = 'http://ss.mantanghui.com:8089'
 
-# 涓師閲戣瀺绠$悊绯荤粺/鐢熶骇鐜
+# 鍏ヤ紒鎵爜/鐢熶骇鐜
 VITE_APP_BASE_API = '/prod-api'
 
 # 鏄惁鍦ㄦ墦鍖呮椂寮�鍚帇缂╋紝鏀寔 gzip 鍜� brotli
diff --git a/.env.staging b/.env.staging
index 6982033..dcc7f4a 100644
--- a/.env.staging
+++ b/.env.staging
@@ -1,10 +1,10 @@
 # 椤甸潰鏍囬
-VITE_APP_TITLE = 涓師閲戣瀺绠$悊绯荤粺
+VITE_APP_TITLE = 鍏ヤ紒鎵爜
 
 # 鐢熶骇鐜閰嶇疆
 VITE_APP_ENV = 'staging'
 
-# 涓師閲戣瀺绠$悊绯荤粺/鐢熶骇鐜
+# 鍏ヤ紒鎵爜/鐢熶骇鐜
 VITE_APP_BASE_API = '/stage-api'
 
 # 鏄惁鍦ㄦ墦鍖呮椂寮�鍚帇缂╋紝鏀寔 gzip 鍜� brotli
diff --git a/index.html b/index.html
index 23460dc..74d7a5b 100644
--- a/index.html
+++ b/index.html
@@ -6,7 +6,7 @@
     <meta name="renderer" content="webkit" />
     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
     <!-- <link rel="icon" href="/logo.ico" /> -->
-    <title>涓師閲戣瀺绠$悊绯荤粺</title>
+    <title>鍏ヤ紒鎵爜</title>
     <!--[if lt IE 11
       ]><script>
         window.location.href = "/html/ie.html";
diff --git a/package.json b/package.json
index 08c42ad..33787df 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
 {
   "name": "ruoyi",
   "version": "3.8.5",
-  "description": "涓師閲戣瀺绠$悊绯荤粺",
+  "description": "鍏ヤ紒鎵爜",
   "author": "涓師閲戣瀺",
   "scripts": {
     "build:prod": "vite build",
diff --git a/src/api/system/company/company.ts b/src/api/system/company/company.ts
new file mode 100644
index 0000000..b08d18d
--- /dev/null
+++ b/src/api/system/company/company.ts
@@ -0,0 +1,81 @@
+import request from '@/utils/request'
+
+// 鏌ヨ浼佷笟淇℃伅鍒楄〃
+export function listCompany(query) {
+  return request({
+    url: '/system/company/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ浼佷笟淇℃伅璇︾粏
+export function getCompany(companyId) {
+  return request({
+    url: '/system/company/' + companyId,
+    method: 'get'
+  })
+}
+
+// 鏂板浼佷笟淇℃伅
+export function addCompany(data) {
+  return request({
+    url: '/system/company/add',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼浼佷笟淇℃伅
+export function updateCompany(data) {
+  return request({
+    url: '/system/company/upd',
+    method: 'post',
+    data: data
+  })
+}
+
+// 鍒犻櫎浼佷笟淇℃伅
+export function delCompany(companyId) {
+  return request({
+    url: '/system/company/' + companyId,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭浼佷笟妯℃澘涓嬭浇
+
+export function downTemplate() {
+  return request({
+    url: '/system/company/export',
+    method: 'get',
+  })
+}
+
+// 寮�濮嬫ā鏉垮鍏� 
+
+export function importTemplate() {
+  return request({
+    url: '/system/company/import',
+    method: 'get',
+   })
+}
+
+// 瀵煎叆璁板綍 /system/company/export
+
+
+export function importTemplateRecord() {
+  return request({
+    url: '/system/company/export',
+    method: 'get',
+    responseType: 'blob'
+  })
+}
+// /system/doc/list 鎱т紒鏀跨瓥鍒楄〃
+export function docList() {
+  return request({
+    url: '/system/doc/list',
+    method: 'get',
+    responseType: 'blob'
+  })
+}
\ No newline at end of file
diff --git a/src/assets/styles/sidebar.scss b/src/assets/styles/sidebar.scss
index 7222293..f9fba9c 100644
--- a/src/assets/styles/sidebar.scss
+++ b/src/assets/styles/sidebar.scss
@@ -87,12 +87,13 @@
     // menu hover
     .sub-menu-title-noDropdown,
     .el-sub-menu__title {
+      background-color: $base-menu-background !important;
       &:hover {
         // background-color: rgba(0, 0, 0, 0.06) !important;
         background-color: $base-sub-menu-hover !important;
       }
     }
-
+    
     .el-menu-item, 
     .submenu-title-noDropdown{
       &:hover{
@@ -102,10 +103,17 @@
 
     & .theme-dark .is-active > .el-sub-menu__title {
       // color: $base-menu-color-active;
-      color: var(--el-menu-active-color) !important;
-      // background-color: red !important;
+      color: white;
+      // color: var(--el-menu-active-color) !important;
+      background-color: $base-menu-background !important;
     }
-
+    & .theme-dark .el-menu .is-opened {
+      .el-sub-menu{
+        .el-sub-menu__title{
+          background-color:  rgba(31, 45, 61, 1) !important;
+        }
+      }
+    }
     & .nest-menu .el-sub-menu>.el-sub-menu__title,
     & .el-sub-menu .el-menu-item {
       // min-width: $base-sidebar-width !important;
@@ -120,7 +128,7 @@
       background-color: $base-sub-menu-background ;
 
       &:hover {
-        background-color: $base-sub-menu-hover !important;
+        // background-color: $base-sub-menu-hover !important;
       }
     }
 
@@ -128,6 +136,11 @@
       // color: $base-menu-color-active !important;
       background-color: $base-menu-light-background !important;
       // border-left: 3px solid $--color-primary;
+      color: white;
+      &:hover {
+        background-color: $base-menu-light-background !important;
+        color: white;
+      }
     }
 
 
diff --git a/src/config/menuSettings.ts b/src/config/menuSettings.ts
index fa6896e..d9fc656 100644
--- a/src/config/menuSettings.ts
+++ b/src/config/menuSettings.ts
@@ -3,13 +3,13 @@
  */
 export default {
   menuColors: {
-    baseMenuColor: "#333", ////鑿滃崟鏍囬鏈�変腑鏂囨湰棰滆壊
+    baseMenuColor: "white", ////鑿滃崟鏍囬鏈�変腑鏂囨湰棰滆壊
     baseMenuLightColor: "rgba(64,158,255)", ////鑿滃崟鏍囬閫変腑鏂囨湰棰滆壊
     baseMenuColorActive: "rgba(64,158,255)", //鑿滃崟涓绘枃鏈笅绾ц閫変腑
-    baseMenuLightBackground: "#F8F9FF", //鑿滃崟閫変腑涔嬪悗鑳屾櫙棰滆壊
-    baseMenuBackground: "#ffffff", //涓昏彍鍗曡儗鏅鑹�
-    baseSubMenuBackground: "#ffffff", //瀛愯彍鍗曡儗鏅鑹�
-    BaseSubMenuHover: "#F8F9FF", //榧犳爣婊戣繃鑳屾櫙棰滆壊
+    baseMenuLightBackground: "rgba(64,158,255)", //鑿滃崟閫変腑涔嬪悗鑳屾櫙棰滆壊
+    baseMenuBackground: "#304156", //涓昏彍鍗曡儗鏅鑹�
+    baseSubMenuBackground: "#1f2d3d", //瀛愯彍鍗曡儗鏅鑹�
+    BaseSubMenuHover: "rgba(0, 21, 40, 1)", //榧犳爣婊戣繃鑳屾櫙棰滆壊
     BaseMenuBoxShodow: "#F8F9FF", //鑿滃崟杈规闃村奖棰滆壊
   },
   menuOpenWidth: "200px", //鑿滃崟灞曞紑鏃跺搴�
diff --git a/src/layout/components/Sidebar/Logo.vue b/src/layout/components/Sidebar/Logo.vue
index 10a09f5..e3660de 100644
--- a/src/layout/components/Sidebar/Logo.vue
+++ b/src/layout/components/Sidebar/Logo.vue
@@ -1,11 +1,13 @@
 <template>
   <div class="sidebar-logo-container" :class="{ collapse: collapse }">
     <transition name="sidebarLogoFade">
-      <router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/">
+      <router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/home">
         <!-- <img v-if="logo" :src="logo" class="sidebar-logo" /> -->
+         LOGO
       </router-link>
-      <router-link v-else key="expand" class="sidebar-logo-link" to="/">
+      <router-link v-else key="expand" class="sidebar-logo-link" to="/home">
         <!-- <img v-if="logotxt" :src="logotxt" class="sidebar-logo-txt" /> -->
+        鍏ヤ紒鎵爜
       </router-link>
     </transition>
   </div>
@@ -24,7 +26,7 @@
   },
 });
 
-const title = ref("涓師閲戣瀺绠$悊绯荤粺");
+const title = ref("鍏ヤ紒鎵爜");
 const settingsStore = useSettingsStore();
 const sideTheme = computed(() => settingsStore.sideTheme);
 </script>
diff --git a/src/layout/components/Sidebar/index.vue b/src/layout/components/Sidebar/index.vue
index f7ed24e..48674e7 100644
--- a/src/layout/components/Sidebar/index.vue
+++ b/src/layout/components/Sidebar/index.vue
@@ -63,3 +63,12 @@
   });
 };
 </script>
+
+<style>
+.is-active .el-menu{
+  background-color: rgba(31, 45, 61, 1) !important;
+}
+.el-sub-menu .el-menu{
+  background-color: rgba(31, 45, 61, 1) !important;
+}
+</style>
diff --git a/src/permission.ts b/src/permission.ts
index 01a2216..3e5eaa2 100644
--- a/src/permission.ts
+++ b/src/permission.ts
@@ -32,6 +32,7 @@
             usePermissionStore()
               .generateRoutes()
               .then((accessRoutes) => {
+                console.log(accessRoutes)
                 // 鏍规嵁roles鏉冮檺鐢熸垚鍙闂殑璺敱琛�
                 accessRoutes.forEach((route: any) => {
                   if (!isHttp(route.path)) {
diff --git a/src/router/index.ts b/src/router/index.ts
index ab58e99..1971ea6 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -62,12 +62,12 @@
     component: Layout,
     redirect: "/index",
     children: [
-      {
-        path: "/index",
-        component: () => import("@/views/index.vue"),
-        name: "Index",
-        meta: { title: "鍑戒欢淇℃伅", icon: "dashboard", affix: true },
-      },
+      // {
+      //   path: "/index",
+      //   component: () => import("@/views/index.vue"),
+      //   name: "Index",
+      //   meta: { title: "鍑戒欢淇℃伅", icon: "dashboard", affix: true },
+      // },
     ],
   },
   {
diff --git a/src/utils/mapList/index.ts b/src/utils/mapList/index.ts
new file mode 100644
index 0000000..d95f2f3
--- /dev/null
+++ b/src/utils/mapList/index.ts
@@ -0,0 +1,20 @@
+//  瀹℃壒鐘舵�� -1鎷掔粷锛�0寰呭鎵癸紝1瀹℃壒涓紝2閫氳繃
+
+export const judgeStatus = {
+  '-1': '鎷掔粷',
+  0: '寰呭鎵�',
+  1: '瀹℃壒涓�',
+  2: '閫氳繃'
+}
+// 浼佷笟鐘舵�� 0姝e父锛�1绂佺敤
+
+export const companyStatus = {
+  0: '姝e父',
+  1: '绂佺敤'
+}
+
+// 0娉ㄥ唽锛�1瀵煎叆 鏉ユ簮
+export const scopeList = {
+  0: '娉ㄥ唽',
+  1: '瀵煎叆'
+}
\ No newline at end of file
diff --git a/src/utils/request.ts b/src/utils/request.ts
index fd457f9..932820b 100644
--- a/src/utils/request.ts
+++ b/src/utils/request.ts
@@ -165,7 +165,42 @@
       downloadLoadingInstance.close();
     });
 }
-
+// 閫氱敤涓嬭浇鏂规硶
+export function downloadGet(url: string, params: any, filename: string, config: any, isSaveFile = false) {
+  downloadLoadingInstance = ElLoading.service({ text: "姝e湪涓嬭浇鏁版嵁锛岃绋嶅��", background: "rgba(0, 0, 0, 0.7)" });
+  return service
+    .get(url, { params }, {
+      transformRequest: [
+        (params) => {
+          return tansParams(params);
+        },
+      ],
+      headers: { "Content-Type": "application/x-www-form-urlencoded" },
+      responseType: "blob",
+      ...config,
+    })
+    .then(async (data) => {
+      const isBlob = blobValidate(data);
+      if (isBlob && isSaveFile) {
+        const blob = new Blob([data]);
+        saveAs(blob, filename);
+      } else {
+        if(!isSaveFile) {
+        } else {
+          const resText = await data.text();
+          const rspObj = JSON.parse(resText);
+          const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode["default"];
+          ElMessage.error(errMsg);
+        }
+      }
+      downloadLoadingInstance.close();
+    })
+    .catch((r) => {
+      console.error(r);
+      ElMessage.error("涓嬭浇鏂囦欢鍑虹幇閿欒锛岃鑱旂郴绠$悊鍛橈紒");
+      downloadLoadingInstance.close();
+    });
+}
 const request = <T = any>(_config: AxiosRequestConfig<any>): Promise<T> => {
   return service(_config) as Promise<T>;
 };
diff --git a/src/views/error/401.vue b/src/views/error/401.vue
index c656dee..415e2ad 100644
--- a/src/views/error/401.vue
+++ b/src/views/error/401.vue
@@ -12,7 +12,7 @@
         <h6>瀵逛笉璧凤紝鎮ㄦ病鏈夎闂潈闄愶紝璇蜂笉瑕佽繘琛岄潪娉曟搷浣滐紒鎮ㄥ彲浠ヨ繑鍥炰富椤甸潰</h6>
         <ul class="list-unstyled">
           <li class="link-type">
-            <router-link to="/">
+            <router-link to="/home">
               鍥為椤�
             </router-link>
           </li>
diff --git a/src/views/error/404.vue b/src/views/error/404.vue
index 08a617a..9818ee3 100644
--- a/src/views/error/404.vue
+++ b/src/views/error/404.vue
@@ -17,7 +17,7 @@
         <div class="bullshit__info">
           瀵逛笉璧凤紝鎮ㄦ鍦ㄥ鎵剧殑椤甸潰涓嶅瓨鍦ㄣ�傚皾璇曟鏌RL鐨勯敊璇紝鐒跺悗鎸夋祻瑙堝櫒涓婄殑鍒锋柊鎸夐挳鎴栧皾璇曞湪鎴戜滑鐨勫簲鐢ㄧ▼搴忎腑鎵惧埌鍏朵粬鍐呭銆�
         </div>
-        <router-link to="/index" class="bullshit__return-home">
+        <router-link to="/home" class="bullshit__return-home">
           杩斿洖棣栭〉
         </router-link>
       </div>
diff --git a/src/views/index/index.vue b/src/views/index/index.vue
new file mode 100644
index 0000000..f8a8d13
--- /dev/null
+++ b/src/views/index/index.vue
@@ -0,0 +1,3 @@
+<template>
+  <div>棣栭〉</div>
+</template>
\ No newline at end of file
diff --git a/src/views/infomanger/companymanger/components/export.vue b/src/views/infomanger/companymanger/components/export.vue
new file mode 100644
index 0000000..b1c979b
--- /dev/null
+++ b/src/views/infomanger/companymanger/components/export.vue
@@ -0,0 +1,56 @@
+<template>
+  <el-dialog title="鐢ㄦ埛瀵煎叆" v-model="dialogVisible" width="600px" append-to-body @close="closeDialog"
+  >
+    <el-form label-width="80px">
+      <el-form-item label="涓嬭浇妯℃澘">
+        <el-link type="primary" @click="downLoad">浼佷笟淇℃伅瀵煎叆妯℃澘.xlsx</el-link>
+      </el-form-item>
+      <el-form-item label="閫夊彇鏂囦欢">
+        <FileUpload :limit="1" :fileType="['cvs', 'xlsx']" v-model="form.exportNews.file"></FileUpload>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" plain @click="startExport">寮�濮嬪鍏�</el-button>
+      </el-form-item>
+    </el-form>
+  </el-dialog>
+</template>
+
+<script lang="ts" setup>
+import { ref } from 'vue'
+import { ElMessageBox } from 'element-plus'
+import FileUpload from '@/components/FileUpload/index'
+import { downloadGet  as downloadHttp} from '@/utils/request'
+import { downTemplate, importTemplate } from '@/api/system/company/company'
+const { proxy } = getCurrentInstance();
+const dialogVisible = ref(false)
+const form = reactive({
+  exportNews: {}
+})
+function openDialog() {
+  dialogVisible.value = true
+}
+
+function cloaseDialog() {
+  dialogVisible.value = false
+}
+function downLoad() {
+  downTemplate().then(val => {
+    downloadHttp('/tool/file/download', {
+      fileName: val.msg,
+      delete: true
+    }, val.msg)
+  })
+}
+function startExport() {
+
+}
+defineExpose({
+  openDialog,
+  cloaseDialog
+})
+</script>
+<style scoped>
+.dialog-footer button:first-child {
+  margin-right: 10px;
+}
+</style>
diff --git a/src/views/infomanger/companymanger/components/exportRecord.vue b/src/views/infomanger/companymanger/components/exportRecord.vue
new file mode 100644
index 0000000..bc4196d
--- /dev/null
+++ b/src/views/infomanger/companymanger/components/exportRecord.vue
@@ -0,0 +1,32 @@
+<template>
+   <el-dialog title="瀵煎叆璁板綍" v-model="dialogVisible" width="1200px" append-to-body @close="closeDialog"
+  >
+    <el-table>
+      <el-table-column label="搴忓彿"></el-table-column>
+      <el-table-column label="瀵煎叆鏂囦欢"></el-table-column>
+      <el-table-column label="瀵煎叆浜�"></el-table-column>
+      <el-table-column label="瀵煎叆鏃堕棿"></el-table-column>
+      <el-table-column label="杩涘害"></el-table-column>
+      <el-table-column label="瀵煎叆缁撴灉"></el-table-column>
+      <el-table-column label="瀵煎叆缁撴灉鏂囦欢"></el-table-column>
+    </el-table>
+  </el-dialog>
+</template>
+
+<script setup lang="ts">
+import { importTemplateRecord } from '@/api/system/company/company'
+const dialogVisible = ref(false)
+const closeDialog = () => {
+  dialogVisible.value = false
+}
+const openDialog = () => {
+  dialogVisible.value = true
+}
+function importTemplateRecord() {
+  console.log('鑾峰彇瀵煎叆璁板綍')
+}
+defineExpose({
+  openDialog,
+  closeDialog
+})
+</script>
\ No newline at end of file
diff --git a/src/views/infomanger/companymanger/index.vue b/src/views/infomanger/companymanger/index.vue
new file mode 100644
index 0000000..97b7cf0
--- /dev/null
+++ b/src/views/infomanger/companymanger/index.vue
@@ -0,0 +1,330 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="80px">
+      <el-form-item label="浼佷笟鍚嶇О" prop="companyName">
+        <el-input v-model="queryParams.companyName" placeholder="璇疯緭鍏ヤ紒涓氬悕绉�" clearable style="width: 200px" @keyup.enter="handleQuery" />
+      </el-form-item>
+      <el-form-item label="浼佷笟缂栧彿" prop="companyCode">
+        <el-input v-model="queryParams.companyCode" placeholder="璇疯緭鍏ヤ紒涓氱紪鍙�" clearable style="width: 200px" @keyup.enter="handleQuery" />
+      </el-form-item>
+      <el-form-item label="浼佷笟绫诲瀷" prop="status">
+        <el-select v-model="queryParams.status" placeholder="浼佷笟绫诲瀷" clearable style="width: 200px">
+          <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鑱旂郴浜�" prop="companyUser">
+        <el-input v-model="queryParams.companyUser" placeholder="璇疯緭鍏ヨ仈绯讳汉" clearable style="width: 200px" @keyup.enter="handleQuery" />
+      </el-form-item>
+      <el-form-item label="鎵嬫満鍙�" prop="companyPhone">
+        <el-input v-model="queryParams.companyPhone" type="number" placeholder="璇疯緭鍏ユ墜鏈哄彿" clearable style="width: 200px" @keyup.enter="handleQuery" />
+      </el-form-item>
+      <el-form-item label="瀹℃牳" prop="checkStatus">
+        <el-select v-model="queryParams.checkStatus" placeholder="瀹℃牳绫诲瀷" clearable style="width: 200px">
+          <el-option v-for="dict in options.checkOptions" :key="dict.value" :label="dict.label" :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鐘舵��" prop="companyStatus">
+        <el-select v-model="queryParams.companyStatus" placeholder="鐘舵��" clearable style="width: 200px">
+          <el-option v-for="dict in options.companyStatus" :key="dict.value" :label="dict.label" :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button type="primary" plain icon="Plus" @click="handleAdd()" v-hasPermi="['system:dept:add']">鏂板</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="primary" plain icon="Plus" @click="exportExcel" v-hasPermi="['system:dept:add']">瀵煎叆</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="primary" plain icon="Plus" @click="exportRecordComOpen" v-hasPermi="['system:dept:add']">瀵煎叆璁板綍</el-button>
+      </el-col>
+      <!-- <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> -->
+    </el-row>
+
+    <el-table
+      v-if="refreshTable"
+      v-loading="loading"
+      :data="deptList"
+      row-key="deptId"
+      :default-expand-all="isExpandAll"
+      :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
+    >
+      <el-table-column  prop="companyName" label="浼佷笟鍚嶇О" minWidth="300"></el-table-column>
+      <el-table-column prop="companyName" label="浼佷笟绫诲瀷" width="200"></el-table-column>
+      <el-table-column prop="companyUser" label="鑱旂郴浜�" width="180"></el-table-column>
+      <el-table-column prop="companyPhone" label="鎵嬫満鍙风爜" width="120"></el-table-column>
+      <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" width="200"></el-table-column>
+      <el-table-column prop="" label="鏉ユ簮" width="100">
+        <template #default="scope">
+          {{ scopeList[scope.row.isImport] }}
+        </template>
+      </el-table-column>
+      <el-table-column prop="checkStatus" label="瀹℃牳" width="100">
+        <template #default="scope">
+          {{ judgeStatus[scope.row.checkStatus] }}
+        </template>
+      </el-table-column>
+      <el-table-column prop="companyStatus" label="鐘舵��" width="100">
+        <template #default="scope">
+          <!-- {{ companyStatus[scope.row.companyStatus] }} -->
+            <el-switch v-if="scope.row.companyId" v-model="scope.row.companyStatus" @change="changeCompanyNews(scope.row, $event)" :active-value="1" :inactive-value="0"></el-switch>
+        </template>
+      </el-table-column>
+      
+      <el-table-column label="鎿嶄綔" align="center" fixed="right" class-name="small-padding fixed-width" width="240">
+        <template #default="scope">
+          <el-link type="primary">瀹℃牳</el-link>
+          <el-divider direction="vertical" />
+          <el-link type="primary">浜岀淮鐮�</el-link>
+          <el-divider direction="vertical" />
+          <el-link type="primary" @click="handleAdd(scope.row)">缂栬緫</el-link>
+          <el-divider direction="vertical" />
+          <el-link type="primary">鍒犻櫎</el-link>
+         </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="queryParams.total > 0" :total="queryParams.total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+
+    <!-- 娣诲姞鎴栦慨鏀瑰璇濇 -->
+    <el-dialog :title="title" v-model="open" width="600px" append-to-body>
+      <el-form ref="deptRef" :model="form" :rules="rules" label-width="140px">
+        <el-form-item label="浼佷笟鍚嶇О" prop="companyName">
+          <el-input placeholder="璇疯緭鍏ヤ紒涓氬悕绉�" v-model="form.companyName"></el-input>
+        </el-form-item>
+        <el-form-item label="鑱旂郴浜�"  prop="companyUser">
+          <el-input placeholder="璇疯緭鍏ヨ仈绯讳汉" v-model="form.companyUser"></el-input>
+        </el-form-item>
+        <el-form-item label="鎵嬫満鍙风爜" prop="companyPhone">
+          <el-input placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" v-model="form.companyPhone"></el-input>
+        </el-form-item>
+        <el-form-item label="缁熶竴绀句細淇$敤浠g爜" prop="companyCode">
+          <el-input placeholder="璇疯緭鍏ョ粺涓�绀句細淇$敤浠g爜" v-model="form.companyCode"></el-input>
+        </el-form-item>
+        <el-form-item label="钀ヤ笟鎵х収" prop="companyImg">
+          <!-- <el-input placeholder="璇疯緭鍏ヨ惀涓氭墽鐓�"  v-model="form.companyImg"></el-input> -->
+          <FileUpload :limit="1" :fileType="['png', 'jpg', 'jpeg']" v-model="form.companyImg"></FileUpload>
+        </el-form-item>
+        <el-form-item label="浼佷笟鍦板潃" prop="companyAddress">
+          <el-input placeholder="璇疯緭鍏ヤ紒涓氬湴鍧�"  v-model="form.companyAddress"></el-input>
+        </el-form-item>
+        <el-form-item label="鐘舵��">
+          <el-switch v-model="form.companyStatus" :active-value="1" :inactive-value="0"></el-switch>
+        </el-form-item>
+        <el-form-item label="澶囨敞">
+          <el-input placeholder="璇疯緭鍏ュ娉�" v-model="form.remark"></el-input>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+          <el-button @click="cancel">鍙� 娑�</el-button>
+        </div>
+      </template>
+    </el-dialog>
+    <exportExcelCom ref="exporttem"></exportExcelCom>
+    <exportRecord ref="exportRecordCom"></exportRecord>
+  </div>
+</template>
+
+<script setup name="Dept">
+import FileUpload from '@/components/FileUpload/index'
+import exportRecord from './components/exportRecord'
+import { listCompany,addCompany, updateCompany } from "@/api/system/company/company";
+import exportExcelCom from './components/export'
+import { computed } from "vue";
+import { judgeStatus, companyStatus, scopeList } from '@/utils/mapList/index.ts'
+import useSettingsStore from "@/store/modules/settings";
+const thcolor = computed(() => useSettingsStore().theme);
+const { proxy } = getCurrentInstance();
+const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
+const deptList = ref([]);
+const open = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const title = ref("");
+const deptOptions = ref([]);
+const isExpandAll = ref(false);
+const refreshTable = ref(true);
+const exporttem = ref()
+const exportRecordCom = ref()
+const options = reactive({
+  // -1鎷掔粷锛�0寰呭鎵癸紝1瀹℃壒涓紝2閫氳繃	
+  checkOptions: [
+    {
+      label: '鎷掔粷',
+      value: -1
+    },
+    {
+      label: '寰呭鎵�',
+      value: 0
+    },
+    {
+      label: '瀹℃壒涓�',
+      value: 1
+    },
+    {
+      label: '閫氳繃',
+      value: 2
+    }
+  ],
+  companyStatus: [
+  {
+      label: '姝e父',
+      value: 1
+    },
+    {
+      label: '绂佺敤',
+      value: 0
+    },
+  ],
+  socreList: [
+  {
+      label: '瀵煎叆',
+      value: 1
+    },
+    {
+      label: '娉ㄥ唽',
+      value: 0
+    },
+  ]
+})
+const data = reactive({
+  form: {},
+  queryParams: {
+    deptName: undefined,
+    status: undefined,
+    deptType: undefined,
+    pageNum: 1,
+    pageSize: 10,
+    total: 1
+  },
+  rules: {
+    companyName: [{ required: true, message: "浼佷笟鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }],
+    companyUser: [{ required: true, message: "鑱旂郴浜轰笉鑳戒负绌�", trigger: "blur" }],
+    companyPhone: [{ required: true, message: "鎵嬫満鍙风爜涓嶈兘涓虹┖", trigger: "blur" }, {
+      pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜", trigger: "blur"
+    }],
+    companyCode: [{ required: true, message: "缁熶竴绀句細淇$敤浠g爜涓嶈兘涓虹┖", trigger: "blur" }],
+    companyImg: [{ required: true, message: "钀ヤ笟鎵х収涓嶈兘涓虹┖", trigger: "blur" }],
+    companyAddress: [{ required: true, message: "浼佷笟鍦板潃涓嶈兘涓虹┖", trigger: "blur" }],
+
+    // email: [{ type: "email", message: "璇疯緭鍏ユ纭殑閭鍦板潃", trigger: ["blur", "change"] }],
+    // phone: [{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜", trigger: "blur" }],
+  },
+});
+
+const { queryParams, form, rules } = toRefs(data);
+// const dispDeptType = computed(() => (e) => {
+//   return dept_type.value.find((f) => f.value == e).label;
+// });
+
+/** 鏌ヨ浼佷笟鍒楄〃 */
+function getList() {
+  loading.value = true;
+  listCompany(queryParams.value).then((response) => {
+    deptList.value = response.rows
+    data.queryParams.total = response.total
+    loading.value = false;
+  });
+}
+/** 鍙栨秷鎸夐挳 */
+function cancel() {
+  open.value = false;
+  reset();
+}
+/** 琛ㄥ崟閲嶇疆 */
+function reset() {
+  form.value = {
+    deptId: undefined,
+    parentId: undefined,
+    deptName: undefined,
+    orderNum: 0,
+    leader: undefined,
+    phone: undefined,
+    email: undefined,
+    status: "0",
+    deptType: undefined,
+  };
+  proxy.resetForm("deptRef");
+}
+const queryRef = ref()
+/** 鎼滅储鎸夐挳鎿嶄綔 */
+function handleQuery() {
+  getList();
+}
+/** 閲嶇疆鎸夐挳鎿嶄綔 */
+function resetQuery() {
+  queryRef.value.resetFields();
+  handleQuery();
+}
+/** 鏂板鎸夐挳鎿嶄綔 */
+function handleAdd(row) {
+  if(row) {
+    form.value = row
+    title.value = "缂栬緫浼佷笟";
+  } else {
+    form.value = {}
+    title.value = "娣诲姞浼佷笟";
+  }
+  open.value = true;
+}
+
+/** 鎻愪氦鎸夐挳 */
+function submitForm() {
+  proxy.$refs["deptRef"].validate((valid) => {
+    if (valid) {
+      if (form.value.companyId != undefined) {
+        updateCompany(form.value).then((response) => {
+          proxy.$modal.msgSuccess("淇敼鎴愬姛");
+          open.value = false;
+          getList();
+        });
+      } else {
+        addCompany(form.value).then((response) => {
+          proxy.$modal.msgSuccess("鏂板鎴愬姛");
+          open.value = false;
+          getList();
+        });
+      }
+    }
+  });
+}
+/** 鍒犻櫎鎸夐挳鎿嶄綔 */
+function handleDelete(row) {
+  proxy.$modal
+    .confirm('鏄惁纭鍒犻櫎鍚嶇О涓�"' + row.deptName + '"鐨勬暟鎹」?')
+    .then(function () {
+      return delDept(row.deptId);
+    })
+    .then(() => {
+      getList();
+      proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+    })
+    .catch(() => {});
+}
+// 淇敼浼佷笟淇℃伅
+function changeCompanyNews(row, event) {
+  if(loading.value){
+    return
+  }
+  updateCompany(row).then(val => {
+    proxy.$modal.msgSuccess("淇敼鎴愬姛");
+    getList();
+  })
+}
+// 瀵煎叆妯℃澘
+function exportExcel() {
+  exporttem.value.openDialog()
+}
+// 瀵煎叆璁板綍
+function exportRecordComOpen() {
+  exportRecordCom.value.openDialog()
+}
+getList();
+</script>
diff --git a/src/views/infomanger/policy/components/addNews.vue b/src/views/infomanger/policy/components/addNews.vue
new file mode 100644
index 0000000..d929589
--- /dev/null
+++ b/src/views/infomanger/policy/components/addNews.vue
@@ -0,0 +1,42 @@
+<!-- 鏂板鏀跨瓥 -->
+<template>
+  <el-dialog title="鐢ㄦ埛瀵煎叆" v-model="dialogVisible" width="600px" append-to-body @close="closeDialog">
+    <el-form>
+      <el-form-item>
+        <el-select>
+          <el-option></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-input></el-input>
+      </el-form-item>
+      <el-form-item>
+        <div>鍐呭</div>
+      </el-form-item>
+      <el-form-item label="鐘舵��" prop="docStatus">
+        <el-switch v-model="form.docStatus"></el-switch>
+      </el-form-item>
+    </el-form>
+</el-dialog>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      dialogVisible: false,
+      form: {
+
+      }
+    }
+  },
+  methods: {
+    closeDialog() {
+      this.dialogVisible = false
+    },
+    openDialog() {
+      this.dialogVisible = true
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/src/views/infomanger/policy/index.vue b/src/views/infomanger/policy/index.vue
new file mode 100644
index 0000000..fbcb569
--- /dev/null
+++ b/src/views/infomanger/policy/index.vue
@@ -0,0 +1,94 @@
+<template>
+  <div  class="app-container">
+    <el-form :inline="true" label-width="100px" :model="form">
+      <el-form-item label="鏀跨瓥鍚嶇О">
+        <el-input placeholder="璇疯緭鍏�" ></el-input>
+      </el-form-item>
+      <el-form-item label="鏀跨瓥绫诲瀷">
+        <el-select placeholder="璇烽�夋嫨" style="width: 200px;">
+          <el-option v-for="item in policyList" :label="item.label" :value="item.value"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鐘舵��">
+        <el-select placeholder="璇烽�夋嫨" style="width: 200px;">
+          <el-option v-for="item in statusList" :label="item.label" :value="item.value"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleSearch">鎼滅储</el-button>
+        <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button type="primary" plain icon="Plus" @click="handleAdd()" v-hasPermi="['system:dept:add']">鏂板</el-button>
+      </el-col>
+    </el-row>
+    <el-table :data="deptList">
+      <el-table-column label="鏀跨瓥鍚嶇О"></el-table-column>
+      <el-table-column label="鏀跨瓥绫诲瀷"></el-table-column>
+      <el-table-column label="鍒涘缓鏃堕棿"></el-table-column>
+      <el-table-column label="鍒涘缓浜�" width="200"></el-table-column>
+      <el-table-column label="鐘舵��" width="200"></el-table-column>
+      <el-table-column label="鎿嶄綔"></el-table-column>
+    </el-table>
+    <pagination v-show="queryParams.total > 0" :total="queryParams.total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+      <addNews ref="addnews"></addNews>
+   </div>
+</template>
+
+<script>
+import { docList } from '@/api/system/company/company'
+import addNews from './components/addNews'
+export default {
+  components: {
+    addNews
+  },
+  data() {
+    return {
+      policyList: [
+        {
+          label: '鎯犱紒鏀跨瓥',
+          value: 1
+        }
+      ],
+      statusList: [
+        {
+          label: '姝e父',
+          value: 0
+        },
+        {
+          label: '绂佺敤',
+          value: 1
+        },
+      ],
+      queryParams: {
+        total: 0,
+        pageNum: 1,
+        pageSize: 10
+      },
+      tableData: []
+    }
+  },
+  mounted() {
+    this.getList()
+  },
+  methods: {
+    // 鑾峰彇鍒楄〃
+    getList() {
+      docList(this.queryParams).then(res => {
+        this.tableData = res.rows
+        this.queryParams.total = res.total
+      })
+    },
+    // 鎼滅储
+    handleSearch() {
+      this.queryParams.pageNum = 1
+      this.getList()
+   },
+   handleAdd() {
+    this.$refs.addnews.openDialog()
+   }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/src/views/login.vue b/src/views/login.vue
index cca0f21..d6c43ae 100644
--- a/src/views/login.vue
+++ b/src/views/login.vue
@@ -96,7 +96,7 @@
       userStore
         .login(loginForm.value)
         .then(() => {
-          router.push({ path: redirect.value || "/" });
+          router.push({ path: redirect.value || "/home" });
         })
         .catch(() => {
           loading.value = false;
diff --git a/src/views/system/dict/index.vue b/src/views/system/dict/index.vue
index 33fa3c9..aae2c54 100644
--- a/src/views/system/dict/index.vue
+++ b/src/views/system/dict/index.vue
@@ -104,6 +104,11 @@
       <el-table v-loading="loading" :data="typeList" @selection-change="handleSelectionChange">
          <el-table-column type="selection" width="55" align="center" />
          <el-table-column label="瀛楀吀缂栧彿" align="center" prop="dictId" />
+         <el-table-column label="鏄惁鑷畾涔�" align="center" prop="isSystem" >
+            <template v-slot:default="scope">
+               {{ data.dicMap[scope.row.isSystem] }}
+            </template>
+         </el-table-column>
          <el-table-column label="瀛楀吀鍚嶇О" align="center" prop="dictName" :show-overflow-tooltip="true"/>
          <el-table-column label="瀛楀吀绫诲瀷" align="center" :show-overflow-tooltip="true">
             <template #default="scope">
@@ -147,6 +152,9 @@
             </el-form-item>
             <el-form-item label="瀛楀吀绫诲瀷" prop="dictType">
                <el-input v-model="form.dictType" placeholder="璇疯緭鍏ュ瓧鍏哥被鍨�" />
+            </el-form-item>
+            <el-form-item label="鑷畾涔�" prop="dictType">
+               <el-switch v-model="form.isSystem" :active-value="1" :inactive-value="0"></el-switch>
             </el-form-item>
             <el-form-item label="鐘舵��" prop="status">
                <el-radio-group v-model="form.status">
@@ -202,14 +210,22 @@
     dictName: [{ required: true, message: "瀛楀吀鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }],
     dictType: [{ required: true, message: "瀛楀吀绫诲瀷涓嶈兘涓虹┖", trigger: "blur" }]
   },
+//   瀛楀吀鏋氫妇
+  dicMap: {
+   1: '鏄�',
+   2:'鍚�'
+  },
+  isSystem: {
+   isSystem: 1
+  }
 });
 
-const { queryParams, form, rules } = toRefs(data);
+const { queryParams, form, rules, isSystem } = toRefs(data);
 
 /** 鏌ヨ瀛楀吀绫诲瀷鍒楄〃 */
 function getList() {
   loading.value = true;
-  listType(proxy.addDateRange(queryParams.value, dateRange.value)).then(response => {
+  listType({...proxy.addDateRange(queryParams.value, dateRange.value), isSystem: 1}).then(response => {
     typeList.value = response.rows;
     total.value = response.total;
     loading.value = false;
diff --git a/src/views/system/dictManger/data.vue b/src/views/system/dictManger/data.vue
new file mode 100644
index 0000000..b900666
--- /dev/null
+++ b/src/views/system/dictManger/data.vue
@@ -0,0 +1,350 @@
+<template>
+   <div class="app-container">
+      <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
+         <el-form-item label="瀛楀吀鍚嶇О" prop="dictType">
+            <el-select v-model="queryParams.dictType" style="width: 200px">
+               <el-option
+                  v-for="item in typeOptions"
+                  :key="item.dictId"
+                  :label="item.dictName"
+                  :value="item.dictType"
+               />
+            </el-select>
+         </el-form-item>
+         <el-form-item label="瀛楀吀鏍囩" prop="dictLabel">
+            <el-input
+               v-model="queryParams.dictLabel"
+               placeholder="璇疯緭鍏ュ瓧鍏告爣绛�"
+               clearable
+               style="width: 200px"
+               @keyup.enter="handleQuery"
+            />
+         </el-form-item>
+         <el-form-item label="鐘舵��" prop="status">
+            <el-select v-model="queryParams.status" placeholder="鏁版嵁鐘舵��" clearable style="width: 200px">
+               <el-option
+                  v-for="dict in sys_normal_disable"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+               />
+            </el-select>
+         </el-form-item>
+         <el-form-item>
+            <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
+            <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
+         </el-form-item>
+      </el-form>
+
+      <el-row :gutter="10" class="mb8">
+         <el-col :span="1.5">
+            <el-button
+               type="primary"
+               plain
+               icon="Plus"
+               @click="handleAdd"
+               v-hasPermi="['system:dict:add']"
+            >鏂板</el-button>
+         </el-col>
+         <el-col :span="1.5">
+            <el-button
+               type="success"
+               plain
+               icon="Edit"
+               :disabled="single"
+               @click="handleUpdate"
+               v-hasPermi="['system:dict:edit']"
+            >淇敼</el-button>
+         </el-col>
+         <el-col :span="1.5">
+            <el-button
+               type="danger"
+               plain
+               icon="Delete"
+               :disabled="multiple"
+               @click="handleDelete"
+               v-hasPermi="['system:dict:remove']"
+            >鍒犻櫎</el-button>
+         </el-col>
+         <el-col :span="1.5">
+            <el-button
+               type="warning"
+               plain
+               icon="Download"
+               @click="handleExport"
+               v-hasPermi="['system:dict:export']"
+            >瀵煎嚭</el-button>
+         </el-col>
+         <el-col :span="1.5">
+            <el-button
+               type="warning"
+               plain
+               icon="Close"
+               @click="handleClose"
+            >鍏抽棴</el-button>
+         </el-col>
+         <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+      </el-row>
+
+      <el-table v-loading="loading" :data="dataList" @selection-change="handleSelectionChange">
+         <el-table-column type="selection" width="55" align="center" />
+         <el-table-column label="瀛楀吀缂栫爜" align="center" prop="dictCode" />
+         <el-table-column label="瀛楀吀鏍囩" align="center" prop="dictLabel">
+            <template #default="scope">
+               <span v-if="scope.row.listClass == '' || scope.row.listClass == 'default'">{{ scope.row.dictLabel }}</span>
+               <el-tag v-else :type="scope.row.listClass == 'primary' ? '' : scope.row.listClass">{{ scope.row.dictLabel }}</el-tag>
+            </template>
+         </el-table-column>
+         <el-table-column label="瀛楀吀閿��" align="center" prop="dictValue" />
+         <el-table-column label="瀛楀吀鎺掑簭" align="center" prop="dictSort" />
+         <el-table-column label="鐘舵��" align="center" prop="status">
+            <template #default="scope">
+               <dict-tag :options="sys_normal_disable" :value="scope.row.status" />
+            </template>
+         </el-table-column>
+         <el-table-column label="澶囨敞" align="center" prop="remark" :show-overflow-tooltip="true" />
+         <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180">
+            <template #default="scope">
+               <span>{{ parseTime(scope.row.createTime) }}</span>
+            </template>
+         </el-table-column>
+         <el-table-column label="鎿嶄綔" align="center" width="160" class-name="small-padding fixed-width">
+            <template #default="scope">
+               <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:dict:edit']">淇敼</el-button>
+               <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:dict:remove']">鍒犻櫎</el-button>
+            </template>
+         </el-table-column>
+      </el-table>
+
+      <pagination
+         v-show="total > 0"
+         :total="total"
+         v-model:page="queryParams.pageNum"
+         v-model:limit="queryParams.pageSize"
+         @pagination="getList"
+      />
+
+      <!-- 娣诲姞鎴栦慨鏀瑰弬鏁伴厤缃璇濇 -->
+      <el-dialog :title="title" v-model="open" width="500px" append-to-body>
+         <el-form ref="dataRef" :model="form" :rules="rules" label-width="80px">
+            <el-form-item label="瀛楀吀绫诲瀷">
+               <el-input v-model="form.dictType" :disabled="true" />
+            </el-form-item>
+            <el-form-item label="鏁版嵁鏍囩" prop="dictLabel">
+               <el-input v-model="form.dictLabel" placeholder="璇疯緭鍏ユ暟鎹爣绛�" />
+            </el-form-item>
+            <el-form-item label="鏁版嵁閿��" prop="dictValue">
+               <el-input v-model="form.dictValue" placeholder="璇疯緭鍏ユ暟鎹敭鍊�" />
+            </el-form-item>
+            <el-form-item label="鏍峰紡灞炴��" prop="cssClass">
+               <el-input v-model="form.cssClass" placeholder="璇疯緭鍏ユ牱寮忓睘鎬�" />
+            </el-form-item>
+            <el-form-item label="鏄剧ず鎺掑簭" prop="dictSort">
+               <el-input-number v-model="form.dictSort" controls-position="right" :min="0" />
+            </el-form-item>
+            <el-form-item label="鍥炴樉鏍峰紡" prop="listClass">
+               <el-select v-model="form.listClass">
+                  <el-option
+                     v-for="item in listClassOptions"
+                     :key="item.value"
+                     :label="item.label + '(' + item.value + ')'"
+                     :value="item.value"
+                  ></el-option>
+               </el-select>
+            </el-form-item>
+            <el-form-item label="鐘舵��" prop="status">
+               <el-radio-group v-model="form.status">
+                  <el-radio
+                     v-for="dict in sys_normal_disable"
+                     :key="dict.value"
+                     :label="dict.value"
+                  >{{ dict.label }}</el-radio>
+               </el-radio-group>
+            </el-form-item>
+            <el-form-item label="澶囨敞" prop="remark">
+               <el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�"></el-input>
+            </el-form-item>
+         </el-form>
+         <template #footer>
+            <div class="dialog-footer">
+               <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+               <el-button @click="cancel">鍙� 娑�</el-button>
+            </div>
+         </template>
+      </el-dialog>
+   </div>
+</template>
+
+<script setup name="Data">
+import useDictStore from '@/store/modules/dict'
+import { optionselect as getDictOptionselect, getType } from "@/api/system/dict/type";
+import { listData, getData, delData, addData, updateData } from "@/api/system/dict/data";
+
+const { proxy } = getCurrentInstance();
+const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
+
+const dataList = ref([]);
+const open = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const title = ref("");
+const defaultDictType = ref("");
+const typeOptions = ref([]);
+const route = useRoute();
+// 鏁版嵁鏍囩鍥炴樉鏍峰紡
+const listClassOptions = ref([
+  { value: "default", label: "榛樿" }, 
+  { value: "primary", label: "涓昏" }, 
+  { value: "success", label: "鎴愬姛" },
+  { value: "info", label: "淇℃伅" },
+  { value: "warning", label: "璀﹀憡" },
+  { value: "danger", label: "鍗遍櫓" }
+]);
+
+const data = reactive({
+  form: {},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    dictName: undefined,
+    dictType: undefined,
+    status: undefined
+  },
+  rules: {
+    dictLabel: [{ required: true, message: "鏁版嵁鏍囩涓嶈兘涓虹┖", trigger: "blur" }],
+    dictValue: [{ required: true, message: "鏁版嵁閿�间笉鑳戒负绌�", trigger: "blur" }],
+    dictSort: [{ required: true, message: "鏁版嵁椤哄簭涓嶈兘涓虹┖", trigger: "blur" }]
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 鏌ヨ瀛楀吀绫诲瀷璇︾粏 */
+function getTypes(dictId) {
+  getType(dictId).then(response => {
+    queryParams.value.dictType = response.data.dictType;
+    defaultDictType.value = response.data.dictType;
+    getList();
+  });
+}
+
+/** 鏌ヨ瀛楀吀绫诲瀷鍒楄〃 */
+function getTypeList() {
+  getDictOptionselect().then(response => {
+    typeOptions.value = response.data;
+  });
+}
+/** 鏌ヨ瀛楀吀鏁版嵁鍒楄〃 */
+function getList() {
+  loading.value = true;
+  listData(queryParams.value).then(response => {
+    dataList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+/** 鍙栨秷鎸夐挳 */
+function cancel() {
+  open.value = false;
+  reset();
+}
+/** 琛ㄥ崟閲嶇疆 */
+function reset() {
+  form.value = {
+    dictCode: undefined,
+    dictLabel: undefined,
+    dictValue: undefined,
+    cssClass: undefined,
+    listClass: "default",
+    dictSort: 0,
+    status: "0",
+    remark: undefined
+  };
+  proxy.resetForm("dataRef");
+}
+/** 鎼滅储鎸夐挳鎿嶄綔 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+/** 杩斿洖鎸夐挳鎿嶄綔 */
+function handleClose() {
+  const obj = { path: "/system/dict" };
+  proxy.$tab.closeOpenPage(obj);
+}
+/** 閲嶇疆鎸夐挳鎿嶄綔 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  queryParams.value.dictType = defaultDictType;
+  handleQuery();
+}
+/** 鏂板鎸夐挳鎿嶄綔 */
+function handleAdd() {
+  reset();
+  open.value = true;
+  title.value = "娣诲姞瀛楀吀鏁版嵁";
+  form.value.dictType = queryParams.value.dictType;
+}
+/** 澶氶�夋閫変腑鏁版嵁 */
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.dictCode);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+/** 淇敼鎸夐挳鎿嶄綔 */
+function handleUpdate(row) {
+  reset();
+  const dictCode = row.dictCode || ids.value;
+  getData(dictCode).then(response => {
+    form.value = response.data;
+    open.value = true;
+    title.value = "淇敼瀛楀吀鏁版嵁";
+  });
+}
+/** 鎻愪氦鎸夐挳 */
+function submitForm() {
+  proxy.$refs["dataRef"].validate(valid => {
+    if (valid) {
+      if (form.value.dictCode != undefined) {
+        updateData(form.value).then(response => {
+          useDictStore().removeDict(queryParams.value.dictType);
+          proxy.$modal.msgSuccess("淇敼鎴愬姛");
+          open.value = false;
+          getList();
+        });
+      } else {
+        addData(form.value).then(response => {
+          useDictStore().removeDict(queryParams.value.dictType);
+          proxy.$modal.msgSuccess("鏂板鎴愬姛");
+          open.value = false;
+          getList();
+        });
+      }
+    }
+  });
+}
+/** 鍒犻櫎鎸夐挳鎿嶄綔 */
+function handleDelete(row) {
+  const dictCodes = row.dictCode || ids.value;
+  proxy.$modal.confirm('鏄惁纭鍒犻櫎瀛楀吀缂栫爜涓�"' + dictCodes + '"鐨勬暟鎹」锛�').then(function() {
+    return delData(dictCodes);
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+    useDictStore().removeDict(queryParams.value.dictType);
+  }).catch(() => {});
+}
+/** 瀵煎嚭鎸夐挳鎿嶄綔 */
+function handleExport() {
+  proxy.download("system/dict/data/export", {
+    ...queryParams.value
+  }, `dict_data_${new Date().getTime()}.xlsx`);
+}
+
+getTypes(route.params && route.params.dictId);
+getTypeList();
+</script>
diff --git a/src/views/system/dictManger/index.vue b/src/views/system/dictManger/index.vue
new file mode 100644
index 0000000..18f99df
--- /dev/null
+++ b/src/views/system/dictManger/index.vue
@@ -0,0 +1,315 @@
+<template>
+   <div class="app-container">
+      <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+         <el-form-item label="瀛楀吀鍚嶇О" prop="dictName">
+            <el-input
+               v-model="queryParams.dictName"
+               placeholder="璇疯緭鍏ュ瓧鍏稿悕绉�"
+               clearable
+               style="width: 240px"
+               @keyup.enter="handleQuery"
+            />
+         </el-form-item>
+         <el-form-item label="瀛楀吀绫诲瀷" prop="dictType">
+            <el-input
+               v-model="queryParams.dictType"
+               placeholder="璇疯緭鍏ュ瓧鍏哥被鍨�"
+               clearable
+               style="width: 240px"
+               @keyup.enter="handleQuery"
+            />
+         </el-form-item>
+         <el-form-item label="鐘舵��" prop="status">
+            <el-select
+               v-model="queryParams.status"
+               placeholder="瀛楀吀鐘舵��"
+               clearable
+               style="width: 240px"
+            >
+               <el-option
+                  v-for="dict in sys_normal_disable"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+               />
+            </el-select>
+         </el-form-item>
+         <el-form-item label="鍒涘缓鏃堕棿" style="width: 308px">
+            <el-date-picker
+               v-model="dateRange"
+               value-format="YYYY-MM-DD"
+               type="daterange"
+               range-separator="-"
+               start-placeholder="寮�濮嬫棩鏈�"
+               end-placeholder="缁撴潫鏃ユ湡"
+            ></el-date-picker>
+         </el-form-item>
+         <el-form-item>
+            <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
+            <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
+         </el-form-item>
+      </el-form>
+
+      <el-row :gutter="10" class="mb8">
+         <el-col :span="1.5">
+            <el-button
+               type="primary"
+               plain
+               icon="Plus"
+               @click="handleAdd"
+               v-hasPermi="['system:dict:add']"
+            >鏂板</el-button>
+         </el-col>
+         <el-col :span="1.5">
+            <el-button
+               type="success"
+               plain
+               icon="Edit"
+               :disabled="single"
+               @click="handleUpdate"
+               v-hasPermi="['system:dict:edit']"
+            >淇敼</el-button>
+         </el-col>
+         <el-col :span="1.5">
+            <el-button
+               type="danger"
+               plain
+               icon="Delete"
+               :disabled="multiple"
+               @click="handleDelete"
+               v-hasPermi="['system:dict:remove']"
+            >鍒犻櫎</el-button>
+         </el-col>
+         <el-col :span="1.5">
+            <el-button
+               type="warning"
+               plain
+               icon="Download"
+               @click="handleExport"
+               v-hasPermi="['system:dict:export']"
+            >瀵煎嚭</el-button>
+         </el-col>
+         <el-col :span="1.5">
+            <el-button
+               type="danger"
+               plain
+               icon="Refresh"
+               @click="handleRefreshCache"
+               v-hasPermi="['system:dict:remove']"
+            >鍒锋柊缂撳瓨</el-button>
+         </el-col>
+         <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+      </el-row>
+
+      <el-table v-loading="loading" :data="typeList" @selection-change="handleSelectionChange">
+         <el-table-column type="selection" width="55" align="center" />
+         <el-table-column label="瀛楀吀缂栧彿" align="center" prop="dictId" />
+         <el-table-column label="瀛楀吀鍚嶇О" align="center" prop="dictName" :show-overflow-tooltip="true"/>
+         <el-table-column label="瀛楀吀绫诲瀷" align="center" :show-overflow-tooltip="true">
+            <template #default="scope">
+               <router-link :to="'/system/dict-data/index/' + scope.row.dictId" class="link-type">
+                  <span>{{ scope.row.dictType }}</span>
+               </router-link>
+            </template>
+         </el-table-column>
+         <el-table-column label="鐘舵��" align="center" prop="status">
+            <template #default="scope">
+               <dict-tag :options="sys_normal_disable" :value="scope.row.status" />
+            </template>
+         </el-table-column>
+         <el-table-column label="澶囨敞" align="center" prop="remark" :show-overflow-tooltip="true" />
+         <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180">
+            <template #default="scope">
+               <span>{{ parseTime(scope.row.createTime) }}</span>
+            </template>
+         </el-table-column>
+         <el-table-column label="鎿嶄綔" align="center" width="160" class-name="small-padding fixed-width">
+            <template #default="scope">
+               <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:dict:edit']">淇敼</el-button>
+               <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:dict:remove']">鍒犻櫎</el-button>
+            </template>
+         </el-table-column>
+      </el-table>
+
+      <pagination
+         v-show="total > 0"
+         :total="total"
+         v-model:page="queryParams.pageNum"
+         v-model:limit="queryParams.pageSize"
+         @pagination="getList"
+      />
+
+      <!-- 娣诲姞鎴栦慨鏀瑰弬鏁伴厤缃璇濇 -->
+      <el-dialog :title="title" v-model="open" width="500px" append-to-body>
+         <el-form ref="dictRef" :model="form" :rules="rules" label-width="80px">
+            <el-form-item label="瀛楀吀鍚嶇О" prop="dictName">
+               <el-input v-model="form.dictName" placeholder="璇疯緭鍏ュ瓧鍏稿悕绉�" />
+            </el-form-item>
+            <el-form-item label="瀛楀吀绫诲瀷" prop="dictType">
+               <el-input v-model="form.dictType" placeholder="璇疯緭鍏ュ瓧鍏哥被鍨�" />
+            </el-form-item>
+            <el-form-item label="鐘舵��" prop="status">
+               <el-radio-group v-model="form.status">
+                  <el-radio
+                     v-for="dict in sys_normal_disable"
+                     :key="dict.value"
+                     :label="dict.value"
+                  >{{ dict.label }}</el-radio>
+               </el-radio-group>
+            </el-form-item>
+            <el-form-item label="澶囨敞" prop="remark">
+               <el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�"></el-input>
+            </el-form-item>
+         </el-form>
+         <template #footer>
+            <div class="dialog-footer">
+               <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+               <el-button @click="cancel">鍙� 娑�</el-button>
+            </div>
+         </template>
+      </el-dialog>
+   </div>
+</template>
+
+<script setup name="Dict">
+import useDictStore from '@/store/modules/dict'
+import { listType, getType, delType, addType, updateType, refreshCache } from "@/api/system/dict/type";
+
+const { proxy } = getCurrentInstance();
+const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
+
+const typeList = ref([]);
+const open = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const title = ref("");
+const dateRange = ref([]);
+
+const data = reactive({
+  form: {},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    dictName: undefined,
+    dictType: undefined,
+    status: undefined
+  },
+  rules: {
+    dictName: [{ required: true, message: "瀛楀吀鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }],
+    dictType: [{ required: true, message: "瀛楀吀绫诲瀷涓嶈兘涓虹┖", trigger: "blur" }]
+  },
+  isSystem: {
+   isSystem: 0
+  }
+});
+
+const { queryParams, form, rules, isSystem } = toRefs(data);
+
+/** 鏌ヨ瀛楀吀绫诲瀷鍒楄〃 */
+function getList() {
+  loading.value = true;
+  listType({...proxy.addDateRange(queryParams.value, dateRange.value), isSystem: 0}).then(response => {
+    typeList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+/** 鍙栨秷鎸夐挳 */
+function cancel() {
+  open.value = false;
+  reset();
+}
+/** 琛ㄥ崟閲嶇疆 */
+function reset() {
+  form.value = {
+    dictId: undefined,
+    dictName: undefined,
+    dictType: undefined,
+    status: "0",
+    remark: undefined
+  };
+  proxy.resetForm("dictRef");
+}
+/** 鎼滅储鎸夐挳鎿嶄綔 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+/** 閲嶇疆鎸夐挳鎿嶄綔 */
+function resetQuery() {
+  dateRange.value = [];
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+/** 鏂板鎸夐挳鎿嶄綔 */
+function handleAdd() {
+  reset();
+  open.value = true;
+  title.value = "娣诲姞瀛楀吀绫诲瀷";
+}
+/** 澶氶�夋閫変腑鏁版嵁 */
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.dictId);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+/** 淇敼鎸夐挳鎿嶄綔 */
+function handleUpdate(row) {
+  reset();
+  const dictId = row.dictId || ids.value;
+  getType(dictId).then(response => {
+    form.value = response.data;
+    open.value = true;
+    title.value = "淇敼瀛楀吀绫诲瀷";
+  });
+}
+/** 鎻愪氦鎸夐挳 */
+function submitForm() {
+  proxy.$refs["dictRef"].validate(valid => {
+    if (valid) {
+      if (form.value.dictId != undefined) {
+        updateType(form.value).then(response => {
+          proxy.$modal.msgSuccess("淇敼鎴愬姛");
+          open.value = false;
+          getList();
+        });
+      } else {
+        addType(form.value).then(response => {
+          proxy.$modal.msgSuccess("鏂板鎴愬姛");
+          open.value = false;
+          getList();
+        });
+      }
+    }
+  });
+}
+/** 鍒犻櫎鎸夐挳鎿嶄綔 */
+function handleDelete(row) {
+  const dictIds = row.dictId || ids.value;
+  proxy.$modal.confirm('鏄惁纭鍒犻櫎瀛楀吀缂栧彿涓�"' + dictIds + '"鐨勬暟鎹」锛�').then(function() {
+    return delType(dictIds);
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+  }).catch(() => {});
+}
+/** 瀵煎嚭鎸夐挳鎿嶄綔 */
+function handleExport() {
+  proxy.download("system/dict/type/export", {
+    ...queryParams.value
+  }, `dict_${new Date().getTime()}.xlsx`);
+}
+/** 鍒锋柊缂撳瓨鎸夐挳鎿嶄綔 */
+function handleRefreshCache() {
+  refreshCache().then(() => {
+    proxy.$modal.msgSuccess("鍒锋柊鎴愬姛");
+    useDictStore().cleanDict();
+  });
+}
+
+getList();
+</script>

--
Gitblit v1.9.1