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