From 25fa992e12447e535b801da2cc497bdafe0b7b9b Mon Sep 17 00:00:00 2001
From: zhouwenxuan <1175765986@qq.com>
Date: 星期四, 30 十一月 2023 09:25:19 +0800
Subject: [PATCH] 后台管理页面、菜单配置

---
 src/utils/request.js                                      |    2 
 src/views/safetyReview/notice/notice.vue                  |   86 +++++++++++++----
 src/api/backManage/notice.js                              |   34 ++++++
 src/views/safetyReview/notice/components/noticeDialog.vue |   74 ++++++++++++--
 src/layout/components/Sidebar/index.vue                   |   18 ++-
 src/views/components/loginForm.vue                        |   16 ++
 src/components/Editor/index.vue                           |   27 +++++
 7 files changed, 208 insertions(+), 49 deletions(-)

diff --git a/src/api/backManage/notice.js b/src/api/backManage/notice.js
index 014c25e..cda746e 100644
--- a/src/api/backManage/notice.js
+++ b/src/api/backManage/notice.js
@@ -2,7 +2,39 @@
 
 export function getNoticeList() {
     return request({
-        url: 'api/system/notice/noticeList',
+        url: '/system/notice/noticeList',
         method: 'get'
     })
 }
+
+export function addNotice(data) {
+    return request({
+        url: '/system/notice/addNotice',
+        method: 'post',
+        data: data
+    })
+}
+
+export function getNoticeDetail(params) {
+    return request({
+        url: '/system/notice/getNoticeById',
+        method: 'get',
+        params: params
+    })
+}
+
+export function editNotice(params) {
+    return request({
+        url: `/system/notice/editNotice`,
+        method: 'put',
+        data: params
+    })
+}
+
+export function delNotice(data) {
+    return request({
+        url: `/system/notice/remove/` + data.id,
+        method: 'delete'
+    })
+}
+
diff --git a/src/components/Editor/index.vue b/src/components/Editor/index.vue
index bb8b869..42806c6 100644
--- a/src/components/Editor/index.vue
+++ b/src/components/Editor/index.vue
@@ -33,8 +33,30 @@
 
 const { proxy } = getCurrentInstance();
 
+import{ Quill } from 'vue-quill-editor';
+// 自定义插入a链接
+var Link = Quill.import('formats/link');
+class FileBlot extends Link {  // 继承Link Blot
+    static create(value) {
+        let node = undefined
+        if (value&&!value.href){  // 适应原本的Link Blot
+            node = super.create(value);
+        }
+        else{  // 自定义Link Blot
+            node = super.create(value.href);
+            // node.setAttribute('download', value.innerText);  // 左键点击即下载
+            node.innerText = value.innerText;
+            node.download = value.innerText;
+        }
+        return node;
+    }
+}
+FileBlot.blotName = 'link';
+FileBlot.tagName = 'A';
+Quill.register(FileBlot);
+
 const quillEditorRef = ref();
-const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/common/upload"); // 上传的图片服务器地址
+const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/system/common/uploadFile"); // 上传的图片服务器地址
 const headers = ref({
   Authorization: "Bearer " + getToken()
 });
@@ -87,7 +109,7 @@
       [{ color: [] }, { background: [] }],            // 字体颜色、字体背景颜色
       [{ align: [] }],                                // 对齐方式
       ["clean"],                                      // 清除文本格式
-      ["link", "image", "video"]                      // 链接、图片、视频
+      ["link", "image", "upload"]                      // 链接、图片、视频
     ],
   },
   placeholder: props.readOnly ? "" : "请输入内容",
@@ -156,6 +178,7 @@
     // 获取光标位置
     let length = quill.selection.savedRange.index;
     // 插入图片,res.url为服务器返回的图片链接地址
+
     quill.insertEmbed(length, "image", import.meta.env.VITE_APP_BASE_API + res.fileName);
     // 调整光标到最后
     quill.setSelection(length + 1);
