zhuangyunsheng vor 1 Jahr
Ursprung
Commit
c4fe4c0797

+ 4 - 0
src/assets/style/elementPlusCustom.scss

@@ -3,4 +3,8 @@
 //去除 [ dropdown ]移入 黑框
 .el-tooltip__trigger:focus-visible {
     outline: unset;
+}
+
+.el-date-editor.el-input, .el-date-editor.el-input__wrapper {
+    --el-date-editor-width: 100%;
 }

+ 1 - 1
src/assets/style/variable.scss

@@ -36,4 +36,4 @@ $base-tag-item-height: 34px;
 
 //====================
 //main显示相关
-$base-main-height: calc(100vh - $base-navbar-height - $base-tabsbar-height - $base-padding - $base-padding - $base-padding);
+$base-main-height: calc(100vh - $base-navbar-height - $base-tabsbar-height - $base-padding - $base-padding);

+ 0 - 3
src/components/ReplyCard/index.vue

@@ -128,9 +128,6 @@ export default {
 
 .reply-card {
   --el-card-border-color: var(--el-border-color-lighter);
-  margin-bottom: 25px;
-  border-top: none;
-  border-radius: 0;
 
   :deep(.el-card__header) {
     display: flex;

+ 11 - 4
src/layout/components/Main/index.vue

@@ -1,11 +1,14 @@
 <script setup>
-  import { useTabsBarStore } from '@/store/tabsbar.js'
-  const cachedViews = useTabsBarStore().cachedViews
-  // v-if="!route.meta.link"
+import { useTabsBarStore } from "@/store/tabsbar";
+const cachedViews = useTabsBarStore().cachedViews;
+
+const props = defineProps({
+    hasTabs: { type: Boolean, default: true }
+});
 </script>
 
 <template>
-    <section class="tjm_main_content_container">
+    <section :class="['tjm_main_content_container', !hasTabs && 'no-tabs-bar']">
         <router-view v-slot="{ Component, route }">
             <transition-group appear name="fade-transform" mode="out-in">
                 <keep-alive :include="cachedViews">
@@ -22,4 +25,8 @@
   background-color: inherit;
   padding: $base-padding;
 }
+
+.no-tabs-bar {
+  min-height: calc(#{$base-main-height} + #{$base-tabsbar-height});
+}
 </style>

+ 2 - 2
src/layout/components/NavBar/components/Breadcrumb.vue

@@ -28,8 +28,8 @@ function getBreadcrumb() {
 function isDashboard(route) {
     return route && route.name && route.name.trim() === "Index"
 }
-function handleLink({ redirect, path }) {
-    redirect && router.push(redirect)
+function handleLink({ redirect }) {
+    if (redirect && redirect != route.path) redirect && router.push({ path: redirect });
 }
 
 watchEffect(() => {

+ 2 - 2
src/layout/components/NavBar/index.vue

@@ -1,6 +1,6 @@
 <template>
-    <div :class="{'tjm_navbar_container':true,'layoutStyleHorizontal':layoutStyle=='horizontal'}">
-        <div class="tjm_navbar_left" v-if="layoutStyle=='vertical'">
+    <div :class="{'tjm_navbar_container': true, 'layoutStyleHorizontal': layoutStyle == 'horizontal'}">
+        <div class="tjm_navbar_left" v-if="layoutStyle == 'vertical'">
             <el-icon
                 class="tjm_collapse_icon"
                 size="28"

+ 27 - 23
src/layout/index.vue

@@ -1,19 +1,16 @@
 <template>
-    <!--  :locale="localeLang" -->
     <el-config-provider :locale="localeLang">
         <div class="tjm_wrapper">
-            <div class="tjm_warpper_container fixed">
-                <tjm-side-bar v-if="layoutStyle=='vertical'" />
-                <div class="tjm_container" :class="{ 'is-collapse': collapse,'is-layoutStyle':layoutStyle=='horizontal' }">
-                    <div
-                        class="header_container fixed-header"
-                        :class="{ 'is-collapse': collapse, 'is-layoutStyle': layoutStyle == 'horizontal' }"
-                    >
+            <div class="tjm_warpper_container fixed" :class="!hasTabs && 'no-tabs-bar'">
+                <tjm-side-bar v-if="layoutStyle == 'vertical'" />
+                <div class="tjm_container" :class="{ 'is-collapse': collapse, 'is-layoutStyle': layoutStyle == 'horizontal' }">
+                    <div class="header_container fixed-header" 
+                        :class="{ 'is-collapse': collapse, 'is-layoutStyle': layoutStyle == 'horizontal' }">
                         <tjm-nav-bar />
-                        <tjm-tabs-bar />
+                        <tjm-tabs-bar v-if="hasTabs" />
                     </div>
                     <div class="content_container">
-                        <tjm-main />
+                        <tjm-main :hasTabs="hasTabs" />
                     </div>
                 </div>
             </div>
@@ -22,21 +19,25 @@
 </template>
 
 <script setup>
-import { getConfig, setConfig } from '@/config/config'
-import TjmSideBar from './components/SideBar/index.vue'
-import TjmNavBar from './components/NavBar/index.vue'
-import TjmTabsBar from './components/TabsBar/index.vue'
-import TjmMain from './components/Main/index.vue'
-import { useSettingStore } from '@/store/settings.js'
-const settingStore = useSettingStore()
-const { collapse,layoutStyle } = storeToRefs(settingStore)
-import { useI18n } from 'vue-i18n'
-const { messages, locale, t } = useI18n()
-const localeLang = ref(messages[getConfig('globalI18n')])
+import { useI18n } from "vue-i18n";
+import { getConfig } from "@/config/config";
+import { useSettingStore } from "@/store/settings";
+
+import TjmSideBar from "./components/SideBar/index.vue";
+import TjmNavBar from "./components/NavBar/index.vue";
+import TjmTabsBar from "./components/TabsBar/index.vue";
+import TjmMain from "./components/Main/index.vue";
+
+const route = useRoute();
+const hasTabs = computed(() => route.name != "homePolicyDetail");
+const { collapse, layoutStyle } = storeToRefs(useSettingStore());
+
+const { messages, locale, t } = useI18n();
+const localeLang = ref(messages[getConfig("globalI18n")])
 // 修改element 和 i18n 默认语言
 const changeLanguage = () => {
-    locale.value = getConfig('globalI18n')
-    localeLang.value = messages.value[locale.value]
+    locale.value = getConfig("globalI18n");
+    localeLang.value = messages.value[locale.value];
 }
 // 监听修改语言实现element
 watchEffect(changeLanguage)
@@ -59,6 +60,9 @@ watchEffect(changeLanguage)
     &.fixed {
       padding-top: calc(#{$base-navbar-height} + #{$base-tabsbar-height});
     }
+    &.fixed.no-tabs-bar {
+      padding-top: $base-navbar-height;
+    }
     .tjm_container {
       min-height: 100%;
       margin-left: $base-sidebar-width;

+ 4 - 1
src/permission.js

@@ -18,7 +18,10 @@ router.beforeEach((to, from, next) => {
                         name: "notFound",
                         redirect: "/notfound"
                     })
-                    next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
+
+                    if (to.fullPath == "/publicDomain" && !to.query.zcType && !to.query.name) next({ path: "/notfound", replace: true }); // hack方法 确保addRoutes已完成
+                    else if (to.fullPath == "/policyDetail" && !to.query.id) next({ path: "/notfound", replace: true }); // hack方法 确保addRoutes已完成
+                    else next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
                 })
             })
         } else {

+ 11 - 12
src/router/constantRoutes.js

@@ -56,6 +56,17 @@ export const staticRoutes = [
                     affix: true
                 },
                 children: []
+            }, {
+                path: "/policyDetail",
+                name: "homePolicyDetail",
+                component: () => import("@/views/home/policyDetail.vue"),
+                alwaysShow: false,
+                hidden: true,
+                meta: {
+                    title: "政策分享详情",
+                    affix: false
+                },
+                children: []
             }, {
                 path: "/workflow/:page*",
                 name: "workflow",
@@ -83,16 +94,4 @@ export const staticRoutes = [
             }
         ]
     }
-
-    // , {
-    //     path: "/publicDomain",
-    //     name: "publicDomain",
-    //     component: () => import("@/views/publicDomain/index.vue"),
-    //     alwaysShow: false,
-    //     hidden: true,
-    //     meta: {
-    //         title: "首页-领域公开"
-    //     },
-    //     children: []
-    // }
 ]

+ 1 - 0
src/store/permission.js

@@ -42,6 +42,7 @@ export const usePermissionStore = defineStore(
 function filterAsyncRouter(asyncRouterMap, httpSave = true) {
     const blackList = ["/system/dataList",
         "/progress", // 进度
+        "/caseShare",
         "/policyShare/message" // 留言
     ]
     const hideList = ["/publicDomain",

+ 6 - 2
src/views/home/index.vue

@@ -26,7 +26,7 @@
                         <el-tab-pane v-for="item in storageTypeDic" :key="item.value" :label="item.label" :name="item.value"></el-tab-pane>
                     </el-tabs>
                 </template>
-                <el-table v-loading="loading" row-key="id" header-cell-class-name="tjm_card_table_header" height="300px" :data="tableData" border @row-click="(row, column) => !column.fixed && table_detail(row)">
+                <el-table v-loading="loading" row-key="id" header-cell-class-name="tjm_card_table_header" height="300px" :data="tableData" border @row-click="table_detail">
                     <template v-for="(item, index) in columns" :key="index">
                         <el-table-column :label="item.label" :prop="item.props" min-width="100" show-overflow-tooltip>
                             <template #default="scope">{{ columnFormat(scope.row, item.props) }}</template>
@@ -98,7 +98,11 @@ export default {
         },
 
         toDomain(query) {
-            this.$router.push({ path: '/publicDomain', query })
+            this.$router.push({ path: "/publicDomain", query })
+        },
+
+        table_detail({ id }) {
+            this.$router.push({ path: "/policyDetail", query: { id } });
         }
     }
 }

+ 95 - 0
src/views/home/policyDetail.vue

@@ -0,0 +1,95 @@
+<template>
+    <el-card class="tjm_card_style_custom">
+        <template #header>
+            <el-page-header title="返回" icon="arrow-left" :content="form.name" @back="$router.go(-1)"></el-page-header>
+        </template>
+
+        <el-collapse v-model="activeNames">
+            <el-collapse-item v-loading="loading" title="政策内容" name="detail">
+                <share-form ref="shareForm" mode="detail" @formSuccess="formSuccess" @formError="loading=false"></share-form>
+            </el-collapse-item>
+            <el-collapse-item title="政策关联" name="link">
+                <el-empty v-if="!form.docNo"></el-empty>
+                <template v-else>
+                    <strive-link :docNo="form.docNo" tableHeight="auto"></strive-link>
+                </template>
+            </el-collapse-item>
+            <el-collapse-item title="政策留言" name="reply">
+                <!-- <yh-reply-card :refId="$route.query.id"></yh-reply-card> -->
+            </el-collapse-item>
+        </el-collapse>
+    </el-card>
+</template>
+
+<script>
+import shareForm from "@/views/manage/policyShare/form.vue";
+import striveLink from "@/views/publicDomain/link/strive.vue";
+import yhReplyCard from "@/components/ReplyCard/index.vue";
+
+export default {
+    components: {
+        shareForm,
+        striveLink,
+        yhReplyCard
+    },
+
+    data() {
+        return {
+            loading: false,
+            activeNames: ["detail", "link", "reply"],
+
+            form: {
+                name: null,
+                docNo: null
+            }
+        }
+    },
+
+    mounted() {
+        this.loading = true;
+        nextTick(() => this.$refs.shareForm.setData(this.$route.query.id));
+    },
+
+    methods: {
+        formSuccess(data) {
+            this.loading = false;
+            this.form.name = data.name;
+            this.form.docNo = data.docNo;
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.tjm_card_style_custom > {
+  :deep(.el-card__header) {
+    position: relative;
+    border-bottom: none;
+
+    &::after {
+      content: '';
+      position: absolute;
+      bottom: 0;
+      left: 20px;
+      width: calc(100% - 40px);
+      height: 1px;
+      background: var(--el-card-border-color);
+    }
+  }
+
+  :deep(.el-card__body) {
+    .el-collapse {
+      border: none;
+
+      .el-collapse-item .el-collapse-item__header {
+        font-size: 15px;
+        font-weight: 600;
+      }
+
+      .el-collapse-item:first-child .el-form {
+        padding-right: calc(var(--el-card-padding) * 2);
+      }
+    }
+  }
+}
+</style>

+ 7 - 2
src/views/manage/policyShare/form.vue

@@ -112,6 +112,7 @@ import yhUpload from "@/components/Upload/index.vue";
 const { userInfo } = useUserStore(); // store 用户
 
 export default {
+    emits: ["formSuccess", "formError", "isUploadChange", "fileIsDelChange"],
     props: {
         mode: { type: String, default: "saveDone" }
     },
@@ -179,13 +180,17 @@ export default {
         setData(id) {
             API.detail(id).then(res => {
                 if (res.code === 200) {
+                    this.$emit("formSuccess", res.data);
                     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 if (key == "isInWh") this.form.isInWh = !!res.data[key] && res.data[key] || 0;
                         else this.form[key] = res.data[key] || null;
                     }
-                } else ElMessage.error(res.msg);
-            });
+                } else {
+                    ElMessage.error(res.msg);
+                    this.$emit("formError");
+                }
+            }).catch(() => this.$emit("formError"));
         },
 
         getUserDept() {

+ 6 - 0
src/views/policyShare/message/index.vue

@@ -169,4 +169,10 @@ export default {
     width: 100%;
   }
 }
+
+.tjm_card_comment > :deep(.el-card.reply-card) {
+  margin-bottom: 25px;
+  border-top: none;
+  border-radius: 0;
+}
 </style>

+ 8 - 3
src/views/publicDomain/index.vue

@@ -15,10 +15,15 @@
                     </el-select>
                 </el-form-item>
                 <el-form-item label="政策类别">
-                    <el-select v-model="params.zcType" :disabled="$route.query.zcType" clearable placeholder="请选择政策类别">
+                    <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.inWhType" clearable placeholder="请选择入库类别">
+                        <el-option v-for="item in storageTypeDic" :key="item" :label="item" :value="item"></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>
@@ -59,7 +64,7 @@
 
 <script>
 import API from "@/api/policy/share";
-import { levelDic, typeDic } from "@/views/policyShare/main";
+import { levelDic, typeDic, storageTypeDic } from "@/views/policyShare/main";
 import { columns } from "./main";
 
 import yhPagination from "@/components/Pagination/index.vue";
@@ -75,7 +80,7 @@ export default {
 
     data() {
         return {
-            columns, levelDic, typeDic,
+            columns, levelDic, typeDic, storageTypeDic,
 
             loading: false,
             createTime: [],

+ 3 - 3
src/views/publicDomain/link/index.vue

@@ -1,17 +1,17 @@
 <template>
     <el-dialog v-model="visible" title="政策关联" width="80%" @closed="$emit('closed')">
-        <policy-link-strive :docNo="docNo"></policy-link-strive>
+        <policy-strive-link :docNo="docNo"></policy-strive-link>
     </el-dialog>
 </template>
 
 <script>
-import policyLinkStrive from "@/views/publicDomain/link/strive.vue";
+import policyStriveLink from "@/views/publicDomain/link/strive.vue";
 
 export default {
     emits: ["closed"],
     
     components: {
-        policyLinkStrive
+        policyStriveLink
     },
 
     data() {

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

@@ -36,7 +36,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 @row-click="(row, column) => !column.fixed && table_detail(row)">
+            <el-table v-loading="loading" row-key="id" header-cell-class-name="tjm_card_table_header" :height="tableHeight" :data="tableData" border @row-click="(row, column) => !column.fixed && table_detail(row)">
                 <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>
@@ -75,6 +75,7 @@ export default {
 
     props: {
         docNo: { type: String, default: "" },
+        tableHeight: { type: String, default: "400" }
     },
 
     data() {