浏览代码

权限分配已完成,接口调整已完成

hzj18279462576@163.com 3 月之前
父节点
当前提交
01b5debf2e

+ 14 - 6
src/api/login.js

@@ -1,10 +1,18 @@
-import request from '@/utils/request' // 你的axios封装文件
+import request from "@/utils/request"; // 你的axios封装文件
 
 // 获取用户列表
 export function login(data) {
   return request({
-    url: '/api/login/Login',
-    method: 'post',
-    data: data
-  })
-}
+    url: "/api/login/Login",
+    method: "post",
+    data: data,
+  });
+}
+
+// 9.9.	获取当前用户角色权限数据
+export function queryUserRole() {
+  return request({
+    url: "/api/alumniRole/queryUserRole",
+    method: "get",
+  });
+}

+ 1 - 0
src/layout/Navbar.vue

@@ -272,6 +272,7 @@ const loginOut = () => {
   })
     .then(() => {
       sessionStorage.removeItem("token");
+      sessionStorage.removeItem("roleList");
       router.push({
         path: `/login`,
       });

+ 17 - 19
src/router/index.js

@@ -119,25 +119,23 @@ router.beforeEach(async (to, from, next) => {
   NProgress.start(); // 开始加载进度条
 
   let token = sessionStorage.getItem("token");
-  // if (to.path == "/login") {
-  //   next();
-  // } else {
-  //   if (token) {
-  //     next();
-  //   } else {
-  //     ElMessage({
-  //       type: "error",
-  //       showClose: true,
-  //       message: "无权限进入此页面",
-  //       center: true,
-  //     });
-  //     sessionStorage.removeItem("token")// 移出token
-  //     sessionStorage.removeItem("id")// 移出用户id
-  //     sessionStorage.removeItem("permissionList")// 移出权限列表
-  //     sessionStorage.removeItem("permissionListFlat")
-  //     next("/login");
-  //   }
-  // }
+  if (to.path == "/login") {
+    next();
+  } else {
+    if (token) {
+      next();
+    } else {
+      ElMessage({
+        type: "error",
+        showClose: true,
+        message: "无权限进入此页面",
+        center: true,
+      });
+      sessionStorage.removeItem("token")// 移出token
+      sessionStorage.removeItem("roleList")// 移出用户id
+      next("/login");
+    }
+  }
   next();
 });
 router.afterEach(() => {

+ 6 - 3
src/stores/index.js

@@ -1,6 +1,8 @@
 // src/stores/counter.ts
 import { defineStore } from "pinia";
 import router from "@/router";
+import { queryUserRole } from "@/api/login";
+
 export const useCounterStore = defineStore("user", {
   state: () => {
     return {
@@ -29,8 +31,8 @@ export const useCounterStore = defineStore("user", {
     },
     // 保存菜单项
     SETMENU(menuActive) {
-      console.log(menuActive,"setTtem");
-      
+      console.log(menuActive, "setTtem");
+
       this.menuActive = menuActive;
       sessionStorage.setItem("menuActive", menuActive);
     },
@@ -39,7 +41,6 @@ export const useCounterStore = defineStore("user", {
       // 获取菜单权限列表
       // roleList = JSON.parse(localStorage.getItem("permissionList")) || [];
       // const modules = import.meta.glob("../views/**/*.vue");
-
       // roleList.forEach((i) => {
       //   if (i.type == 2) {
       //     let arr = {
@@ -76,5 +77,7 @@ export const useCounterStore = defineStore("user", {
       //   component: () => import("@/views/404/404.vue"),
       // });
     },
+    async GETROLE() {
+    },
   },
 });

+ 2 - 0
src/utils/request.js

@@ -41,6 +41,8 @@ service.interceptors.response.use(
     // console.log(response);
     if (response.data.message == "登录凭证已失效,请重新登录!") {
       router.push("/login");
+      sessionStorage.removeItem("token");
+      sessionStorage.removeItem("roleList");
     } 
       // 1. 获取后端返回的数据(response.data 是后端真正返回的内容)
       const res = response.data;

+ 28 - 3
src/views/alumni-activity/ActivityAudit.vue

@@ -137,19 +137,19 @@
         <el-table-column align="center" prop="passTime" label="审核时间" />
         <el-table-column align="center" label="操作" fixed="right" width="200">
           <template #default="{ row }">
-            <el-button type="primary" @click="infoClick(row)" link
+            <el-button v-if="menuList.canDetail" type="primary" @click="infoClick(row)" link
               >详情</el-button
             >
             <el-button
               type="primary"
-              v-if="row.passName == '待审核'"
+              v-if="row.passName == '待审核' && menuList.canApply"
               @click="operationPassChange(row)"
               link
               >通过</el-button
             >
             <el-button
               type="danger"
-              v-if="row.passName == '待审核'"
+              v-if="row.passName == '待审核' && menuList.canApply"
               @click="operationRefuseChange(row)"
               link
               >拒绝</el-button
@@ -303,6 +303,19 @@ const store = useCounterStore();
 // 为避免解构时失去响应性
 const { name, age, isCollapse, realAge, collegeRole } = storeToRefs(store);
 
+const menuList = ref({
+  canAll: null,
+  canApply: null,
+  canDeleted: null,
+  canDetail: null,
+  canExport: null,
+  canImport: null,
+  canInsert: null,
+  canTop: null,
+  canUpdate: null,
+  canView: null,
+});
+
 // 表格数据
 const loading = ref(false);
 const tableData = reactive({
@@ -553,6 +566,18 @@ onBeforeMount(() => {
   getList();
   categoryList();
   clubList();
+  let list = JSON.parse(sessionStorage.getItem("roleList"));
+  console.log(list);
+  list.forEach((i) => {
+    if (i.menuName == "校友活动管理") {
+      i.childs.forEach((item) => {
+        if (item.menuName == "活动报名审核") {
+          menuList.value = item;
+        }
+      });
+    }
+  });
+  console.log(menuList.value);
 });
 onUnmounted(() => {
   // document.removeEventListener("keyup", Enters);

+ 156 - 31
src/views/alumni-activity/ActivityList.vue

@@ -60,6 +60,7 @@
           style="margin-left: 0"
           color="rgba(38, 151, 255, 1)"
           @click="addlist"
+          v-if="menuList.canInsert"
           >创建活动</el-button
         >
       </div>
@@ -121,10 +122,20 @@
         />
         <el-table-column align="center" label="操作" fixed="right" width="200">
           <template #default="{ row }">
-            <el-button type="primary" @click="updateS(row)" link
+            <el-button
+              v-if="menuList.canUpdate"
+              type="primary"
+              @click="updateS(row)"
+              link
               >编辑</el-button
             >
-            <el-button type="danger" @click="deleteS(row)" link>删除</el-button>
+            <el-button
+              v-if="menuList.canDeleted"
+              type="danger"
+              @click="deleteS(row)"
+              link
+              >删除</el-button
+            >
           </template>
         </el-table-column>
       </el-table>
@@ -174,6 +185,14 @@
             placeholder="请输入活动名称"
           />
         </el-form-item>
+        <el-form-item label="发起人 :" prop="publisherName">
+          <el-input
+            clearable
+            v-model.trim="ruleForm.publisherName"
+            class="w-50 m-2"
+            placeholder="请输入发起人"
+          />
+        </el-form-item>
         <el-form-item label="所属组织 :" prop="orgId">
           <!-- <el-select
             v-model="ruleForm.orgId"
@@ -218,6 +237,33 @@
             >重置</el-button
           > -->
         </el-form-item>
+        <el-form-item label="活动海报 :" prop="poster">
+          <div class="img-preview-list">
+            <div class="img-item" v-if="ruleForm.poster">
+              <img
+                v-viewer
+                :src="ruleForm.poster"
+                alt="图片预览"
+                class="preview-img"
+                @click="handlePreview(ruleForm.poster)"
+              />
+              <span class="delete-btn" @click="handleDelete(index)">
+                <el-icon><Delete /></el-icon>
+              </span>
+            </div>
+            <el-upload
+              action="#"
+              :auto-upload="false"
+              :on-change="handleFileChange"
+              :before-upload="beforeUpload"
+              class="upload-btn"
+              accept="image/*"
+            >
+              <el-icon><Plus /></el-icon>
+              <span class="upload-txt">点击上传图片</span>
+            </el-upload>
+          </div>
+        </el-form-item>
         <el-form-item label="活动详情 :" prop="themeDetail">
           <!-- <el-input
             v-model.trim="ruleForm.themeDetail"
@@ -326,6 +372,7 @@ import { api as viewerApi } from "v-viewer";
 
 import Richtext from "./Richtext.vue";
 
+import { uploadFile } from "@/api/uploadFile";
 import {
   queryStatus,
   queryActivityPages,
@@ -341,6 +388,19 @@ const store = useCounterStore();
 // 为避免解构时失去响应性
 const { name, age, isCollapse, realAge, collegeRole } = storeToRefs(store);
 
+const menuList = ref({
+  canAll: null,
+  canApply: null,
+  canDeleted: null,
+  canDetail: null,
+  canExport: null,
+  canImport: null,
+  canInsert: null,
+  canTop: null,
+  canUpdate: null,
+  canView: null,
+});
+
 const fatherMessage = ref({
   data: "",
   flag: false,
@@ -391,7 +451,9 @@ const formSize = ref("default");
 const ruleFormRef = ref();
 const ruleForm = reactive({
   theme: "",
+  publisherName: "",
   orgId: "",
+  poster: "",
   themeDetail: "",
   activeTime: "",
   address: "",
@@ -402,7 +464,11 @@ const ruleForm = reactive({
 // 表单验证
 const rules = reactive({
   theme: [{ required: true, message: "活动名称不能为空", trigger: "blur" }],
+  publisherName: [
+    { required: true, message: "发起人不能为空", trigger: "blur" },
+  ],
   orgId: [{ required: true, message: "所属组织不能为空", trigger: "blur" }],
+  poster: [{ required: true, message: "活动海报不能为空", trigger: "blur" }],
   themeDetail: [
     { required: true, message: "活动详情不能为空", trigger: "blur" },
   ],
@@ -450,11 +516,11 @@ const getList = async () => {
     } else {
       tableLoading.value = false;
       ElMessage({
-          type: "error",
-          showClose: true,
-          message: res.message,
-          center: true,
-        });
+        type: "error",
+        showClose: true,
+        message: res.message,
+        center: true,
+      });
     }
   });
 };
@@ -472,13 +538,55 @@ const resetBtn = lodash.debounce(async () => {
   getList();
 }, 300);
 
+const handleDelete = (index) => {
+  ruleForm.poster = "";
+};
+// 上传前的校验
+const beforeUpload = (file) => {
+  // 校验文件类型
+  const isImage = file.type.startsWith("image/");
+  if (!isImage) {
+    ElMessage.error("只能上传图片格式文件");
+    return false;
+  }
+  // 校验文件大小(2MB)
+  const isLt2M = file.size / 1024 / 1024 < 2;
+  if (!isLt2M) {
+    ElMessage.error("图片大小不能超过2MB");
+    return false;
+  }
+  return true;
+};
+
+// 文件选择变化时触发
+const handleFileChange = async (file, newFileList) => {
+  console.log(file);
+  let formData = new FormData();
+  formData.append("file", file.raw);
+  let res = await uploadFile(formData);
+  // console.log(res.data.fileUrl);
+  if (res.code == 200) {
+    ruleForm.poster = res.data.fileUrl; // 赋值给响应式fileList,页面自动刷新
+  } else {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.message,
+      center: true,
+    });
+  }
+};
+
 // 添加账号
 const addlist = () => {
   dialongTitle.value = "创建活动";
   addDialogVisible.value = true;
   ruleForm.theme = "";
+  ruleForm.publisherName = "";
   ruleForm.orgId = "";
+  ruleForm.poster = "";
   ruleForm.themeDetail = "";
+  ruleForm.activeTime = "";
   ruleForm.address = "";
   ruleForm.signTime = "";
   ruleForm.totalNumber = "";
@@ -491,10 +599,12 @@ const updateS = (row) => {
   dialongTitle.value = "编辑活动";
   addDialogVisible.value = true;
   ruleForm.theme = row.theme;
-  pageParams.keyword=row.orgName
+  ruleForm.publisherName = row.publisherName;
+  pageParams.keyword = row.orgName;
   clubList().then(() => {
     ruleForm.orgId = `${row.orgName},${row.orgId}`;
-  })
+  });
+  ruleForm.poster = row.poster;
   ruleForm.themeDetail = row.themeDetail;
   ruleForm.activeTime = [row.startTime, row.endTime];
   ruleForm.address = row.address;
@@ -543,8 +653,10 @@ const submitAdd = lodash.debounce(async (formEl) => {
     if (valid) {
       let data = {
         theme: ruleForm.theme,
+        publisherName: ruleForm.publisherName,
         orgId: ruleForm.orgId.split(",")[1],
         orgName: ruleForm.orgId.split(",")[0],
+        poster: ruleForm.poster,
         themeDetail: ruleForm.themeDetail,
         startTime: ruleForm.activeTime[0],
         endTime: ruleForm.activeTime[1],
@@ -657,15 +769,27 @@ const remoteMethod = (query) => {
   console.log(query);
   pageParams.keyword = query;
   loading.value = true;
-  clubList().then(() =>{
+  clubList().then(() => {
     loading.value = false;
-  })
+  });
 };
 
 onBeforeMount(() => {
   getList();
   statusList();
   clubList();
+  let list = JSON.parse(sessionStorage.getItem("roleList"));
+  console.log(list);
+  list.forEach((i) => {
+    if (i.menuName == "校友活动管理") {
+      i.childs.forEach((item) => {
+        if (item.menuName == "校友活动列表") {
+          menuList.value = item;
+        }
+      });
+    }
+  });
+  console.log(menuList.value);
 });
 onUnmounted(() => {});
 </script>
@@ -809,26 +933,27 @@ onUnmounted(() => {});
       }
     }
   }
-}
-
-// 添加员工弹窗样式
-.addStaff {
-  .el-dialog__body {
-    padding: 20px 20px 10px 20px;
-    .el-input {
-      width: 400px;
-    }
-    .el-textarea {
-      width: 400px;
-    }
-    .el-select {
-      width: 400px;
-    }
-    .el-form-item {
-      :deep(.el-form-item__content) {
-        .el-cascader {
-          .el-input {
-            width: 400px;
+  // 添加员工弹窗样式
+  :deep(.addStaff) {
+    .el-dialog__body {
+      padding: 20px 20px 10px 20px;
+      height: 800px;
+      overflow: auto;
+      .el-input {
+        width: 400px;
+      }
+      .el-textarea {
+        width: 400px;
+      }
+      .el-select {
+        width: 400px;
+      }
+      .el-form-item {
+        :deep(.el-form-item__content) {
+          .el-cascader {
+            .el-input {
+              width: 400px;
+            }
           }
         }
       }

+ 28 - 3
src/views/alumni-album/PhotoAudit.vue

@@ -130,19 +130,19 @@
         <el-table-column align="center" prop="passTime" label="审核时间" />
         <el-table-column align="center" label="操作" fixed="right" width="200">
           <template #default="{ row }">
-            <el-button type="primary" @click="infoClick(row)" link
+            <el-button v-if="menuList.canDetail" type="primary" @click="infoClick(row)" link
               >详情</el-button
             >
             <el-button
               type="primary"
-              v-if="row.passName == '待审核'"
+              v-if="row.passName == '待审核' && menuList.canApply"
               @click="operationPassChange(row)"
               link
               >通过</el-button
             >
             <el-button
               type="danger"
-              v-if="row.passName == '待审核'"
+              v-if="row.passName == '待审核' && menuList.canApply"
               @click="operationRefuseChange(row)"
               link
               >拒绝</el-button
@@ -304,6 +304,19 @@ const store = useCounterStore();
 // 为避免解构时失去响应性
 const { name, age, isCollapse, realAge, collegeRole } = storeToRefs(store);
 
+const menuList = ref({
+  canAll: null,
+  canApply: null,
+  canDeleted: null,
+  canDetail: null,
+  canExport: null,
+  canImport: null,
+  canInsert: null,
+  canTop: null,
+  canUpdate: null,
+  canView: null,
+});
+
 // 表格数据
 const loading = ref(false);
 const tableData = reactive({
@@ -543,6 +556,18 @@ const categoryList = async () => {
 onBeforeMount(() => {
   categoryList();
   getList();
+  let list = JSON.parse(sessionStorage.getItem("roleList"));
+  console.log(list);
+  list.forEach((i) => {
+    if (i.menuName == "校友相册管理") {
+      i.childs.forEach((item) => {
+        if (item.menuName == "照片上传审核") {
+          menuList.value = item;
+        }
+      });
+    }
+  });
+  console.log(menuList.value);
 });
 onUnmounted(() => {
   // document.removeEventListener("keyup", Enters);

+ 30 - 4
src/views/alumni-album/PhotoCategory.vue

@@ -60,6 +60,7 @@
           style="margin-left: 0"
           color="rgba(38, 151, 255, 1)"
           @click="addlist"
+          v-if="menuList.canInsert"
           >创建分类</el-button
         >
       </div>
@@ -85,11 +86,11 @@
             <p>创建人: {{ i.userName }}</p>
             <template #footer>
               <div class="card-footer">
-                <el-button type="primary" @click="updateS(i)" link
+                <el-button v-if="menuList.canUpdate" type="primary" @click="updateS(i)" link
                   >编辑</el-button
                 >
                 <span class="line">|</span>
-                <el-button type="danger" @click="deleteS(i)" link
+                <el-button v-if="menuList.canDeleted" type="danger" @click="deleteS(i)" link
                   >删除</el-button
                 >
               </div>
@@ -104,7 +105,7 @@
           background
           :current-page="currentPage"
           :page-size="pageSize"
-          :page-sizes="[10, 20, 30, 40]"
+          :page-sizes="[12, 24, 36, 48]"
           layout="total,sizes, prev, pager, next, jumper, slot"
           :total="total"
           @size-change="handleSizeChange"
@@ -190,6 +191,19 @@ const store = useCounterStore();
 // 为避免解构时失去响应性
 const { name, age, isCollapse, realAge, collegeRole } = storeToRefs(store);
 
+const menuList = ref({
+  canAll: null,
+  canApply: null,
+  canDeleted: null,
+  canDetail: null,
+  canExport: null,
+  canImport: null,
+  canInsert: null,
+  canTop: null,
+  canUpdate: null,
+  canView: null,
+});
+
 // 表格数据
 const loading = ref(false);
 const tableData = reactive({
@@ -205,7 +219,7 @@ const searchInput = reactive({
 }); // 搜索按钮数据
 
 const currentPage = ref(1); // 当前页
-const pageSize = ref(10);
+const pageSize = ref(12);
 const total = ref(0); // 当前总数
 const selectIds = ref([]); // 勾选的全部数据
 
@@ -415,6 +429,18 @@ const categoryList = async () => {
 onBeforeMount(() => {
   getList();
   categoryList();
+  let list = JSON.parse(sessionStorage.getItem("roleList"));
+  console.log(list);
+  list.forEach((i) => {
+    if (i.menuName == "校友相册管理") {
+      i.childs.forEach((item) => {
+        if (item.menuName == "相册分类管理") {
+          menuList.value = item;
+        }
+      });
+    }
+  });
+  console.log(menuList.value);
 });
 onUnmounted(() => {
   // document.removeEventListener("keyup", Enters);

+ 28 - 2
src/views/alumni-album/PhotoList.vue

@@ -60,6 +60,7 @@
           style="margin-left: 0"
           color="rgba(38, 151, 255, 1)"
           @click="addlist"
+          v-if="menuList.canInsert"
           >上传照片</el-button
         >
       </div>
@@ -119,10 +120,10 @@
         <el-table-column align="center" prop="createTime" label="上传时间" />
         <el-table-column align="center" label="操作" fixed="right" width="200">
           <template #default="{ row }">
-            <el-button type="primary" @click="updateS(row)" link
+            <el-button v-if="menuList.canUpdate" type="primary" @click="updateS(row)" link
               >编辑</el-button
             >
-            <el-button type="danger" @click="deleteS(row)" link>删除</el-button>
+            <el-button v-if="menuList.canDeleted" type="danger" @click="deleteS(row)" link>删除</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -266,6 +267,19 @@ const store = useCounterStore();
 // 为避免解构时失去响应性
 const { name, age, isCollapse, realAge, collegeRole } = storeToRefs(store);
 
+const menuList = ref({
+  canAll: null,
+  canApply: null,
+  canDeleted: null,
+  canDetail: null,
+  canExport: null,
+  canImport: null,
+  canInsert: null,
+  canTop: null,
+  canUpdate: null,
+  canView: null,
+});
+
 const handleDelete = (index) => {
   ruleForm.images.splice(index, 1);
 };
@@ -547,6 +561,18 @@ const categoryList = async () => {
 onBeforeMount(() => {
   getList();
   categoryList();
+  let list = JSON.parse(sessionStorage.getItem("roleList"));
+  console.log(list);
+  list.forEach((i) => {
+    if (i.menuName == "校友相册管理") {
+      i.childs.forEach((item) => {
+        if (item.menuName == "校友相册列表") {
+          menuList.value = item;
+        }
+      });
+    }
+  });
+  console.log(menuList.value);
 });
 onUnmounted(() => {
   // document.removeEventListener("keyup", Enters);

+ 36 - 9
src/views/alumni-card/alumni-card.vue

@@ -185,7 +185,7 @@
               </div>
             </template>
           </el-table-column>
-          <el-table-column align="center" prop="phone" label="编号" />
+          <el-table-column align="center" prop="noNumber" label="编号" />
           <el-table-column align="center" prop="passName" label="审核状态">
             <template #default="{ row }">
               <span v-if="row.passName == '已通过'" style="color: #67c23a">{{
@@ -212,18 +212,18 @@
             width="200"
           >
             <template #default="{ row }">
-              <el-button type="primary" @click="infoClick(row)" link
+              <el-button v-if="menuList.canDetail" type="primary" @click="infoClick(row)" link
                 >详情</el-button
               >
               <el-button
-                v-if="row.passName == '待审核'"
+                v-if="row.passName == '待审核' && menuList.canApply"
                 type="primary"
                 @click="operationPassChange(row)"
                 link
                 >通过</el-button
               >
               <el-button
-                v-if="row.passName == '待审核'"
+                v-if="row.passName == '待审核' && menuList.canApply"
                 type="danger"
                 @click="operationRefuseChange(row)"
                 link
@@ -397,6 +397,19 @@ const store = useCounterStore();
 // 为避免解构时失去响应性
 const { name, age, isCollapse, realAge, collegeRole } = storeToRefs(store);
 
+const menuList = ref({
+  canAll: null,
+  canApply: null,
+  canDeleted: null,
+  canDetail: null,
+  canExport: null,
+  canImport: null,
+  canInsert: null,
+  canTop: null,
+  canUpdate: null,
+  canView: null,
+});
+
 // 表格数据
 const loading = ref(false);
 const tableData = reactive({
@@ -477,11 +490,11 @@ const getList = async () => {
     } else {
       loading.value = false;
       ElMessage({
-          type: "error",
-          showClose: true,
-          message: res.message,
-          center: true,
-        });
+        type: "error",
+        showClose: true,
+        message: res.message,
+        center: true,
+      });
     }
   });
 };
@@ -495,7 +508,9 @@ const resetBtn = lodash.debounce(async () => {
   searchInput.name = "";
   searchInput.collegeId = "";
   searchInput.periodId = "";
+  periodData.value = [];
   searchInput.majorId = "";
+  majorData.value = [];
 
   searchInput.educationId = "";
   searchInput.isPass = "";
@@ -708,6 +723,18 @@ onBeforeMount(() => {
   educationList();
   passList();
   graduateList();
+  let list = JSON.parse(sessionStorage.getItem("roleList"));
+  console.log(list);
+  list.forEach((i) => {
+    if (i.menuName == "电子校友卡管理") {
+      i.childs.forEach((item) => {
+        if (item.menuName == "电子校友卡管理") {
+          menuList.value = item;
+        }
+      });
+    }
+  });
+  console.log(menuList.value);
 });
 onUnmounted(() => {
   // document.removeEventListener("keyup", Enters);

+ 28 - 3
src/views/alumni-cooperation/alumni-cooperation.vue

@@ -136,18 +136,18 @@
             width="200"
           >
             <template #default="{ row }">
-              <el-button type="primary" @click="infoClick(row)" link
+              <el-button  v-if="menuList.canDetail" type="primary" @click="infoClick(row)" link
                 >详情</el-button
               >
               <el-button
-                v-if="row.passName == '待审核'"
+                v-if="row.passName == '待审核' && menuList.canApply"
                 type="primary"
                 @click="operationPassChange(row)"
                 link
                 >通过</el-button
               >
               <el-button
-                v-if="row.passName == '待审核'"
+                v-if="row.passName == '待审核' && menuList.canApply"
                 type="danger"
                 @click="operationRefuseChange(row)"
                 link
@@ -309,6 +309,19 @@ const store = useCounterStore();
 // 为避免解构时失去响应性
 const { name, age, isCollapse, realAge, collegeRole } = storeToRefs(store);
 
+const menuList = ref({
+  canAll: null,
+  canApply: null,
+  canDeleted: null,
+  canDetail: null,
+  canExport: null,
+  canImport: null,
+  canInsert: null,
+  canTop: null,
+  canUpdate: null,
+  canView: null,
+});
+
 // 表格数据
 const loading = ref(false);
 const tableData = reactive({
@@ -527,6 +540,18 @@ onBeforeMount(() => {
   getList();
   passList();
   infoTypeList();
+  let list = JSON.parse(sessionStorage.getItem("roleList"));
+  console.log(list);
+  list.forEach((i) => {
+    if (i.menuName == "校友组织管理") {
+      i.childs.forEach((item) => {
+        if (item.menuName == "入会申请审核") {
+          menuList.value = item;
+        }
+      });
+    }
+  });
+  console.log(menuList.value);
 });
 onUnmounted(() => {
   // document.removeEventListener("keyup", Enters);

+ 28 - 3
src/views/alumni-enterprise/alumni-enterprise.vue

@@ -170,18 +170,18 @@
           >
             <template #default="{ row }">
               <div class="options">
-                <el-button type="primary" @click="infoClick(row)" link
+                <el-button v-if="menuList.canDetail" type="primary" @click="infoClick(row)" link
                   >详情</el-button
                 >
                 <el-button
-                  v-if="row.passName == '待审核'"
+                  v-if="row.passName == '待审核' && menuList.canApply"
                   type="primary"
                   @click="operationPassChange(row)"
                   link
                   >通过</el-button
                 >
                 <el-button
-                  v-if="row.passName == '待审核'"
+                  v-if="row.passName == '待审核' && menuList.canApply"
                   type="danger"
                   @click="operationRefuseChange(row)"
                   link
@@ -350,6 +350,19 @@ const store = useCounterStore();
 // 为避免解构时失去响应性
 const { name, age, isCollapse, realAge, collegeRole } = storeToRefs(store);
 
+const menuList = ref({
+  canAll: null,
+  canApply: null,
+  canDeleted: null,
+  canDetail: null,
+  canExport: null,
+  canImport: null,
+  canInsert: null,
+  canTop: null,
+  canUpdate: null,
+  canView: null,
+});
+
 // 表格数据
 const loading = ref(false);
 const tableData = reactive({
@@ -544,6 +557,18 @@ const passList = async () => {
 onBeforeMount(() => {
   getList();
   passList();
+  let list = JSON.parse(sessionStorage.getItem("roleList"));
+  console.log(list);
+  list.forEach((i) => {
+    if (i.menuName == "校友信息管理") {
+      i.childs.forEach((item) => {
+        if (item.menuName == "校友信息管理") {
+          menuList.value = item;
+        }
+      });
+    }
+  });
+  console.log(menuList.value);
 });
 onUnmounted(() => {
   // document.removeEventListener("keyup", Enters);

+ 43 - 4
src/views/alumni-info/alumni-info.vue

@@ -115,6 +115,7 @@
             type="primary"
             color="rgba(38, 151, 255, 1)"
             @click="importBtn"
+            v-if="menuList.canImport"
             >导入</el-button
           >
           <el-button
@@ -122,6 +123,7 @@
             style="margin-left: 0"
             color="rgba(48, 201, 191, 1)"
             @click="exportbtn"
+            v-if="menuList.canExport"
             >导出</el-button
           >
           <el-button
@@ -129,6 +131,7 @@
             style="margin-left: 0"
             color="rgba(38, 151, 255, 1)"
             @click="addlist"
+            v-if="menuList.canInsert"
             >新增</el-button
           >
         </div>
@@ -210,10 +213,18 @@
             width="200"
           >
             <template #default="{ row }">
-              <el-button type="primary" @click="updateS(row)" link
+              <el-button
+                v-if="menuList.canUpdate"
+                type="primary"
+                @click="updateS(row)"
+                link
                 >编辑</el-button
               >
-              <el-button type="danger" @click="deleteS(row)" link
+              <el-button
+                v-if="menuList.canDeleted"
+                type="danger"
+                @click="deleteS(row)"
+                link
                 >删除</el-button
               >
             </template>
@@ -478,6 +489,7 @@ import {
   reactive,
   nextTick,
   onBeforeMount,
+  onMounted,
   onUnmounted,
 } from "vue";
 import { useRouter } from "vue-router";
@@ -510,12 +522,24 @@ const store = useCounterStore();
 // 为避免解构时失去响应性
 const { name, age, isCollapse, realAge, collegeRole } = storeToRefs(store);
 
+const menuList = ref({
+  canAll: null,
+  canApply: null,
+  canDeleted: null,
+  canDetail: null,
+  canExport: null,
+  canImport: null,
+  canInsert: null,
+  canTop: null,
+  canUpdate: null,
+  canView: null,
+});
+
 // 表格数据
 const loading = ref(false);
 const tableData = reactive({
   list: [{}],
 });
-const activeIndex = ref(); // 默认跳转路由
 const dialongTitle = ref("新增账号"); // 弹窗标题
 
 const searchInput = reactive({
@@ -644,8 +668,11 @@ const resetBtn = lodash.debounce(async () => {
   searchInput.name = "";
   searchInput.collegeId = "";
   searchInput.periodId = "";
+  periodData.value=[];
   searchInput.majorId = "";
+  majorData.value=[];
   searchInput.classId = "";
+  classData.value=[];
   searchInput.identityType = "";
   currentPage.value = 1;
   getList();
@@ -1193,11 +1220,23 @@ const graduateList = async () => {
   }
 };
 
-onBeforeMount(() => {
+onMounted(() => {
   getList();
   collegeList();
   identityList();
   graduateList();
+  let list = JSON.parse(sessionStorage.getItem("roleList"));
+  console.log(list);
+  list.forEach((i) => {
+    if (i.menuName == "校友信息管理") {
+      i.childs.forEach((item) => {
+        if (item.menuName == "校友信息管理") {
+          menuList.value = item;
+        }
+      });
+    }
+  });
+  console.log(menuList.value);
 });
 onUnmounted(() => {
   // document.removeEventListener("keyup", Enters);

+ 31 - 5
src/views/alumni-new/NewsClassification.vue

@@ -67,6 +67,7 @@
           style="margin-left: 0"
           color="rgba(38, 151, 255, 1)"
           @click="addlist"
+          v-if="menuList.canInsert"
           >创建分类</el-button
         >
       </div>
@@ -89,9 +90,9 @@
             <p>创建人: {{ i.userName }}</p>
             <template #footer>
               <div class="card-footer">
-                <el-button type="primary" @click="updateS(i)" link>编辑</el-button>
+                <el-button v-if="menuList.canUpdate" type="primary" @click="updateS(i)" link>编辑</el-button>
                 <span class="line">|</span>
-                <el-button type="danger" @click="deleteS(i)" link>删除</el-button>
+                <el-button v-if="menuList.canDeleted" type="danger" @click="deleteS(i)" link>删除</el-button>
               </div>
             </template>
           </el-card>
@@ -104,7 +105,7 @@
           background
           :current-page="currentPage"
           :page-size="pageSize"
-          :page-sizes="[10, 20, 30, 40]"
+          :page-sizes="[12, 24, 36, 48]"
           layout="total,sizes, prev, pager, next, jumper, slot"
           :total="total"
           @size-change="handleSizeChange"
@@ -121,7 +122,7 @@
     :close-on-press-escape="false"
     :title="dialongTitle"
     align-center
-    width="450"
+    width="470"
     :before-close="cancelAdd"
     destroy-on-close
     draggable
@@ -194,6 +195,19 @@ const store = useCounterStore();
 // 为避免解构时失去响应性
 const { name, age, isCollapse, realAge, collegeRole } = storeToRefs(store);
 
+const menuList = ref({
+  canAll: null,
+  canApply: null,
+  canDeleted: null,
+  canDetail: null,
+  canExport: null,
+  canImport: null,
+  canInsert: null,
+  canTop: null,
+  canUpdate: null,
+  canView: null,
+});
+
 // 表格数据
 const loading = ref(false);
 const tableData = reactive({
@@ -209,7 +223,7 @@ const searchInput = reactive({
 }); // 搜索按钮数据
 
 const currentPage = ref(1); // 当前页
-const pageSize = ref(10);
+const pageSize = ref(12);
 const total = ref(0); // 当前总数
 const selectIds = ref([]); // 勾选的全部数据
 
@@ -399,6 +413,18 @@ const cancelProjectImport = () => {
 
 onBeforeMount(() => {
   getList();
+  let list = JSON.parse(sessionStorage.getItem("roleList"));
+  console.log(list);
+  list.forEach((i) => {
+    if (i.menuName == "新闻聚焦管理") {
+      i.childs.forEach((item) => {
+        if (item.menuName == "新闻分类管理") {
+          menuList.value = item;
+        }
+      });
+    }
+  });
+  console.log(menuList.value);
 });
 onUnmounted(() => {
   // document.removeEventListener("keyup", Enters);

+ 48 - 13
src/views/alumni-new/NewsFocus.vue

@@ -60,6 +60,7 @@
           style="margin-left: 0"
           color="rgba(38, 151, 255, 1)"
           @click="addlist"
+          v-if="menuList.canInsert"
           >发布新闻</el-button
         >
       </div>
@@ -100,10 +101,20 @@
         <el-table-column align="center" prop="createTime" label="发布时间" />
         <el-table-column align="center" label="操作" fixed="right" width="200">
           <template #default="{ row }">
-            <el-button type="primary" @click="updateS(row)" link
+            <el-button
+              v-if="menuList.canUpdate"
+              type="primary"
+              @click="updateS(row)"
+              link
               >编辑</el-button
             >
-            <el-button type="danger" @click="deleteS(row)" link>删除</el-button>
+            <el-button
+              v-if="menuList.canDeleted"
+              type="danger"
+              @click="deleteS(row)"
+              link
+              >删除</el-button
+            >
           </template>
         </el-table-column>
       </el-table>
@@ -320,6 +331,19 @@ const store = useCounterStore();
 // 为避免解构时失去响应性
 const { name, age, isCollapse, realAge, collegeRole } = storeToRefs(store);
 
+const menuList = ref({
+  canAll: null,
+  canApply: null,
+  canDeleted: null,
+  canDetail: null,
+  canExport: null,
+  canImport: null,
+  canInsert: null,
+  canTop: null,
+  canUpdate: null,
+  canView: null,
+});
+
 // 表格数据
 const loading = ref(false);
 const tableData = reactive({
@@ -393,11 +417,11 @@ const getList = async () => {
     } else {
       loading.value = false;
       ElMessage({
-          type: "error",
-          showClose: true,
-          message: res.message,
-          center: true,
-        });
+        type: "error",
+        showClose: true,
+        message: res.message,
+        center: true,
+      });
     }
   });
 };
@@ -475,7 +499,7 @@ const addlist = () => {
   ruleForm.theme = "";
   ruleForm.categoryId = "";
   ruleForm.content = "";
-  fatherMessage.value.data =""
+  fatherMessage.value.data = "";
   ruleForm.id = "";
 };
 // 添加账号
@@ -574,7 +598,6 @@ const handleSelectionChange = (val) => {
   // console.log(val);
   selectIds.value = val.map((i) => i.id);
   console.log(selectIds.value);
-  
 };
 
 // 表格斑马纹颜色修改
@@ -590,13 +613,13 @@ const tableRowClassName = ({ row, rowIndex }) => {
 const handleSizeChange = (value) => {
   console.log(value, "每页显示条数");
   pageSize.value = value;
-  getList()
+  getList();
 };
 // 分页
 const handleCurrentChange = (value) => {
   // console.log(value);
   currentPage.value = value;
-  getList()
+  getList();
 };
 
 const cancelProjectImport = () => {
@@ -630,7 +653,7 @@ const fatherMessage = ref({
 const richtextClick = (data) => {
   // console.log(data, "富文本传过来的数据");
   // params.value.safetyNotice = data.html;
-  fatherMessage.value.data=data.html
+  fatherMessage.value.data = data.html;
   ruleForm.content = data.html;
   // accountRuleForm.contentText = data.text;
 };
@@ -638,6 +661,18 @@ const richtextClick = (data) => {
 onBeforeMount(() => {
   getList();
   newTypeList();
+  let list = JSON.parse(sessionStorage.getItem("roleList"));
+  console.log(list);
+  list.forEach((i) => {
+    if (i.menuName == "新闻聚焦管理") {
+      i.childs.forEach((item) => {
+        if (item.menuName == "新闻聚焦列表") {
+          menuList.value = item;
+        }
+      });
+    }
+  });
+  console.log(menuList.value);
 });
 onUnmounted(() => {
   // document.removeEventListener("keyup", Enters);
@@ -827,7 +862,7 @@ onUnmounted(() => {
 
 :deep(.tooltips) {
   .el-dialog__body {
-    height: 500px;
+    height: 650px;
     overflow: auto;
     padding: 0px 20px 10px 20px;
   }

+ 37 - 9
src/views/alumni-organization/ApplicationAudit.vue

@@ -118,19 +118,23 @@
         <el-table-column align="center" prop="passTime" label="审核时间" />
         <el-table-column align="center" label="操作" fixed="right" width="200">
           <template #default="{ row }">
-            <el-button type="primary" @click="infoClick(row)" link
+            <el-button
+              v-if="menuList.canDetail"
+              type="primary"
+              @click="infoClick(row)"
+              link
               >详情</el-button
             >
             <el-button
               type="primary"
-              v-if="row.passName == '待审核'"
+              v-if="row.passName == '待审核' && menuList.canApply"
               @click="operationPassChange(row)"
               link
               >通过</el-button
             >
             <el-button
               type="danger"
-              v-if="row.passName == '待审核'"
+              v-if="row.passName == '待审核' && menuList.canApply"
               @click="operationRefuseChange(row)"
               link
               >拒绝</el-button
@@ -336,6 +340,19 @@ const store = useCounterStore();
 // 为避免解构时失去响应性
 const { name, age, isCollapse, realAge, collegeRole } = storeToRefs(store);
 
+const menuList = ref({
+  canAll: null,
+  canApply: null,
+  canDeleted: null,
+  canDetail: null,
+  canExport: null,
+  canImport: null,
+  canInsert: null,
+  canTop: null,
+  canUpdate: null,
+  canView: null,
+});
+
 // 表格数据
 const loading = ref(false);
 const tableData = reactive({
@@ -398,11 +415,11 @@ const getList = async () => {
     } else {
       loading.value = false;
       ElMessage({
-          type: "error",
-          showClose: true,
-          message: res.message,
-          center: true,
-        });
+        type: "error",
+        showClose: true,
+        message: res.message,
+        center: true,
+      });
     }
   });
 };
@@ -421,7 +438,6 @@ const resetBtn = lodash.debounce(async () => {
   getList();
 }, 300);
 
-
 // 通过
 // const operationPassChange = async (row) => {
 //   let data = {
@@ -603,6 +619,18 @@ onBeforeMount(() => {
   getList();
   typeList();
   categoryList();
+  let list = JSON.parse(sessionStorage.getItem("roleList"));
+  console.log(list);
+  list.forEach((i) => {
+    if (i.menuName == "校友组织管理") {
+      i.childs.forEach((item) => {
+        if (item.menuName == "入会申请审核") {
+          menuList.value = item;
+        }
+      });
+    }
+  });
+  console.log(menuList.value);
 });
 onUnmounted(() => {
   // document.removeEventListener("keyup", Enters);

+ 30 - 4
src/views/alumni-organization/CategoryManage.vue

@@ -60,6 +60,7 @@
           style="margin-left: 0"
           color="rgba(38, 151, 255, 1)"
           @click="addlist"
+          v-if="menuList.canInsert"
           >创建分类</el-button
         >
       </div>
@@ -85,11 +86,11 @@
             <p>创建人: {{ i.userName }}</p>
             <template #footer>
               <div class="card-footer">
-                <el-button type="primary" @click="updateS(i)" link
+                <el-button v-if="menuList.canUpdate" type="primary" @click="updateS(i)" link
                   >编辑</el-button
                 >
                 <span class="line">|</span>
-                <el-button type="danger" @click="deleteS(i)" link
+                <el-button v-if="menuList.canDeleted" type="danger" @click="deleteS(i)" link
                   >删除</el-button
                 >
               </div>
@@ -104,7 +105,7 @@
           background
           :current-page="currentPage"
           :page-size="pageSize"
-          :page-sizes="[10, 20, 30, 40]"
+          :page-sizes="[12, 24, 36, 48]"
           layout="total,sizes, prev, pager, next, jumper, slot"
           :total="total"
           @size-change="handleSizeChange"
@@ -190,6 +191,19 @@ const store = useCounterStore();
 // 为避免解构时失去响应性
 const { name, age, isCollapse, realAge, collegeRole } = storeToRefs(store);
 
+const menuList = ref({
+  canAll: null,
+  canApply: null,
+  canDeleted: null,
+  canDetail: null,
+  canExport: null,
+  canImport: null,
+  canInsert: null,
+  canTop: null,
+  canUpdate: null,
+  canView: null,
+});
+
 // 表格数据
 const loading = ref(false);
 const tableData = reactive({
@@ -205,7 +219,7 @@ const searchInput = reactive({
 }); // 搜索按钮数据
 
 const currentPage = ref(1); // 当前页
-const pageSize = ref(10);
+const pageSize = ref(12);
 const total = ref(0); // 当前总数
 const selectIds = ref([]); // 勾选的全部数据
 
@@ -415,6 +429,18 @@ const categoryList = async () => {
 onBeforeMount(() => {
   getList();
   categoryList();
+  let list = JSON.parse(sessionStorage.getItem("roleList"));
+  console.log(list);
+  list.forEach((i) => {
+    if (i.menuName == "校友组织管理") {
+      i.childs.forEach((item) => {
+        if (item.menuName == "组织分类管理") {
+          menuList.value = item;
+        }
+      });
+    }
+  });
+  console.log(menuList.value);
 });
 onUnmounted(() => {
   // document.removeEventListener("keyup", Enters);

+ 30 - 4
src/views/alumni-organization/OrganizationList.vue

@@ -56,6 +56,7 @@
           style="margin-left: 0"
           color="rgba(38, 151, 255, 1)"
           @click="addlist"
+          v-if="menuList.canInsert"
           >创建组织</el-button
         >
       </div>
@@ -111,13 +112,13 @@
         <el-table-column align="center" prop="createTime" label="创建时间" />
         <el-table-column align="center" label="操作" fixed="right" width="200">
           <template #default="{ row }">
-            <el-button type="primary" @click="clubTopupClick(row)" link
+            <el-button v-if="menuList.canTop" type="primary" @click="clubTopupClick(row)" link
               >置顶</el-button
             >
-            <el-button type="primary" @click="updateS(row)" link
+            <el-button v-if="menuList.canUpdate" type="primary" @click="updateS(row)" link
               >编辑</el-button
             >
-            <el-button type="danger" @click="deleteS(row)" link>删除</el-button>
+            <el-button v-if="menuList.canDeleted" type="danger" @click="deleteS(row)" link>删除</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -370,6 +371,19 @@ const store = useCounterStore();
 // 为避免解构时失去响应性
 const { name, age, isCollapse, realAge, collegeRole } = storeToRefs(store);
 
+const menuList = ref({
+  canAll: null,
+  canApply: null,
+  canDeleted: null,
+  canDetail: null,
+  canExport: null,
+  canImport: null,
+  canInsert: null,
+  canTop: null,
+  canUpdate: null,
+  canView: null,
+});
+
 const handleDelete = () => {
   ruleForm.branchIde = "";
 };
@@ -465,7 +479,7 @@ const rules = reactive({
     { required: true, message: "所属分类不能为空", trigger: "blur" },
   ],
   provinceId: [{ required: true, message: "省名称不能为空", trigger: "blur" }],
-  cityId: [{ required: true, message: "市名称不能为空", trigger: "blur" }],
+  cityId: [{ required: true, message: "市名称不能为空", trigger: "blur" }],
   description: [
     { required: true, message: "组织介绍不能为空", trigger: "blur" },
   ],
@@ -771,6 +785,18 @@ onBeforeMount(() => {
   getList();
   categoryList();
   provinceData();
+  let list = JSON.parse(sessionStorage.getItem("roleList"));
+  console.log(list);
+  list.forEach((i) => {
+    if (i.menuName == "校友组织管理") {
+      i.childs.forEach((item) => {
+        if (item.menuName == "校友组织列表") {
+          menuList.value = item;
+        }
+      });
+    }
+  });
+  console.log(menuList.value);
 });
 onUnmounted(() => {
   // document.removeEventListener("keyup", Enters);

+ 31 - 6
src/views/alumni-square/alumni-square.vue

@@ -62,6 +62,7 @@
             style="margin-left: 0"
             color="rgba(38, 151, 255, 1)"
             @click="addlist"
+            v-if="menuList.canInsert"
             >发布动态</el-button
           >
         </div>
@@ -148,17 +149,17 @@
                     <template #dropdown>
                       <el-dropdown-menu v-if="i.passName == '待审核'">
                         <el-dropdown-item @click="operationPassChange(i)"
-                          ><span style="color: #0095ff"
+                          ><span style="color: #0095ff" v-if="menuList.canApply"
                             >通过</span
                           ></el-dropdown-item
                         >
                         <el-dropdown-item @click="operationRefuseChange(i)"
-                          ><span style="color: #ff8d1a"
+                          ><span style="color: #ff8d1a" v-if="menuList.canApply"
                             >拒绝</span
                           ></el-dropdown-item
                         >
                         <el-dropdown-item @click="deleteS(i)"
-                          ><span style="color: #d43030"
+                          ><span style="color: #d43030" v-if="menuList.canDeleted"
                             >删除</span
                           ></el-dropdown-item
                         >
@@ -186,7 +187,7 @@
             background
             :current-page="currentPage"
             :page-size="pageSize"
-            :page-sizes="[10, 20, 30, 40]"
+            :page-sizes="[12, 24, 36, 48]"
             layout="total,sizes, prev, pager, next, jumper, slot"
             :total="total"
             @size-change="handleSizeChange"
@@ -531,6 +532,19 @@ const store = useCounterStore();
 // 为避免解构时失去响应性
 const { name, age, isCollapse, realAge, collegeRole } = storeToRefs(store);
 
+const menuList = ref({
+  canAll: null,
+  canApply: null,
+  canDeleted: null,
+  canDetail: null,
+  canExport: null,
+  canImport: null,
+  canInsert: null,
+  canTop: null,
+  canUpdate: null,
+  canView: null,
+});
+
 // 表格数据
 const loading = ref(false);
 const tableData = reactive({
@@ -546,7 +560,7 @@ const searchInput = reactive({
 }); // 搜索按钮数据
 
 const currentPage = ref(1); // 当前页
-const pageSize = ref(10);
+const pageSize = ref(12);
 const total = ref(0); // 当前总数
 const selectIds = ref([]); // 勾选的全部数据
 
@@ -973,7 +987,18 @@ const handleCurrentChange = (value) => {
 onBeforeMount(() => {
   getList();
   clubList();
-  //   collegeList();
+  let list = JSON.parse(sessionStorage.getItem("roleList"));
+  console.log(list);
+  list.forEach((i) => {
+    if (i.menuName == "广场信息管理") {
+      i.childs.forEach((item) => {
+        if (item.menuName == "广场信息管理") {
+          menuList.value = item;
+        }
+      });
+    }
+  });
+  console.log(menuList.value);
 });
 onUnmounted(() => {
   // document.removeEventListener("keyup", Enters);

+ 39 - 11
src/views/alumni-style/alumni-style.vue

@@ -50,6 +50,7 @@
             style="margin-left: 0"
             color="rgba(38, 151, 255, 1)"
             @click="addlist"
+            v-if="menuList.canInsert"
             >新建</el-button
           >
         </div>
@@ -64,7 +65,7 @@
             >
               <template #header>
                 <div class="card-header">
-                  <p> {{ i.name }}</p>
+                  <p>{{ i.name }}</p>
                   <span>创建时间: {{ i.createTime }}</span>
                 </div>
               </template>
@@ -102,7 +103,7 @@
             background
             :current-page="currentPage"
             :page-size="pageSize"
-            :page-sizes="[10, 20, 30, 40]"
+            :page-sizes="[12, 24, 36, 48]"
             layout="total,sizes, prev, pager, next, jumper, slot"
             :total="total"
             @size-change="handleSizeChange"
@@ -274,6 +275,19 @@ const store = useCounterStore();
 // 为避免解构时失去响应性
 const { name, age, isCollapse, realAge, collegeRole } = storeToRefs(store);
 
+const menuList = ref({
+  canAll: null,
+  canApply: null,
+  canDeleted: null,
+  canDetail: null,
+  canExport: null,
+  canImport: null,
+  canInsert: null,
+  canTop: null,
+  canUpdate: null,
+  canView: null,
+});
+
 // 表格数据
 const loading = ref(false);
 const tableData = reactive({
@@ -283,11 +297,11 @@ const dialongTitle = ref("新增账号"); // 弹窗标题
 
 const searchInput = reactive({
   keyword: "",
-  createTime:""
+  createTime: "",
 }); // 搜索按钮数据
 
 const currentPage = ref(1); // 当前页
-const pageSize = ref(10);
+const pageSize = ref(12);
 const total = ref(0); // 当前总数
 const selectIds = ref([]); // 勾选的全部数据
 
@@ -368,11 +382,11 @@ const getList = async () => {
     } else {
       loading.value = false;
       ElMessage({
-          type: "error",
-          showClose: true,
-          message: res.message,
-          center: true,
-        });
+        type: "error",
+        showClose: true,
+        message: res.message,
+        center: true,
+      });
     }
   });
 };
@@ -402,6 +416,10 @@ const updateS = (row) => {
   console.log(row);
   dialongTitle.value = "编辑";
   addDialogVisible.value = true;
+  ruleForm.name = row.name;
+  ruleForm.image = row.image;
+  ruleForm.descript = row.descript;
+  ruleForm.id = row.id;
 };
 const deleteS = async (row) => {
   ElMessageBox.confirm("是否删除此数据?", "提示!!!", {
@@ -502,8 +520,18 @@ const handleCurrentChange = (value) => {
 
 onBeforeMount(() => {
   getList();
-  //   schoolList();
-  //   collegeList();
+  let list = JSON.parse(sessionStorage.getItem("roleList"));
+  console.log(list);
+  list.forEach((i) => {
+    if (i.menuName == "校友风采管理") {
+      i.childs.forEach((item) => {
+        if (item.menuName == "校友风采管理") {
+          menuList.value = item;
+        }
+      });
+    }
+  });
+  console.log(menuList.value);
 });
 onUnmounted(() => {
   // document.removeEventListener("keyup", Enters);

+ 129 - 105
src/views/homecoming-service/homecoming-service.vue

@@ -148,18 +148,18 @@
             width="200"
           >
             <template #default="{ row }">
-              <el-button type="primary" @click="infoClick(row)" link
+              <el-button v-if="menuList.canDetail" type="primary" @click="infoClick(row)" link
                 >详情</el-button
               >
               <el-button
-                v-if="row.passName == '待审核'"
+                v-if="row.passName == '待审核' && menuList.canApply"
                 type="primary"
                 @click="operationPassChange(row)"
                 link
                 >通过</el-button
               >
               <el-button
-                v-if="row.passName == '待审核'"
+                v-if="row.passName == '待审核' && menuList.canApply"
                 type="danger"
                 @click="operationRefuseChange(row)"
                 link
@@ -188,103 +188,103 @@
       </div>
     </div>
     <!-- 添加账号弹窗 -->
-  <el-dialog
-    class="addStaff"
-    v-model="addDialogVisible"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    :title="dialongTitle"
-    align-center
-    width="540"
-    :before-close="cancelAdd"
-    destroy-on-close
-    draggable
-  >
-    <el-form
-      ref="ruleFormRef"
-      :model="ruleForm"
-      :rules="rules"
-      label-width="90px"
-      class="demo-ruleForm"
-      :size="formSize"
-      label-position="right"
-      status-icon
+    <el-dialog
+      class="addStaff"
+      v-model="addDialogVisible"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      :title="dialongTitle"
+      align-center
+      width="540"
+      :before-close="cancelAdd"
+      destroy-on-close
+      draggable
     >
-      <el-form-item
-        label="审批意见 :"
-        :prop="dialongTitle == '拒绝审批' ? 'passValue' : ''"
+      <el-form
+        ref="ruleFormRef"
+        :model="ruleForm"
+        :rules="rules"
+        label-width="90px"
+        class="demo-ruleForm"
+        :size="formSize"
+        label-position="right"
+        status-icon
       >
-        <el-input
-          v-model.trim="ruleForm.passValue"
-          placeholder="请输入审批意见"
-          clearable
-          :autosize="{ minRows: 4 }"
-          type="textarea"
-        />
-      </el-form-item>
-      <el-form-item class="options">
-        <el-button @click="cancelAdd">取消</el-button>
-        <el-button
-          color="rgba(0, 97, 255, 1)"
-          class="queding"
-          type="primary"
-          @click="submitAdd(ruleFormRef)"
+        <el-form-item
+          label="审批意见 :"
+          :prop="dialongTitle == '拒绝审批' ? 'passValue' : ''"
         >
-          确定
-        </el-button>
-      </el-form-item>
-    </el-form>
-  </el-dialog>
-  <!-- 详情 -->
-  <el-dialog
-    class="projectImport"
-    v-model="infoVisible"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    title="详情"
-    align-center
-    width="600"
-    :before-close="cancelInfo"
-    draggable
-  >
-    <div style="margin-bottom: 15px">
-      <el-descriptions :column="1">
-        <el-descriptions-item label="申请人 :">{{
-          infoData.userName
-        }}</el-descriptions-item>
-        <el-descriptions-item label="联系电话 :">{{
-          infoData.phone
-        }}</el-descriptions-item>
-        <el-descriptions-item label="返校日期 :">{{
-          infoData.returnsTime
-        }}</el-descriptions-item>
-        <el-descriptions-item label="离校日期 :">{{
-          infoData.returneTime
-        }}</el-descriptions-item>
-        <el-descriptions-item label="校区 :">{{
-          infoData.schoolName
-        }}</el-descriptions-item>
-        <el-descriptions-item label="返校事由 :">{{
-          infoData.remark
-        }}</el-descriptions-item>
-        <el-descriptions-item label="事由说明 :">{{
-          infoData.reason
-        }}</el-descriptions-item>
-        <el-descriptions-item label="是否需要停车位 :">{{
-          infoData.ifParkingSpotName
-        }}</el-descriptions-item>
-        <el-descriptions-item label="审核状态 :">{{
-          infoData.passName
-        }}</el-descriptions-item>
-        <el-descriptions-item label="审核人 :">{{
-          infoData.applyUserName
-        }}</el-descriptions-item>
-        <el-descriptions-item label="审核时间 :">{{
-          infoData.passTime
-        }}</el-descriptions-item>
-      </el-descriptions>
-    </div>
-  </el-dialog>
+          <el-input
+            v-model.trim="ruleForm.passValue"
+            placeholder="请输入审批意见"
+            clearable
+            :autosize="{ minRows: 4 }"
+            type="textarea"
+          />
+        </el-form-item>
+        <el-form-item class="options">
+          <el-button @click="cancelAdd">取消</el-button>
+          <el-button
+            color="rgba(0, 97, 255, 1)"
+            class="queding"
+            type="primary"
+            @click="submitAdd(ruleFormRef)"
+          >
+            确定
+          </el-button>
+        </el-form-item>
+      </el-form>
+    </el-dialog>
+    <!-- 详情 -->
+    <el-dialog
+      class="projectImport"
+      v-model="infoVisible"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      title="详情"
+      align-center
+      width="600"
+      :before-close="cancelInfo"
+      draggable
+    >
+      <div style="margin-bottom: 15px">
+        <el-descriptions :column="1">
+          <el-descriptions-item label="申请人 :">{{
+            infoData.userName
+          }}</el-descriptions-item>
+          <el-descriptions-item label="联系电话 :">{{
+            infoData.phone
+          }}</el-descriptions-item>
+          <el-descriptions-item label="返校日期 :">{{
+            infoData.returnsTime
+          }}</el-descriptions-item>
+          <el-descriptions-item label="离校日期 :">{{
+            infoData.returneTime
+          }}</el-descriptions-item>
+          <el-descriptions-item label="校区 :">{{
+            infoData.schoolName
+          }}</el-descriptions-item>
+          <el-descriptions-item label="返校事由 :">{{
+            infoData.remark
+          }}</el-descriptions-item>
+          <el-descriptions-item label="事由说明 :">{{
+            infoData.reason
+          }}</el-descriptions-item>
+          <el-descriptions-item label="是否需要停车位 :">{{
+            infoData.ifParkingSpotName
+          }}</el-descriptions-item>
+          <el-descriptions-item label="审核状态 :">{{
+            infoData.passName
+          }}</el-descriptions-item>
+          <el-descriptions-item label="审核人 :">{{
+            infoData.applyUserName
+          }}</el-descriptions-item>
+          <el-descriptions-item label="审核时间 :">{{
+            infoData.passTime
+          }}</el-descriptions-item>
+        </el-descriptions>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
@@ -317,6 +317,19 @@ const store = useCounterStore();
 // 为避免解构时失去响应性
 const { name, age, isCollapse, realAge, collegeRole } = storeToRefs(store);
 
+const menuList = ref({
+  canAll: null,
+  canApply: null,
+  canDeleted: null,
+  canDetail: null,
+  canExport: null,
+  canImport: null,
+  canInsert: null,
+  canTop: null,
+  canUpdate: null,
+  canView: null,
+});
+
 // 表格数据
 const loading = ref(false);
 const tableData = reactive({
@@ -337,7 +350,7 @@ const pageSize = ref(10);
 const total = ref(0); // 当前总数
 const selectIds = ref([]); // 勾选的全部数据
 
-const schoolData=ref([]) //校区数据
+const schoolData = ref([]); //校区数据
 
 const addDialogVisible = ref(false); // 控制添加账号弹窗
 
@@ -383,11 +396,11 @@ const getList = async () => {
     } else {
       loading.value = false;
       ElMessage({
-          type: "error",
-          showClose: true,
-          message: res.message,
-          center: true,
-        });
+        type: "error",
+        showClose: true,
+        message: res.message,
+        center: true,
+      });
     }
   });
 };
@@ -516,8 +529,19 @@ const schoolList = async () => {
 
 onBeforeMount(() => {
   getList();
-    schoolList();
-  //   collegeList();
+  schoolList();
+  let list = JSON.parse(sessionStorage.getItem("roleList"));
+  console.log(list);
+  list.forEach((i) => {
+    if (i.menuName == "返校服务管理") {
+      i.childs.forEach((item) => {
+        if (item.menuName == "返校服务管理") {
+          menuList.value = item;
+        }
+      });
+    }
+  });
+  console.log(menuList.value);
 });
 onUnmounted(() => {
   // document.removeEventListener("keyup", Enters);

+ 21 - 4
src/views/login/login.vue

@@ -114,7 +114,7 @@ import { ElMessage, ElNotification } from "element-plus";
 
 import { storeToRefs } from "pinia";
 import { useCounterStore } from "@/stores/index";
-import { login } from "@/api/login";
+import { login, queryUserRole } from "@/api/login";
 
 const router = useRouter();
 const store = useCounterStore();
@@ -149,9 +149,26 @@ const submitForm = (formEl) => {
       if (res.code == 200) {
         sessionStorage.setItem("token", res.data.token);
         sessionStorage.setItem("userName", res.data.userName);
-        router.push({
-          path: `/permission`,
-        });
+
+        let roleList = await queryUserRole();
+        console.log(roleList, "获取当前用户角色权限数据");
+        if (roleList.code == 200) {
+          sessionStorage.setItem(
+            "roleList",
+            JSON.stringify(roleList.data.menus),
+          );
+          router.push({
+            path: `/alumni-info`,
+          });
+        } else {
+          ElMessage({
+            type: "error",
+            showClose: true,
+            message: roleList.message,
+            center: true,
+          });
+        }
+
         // 添加路由后跳转到第一个菜单项
         // store.ROLEAdd().then(() => {
         //   router.push({

+ 25 - 0
src/views/operation-log/operation-log.vue

@@ -146,6 +146,19 @@ const store = useCounterStore();
 // 为避免解构时失去响应性
 const { name, age, isCollapse, realAge, collegeRole } = storeToRefs(store);
 
+const menuList = ref({
+  canAll: null,
+  canApply: null,
+  canDeleted: null,
+  canDetail: null,
+  canExport: null,
+  canImport: null,
+  canInsert: null,
+  canTop: null,
+  canUpdate: null,
+  canView: null,
+});
+
 // 表格数据
 const loading = ref(false);
 const tableData = reactive({
@@ -255,6 +268,18 @@ const allLogLevel = async () => {
 onBeforeMount(() => {
   getList();
   allLogLevel();
+  let list = JSON.parse(sessionStorage.getItem("roleList"));
+  console.log(list);
+  list.forEach((i) => {
+    if (i.menuName == "操作日志") {
+      i.childs.forEach((item) => {
+        if (item.menuName == "操作日志") {
+          menuList.value = item;
+        }
+      });
+    }
+  });
+  console.log(menuList.value);
 });
 onUnmounted(() => {
   // document.removeEventListener("keyup", Enters);

+ 29 - 7
src/views/permission/Account.vue

@@ -61,6 +61,7 @@
           style="margin-left: 0"
           color="rgba(38, 151, 255, 1)"
           @click="addlist"
+          v-if="menuList.canInsert"
           >新增</el-button
         >
       </div>
@@ -94,11 +95,7 @@
           label="真实姓名"
         />
         <el-table-column align="center" prop="phone" label="联系方式" />
-        <el-table-column align="center" label="状态">
-          <template #default="{ row }">
-            <span v-if="row.stateId == 1" style="color: #67c23a">正常</span>
-            <span v-if="row.stateId == 2" style="color: #e6a23c">禁用</span>
-          </template>
+        <el-table-column align="center" prop="stateName" label="状态">
         </el-table-column>
         <el-table-column
           align="center"
@@ -107,10 +104,10 @@
         />
         <el-table-column align="center" label="操作" fixed="right" width="200">
           <template #default="{ row }">
-            <el-button type="primary" @click="updateS(row)" link
+            <el-button v-if="menuList.canUpdate" type="primary" @click="updateS(row)" link
               >编辑</el-button
             >
-            <el-button type="danger" @click="deleteS(row)" link>删除</el-button>
+            <el-button v-if="menuList.canDeleted" type="danger" @click="deleteS(row)" link>删除</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -260,6 +257,19 @@ const store = useCounterStore();
 // 为避免解构时失去响应性
 const { name, age, isCollapse, realAge, collegeRole } = storeToRefs(store);
 
+const menuList = ref({
+  canAll: null,
+  canApply: null,
+  canDeleted: null,
+  canDetail: null,
+  canExport: null,
+  canImport: null,
+  canInsert: null,
+  canTop: null,
+  canUpdate: null,
+  canView: null,
+});
+
 // 表格数据
 const loading = ref(false);
 const tableData = reactive({
@@ -525,6 +535,18 @@ const handleCurrentChange = (value) => {
 onBeforeMount(() => {
   getList();
   roleList();
+  let list = JSON.parse(sessionStorage.getItem("roleList"));
+  console.log(list);
+  list.forEach((i) => {
+    if (i.menuName == "权限管理") {
+      i.childs.forEach((item) => {
+        if (item.menuName == "用户管理") {
+          menuList.value = item;
+        }
+      });
+    }
+  });
+  console.log(menuList.value);
 });
 onUnmounted(() => {
   // document.removeEventListener("keyup", Enters);

+ 75 - 49
src/views/permission/Role.vue

@@ -45,6 +45,7 @@
           style="margin-left: 0"
           color="rgba(38, 151, 255, 1)"
           @click="addlist"
+          v-if="menuLists.canInsert"
           >新增</el-button
         >
       </div>
@@ -74,10 +75,10 @@
         <el-table-column align="center" prop="createTime" label="创建时间" />
         <el-table-column align="center" label="操作" fixed="right" width="200">
           <template #default="{ row }">
-            <el-button type="primary" @click="updateS(row)" link
+            <el-button v-if="menuLists.canUpdate" type="primary" @click="updateS(row)" link
               >编辑</el-button
             >
-            <el-button type="danger" @click="deleteS(row)" link>删除</el-button>
+            <el-button v-if="menuLists.canDeleted" type="danger" @click="deleteS(row)" link>删除</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -321,27 +322,27 @@
                   @change="handleCheckChange($event, i, '组织分类管理')"
                 />
               </div>
-              <div v-if="i.menuName == '校合作管理'">
+              <div v-if="i.menuName == '校合作管理'">
                 <p>
                   <el-checkbox
                     class="level"
                     label="全选"
                     v-model="i.canAll"
-                    @change="handleCheckAllChange($event, i, '校合作管理')"
+                    @change="handleCheckAllChange($event, i, '校合作管理')"
                     :true-value="1"
                     :false-value="0"
                   >
                   </el-checkbox>
                 </p>
                 <el-checkbox
-                  v-for="menu in menuPermissionMap.xqhzgl"
+                  v-for="menu in menuPermissionMap.xyhzgl"
                   :key="menu.keyword"
                   v-model="i[menu.keyword]"
                   :label="menu.name"
                   size="large"
                   :true-value="1"
                   :false-value="0"
-                  @change="handleCheckChange($event, i, '校合作管理')"
+                  @change="handleCheckChange($event, i, '校合作管理')"
                 />
               </div>
               <div v-if="i.menuName == '校友企业管理'">
@@ -775,6 +776,19 @@ const { name, age, isCollapse, realAge, collegeRole } = storeToRefs(store);
 
 const props = { label: "name", value: "id", children: "children" };
 
+const menuLists = ref({
+  canAll: null,
+  canApply: null,
+  canDeleted: null,
+  canDetail: null,
+  canExport: null,
+  canImport: null,
+  canInsert: null,
+  canTop: null,
+  canUpdate: null,
+  canView: null,
+});
+
 // 表格数据
 const loading = ref(false);
 const tableData = reactive({
@@ -866,11 +880,11 @@ const menuPermissionMap = {
       keyword: "canApply",
       value: 1,
     },
-    {
-      name: "删除权限",
-      keyword: "canDeleted",
-      value: 1,
-    },
+    // {
+    //   name: "删除权限",
+    //   keyword: "canDeleted",
+    //   value: 1,
+    // },
   ], // 广场信息管理
   xyzzlb: [
     {
@@ -938,11 +952,11 @@ const menuPermissionMap = {
       keyword: "canApply",
       value: 1,
     },
-    {
-      name: "删除权限",
-      keyword: "canDeleted",
-      value: 1,
-    },
+    // {
+    //   name: "删除权限",
+    //   keyword: "canDeleted",
+    //   value: 1,
+    // },
   ], // 入会申请审核
   xyhdlb: [
     {
@@ -988,13 +1002,13 @@ const menuPermissionMap = {
       keyword: "canApply",
       value: 1,
     },
-    {
-      name: "删除权限",
-      keyword: "canDeleted",
-      value: 1,
-    },
+    // {
+    //   name: "删除权限",
+    //   keyword: "canDeleted",
+    //   value: 1,
+    // },
   ], // 活动报名审核
-  xqhzgl: [
+  xyhzgl: [
     {
       name: "查看权限",
       keyword: "canView",
@@ -1011,12 +1025,12 @@ const menuPermissionMap = {
       keyword: "canApply",
       value: 1,
     },
-    {
-      name: "删除权限",
-      keyword: "canDeleted",
-      value: 1,
-    },
-  ], // 校合作管理
+    // {
+    //   name: "删除权限",
+    //   keyword: "canDeleted",
+    //   value: 1,
+    // },
+  ], // 校合作管理
   xyqygl: [
     {
       name: "查看权限",
@@ -1034,11 +1048,11 @@ const menuPermissionMap = {
       keyword: "canApply",
       value: 1,
     },
-    {
-      name: "删除权限",
-      keyword: "canDeleted",
-      value: 1,
-    },
+    // {
+    //   name: "删除权限",
+    //   keyword: "canDeleted",
+    //   value: 1,
+    // },
   ], // 校友企业管理
   xyfcgl: [
     {
@@ -1128,11 +1142,11 @@ const menuPermissionMap = {
       keyword: "canApply",
       value: 1,
     },
-    {
-      name: "删除权限",
-      keyword: "canDeleted",
-      value: 1,
-    },
+    // {
+    //   name: "删除权限",
+    //   keyword: "canDeleted",
+    //   value: 1,
+    // },
   ], // 返校服务管理
   dzxykgl: [
     {
@@ -1151,11 +1165,11 @@ const menuPermissionMap = {
       keyword: "canApply",
       value: 1,
     },
-    {
-      name: "删除权限",
-      keyword: "canDeleted",
-      value: 1,
-    },
+    // {
+    //   name: "删除权限",
+    //   keyword: "canDeleted",
+    //   value: 1,
+    // },
   ], // 电子校友卡管理
   xyxclb: [
     {
@@ -1221,11 +1235,11 @@ const menuPermissionMap = {
       keyword: "canApply",
       value: 1,
     },
-    {
-      name: "删除权限",
-      keyword: "canDeleted",
-      value: 1,
-    },
+    // {
+    //   name: "删除权限",
+    //   keyword: "canDeleted",
+    //   value: 1,
+    // },
   ], // 照片上传审核
   jsgl: [
     {
@@ -1301,7 +1315,7 @@ const keyToMapKey = {
   入会申请审核: "rhshsh",
   校友活动列表: "xyhdlb",
   活动报名审核: "hdbmsh",
-  校企合作管理: "xqhzgl",
+  校友合作管理: "xyhzgl",
   校友企业管理: "xyqygl",
   校友风采管理: "xyfcgl",
   新闻聚焦列表: "xwjjlb",
@@ -1661,6 +1675,18 @@ onBeforeMount(() => {
   getList();
   allMenus();
   provinceData();
+  let list = JSON.parse(sessionStorage.getItem("roleList"));
+  console.log(list);
+  list.forEach((i) => {
+    if (i.menuName == "权限管理") {
+      i.childs.forEach((item) => {
+        if (item.menuName == "角色管理") {
+          menuLists.value = item;
+        }
+      });
+    }
+  });
+  console.log(menuLists.value);
 });
 onUnmounted(() => {
   // document.removeEventListener("keyup", Enters);

+ 241 - 0
src/views/system-setting/Richtext.vue

@@ -0,0 +1,241 @@
+<template>
+  <div class="richText">
+    <div class="box" style="">
+      <Toolbar
+        class="boxToolbar"
+        :editor="editorRef"
+        :defaultConfig="toolbarConfig"
+        :mode="mode"
+      />
+      <Editor
+        class="boxEditor"
+        v-model="valueHtml"
+        :defaultConfig="editorConfig"
+        :mode="mode"
+        @onCreated="handleCreated"
+        @onChange="handleChange"
+        @onDestroyed="handleDestroyed"
+        @onFocus="handleFocus"
+        @onBlur="handleBlur"
+        @customAlert="customAlert"
+        @customPaste="customPaste"
+      />
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { useRouter } from "vue-router";
+import { ElMessage, ElMessageBox } from "element-plus";
+import { Calendar } from "@element-plus/icons-vue";
+import { dayjs } from "element-plus";
+import lodash, { reduce } from "lodash";
+import { uploadFile } from "@/api/uploadFile";
+
+import "@wangeditor/editor/dist/css/style.css"; // 引入 css
+
+import { onBeforeUnmount, nextTick, ref, shallowRef, onMounted } from "vue";
+import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
+import { DomEditor, createToolbar } from "@wangeditor/editor";
+
+// 编辑器实例,必须用 shallowRef
+const editorRef = shallowRef();
+
+const props = defineProps({
+  fatherMessage: {},
+});
+const emit = defineEmits(["richtextClick"]);
+
+// 内容 HTML
+const valueHtml = ref();
+const toolbarConfig = {
+  // JS 语法
+  /* 工具栏配置 */
+  excludeKeys: [
+    "insertLink",
+    "insertVideo",
+    "insertTable",
+    "fullScreen",
+    "insertImage",
+    // "group-image",
+    "group-video",
+    "todo",
+  ],
+};
+const uploadImg = async (file, insertFn) => {
+  // let imgData = new FormData();
+  console.log(file);
+  let srcImg = file;
+  let data = new FormData();
+  data.set("file", srcImg);
+  let res = await uploadFile(data);
+  console.log(res, "导入照片");
+  if (res.code == 200) {
+    let href = res.data.fileUrl;
+    insertFn(href);
+    ElMessage({
+      type: "success",
+      showClose: true,
+      message: res.message,
+      center: true,
+    });
+  } else {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.message,
+      center: true,
+    });
+  }
+};
+const editorConfig = {
+  placeholder: "请输入内容......",
+  MENU_CONF: {
+    uploadImage: {
+      // 自定义上传图片 方法
+      customUpload: uploadImg,
+      // 自定义插入图片 方法
+      // customInsert: insertImg,
+      //上传图片配置
+      // server: "https://	jgy-1325577833.cos.ap-guangzhou.myqcloud.com", //上传接口地址
+      fieldName: "file", //上传文件名
+      methods: "post",
+      metaWithUrl: false, // 参数拼接到 url 上
+      // 单个文件上传成功之后
+      // onSuccess(file, res) {
+      //   console.log(file, res);
+      // },
+      // 自定义插入图片
+      customInsert(res, insertFn) {
+        console.log(res);
+        // insertFn(res.url)
+      },
+    },
+    // insertImage: {
+    //   onInsertedImage(imageNode) {
+    //     if (imageNode == null) return;
+    //     const { src, alt, url, href } = imageNode;
+    //     console.log("inserted image", src, alt, url, href);
+    //   },
+    //   checkImage: customCheckImageFn, // 也支持 async 函数
+    //   parseImageSrc: customParseImageSrc, // 也支持 async 函数
+    // },
+    // editImage: {
+    //   onUpdatedImage(imageNode) {
+    //     if (imageNode == null) return;
+    //     const { src, alt, url } = imageNode;
+    //     console.log("updated image", src, alt, url);
+    //   },
+    //   checkImage: customCheckImageFn, // 也支持 async 函数
+    //   parseImageSrc: customParseImageSrc, // 也支持 async 函数
+    // },
+  },
+};
+const mode = ref("default"); // 默认模式
+// const mode = ref("simple"); // 简易模式
+
+const handleChange = (editor) => {
+  // console.log("change:", editor);
+  // console.log("change:", editor.getText());
+  // console.log("change:", editor.getHtml());
+  emit("richtextClick", {
+    html: editor.getHtml(),
+    text: editor.getText(),
+  });
+};
+const handleDestroyed = (editor) => {
+  console.log("destroyed", editor);
+};
+const handleFocus = (editor) => {
+  console.log("focus", editor);
+  const toolbar = DomEditor.getToolbar(editor);
+
+  const curToolbarConfig = toolbar.getConfig();
+  console.log(curToolbarConfig.toolbarKeys); // 当前菜单排序和分组
+};
+const handleBlur = (editor) => {
+  console.log("blur", editor);
+};
+const customAlert = (info, type) => {
+  alert(`【自定义提示】${type} - ${info}`);
+};
+// 粘贴事件对象
+const customPaste = (editor, event, callback) => {
+  console.log("ClipboardEvent 粘贴事件对象", event);
+  const html = event.clipboardData.getData("text/html"); // 获取粘贴的 html
+  const text = event.clipboardData.getData("text/plain"); // 获取粘贴的纯文本
+  const rtf = event.clipboardData.getData("text/rtf"); // 获取 rtf 数据(如从 word wsp 复制粘贴)
+  // console.log(html);
+
+  // 自定义插入内容
+  // editor.insertText("自定义插入内容");
+
+  // 返回 false ,阻止默认粘贴行为
+  // event.preventDefault();
+  // callback(false); // 返回值(注意,vue 事件的返回值,不能用 return)
+
+  // 返回 true ,继续默认的粘贴行为
+  callback(true);
+};
+
+// // 自定义图片上传
+// editorConfig.MENU_CONF["uploadImage"] = {
+//   async customUpload(file, insertFn) {
+//     let formData = new FormData();
+//     formData.append("files", file);
+//     try {
+//       // 这里结合实际场景写自己上传图片的逻辑,此处代码仅为示例
+//       const { data } = await upload(formData);
+//       // 对图片进行处理,同样需要结合实际场景
+//       data.forEach((item) => {
+//         insertFn(item, "image", item);
+//       });
+//     } catch (error) {
+//       console.log(error);
+//     }
+//   },
+// };
+
+const handleCreated = (editor) => {
+  editorRef.value = editor; // 记录 editor 实例,重要!
+  // console.log(props.fatherMessage);
+  editor.setHtml(props.fatherMessage.data);
+  if (props.fatherMessage.flag) {
+    editor.enable();
+  } else {
+    editor.disable();
+  }
+};
+
+// 模拟 ajax 异步获取内容
+onMounted(() => {
+  // console.log(props.fatherMessage.data);
+});
+
+// 组件销毁时,也及时销毁编辑器
+onBeforeUnmount(() => {
+  console.log("销毁组件");
+  const editor = editorRef.value;
+  if (editor == null) return;
+  editor.destroy();
+});
+</script>
+
+<style scoped lang="scss">
+.richText {
+  width: 100%;
+  .box {
+    .boxToolbar {
+      border-top: 1px solid #ccc;
+      border-left: 1px solid #ccc;
+      border-right: 1px solid #ccc;
+    }
+    .boxEditor {
+      min-height: 200px !important;
+      max-height: 500px !important;
+      overflow: auto;
+      border: 1px solid #ccc;
+    }
+  }
+}
+</style>

+ 241 - 0
src/views/system-setting/Richtext2.vue

@@ -0,0 +1,241 @@
+<template>
+  <div class="richText">
+    <div class="box" style="">
+      <Toolbar
+        class="boxToolbar"
+        :editor="editorRef"
+        :defaultConfig="toolbarConfig"
+        :mode="mode"
+      />
+      <Editor
+        class="boxEditor"
+        v-model="valueHtml"
+        :defaultConfig="editorConfig"
+        :mode="mode"
+        @onCreated="handleCreated"
+        @onChange="handleChange"
+        @onDestroyed="handleDestroyed"
+        @onFocus="handleFocus"
+        @onBlur="handleBlur"
+        @customAlert="customAlert"
+        @customPaste="customPaste"
+      />
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { useRouter } from "vue-router";
+import { ElMessage, ElMessageBox } from "element-plus";
+import { Calendar } from "@element-plus/icons-vue";
+import { dayjs } from "element-plus";
+import lodash, { reduce } from "lodash";
+import { uploadFile } from "@/api/uploadFile";
+
+import "@wangeditor/editor/dist/css/style.css"; // 引入 css
+
+import { onBeforeUnmount, nextTick, ref, shallowRef, onMounted } from "vue";
+import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
+import { DomEditor, createToolbar } from "@wangeditor/editor";
+
+// 编辑器实例,必须用 shallowRef
+const editorRef = shallowRef();
+
+const props = defineProps({
+  fatherMessage2: {},
+});
+const emit = defineEmits(["richtextClick2"]);
+
+// 内容 HTML
+const valueHtml = ref();
+const toolbarConfig = {
+  // JS 语法
+  /* 工具栏配置 */
+  excludeKeys: [
+    "insertLink",
+    "insertVideo",
+    "insertTable",
+    "fullScreen",
+    "insertImage",
+    // "group-image",
+    "group-video",
+    "todo",
+  ],
+};
+const uploadImg = async (file, insertFn) => {
+  // let imgData = new FormData();
+  console.log(file);
+  let srcImg = file;
+  let data = new FormData();
+  data.set("file", srcImg);
+  let res = await uploadFile(data);
+  console.log(res, "导入照片");
+  if (res.code == 200) {
+    let href = res.data.fileUrl;
+    insertFn(href);
+    ElMessage({
+      type: "success",
+      showClose: true,
+      message: res.message,
+      center: true,
+    });
+  } else {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.message,
+      center: true,
+    });
+  }
+};
+const editorConfig = {
+  placeholder: "请输入内容......",
+  MENU_CONF: {
+    uploadImage: {
+      // 自定义上传图片 方法
+      customUpload: uploadImg,
+      // 自定义插入图片 方法
+      // customInsert: insertImg,
+      //上传图片配置
+      // server: "https://	jgy-1325577833.cos.ap-guangzhou.myqcloud.com", //上传接口地址
+      fieldName: "file", //上传文件名
+      methods: "post",
+      metaWithUrl: false, // 参数拼接到 url 上
+      // 单个文件上传成功之后
+      // onSuccess(file, res) {
+      //   console.log(file, res);
+      // },
+      // 自定义插入图片
+      customInsert(res, insertFn) {
+        console.log(res);
+        // insertFn(res.url)
+      },
+    },
+    // insertImage: {
+    //   onInsertedImage(imageNode) {
+    //     if (imageNode == null) return;
+    //     const { src, alt, url, href } = imageNode;
+    //     console.log("inserted image", src, alt, url, href);
+    //   },
+    //   checkImage: customCheckImageFn, // 也支持 async 函数
+    //   parseImageSrc: customParseImageSrc, // 也支持 async 函数
+    // },
+    // editImage: {
+    //   onUpdatedImage(imageNode) {
+    //     if (imageNode == null) return;
+    //     const { src, alt, url } = imageNode;
+    //     console.log("updated image", src, alt, url);
+    //   },
+    //   checkImage: customCheckImageFn, // 也支持 async 函数
+    //   parseImageSrc: customParseImageSrc, // 也支持 async 函数
+    // },
+  },
+};
+const mode = ref("default"); // 默认模式
+// const mode = ref("simple"); // 简易模式
+
+const handleChange = (editor) => {
+  // console.log("change:", editor);
+  // console.log("change:", editor.getText());
+  // console.log("change:", editor.getHtml());
+  emit("richtextClick2", {
+    html: editor.getHtml(),
+    text: editor.getText(),
+  });
+};
+const handleDestroyed = (editor) => {
+  console.log("destroyed", editor);
+};
+const handleFocus = (editor) => {
+  console.log("focus", editor);
+  const toolbar = DomEditor.getToolbar(editor);
+
+  const curToolbarConfig = toolbar.getConfig();
+  console.log(curToolbarConfig.toolbarKeys); // 当前菜单排序和分组
+};
+const handleBlur = (editor) => {
+  console.log("blur", editor);
+};
+const customAlert = (info, type) => {
+  alert(`【自定义提示】${type} - ${info}`);
+};
+// 粘贴事件对象
+const customPaste = (editor, event, callback) => {
+  console.log("ClipboardEvent 粘贴事件对象", event);
+  const html = event.clipboardData.getData("text/html"); // 获取粘贴的 html
+  const text = event.clipboardData.getData("text/plain"); // 获取粘贴的纯文本
+  const rtf = event.clipboardData.getData("text/rtf"); // 获取 rtf 数据(如从 word wsp 复制粘贴)
+  // console.log(html);
+
+  // 自定义插入内容
+  // editor.insertText("自定义插入内容");
+
+  // 返回 false ,阻止默认粘贴行为
+  // event.preventDefault();
+  // callback(false); // 返回值(注意,vue 事件的返回值,不能用 return)
+
+  // 返回 true ,继续默认的粘贴行为
+  callback(true);
+};
+
+// // 自定义图片上传
+// editorConfig.MENU_CONF["uploadImage"] = {
+//   async customUpload(file, insertFn) {
+//     let formData = new FormData();
+//     formData.append("files", file);
+//     try {
+//       // 这里结合实际场景写自己上传图片的逻辑,此处代码仅为示例
+//       const { data } = await upload(formData);
+//       // 对图片进行处理,同样需要结合实际场景
+//       data.forEach((item) => {
+//         insertFn(item, "image", item);
+//       });
+//     } catch (error) {
+//       console.log(error);
+//     }
+//   },
+// };
+
+const handleCreated = (editor) => {
+  editorRef.value = editor; // 记录 editor 实例,重要!
+  // console.log(props.fatherMessage2);
+  editor.setHtml(props.fatherMessage2.data);
+  if (props.fatherMessage2.flag) {
+    editor.enable();
+  } else {
+    editor.disable();
+  }
+};
+
+// 模拟 ajax 异步获取内容
+onMounted(() => {
+  // console.log(props.fatherMessage2.data);
+});
+
+// 组件销毁时,也及时销毁编辑器
+onBeforeUnmount(() => {
+  console.log("销毁组件");
+  const editor = editorRef.value;
+  if (editor == null) return;
+  editor.destroy();
+});
+</script>
+
+<style scoped lang="scss">
+.richText {
+  width: 100%;
+  .box {
+    .boxToolbar {
+      border-top: 1px solid #ccc;
+      border-left: 1px solid #ccc;
+      border-right: 1px solid #ccc;
+    }
+    .boxEditor {
+      min-height: 200px !important;
+       max-height: 500px !important;
+       overflow: auto;
+      border: 1px solid #ccc;
+    }
+  }
+}
+</style>

+ 241 - 0
src/views/system-setting/Richtext3.vue

@@ -0,0 +1,241 @@
+<template>
+  <div class="richText">
+    <div class="box" style="">
+      <Toolbar
+        class="boxToolbar"
+        :editor="editorRef"
+        :defaultConfig="toolbarConfig"
+        :mode="mode"
+      />
+      <Editor
+        class="boxEditor"
+        v-model="valueHtml"
+        :defaultConfig="editorConfig"
+        :mode="mode"
+        @onCreated="handleCreated"
+        @onChange="handleChange"
+        @onDestroyed="handleDestroyed"
+        @onFocus="handleFocus"
+        @onBlur="handleBlur"
+        @customAlert="customAlert"
+        @customPaste="customPaste"
+      />
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { useRouter } from "vue-router";
+import { ElMessage, ElMessageBox } from "element-plus";
+import { Calendar } from "@element-plus/icons-vue";
+import { dayjs } from "element-plus";
+import lodash, { reduce } from "lodash";
+import { uploadFile } from "@/api/uploadFile";
+
+import "@wangeditor/editor/dist/css/style.css"; // 引入 css
+
+import { onBeforeUnmount, nextTick, ref, shallowRef, onMounted } from "vue";
+import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
+import { DomEditor, createToolbar } from "@wangeditor/editor";
+
+// 编辑器实例,必须用 shallowRef
+const editorRef = shallowRef();
+
+const props = defineProps({
+  fatherMessage3: {},
+});
+const emit = defineEmits(["richtextClick3"]);
+
+// 内容 HTML
+const valueHtml = ref();
+const toolbarConfig = {
+  // JS 语法
+  /* 工具栏配置 */
+  excludeKeys: [
+    "insertLink",
+    "insertVideo",
+    "insertTable",
+    "fullScreen",
+    "insertImage",
+    // "group-image",
+    "group-video",
+    "todo",
+  ],
+};
+const uploadImg = async (file, insertFn) => {
+  // let imgData = new FormData();
+  console.log(file);
+  let srcImg = file;
+  let data = new FormData();
+  data.set("file", srcImg);
+  let res = await uploadFile(data);
+  console.log(res, "导入照片");
+  if (res.code == 200) {
+    let href = res.data.fileUrl;
+    insertFn(href);
+    ElMessage({
+      type: "success",
+      showClose: true,
+      message: res.message,
+      center: true,
+    });
+  } else {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.message,
+      center: true,
+    });
+  }
+};
+const editorConfig = {
+  placeholder: "请输入内容......",
+  MENU_CONF: {
+    uploadImage: {
+      // 自定义上传图片 方法
+      customUpload: uploadImg,
+      // 自定义插入图片 方法
+      // customInsert: insertImg,
+      //上传图片配置
+      // server: "https://	jgy-1325577833.cos.ap-guangzhou.myqcloud.com", //上传接口地址
+      fieldName: "file", //上传文件名
+      methods: "post",
+      metaWithUrl: false, // 参数拼接到 url 上
+      // 单个文件上传成功之后
+      // onSuccess(file, res) {
+      //   console.log(file, res);
+      // },
+      // 自定义插入图片
+      customInsert(res, insertFn) {
+        console.log(res);
+        // insertFn(res.url)
+      },
+    },
+    // insertImage: {
+    //   onInsertedImage(imageNode) {
+    //     if (imageNode == null) return;
+    //     const { src, alt, url, href } = imageNode;
+    //     console.log("inserted image", src, alt, url, href);
+    //   },
+    //   checkImage: customCheckImageFn, // 也支持 async 函数
+    //   parseImageSrc: customParseImageSrc, // 也支持 async 函数
+    // },
+    // editImage: {
+    //   onUpdatedImage(imageNode) {
+    //     if (imageNode == null) return;
+    //     const { src, alt, url } = imageNode;
+    //     console.log("updated image", src, alt, url);
+    //   },
+    //   checkImage: customCheckImageFn, // 也支持 async 函数
+    //   parseImageSrc: customParseImageSrc, // 也支持 async 函数
+    // },
+  },
+};
+const mode = ref("default"); // 默认模式
+// const mode = ref("simple"); // 简易模式
+
+const handleChange = (editor) => {
+  // console.log("change:", editor);
+  // console.log("change:", editor.getText());
+  // console.log("change:", editor.getHtml());
+  emit("richtextClick3", {
+    html: editor.getHtml(),
+    text: editor.getText(),
+  });
+};
+const handleDestroyed = (editor) => {
+  console.log("destroyed", editor);
+};
+const handleFocus = (editor) => {
+  console.log("focus", editor);
+  const toolbar = DomEditor.getToolbar(editor);
+
+  const curToolbarConfig = toolbar.getConfig();
+  console.log(curToolbarConfig.toolbarKeys); // 当前菜单排序和分组
+};
+const handleBlur = (editor) => {
+  console.log("blur", editor);
+};
+const customAlert = (info, type) => {
+  alert(`【自定义提示】${type} - ${info}`);
+};
+// 粘贴事件对象
+const customPaste = (editor, event, callback) => {
+  console.log("ClipboardEvent 粘贴事件对象", event);
+  const html = event.clipboardData.getData("text/html"); // 获取粘贴的 html
+  const text = event.clipboardData.getData("text/plain"); // 获取粘贴的纯文本
+  const rtf = event.clipboardData.getData("text/rtf"); // 获取 rtf 数据(如从 word wsp 复制粘贴)
+  // console.log(html);
+
+  // 自定义插入内容
+  // editor.insertText("自定义插入内容");
+
+  // 返回 false ,阻止默认粘贴行为
+  // event.preventDefault();
+  // callback(false); // 返回值(注意,vue 事件的返回值,不能用 return)
+
+  // 返回 true ,继续默认的粘贴行为
+  callback(true);
+};
+
+// // 自定义图片上传
+// editorConfig.MENU_CONF["uploadImage"] = {
+//   async customUpload(file, insertFn) {
+//     let formData = new FormData();
+//     formData.append("files", file);
+//     try {
+//       // 这里结合实际场景写自己上传图片的逻辑,此处代码仅为示例
+//       const { data } = await upload(formData);
+//       // 对图片进行处理,同样需要结合实际场景
+//       data.forEach((item) => {
+//         insertFn(item, "image", item);
+//       });
+//     } catch (error) {
+//       console.log(error);
+//     }
+//   },
+// };
+
+const handleCreated = (editor) => {
+  editorRef.value = editor; // 记录 editor 实例,重要!
+  // console.log(props.fatherMessage3);
+  editor.setHtml(props.fatherMessage3.data);
+  if (props.fatherMessage3.flag) {
+    editor.enable();
+  } else {
+    editor.disable();
+  }
+};
+
+// 模拟 ajax 异步获取内容
+onMounted(() => {
+  // console.log(props.fatherMessage3.data);
+});
+
+// 组件销毁时,也及时销毁编辑器
+onBeforeUnmount(() => {
+  console.log("销毁组件");
+  const editor = editorRef.value;
+  if (editor == null) return;
+  editor.destroy();
+});
+</script>
+
+<style scoped lang="scss">
+.richText {
+  width: 100%;
+  .box {
+    .boxToolbar {
+      border-top: 1px solid #ccc;
+      border-left: 1px solid #ccc;
+      border-right: 1px solid #ccc;
+    }
+    .boxEditor {
+      min-height: 200px !important;
+       max-height: 500px !important;
+       overflow: auto;
+      border: 1px solid #ccc;
+    }
+  }
+}
+</style>

+ 320 - 61
src/views/system-setting/system-setting.vue

@@ -5,19 +5,14 @@
       <span class="cameratxt">系统设置</span>
     </div>
     <div class="scroll">
-      <h4>小程序首页封面轮播图设置</h4>
-      <p>可上传多张图片</p>
+      <h4>小程序首页封面轮播图设置 (可上传多张图片)</h4>
+      <!-- <p>可上传多张图片</p> -->
       <div class="img-upload-wrap">
         <!-- 2. 自己循环纯链接数组fileList,展示图片(核心:自定义渲染) -->
-        <div class="img-preview-list" v-if="fileList.length > 0">
+        <div class="img-preview-list">
           <div class="img-item" v-for="(url, index) in fileList" :key="index">
             <!-- 替换原生img为el-image,新增preview相关属性 -->
-            <img
-              :src="url"
-              alt="图片预览"
-              class="preview-img"
-              @click="handlePreview(fileList, index)"
-            />
+            <img :src="url" alt="图片预览" class="preview-img" v-viewer />
             <span
               v-if="!disabled"
               class="delete-btn"
@@ -27,21 +22,74 @@
             </span>
           </div>
           <ImgCutter v-if="!disabled" @getUrl="getUrl" />
-          <!-- <el-upload
-            v-if="!disabled"
-            action="#"
-            :auto-upload="false"
-            :on-change="handleFileChange"
-            :before-upload="beforeUpload"
-            class="upload-btn"
-            accept="image/*"
-          >
-            <el-icon><Plus /></el-icon>
-            <span class="upload-txt">点击上传图片</span>
-          </el-upload> -->
         </div>
       </div>
 
+      <h4>组织主页聊天群联系方式配置</h4>
+      <div class="img-preview-list">
+        <div
+          class="img-item"
+          v-for="(url, index) in chitchatImage"
+          :key="index"
+        >
+          <img :src="url" alt="图片预览" class="preview-img" v-viewer />
+          <span class="delete-btn" @click="handleChitchatDelete(index)">
+            <el-icon><Delete /></el-icon>
+          </span>
+        </div>
+        <el-upload
+          v-if="!disabled"
+          action="#"
+          :auto-upload="false"
+          :on-change="handleChitchatChange"
+          :before-upload="beforeUpload"
+          class="upload-btn"
+          accept="image/*"
+        >
+          <el-icon><Plus /></el-icon>
+          <span class="upload-txt">点击上传图片</span>
+        </el-upload>
+      </div>
+      <p style="margin-top: 15px">
+        <span>提示语 : </span>
+        <el-input
+          :disabled="disabled"
+          clearable
+          v-model.trim="reminder"
+          class="w-50 m-2"
+          placeholder="请输入提示语"
+          style="width: 220px; margin-left: 15px"
+        />
+      </p>
+
+      <h4>电子刊物</h4>
+      <el-button v-if="!disabled" @click="addDZKW" type="primary"
+        >新增</el-button
+      >
+      <ul class="dzkw">
+        <li v-for="(item, index) in schoolValue" :key="index">
+          <span>名称 : </span>
+          <el-input
+            :disabled="disabled"
+            clearable
+            v-model.trim="item.schoolName"
+            class="w-50 m-2"
+            placeholder="请输入名称"
+            style="width: 220px; margin: 0 30px 0 15px"
+          />
+          <span>链接地址 : </span>
+          <el-input
+            :disabled="disabled"
+            clearable
+            v-model.trim="item.schoolUrl"
+            class="w-50 m-2"
+            placeholder="请输入链接地址"
+            style="width: 400px; margin: 0 15px"
+          />
+          <el-button v-if="schoolValue.length > 1 && !disabled" @click="deleteDZKW(index)" type="danger" :icon="Delete" circle />
+        </li>
+      </ul>
+
       <h4>联系我们设置</h4>
       <p>
         <span>联系地址 : </span>
@@ -66,6 +114,17 @@
         />
       </p>
       <p>
+        <span>联系人 : </span>
+        <el-input
+          :disabled="disabled"
+          clearable
+          v-model.trim="userName"
+          class="w-50 m-2"
+          placeholder="请输入联系人"
+          style="width: 220px; margin-left: 15px"
+        />
+      </p>
+      <p>
         <span>联系电话 : </span>
         <el-input
           :disabled="disabled"
@@ -76,10 +135,40 @@
           style="width: 220px; margin-left: 15px"
         />
       </p>
+      <h4>校友总会介绍</h4>
       <p>
-        <el-button v-if="disabled" @click="edit" type="primary">编辑</el-button>
+        <Richtext
+          v-if="richtextShow"
+          @richtextClick="richtextClick"
+          :fatherMessage="fatherMessage"
+        ></Richtext>
+      </p>
+      <h4>校友总会规章制度</h4>
+      <p>
+        <Richtext2
+          v-if="richtextShow2"
+          @richtextClick="richtextClick2"
+          :fatherMessage="fatherMessage2"
+        ></Richtext2>
+      </p>
+      <h4>捐赠方式</h4>
+      <p>
+        <Richtext3
+          v-if="richtextShow3"
+          @richtextClick="richtextClick3"
+          :fatherMessage="fatherMessage3"
+        ></Richtext3>
+      </p>
+
+      <p>
+        <el-button
+          v-if="disabled && menuList.canUpdate"
+          @click="edit"
+          type="primary"
+          >编辑</el-button
+        >
         <el-button v-if="!disabled" @click="confirm" type="primary"
-          >确认</el-button
+          >提交修改</el-button
         >
         <el-button v-if="!disabled" @click="cancel">取消</el-button>
       </p>
@@ -110,6 +199,10 @@ import { uploadFile } from "@/api/uploadFile.js";
 
 import ImgCutter from "@/components/ImgCutter.vue";
 
+import Richtext from "./Richtext.vue";
+import Richtext2 from "./Richtext.vue";
+import Richtext3 from "./Richtext.vue";
+
 const router = useRouter();
 const store = useCounterStore();
 
@@ -118,14 +211,77 @@ import { Delete, Download, Plus, ZoomIn } from "@element-plus/icons-vue";
 
 const { name, age, isCollapse, realAge, collegeRole } = storeToRefs(store);
 
+const menuList = ref({
+  canAll: null,
+  canApply: null,
+  canDeleted: null,
+  canDetail: null,
+  canExport: null,
+  canImport: null,
+  canInsert: null,
+  canTop: null,
+  canUpdate: null,
+  canView: null,
+});
+
 const id = ref("");
-const address = ref("");
-const email = ref("");
-const phone = ref("");
-const fileList = ref([]);
+const address = ref(""); // 联系地址
+const email = ref(""); // 联系邮箱
+const phone = ref(""); // 联系电话
+const fileList = ref([]); // 轮播图数据集合
+const chitchatImage = ref([]); // 上传图片
+const reminder = ref(); // 提示语
+const userName = ref(); // 联系人
+const schoolValue = ref([{}, {}]);
+
+const richtextShow = ref(false);
+const richtextShow2 = ref(false);
+const richtextShow3 = ref(false);
+const intro = ref([]); // 校友总会介绍
+const rules = ref([]); // 校友总会规章制度
+const donation = ref([]); // 捐赠方式
 
 const disabled = ref(true);
 
+const fatherMessage = ref({
+  data: "",
+  flag: false,
+});
+// 富文本传过来的数据
+const richtextClick = (data) => {
+  // console.log(data, "富文本传过来的数据");
+  // params.value.safetyNotice = data.html;
+  fatherMessage.value.data = data.html;
+  intro.value = data.html;
+  // accountRuleForm.contentText = data.text;
+};
+
+const fatherMessage2 = ref({
+  data: "",
+  flag: false,
+});
+// 富文本传过来的数据
+const richtextClick2 = (data) => {
+  // console.log(data, "富文本传过来的数据");
+  // params.value.safetyNotice = data.html;
+  fatherMessage2.value.data = data.html;
+  rules.value = data.html;
+  // accountRuleForm.contentText = data.text;
+};
+
+const fatherMessage3 = ref({
+  data: "",
+  flag: false,
+});
+// 富文本传过来的数据
+const richtextClick3 = (data) => {
+  // console.log(data, "富文本传过来的数据");
+  // params.value.safetyNotice = data.html;
+  fatherMessage3.value.data = data.html;
+  donation.value = data.html;
+  // accountRuleForm.contentText = data.text;
+};
+
 const getList = async () => {
   let res = await getQueryAlumniSystem();
   console.log(res);
@@ -136,6 +292,30 @@ const getList = async () => {
     id.value = res.data.id;
     phone.value = res.data.phone;
     fileList.value = res.data.files;
+    reminder.value = res.data.reminder;
+    userName.value = res.data.userName;
+    chitchatImage.value = res.data.chitchatImage ? res.data.chitchatImage : [];
+    reminder.value = res.data.reminder;
+    userName.value = res.data.userName;
+    schoolValue.value=res.data.schoolValue;
+
+    richtextShow.value = false;
+    richtextShow2.value = false;
+    richtextShow3.value = false;
+    setTimeout(() => {
+      richtextShow.value = true;
+      richtextShow2.value = true;
+      richtextShow3.value = true;
+      fatherMessage.value.flag = false;
+      fatherMessage2.value.flag = false;
+      fatherMessage3.value.flag = false;
+      fatherMessage.value.data = res.data.intro;
+      fatherMessage2.value.data = res.data.rules;
+      fatherMessage3.value.data = res.data.donation;
+      intro.value = res.data.intro;
+      rules.value = res.data.rules;
+      donation.value = res.data.donation;
+    }, 50);
   } else {
     ElMessage({
       type: "error",
@@ -146,23 +326,15 @@ const getList = async () => {
   }
 };
 
-const handleDelete = (index) => {
-  fileList.value.splice(index, 1);
-};
-
-const handlePreview = (images, index) => {
-  // 核心:复制数组,把点击的图片移到第一位
-  const newImages = [...images]; // 拷贝原数组,避免修改原数据
-  const currentImg = newImages.splice(index, 1)[0]; // 取出当前点击的图片
-  newImages.unshift(currentImg); // 放到数组开头
-
-  // 传给预览器,此时插件显示的第一张就是点击的图片
-  viewerApi({
-    images: newImages,
-    zIndex: 3000,
-    initial: index, // 添加这一行
-  });
-};
+const addDZKW=()=>{
+  schoolValue.value.push({
+    schoolName:'',
+    schoolUrl:''
+  })
+}
+const deleteDZKW=(index)=>{
+  schoolValue.value.splice(index, 1); 
+}
 
 // 上传前的校验
 const beforeUpload = (file) => {
@@ -180,14 +352,10 @@ const beforeUpload = (file) => {
   }
   return true;
 };
-
-// 文件选择变化时触发
-const handleFileChange = async (file, newFileList) => {
-  console.log(file);
-  let formData = new FormData();
-  formData.append("file", file.raw);
-  let res = await uploadFile(formData);
-  // console.log(res.data.fileUrl);
+const handleDelete = (index) => {
+  fileList.value.splice(index, 1);
+};
+const getUrl = (res) => {
   if (res.code == 200) {
     fileList.value.push(res.data.fileUrl); // 赋值给响应式fileList,页面自动刷新
     // ElMessage({
@@ -205,15 +373,18 @@ const handleFileChange = async (file, newFileList) => {
     });
   }
 };
-const getUrl = (res) => {
+
+const handleChitchatDelete = (index) => {
+  chitchatImage.value.splice(index, 1);
+};
+// 文件选择变化时触发
+const handleChitchatChange = async (file, newFileList) => {
+  console.log(file);
+  let formData = new FormData();
+  formData.append("file", file.raw);
+  let res = await uploadFile(formData);
   if (res.code == 200) {
-    fileList.value.push(res.data.fileUrl); // 赋值给响应式fileList,页面自动刷新
-    // ElMessage({
-    //   type: "success",
-    //   showClose: true,
-    //   message: res.message,
-    //   center: true,
-    // });
+    chitchatImage.value.push(res.data.fileUrl); // 赋值给响应式fileList,页面自动刷新
   } else {
     ElMessage({
       type: "error",
@@ -223,9 +394,36 @@ const getUrl = (res) => {
     });
   }
 };
+const handlePreview = (images, index) => {
+  // 核心:复制数组,把点击的图片移到第一位
+  const newImages = [...images]; // 拷贝原数组,避免修改原数据
+  const currentImg = newImages.splice(index, 1)[0]; // 取出当前点击的图片
+  newImages.unshift(currentImg); // 放到数组开头
+
+  // 传给预览器,此时插件显示的第一张就是点击的图片
+  viewerApi({
+    images: newImages,
+    zIndex: 3000,
+    initial: index, // 添加这一行
+  });
+};
 
 const edit = () => {
   disabled.value = false;
+  // fatherMessage.value.flag = false;
+  // fatherMessage2.value.flag = false;
+  // fatherMessage3.value.flag = false;
+  richtextShow.value = false;
+  richtextShow2.value = false;
+  richtextShow3.value = false;
+  setTimeout(() => {
+    richtextShow.value = true;
+    richtextShow2.value = true;
+    richtextShow3.value = true;
+    fatherMessage.value.flag = true;
+    fatherMessage2.value.flag = true;
+    fatherMessage3.value.flag = true;
+  }, 0);
 };
 const confirm = async () => {
   let res = await updateAlumniSystem({
@@ -234,6 +432,13 @@ const confirm = async () => {
     email: email.value,
     phone: phone.value,
     files: fileList.value,
+    chitchatImage: chitchatImage.value,
+    reminder: reminder.value,
+    userName: userName.value,
+    intro: intro.value,
+    rules: rules.value,
+    donation: donation.value,
+    schoolValue:schoolValue.value
   });
   console.log(res);
   if (res.code == 200) {
@@ -256,11 +461,37 @@ const confirm = async () => {
 };
 const cancel = () => {
   disabled.value = true;
+  fatherMessage.value.flag = false;
+  fatherMessage2.value.flag = false;
+  fatherMessage3.value.flag = false;
+  richtextShow.value = false;
+  richtextShow2.value = false;
+  richtextShow3.value = false;
+  setTimeout(() => {
+    fatherMessage.value.flag = true;
+    fatherMessage2.value.flag = true;
+    fatherMessage3.value.flag = true;
+    fatherMessage.value.flag = true;
+    fatherMessage2.value.flag = true;
+    fatherMessage3.value.flag = true;
+  }, 0);
   getList();
 };
 
 onBeforeMount(() => {
   getList();
+  let list = JSON.parse(sessionStorage.getItem("roleList"));
+  console.log(list);
+  list.forEach((i) => {
+    if (i.menuName == "系统设置") {
+      i.childs.forEach((item) => {
+        if (item.menuName == "系统设置") {
+          menuList.value = item;
+        }
+      });
+    }
+  });
+  console.log(menuList.value);
 });
 onUnmounted(() => {
   // document.removeEventListener("keyup", Enters);
@@ -303,7 +534,28 @@ onUnmounted(() => {
     margin: 0 auto;
     // display: flex;
     // flex-direction: column;
-    overflow: auto;
+    // overflow: auto;
+    overflow-y: auto;
+    overflow-x: hidden; // 隐藏X轴滚动条,避免横向滚动
+    // 核心2:自定义滚动条样式(适配Chrome/Edge等webkit内核浏览器)
+    &::-webkit-scrollbar {
+      width: 8px; // 滚动条宽度(越大越明显)
+      height: 8px;
+    }
+    // 滚动条轨道样式
+    &::-webkit-scrollbar-track {
+      background: #f5f5f5; // 轨道底色
+      border-radius: 4px; // 圆角,和滚动条滑块呼应
+    }
+    // 滚动条滑块样式(拖动的部分)
+    &::-webkit-scrollbar-thumb {
+      background: #c9c7c7; // 滑块默认颜色
+      border-radius: 4px; // 圆角更美观
+      // 鼠标悬浮时滑块变色
+      &:hover {
+        background: #9e9e9e;
+      }
+    }
     h4 {
       margin: 20px 0;
       font-size: 18px;
@@ -315,6 +567,13 @@ onUnmounted(() => {
       width: 100%;
       padding: 0 10px 0;
     }
+    .dzkw {
+      padding: 0;
+      li {
+        list-style: none;
+        margin-bottom: 15px;
+      }
+    }
     /* 上传按钮样式:自定义,可根据需求修改 */
     :deep(.el-upload) {
       width: 140px;