diff --git a/src/layout/components/Sidebar/index.vue b/src/layout/components/Sidebar/index.vue
index e7245e5..a625286 100644
--- a/src/layout/components/Sidebar/index.vue
+++ b/src/layout/components/Sidebar/index.vue
@@ -39,16 +39,18 @@
 const permissionStore = usePermissionStore()
 // const sidebarRouters =  computed(() => permissionStore.sidebarRouters);
 const sidebarRouters = ref([])
+
 onMounted(() => {
-    getMenu();
+    sidebarRouters.value = JSON.parse(Cookies.get('routers'))
 });
-const getMenu = () => {
-    const userInfo = JSON.parse(Cookies.get('userInfo'))
-    if(userInfo.identity === 0) {
-        sidebarRouters.value =  menu.adminMenu
-        Cookies.set('routers',JSON.stringify(sidebarRouters.value))
-    }
-}
+// const getMenu = () => {
+//     const userInfo = JSON.parse(Cookies.get('userInfo'))
+//     if(userInfo.identity === 0) {
+//
+//         sidebarRouters.value =  menu.adminMenu
+//         Cookies.set('routers',JSON.stringify(sidebarRouters.value))
+//     }
+// }
 
 
 
diff --git a/src/utils/request.js b/src/utils/request.js
index 39cb883..994fc5d 100644
--- a/src/utils/request.js
+++ b/src/utils/request.js
@@ -27,7 +27,7 @@
   // 是否需要防止数据重复提交
   const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
   if (getToken() && !isToken) {
-    config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
+    config.headers['Authorization'] =  getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
   }
   // get请求映射params参数
   if (config.method === 'get' && config.params) {
diff --git a/src/views/components/loginForm.vue b/src/views/components/loginForm.vue
index 5409772..02bc9cc 100644
--- a/src/views/components/loginForm.vue
+++ b/src/views/components/loginForm.vue
@@ -73,6 +73,7 @@
 import useUserStore from '@/store/modules/user'
 import { Register } from "@/layout/components";
 import { Base64 } from 'js-base64'
+import menu from "@/layout/components/Sidebar/menu";
 
 const userStore = useUserStore()
 const route = useRoute();
@@ -80,8 +81,8 @@
 const { proxy } = getCurrentInstance();
 
 const loginForm = ref({
-  username: "",
-  password: "",
+  username: "admin",
+  password: "admin@123",
   code: "",
   uuid: ""
 });
@@ -113,6 +114,8 @@
     redirect.value = newRoute.query && newRoute.query.redirect;
 }, { immediate: true });
 
