zhuangyunsheng před 1 rokem
rodič
revize
d90fe46e90
48 změnil soubory, kde provedl 1515 přidání a 888 odebrání
  1. 1 4
      .env
  2. 3 2
      .env.development
  3. 1 1
      index.html
  4. binární
      public/yh.ico
  5. 98 0
      src/api/policy/case.js
  6. binární
      src/assets/images/loading-logo-old.png
  7. binární
      src/assets/images/menu_img.png
  8. binární
      src/assets/images/welcomebg1.png
  9. binární
      src/assets/images/welcomebg2.png
  10. binární
      src/assets/images/welcomelogo.png
  11. 1 0
      src/assets/svg/caseShare.svg
  12. 1 0
      src/assets/svg/fileExcel.svg
  13. binární
      src/assets/video/loginBackground.mp4
  14. 1 1
      src/components/IconSelect/index.vue
  15. 7 2
      src/components/Upload/index.vue
  16. 0 1
      src/components/Upload/tableImport.vue
  17. 0 2
      src/config/config.js
  18. 1 2
      src/layout/components/Logo/index.vue
  19. 3 4
      src/layout/components/NavBar/index.vue
  20. 113 106
      src/store/permission.js
  21. 0 1
      src/store/user.js
  22. 212 0
      src/views/caseShare/dialog.vue
  23. 193 0
      src/views/caseShare/index.vue
  24. 22 0
      src/views/caseShare/main.js
  25. 181 0
      src/views/caseShare/strive.vue
  26. 2 528
      src/views/home/home.vue
  27. 126 123
      src/views/login/index.vue
  28. 10 7
      src/views/manage/policyShare/dialog.vue
  29. 5 5
      src/views/manage/policyShare/index.vue
  30. 12 6
      src/views/manage/policyStrive/index.vue
  31. 0 7
      src/views/manage/policyStrive/main.js
  32. 4 4
      src/views/manage/policyStrive/scoreDialog.vue
  33. 4 3
      src/views/policyShare/dialog.vue
  34. 10 11
      src/views/policyShare/index.vue
  35. 2 2
      src/views/policyShare/main.js
  36. 5 5
      src/views/policyStrive/dialog.vue
  37. 1 1
      src/views/policyStrive/explain.vue
  38. 13 13
      src/views/policyStrive/index.vue
  39. 2 2
      src/views/policyStrive/main.js
  40. 5 5
      src/views/publicDomain/index.vue
  41. 2 2
      src/views/publicDomain/link.vue
  42. 2 2
      src/views/system/menu.vue
  43. 2 2
      src/views/system/role.vue
  44. 55 0
      src/views/system/template/index.vue
  45. 182 0
      src/views/toDo/case.vue
  46. 17 26
      src/views/toDo/index.vue
  47. 2 8
      src/views/toDo/share.vue
  48. 214 0
      src/views/toDo/strive.vue

+ 1 - 4
.env

@@ -4,7 +4,4 @@
 VITE_APP_CODE = "TJM_VUE3_ELEPLUS_ADMIN"
 
 # 项目名
-VITE_APP_NAME = "玉衡平台"
-
-# 项目描述
-VITE_APP_DESCRIPTION = "玉衡框架vue3版本,提供基础服务"
+VITE_APP_NAME = "政策信息共享平台"

+ 3 - 2
.env.development

@@ -11,10 +11,11 @@ VITE_BASE_URL = "/dev-api"
 VITE_BASE_MOCK_URL = "/mock-api"
 
 # boot服务端接口路径
-VITE_BASE_SERVER_URL = "http://192.168.101.93:8000"
+# VITE_BASE_SERVER_URL = "http://192.168.101.93:8000"
+# VITE_BASE_SERVER_URL = "http://10.236.2.146:8080/dev-api" # 线上
 # VITE_BASE_SERVER_URL = "http://10.206.20.153:8000" # 青岛港-内网
 # VITE_BASE_SERVER_URL = "http://192.168.43.231:8000" # 热点
-# VITE_BASE_SERVER_URL = "http://192.168.1.133:8000" # 青岛港-7楼
+VITE_BASE_SERVER_URL = "http://192.168.1.133:8000" # 青岛港-7楼
 # 微前端-工作流
 VITE_WORKFLOW_URL = "http://localhost:1888/"
 # 微前端-代码生成器

+ 1 - 1
index.html

@@ -4,7 +4,7 @@
         <meta charset="UTF-8">
         <link rel="icon" href="/yh.ico">
         <meta name="viewport" content="width=device-width, initial-scale=1.0">
-        <title>玉衡-Admin</title>
+        <title>政策信息共享平台</title>
     </head>
     <body>
         <div id="app"></div>

binární
public/yh.ico


+ 98 - 0
src/api/policy/case.js

@@ -0,0 +1,98 @@
+import request from "@/utils/request";
+import { useUserStore } from "@/store/user";
+const { userInfo } = useUserStore(); // store 用户
+
+export default {
+    get: function (params) {
+        return request({
+            url: "/qdport-zcgx/case/page",
+            method: "get",
+            params
+        })
+    },
+
+    detail: function (id) {
+        return request({
+            url: `/qdport-zcgx/case/${id}`,
+            method: "get"
+        })
+    },
+
+    add: function (data) {
+        return request({
+            url: "/qdport-zcgx/case/save",
+            method: "post",
+            data: {
+                ...data,
+                createId: userInfo.id,
+                createName: userInfo.name
+            }
+        })
+    },
+
+    edit: function (data) {
+        return request({
+            url: "/qdport-zcgx/case/update",
+            method: "post",
+            data: {
+                ...data,
+                updateId: userInfo.id
+            }
+        })
+    },
+
+    del: function (data) {
+        return request({
+            headers: {
+                "Content-Type": "application/x-www-form-urlencoded"
+            },
+            url: "/qdport-zcgx/case/remove",
+            method: "post",
+            data
+        })
+    },
+
+    saveApprove: function (data) { // 直接上报/提交
+        return request({
+            url: "/qdport-zcgx/case/saveApprove",
+            method: "post",
+            data: {
+                ...data,
+                updateId: userInfo.id
+            }
+        })
+    },
+
+    withdraw: function (data) { // 撤回
+        return request({
+            url: "/qdport-zcgx/case/withdraw",
+            method: "post",
+            data: {
+                ...data,
+                updateId: userInfo.id
+            }
+        })
+    },
+
+    agree: function (data) { // 审核通过
+        return request({
+            url: "/qdport-zcgx/case/approve",
+            method: "post",
+            data: {
+                ...data,
+                updateId: userInfo.id
+            }
+        })
+    },
+
+    refuse: function (data) { // 退回
+        return request({
+            url: "/qdport-zcgx/case/refuse",
+            method: "post",
+            data: {
+                ...data,
+                updateId: userInfo.id
+            }
+        })
+    }
+}

binární
src/assets/images/loading-logo-old.png


binární
src/assets/images/menu_img.png


binární
src/assets/images/welcomebg1.png


binární
src/assets/images/welcomebg2.png


binární
src/assets/images/welcomelogo.png


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1 - 0
src/assets/svg/caseShare.svg


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1 - 0
src/assets/svg/fileExcel.svg


binární
src/assets/video/loginBackground.mp4


+ 1 - 1
src/components/IconSelect/index.vue

@@ -52,7 +52,7 @@ const emit = defineEmits(["selected"])
 function filterIcons() {
     iconList.value = icons
     if (iconName.value) {
-        iconList.value = icons.filter(item => item.indexOf(iconName.value.toLowerCase()) !== -1)
+        iconList.value = icons.filter(item => item.toLowerCase().indexOf(iconName.value.toLowerCase()) !== -1)
     }
 }
 

+ 7 - 2
src/components/Upload/index.vue

@@ -107,6 +107,7 @@
 			},
 
 			error(message) {
+                this.$emit("update:isUpload", false);
 				ElNotification.error({ title: "上传文件未成功", message });
 			},
 
@@ -136,8 +137,10 @@
 				} else {
                     Folder.download(uploadFile.path).then(res => {
                         const a = document.createElement("a");
-                        a.href = URL.createObjectURL(res.data);
-                        a.download = uploadFile.name;
+                        const blob = new Blob([res.data], { type: uploadFile.fileType });
+                        if (uploadFile.fileType == "application/pdf") a.target = "_blank";
+                        else a.download = uploadFile.name;
+                        a.href = URL.createObjectURL(blob);
                         a.click();
                     });
 				}
@@ -147,12 +150,14 @@
 				const data = new FormData();
 				data.append(param.filename, param.file);
 
+                this.$emit("update:isUpload", true);
                 Folder.up(data, {
 					onUploadProgress: e => {
 						const percent = parseInt(((e.loaded / e.total) * 100) | 0, 10);
 						param.onProgress({ percent });
 					}
 				}).then(res => {
+                    this.$emit("update:isUpload", false);
 					if (res.code == 200) param.onSuccess({ ...res.data, fileType: param.file.type });
 					else param.onError(res.msg || "未知错误");
 				}).catch(err => param.onError(err));

+ 0 - 1
src/components/Upload/tableImport.vue