+
+const sidebarRouters = ref([])
 function handleLogin() {
   proxy.$refs.loginRef.validate(valid => {
     if (valid) {
@@ -138,9 +141,14 @@
           }
           return acc;
         }, {});
-        const routers = JSON.parse(Cookies.get('routers'))
+          const userInfo = JSON.parse(Cookies.get('userInfo'))
+            if(userInfo.identity === 0) {
+                sidebarRouters.value =  menu.adminMenu
+                Cookies.set('routers',JSON.stringify(sidebarRouters.value))
+            }
+          console.log("sidebarRouters.value",sidebarRouters.value)
           router.push({
-              path: routers[0].path
+              path: sidebarRouters.value[0].path
           })
         // router.push({ path: redirect.value || "/", query: otherQueryParams });
       }).catch(() => {
diff --git a/src/views/safetyReview/notice/components/noticeDialog.vue b/src/views/safetyReview/notice/components/noticeDialog.vue
index 28ca3c6..27f66bd 100644
--- a/src/views/safetyReview/notice/components/noticeDialog.vue
+++ b/src/views/safetyReview/notice/components/noticeDialog.vue
@@ -33,7 +33,9 @@
                     </div>
                 </el-form-item>
                 <el-form-item v-if="!isReview" style="margin-left: -80px" prop="noticeContent">
+<!--                    <tinymce v-model="state.noticeForm.noticeContent"></tinymce>-->
                     <editor  ref="myQuillEditor" v-model="state.noticeForm.noticeContent" :height="300"></editor>
+
                 </el-form-item>
                 <el-form-item label="公告内容:" v-else>
                     <div class="ql-container ql-snow" style="height: 300px;width: 100%;margin-top: 10px;" >
@@ -56,6 +58,8 @@
 import {reactive, ref, toRefs} from 'vue'
 import Editor from "@/components/Editor/index.vue";
 import {ElMessage} from "element-plus";
+import {addNotice, editNotice, getNoticeDetail} from "@/api/backManage/notice";
+const emit = defineEmits(["getList"]);
 
 const dialogVisible = ref(false);
 const title = ref("");
@@ -65,26 +69,39 @@
 const isReview = ref(false);
 const state = reactive({
     noticeForm: {
+        id: '',
         noticeTitle: '',
         noticeContent: '',
         fileList: []
     },
     formRules:{
         noticeTitle: [{ required: true, message: '请填写公告标题', trigger: 'blur' }],
-        noticeContent: [{ required: true, message: '请输入公告内容', trigger: 'change' }],
+        noticeContent: [{ required: true, message: '请输入公告内容', trigger: 'blur' }],
     },
 
 })
 
-const openDialog = (type, value) => {
+const openDialog = async (type, value) => {
     isReview.value = false;
     title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
-    if(type === 'edit') {
-        state.noticeForm = value;
+    if(type === 'edit' || type === 'review') {
+        const param = {
+            noticeId: value.id
+        }
+        const res = await getNoticeDetail(param);
+        if(res.code === 200){
+            state.noticeForm.id = res.data.id
+            state.noticeForm.noticeTitle = res.data.title
+            state.noticeForm.noticeContent = res.data.content
+        }else{
+            ElMessage.warning(res.message)
+        }
     }
     if(type === 'review') {
         isReview.value = true;
-        state.noticeForm = value;
+    }
+    if(type === 'add'){
+        reset()
     }
     dialogVisible.value = true;
 }
@@ -99,22 +116,55 @@
             });
             return;
         }
-        console.log('file, fileList',state.noticeForm.noticeContent);
-        noticeRef.value.clearValidate();
-        reset();
-        dialogVisible.value = false;
-
+        if(title.value === '新增'){
+            const param = {
+                content: state.noticeForm.noticeContent,
+                title: state.noticeForm.noticeTitle
+            }
+            const res = await addNotice(param)
+            if(res.code === 200){
+                ElMessage({
+                    type: 'success',
+                    message: '新增成功'
+                });
+            }else{
+                ElMessage.warning(res.message)
+            }
+            emit("getList")
+            reset();
+            noticeRef.value.clearValidate();
+            dialogVisible.value = false;
+        }else if(title.value === '编辑') {
+            const nowDate = new Date()
+            const param = {
+                id: state.noticeForm.id,
+                content: state.noticeForm.noticeContent,
+                title: state.noticeForm.noticeTitle
+            }
+            const res = await editNotice(param)
+            if(res.code === 200){
+                ElMessage({
+                    type: 'success',
+                    message: '编辑成功'
+                });
+            }else{
+                ElMessage.warning(res.message)
+            }
+            emit("getList")
+            reset();
+            noticeRef.value.clearValidate();
+            dialogVisible.value = false;
+        }
     }
 }
 
 const handleClose = () => {
     noticeRef.value.clearValidate();
-    reset();
     dialogVisible.value = false;
-
 }
 const reset = () => {
     state.noticeForm = {
+        id: '',
         noticeTitle: '',
         noticeContent: ''
     }
diff --git a/src/views/safetyReview/notice/notice.vue b/src/views/safetyReview/notice/notice.vue
index 0579b20..b313980 100644
--- a/src/views/safetyReview/notice/notice.vue
+++ b/src/views/safetyReview/notice/notice.vue
@@ -10,33 +10,38 @@
         </div>
         <!-- 表格数据 -->
         <el-table v-loading="loading" :data="dataList" :border="true">
-            <el-table-column label="发布时间" prop="publishTime" align="center"  />
-            <el-table-column label="标题" prop="noticeTitle" align="center" :show-overflow-tooltip="true" width="650" />
+            <el-table-column label="发布时间" prop="createTime" align="center"  />
+            <el-table-column label="标题" prop="title" align="center" :show-overflow-tooltip="true" width="650" />
             <el-table-column label="最近修改时间" prop="updateTime" align="center"  />
             <el-table-column label="操作" align="center" class-name="small-padding fixed-width" >
                 <template #default="scope">
                     <el-button link type="primary"  @click="openDialog('review',scope.row)" >查看</el-button>
-                    <el-button link type="primary"  @click="openDialog('edit',scope.row)" v-hasPermi="['system:role:edit']">编辑</el-button>
-                    <el-button link type="danger"  @click="handleDelete(scope.row)" v-hasPermi="['system:role:remove']">删除</el-button>
+                    <el-button link type="primary"  @click="openDialog('edit',scope.row)" >编辑</el-button>
+                    <el-button link type="danger"  @click="handleDelete(scope.row)" >删除</el-button>
                 </template>
             </el-table-column>
         </el-table>
 
-        <pagination
-            v-show="total > 0"
-            :total="total"
-            v-model:page="queryParams.pageNum"
-            v-model:limit="queryParams.pageSize"
-            @pagination="getList"
-        />
+        <div class="pag-container">
+            <el-pagination
+                v-model:current-page="data.queryParams.pageNum"
+                v-model:page-size="data.queryParams.pageSize"
+                :page-sizes="[10,15,20,25]"
+                layout="total, sizes, prev, pager, next, jumper"
+                :total="total"
+                @size-change="handleSizeChange"
+                @current-change="handleCurrentChange"
+            />
+        </div>
         <notice-dialog ref="noticeRef" @getList = "getList"></notice-dialog>
     </div>
 </template>
 
 <script setup>
-import {getCurrentInstance, reactive, ref, toRefs} from "vue";
+import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
 import noticeDialog from "./components/noticeDialog.vue"
-import {ElMessageBox} from "element-plus";
+import {ElMessage, ElMessageBox} from "element-plus";
+import {getNoticeList, delNotice} from "@/api/backManage/notice";
 const { proxy } = getCurrentInstance();
 const loading = ref(false);
 const noticeRef = ref();
@@ -44,23 +49,47 @@
     queryParams: {
         pageNum: 1,
         pageSize: 10,
+        title: '',
+        content: '',
     },
-    total: 0,
-    dataList: []
-
-
 });
+const dataList = ref([]);
+const total = ref(0);
 
-const { queryParams, total, dataList } = toRefs(data);
+const { queryParams } = toRefs(data);
 
-const getList = () => {
+onMounted(() => {
+    getList();
+});
+const getList = async () => {
     loading.value = true;
-    console.log("获取数据")
+    const res = await getNoticeList(data.queryParams);
+    if(res.code === 200){
+        dataList.value = res.data.list.map(item => {
+            return {
+                ...item,
+                createTime: item.createTime.replace(/T/g," ")
+            }
+        })
+        total.value = res.data.total
+    }else{
+        ElMessage.warning(res.message)
+    }
     loading.value = false;
+
 }
 
 const openDialog = (type, value) => {
     noticeRef.value.openDialog(type, value);
+}
+
+const handleSizeChange = (val) => {
+    data.queryParams.pageSize = val
+    getList()
+}
+const handleCurrentChange = (val) => {
+    data.queryParams.pageNum = val
+    getList()
 }
 
 /** 重置新增的表单以及其他数据  */
@@ -77,8 +106,23 @@
             type: 'warning',
         })
         .then( async() => {
-
+            const res = await delNotice(val);
+            if(res.code === 200){
+                ElMessage({
+                    type: 'success',
+                    message: '删除成功'
+                });
+                getList();
+            }else{
+                ElMessage.warning(res.message)
+            }
         })
 }
 
 </script>
+<style lang="scss">
+.pag-container{
+    float: right;
+    margin-top: 10px;
+}
+</style>

--
Gitblit v1.9.2