@@ -32,7 +32,6 @@
 
 		methods: {
 			before(file) {
-                console.log(this.url)
                 if (!this.url) return false;
 				const maxSize = file.size / 1024 / 1024 < this.maxSize;
 				if (!maxSize) {

+ 0 - 2
src/config/config.js

@@ -19,8 +19,6 @@ const configSource = {
     projectCode: `${ENV.VITE_APP_CODE}_${ENV.VITE_APP_ENV}`,
     // 项目名
     projectName: ENV.VITE_APP_NAME,
-    // 项目描述
-    projectDesc: ENV.VITE_APP_DESCRIPTION,
     // 资源base地址
     base: ENV.VITE_BASE,
     // 接口代理URL路径

+ 1 - 2
src/layout/components/Logo/index.vue

@@ -8,7 +8,7 @@ const projectName = ref(getConfig('projectName'))
 
 <template>
     <div class="tjm_logo_container">
-        <img class="logo"  v-if="!collapse && layoutStyle=='vertical'" src="../../../assets/images/menu_img.png" alt="" />
+        <img class="logo" v-if="!collapse && layoutStyle=='vertical'" src="../../../assets/images/menu_img.png" alt="" />
         <img class="onlyLogo" v-else src="../../../assets/images/loading-logo-old.png" alt="" srcset="">
         <!-- <h1 class="title" v-if="!collapse">{{ projectName }}</h1> -->
     </div>
@@ -25,7 +25,6 @@ const projectName = ref(getConfig('projectName'))
   background: transparent;
   .logo {
     display: inline-block;
-    width: 132px;
     height: 32px;
     vertical-align: middle;
   }

+ 3 - 4
src/layout/components/NavBar/index.vue

@@ -23,10 +23,7 @@
             </div>
             <div class="tjm_user_container">
                 <el-dropdown>
-                    <el-avatar
-                        :size="36"
-                        src="https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png"
-                    />
+                    <el-avatar :size="36" :src="avatar" />
                     <template #dropdown>
                         <el-dropdown-menu>
                         <el-dropdown-item @click='goUserInfo'>个人信息</el-dropdown-item>
@@ -50,6 +47,8 @@ const settingStore = useSettingStore()
 const { collapse, layoutStyle } = storeToRefs(settingStore)
 import { useUserStore } from '@/store/user.js'
 const router = useRouter()
+const avatar = ref(useUserStore().userInfo.avatar || "https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png");
+
 function goUserInfo() {
     router.push('/userInfo')
 }

+ 113 - 106
src/store/permission.js

@@ -41,119 +41,126 @@ export const usePermissionStore = defineStore(
 )
 // 
 function filterAsyncRouter(asyncRouterMap, httpSave = true) {
+    const blackList = ["/workflow", "/system/dataList", "/system/template",
+        "/publicDomain", "/manage/policyStrive", "/policyStrive",
+        "/caseShare"
+    ]
+
     let arr = []
     asyncRouterMap.filter(route => {
-        if (route.children != null && route.children && route.children.length && route.children[0].type != 2 && route.parentId == "1762659463383281665") {
-            let info = {
-                alwaysShow: true,
-                children: [],
-                component: Layout,
-                hidden: false,
-                meta: {
-                    icon: route.icon,
-                    link: "",
-                    cache: false,
-                    title: route.name
-                },
-                name: route.name,
-                path: route.path,
-                redirect: false
-            }
-            info.children = filterAsyncRouter(route.children)
-            if (info.children.length > 0) {
-                info.redirect = info.children[0].path
-            }
-            arr.push(info)
-        } else if (route.children != null && route.children && route.children.length && route.children[0].type != 2 && route.parentId != "1762659463383281665") {
-            let info = {
-                alwaysShow: true,
-                children: [],
-                component: ParentView,
-                hidden: false,
-                meta: {
-                    icon: route.icon,
-                    link: "",
-                    cache: false,
-                    title: route.name
-                },
-                name: route.name,
-                path: route.path,
-                redirect: false
-            }
-            info.children = filterAsyncRouter(route.children)
-            if (info.children.length > 0) {
-                info.redirect = info.children[0].path
-            }
-            arr.push(info)
-        } else if (route.children.length == 0 && route.parentId == "1762659463383281665") {
-            let info = {
-                path: "",
-                component: Layout,
-                redirect: route.path,
-                alwaysShow: false,
-                hidden: false,
-                meta: {
-                    icon: route.icon,
-                    title: route.name
-                },
-                children: [
-                    {
-                        // alwaysShow: false, //菜单不支持设置
-                        children: [],
-                        component: loadView(route.path),
-                        hidden: false,
-                        meta: {
-                            icon: route.icon,
-                            link: "",
-                            cache: false,
-                            title: route.name
-                        },
-                        name: route.name,
-                        path: route.path,
-                        redirect: false
-                    }
-                ]
+        if (!blackList.includes(route.path)) {
+            if (route.children != null && route.children && route.children.length && route.children[0].type != 2 && route.parentId == "1762659463383281665") {
+                let info = {
+                    alwaysShow: true,
+                    children: [],
+                    component: Layout,
+                    hidden: false,
+                    meta: {
+                        icon: route.icon,
+                        link: "",
+                        cache: false,
+                        title: route.name
+                    },
+                    name: route.name,
+                    path: route.path,
+                    redirect: false
+                }
+                info.children = filterAsyncRouter(route.children)
+                if (info.children.length > 0) {
+                    info.redirect = info.children[0].path
+                }
+                arr.push(info)
+            } else if (route.children != null && route.children && route.children.length && route.children[0].type != 2 && route.parentId != "1762659463383281665") {
+                let info = {
+                    alwaysShow: true,
+                    children: [],
+                    component: ParentView,
+                    hidden: false,
+                    meta: {
+                        icon: route.icon,
+                        link: "",
+                        cache: false,
+                        title: route.name
+                    },
+                    name: route.name,
+                    path: route.path,
+                    redirect: false
+                }
+                info.children = filterAsyncRouter(route.children)
+                if (info.children.length > 0) {
+                    info.redirect = info.children[0].path
+                }
+                arr.push(info)
+            } else if (route.children.length == 0 && route.parentId == "1762659463383281665") {
+                let info = {
+                    path: "",
+                    component: Layout,
+                    redirect: route.path,
+                    alwaysShow: false,
+                    hidden: false,
+                    meta: {
+                        icon: route.icon,
+                        title: route.name
+                    },
+                    children: [
+                        {
+                            // alwaysShow: false, //菜单不支持设置
+                            children: [],
+                            component: loadView(route.path),
+                            hidden: false,
+                            meta: {
+                                icon: route.icon,
+                                link: "",
+                                cache: false,
+                                title: route.name
+                            },
+                            name: route.name,
+                            path: route.path,
+                            redirect: false
+                        }
+                    ]
 
-            }
-            if (route.path.startsWith("http") || route.path.startsWith("/tjmchild") || route.path.includes("queryParams")) {
-                if (httpSave) {
-                    // const prefix = "/tjmchild"
-                    // if (route.path.startsWith(prefix)) {
-                    //   info.redirect = route.path.slice(prefix.length)
-                    //   info.children[0].path = route.path.slice(prefix.length)
-                    // }
+                }
+                if (route.path.startsWith("http") || route.path.startsWith("/tjmchild") || route.path.includes("queryParams")) {
+                    if (httpSave) {
+                        // const prefix = "/tjmchild"
+                        // if (route.path.startsWith(prefix)) {
+                        //   info.redirect = route.path.slice(prefix.length)
+                        //   info.children[0].path = route.path.slice(prefix.length)
+                        // }
+                        arr.push(info)
+                    }
+                } else {
                     arr.push(info)
                 }
-            } else {
-                arr.push(info)
-            }
-        } else if (route.type == 1) {
-            let info = {
-                // alwaysShow: false, //菜单不支持设置
-                children: [],
-                component: loadView(route.path),
-                hidden: false,
-                meta: {
-                    icon: route.icon,
-                    link: "",
-                    cache: false,
-                    title: route.name
-                },
-                name: route.name,
-                path: route.path,
-                redirect: false
-            }
-            if (route.path.startsWith("http") || route.path.startsWith("/tjmchild") || route.path.includes("queryParams")) {
-                if (httpSave) {
-                    // const prefix = "/tjmchild"
-                    // if (route.path.startsWith(prefix)) {
-                    //   info.redirect = route.path.slice(prefix.length)
-                    //   info.path = route.path.slice(prefix.length)
-                    // }
+            } else if (route.type == 1) {
+                let info = {
+                    // alwaysShow: false, //菜单不支持设置
+                    children: [],
+                    component: loadView(route.path),
+                    hidden: false,
+                    meta: {
+                        icon: route.icon,
+                        link: "",
+                        cache: false,
+                        title: route.name
+                    },
+                    name: route.name,
+                    path: route.path,
+                    redirect: false
+                }
+                if (route.path.startsWith("http") || route.path.startsWith("/tjmchild") || route.path.includes("queryParams")) {
+                    if (httpSave) {
+                        // const prefix = "/tjmchild"
+                        // if (route.path.startsWith(prefix)) {
+                        //   info.redirect = route.path.slice(prefix.length)
+                        //   info.path = route.path.slice(prefix.length)
+                        // }
+                        arr.push(info)
+                    }
+                } else {
                     arr.push(info)
                 }
-            } else {
-                arr.push(info)
             }
         }
     })

+ 0 - 1
src/store/user.js

@@ -153,7 +153,6 @@ export const useUserStore = defineStore(
     }
 )
 
-
 function getButtonPermiss(keys, List) {
     for (let li of List) {
         if (li.type == 2) {

+ 212 - 0
src/views/caseShare/dialog.vue

@@ -0,0 +1,212 @@
+<template>
+    <el-dialog v-model="visible" :title="titleMap[mode]" width="680" @closed="$emit('closed')">
+        <el-form ref="formRef" :model="form" :rules="rules" :disabled="mode == 'detail'" label-width="110px">
+            <el-row>
+                <el-col v-if="form.id" :span="12">
+                    <el-form-item label="案例编号" prop="businessNo">
+                        <el-input v-model="form.businessNo" readonly :disabled="mode != 'add'"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="项目名称" prop="policyStrive.name">
+                        <el-input v-model="form.policyStrive.name" readonly placeholder="点击选择政策争取" @click="showStrive"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="填报人">
+                        <el-input v-model="form.policyStrive.createName" readonly placeholder="自动带出"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="填报部门">
+                        <el-input v-model="form.policyStrive.deptName" readonly placeholder="自动带出"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="填报单位">
+                        <el-input v-model="form.policyStrive.companyName" readonly placeholder="自动带出"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col v-if="form.id" :span="12">
+                    <el-form-item label="填报时间">
+                        <el-date-picker v-model="form.createTime" readonly format="YYYY-MM-DD HH:mm:ss"></el-date-picker>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="项目等级" required>
+                        <el-input v-model="form.policyStrive.zcLevel" readonly placeholder="自动带出"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="项目类别" required>
+                        <el-input v-model="form.policyStrive.zcType" readonly placeholder="自动带出"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="政策文号" required>
+                        <el-input v-model="form.policyStrive.docNo" readonly placeholder="自动带出"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="联系方式" required>
+                        <el-input v-model="form.policyStrive.contactPhone" readonly placeholder="自动带出"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                    <el-form-item label="项目概要" required>
+                        <el-input v-model="form.policyStrive.abstractContent" type="textarea" :rows="4" readonly placeholder="自动带出"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                    <el-form-item label="经验分享" prop="expContent">
+                        <el-input v-model="form.expContent" type="textarea" :rows="4" placeholder="请输入经验"></el-input>
+                    </el-form-item>
+                </el-col>
+
+                <el-col :span="24">
+                    <el-form-item class="no-upload-btn" label="附件">
+                        <yhUpload v-model="form.policyStrive.fileList" disabled :limit="10">
+                            <el-button type="primary" icon="upload" size="small"></el-button>
+                        </yhUpload>
+                    </el-form-item>
+                </el-col>
+            </el-row>
+        </el-form>
+
+        <template #footer>
+            <template v-if="mode == 'add' || mode == 'edit'">
+                <el-button type="primary" @click="submit(mode)">保 存</el-button>
+                <el-button type="primary" @click="submit('saveApprove')">直接上报</el-button>
+            </template>
+        </template>
+    </el-dialog>
+
+    <strive-select v-if="dialog" ref="striveSelect" @selected="striveChange" @closed="dialog = false"></strive-select>
+</template>
+
+<script>
+import API from "@/api/policy/case";
+import yhUpload from "@/components/Upload/index.vue";
+import striveSelect from "./strive.vue";
+
+export default {
+    emits: ["success", "closed"],
+    
+    components: {
+        striveSelect,
+        yhUpload
+    },
+
+    data() {
+        return {
+            visible: false,
+            mode: "add",
+            titleMap: {
+                add: "新增",
+                edit: "编辑",
+                detail: "详情"
+            },
+
+            form: {
+                id: null,
+                striveId: null,
+                policyStrive: {
+                    id: null,
+                    name: null,
+                    createName: null,
+                    companyName: null,
+                    deptName: null,
+                    zcLevel: null,
+                    zcType: null,
+                    docNo: null,
+                    contactPhone: null,
+                    abstractContent: null,
+                    fileList: []
+                },
+                businessNo: null,
+                status: null,
+                createId: null,
+                createName: null,
+                createTime: null,
+                expContent: null
+            },
+
+            rules: {
+                businessNo: [{ required: true }],
+                "policyStrive.name": [{ required: true, message: "请选择政策争取" }],
+                expContent: [{ required: true, message: "请输入经验" }]
+            },
+
+            dialog: false
+        }
+    },
+
+    methods: {
+        open(mode = "add") {
+            this.mode = mode;
+            this.visible = true;
+            return this;
+        },
+
+        setData(id) {
+            API.detail(id).then(res => {
+                if (res.code === 200) {
+                    for (const key in this.form) {
+                        if (key == "policyStrive") {
+                            for (const striveKey in this.form[key]) {
+                                if (striveKey == "fileList") this.form[key][striveKey] = res.data[key][striveKey].map(file => ({ ...file, name: file.originalName, path: file.fileDomain + "/" + file.fileName }));
+                                else this.form[key][striveKey] = res.data[key][striveKey] || null;
+                            }
+                        } else this.form[key] = res.data[key] || null;
+                    }
+                } else ElMessage.error(res.msg);
+            });
+        },
+
+        showStrive() {
+            if (this.mode == "add") {
+                this.dialog = true;
+                this.$nextTick(() => this.$refs.striveSelect.open().setData(this.form.policyStrive));
+            }
+        },
+
+        striveChange(e) {
+            for (const key in this.form.policyStrive) {
+                if (key == "fileList") this.form.policyStrive[key] = e[key].map(file => ({ ...file, name: file.originalName, path: file.fileDomain + "/" + file.fileName }));
+                else this.form.policyStrive[key] = e[key];
+            }
+
+            this.form.striveId = e.id;
+        },
+
+        // 表单提交方法
+        submit(mode) {
+            this.$refs.formRef.validate(valid => {
+                if (valid) {
+                    API[mode](this.form).then(res => {
+                        if (res.code === 200) {
+                            ElMessage.success("操作成功");
+                            this.visible = false;
+                            this.$emit("success", mode);
+                        } else ElMessage.error(res.msg);
+                    });
+                } else {
+                    return false;
+                }
+            });
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.no-upload-btn :deep(.yh-upload-file) {
+  .el-upload {
+    display: none;
+  }
+
+  .el-upload-list.is-disabled {
+    margin-top: 0;
+  }
+}
+</style>

+ 193 - 0
src/views/caseShare/index.vue

@@ -0,0 +1,193 @@
+<template>
+    <el-card class="tjm_card_style_custom">
+        <div class="tjm_card_title">查询表格</div>
+        <div class="tjm_card_select">
+            <el-form class="tjm_card_select_left" :model="params" inline label-width="80px" label-position="left">
+                <el-form-item label="案例编号">
+                    <el-input v-model="params.businessNo" clearable placeholder="请输入案例编号"></el-input>
+                </el-form-item>
+                <el-form-item label="项目名称">
+                    <el-input v-model="params.name" clearable placeholder="请输入项目名称"></el-input>
+                </el-form-item>
+                <el-form-item label="项目等级">
+                    <el-select v-model="params.zcLevel" clearable placeholder="请选择项目等级">
+                        <el-option v-for="item in levelDic" :key="item" :label="item" :value="item"></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="项目类别">
+                    <el-select v-model="params.zcType" clearable placeholder="请选择项目类别">
+                        <el-option v-for="item in typeDic" :key="item" :label="item" :value="item"></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="状态">
+                    <el-select v-model="params.status" clearable placeholder="请选择状态">
+                        <el-option v-for="(label, key) in statusDic" :key="key" :label="label" :value="key"></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="填报时间">
+                    <el-date-picker v-model="createTime" type="daterange" value-format="YYYY-MM-DD" range-separator="-" start-placeholder="开始时间" end-placeholder="结束时间"></el-date-picker>
+                </el-form-item>
+
+                <el-form-item>
+                    <el-button type="primary" icon="search" @click="reloadTable">搜索</el-button>
+                    <el-button icon="refresh-right" @click="reset">重置</el-button>
+                </el-form-item>
+            </el-form>
+        </div>
+        <el-divider></el-divider>
+
+        <div class="tjm_card_tools">
+            <div class="tjm_card_tools_left">
+                <el-button type="primary" icon="plus" @click="table_add">新增</el-button>
+            </div>
+            <div class="tjm_card_tools_right">
+                <el-button icon="download" @click="table_export">导出</el-button>
+            </div>
+        </div>
+        <div class="tjm_card_table">
+            <el-table v-loading="loading" row-key="id" header-cell-class-name="tjm_card_table_header" height="400" :data="tableData" border @row-click="table_edit($event, 'detail')">
+                <el-table-column type="index" label="序号" width="55"></el-table-column>
+                <template v-for="(item, index) in columns" :key="index">
+                    <el-table-column :label="item.label" :prop="item.props" :width="item.width || 180" show-overflow-tooltip>
+                        <template #default="scope">{{ columnFormat(scope.row, item.props) }}</template>
+                    </el-table-column>
+                </template>
+                <el-table-column label="操作" fixed="right" width="230">
+                    <template #default="scope">
+                        <template v-if="scope.row.status == 'active' || scope.row.status == 'inactive'">
+                            <el-button type="primary" link icon="edit" @click.stop="table_edit(scope.row)">编辑</el-button>
+                            <el-button type="primary" link icon="upload" @click.stop="table_edit(scope.row)">上报</el-button>
+                            <el-button type="primary" link icon="delete" @click.stop="table_del(scope.row)">删除</el-button>
+                        </template>
+                        <el-button v-if="scope.row.status == 'approve' || scope.row.status == 'done'" type="primary" link icon="tickets" @click.stop="table_edit(scope.row, 'detail')">详情</el-button>
+                        <el-button v-if="scope.row.status == 'approve'" type="primary" link icon="refresh-right" @click.stop="table_withdraw(scope.row)">撤回</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+        </div>
+        <div class="tjm_card_pagination">
+            <yh-pagination v-model:pageNo="params.page" v-model:pageSize="params.size" :total="total" @paginationChange="reloadTable"></yh-pagination>
+        </div>
+    </el-card>
+
+    <case-share-detail v-if="dialog" ref="caseShareDetail" @success="reloadTable" @closed="dialog = false"></case-share-detail>
+</template>
+
+<script>
+import API from "@/api/policy/case";
+import { exportExcel } from "@/utils/exportExcel";
+import { levelDic, typeDic } from "@/views/policyShare/main";
+import { columns, statusDic } from "./main";
+
+import yhPagination from "@/components/Pagination/index.vue";
+import caseShareDetail from "./dialog.vue";
+
+export default {
+    components: {
+        yhPagination,
+        caseShareDetail
+    },
+
+    data() {
+        return {
+            columns, levelDic, typeDic, statusDic,
+
+            loading: false,
+            createTime: [],
+            params: {
+                page: 1,
+                size: 10
+            },
+
+            total: 0,
+            tableData: [],
+
+            dialog: false
+        }
+    },
+
+    mounted() {
+        this.reloadTable();
+    },
+
+    methods: {
+        columnFormat(row, props) {
+            if (props.includes(".")) return row[props.split(".")[0]][props.split(".")[1]];
+            if (props == "status") return statusDic[row[props]] || "";
+            return row[props];
+        },
+
+        reloadTable(mode = "add") {
+            if (mode == "add") this.params.page = 1;
+            this.params.beginCreateTime = this.createTime && this.createTime.length && this.createTime[0] + " 00:00:00" || null;
+            this.params.endCreateTime = this.createTime && this.createTime.length && this.createTime[1] + " 23:59:59" || null;
+
+            this.loading = true;
+            API.get(this.params).then(res => {
+                this.loading = false;
+                if (res.code === 200) {
+                    this.tableData = res.data.records;
+                    this.total = res.data.total;
+                } else ElMessage.error(res.msg);
+            }).catch(() => this.loading = false);
+        },
+
+        reset() {
+            this.createTime = [];
+            for (const key in this.params) {
+                if (key == "page") this.params[key] = 1;
+                else if (key == "size") this.params[key] = 10;
+                else this.params[key] = null;
+            }
+            this.reloadTable();
+        },
+
+        table_export() {
+            const header = this.columns.map(c => c.label);
+            const data = this.tableData.map(v => this.columns.map(c => c.props).map(j => this.columnFormat(v, j)));
+
+            exportExcel(header, data, [], `${this.$route.name}.xlsx`);
+        },
+
+        table_add() {
+            this.dialog = true;
+            this.$nextTick(() => this.$refs.caseShareDetail.open());
+        },
+
+        table_edit(row, mode = "edit") {
+            this.dialog = true;
+            this.$nextTick(() => this.$refs.caseShareDetail.open(mode).setData(row.id));
+        },
+
+        table_del(row) {
+            ElMessageBox.confirm("是否确认删除?", "删除警告", {
+                type: "warning",
+                confirmButtonText: "确定",
+                cancelButtonText: "取消"
+            }).then(() => {
+                API.del({ ids: row.id }).then(res => {
+                    if (res.code == 200) {
+                        ElMessage.success("操作成功");
+                        this.reloadTable();
+                    } else ElMessage.error(res.msg);
+                });
+            });
+        },
+
+        table_withdraw(row) {
+            ElMessageBox.confirm("是否确认撤回?", "提示", {
+                type: "warning",
+                confirmButtonText: "确定",
+                cancelButtonText: "取消"
+            }).then(() => {
+                API.withdraw(row).then(res => {
+                    if (res.code === 200) {
+                        ElMessage.success("操作成功");
+                        this.reloadTable();
+                    } else ElMessage.error(res.msg);
+                });
+            });
+        }
+    }
+}
+</script>

+ 22 - 0
src/views/caseShare/main.js

@@ -0,0 +1,22 @@
+export const columns = [
+    { label: "案例编号", props: "businessNo" },
+    { label: "状态", props: "status", width: "100" },
+    { label: "项目名称", props: "policyStrive.name" },
+    { label: "项目概要", props: "policyStrive.abstractContent" },
+    { label: "项目等级", props: "policyStrive.zcLevel", width: "100" },
+    { label: "项目类别", props: "policyStrive.zcType", width: "100" },
+    { label: "政策文号", props: "policyStrive.docNo" },
+    { label: "经验分享", props: "expContent" },
+    { label: "填报人", props: "policyStrive.createName" },
+    { label: "填报部门", props: "policyStrive.deptName" },
+    { label: "填报单位", props: "policyStrive.companyName" },
+    { label: "联系方式", props: "policyStrive.contactPhone" },
+    { label: "填报时间", props: "createTime" }
+]
+
+export const statusDic = {
+    active: "待上报",
+    approve: "审核中",
+    done: "已发布",
+    inactive: "退回"
+}

+ 181 - 0
src/views/caseShare/strive.vue

@@ -0,0 +1,181 @@
+<template>
+    <el-dialog v-model="visible" title="政策关联" width="80%" @closed="$emit('closed')">
+        <el-card class="tjm_card_style_custom" shadow="never">
+            <div class="tjm_card_select">
+                <el-form class="tjm_card_select_left" :model="params" inline label-width="80px" label-position="left">
+                    <el-form-item label="政策编号">
+                        <el-input v-model="params.businessNo" clearable placeholder="请输入政策编号"></el-input>
+                    </el-form-item>
+                    <el-form-item label="项目名称">
+                        <el-input v-model="params.name" clearable placeholder="请输入项目名称"></el-input>
+                    </el-form-item>
+                    <el-form-item label="项目等级">
+                        <el-select v-model="params.zcLevel" clearable placeholder="请选择项目等级">
+                            <el-option v-for="item in levelDic" :key="item" :label="item" :value="item"></el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item label="项目类别">
+                        <el-select v-model="params.zcType" clearable placeholder="请选择项目类别">
+                            <el-option v-for="item in typeDic" :key="item" :label="item" :value="item"></el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item label="状态">
+                        <el-select v-model="params.isLand" clearable placeholder="请选择状态">
+                            <el-option v-for="(label, key) in statusDic" :key="key" :label="label" :value="parseInt(key)"></el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item label="填报时间">
+                        <el-date-picker v-model="createTime" type="daterange" value-format="YYYY-MM-DD" range-separator="-" start-placeholder="开始时间" end-placeholder="结束时间"></el-date-picker>
+                    </el-form-item>
+
+                    <el-form-item>
+                        <el-button type="primary" icon="search" @click="reloadTable">搜索</el-button>
+                        <el-button icon="refresh-right" @click="reset">重置</el-button>
+                    </el-form-item>
+                </el-form>
+            </div>
+            <el-divider></el-divider>
+
+            <div class="tjm_card_table">
+                <el-table v-loading="loading" row-key="id" header-cell-class-name="tjm_card_table_header" height="400" :data="tableData" border @select="select">
+                    <el-table-column type="selection" align="center" width="55" :selectable="selectable"></el-table-column>
+                    <el-table-column type="index" label="序号" width="55"></el-table-column>
+                    <template v-for="(item, index) in link_columns" :key="index">
+                        <el-table-column :label="item.label" :prop="item.props" :width="item.width || 180" show-overflow-tooltip>
+                            <template #default="scope">{{ columnFormat(scope.row, item.props) }}</template>
+                        </el-table-column>
+                    </template>
+                    <el-table-column label="操作" fixed="right" width="100">
+                        <template #default="scope">
+                            <el-button type="primary" link icon="tickets" @click="table_detail(scope.row)">详情</el-button>
+                        </template>
+                    </el-table-column>
+                </el-table>
+            </div>
+            <div class="tjm_card_pagination">
+                <yh-pagination v-model:pageNo="params.page" v-model:pageSize="params.size" :total="total" @paginationChange="reloadTable"></yh-pagination>
+            </div>
+        </el-card>
+
+        <template #footer>
+            <el-button type="primary" @click="visible = false, $emit('selected', selectData)">确 定</el-button>
+        </template>
+    </el-dialog>
+
+    <policy-strive-detail v-if="dialog.detail" ref="policyStriveDetail" @closed="dialog.detail = false"></policy-strive-detail>
+</template>
+
+<script>
+import API from "@/api/policy/strive";
+import { levelDic, typeDic } from "@/views/policyShare/main";
+import { statusDic } from "@/views/manage/policyStrive/main";
+import { link_columns } from "@/views/publicDomain/main";
+
+import yhPagination from "@/components/Pagination/index.vue";
+import policyStriveDetail from "@/views/policyStrive/explain.vue";
+
+export default {
+    emits: ["closed"],
+    
+    components: {
+        yhPagination,
+        policyStriveDetail
+    },
+
+    data() {
+        return {
+            link_columns, levelDic, typeDic, statusDic,
+            visible: false,
+
+            loading: false,
+            createTime: [],
+            params: {
+                page: 1,
+                size: 10,
+                status: "done",
+                isCase: 0
+            },
+
+            total: 0,
+            tableData: [],
+
+            dialog: {
+                detail: false
+            },
+
+            selectData: null
+        }
+    },
+
+    methods: {
+        open() {
+            this.visible = true;
+            return this;
+        },
+
+        setData(data) {
+            this.reloadTable();
+        },
+
+        columnFormat(row, props) {
+            if (props == "status") return statusDic[row.isLand] || "";
+            if (props == "landAmount") return row.isLand == 1 && row[props] || "";
+            return row[props];
+        },
+
+        reloadTable() {
+            this.params.beginCreateTime = this.createTime && this.createTime.length && this.createTime[0] + " 00:00:00" || null;
+            this.params.endCreateTime = this.createTime && this.createTime.length && this.createTime[1] + " 23:59:59" || null;
+
+            this.loading = true;
+            API.get(this.params).then(res => {
+                this.loading = false;
+                if (res.code === 200) {
+                    this.tableData = res.data.records;
+                    this.total = res.data.total;
+                } else ElMessage.error(res.msg);
+            }).catch(() => this.loading = false);
+        },
+
+        reset() {
+            this.createTime = [];
+            this.params = {
+                page: 1,
+                size: 10,
+                status: "done",
+                isCase: 0
+            }
+                
+            this.reloadTable();
+        },
+
+        table_detail(row) {
+            this.dialog.detail = true;
+            this.$nextTick(() => this.$refs.policyStriveDetail.open("detail").setData(row.id));
+        },
+
+        selectable(row) {
+            return !this.selectData || this.selectData.id == row.id;
+        },
+
+        // 表格勾选事件
+        select(rows, row) {
+            this.selectData = rows.length && rows.indexOf(row) !== -1 && Object.assign({}, row) || null;
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.tjm_card_style_custom {
+  border: none;
+
+  :deep(.el-card__body) {
+    padding: 0;
+
+    .el-table__header .el-checkbox {
+      display: none;
+    }
+  }
+}
+</style>

+ 2 - 528
src/views/home/home.vue

@@ -1,536 +1,10 @@
 <template>
   <div class="main">
-    <div class="top-area">
-      <div class="left">
-        <div class="flex-box">
-          <div class="top-card" style="margin-right: 2%">
-            <div class="title">早安,陈兆雪,开始您工作的一天吧!</div>
-            <div class="btn-box">
-              <div>
-                <div class="top">
-                  <img src="@/assets/images/home-ring.png" alt="" />
-                  <div>全部消息</div>
-                </div>
-                <div class="bottom">4</div>
-              </div>
-              <div>
-                <div class="top">
-                  <img src="@/assets/images/home-book.png" alt="" />
-                  <div>完成消息</div>
-                </div>
-                <div class="bottom">7</div>
-              </div>
-              <div>
-                <div class="top">
-                  <img src="@/assets/images/home-file.png" alt="" />
-                  <div>代办消息</div>
-                </div>
-                <div class="bottom">11</div>
-              </div>
-              <div>
-                <div class="top">
-                  <img src="@/assets/images/home-email.png" alt="" />
-                  <div>未读消息</div>
-                </div>
-                <div class="bottom">12</div>
-              </div>
-            </div>
-          </div>
-          <div class="top-card" style="padding: 0 24px;">
-            <el-tabs v-model="activeName">
-              <el-tab-pane label="快速操作" name="first">
-                <div class="flex-row">
-                  <div class="fast-btn">
-                    <div class="circle"></div>
-                    <div class="label">角色管理</div>
-                  </div>
-                  <div class="fast-btn">
-                    <div class="circle"></div>
-                    <div class="label">部门管理</div>
-                  </div>
-                  <div class="fast-btn">
-                    <div class="circle"></div>
-                    <div class="label">新增</div>
-                  </div>
-                </div>
-              </el-tab-pane>
-              <el-tab-pane label="最近访问" name="second">
-                <div class="flex-row">
-                  <div class="fast-btn">
-                    <div class="circle"></div>
-                    <div class="label">角色管理</div>
-                  </div>
-                  <div class="fast-btn">
-                    <div class="circle"></div>
-                    <div class="label">部门管理</div>
-                  </div>
-                </div>
-              </el-tab-pane>
-            </el-tabs>
-          </div>
-        </div>
-        <div class="flex-box" style="margin-top: 14px;">
-          <div class="center-card" style="margin-right: 2%">
-            <div class="title">今日生产KPI</div>
-            <pie-chart />
-          </div>
-          <div class="center-card">
-            <div class="title">已办流程</div>
-            <line-chart />
-          </div>
-        </div>
-        <div class="flex-box" style="margin-top: 14px;">
-          <div class="bottom-card">
-            <div class="title">数据总览</div>
-            <cut-line-chart></cut-line-chart>
-          </div>
-        </div>
-      </div>
-      <div class="right">
-        <div class="top-card">
-          <div class="top-bar">
-            <div class="left">最新公告</div>
-            <div class="right">查看全部</div>
-          </div>
-          <div class="cell line">
-            <div class="time">2024-01-02</div>
-            <div class="content">网站于某月某日开始测试上线,请各部门...</div>
-            <div class="tag">公告</div>
-          </div>
-          <div class="cell line">
-            <div class="time">2024-01-02</div>
-            <div class="content">网站于某月某日开始测试上线,请各部门...</div>
-            <div class="tag">公告</div>
-          </div>
-          <div class="cell line">
-            <div class="time">2024-01-02</div>
-            <div class="content">网站于某月某日开始测试上线,请各部门...</div>
-            <div class="tag">公告</div>
-          </div>
-          <div class="cell line">
-            <div class="time">2024-01-02</div>
-            <div class="content">网站于某月某日开始测试上线,请各部门...</div>
-            <div class="tag">公告</div>
-          </div>
-          <div class="cell line">
-            <div class="time">2024-01-02</div>
-            <div class="content">网站于某月某日开始测试上线,请各部门...</div>
-            <div class="tag">公告</div>
-          </div>
-          <div class="cell">
-            <div class="time">2024-01-02</div>
-            <div class="content">网站于某月某日开始测试上线,请各部门...</div>
-            <div class="tag">公告</div>
-          </div>
-        </div>
-        <div class="bottom-card">
-          <div class="top-bar">
-            <div class="left">代办事项</div>
-            <div class="right">查看全部</div>
-          </div>
-          <div class="cell">
-            <div class="content">
-              <div class="title">港口某个项目需要修改某个地方,请尽快尽快尽快修...</div>
-              <el-tag class="ml-2" type="success">已通过</el-tag>
-            </div>
-            <div class="time">提交时间:2024-01-12 | 提交人:张三</div>
-          </div>
-          <div class="cell">
-            <div class="content">
-              <div class="title">港口某个项目需要修改某个地方,请尽快尽快尽快修...</div>
-              <el-tag class="ml-2" type="success">已通过</el-tag>
-            </div>
-            <div class="time">提交时间:2024-01-12 | 提交人:张三</div>
-          </div>
-          <div class="cell">
-            <div class="content">
-              <div class="title">港口某个项目需要修改某个地方,请尽快尽快尽快修...</div>
-              <el-tag class="ml-2" type="success">已通过</el-tag>
-            </div>
-            <div class="time">提交时间:2024-01-12 | 提交人:张三</div>
-          </div>
-          <div class="cell">
-            <div class="content">
-              <div class="title">港口某个项目需要修改某个地方,请尽快尽快尽快修...</div>
-              <el-tag class="ml-2" type="success">已通过</el-tag>
-            </div>
-            <div class="time">提交时间:2024-01-12 | 提交人:张三</div>
-          </div>
-        </div>
-      </div>
-    </div>
-    <div class="bottom-area">
-      <div class="title">今日工作量</div>
-      <div class="table">
-        <el-table
-          :data="tableData"
-          border
-          style="width: 100%"
-          row-key="id"
-        >
-          <el-table-column prop="name" label="姓名" />
-          <el-table-column prop="step" label="进度条">
-            <template #default>
-              <el-progress :percentage="11" />
-            </template>
-          </el-table-column>
-          <el-table-column prop="num" label="数量" />
-          <el-table-column prop="state" label="状态展示">
-            <template #default="scope">
-              <el-tag
-                :type="scope.row.state === 1 ? 'info' : 'success'"
-                disable-transitions
-              >{{ scope.row.state === 1 ? '进行中' : '已完成' }}
-              </el-tag
-              >
-            </template>
-          </el-table-column>
-          <el-table-column prop="number" label="完成量" />
-        </el-table>
-      </div>
-      <div class="page-bottom">
-        <el-pagination background layout="prev, pager, next" :total="0" />
-      </div>
-    </div>
   </div>
 </template>
 
-<script setup>
-import PieChart from '@/views/home/components/PieChart.vue'
-import LineChart from '@/views/home/components/LineChart.vue'
-import cutLineChart from '@/views/home/components/cutLineChart.vue'
-
-const activeName = ref('first')
-const tableData = ref([{ name: '小明', num: '123', number: '11', step: '0.1', state: 1 }, {
-  name: '小明',
-  num: '123',
-  number: '11',
-  step: '0.1',
-  state: 1
-}, { name: '小明', num: '123', number: '11', step: '0.1', state: 1 }])
+<script>
 </script>
 
-<style scoped lang="scss">
-.main {
-  min-width: 1066px;
-  padding: 4px;
-
-  .top-area {
-    display: flex;
-
-    .left {
-      width: 70%;
-
-      .flex-box {
-        display: flex;
-        justify-content: flex-start;
-      }
-
-      .top-card {
-        width: 48%;
-        height: 146px;
-        border-radius: 10px;
-        background-color: white;
-        box-sizing: border-box;
-        overflow: hidden;
-
-        .title {
-          color: #999;
-          font-family: 'PingFang HK';
-          font-size: 12px;
-          font-style: normal;
-          font-weight: 600;
-          line-height: normal;
-          margin-left: 16px;
-          margin-top: 10px;
-        }
-
-        .btn-box {
-          display: flex;
-          justify-content: space-around;
-          align-items: center;
-          margin-top: 30px;
-          font-size: 13px;
-
-          .top {
-            display: flex;
-            align-items: center;
-          }
-
-          .bottom {
-            font-size: 32px;
-            font-weight: bold;
-            margin-top: 7px;
-          }
-
-          img {
-            height: 17px;
-            width: 17px;
-            margin-right: 10px;
-          }
-        }
-
-        .fast-btn {
-          display: flex;
-          flex-direction: column;
-          align-items: center;
-          justify-content: center;
-          margin-right: 30px;
-
-          .circle {
-            height: 48px;
-            width: 48px;
-            background-color: lightgrey;
-            border-radius: 50%;
-          }
-
-          .label {
-            margin-top: 5px;
-            color: #666;
-            font-family: 'Alibaba PuHuiTi 3.0';
-            font-size: 14px;
-            font-style: normal;
-            font-weight: 400;
-            line-height: normal;
-          }
-        }
-      }
-
-      .center-card {
-        width: 48%;
-        height: 238px;
-        border-radius: 10px;
-        background-color: white;
-        padding: 12px 14px;
-        box-sizing: border-box;
-        overflow: hidden;
-        .title {
-          color: #000;
-          font-family: 'PingFang SC';
-          font-size: 14px;
-          font-style: normal;
-          font-weight: 500;
-          line-height: normal;
-        }
-      }
-
-      .bottom-card {
-        width: 98%;
-        height: 373px;
-        border-radius: 10px;
-        background-color: white;
-        padding: 12px 14px;
-        box-sizing: border-box;
-        overflow: hidden;
-
-        .title {
-          color: #000;
-          font-family: 'PingFang SC';
-          font-size: 14px;
-          font-style: normal;
-          font-weight: 500;
-          line-height: normal;
-        }
-      }
-    }
-
-    .right {
-      width: 30%;
-
-      .top-card {
-        width: 100%;
-        height: 398px;
-        border-radius: 10px;
-        background-color: white;
-        padding: 12px;
-        box-sizing: border-box;
-
-        .top-bar {
-          display: flex;
-          justify-content: space-between;
-          align-items: center;
-          width: 100%;
-          margin-bottom: 10px;
-
-          .left {
-            margin-left: 7px;
-            color: #000;
-            font-family: 'PingFang SC';
-            font-size: 14px;
-            font-style: normal;
-            font-weight: 500;
-            line-height: normal;
-          }
-
-          .right {
-            width: fit-content;
-            color: #999;
-            font-family: 'Alibaba PuHuiTi 3.0';
-            font-size: 12px;
-            font-style: normal;
-            font-weight: 500;
-            line-height: normal;
-            margin-right: 4px;
-            cursor: pointer;
-          }
-        }
-
-        .cell {
-          height: 56px;
-          width: 100%;
-          display: flex;
-          align-items: center;
-          justify-content: space-between;
-
-          &.line {
-            border-bottom: 1px solid #ebebeb;
-          }
-
-          .time {
-            color: #999;
-            font-family: 'Alibaba PuHuiTi 3.0';
-            font-size: 12px;
-            font-style: normal;
-            font-weight: 500;
-          }
-
-          .content {
-            width: 60%;
-            height: 20px;
-            color: #333;
-            font-family: 'Alibaba PuHuiTi 3.0';
-            font-size: 14px;
-            font-style: normal;
-            font-weight: 400;
-            line-height: normal;
-            white-space: nowrap; /* 保持文本在一行 */
-            overflow: hidden; /* 隐藏超出容器的文本 */
-            text-overflow: ellipsis; /* 超出部分显示省略号 */
-          }
-
-          .tag {
-            width: 44px;
-            height: 17px;
-            font-size: 12px;
-            line-height: 17px;
-            text-align: center;
-            color: white;
-            border-radius: 4px;
-            background: #ff852e;
-          }
-        }
-      }
-
-      .bottom-card {
-        width: 100%;
-        height: 373px;
-        border-radius: 10px;
-        background-color: white;
-        margin-top: 14px;
-        padding: 12px;
-        box-sizing: border-box;
-
-        .top-bar {
-          display: flex;
-          justify-content: space-between;
-          align-items: center;
-          width: 100%;
-          margin-bottom: 20px;
-
-          .left {
-            margin-left: 7px;
-            color: #000;
-            font-family: 'PingFang SC';
-            font-size: 14px;
-            font-style: normal;
-            font-weight: 500;
-            line-height: normal;
-          }
-
-          .right {
-            width: fit-content;
-            color: #999;
-            font-family: 'Alibaba PuHuiTi 3.0';
-            font-size: 12px;
-            font-style: normal;
-            font-weight: 500;
-            line-height: normal;
-            margin-right: 4px;
-            cursor: pointer;
-          }
-        }
-
-        .cell {
-          width: 100%;
-          height: 67px;
-          border: 1px solid #eeeeee;
-          border-radius: 10px;
-          margin-bottom: 10px;
-          padding: 12px 20px;
-          box-sizing: border-box;
-
-          .content {
-            display: flex;
-            align-items: center;
-            justify-content: space-between;
-
-            .title {
-              color: #000;
-              font-family: 'Alibaba PuHuiTi 3.0';
-              font-size: 14px;
-              font-style: normal;
-              font-weight: 400;
-              line-height: normal;
-              white-space: nowrap; /* 保持文本在一行 */
-              overflow: hidden; /* 隐藏超出容器的文本 */
-              text-overflow: ellipsis; /* 超出部分显示省略号 */
-              margin-right: 4px;
-            }
-          }
-
-          .time {
-            color: #999;
-            font-family: 'Alibaba PuHuiTi 3.0';
-            font-size: 12px;
-            font-style: normal;
-            font-weight: 400;
-            line-height: normal;
-            margin-top: 5px;
-          }
-        }
-      }
-    }
-  }
-
-  .bottom-area {
-    width: 100%;
-    margin-top: 14px;
-    height: 412px;
-    border-radius: 10px;
-    background-color: white;
-    padding: 12px 14px;
-    box-sizing: border-box;
-
-    .title {
-      color: #000;
-      font-family: 'PingFang SC';
-      font-size: 14px;
-      font-style: normal;
-      font-weight: 500;
-      line-height: normal;
-    }
-
-    .table {
-      margin-top: 20px;
-      height: 285px;
-      overflow-y: scroll;
-    }
-
-    .page-bottom {
-      display: flex;
-      justify-content: flex-end;
-      margin-top: 10px;
-    }
-  }
-}
+<style lang="scss" scoped>
 </style>

+ 126 - 123
src/views/login/index.vue

@@ -1,49 +1,54 @@
 <template>
     <div class="tjm_login">
-        <video id="bgvid" muted autoplay loop>
-        <source src="@/assets/video/loginBackground.mp4" type="video/mp4" />
-        </video>
+        <el-carousel height="100vh" :pause-on-hover="false">
+            <el-carousel-item>
+                <img src="@/assets/images/welcomebg1.png" alt="" />
+            </el-carousel-item>
+            <el-carousel-item>
+                <img src="@/assets/images/welcomebg2.png" alt="" />
+            </el-carousel-item>
+        </el-carousel>
         <div class="left">
-        <div class="logo">
-            <img src="@/assets/images/welcomelogo.png" alt="" />
-        </div>
-        </div>
-        <div class="right">
-        <div class="title">欢迎登录</div>
-        <div class="select_login_type">
-            <div class="type_item type_item_active">
-            <span>密码登录</span>
-            <div class="select"></div>
-            </div>
-            <div class="type_item">
-            <span>短信登录</span>
-            <div class="select"></div>
-            </div>
-            <div class="type_item">
-            <span>扫码登录</span>
-            <div class="select"></div>
+            <div class="logo">
+                <img src="@/assets/images/welcomelogo.png" alt="" />
             </div>
         </div>
-        <div class="input_tjm account_ctx">
-            <div>
-            <input v-model="username" placeholder="请输入用户名" />
-            </div>
-            <div class="tjm_input_icon">
-            <img src="@/assets/images/user.png" alt="" />
-            </div>
-        </div>
-        <div class="input_tjm pwd_ctx">
-            <div>
-            <input v-model="password" type="password" placeholder="请输入密码" />
+        <div class="right">
+            <div class="title">欢迎登录</div>
+            <!-- <div class="select_login_type">
+                <div class="type_item type_item_active">
+                    <span>密码登录</span>
+                    <div class="select"></div>
+                </div>
+                <div class="type_item">
+                    <span>短信登录</span>
+                    <div class="select"></div>
+                </div>
+                <div class="type_item">
+                    <span>扫码登录</span>
+                    <div class="select"></div>
+                </div>
+            </div> -->
+            <div class="input_tjm account_ctx">
+                <div>
+                    <input v-model="username" placeholder="请输入用户名" />
+                </div>
+                <div class="tjm_input_icon">
+                    <img src="@/assets/images/user.png" alt="" />
+                </div>
             </div>
-            <div class="tjm_input_icon">
-            <img src="@/assets/images/pwd.png" alt="" />
+            <div class="input_tjm pwd_ctx">
+                <div>
+                    <input v-model="password" type="password" placeholder="请输入密码" />
+                </div>
+                <div class="tjm_input_icon">
+                    <img src="@/assets/images/pwd.png" alt="" />
+                </div>
             </div>
-        </div>
-        <div class="tjm_login_btn" @click="login">登录</div>
-        <div class="tjm_other_opea">
-            <span>操作手册</span><span>玉衡移动</span><span>忘记密码</span>
-        </div>
+            <div class="tjm_login_btn" @click="login">登录</div>
+            <!-- <div class="tjm_other_opea">
+                <span>操作手册</span><span>忘记密码</span>
+            </div> -->
         </div>
     </div>
     <!-- 强制修改密码 -->
@@ -54,52 +59,52 @@
         append-to-body
     >
         <el-form ref="userRef" :model="form" :rules="rules" label-width="100px">
-        <el-row>
-            <el-col :span="24">
-            <el-form-item label="用户名" prop="username">
-                <el-input
-                v-model="form.username"
-                placeholder="请输入用户名"
-                clearable
-                />
-            </el-form-item>
-            </el-col>
-            <el-col :span="24">
-            <el-form-item label="原密码" prop="oldPassword">
-                <el-input
-                v-model="form.oldPassword"
-                type="password"
-                placeholder="请输入原密码"
-                clearable
-                />
-            </el-form-item>
-            </el-col>
-            <el-col :span="24">
-            <el-form-item label="新密码" prop="newPassword">
-                <el-input
-                v-model="form.newPassword"
-                type="password"
-                placeholder="请输入新密码"
-                clearable
-                />
-            </el-form-item>
-            </el-col>
-            <el-col :span="24">
-            <el-form-item label="确认密码" prop="confirmPassword">
-                <el-input
-                v-model="form.confirmPassword"
-                placeholder="请再次确认密码"
-                clearable
-                />
-            </el-form-item>
-            </el-col>
-        </el-row>
+            <el-row>
+                <el-col :span="24">
+                    <el-form-item label="用户名" prop="username">
+                        <el-input
+                        v-model="form.username"
+                        placeholder="请输入用户名"
+                        clearable
+                        />
+                    </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                    <el-form-item label="原密码" prop="oldPassword">
+                        <el-input
+                        v-model="form.oldPassword"
+                        type="password"
+                        placeholder="请输入原密码"
+                        clearable
+                        />
+                    </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                    <el-form-item label="新密码" prop="newPassword">
+                        <el-input
+                        v-model="form.newPassword"
+                        type="password"
+                        placeholder="请输入新密码"
+                        clearable
+                        />
+                    </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                    <el-form-item label="确认密码" prop="confirmPassword">
+                        <el-input
+                        v-model="form.confirmPassword"
+                        placeholder="请再次确认密码"
+                        clearable
+                        />
+                    </el-form-item>
+                </el-col>
+            </el-row>
         </el-form>
         <template #footer>
-        <div class="dialog-footer">
-            <el-button type="primary" @click="submitForm">确 定</el-button>
-            <el-button @click="cancel">取 消</el-button>
-        </div>
+            <div class="dialog-footer">
+                <el-button type="primary" @click="submitForm">确 定</el-button>
+                <el-button @click="cancel">取 消</el-button>
+            </div>
         </template>
     </el-dialog>
     <!-- 强制验证手机号 -->
@@ -110,53 +115,45 @@
         append-to-body
     >
         <el-form
-        ref="phoneRef"
-        :model="mobileForm"
-        :rules="mobileRules"
-        label-width="100px"
+            ref="phoneRef"
+            :model="mobileForm"
+            :rules="mobileRules"
+            label-width="100px"
         >
-        <el-row>
-            <el-col :span="24">
-            <el-form-item label="手机号" prop="mobileNumber">
-                <el-input
-                v-model="mobileForm.mobileNumber"
-                placeholder="请输入手机号"
-                clearable
-                />
-            </el-form-item>
-            </el-col>
-            <el-col :span="24">
-            <el-form-item label="验证码" prop="verificationCode">
-                <el-input
-                v-model="mobileForm.verificationCode"
-                placeholder="请输入验证码"
-                class="input-with-select"
-                >
-                <template #append>
-                    <el-button
-                    :disabled="countdown > 0"
-                    @click="sendVerificationCode"
-                    >
-                    {{
-                        countdown > 0 ? countdown + '秒后重新获取' : '获取验证码'
-                    }}
-                    </el-button>
-                </template>
-                </el-input>
-            </el-form-item>
-            </el-col>
-        </el-row>
+            <el-row>
+                <el-col :span="24">
+                    <el-form-item label="手机号" prop="mobileNumber">
+                        <el-input
+                        v-model="mobileForm.mobileNumber"
+                        placeholder="请输入手机号"
+                        clearable
+                        />
+                    </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                    <el-form-item label="验证码" prop="verificationCode">
+                        <el-input class="input-with-select" v-model="mobileForm.verificationCode" placeholder="请输入验证码">
+                            <template #append>
+                                <el-button :disabled="countdown > 0" @click="sendVerificationCode">
+                                    {{ countdown > 0 ? countdown + '秒后重新获取' : '获取验证码' }}
+                                </el-button>
+                            </template>
+                        </el-input>
+                    </el-form-item>
+                </el-col>
+            </el-row>
         </el-form>
         <template #footer>
-        <div class="dialog-footer">
-            <el-button type="primary" @click="submitPhoneForm">确 定</el-button>
-            <el-button @click="phoneCancel">取 消</el-button>
-        </div>
+            <div class="dialog-footer">
+                <el-button type="primary" @click="submitPhoneForm">确 定</el-button>
+                <el-button @click="phoneCancel">取 消</el-button>
+            </div>
         </template>
     </el-dialog>
 </template>
 
 <script setup>
+import { getConfig } from '@/config/config'
 import { useUserStore } from '@/store/user.js'
 import { passwordChange, sendSmsCode, userUnlock } from '@/api/login'
 import CryptoJS from 'crypto-js'
@@ -168,6 +165,7 @@ const username = ref('')
 const password = ref('')
 const { proxy } = getCurrentInstance()
 const countdown = ref(0) // 倒计时秒数
+const projectName = ref(getConfig('projectName'))
 
 const form = ref({
     username: null,
@@ -330,7 +328,7 @@ function phoneCancel() {
   height: 100%;
   display: flex;
   justify-content: space-between;
-  video#bgvid {
+  .el-carousel {
     position: fixed; //视频定位方式设为固定
     right: 0;
     bottom: 0; //视频位置
@@ -339,6 +337,11 @@ function phoneCancel() {
     width: auto;
     height: auto; //尺寸保持原视频大小
     z-index: -100; //z轴定位,小于0即可
+
+    img {
+      width: 100%;
+      height: 100%;
+    }
   }
 
   .left {

+ 10 - 7
src/views/manage/policyShare/dialog.vue

@@ -82,14 +82,16 @@
                         <el-input v-model="form.abstractContent" type="textarea" :rows="4" placeholder="请输入政策概要"></el-input>
                     </el-form-item>
                 </el-col>
-                <el-col v-if="mode == 'decode' || form.inWhType == '文件类'" :span="24">
-                    <el-form-item label="政策解读" prop="decodeContent">
-                        <el-input v-model="form.decodeContent" type="textarea" :rows="4" placeholder="请输入政策解读"></el-input>
-                    </el-form-item>
-                </el-col>
+                <template v-if="form.inWhType == '文件类'">
+                    <el-col v-if="(mode == 'decode' || (mode == 'detail' && form.decodeContent))" :span="24">
+                        <el-form-item label="政策解读" prop="decodeContent">
+                            <el-input v-model="form.decodeContent" type="textarea" :rows="4" placeholder="请输入政策解读"></el-input>
+                        </el-form-item>
+                    </el-col>
+                </template>
                 <el-col :span="24">
                     <el-form-item :class="mode == 'detail' && 'no-upload-btn'" label="附件">
-                        <yhUpload v-model="form.fileList" :limit="10" @updateTable="fileIsDel = true">
+                        <yhUpload v-model="form.fileList" v-model:isUpload="isUpload" :limit="10" @updateTable="fileIsDel = true">
                             <el-button type="primary" icon="upload" size="small"></el-button>
                         </yhUpload>
                     </el-form-item>
@@ -99,7 +101,7 @@
 
         <template #footer>
             <template v-if="mode != 'detail'">
-                <el-button type="primary" @click="submit(mode == 'decode' && 'edit' || mode)">确 定</el-button>
+                <el-button type="primary" :disabled="isUpload" @click="submit(mode == 'decode' && 'edit' || mode)">确 定</el-button>
             </template>
         </template>
     </el-dialog>
@@ -124,6 +126,7 @@ export default {
     data() {
         return {
             levelDic, typeDic, storageTypeDic, whetherDic,
+            isUpload: false,
 
             visible: false,
             mode: "saveDone",

+ 5 - 5
src/views/manage/policyShare/index.vue

@@ -50,7 +50,7 @@
             </div>
         </div>
         <div class="tjm_card_table">
-            <el-table v-loading="loading" row-key="id" header-cell-class-name="tjm_card_table_header" height="400" :data="tableData" border>
+            <el-table v-loading="loading" row-key="id" header-cell-class-name="tjm_card_table_header" height="400" :data="tableData" border @row-click="table_edit($event, 'detail')">
                 <el-table-column type="index" label="序号" width="55"></el-table-column>
                 <template v-for="(item, index) in columns" :key="index">
                     <el-table-column :label="item.label" :prop="item.props" :width="item.width || 180" show-overflow-tooltip>
@@ -59,12 +59,12 @@
                 </template>
                 <el-table-column label="操作" fixed="right" width="240">
                     <template #default="scope">
-                        <el-button type="primary" link icon="edit" @click="table_edit(scope.row)">修改</el-button>
-                        <el-button v-if="scope.row.isInWh == 1 && scope.row.inWhType == '文件类'" type="primary" link @click="table_edit(scope.row, 'decode')">
+                        <el-button type="primary" link icon="edit" @click.stop="table_edit(scope.row)">修改</el-button>
+                        <el-button v-if="scope.row.isInWh == 1 && scope.row.inWhType == '文件类'" type="primary" link @click.stop="table_edit(scope.row, 'decode')">
                             <template #icon><tjm-icon-fluent-emoji-high-contrast-open-book /></template>
                             添加解读
                         </el-button>
-                        <el-button type="primary" link icon="delete" @click="table_del(scope.row)">删除</el-button>
+                        <el-button type="primary" link icon="delete" @click.stop="table_del(scope.row)">删除</el-button>
                     </template>
                 </el-table-column>
             </el-table>
@@ -78,7 +78,7 @@
 </template>
 
 <script>
-import API from "@/api/policy/share"
+import API from "@/api/policy/share";
 import { exportExcel } from "@/utils/exportExcel";
 import { levelDic, typeDic, storageTypeDic, whetherDic } from "@/views/policyShare/main";
 import { columns } from "./main";

+ 12 - 6
src/views/manage/policyStrive/index.vue

@@ -42,7 +42,7 @@
             </div>
         </div>
         <div class="tjm_card_table">
-            <el-table v-loading="loading" row-key="id" header-cell-class-name="tjm_card_table_header" height="400" :data="tableData" border>
+            <el-table v-loading="loading" row-key="id" header-cell-class-name="tjm_card_table_header" height="400" :data="tableData" border @row-click="table_detail">
                 <el-table-column type="index" label="序号" width="55"></el-table-column>
                 <template v-for="(item, index) in columns" :key="index">
                     <el-table-column :label="item.label" :prop="item.props" :width="item.width || 180" show-overflow-tooltip>
@@ -51,9 +51,9 @@
                 </template>
                 <el-table-column label="操作" fixed="right" width="240">
                     <template #default="scope">
-                        <el-button type="primary" link icon="tickets" @click="table_detail(scope.row)">详情</el-button>
-                        <el-button v-if="scope.row.isReward == 0 && scope.row.isLand == 1 && scope.row.rewardRadix" type="primary" link icon="star" @click="table_score(scope.row)">打分</el-button>
-                        <el-button v-if="scope.row.rewardScore" type="primary" link @click="table_reward(scope.row)">
+                        <el-button type="primary" link icon="tickets" @click.stop="table_detail(scope.row)">详情</el-button>
+                        <el-button v-if="scope.row.isReward == 0 && scope.row.isLand == 1 && scope.row.rewardRadix" type="primary" link icon="star" @click.stop="table_score(scope.row)">打分</el-button>
+                        <el-button v-if="scope.row.rewardScore" type="primary" link @click.stop="table_reward(scope.row)">
                             <template #icon><tjm-icon-tabler-arrows-split-2 /></template>
                             奖励分配
                         </el-button>
@@ -72,7 +72,7 @@
 </template>
 
 <script>
-import API from "@/api/policy/strive"
+import API from "@/api/policy/strive";
 import { exportExcel } from "@/utils/exportExcel";
 import { levelDic, typeDic } from "@/views/policyShare/main";
 import { columns, statusDic } from "./main";
@@ -171,4 +171,10 @@ export default {
         }
     }
 }
-</script>
+</script>
+
+<style lang="scss" scoped>
+.tjm_card_style_custom .tjm_card_tools {
+  justify-content: flex-end;
+}
+</style>

+ 0 - 7
src/views/manage/policyStrive/main.js

@@ -23,11 +23,4 @@ export const columns = [
 export const statusDic = {
     0: "争取中",
     1: "已落地"
-}
-
-// 考核基数
-export const rewardRadixDic = {
-    "国家级": 30,
-    "省部级": 20,
-    "市区级": 10
 }

+ 4 - 4
src/views/manage/policyStrive/scoreDialog.vue

@@ -12,22 +12,22 @@
 						<el-input-number v-model="form.rewardRadix" readonly :controls="false"></el-input-number>
                     </el-form-item>
                 </el-col>
-                <el-col :push="2" :span="20">
+                <el-col :span="12">
                     <el-form-item label="实施难易程度" prop="implementScore">
                         <el-input-number v-model="form.implementScore" :min="0" :max="1" :step="0.1" :precision="2" :controls="false" placeholder="实施难易程度" @change="calcWeight"></el-input-number>
                     </el-form-item>
                 </el-col>
-                <el-col :push="2" :span="20">
+                <el-col :span="12">
                     <el-form-item label="复制推广潜力" prop="promotionScore">
                         <el-input-number v-model="form.promotionScore" :min="0" :max="1" :step="0.1" :precision="2" :controls="false" placeholder="复制推广潜力" @change="calcWeight"></el-input-number>
                     </el-form-item>
                 </el-col>
-                <el-col :push="2" :span="20">
+                <el-col :span="12">
                     <el-form-item label="政策争取效果" prop="striveScore">
                         <el-input-number v-model="form.striveScore" :min="0" :max="1" :step="0.1" :precision="2" :controls="false" placeholder="政策争取效果" @change="calcWeight"></el-input-number>
                     </el-form-item>
                 </el-col>
-                <el-col :push="2" :span="20">
+                <el-col :span="12">
                     <el-form-item label="奖励标准" prop="rewardScore">
 						<el-input-number v-model="form.rewardScore" readonly :controls="false"></el-input-number>
                     </el-form-item>

+ 4 - 3
src/views/policyShare/dialog.vue

@@ -63,7 +63,7 @@
                 </el-col>
                 <el-col :span="24">
                     <el-form-item label="附件">
-                        <yhUpload v-model="form.fileList" :limit="10" @updateTable="fileIsDel = true">
+                        <yhUpload v-model="form.fileList" v-model:isUpload="isUpload" :limit="10" @updateTable="fileIsDel = true">
                             <el-button type="primary" icon="upload" size="small"></el-button>
                         </yhUpload>
                     </el-form-item>
@@ -72,8 +72,8 @@
         </el-form>
 
         <template #footer>
-            <el-button type="primary" @click="submit(mode)">保 存</el-button>
-            <el-button type="primary" @click="submit('saveApprove')">直接上报</el-button>
+            <el-button type="primary" :disabled="isUpload" @click="submit(mode)">保 存</el-button>
+            <el-button type="primary" :disabled="isUpload" @click="submit('saveApprove')">直接上报</el-button>
         </template>
     </el-dialog>
 </template>
@@ -97,6 +97,7 @@ export default {
     data() {
         return {
             levelDic, typeDic,
+            isUpload: false,
 
             visible: false,
             mode: "add",

+ 10 - 11
src/views/policyShare/index.vue

@@ -56,7 +56,7 @@
             </div>
         </div>
         <div class="tjm_card_table">
-            <el-table v-loading="loading" row-key="id" header-cell-class-name="tjm_card_table_header" height="400" :data="tableData" border>
+            <el-table v-loading="loading" row-key="id" header-cell-class-name="tjm_card_table_header" height="400" :data="tableData" border @row-click="table_detail">
                 <el-table-column type="index" label="序号" width="55"></el-table-column>
                 <template v-for="(item, index) in columns" :key="index">
                     <el-table-column :label="item.label" :prop="item.props" :width="item.width || 180" show-overflow-tooltip>
@@ -66,12 +66,12 @@
                 <el-table-column label="操作" fixed="right" width="220">
                     <template #default="scope">
                         <template v-if="scope.row.status == 'active' || scope.row.status == 'inactive'">
-                            <el-button type="primary" link icon="edit" @click="table_edit(scope.row)">修改</el-button>
-                            <el-button type="primary" link icon="upload" @click="table_update(scope.row)">提交</el-button>
-                            <el-button type="primary" link icon="delete" @click="table_del(scope.row)">删除</el-button>
+                            <el-button type="primary" link icon="edit" @click.stop="table_edit(scope.row)">修改</el-button>
+                            <el-button type="primary" link icon="upload" @click.stop="table_edit(scope.row)">上报</el-button>
+                            <el-button type="primary" link icon="delete" @click.stop="table_del(scope.row)">删除</el-button>
                         </template>
-                        <el-button v-if="scope.row.status == 'approve' || scope.row.status == 'done'" type="primary" link icon="tickets" @click="table_detail(scope.row)">详情</el-button>
-                        <el-button v-if="scope.row.status == 'approve'" type="primary" link icon="refresh-right" @click="table_update(scope.row, 'withdraw')">撤回</el-button>
+                        <el-button v-if="scope.row.status == 'approve' || scope.row.status == 'done'" type="primary" link icon="tickets" @click.stop="table_detail(scope.row)">详情</el-button>
+                        <el-button v-if="scope.row.status == 'approve'" type="primary" link icon="refresh-right" @click.stop="table_withdraw(scope.row)">撤回</el-button>
                     </template>
                 </el-table-column>
             </el-table>
@@ -86,7 +86,7 @@
 </template>
 
 <script>
-import API from "@/api/policy/share"
+import API from "@/api/policy/share";
 import { exportExcel } from "@/utils/exportExcel";
 import { columns, levelDic, typeDic, storageTypeDic, whetherDic, statusDic } from "./main";
 
@@ -197,14 +197,13 @@ export default {
             });
         },
 
-        table_update(row, mode = "saveApprove") {
-            const msg = mode == "withdraw" && "撤回" || "提交";
-            ElMessageBox.confirm(`是否确认${msg}?`, "提示", {
+        table_withdraw(row) {
+            ElMessageBox.confirm("是否确认撤回?", "提示", {
                 type: "warning",
                 confirmButtonText: "确定",
                 cancelButtonText: "取消"
             }).then(() => {
-                API[mode](row).then(res => {
+                API.withdraw(row).then(res => {
                     if (res.code === 200) {
                         ElMessage.success("操作成功");
                         this.reloadTable();

+ 2 - 2
src/views/policyShare/main.js

@@ -19,8 +19,8 @@ export const typeDic = ["财税政策", "人才支持", "市场开拓", "智慧
 export const storageTypeDic = ["文件类", "解读类"]
 export const whetherDic = { 0: "否", 1: "是" }
 export const statusDic = {
-    active: "保存",
-    approve: "审核",
+    active: "待上报",
+    approve: "审核",
     done: "审核通过",
     inactive: "退回"
 }

+ 5 - 5
src/views/policyStrive/dialog.vue

@@ -85,7 +85,7 @@
                 </el-col>
                 <el-col :span="24">
                     <el-form-item label="附件">
-                        <yhUpload v-model="form.fileList" :limit="10" @updateTable="fileIsDel = true">
+                        <yhUpload v-model="form.fileList" v-model:isUpload="isUpload" :limit="10" @updateTable="fileIsDel = true">
                             <el-button type="primary" icon="upload" size="small"></el-button>
                         </yhUpload>
                     </el-form-item>
@@ -94,8 +94,8 @@
         </el-form>
 
         <template #footer>
-            <el-button type="primary" @click="submit(mode)">保 存</el-button>
-            <el-button type="primary" @click="submit('saveApprove')">直接上报</el-button>
+            <el-button type="primary" :disabled="isUpload" @click="submit(mode)">保 存</el-button>
+            <el-button type="primary" :disabled="isUpload" @click="submit('saveApprove')">直接上报</el-button>
         </template>
     </el-dialog>
 </template>
@@ -120,6 +120,7 @@ export default {
     data() {
         return {
             levelDic, typeDic, rewardTypeDic,
+            isUpload: false,
 
             visible: false,
             mode: "add",
@@ -163,8 +164,7 @@ export default {
                 abstractContent: [{ required: true, message: "请输入政策概要" }]
             },
 
-            fileIsDel: false,
-            dialog: false
+            fileIsDel: false
         }
     },
 

+ 1 - 1
src/views/policyStrive/explain.vue

@@ -91,7 +91,7 @@
             </el-row>
         </el-form>
 
-        <el-form ref="formRef" :model="form" :rules="rules" :disabled="mode == 'detail'" label-width="110px">
+        <el-form v-if="mode == 'explain' || (mode == 'detail' && form.monthSituation)" ref="formRef" :model="form" :rules="rules" :disabled="mode == 'detail'" label-width="110px">
             <el-row>
                 <el-col :span="12">
                     <el-form-item label="是否已落地" prop="isLand">

+ 13 - 13
src/views/policyStrive/index.vue

@@ -63,7 +63,7 @@
             </div>
         </div>
         <div class="tjm_card_table">
-            <el-table v-loading="loading" row-key="id" header-cell-class-name="tjm_card_table_header" height="400" :data="tableData" border>
+            <el-table v-loading="loading" row-key="id" header-cell-class-name="tjm_card_table_header" height="400" :data="tableData" border @row-click="table_detail($event)">
                 <el-table-column type="index" label="序号" width="55"></el-table-column>
                 <template v-for="(item, index) in columns" :key="index">
                     <el-table-column :label="item.label" :prop="item.props" :width="item.width || 180" show-overflow-tooltip>
@@ -73,12 +73,13 @@
                 <el-table-column label="操作" fixed="right" width="230">
                     <template #default="scope">
                         <template v-if="scope.row.status == 'active' || scope.row.status == 'inactive'">
-                            <el-button type="primary" link icon="edit" @click="table_edit(scope.row)">修改</el-button>
-                            <el-button type="primary" link icon="upload" @click="table_update(scope.row)">提交</el-button>
-                            <el-button type="primary" link icon="delete" @click="table_del(scope.row)">删除</el-button>
+                            <el-button type="primary" link icon="edit" @click.stop="table_edit(scope.row)">修改</el-button>
+                            <el-button type="primary" link icon="upload" @click.stop="table_edit(scope.row)">上报</el-button>
+                            <el-button type="primary" link icon="delete" @click.stop="table_del(scope.row)">删除</el-button>
                         </template>
-                        <el-button v-if="scope.row.status == 'approve'" type="primary" link icon="refresh-right" @click="table_update(scope.row, 'withdraw')">撤回</el-button>
-                        <el-button v-if="scope.row.status == 'done'" type="primary" link icon="info-filled" @click="table_explain(scope.row)">月度争取情况说明</el-button>
+                        <el-button v-if="scope.row.status == 'approve' || scope.row.status == 'done'" type="primary" link icon="tickets" @click.stop="table_detail(scope.row)">详情</el-button>
+                        <el-button v-if="scope.row.status == 'approve'" type="primary" link icon="refresh-right" @click.stop="table_withdraw(scope.row)">撤回</el-button>
+                        <el-button v-if="scope.row.status == 'done'" type="primary" link icon="info-filled" @click.stop="table_detail(scope.row, 'explain')">月度争取情况说明</el-button>
                     </template>
                 </el-table-column>
             </el-table>
@@ -93,7 +94,7 @@
 </template>
 
 <script>
-import API from "@/api/policy/strive"
+import API from "@/api/policy/strive";
 import { exportExcel } from "@/utils/exportExcel";
 import { levelDic, typeDic, whetherDic } from "@/views/policyShare/main";
 import { columns, statusDic } from "./main";
@@ -200,14 +201,13 @@ export default {
             });
         },
 
-        table_update(row, mode = "saveApprove") {
-            const msg = mode == "withdraw" && "撤回" || "提交";
-            ElMessageBox.confirm(`是否确认${msg}?`, "提示", {
+        table_withdraw(row) {
+            ElMessageBox.confirm("是否确认撤回?", "提示", {
                 type: "warning",
                 confirmButtonText: "确定",
                 cancelButtonText: "取消"
             }).then(() => {
-                API[mode](row).then(res => {
+                API.withdraw(row).then(res => {
                     if (res.code === 200) {
                         ElMessage.success("操作成功");
                         this.reloadTable();
@@ -216,9 +216,9 @@ export default {
             });
         },
 
-        table_explain(row) {
+        table_detail(row, mode = "detail") {
             this.dialog.explain = true;
-            this.$nextTick(() => this.$refs.policyExplain.open().setData(row.id));
+            this.$nextTick(() => this.$refs.policyExplain.open(mode).setData(row.id));
         },
 
         closed(e) {

+ 2 - 2
src/views/policyStrive/main.js

@@ -25,8 +25,8 @@ export const rewardTypeDic = {
 }
 
 export const statusDic = {
-    active: "保存",
-    approve: "审核",
+    active: "待上报",
+    approve: "审核",
     done: "争取中",
     inactive: "退回"
 }

+ 5 - 5
src/views/publicDomain/index.vue

@@ -32,16 +32,16 @@
         <el-divider></el-divider>
 
         <div class="tjm_card_table">
-            <el-table v-loading="loading" row-key="id" header-cell-class-name="tjm_card_table_header" height="400" :data="tableData" border>
+            <el-table v-loading="loading" row-key="id" header-cell-class-name="tjm_card_table_header" height="400" :data="tableData" border @row-click="table_detail">
                 <el-table-column type="index" label="序号" width="55"></el-table-column>
                 <template v-for="(item, index) in columns" :key="index">
                     <el-table-column :label="item.label" :prop="item.props" :width="item.width || 180" show-overflow-tooltip></el-table-column>
                 </template>
                 <el-table-column label="操作" fixed="right" width="240">
                     <template #default="scope">
-                        <el-button type="primary" link icon="tickets" @click="table_detail(scope.row)">详情</el-button>
-                        <el-button type="primary" link icon="link" @click="table_link(scope.row)">政策关联</el-button>
-                        <el-button type="primary" link icon="chat-line-square" @click="table_msg(scope.row)">留言</el-button>
+                        <el-button type="primary" link icon="tickets" @click.stop="table_detail(scope.row)">详情</el-button>
+                        <el-button type="primary" link icon="link" @click.stop="table_link(scope.row)">政策关联</el-button>
+                        <el-button type="primary" link icon="chat-line-square" @click.stop="table_msg(scope.row)">留言</el-button>
                     </template>
                 </el-table-column>
             </el-table>
@@ -56,7 +56,7 @@
 </template>
 
 <script>
-import API from "@/api/policy/share"
+import API from "@/api/policy/share";
 import { levelDic, typeDic } from "@/views/policyShare/main";
 import { columns } from "./main";
 

+ 2 - 2
src/views/publicDomain/link.vue

@@ -37,7 +37,7 @@
             <el-divider></el-divider>
 
             <div class="tjm_card_table">
-                <el-table v-loading="loading" row-key="id" header-cell-class-name="tjm_card_table_header" height="400" :data="tableData" border>
+                <el-table v-loading="loading" row-key="id" header-cell-class-name="tjm_card_table_header" height="400" :data="tableData" border @row-click="table_detail($event)">
                     <el-table-column type="index" label="序号" width="55"></el-table-column>
                     <template v-for="(item, index) in link_columns" :key="index">
                         <el-table-column :label="item.label" :prop="item.props" :width="item.width || 180" show-overflow-tooltip>
@@ -46,7 +46,7 @@
                     </template>
                     <el-table-column label="操作" fixed="right" width="100">
                         <template #default="scope">
-                            <el-button type="primary" link icon="tickets" @click="table_detail(scope.row)">详情</el-button>
+                            <el-button type="primary" link icon="tickets" @click.stop="table_detail(scope.row)">详情</el-button>
                         </template>
                     </el-table-column>
                 </el-table>

+ 2 - 2
src/views/system/menu.vue

@@ -64,7 +64,7 @@
                     style="width: 100%"
                     :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
                     row-key="id"
-                    :default-expand-all="isExpandAll"
+                    :expand-row-keys="expandKeys"
                 >
                     <el-table-column type="selection" width="55" />
                     <el-table-column prop="name" label="菜单名称" width="180" />
@@ -273,7 +273,7 @@ const { proxy } = getCurrentInstance()
 import { ClickOutside as vClickOutside } from 'element-plus'
 
 const loading = ref(false) //加载
-const isExpandAll = ref(true) //展开
+const expandKeys = reactive(["1", "1762659463383281665"]) //展开
 const tableData = ref([])
 const selectTableData = ref([])
 const formInline = ref({})

+ 2 - 2
src/views/system/role.vue

@@ -186,7 +186,7 @@
                         :props="defaultProps"
                     />
                 </el-tab-pane>
-                <el-tab-pane label="数据权限" name="second">
+                <!-- <el-tab-pane label="数据权限" name="second">
                     <el-tree
                         :key="checkedMenuKeys2"
                         ref="treeRef2"
@@ -197,7 +197,7 @@
                         :default-checked-keys="checkedMenuKeys2"
                         :props="defaultProps"
                     />
-                </el-tab-pane>
+                </el-tab-pane> -->
             </el-tabs>
             <template #footer>
                 <div class="dialog-footer">

+ 55 - 0
src/views/system/template/index.vue

@@ -0,0 +1,55 @@
+<template>
+    <el-card class="tjm_card_style_custom">
+        <div class="tjm_card_tools">
+            <div class="tjm_card_tools_left">
+                <el-button type="primary" icon="plus" @click="table_add">新增</el-button>
+            </div>
+        </div>
+
+        <div class="tjm_card_table">
+            <el-table v-loading="loading" row-key="id" header-cell-class-name="tjm_card_table_header" height="400" :data="tableData" border>
+                <el-table-column type="index" label="序号" width="55"></el-table-column>
+                <el-table-column label="模板名称" prop="name"></el-table-column>
+                <el-table-column label="模板类型" prop="type"></el-table-column>
+
+                <el-table-column label="操作" fixed="right" width="240">
+                    <template #default="scope">
+                        <el-button type="primary" link icon="edit" @click="table_edit(scope.row)">修改</el-button>
+                        <el-button type="primary" link icon="delete" @click="table_del(scope.row)">删除</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+        </div>
+    </el-card>
+</template>
+
+<script>
+import API from "@/api/policy/share";
+
+export default {
+    components: {
+    },
+
+    data() {
+        return {
+            loading: false,
+            tableData: []
+        }
+    },
+
+    mounted() {
+        this.reloadTable();
+    },
+
+    methods: {
+        reloadTable() {
+            this.loading = true;
+            API.get(this.params).then(res => {
+                this.loading = false;
+                if (res.code === 200) this.tableData = res.data.records;
+                else ElMessage.error(res.msg);
+            }).catch(() => this.loading = false);
+        }
+    }
+}
+</script>

+ 182 - 0
src/views/toDo/case.vue

@@ -0,0 +1,182 @@
+<template>
+    <el-dialog v-model="visible" title="详情" width="680" @closed="$emit('closed')">
+        <el-form ref="formRef" :model="form" :rules="rules" disabled label-width="110px">
+            <el-row>
+                <el-col v-if="form.id" :span="12">
+                    <el-form-item label="案例编号" prop="businessNo">
+                        <el-input v-model="form.businessNo" readonly :disabled="mode != 'add'"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="项目名称" prop="policyStrive.name">
+                        <el-input v-model="form.policyStrive.name" readonly placeholder="点击选择政策争取"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="填报人">
+                        <el-input v-model="form.policyStrive.createName" readonly placeholder="自动带出"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="填报部门">
+                        <el-input v-model="form.policyStrive.deptName" readonly placeholder="自动带出"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="填报单位">
+                        <el-input v-model="form.policyStrive.companyName" readonly placeholder="自动带出"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col v-if="form.id" :span="12">
+                    <el-form-item label="填报时间">
+                        <el-date-picker v-model="form.createTime" readonly format="YYYY-MM-DD HH:mm:ss"></el-date-picker>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="项目等级" required>
+                        <el-input v-model="form.policyStrive.zcLevel" readonly placeholder="自动带出"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="项目类别" required>
+                        <el-input v-model="form.policyStrive.zcType" readonly placeholder="自动带出"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="政策文号" required>
+                        <el-input v-model="form.policyStrive.docNo" readonly placeholder="自动带出"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="联系方式" required>
+                        <el-input v-model="form.policyStrive.contactPhone" readonly placeholder="自动带出"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                    <el-form-item label="项目概要" required>
+                        <el-input v-model="form.policyStrive.abstractContent" type="textarea" :rows="4" readonly placeholder="自动带出"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                    <el-form-item label="经验分享" prop="expContent">
+                        <el-input v-model="form.expContent" type="textarea" :rows="4" placeholder="请输入经验"></el-input>
+                    </el-form-item>
+                </el-col>
+
+                <el-col :span="24">
+                    <el-form-item class="no-upload-btn" label="附件">
+                        <yhUpload v-model="form.policyStrive.fileList" disabled :limit="10">
+                            <el-button type="primary" icon="upload" size="small"></el-button>
+                        </yhUpload>
+                    </el-form-item>
+                </el-col>
+            </el-row>
+        </el-form>
+
+        <template #footer>
+            <el-button type="primary" @click="submit">确 定</el-button>
+        </template>
+    </el-dialog>
+</template>
+
+<script>
+import API from "@/api/policy/case";
+import yhUpload from "@/components/Upload/index.vue";
+
+export default {
+    emits: ["success", "closed"],
+    
+    components: {
+        yhUpload
+    },
+
+    data() {
+        return {
+            visible: false,
+            mode: "agree",
+
+            form: {
+                id: null,
+                striveId: null,
+                policyStrive: {
+                    id: null,
+                    name: null,
+                    createName: null,
+                    companyName: null,
+                    deptName: null,
+                    zcLevel: null,
+                    zcType: null,
+                    docNo: null,
+                    contactPhone: null,
+                    abstractContent: null,
+                    fileList: []
+                },
+                businessNo: null,
+                status: null,
+                createId: null,
+                createName: null,
+                createTime: null,
+                expContent: null
+            },
+
+            rules: {
+                businessNo: [{ required: true }],
+                "policyStrive.name": [{ required: true, message: "请选择政策争取" }],
+                expContent: [{ required: true, message: "请输入经验" }]
+            }
+        }
+    },
+
+    methods: {
+        open(mode = "agree") {
+            this.mode = mode;
+            this.visible = true;
+            return this;
+        },
+
+        setData(id) {
+            API.detail(id).then(res => {
+                if (res.code === 200) {
+                    for (const key in this.form) {
+                        if (key == "policyStrive") {
+                            for (const striveKey in this.form[key]) {
+                                if (striveKey == "fileList") this.form[key][striveKey] = res.data[key][striveKey].map(file => ({ ...file, name: file.originalName, path: file.fileDomain + "/" + file.fileName }));
+                                else this.form[key][striveKey] = res.data[key][striveKey] || null;
+                            }
+                        } else this.form[key] = res.data[key] || null;
+                    }
+                } else ElMessage.error(res.msg);
+            });
+        },
+
+        // 表单提交方法
+        submit(mode) {
+            this.$refs.formRef.validate(valid => {
+                if (valid) {
+                    API[this.mode]({ id: this.form.id }).then(res => {
+                        if (res.code === 200) {
+                            ElMessage.success("操作成功");
+                            this.visible = false;
+                            this.$emit("success");
+                        } else ElMessage.error(res.msg);
+                    });
+                } else {
+                    return false;
+                }
+            });
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.no-upload-btn :deep(.yh-upload-file) {
+  .el-upload {
+    display: none;
+  }
+
+  .el-upload-list.is-disabled {
+    margin-top: 0;
+  }
+}
+</style>

+ 17 - 26
src/views/toDo/index.vue

@@ -35,8 +35,8 @@
                 <el-table-column label="填报时间" prop="zcCreateTime" width="180" show-overflow-tooltip></el-table-column>
                 <el-table-column label="操作" fixed="right" width="160">
                     <template #default="scope">
-                        <el-button type="primary" link icon="circle-check" @click="table_approve(scope.row)">通过</el-button>
-                        <el-button type="primary" link icon="circle-close" @click="table_approve(scope.row, 'refuse')">退回</el-button>
+                        <el-button type="primary" link icon="circle-check" @click.stop="table_approve(scope.row)">通过</el-button>
+                        <el-button type="primary" link icon="circle-close" @click.stop="table_approve(scope.row, 'refuse')">退回</el-button>
                     </template>
                 </el-table-column>
             </el-table>
@@ -46,22 +46,27 @@
         </div>
     </el-card>
 
-    <policy-share v-if="dialog" ref="policyShare" @success="reloadTable" @closed="dialog = false"></policy-share>
+    <policy-share v-if="dialog.policy_share" ref="policy_share" @success="reloadTable" @closed="dialog.policy_share = false"></policy-share>
+    <policy-strive v-if="dialog.policy_strive" ref="policy_strive" @success="reloadTable" @closed="dialog.policy_strive = false"></policy-strive>
+    <policy-case v-if="dialog.policy_case" ref="policy_case" @success="reloadTable" @closed="dialog.policy_case = false"></policy-case>
 </template>
 
 <script>
 import API from "@/api/policy/todo";
-import Strive from "@/api/policy/strive";
 import { useUserStore } from "@/store/user";
 import { typeDic } from "@/views/policyShare/main";
 
 import yhPagination from "@/components/Pagination/index.vue";
 import policyShare from "./share.vue";
+import policyStrive from "./strive.vue";
+import policyCase from "./case.vue";
 
 export default {
     components: {
         yhPagination,
-        policyShare
+        policyShare,
+        policyStrive,
+        policyCase
     },
 
     data() {
@@ -79,7 +84,11 @@ export default {
             total: 0,
             tableData: [],
 
-            dialog: false
+            dialog: {
+                policy_share: false,
+                policy_strive: false,
+                policy_case: false
+            }
         }
     },
 
@@ -113,26 +122,8 @@ export default {
         },
     
         table_approve({ refId, refType }, mode = "agree") {
-            if (refType == "policy_share") {
-                this.dialog = true;
-                this.$nextTick(() => this.$refs.policyShare.open(mode).setData(refId));
-            }
-            
-            if (refType == "policy_strive") {
-                const msg = mode == "agree" && "同意" || "退回";
-                ElMessageBox.confirm(`是否确认${msg}?`, "提示", {
-                    type: "warning",
-                    confirmButtonText: "确定",
-                    cancelButtonText: "取消"
-                }).then(() => {
-                    Strive[mode]({ id: refId }).then(res => {
-                        if (res.code === 200) {
-                            ElMessage.success("操作成功");
-                            this.reloadTable();
-                        } else ElMessage.error(res.msg);
-                    });
-                });
-            }
+            this.dialog[refType] = true;
+            this.$nextTick(() => this.$refs[refType].open(mode).setData(refId));
         }
     }
 }

+ 2 - 8
src/views/toDo/share.vue

@@ -1,5 +1,5 @@
 <template>
-    <el-dialog v-model="visible" :title="titleMap[mode]" width="680" @closed="$emit('closed')">
+    <el-dialog v-model="visible" title="详情" width="680" @closed="$emit('closed')">
         <el-form :model="form" :rules="rules" disabled label-width="110px">
             <el-row>
                 <el-col :span="12">
@@ -100,9 +100,7 @@
         </el-form>
 
         <template #footer>
-            <template v-if="mode == 'agree' || mode == 'refuse'">
-                <el-button type="primary" @click="submit">确 定</el-button>
-            </template>
+            <el-button type="primary" @click="submit">确 定</el-button>
         </template>
     </el-dialog>
 </template>
@@ -126,10 +124,6 @@ export default {
 
             visible: false,
             mode: "agree",
-            titleMap: {
-                agree: "考核评分",
-                refuse: "退回意见"
-            },
             form: {
                 id: null,
                 businessNo: null,

+ 214 - 0
src/views/toDo/strive.vue

@@ -0,0 +1,214 @@
+<template>
+    <el-dialog v-model="visible" title="详情" width="680" @closed="$emit('closed')">
+        <el-form ref="formRef" :model="form" :rules="rules" disabled label-width="110px">
+            <el-row>
+                <el-col v-if="form.id" :span="12">
+                    <el-form-item label="政策编号" prop="businessNo">
+                        <el-input v-model="form.businessNo" readonly></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="填报人">
+                        <el-input v-model="form.createName" readonly></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="填报部门">
+                        <el-input v-model="form.deptName" readonly></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="填报单位">
+                        <el-input v-model="form.companyName" readonly></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col v-if="form.id" :span="12">
+                    <el-form-item label="填报时间">
+                        <el-date-picker v-model="form.createTime" readonly format="YYYY-MM-DD HH:mm:ss"></el-date-picker>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="项目名称" prop="name">
+                        <el-input v-model="form.name" placeholder="请输入项目名称"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="项目等级" prop="zcLevel">
+                        <el-input v-model="form.zcLevel" placeholder="请选择项目等级"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="项目类别" prop="zcType">
+                        <el-input v-model="form.zcType" placeholder="请选择项目类别"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="政策文号" prop="docNo">
+                        <el-input v-model="form.docNo" placeholder="请输入政策文号"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="联系方式" prop="contactPhone">
+                        <el-input v-model="form.contactPhone" placeholder="请输入联系方式"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="预计争取金额" prop="yjStriveAmount">
+                        <el-input-number v-model="form.yjStriveAmount" :min="0" :step="0.1" :precision="2" :controls="false" placeholder="请输入预计争取金额"></el-input-number>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="预计完成时间" prop="yjFinishTime">
+                        <el-date-picker v-model="form.yjFinishTime" value-format="YYYY-MM-DD" placeholder="请选择预计完成时间"></el-date-picker>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="责任人" prop="directorName">
+                        <el-input v-model="form.directorName" placeholder="请输入责任人"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                    <el-form-item label="政策考核类别" prop="rewardType">
+                        <el-radio-group v-model="form.rewardType">
+                            <el-radio v-for="(label, key) in rewardTypeDic" :key="key" :label="label" :value="parseInt(key)"></el-radio>
+                        </el-radio-group>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                    <el-form-item label="项目概要" prop="abstractContent">
+                        <el-input v-model="form.abstractContent" type="textarea" :rows="4" placeholder="请输入项目概要"></el-input>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                    <el-form-item class="no-upload-btn" label="附件">
+                        <yhUpload v-model="form.fileList" :limit="10">
+                            <el-button type="primary" icon="upload" size="small"></el-button>
+                        </yhUpload>
+                    </el-form-item>
+                </el-col>
+            </el-row>
+        </el-form>
+
+        <template #footer>
+            <el-button type="primary" @click="submit">确 定</el-button>
+        </template>
+    </el-dialog>
+</template>
+
+<script>
+import API from "@/api/policy/strive";
+import { rewardTypeDic } from "@/views/policyStrive/main";
+import yhUpload from "@/components/Upload/index.vue";
+
+export default {
+    emits: ["success", "closed"],
+    
+    components: {
+        yhUpload
+    },
+
+    data() {
+        return {
+            rewardTypeDic,
+
+            visible: false,
+            mode: "agree",
+            form: {
+                id: null,
+                businessNo: null,
+                status: null,
+                createId: null,
+                createName: null,
+                createTime: null,
+                name: null,
+                companyName: null,
+                deptName: null,
+                zcLevel: null,
+                zcType: null,
+                docNo: null,
+                contactPhone: null,
+                directorName: null,
+                yjFinishTime: null,
+                yjStriveAmount: null,
+                rewardType: null,
+                abstractContent: null,
+                fileList: []
+            },
+
+            rules: {
+                businessNo: [{ required: true }],
+                name: [{ required: true, message: "请输入政策名称" }],
+                zcLevel: [{ required: true, message: "请选择政策等级" }],
+                zcType: [{ required: true, message: "请选择政策类别" }],
+                docNo: [{ required: true, message: "请输入政策文号" }],
+                contactPhone: [{ required: true, message: "请输入联系方式" }],
+                directorName: [{ required: true, message: "请输入责任人" }],
+                yjFinishTime: [{ required: true, message: "请选择预计完成时间" }],
+                yjStriveAmount: [{ required: true, message: "请输入预计争取金额" }],
+                rewardType: [{ required: true, message: "请选择政策考核类别" }],
+                abstractContent: [{ required: true, message: "请输入政策概要" }]
+            }
+        }
+    },
+
+    methods: {
+        open(mode = "agree") {
+            this.mode = mode;
+            this.visible = true;
+            return this;
+        },
+
+        setData(id) {
+            API.detail(id).then(res => {
+                if (res.code === 200) {
+                    for (const key in this.form) {
+                        if (key == "fileList") this.form[key] = res.data[key].map(file => ({ ...file, name: file.originalName, path: file.fileDomain + "/" + file.fileName }));
+                        else this.form[key] = res.data[key] || null;
+                    }
+                } else ElMessage.error(res.msg);
+            });
+        },
+
+        // 表单提交方法
+        submit() {
+            this.$refs.formRef.validate(valid => {
+                if (valid) {
+                    API[this.mode]({ id: this.form.id }).then(res => {
+                        if (res.code === 200) {
+                            ElMessage.success("操作成功");
+                            this.visible = false;
+                            this.$emit("success");
+                        } else ElMessage.error(res.msg);
+                    });
+                } else {
+                    return false;
+                }
+            });
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.no-upload-btn :deep(.yh-upload-file) {
+  .el-upload {
+    display: none;
+  }
+
+  .el-upload-list.is-disabled {
+    margin-top: 0;
+  }
+}
+
+.el-input-number {
+  width: 100%;
+
+  :deep(.el-input) .el-input__wrapper {
+    padding: 1px 11px;
+
+    .el-input__inner {
+      text-align: unset;
+    }
+  }
+}
+</style>