Explorar o código

Merge branch 'master' of https://e.coding.net/chuanghaikeji/xiaoyoushengtaixitong/school_ecology_manage

soft5566 hai 1 ano
pai
achega
ad08868e38

+ 1 - 0
package.json

@@ -15,6 +15,7 @@
   },
   },
   "dependencies": {
   "dependencies": {
     "@element-plus/icons-vue": "2.3.1",
     "@element-plus/icons-vue": "2.3.1",
+    "@rollup/rollup-win32-x64-msvc": "4.28.1",
     "axios": "1.7.7",
     "axios": "1.7.7",
     "dayjs": "1.11.13",
     "dayjs": "1.11.13",
     "element-plus": "2.8.8",
     "element-plus": "2.8.8",

+ 55 - 0
src/api/activityManagement/index.js

@@ -0,0 +1,55 @@
+import { request } from "@/utils/service"
+
+/** 增 */
+export function createInsertActivity(data) {
+  return request({
+    url: "/alumniActivity/insertActivity",
+    method: "post",
+    data
+  })
+}
+
+/** 删 */
+export function deleteActivityById(id) {
+  return request({
+    url: `/alumniActivity/deleteActivityById?id=${id}`,
+    method: "get"
+  })
+}
+
+/** 改 */
+export function updateActivity(data) {
+  return request({
+    url: "/alumniActivity/updateActivity",
+    method: "post",
+    data
+  })
+}
+
+/** 查 */
+export function getActivityPages(params) {
+  return request({
+    url: "/alumniActivity/queryActivityPages",
+    method: "get",
+    params
+  })
+}
+
+/** 获取弹窗组织列表 */
+export function getClubPage(params) {
+  return request({
+    url: "/alumniClub/queryClubPage",
+    method: "get",
+    params
+  })
+}
+
+/** 导出活动数据 */
+export function exportActivityExcel(data) {
+  return request({
+    url: "/alumniActivity/getAlumniActivityExcel",
+    method: "post",
+    data,
+    responseType: "blob"
+  })
+}

+ 79 - 0
src/api/news/index.js

@@ -0,0 +1,79 @@
+import { request } from "@/utils/service"
+
+/** 增 新闻分类 */
+export function createCategoryNews(data) {
+  return request({
+    url: "/alumniCategoryNews/insertCategoryNews",
+    method: "post",
+    data
+  })
+}
+
+/** 删 新闻分类 */
+export function deleteCategoryNews(id) {
+  return request({
+    url: `/alumniCategoryNews/deleteCategoryNews?id=${id}`,
+    method: "get"
+  })
+}
+
+/** 改 新闻分类 */
+export function updateCategoryNews(data) {
+  return request({
+    url: "/alumniCategoryNews/updateCategoryNews",
+    method: "post",
+    data
+  })
+}
+
+/** 获取新闻分类分页数据 */
+export function getCategoryNewsPage(params) {
+  return request({
+    url: "/alumniCategoryNews/queryCategoryNewsPage",
+    method: "get",
+    params
+  })
+}
+
+/** 获取新闻分页数据 */
+export function getNewsPage(params) {
+  return request({
+    url: "/alumniNews/queryAlumniNewsPage",
+    method: "get",
+    params
+  })
+}
+
+/** 获取新闻分类下拉列表数据 */
+export function getCategoryNewss() {
+  return request({
+    url: "/alumniCategoryNews/queryCategoryNewss",
+    method: "get"
+  })
+}
+
+/** 发布新闻 */
+export function createNews(data) {
+  return request({
+    url: "/alumniNews/insertAlumniNews",
+    method: "post",
+    data
+  })
+}
+
+/** 更新新闻 */
+export function updateNews(data) {
+  return request({
+    url: "/alumniNews/updateAlumniNews",
+    method: "post",
+    data
+  })
+}
+
+/** 删除新闻 */
+export function deleteNews(id) {
+  return request({
+    url: `/alumniNews/deleteAlumniNews?id=${id}`,
+    method: "get"
+  })
+}

+ 83 - 0
src/api/schoolEndorsement/index.js

@@ -0,0 +1,83 @@
+import { request } from "@/utils/service"
+
+/** 增 母校代言*/
+export function createInsertEndorse(data) {
+  return request({
+    url: "/alumniEndorse/insertEndorseData",
+    method: "post",
+    data
+  })
+}
+
+/** 删 母校代言*/
+export function deleteEndorseById(id) {
+  return request({
+    url: `/alumniEndorse/deleteEndorseById/?id=${id}`,
+    method: "get"
+  })
+}
+
+/** 查 母校代言*/
+export function getEndorsePage(params) {
+  return request({
+    url: "/alumniEndorse/queryEndorsePage",
+    method: "get",
+    params
+  })
+}
+
+/** 获取用户列表以设置管理员 */
+export function getPageUser(params) {
+  return request({
+    url: "/alumniUser/queryPageUser",
+    method: "get",
+    params
+  })
+}
+
+/** 设置母校代言管理员 */
+export function setEndorseAdmin(data) {
+  return request({
+    url: "/alumniAdminApply/setEndorseAdmin",
+    method: "post",
+    data
+  })
+}
+
+/** 导出母校代言 */
+export function exportEndorseExcel(data) {
+  return request({
+    url: "/alumniEndorse/getAlumniEndorseExcel",
+    method: "post",
+    data,
+    responseType: "blob"
+  })
+}
+
+/** 查 母校代言审核*/
+export function getEndorseApplyPage(params) {
+  return request({
+    url: "/alumniEndorse/queryEndorseApplyPage",
+    method: "get",
+    params
+  })
+}
+
+/** 导出母校代言审核 */
+export function exportEndorseApplyExcel(data) {
+  return request({
+    url: "/alumniEndorse/getAlumniEndorseApplyExcel",
+    method: "post",
+    data,
+    responseType: "blob"
+  })
+}
+
+/** 审核母校代言数据*/
+export function getExamineEndorse(params) {
+  return request({
+    url: "/alumniEndorse/toExamineEndorse",
+    method: "get",
+    params
+  })
+}

+ 14 - 6
src/api/table/index.js

@@ -3,7 +3,7 @@ import { request } from "@/utils/service"
 /** 增 */
 /** 增 */
 export function createTableDataApi(data) {
 export function createTableDataApi(data) {
   return request({
   return request({
-    url: "table",
+    url: "/alumniUser/insertAccountData",
     method: "post",
     method: "post",
     data
     data
   })
   })
@@ -12,16 +12,16 @@ export function createTableDataApi(data) {
 /** 删 */
 /** 删 */
 export function deleteTableDataApi(id) {
 export function deleteTableDataApi(id) {
   return request({
   return request({
-    url: `table/${id}`,
-    method: "delete"
+    url: `/alumniUser/deleteUserById/?id=${id}`,
+    method: "get"
   })
   })
 }
 }
 
 
 /** 改 */
 /** 改 */
 export function updateTableDataApi(data) {
 export function updateTableDataApi(data) {
   return request({
   return request({
-    url: "table",
-    method: "put",
+    url: "/alumniUser/updateAccountData",
+    method: "post",
     data
     data
   })
   })
 }
 }
@@ -29,8 +29,16 @@ export function updateTableDataApi(data) {
 /** 查 */
 /** 查 */
 export function getTableDataApi(params) {
 export function getTableDataApi(params) {
   return request({
   return request({
-    url: "table",
+    url: "/alumniUser/queryAccountPage",
     method: "get",
     method: "get",
     params
     params
   })
   })
 }
 }
+
+/** 获取角色下拉列表数据 */
+export function getRoleTypes() {
+  return request({
+    url: "/alumniUser/queryRoleTypes",
+    method: "get"
+  })
+}

+ 2 - 1
src/constants/cache-key.js

@@ -5,7 +5,8 @@ const CacheKey = {
   TOKEN: `${SYSTEM_NAME}-token-key`,
   TOKEN: `${SYSTEM_NAME}-token-key`,
   SIDEBAR_STATUS: `${SYSTEM_NAME}-sidebar-status-key`,
   SIDEBAR_STATUS: `${SYSTEM_NAME}-sidebar-status-key`,
   VISITED_VIEWS: `${SYSTEM_NAME}-visited-views-key`,
   VISITED_VIEWS: `${SYSTEM_NAME}-visited-views-key`,
-  CACHED_VIEWS: `${SYSTEM_NAME}-cached-views-key`
+  CACHED_VIEWS: `${SYSTEM_NAME}-cached-views-key`,
+  USERID: `${SYSTEM_NAME}-token-userId`
 }
 }
 
 
 export default CacheKey
 export default CacheKey

+ 12 - 4
src/store/modules/user.js

@@ -3,15 +3,16 @@ import { pinia } from "@/store"
 import { defineStore } from "pinia"
 import { defineStore } from "pinia"
 import { useTagsViewStore } from "./tags-view"
 import { useTagsViewStore } from "./tags-view"
 import { useSettingsStore } from "./settings"
 import { useSettingsStore } from "./settings"
-import { getToken, removeToken, setToken } from "@/utils/cache/cookies"
+import { getToken, removeToken, setToken, getUserId, setUserId, removeUserId } from "@/utils/cache/cookies"
 import { resetRouter } from "@/router"
 import { resetRouter } from "@/router"
-import { loginApi, getUserInfoApi } from "@/api/login"
-import routeSettings from "@/config/route"
+import { loginApi } from "@/api/login"
+// import routeSettings from "@/config/route"
 
 
 export const useUserStore = defineStore("user", () => {
 export const useUserStore = defineStore("user", () => {
   const token = ref(getToken() || "")
   const token = ref(getToken() || "")
   const roles = ref([])
   const roles = ref([])
   const account = ref("")
   const account = ref("")
+  const userId = ref(getUserId() || "")
 
 
   const tagsViewStore = useTagsViewStore()
   const tagsViewStore = useTagsViewStore()
   const settingsStore = useSettingsStore()
   const settingsStore = useSettingsStore()
@@ -19,8 +20,11 @@ export const useUserStore = defineStore("user", () => {
   /** 登录 */
   /** 登录 */
   const login = async ({ account, password, code }) => {
   const login = async ({ account, password, code }) => {
     const { data } = await loginApi({ account, password, code })
     const { data } = await loginApi({ account, password, code })
+
     setToken(data.token)
     setToken(data.token)
+    setUserId(data.userId)
     token.value = data.token
     token.value = data.token
+    userId.value = data.userId
   }
   }
   /** 获取用户详情 */
   /** 获取用户详情 */
   const getInfo = async () => {
   const getInfo = async () => {
@@ -40,7 +44,9 @@ export const useUserStore = defineStore("user", () => {
   /** 登出 */
   /** 登出 */
   const logout = () => {
   const logout = () => {
     removeToken()
     removeToken()
+    removeUserId()
     token.value = ""
     token.value = ""
+    userId.value = ""
     roles.value = []
     roles.value = []
     resetRouter()
     resetRouter()
     _resetTagsView()
     _resetTagsView()
@@ -48,7 +54,9 @@ export const useUserStore = defineStore("user", () => {
   /** 重置 Token */
   /** 重置 Token */
   const resetToken = () => {
   const resetToken = () => {
     removeToken()
     removeToken()
+    removeUserId()
     token.value = ""
     token.value = ""
+    userId.value = ""
     roles.value = []
     roles.value = []
   }
   }
   /** 重置 Visited Views 和 Cached Views */
   /** 重置 Visited Views 和 Cached Views */
@@ -59,7 +67,7 @@ export const useUserStore = defineStore("user", () => {
     }
     }
   }
   }
 
 
-  return { token, roles, account, login, getInfo, changeRoles, logout, resetToken }
+  return { token, roles, account, userId, login, getInfo, changeRoles, logout, resetToken }
 })
 })
 
 
 /**
 /**

+ 10 - 0
src/utils/cache/cookies.js

@@ -12,3 +12,13 @@ export const setToken = (token) => {
 export const removeToken = () => {
 export const removeToken = () => {
   Cookies.remove(CacheKey.TOKEN)
   Cookies.remove(CacheKey.TOKEN)
 }
 }
+
+export const getUserId = () => {
+  return Cookies.get(CacheKey.USERID)
+}
+export const setUserId = (userId) => {
+  Cookies.set(CacheKey.USERID, userId)
+}
+export const removeUserId = () => {
+  Cookies.remove(CacheKey.USERID)
+}

+ 47 - 25
src/views/account-management/index.vue

@@ -1,6 +1,6 @@
 <script setup>
 <script setup>
 import { reactive, ref, watch } from "vue"
 import { reactive, ref, watch } from "vue"
-import { createTableDataApi, deleteTableDataApi, updateTableDataApi, getTableDataApi } from "@/api/table"
+import { createTableDataApi, deleteTableDataApi, updateTableDataApi, getTableDataApi, getRoleTypes } from "@/api/table"
 import { ElMessage, ElMessageBox } from "element-plus"
 import { ElMessage, ElMessageBox } from "element-plus"
 import { usePagination } from "@/hooks/usePagination"
 import { usePagination } from "@/hooks/usePagination"
 import { cloneDeep } from "lodash-es"
 import { cloneDeep } from "lodash-es"
@@ -11,17 +11,22 @@ const { paginationData, handleCurrentChange, handleSizeChange } = usePagination(
 //#region 增
 //#region 增
 const DEFAULT_FORM_DATA = {
 const DEFAULT_FORM_DATA = {
   id: undefined,
   id: undefined,
+  account: "",
+  cardNumber: "",
   name: "",
   name: "",
-  todo: "",
-  realName: "",
   password: "",
   password: "",
-  roles: []
+  roles: [],
+  roleId: ""
 }
 }
 const dialogVisible = ref(false)
 const dialogVisible = ref(false)
 const formRef = ref(null)
 const formRef = ref(null)
 const formData = ref(cloneDeep(DEFAULT_FORM_DATA))
 const formData = ref(cloneDeep(DEFAULT_FORM_DATA))
 const formRules = {
 const formRules = {
-  name: [{ required: true, trigger: "blur", message: "必填" }]
+  account: [{ required: true, trigger: "blur", message: "账号必填" }],
+  cardNumber: [{ required: true, trigger: "blur", message: "微校卡号必填" }],
+  name: [{ required: true, trigger: "blur", message: "姓名必填" }],
+  password: [{ required: true, trigger: "blur", message: "密码必填" }],
+  roleId: [{ required: true, trigger: "blur", message: "角色必填" }]
 }
 }
 const handleCreateOrUpdate = () => {
 const handleCreateOrUpdate = () => {
   formRef.value?.validate((valid, fields) => {
   formRef.value?.validate((valid, fields) => {
@@ -64,6 +69,7 @@ const handleDelete = (row) => {
 const handleUpdate = (row) => {
 const handleUpdate = (row) => {
   dialogVisible.value = true
   dialogVisible.value = true
   formData.value = cloneDeep(row)
   formData.value = cloneDeep(row)
+  getTypes()
 }
 }
 //#endregion
 //#endregion
 
 
@@ -72,19 +78,22 @@ const tableData = ref([])
 const searchFormRef = ref(null)
 const searchFormRef = ref(null)
 const searchData = reactive({
 const searchData = reactive({
   name: undefined,
   name: undefined,
-  createTime: null
+  createTime: []
 })
 })
 const getTableData = () => {
 const getTableData = () => {
   loading.value = true
   loading.value = true
+
   getTableDataApi({
   getTableDataApi({
     currentPage: paginationData.currentPage,
     currentPage: paginationData.currentPage,
-    size: paginationData.pageSize,
+    pageCount: paginationData.pageSize,
     name: searchData.name,
     name: searchData.name,
-    starTime: searchData.createTime ? searchData.createTime[0] : undefined,
+    startTime: searchData.createTime ? searchData.createTime[0] : undefined,
     endTime: searchData.createTime ? searchData.createTime[1] : undefined
     endTime: searchData.createTime ? searchData.createTime[1] : undefined
   })
   })
     .then(({ data }) => {
     .then(({ data }) => {
-      paginationData.total = data.total
+      // console.log(data)
+
+      paginationData.total = data.totalCount
       tableData.value = data.list
       tableData.value = data.list
     })
     })
     .catch(() => {
     .catch(() => {
@@ -101,6 +110,19 @@ const resetSearch = () => {
   searchFormRef.value?.resetFields()
   searchFormRef.value?.resetFields()
   handleSearch()
   handleSearch()
 }
 }
+
+// 新增按钮回调
+const handleAdd = () => {
+  dialogVisible.value = true
+  getTypes()
+}
+
+// 获取角色下拉列表数据
+const getTypes = async () => {
+  const res = await getRoleTypes()
+  // console.log(res)
+  formData.value.roles = res.data
+}
 //#endregion
 //#endregion
 
 
 /** 监听分页参数的变化 */
 /** 监听分页参数的变化 */
@@ -121,7 +143,7 @@ watch([() => paginationData.currentPage, () => paginationData.pageSize], getTabl
               type="datetimerange"
               type="datetimerange"
               start-placeholder="开始时间"
               start-placeholder="开始时间"
               end-placeholder="结束时间"
               end-placeholder="结束时间"
-              value-format="x"
+              value-format="YYYY:MM:DD HH:mm:ss"
             />
             />
           </el-form-item>
           </el-form-item>
           <el-form-item>
           <el-form-item>
@@ -130,16 +152,16 @@ watch([() => paginationData.currentPage, () => paginationData.pageSize], getTabl
           </el-form-item>
           </el-form-item>
         </el-form>
         </el-form>
         <div>
         <div>
-          <el-button type="primary" @click="dialogVisible = true">新增</el-button>
+          <el-button type="primary" @click="handleAdd">新增</el-button>
         </div>
         </div>
       </div>
       </div>
       <div class="table-wrapper">
       <div class="table-wrapper">
         <el-table :data="tableData" max-height="500">
         <el-table :data="tableData" max-height="500">
           <el-table-column type="index" label="序号" width="100" align="center" />
           <el-table-column type="index" label="序号" width="100" align="center" />
-          <el-table-column prop="name" label="账号名称" align="center" />
-          <el-table-column prop="role" label="角色名称" align="center" />
-          <el-table-column prop="realName" label="真实姓名" align="center" />
-          <el-table-column prop="createTime" label="创建时间" align="center" />
+          <el-table-column prop="account" label="账号名称" align="center" />
+          <el-table-column prop="roleName" label="角色名称" align="center" />
+          <el-table-column prop="name" label="真实姓名" align="center" />
+          <el-table-column prop="createAccountTime" label="创建时间" align="center" />
           <el-table-column fixed="right" label="操作" width="200" align="center">
           <el-table-column fixed="right" label="操作" width="200" align="center">
             <template #default="scope">
             <template #default="scope">
               <el-link type="primary" @click="handleUpdate(scope.row)">编辑</el-link>
               <el-link type="primary" @click="handleUpdate(scope.row)">编辑</el-link>
@@ -169,21 +191,21 @@ watch([() => paginationData.currentPage, () => paginationData.pageSize], getTabl
       width="50%"
       width="50%"
     >
     >
       <el-form ref="formRef" :model="formData" :rules="formRules" label-width="auto" size="large">
       <el-form ref="formRef" :model="formData" :rules="formRules" label-width="auto" size="large">
-        <el-form-item prop="name" label="账号">
-          <el-input v-model="formData.name" placeholder="请输入" />
+        <el-form-item prop="account" label="账号">
+          <el-input v-model="formData.account" placeholder="请输入" />
         </el-form-item>
         </el-form-item>
-        <el-form-item prop="todo" label="微校卡号">
-          <el-input v-model="formData.todo" placeholder="请输入" />
+        <el-form-item prop="cardNumber" label="微校卡号">
+          <el-input v-model="formData.cardNumber" placeholder="请输入" />
         </el-form-item>
         </el-form-item>
-        <el-form-item prop="realName" label="姓名">
-          <el-input v-model="formData.realName" placeholder="请输入" />
+        <el-form-item prop="name" label="姓名">
+          <el-input v-model="formData.name" placeholder="请输入" />
         </el-form-item>
         </el-form-item>
         <el-form-item prop="password" label="密码">
         <el-form-item prop="password" label="密码">
-          <el-input v-model="formData.password" placeholder="请输入" />
+          <el-input v-model="formData.password" placeholder="请输入" type="password" show-password />
         </el-form-item>
         </el-form-item>
-        <el-form-item prop="roles" label="角色">
-          <el-select v-model="formData.roles" placeholder="请选择" multiple>
-            <el-option label="todo" value="todo" />
+        <el-form-item prop="roleId" label="角色">
+          <el-select v-model="formData.roleId" placeholder="请选择">
+            <el-option v-for="item in formData.roles" :label="item.name" :value="item.id" :key="item.id" />
           </el-select>
           </el-select>
         </el-form-item>
         </el-form-item>
       </el-form>
       </el-form>

+ 273 - 90
src/views/activity-management/index.vue

@@ -1,6 +1,14 @@
 <script setup>
 <script setup>
 import { reactive, ref, watch } from "vue"
 import { reactive, ref, watch } from "vue"
-import { createTableDataApi, deleteTableDataApi, updateTableDataApi, getTableDataApi } from "@/api/table"
+import {
+  getActivityPages,
+  createInsertActivity,
+  updateActivity,
+  getClubPage,
+  deleteActivityById,
+  exportActivityExcel
+} from "@/api/activityManagement"
+import { getQueryCollegesApi, getQueryPeriodsApi, getQueryMajorsApi, getQueryClassesApi } from "@/api/alumniManager"
 import { ElMessage, ElMessageBox } from "element-plus"
 import { ElMessage, ElMessageBox } from "element-plus"
 import { usePagination } from "@/hooks/usePagination"
 import { usePagination } from "@/hooks/usePagination"
 import { cloneDeep } from "lodash-es"
 import { cloneDeep } from "lodash-es"
@@ -33,30 +41,52 @@ const resetSetAdminForm = () => {
 //#region 增
 //#region 增
 const DEFAULT_FORM_DATA = {
 const DEFAULT_FORM_DATA = {
   id: undefined,
   id: undefined,
+  orgId: "",
+  orgName: "",
   organization: [],
   organization: [],
   theme: "",
   theme: "",
-  info: "",
+  themeDetail: "",
+  poster: "",
   activityTime: null,
   activityTime: null,
   address: "",
   address: "",
-  explain: "",
+  lng: "",
+  lat: "",
+  describes: "",
   registrationTime: null,
   registrationTime: null,
-  total: undefined,
-  range: [],
-  consultation: "",
-  isImg: false
+  totalNumber: undefined,
+  scope: "",
+  phone: "",
+  isImage: false
 }
 }
 const dialogVisible = ref(false)
 const dialogVisible = ref(false)
 const formRef = ref(null)
 const formRef = ref(null)
 const formData = ref(cloneDeep(DEFAULT_FORM_DATA))
 const formData = ref(cloneDeep(DEFAULT_FORM_DATA))
 const formRules = {
 const formRules = {
-  theme: [{ required: true, trigger: "blur", message: "必填" }]
+  orgId: [{ required: true, trigger: "blur", message: "必填" }],
+  theme: [{ required: true, trigger: "blur", message: "必填" }],
+  themeDetail: [{ required: true, trigger: "blur", message: "必填" }],
+  activityTime: [{ required: true, trigger: "blur", message: "必填" }],
+  address: [{ required: true, trigger: "blur", message: "必填" }],
+  describes: [{ required: true, trigger: "blur", message: "必填" }],
+  registrationTime: [{ required: true, trigger: "blur", message: "必填" }],
+  totalNumber: [{ required: true, trigger: "blur", message: "必填" }],
+  scope: [{ required: true, trigger: "blur", message: "必填" }],
+  phone: [{ required: true, trigger: "blur", message: "必填" }]
 }
 }
 const handleCreateOrUpdate = () => {
 const handleCreateOrUpdate = () => {
   formRef.value?.validate((valid, fields) => {
   formRef.value?.validate((valid, fields) => {
     if (!valid) return console.error("表单校验不通过", fields)
     if (!valid) return console.error("表单校验不通过", fields)
     loading.value = true
     loading.value = true
-    const api = formData.value.id === undefined ? createTableDataApi : updateTableDataApi
-    api(formData.value)
+    const api = formData.value.id === undefined ? createInsertActivity : updateActivity
+    api({
+      ...formData.value,
+      startTime: formData.value.activityTime ? formData.value.activityTime[0] : undefined,
+      endTime: formData.value.activityTime ? formData.value.activityTime[1] : undefined,
+      lng: "101",
+      lat: "78",
+      signsTime: formData.value.registrationTime ? formData.value.registrationTime[0] : undefined,
+      signeTime: formData.value.registrationTime ? formData.value.registrationTime[1] : undefined
+    })
       .then(() => {
       .then(() => {
         ElMessage.success("操作成功")
         ElMessage.success("操作成功")
         dialogVisible.value = false
         dialogVisible.value = false
@@ -80,7 +110,7 @@ const handleDelete = (row) => {
     cancelButtonText: "取消",
     cancelButtonText: "取消",
     type: "warning"
     type: "warning"
   }).then(() => {
   }).then(() => {
-    deleteTableDataApi(row.id).then(() => {
+    deleteActivityById(row.id).then(() => {
       ElMessage.success("删除成功")
       ElMessage.success("删除成功")
       getTableData()
       getTableData()
     })
     })
@@ -99,40 +129,46 @@ const handleUpdate = (row) => {
 const tableData = ref([])
 const tableData = ref([])
 const searchFormRef = ref(null)
 const searchFormRef = ref(null)
 const searchData = reactive({
 const searchData = reactive({
-  organizationName: undefined,
-  initiator: undefined,
+  orgName: undefined,
+  userName: undefined,
   theme: undefined,
   theme: undefined,
-  college: undefined,
-  stage: undefined,
-  major: undefined,
-  class: undefined,
-  status: undefined,
+  collegeId: undefined,
+  colleges: [],
+  periodId: undefined,
+  periods: [],
+  majorId: undefined,
+  majors: [],
+  classId: undefined,
+  classList: [],
+  statuId: undefined,
   createTime: null,
   createTime: null,
   activityTime: null,
   activityTime: null,
   registrationTime: null
   registrationTime: null
 })
 })
 const getTableData = () => {
 const getTableData = () => {
   loading.value = true
   loading.value = true
-  getTableDataApi({
+  getActivityPages({
     currentPage: paginationData.currentPage,
     currentPage: paginationData.currentPage,
-    size: paginationData.pageSize,
-    organizationName: searchData.organizationName,
-    initiator: searchData.initiator,
+    pageCount: paginationData.pageSize,
+    orgName: searchData.orgName,
+    userName: searchData.userName,
     theme: searchData.theme,
     theme: searchData.theme,
-    college: searchData.college,
-    stage: searchData.stage,
-    major: searchData.major,
-    class: searchData.class,
-    status: searchData.status,
-    starTime: searchData.createTime ? searchData.createTime[0] : undefined,
-    endTime: searchData.createTime ? searchData.createTime[1] : undefined,
-    starTime2: searchData.activityTime ? searchData.activityTime[0] : undefined,
-    endTime2: searchData.activityTime ? searchData.activityTime[1] : undefined,
-    starTime3: searchData.registrationTime ? searchData.registrationTime[0] : undefined,
-    endTime3: searchData.registrationTime ? searchData.registrationTime[1] : undefined
+    collegeId: searchData.collegeId,
+    periodId: searchData.periodId,
+    majorId: searchData.majorId,
+    classId: searchData.classId,
+    statuId: searchData.statuId,
+    createStartTime: searchData.createTime ? searchData.createTime[0] : undefined,
+    createEndTime: searchData.createTime ? searchData.createTime[1] : undefined,
+    startTime: searchData.activityTime ? searchData.activityTime[0] : undefined,
+    endTime: searchData.activityTime ? searchData.activityTime[1] : undefined,
+    signsTime: searchData.registrationTime ? searchData.registrationTime[0] : undefined,
+    signeTime: searchData.registrationTime ? searchData.registrationTime[1] : undefined
   })
   })
     .then(({ data }) => {
     .then(({ data }) => {
-      paginationData.total = data.total
+      console.log(data)
+
+      paginationData.total = data.totalCount
       tableData.value = data.list
       tableData.value = data.list
     })
     })
     .catch(() => {
     .catch(() => {
@@ -149,15 +185,111 @@ const resetSearch = () => {
   searchFormRef.value?.resetFields()
   searchFormRef.value?.resetFields()
   handleSearch()
   handleSearch()
 }
 }
+
+// 获取学院集合
+const getColleges = async () => {
+  const res = await getQueryCollegesApi()
+  // console.log(res)
+  searchData.colleges = res.data
+}
+
+// 学院筛选框切换回调
+const changeCollege = async (e) => {
+  const res = await getQueryPeriodsApi({
+    collegeId: e
+  })
+  // console.log(res)
+  searchData.periods = res.data
+}
+
+// 学段筛选框切换回调
+const changePeriod = async (e) => {
+  const res = await getQueryMajorsApi({
+    periodId: e
+  })
+  searchData.majors = res.data
+}
+
+// 专业筛选框切换回调
+const changeMajorId = async (e) => {
+  const res = await getQueryClassesApi({
+    majorId: e
+  })
+  searchData.classList = res.data
+}
+
+// 新增按钮回调
+const handleAdd = () => {
+  dialogVisible.value = true
+  getOrgList()
+}
+
+// 获取弹窗组织列表
+const getOrgList = async () => {
+  const res = await getClubPage({
+    currentPage: 1,
+    pageCount: 999
+  })
+  // console.log(res)
+  formData.value.organization = res.data.list
+}
+
+// 切换 弹窗组织筛选框回调
+const changeOrg = (e) => {
+  // console.log(e)
+  const v = formData.value.organization.findIndex((item) => item.id == e)
+  formData.value.orgName = formData.value.organization[v].name
+}
+
 //#endregion
 //#endregion
 
 
 /** 监听分页参数的变化 */
 /** 监听分页参数的变化 */
 watch([() => paginationData.currentPage, () => paginationData.pageSize], getTableData, { immediate: true })
 watch([() => paginationData.currentPage, () => paginationData.pageSize], getTableData, { immediate: true })
 
 
+watch([() => paginationData.currentPage, () => paginationData.pageSize], getColleges, { immediate: true })
+
 /** 导出 */
 /** 导出 */
 const handleDownload = () => {
 const handleDownload = () => {
-  // todo 调用导出接口
-  console.log("导出")
+  ElMessageBox.confirm("确认导出吗?", "提示", {
+    confirmButtonText: "确定",
+    cancelButtonText: "取消",
+    type: "warning"
+  }).then(() => {
+    downloadReq()
+  })
+}
+
+// 导出请求
+const downloadReq = async () => {
+  const res = await exportActivityExcel({
+    orgName: searchData.orgName,
+    userName: searchData.userName,
+    theme: searchData.theme,
+    collegeId: searchData.collegeId,
+    periodId: searchData.periodId,
+    majorId: searchData.majorId,
+    classId: searchData.classId,
+    statuId: searchData.statuId,
+    createStartTime: searchData.createTime ? searchData.createTime[0] : undefined,
+    createEndTime: searchData.createTime ? searchData.createTime[1] : undefined,
+    startTime: searchData.activityTime ? searchData.activityTime[0] : undefined,
+    endTime: searchData.activityTime ? searchData.activityTime[1] : undefined,
+    signsTime: searchData.registrationTime ? searchData.registrationTime[0] : undefined,
+    signeTime: searchData.registrationTime ? searchData.registrationTime[1] : undefined
+  })
+  // console.log(res)
+  // 请求成功返回后,获取到Excel文件的二进制数据
+  const blob = new Blob([res], { type: "application/vnd.ms-excel" })
+  // 创建下载链接
+  const downloadUrl = URL.createObjectURL(blob)
+  // 创建一个隐藏的a标签,设置下载链接和文件名,模拟点击下载
+  const link = document.createElement("a")
+  link.style.display = "none"
+  link.href = downloadUrl
+  link.download = "活动管理.xlsx"
+  document.body.appendChild(link)
+  link.click()
+  document.body.removeChild(link)
 }
 }
 </script>
 </script>
 
 
@@ -166,38 +298,58 @@ const handleDownload = () => {
     <el-card v-loading="loading" header="活动管理">
     <el-card v-loading="loading" header="活动管理">
       <div class="toolbar-wrapper">
       <div class="toolbar-wrapper">
         <el-form ref="searchFormRef" :inline="true" :model="searchData">
         <el-form ref="searchFormRef" :inline="true" :model="searchData">
-          <el-form-item prop="organizationName" label="组织名称">
-            <el-input v-model="searchData.organizationName" placeholder="请输入" />
+          <el-form-item prop="orgName" label="组织名称">
+            <el-input v-model="searchData.orgName" placeholder="请输入" />
           </el-form-item>
           </el-form-item>
-          <el-form-item prop="initiator" label="发起人">
-            <el-input v-model="searchData.initiator" placeholder="请输入" />
+          <el-form-item prop="userName" label="发起人">
+            <el-input v-model="searchData.userName" placeholder="请输入" />
           </el-form-item>
           </el-form-item>
           <el-form-item prop="theme" label="活动主题">
           <el-form-item prop="theme" label="活动主题">
             <el-input v-model="searchData.theme" placeholder="请输入" />
             <el-input v-model="searchData.theme" placeholder="请输入" />
           </el-form-item>
           </el-form-item>
-          <el-form-item prop="college" label="学院">
-            <el-select v-model="searchData.college" placeholder="请选择" style="width: 178px">
-              <el-option label="todo" value="todo" />
+          <el-form-item prop="collegeId" label="学院">
+            <el-select v-model="searchData.collegeId" placeholder="请选择" style="width: 178px" @change="changeCollege">
+              <el-option v-for="item in searchData.colleges" :label="item.name" :value="item.id" :key="item.id" />
             </el-select>
             </el-select>
           </el-form-item>
           </el-form-item>
-          <el-form-item prop="stage" label="学段">
-            <el-select v-model="searchData.stage" placeholder="请选择" style="width: 178px">
-              <el-option label="todo" value="todo" />
+          <el-form-item prop="periodId" label="学段">
+            <el-select
+              v-model="searchData.periodId"
+              placeholder="请选择"
+              style="width: 178px"
+              :disabled="!searchData.collegeId"
+              @change="changePeriod"
+            >
+              <el-option v-for="item in searchData.periods" :label="item.name" :value="item.id" :key="item.id" />
             </el-select>
             </el-select>
           </el-form-item>
           </el-form-item>
-          <el-form-item prop="major" label="专业">
-            <el-select v-model="searchData.major" placeholder="请选择" style="width: 178px">
-              <el-option label="todo" value="todo" />
+          <el-form-item prop="majorId" label="专业">
+            <el-select
+              v-model="searchData.majorId"
+              placeholder="请选择"
+              style="width: 178px"
+              :disabled="!searchData.periodId"
+              @change="changeMajorId"
+            >
+              <el-option v-for="item in searchData.majors" :label="item.name" :value="item.id" :key="item.id" />
             </el-select>
             </el-select>
           </el-form-item>
           </el-form-item>
-          <el-form-item prop="class" label="班级">
-            <el-select v-model="searchData.class" placeholder="请选择" style="width: 178px">
-              <el-option label="todo" value="todo" />
+          <el-form-item prop="classId" label="班级">
+            <el-select
+              v-model="searchData.classId"
+              placeholder="请选择"
+              style="width: 178px"
+              :disabled="!searchData.majorId"
+            >
+              <el-option v-for="item in searchData.classList" :label="item.name" :value="item.id" :key="item.id" />
             </el-select>
             </el-select>
           </el-form-item>
           </el-form-item>
-          <el-form-item prop="status" label="状态">
-            <el-select v-model="searchData.status" placeholder="请选择" style="width: 178px">
-              <el-option label="todo" value="todo" />
+          <el-form-item prop="statuId" label="状态">
+            <el-select v-model="searchData.statuId" placeholder="请选择" style="width: 178px">
+              <el-option label="全部" value="0" />
+              <el-option label="未开始" value="1" />
+              <el-option label="进行中" value="2" />
+              <el-option label="已结束" value="3" />
             </el-select>
             </el-select>
           </el-form-item>
           </el-form-item>
           <el-form-item prop="createTime" label="创建时间">
           <el-form-item prop="createTime" label="创建时间">
@@ -206,7 +358,7 @@ const handleDownload = () => {
               type="datetimerange"
               type="datetimerange"
               start-placeholder="开始时间"
               start-placeholder="开始时间"
               end-placeholder="结束时间"
               end-placeholder="结束时间"
-              value-format="x"
+              value-format="YYYY-MM-DD HH:mm:ss"
             />
             />
           </el-form-item>
           </el-form-item>
           <el-form-item prop="activityTime" label="活动时间">
           <el-form-item prop="activityTime" label="活动时间">
@@ -215,7 +367,7 @@ const handleDownload = () => {
               type="datetimerange"
               type="datetimerange"
               start-placeholder="开始时间"
               start-placeholder="开始时间"
               end-placeholder="结束时间"
               end-placeholder="结束时间"
-              value-format="x"
+              value-format="YYYY-MM-DD HH:mm:ss"
             />
             />
           </el-form-item>
           </el-form-item>
           <el-form-item prop="registrationTime" label="报名时间">
           <el-form-item prop="registrationTime" label="报名时间">
@@ -224,7 +376,7 @@ const handleDownload = () => {
               type="datetimerange"
               type="datetimerange"
               start-placeholder="开始时间"
               start-placeholder="开始时间"
               end-placeholder="结束时间"
               end-placeholder="结束时间"
-              value-format="x"
+              value-format="YYYY-MM-DD HH:mm:ss"
             />
             />
           </el-form-item>
           </el-form-item>
           <el-form-item>
           <el-form-item>
@@ -234,26 +386,55 @@ const handleDownload = () => {
         </el-form>
         </el-form>
         <div>
         <div>
           <el-button type="primary" @click="setAdminDialogVisible = true">设置管理员</el-button>
           <el-button type="primary" @click="setAdminDialogVisible = true">设置管理员</el-button>
-          <el-button type="primary" @click="dialogVisible = true">新增</el-button>
+          <el-button type="primary" @click="handleAdd">新增</el-button>
           <el-button plain @click="handleDownload">导出</el-button>
           <el-button plain @click="handleDownload">导出</el-button>
         </div>
         </div>
       </div>
       </div>
       <div class="table-wrapper">
       <div class="table-wrapper">
         <el-table :data="tableData" max-height="500">
         <el-table :data="tableData" max-height="500">
-          <el-table-column type="index" label="序号" width="100" align="center" />
-          <el-table-column prop="initiator" label="发起人" align="center" />
-          <el-table-column prop="college" label="学院" align="center" />
-          <el-table-column prop="stage" label="学段" align="center" />
-          <el-table-column prop="major" label="专业" align="center" />
-          <el-table-column prop="class" label="班级" align="center" />
-          <el-table-column prop="organizationName" label="所属组织" align="center" />
+          <el-table-column type="index" label="序号" width="80" align="center" />
+          <el-table-column prop="name" label="发起人" align="center" show-overflow-tooltip />
+          <el-table-column prop="collegeName" label="学院" align="center" show-overflow-tooltip />
+          <el-table-column prop="periodName" label="学段" align="center" />
+          <el-table-column prop="majorName" label="专业" align="center" show-overflow-tooltip />
+          <el-table-column prop="className" label="班级" align="center" />
+          <el-table-column prop="orgName" label="所属组织" align="center" />
           <el-table-column prop="theme" label="活动主题" align="center" />
           <el-table-column prop="theme" label="活动主题" align="center" />
-          <el-table-column prop="activityTime" label="活动时间" align="center" />
-          <el-table-column prop="registrationTime" label="报名时间" align="center" />
-          <el-table-column prop="status" label="状态" align="center" />
-          <el-table-column prop="todo" label="已报名" align="center" />
-          <el-table-column prop="todo" label="已签到" align="center" />
-          <el-table-column prop="createTime" label="创建时间" align="center" />
+
+          <el-table-column label="活动时间" align="center" show-overflow-tooltip>
+            <template #default="{ row }">
+              <div>{{ row.startTime }} -- {{ row.endTime }}</div>
+            </template>
+          </el-table-column>
+
+          <el-table-column label="报名时间" align="center" show-overflow-tooltip>
+            <template #default="{ row }">
+              <div>{{ row.signsTime }} -- {{ row.signeTime }}</div>
+            </template>
+          </el-table-column>
+
+          <el-table-column label="状态" align="center">
+            <template #default="{ row }">
+              <div style="color: #366fff" v-if="row.activityStatuName == 1">未开始</div>
+              <div style="color: #e6a23c" v-if="row.activityStatuName == 2">进行中</div>
+              <div style="color: #d43030" v-if="row.activityStatuName == 3">已结束</div>
+            </template>
+          </el-table-column>
+
+          <el-table-column label="已报名" align="center" show-overflow-tooltip>
+            <template #default="{ row }">
+              <div style="color: #d43030" v-if="row.reportNumber == 0">未报名</div>
+              <div style="color: #366fff" v-else>已报名</div>
+            </template>
+          </el-table-column>
+
+          <el-table-column label="已签到" align="center" show-overflow-tooltip>
+            <template #default="{ row }">
+              <div style="color: #d43030" v-if="row.signinNumber == 0">未签到</div>
+              <div style="color: #366fff" v-else>已签到</div>
+            </template>
+          </el-table-column>
+          <el-table-column prop="createTime" label="创建时间" align="center" show-overflow-tooltip />
           <el-table-column fixed="right" label="操作" width="200" align="center">
           <el-table-column fixed="right" label="操作" width="200" align="center">
             <template #default="scope">
             <template #default="scope">
               <el-link type="primary" @click="handleUpdate(scope.row)">详情</el-link>
               <el-link type="primary" @click="handleUpdate(scope.row)">详情</el-link>
@@ -281,18 +462,19 @@ const handleDownload = () => {
       :title="formData.id === undefined ? '创建活动' : '编辑活动'"
       :title="formData.id === undefined ? '创建活动' : '编辑活动'"
       @closed="resetForm"
       @closed="resetForm"
       width="50%"
       width="50%"
+      top="5vh"
     >
     >
       <el-form ref="formRef" :model="formData" :rules="formRules" label-width="auto" size="large">
       <el-form ref="formRef" :model="formData" :rules="formRules" label-width="auto" size="large">
-        <el-form-item prop="organization" label="所属组织">
-          <el-select v-model="formData.organization" placeholder="请选择" multiple>
-            <el-option label="todo" value="todo" />
+        <el-form-item prop="orgId" label="所属组织">
+          <el-select v-model="formData.orgId" placeholder="请选择" @change="changeOrg">
+            <el-option v-for="item in formData.organization" :label="item.name" :value="item.id" :key="item.id" />
           </el-select>
           </el-select>
         </el-form-item>
         </el-form-item>
         <el-form-item prop="theme" label="活动主题">
         <el-form-item prop="theme" label="活动主题">
           <el-input v-model="formData.theme" placeholder="请输入" />
           <el-input v-model="formData.theme" placeholder="请输入" />
         </el-form-item>
         </el-form-item>
-        <el-form-item prop="info" label="活动详情">
-          <el-input v-model="formData.info" type="textarea" :rows="5" placeholder="请输入" />
+        <el-form-item prop="themeDetail" label="活动详情">
+          <el-input v-model="formData.themeDetail" type="textarea" :rows="5" placeholder="请输入" />
         </el-form-item>
         </el-form-item>
         <el-form-item prop="activityTime" label="活动时间">
         <el-form-item prop="activityTime" label="活动时间">
           <el-date-picker
           <el-date-picker
@@ -300,14 +482,14 @@ const handleDownload = () => {
             type="datetimerange"
             type="datetimerange"
             start-placeholder="开始时间"
             start-placeholder="开始时间"
             end-placeholder="结束时间"
             end-placeholder="结束时间"
-            value-format="x"
+            value-format="YYYY-MM-DD HH:mm:ss"
           />
           />
         </el-form-item>
         </el-form-item>
         <el-form-item prop="address" label="活动地址">
         <el-form-item prop="address" label="活动地址">
           <el-input v-model="formData.address" placeholder="请输入" />
           <el-input v-model="formData.address" placeholder="请输入" />
         </el-form-item>
         </el-form-item>
-        <el-form-item prop="explain" label="参与说明">
-          <el-input v-model="formData.explain" type="textarea" :rows="5" placeholder="请输入" />
+        <el-form-item prop="describes" label="参与说明">
+          <el-input v-model="formData.describes" type="textarea" :rows="5" placeholder="请输入" />
         </el-form-item>
         </el-form-item>
         <el-form-item prop="registrationTime" label="报名时间">
         <el-form-item prop="registrationTime" label="报名时间">
           <el-date-picker
           <el-date-picker
@@ -315,22 +497,23 @@ const handleDownload = () => {
             type="datetimerange"
             type="datetimerange"
             start-placeholder="开始时间"
             start-placeholder="开始时间"
             end-placeholder="结束时间"
             end-placeholder="结束时间"
-            value-format="x"
+            value-format="YYYY-MM-DD HH:mm:ss"
           />
           />
         </el-form-item>
         </el-form-item>
-        <el-form-item prop="total" label="报名总人数">
-          <el-input v-model.number="formData.total" type="number" placeholder="请输入" />
+        <el-form-item prop="totalNumber" label="报名总人数">
+          <el-input v-model.number="formData.totalNumber" type="number" placeholder="请输入" />
         </el-form-item>
         </el-form-item>
-        <el-form-item prop="range" label="报名范围">
-          <el-select v-model="formData.range" placeholder="请选择" multiple>
-            <el-option label="todo" value="todo" />
+        <el-form-item prop="scope" label="报名范围">
+          <el-select v-model="formData.scope" placeholder="请选择">
+            <el-option label="全部" value="2" />
+            <el-option label="组织成员" value="1" />
           </el-select>
           </el-select>
         </el-form-item>
         </el-form-item>
-        <el-form-item prop="consultation" label="咨询方式">
-          <el-input v-model="formData.consultation" placeholder="请输入" />
+        <el-form-item prop="phone" label="咨询方式">
+          <el-input v-model="formData.phone" placeholder="请输入" />
         </el-form-item>
         </el-form-item>
-        <el-form-item prop="isImg" label="活动相册">
-          <el-switch v-model="formData.isImg" />
+        <el-form-item prop="isImage" label="活动相册">
+          <el-switch v-model="formData.isImage" />
         </el-form-item>
         </el-form-item>
       </el-form>
       </el-form>
       <template #footer>
       <template #footer>

+ 64 - 31
src/views/news-focus/index.vue

@@ -1,9 +1,10 @@
 <script setup>
 <script setup>
 import { reactive, ref, watch } from "vue"
 import { reactive, ref, watch } from "vue"
-import { createTableDataApi, deleteTableDataApi, updateTableDataApi, getTableDataApi } from "@/api/table"
+import { getNewsPage, getCategoryNewss, createNews, updateNews, deleteNews } from "@/api/news"
 import { ElMessage, ElMessageBox } from "element-plus"
 import { ElMessage, ElMessageBox } from "element-plus"
 import { usePagination } from "@/hooks/usePagination"
 import { usePagination } from "@/hooks/usePagination"
 import { cloneDeep } from "lodash-es"
 import { cloneDeep } from "lodash-es"
+import { getUserId } from "@/utils/cache/cookies"
 
 
 const loading = ref(false)
 const loading = ref(false)
 const { paginationData, handleCurrentChange, handleSizeChange } = usePagination()
 const { paginationData, handleCurrentChange, handleSizeChange } = usePagination()
@@ -33,22 +34,30 @@ const resetCreateCategoryForm = () => {
 //#region 增
 //#region 增
 const DEFAULT_FORM_DATA = {
 const DEFAULT_FORM_DATA = {
   id: undefined,
   id: undefined,
-  title: "",
-  todo: "",
+  userId: getUserId(),
+  theme: "",
+  userName: "",
   classification: [],
   classification: [],
+  categoryId: "",
+  categoryName: "",
   content: ""
   content: ""
 }
 }
 const dialogVisible = ref(false)
 const dialogVisible = ref(false)
 const formRef = ref(null)
 const formRef = ref(null)
 const formData = ref(cloneDeep(DEFAULT_FORM_DATA))
 const formData = ref(cloneDeep(DEFAULT_FORM_DATA))
+
 const formRules = {
 const formRules = {
-  title: [{ required: true, trigger: "blur", message: "必填" }]
+  theme: [{ required: true, trigger: "blur", message: "标题必填" }],
+  userName: [{ required: true, trigger: "blur", message: "发件人必填" }],
+  categoryId: [{ required: true, trigger: "blur", message: "所属分类必填" }],
+  content: [{ required: true, trigger: "blur", message: "内容必填" }]
 }
 }
 const handleCreateOrUpdate = () => {
 const handleCreateOrUpdate = () => {
   formRef.value?.validate((valid, fields) => {
   formRef.value?.validate((valid, fields) => {
     if (!valid) return console.error("表单校验不通过", fields)
     if (!valid) return console.error("表单校验不通过", fields)
     loading.value = true
     loading.value = true
-    const api = formData.value.id === undefined ? createTableDataApi : updateTableDataApi
+
+    const api = formData.value.id === undefined ? createNews : updateNews
     api(formData.value)
     api(formData.value)
       .then(() => {
       .then(() => {
         ElMessage.success("操作成功")
         ElMessage.success("操作成功")
@@ -73,7 +82,7 @@ const handleDelete = (row) => {
     cancelButtonText: "取消",
     cancelButtonText: "取消",
     type: "warning"
     type: "warning"
   }).then(() => {
   }).then(() => {
-    deleteTableDataApi(row.id).then(() => {
+    deleteNews(row.id).then(() => {
       ElMessage.success("删除成功")
       ElMessage.success("删除成功")
       getTableData()
       getTableData()
     })
     })
@@ -92,22 +101,24 @@ const handleUpdate = (row) => {
 const tableData = ref([])
 const tableData = ref([])
 const searchFormRef = ref(null)
 const searchFormRef = ref(null)
 const searchData = reactive({
 const searchData = reactive({
-  title: undefined,
-  todo: undefined,
+  theme: undefined,
+  userName: undefined,
   createTime: null
   createTime: null
 })
 })
 const getTableData = () => {
 const getTableData = () => {
   loading.value = true
   loading.value = true
-  getTableDataApi({
+  getNewsPage({
     currentPage: paginationData.currentPage,
     currentPage: paginationData.currentPage,
-    size: paginationData.pageSize,
-    title: searchData.title,
-    todo: searchData.todo,
-    starTime: searchData.createTime ? searchData.createTime[0] : undefined,
+    pageCount: paginationData.pageSize,
+    theme: searchData.theme,
+    userName: searchData.userName,
+    startTime: searchData.createTime ? searchData.createTime[0] : undefined,
     endTime: searchData.createTime ? searchData.createTime[1] : undefined
     endTime: searchData.createTime ? searchData.createTime[1] : undefined
   })
   })
     .then(({ data }) => {
     .then(({ data }) => {
-      paginationData.total = data.total
+      // console.log(data)
+
+      paginationData.total = data.totalCount
       tableData.value = data.list
       tableData.value = data.list
     })
     })
     .catch(() => {
     .catch(() => {
@@ -124,6 +135,28 @@ const resetSearch = () => {
   searchFormRef.value?.resetFields()
   searchFormRef.value?.resetFields()
   handleSearch()
   handleSearch()
 }
 }
+
+// 发布新闻按钮回调
+const handleSubmit = () => {
+  dialogVisible.value = true
+  // 获取新闻分类下拉列表数据
+  getNewsType()
+}
+
+// 获取新闻分类下拉列表数据
+const getNewsType = async () => {
+  const res = await getCategoryNewss()
+  // console.log(res)
+  formData.value.classification = res.data
+}
+
+// 弹窗所属分类select框切换回调
+const changeSelect = (e) => {
+  // console.log(e)
+  const v = formData.value.classification.findIndex((ele) => ele.id == e)
+  formData.value.categoryName = formData.value.classification[v].name
+}
+
 //#endregion
 //#endregion
 
 
 /** 监听分页参数的变化 */
 /** 监听分页参数的变化 */
@@ -135,11 +168,11 @@ watch([() => paginationData.currentPage, () => paginationData.pageSize], getTabl
     <el-card v-loading="loading" header="新闻聚焦">
     <el-card v-loading="loading" header="新闻聚焦">
       <div class="toolbar-wrapper">
       <div class="toolbar-wrapper">
         <el-form ref="searchFormRef" :inline="true" :model="searchData">
         <el-form ref="searchFormRef" :inline="true" :model="searchData">
-          <el-form-item prop="title" label="标题">
-            <el-input v-model="searchData.title" placeholder="请输入" />
+          <el-form-item prop="theme" label="标题">
+            <el-input v-model="searchData.theme" placeholder="请输入" />
           </el-form-item>
           </el-form-item>
-          <el-form-item prop="todo" label="发件人">
-            <el-input v-model="searchData.todo" placeholder="请输入" />
+          <el-form-item prop="userName" label="发件人">
+            <el-input v-model="searchData.userName" placeholder="请输入" />
           </el-form-item>
           </el-form-item>
           <el-form-item prop="createTime" label="创建时间">
           <el-form-item prop="createTime" label="创建时间">
             <el-date-picker
             <el-date-picker
@@ -147,7 +180,7 @@ watch([() => paginationData.currentPage, () => paginationData.pageSize], getTabl
               type="datetimerange"
               type="datetimerange"
               start-placeholder="开始时间"
               start-placeholder="开始时间"
               end-placeholder="结束时间"
               end-placeholder="结束时间"
-              value-format="x"
+              value-format="YYYY-MM-DD HH:mm:ss"
             />
             />
           </el-form-item>
           </el-form-item>
           <el-form-item>
           <el-form-item>
@@ -156,17 +189,17 @@ watch([() => paginationData.currentPage, () => paginationData.pageSize], getTabl
           </el-form-item>
           </el-form-item>
         </el-form>
         </el-form>
         <div>
         <div>
-          <el-button type="primary" @click="dialogVisible = true">发布新闻</el-button>
-          <el-button plain @click="createCategoryDialogVisible = true">创建分类</el-button>
+          <el-button type="primary" @click="handleSubmit">发布新闻</el-button>
+          <!-- <el-button plain @click="createCategoryDialogVisible = true">创建分类</el-button> -->
         </div>
         </div>
       </div>
       </div>
       <div class="table-wrapper">
       <div class="table-wrapper">
         <el-table :data="tableData" max-height="500">
         <el-table :data="tableData" max-height="500">
           <el-table-column type="index" label="序号" width="100" align="center" />
           <el-table-column type="index" label="序号" width="100" align="center" />
-          <el-table-column prop="title" label="标题" align="center" />
+          <el-table-column prop="theme" label="标题" align="center" />
           <el-table-column prop="content" label="内容" align="center" />
           <el-table-column prop="content" label="内容" align="center" />
-          <el-table-column prop="classification" label="分类" align="center" />
-          <el-table-column prop="todo" label="发件人" align="center" />
+          <el-table-column prop="categoryName" label="分类" align="center" />
+          <el-table-column prop="userName" label="发件人" align="center" />
           <el-table-column prop="createTime" label="创建时间" align="center" />
           <el-table-column prop="createTime" label="创建时间" align="center" />
           <el-table-column fixed="right" label="操作" width="200" align="center">
           <el-table-column fixed="right" label="操作" width="200" align="center">
             <template #default="scope">
             <template #default="scope">
@@ -197,15 +230,15 @@ watch([() => paginationData.currentPage, () => paginationData.pageSize], getTabl
       width="50%"
       width="50%"
     >
     >
       <el-form ref="formRef" :model="formData" :rules="formRules" label-width="auto" size="large">
       <el-form ref="formRef" :model="formData" :rules="formRules" label-width="auto" size="large">
-        <el-form-item prop="title" label="标题">
-          <el-input v-model="formData.title" placeholder="请输入" />
+        <el-form-item prop="theme" label="标题">
+          <el-input v-model="formData.theme" placeholder="请输入" />
         </el-form-item>
         </el-form-item>
-        <el-form-item prop="todo" label="发件人">
-          <el-input v-model="formData.todo" placeholder="请输入" />
+        <el-form-item prop="userName" label="发件人">
+          <el-input v-model="formData.userName" placeholder="请输入" />
         </el-form-item>
         </el-form-item>
-        <el-form-item prop="classification" label="所属分类">
-          <el-select v-model="searchData.classification" placeholder="请选择">
-            <el-option label="todo" value="todo" />
+        <el-form-item prop="categoryId" label="所属分类">
+          <el-select v-model="formData.categoryId" placeholder="请选择" @change="changeSelect">
+            <el-option v-for="item in formData.classification" :label="item.name" :value="item.id" :key="item.id" />
           </el-select>
           </el-select>
         </el-form-item>
         </el-form-item>
         <el-form-item prop="content" label="内容">
         <el-form-item prop="content" label="内容">

+ 16 - 14
src/views/news-focus/news-classification.vue

@@ -1,6 +1,6 @@
 <script setup>
 <script setup>
 import { reactive, ref, watch } from "vue"
 import { reactive, ref, watch } from "vue"
-import { createTableDataApi, deleteTableDataApi, updateTableDataApi, getTableDataApi } from "@/api/table"
+import { getCategoryNewsPage, createCategoryNews, updateCategoryNews, deleteCategoryNews } from "@/api/news"
 import { ElMessage, ElMessageBox } from "element-plus"
 import { ElMessage, ElMessageBox } from "element-plus"
 import { usePagination } from "@/hooks/usePagination"
 import { usePagination } from "@/hooks/usePagination"
 import { cloneDeep } from "lodash-es"
 import { cloneDeep } from "lodash-es"
@@ -11,19 +11,19 @@ const { paginationData, handleCurrentChange, handleSizeChange } = usePagination(
 //#region 增
 //#region 增
 const DEFAULT_FORM_DATA = {
 const DEFAULT_FORM_DATA = {
   id: undefined,
   id: undefined,
-  title: ""
+  name: ""
 }
 }
 const dialogVisible = ref(false)
 const dialogVisible = ref(false)
 const formRef = ref(null)
 const formRef = ref(null)
 const formData = ref(cloneDeep(DEFAULT_FORM_DATA))
 const formData = ref(cloneDeep(DEFAULT_FORM_DATA))
 const formRules = {
 const formRules = {
-  title: [{ required: true, trigger: "blur", message: "必填" }]
+  name: [{ required: true, trigger: "blur", message: "必填" }]
 }
 }
 const handleCreateOrUpdate = () => {
 const handleCreateOrUpdate = () => {
   formRef.value?.validate((valid, fields) => {
   formRef.value?.validate((valid, fields) => {
     if (!valid) return console.error("表单校验不通过", fields)
     if (!valid) return console.error("表单校验不通过", fields)
     loading.value = true
     loading.value = true
-    const api = formData.value.id === undefined ? createTableDataApi : updateTableDataApi
+    const api = formData.value.id === undefined ? createCategoryNews : updateCategoryNews
     api(formData.value)
     api(formData.value)
       .then(() => {
       .then(() => {
         ElMessage.success("操作成功")
         ElMessage.success("操作成功")
@@ -48,7 +48,7 @@ const handleDelete = (row) => {
     cancelButtonText: "取消",
     cancelButtonText: "取消",
     type: "warning"
     type: "warning"
   }).then(() => {
   }).then(() => {
-    deleteTableDataApi(row.id).then(() => {
+    deleteCategoryNews(row.id).then(() => {
       ElMessage.success("删除成功")
       ElMessage.success("删除成功")
       getTableData()
       getTableData()
     })
     })
@@ -71,14 +71,16 @@ const searchData = reactive({
 })
 })
 const getTableData = () => {
 const getTableData = () => {
   loading.value = true
   loading.value = true
-  getTableDataApi({
+  getCategoryNewsPage({
     currentPage: paginationData.currentPage,
     currentPage: paginationData.currentPage,
-    size: paginationData.pageSize,
-    starTime: searchData.createTime ? searchData.createTime[0] : undefined,
+    pageCount: paginationData.pageSize,
+    startTime: searchData.createTime ? searchData.createTime[0] : undefined,
     endTime: searchData.createTime ? searchData.createTime[1] : undefined
     endTime: searchData.createTime ? searchData.createTime[1] : undefined
   })
   })
     .then(({ data }) => {
     .then(({ data }) => {
-      paginationData.total = data.total
+      console.log(data)
+
+      paginationData.total = data.totalCount
       tableData.value = data.list
       tableData.value = data.list
     })
     })
     .catch(() => {
     .catch(() => {
@@ -112,7 +114,7 @@ watch([() => paginationData.currentPage, () => paginationData.pageSize], getTabl
               type="datetimerange"
               type="datetimerange"
               start-placeholder="开始时间"
               start-placeholder="开始时间"
               end-placeholder="结束时间"
               end-placeholder="结束时间"
-              value-format="x"
+              value-format="YYYY-MM-DD HH:mm:ss"
             />
             />
           </el-form-item>
           </el-form-item>
           <el-form-item>
           <el-form-item>
@@ -127,9 +129,9 @@ watch([() => paginationData.currentPage, () => paginationData.pageSize], getTabl
       <div class="table-wrapper">
       <div class="table-wrapper">
         <el-table :data="tableData" max-height="500">
         <el-table :data="tableData" max-height="500">
           <el-table-column type="index" label="序号" width="100" align="center" />
           <el-table-column type="index" label="序号" width="100" align="center" />
-          <el-table-column prop="title" label="分类名称" align="center" />
+          <el-table-column prop="name" label="分类名称" align="center" />
           <el-table-column prop="createTime" label="创建时间" align="center" />
           <el-table-column prop="createTime" label="创建时间" align="center" />
-          <el-table-column prop="creator" label="创建人" align="center" />
+          <el-table-column prop="createUser" label="创建人" align="center" />
           <el-table-column fixed="right" label="操作" width="200" align="center">
           <el-table-column fixed="right" label="操作" width="200" align="center">
             <template #default="scope">
             <template #default="scope">
               <el-link type="primary" @click="handleUpdate(scope.row)">编辑</el-link>
               <el-link type="primary" @click="handleUpdate(scope.row)">编辑</el-link>
@@ -159,8 +161,8 @@ watch([() => paginationData.currentPage, () => paginationData.pageSize], getTabl
       width="50%"
       width="50%"
     >
     >
       <el-form ref="formRef" :model="formData" :rules="formRules" label-width="auto" size="large">
       <el-form ref="formRef" :model="formData" :rules="formRules" label-width="auto" size="large">
-        <el-form-item prop="title" label="标题">
-          <el-input v-model="formData.title" placeholder="请输入" />
+        <el-form-item prop="name" label="标题">
+          <el-input v-model="formData.name" placeholder="请输入" />
         </el-form-item>
         </el-form-item>
       </el-form>
       </el-form>
       <template #footer>
       <template #footer>

+ 189 - 58
src/views/school-endorsement/audit-list.vue

@@ -1,8 +1,9 @@
 <script setup>
 <script setup>
 import { reactive, ref, watch } from "vue"
 import { reactive, ref, watch } from "vue"
-import { getTableDataApi } from "@/api/table"
-import { ElMessageBox } from "element-plus"
+import { getEndorseApplyPage, exportEndorseApplyExcel, getExamineEndorse } from "@/api/schoolEndorsement"
+import { ElMessageBox, ElMessage } from "element-plus"
 import { usePagination } from "@/hooks/usePagination"
 import { usePagination } from "@/hooks/usePagination"
+import { getQueryCollegesApi, getQueryPeriodsApi, getQueryMajorsApi, getQueryClassesApi } from "@/api/alumniManager"
 
 
 const loading = ref(false)
 const loading = ref(false)
 const { paginationData, handleCurrentChange, handleSizeChange } = usePagination()
 const { paginationData, handleCurrentChange, handleSizeChange } = usePagination()
@@ -13,30 +14,36 @@ const searchFormRef = ref(null)
 const searchData = reactive({
 const searchData = reactive({
   keyword: undefined,
   keyword: undefined,
   name: undefined,
   name: undefined,
-  status: undefined,
-  college: undefined,
-  stage: undefined,
-  major: undefined,
-  class: undefined,
+  isPass: undefined,
+  collegeId: undefined,
+  colleges: [],
+  periodId: undefined,
+  periods: [],
+  majorId: undefined,
+  majors: [],
+  classId: undefined,
+  classList: [],
   createTime: null
   createTime: null
 })
 })
 const getTableData = () => {
 const getTableData = () => {
   loading.value = true
   loading.value = true
-  getTableDataApi({
+  getEndorseApplyPage({
     currentPage: paginationData.currentPage,
     currentPage: paginationData.currentPage,
-    size: paginationData.pageSize,
+    pageCount: paginationData.pageSize,
     keyword: searchData.keyword,
     keyword: searchData.keyword,
     name: searchData.name,
     name: searchData.name,
-    status: searchData.status,
-    college: searchData.college,
-    stage: searchData.stage,
-    major: searchData.major,
-    class: searchData.class,
-    starTime: searchData.createTime ? searchData.createTime[0] : undefined,
+    isPass: searchData.isPass,
+    collegeId: searchData.collegeId,
+    periodId: searchData.periodId,
+    majorId: searchData.majorId,
+    classId: searchData.classId,
+    startTime: searchData.createTime ? searchData.createTime[0] : undefined,
     endTime: searchData.createTime ? searchData.createTime[1] : undefined
     endTime: searchData.createTime ? searchData.createTime[1] : undefined
   })
   })
     .then(({ data }) => {
     .then(({ data }) => {
-      paginationData.total = data.total
+      // console.log(data)
+
+      paginationData.total = data.totalCount
       tableData.value = data.list
       tableData.value = data.list
     })
     })
     .catch(() => {
     .catch(() => {
@@ -53,11 +60,45 @@ const resetSearch = () => {
   searchFormRef.value?.resetFields()
   searchFormRef.value?.resetFields()
   handleSearch()
   handleSearch()
 }
 }
+
+// // 获取学院集合
+const getColleges = async () => {
+  const res = await getQueryCollegesApi()
+  // console.log(res)
+  searchData.colleges = res.data
+}
+
+// 学院筛选框切换回调
+const changeCollege = async (e) => {
+  const res = await getQueryPeriodsApi({
+    collegeId: e
+  })
+  // console.log(res)
+  searchData.periods = res.data
+}
+
+// 学段筛选框切换回调
+const changePeriod = async (e) => {
+  const res = await getQueryMajorsApi({
+    periodId: e
+  })
+  searchData.majors = res.data
+}
+
+// 专业筛选框切换回调
+const changeMajorId = async (e) => {
+  const res = await getQueryClassesApi({
+    majorId: e
+  })
+  searchData.classList = res.data
+}
 //#endregion
 //#endregion
 
 
 /** 监听分页参数的变化 */
 /** 监听分页参数的变化 */
 watch([() => paginationData.currentPage, () => paginationData.pageSize], getTableData, { immediate: true })
 watch([() => paginationData.currentPage, () => paginationData.pageSize], getTableData, { immediate: true })
 
 
+watch([() => paginationData.currentPage, () => paginationData.pageSize], getColleges, { immediate: true })
+
 /** 通过 */
 /** 通过 */
 const handlePass = (row) => {
 const handlePass = (row) => {
   ElMessageBox.confirm("确认通过?", "提示", {
   ElMessageBox.confirm("确认通过?", "提示", {
@@ -65,27 +106,76 @@ const handlePass = (row) => {
     cancelButtonText: "取消",
     cancelButtonText: "取消",
     type: "warning"
     type: "warning"
   }).then(() => {
   }).then(() => {
-    // todo 调用通过接口
-    console.log(row)
+    // console.log(row)
+    checkReq(2, row.id)
   })
   })
 }
 }
 
 
 /** 拒绝 */
 /** 拒绝 */
 const handleReject = (row) => {
 const handleReject = (row) => {
-  ElMessageBox.confirm("确认拒绝?", "提示", {
+  ElMessageBox.prompt("确认拒绝?", "提示", {
     confirmButtonText: "确定",
     confirmButtonText: "确定",
     cancelButtonText: "取消",
     cancelButtonText: "取消",
-    type: "warning"
-  }).then(() => {
-    // todo 调用拒绝接口
-    console.log(row)
+    inputPlaceholder: "请输入拒绝的原因"
+  }).then(({ value }) => {
+    if (value && value.trim()) {
+      checkReq(3, row.id, value)
+    } else {
+      ElMessage.warning("拒绝原因为必填")
+      handleReject(row)
+    }
+  })
+}
+
+// 审核请求
+const checkReq = async (isPass, id, passValue = "") => {
+  await getExamineEndorse({
+    id,
+    isPass,
+    passValue
   })
   })
+
+  ElMessage.success("操作成功")
+  getTableData()
 }
 }
 
 
 /** 导出 */
 /** 导出 */
 const handleDownload = () => {
 const handleDownload = () => {
-  // todo 调用导出接口
-  console.log("导出")
+  ElMessageBox.confirm("确认导出吗?", "提示", {
+    confirmButtonText: "确定",
+    cancelButtonText: "取消",
+    type: "warning"
+  }).then(() => {
+    downloadReq()
+  })
+}
+
+// 导出请求
+const downloadReq = async () => {
+  const res = await exportEndorseApplyExcel({
+    keyword: searchData.keyword,
+    name: searchData.name,
+    isPass: searchData.isPass,
+    collegeId: searchData.collegeId,
+    periodId: searchData.periodId,
+    majorId: searchData.majorId,
+    classId: searchData.classId,
+    startTime: searchData.createTime ? searchData.createTime[0] : undefined,
+    endTime: searchData.createTime ? searchData.createTime[1] : undefined
+  })
+  // console.log(res)
+  // 请求成功返回后,获取到Excel文件的二进制数据
+  const blob = new Blob([res], { type: "application/vnd.ms-excel" })
+  // 创建下载链接
+  const downloadUrl = URL.createObjectURL(blob)
+  // 创建一个隐藏的a标签,设置下载链接和文件名,模拟点击下载
+  const link = document.createElement("a")
+  link.style.display = "none"
+  link.href = downloadUrl
+  link.download = "母校代言审核.xlsx"
+  document.body.appendChild(link)
+  link.click()
+  document.body.removeChild(link)
 }
 }
 </script>
 </script>
 
 
@@ -100,29 +190,48 @@ const handleDownload = () => {
           <el-form-item prop="name" label="姓名">
           <el-form-item prop="name" label="姓名">
             <el-input v-model="searchData.name" placeholder="请输入" />
             <el-input v-model="searchData.name" placeholder="请输入" />
           </el-form-item>
           </el-form-item>
-          <el-form-item prop="status" label="审核状态">
-            <el-select v-model="searchData.status" placeholder="请选择" style="width: 178px">
-              <el-option label="todo" value="todo" />
+          <el-form-item prop="isPass" label="审核状态">
+            <el-select v-model="searchData.isPass" placeholder="请选择" style="width: 178px">
+              <el-option label="待审核" value="1" />
+              <el-option label="通过" value="2" />
+              <el-option label="拒绝" value="3" />
             </el-select>
             </el-select>
           </el-form-item>
           </el-form-item>
-          <el-form-item prop="college" label="学院">
-            <el-select v-model="searchData.college" placeholder="请选择" style="width: 178px">
-              <el-option label="todo" value="todo" />
+          <el-form-item prop="collegeId" label="学院">
+            <el-select v-model="searchData.collegeId" placeholder="请选择" style="width: 178px" @change="changeCollege">
+              <el-option v-for="item in searchData.colleges" :label="item.name" :value="item.id" :key="item.id" />
             </el-select>
             </el-select>
           </el-form-item>
           </el-form-item>
-          <el-form-item prop="stage" label="学段">
-            <el-select v-model="searchData.stage" placeholder="请选择" style="width: 178px">
-              <el-option label="todo" value="todo" />
+          <el-form-item prop="periodId" label="学段">
+            <el-select
+              v-model="searchData.periodId"
+              placeholder="请选择"
+              style="width: 178px"
+              :disabled="!searchData.collegeId"
+              @change="changePeriod"
+            >
+              <el-option v-for="item in searchData.periods" :label="item.name" :value="item.id" :key="item.id" />
             </el-select>
             </el-select>
           </el-form-item>
           </el-form-item>
-          <el-form-item prop="major" label="专业">
-            <el-select v-model="searchData.major" placeholder="请选择" style="width: 178px">
-              <el-option label="todo" value="todo" />
+          <el-form-item prop="majorId" label="专业">
+            <el-select
+              v-model="searchData.majorId"
+              placeholder="请选择"
+              style="width: 178px"
+              :disabled="!searchData.periodId"
+              @change="changeMajorId"
+            >
+              <el-option v-for="item in searchData.majors" :label="item.name" :value="item.id" :key="item.id" />
             </el-select>
             </el-select>
           </el-form-item>
           </el-form-item>
-          <el-form-item prop="class" label="班级">
-            <el-select v-model="searchData.class" placeholder="请选择" style="width: 178px">
-              <el-option label="todo" value="todo" />
+          <el-form-item prop="classId" label="班级">
+            <el-select
+              v-model="searchData.classId"
+              placeholder="请选择"
+              style="width: 178px"
+              :disabled="!searchData.majorId"
+            >
+              <el-option v-for="item in searchData.classList" :label="item.name" :value="item.id" :key="item.id" />
             </el-select>
             </el-select>
           </el-form-item>
           </el-form-item>
           <el-form-item prop="createTime" label="创建时间">
           <el-form-item prop="createTime" label="创建时间">
@@ -131,7 +240,7 @@ const handleDownload = () => {
               type="datetimerange"
               type="datetimerange"
               start-placeholder="开始时间"
               start-placeholder="开始时间"
               end-placeholder="结束时间"
               end-placeholder="结束时间"
-              value-format="x"
+              value-format="YYYY-MM-DD HH:mm:ss"
             />
             />
           </el-form-item>
           </el-form-item>
           <el-form-item>
           <el-form-item>
@@ -140,29 +249,51 @@ const handleDownload = () => {
           </el-form-item>
           </el-form-item>
         </el-form>
         </el-form>
         <div>
         <div>
-          <el-button plain @click="handleDownload">导出</el-button>
+          <el-button plain :disabled="!tableData.length" @click="handleDownload">导出</el-button>
         </div>
         </div>
       </div>
       </div>
       <div class="table-wrapper">
       <div class="table-wrapper">
         <el-table :data="tableData" max-height="500">
         <el-table :data="tableData" max-height="500">
-          <el-table-column type="index" label="序号" width="100" align="center" />
-          <el-table-column prop="todo" label="编号" align="center" />
+          <el-table-column type="index" label="序号" width="60" align="center" />
+          <el-table-column prop="dataNo" label="编号" align="center" show-overflow-tooltip />
           <el-table-column prop="name" label="姓名" align="center" />
           <el-table-column prop="name" label="姓名" align="center" />
-          <el-table-column prop="todo" label="微卡" align="center" />
-          <el-table-column prop="phone" label="手机" align="center" />
-          <el-table-column prop="college" label="学院" align="center" />
-          <el-table-column prop="stage" label="学段" align="center" />
-          <el-table-column prop="major" label="专业" align="center" />
-          <el-table-column prop="class" label="班级" align="center" />
-          <el-table-column prop="todo" label="上榜方式" align="center" />
-          <el-table-column prop="todo" label="照片" align="center" />
-          <el-table-column prop="todo" label="人物简介" align="center" />
-          <el-table-column prop="status" label="审核时间" align="center" />
-          <el-table-column prop="createTime" label="创建时间" align="center" />
-          <el-table-column fixed="right" label="操作" width="200" align="center">
+          <el-table-column prop="cardNumber" label="微卡" align="center" show-overflow-tooltip />
+          <el-table-column prop="phone" label="手机" align="center" show-overflow-tooltip />
+          <el-table-column prop="collegeName" label="学院" align="center" show-overflow-tooltip />
+          <el-table-column prop="periodName" label="学段" align="center" />
+          <el-table-column prop="majorName" label="专业" align="center" show-overflow-tooltip />
+          <el-table-column prop="className" label="班级" align="center" />
+          <el-table-column prop="preferredMethodName" label="上榜方式" align="center" />
+
+          <el-table-column label="照片" align="center">
+            <template #default="{ row }">
+              <el-image
+                style="width: 100px; height: 100px"
+                :src="row.image"
+                fit="cover"
+                lazy
+                :preview-src-list="[row.image]"
+                hide-on-click-modal
+                preview-teleported
+              />
+            </template>
+          </el-table-column>
+
+          <el-table-column prop="descript" label="人物简介" align="center" show-overflow-tooltip />
+          <el-table-column prop="passTime" label="审核时间" align="center" show-overflow-tooltip />
+          <el-table-column prop="createTime" label="创建时间" align="center" show-overflow-tooltip />
+          <el-table-column fixed="right" label="操作" width="180" align="center">
             <template #default="scope">
             <template #default="scope">
-              <el-link type="danger" @click="handleReject(scope.row)">拒绝</el-link>
-              <el-link type="primary" @click="handlePass(scope.row)">同意</el-link>
+              <div v-if="scope.row.isPass == 1">
+                <el-link type="danger" @click="handleReject(scope.row)">拒绝</el-link>
+                <el-link type="primary" @click="handlePass(scope.row)">同意</el-link>
+              </div>
+              <div v-if="scope.row.isPass == 2">
+                <el-link type="primary" disabled>已通过</el-link>
+              </div>
+              <div v-if="scope.row.isPass == 3">
+                <el-link type="danger" disabled>已拒绝</el-link>
+              </div>
             </template>
             </template>
           </el-table-column>
           </el-table-column>
         </el-table>
         </el-table>

+ 217 - 72
src/views/school-endorsement/index.vue

@@ -1,28 +1,44 @@
 <script setup>
 <script setup>
 import { reactive, ref, watch } from "vue"
 import { reactive, ref, watch } from "vue"
-import { createTableDataApi, deleteTableDataApi, updateTableDataApi, getTableDataApi } from "@/api/table"
+import {
+  getEndorsePage,
+  createInsertEndorse,
+  deleteEndorseById,
+  getPageUser,
+  setEndorseAdmin,
+  exportEndorseExcel
+} from "@/api/schoolEndorsement"
+import { getQueryCollegesApi, getQueryPeriodsApi, getQueryMajorsApi, getQueryClassesApi } from "@/api/alumniManager"
 import { ElMessage, ElMessageBox } from "element-plus"
 import { ElMessage, ElMessageBox } from "element-plus"
 import { Plus } from "@element-plus/icons-vue"
 import { Plus } from "@element-plus/icons-vue"
 import { usePagination } from "@/hooks/usePagination"
 import { usePagination } from "@/hooks/usePagination"
 import { cloneDeep } from "lodash-es"
 import { cloneDeep } from "lodash-es"
+import { getToken } from "@/utils/cache/cookies"
 
 
 const loading = ref(false)
 const loading = ref(false)
 const { paginationData, handleCurrentChange, handleSizeChange } = usePagination()
 const { paginationData, handleCurrentChange, handleSizeChange } = usePagination()
 
 
 //#region 设置管理员
 //#region 设置管理员
 const SET_ADMIN_DEFAULT_FORM_DATA = {
 const SET_ADMIN_DEFAULT_FORM_DATA = {
-  list: []
+  list: [],
+  admins: []
 }
 }
 const setAdminDialogVisible = ref(false)
 const setAdminDialogVisible = ref(false)
 const setAdminFormRef = ref(null)
 const setAdminFormRef = ref(null)
 const setAdminFormData = ref(cloneDeep(SET_ADMIN_DEFAULT_FORM_DATA))
 const setAdminFormData = ref(cloneDeep(SET_ADMIN_DEFAULT_FORM_DATA))
 const setAdminFormRules = {
 const setAdminFormRules = {
-  list: [{ required: true, trigger: "blur", message: "必填" }]
+  admins: [{ required: true, trigger: "blur", message: "必填" }]
 }
 }
 const handleSetAdmin = () => {
 const handleSetAdmin = () => {
-  setAdminFormRef.value?.validate((valid, fields) => {
+  setAdminFormRef.value?.validate(async (valid, fields) => {
     if (!valid) return console.error("表单校验不通过", fields)
     if (!valid) return console.error("表单校验不通过", fields)
     // todo 调用设置管理员接口
     // todo 调用设置管理员接口
+
+    await setEndorseAdmin(setAdminFormData.value)
+
+    ElMessage.success("操作成功")
+    setAdminDialogVisible.value = false
+    resetSetAdminForm()
   })
   })
 }
 }
 const resetSetAdminForm = () => {
 const resetSetAdminForm = () => {
@@ -34,31 +50,31 @@ const resetSetAdminForm = () => {
 //#region 增
 //#region 增
 const DEFAULT_FORM_DATA = {
 const DEFAULT_FORM_DATA = {
   id: undefined,
   id: undefined,
-  phone: "",
   name: "",
   name: "",
-  img: [
-    {
-      name: "food.jpeg",
-      url: "https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100"
-    }
-  ],
-  introduction: ""
+  cardNumber: "",
+  image: "",
+  descript: ""
 }
 }
+const elUploadRef = ref(null)
 const dialogVisible = ref(false)
 const dialogVisible = ref(false)
 const formRef = ref(null)
 const formRef = ref(null)
 const formData = ref(cloneDeep(DEFAULT_FORM_DATA))
 const formData = ref(cloneDeep(DEFAULT_FORM_DATA))
 const formRules = {
 const formRules = {
-  name: [{ required: true, trigger: "blur", message: "必填" }]
+  cardNumber: [{ required: true, trigger: "blur", message: "微校卡号必填" }],
+  name: [{ required: true, trigger: "blur", message: "姓名必填" }],
+  image: [{ required: true, trigger: "blur", message: "照片必填" }],
+  descript: [{ required: true, trigger: "blur", message: "个人简介必填" }]
 }
 }
 const handleCreateOrUpdate = () => {
 const handleCreateOrUpdate = () => {
   formRef.value?.validate((valid, fields) => {
   formRef.value?.validate((valid, fields) => {
     if (!valid) return console.error("表单校验不通过", fields)
     if (!valid) return console.error("表单校验不通过", fields)
     loading.value = true
     loading.value = true
-    const api = formData.value.id === undefined ? createTableDataApi : updateTableDataApi
+    const api = formData.value.id === undefined ? createInsertEndorse : updateTableDataApi
     api(formData.value)
     api(formData.value)
       .then(() => {
       .then(() => {
         ElMessage.success("操作成功")
         ElMessage.success("操作成功")
         dialogVisible.value = false
         dialogVisible.value = false
+        elUploadRef.value?.clearFiles()
         getTableData()
         getTableData()
       })
       })
       .catch(() => {
       .catch(() => {
@@ -68,15 +84,20 @@ const handleCreateOrUpdate = () => {
 }
 }
 const resetForm = () => {
 const resetForm = () => {
   formRef.value?.clearValidate()
   formRef.value?.clearValidate()
+  elUploadRef.value?.clearFiles()
   formData.value = cloneDeep(DEFAULT_FORM_DATA)
   formData.value = cloneDeep(DEFAULT_FORM_DATA)
 }
 }
-const handleAvatarSuccess = (response, uploadFile) => {
-  // todo 上传成功
-  console.log(response, uploadFile)
+const handleAvatarSuccess = (response) => {
+  formData.value.image = response.data.fileUrl
 }
 }
-const handleRemove = (uploadFile, uploadFiles) => {
+const handleRemove = () => {
   // todo 删除图片
   // todo 删除图片
-  console.log(uploadFile, uploadFiles)
+  formData.value.image = ""
+}
+
+// 当超出限制时,执行的钩子函数
+const handleExceed = () => {
+  ElMessage.warning("只能上传一张图片")
 }
 }
 //#endregion
 //#endregion
 
 
@@ -87,7 +108,7 @@ const handleDelete = (row) => {
     cancelButtonText: "取消",
     cancelButtonText: "取消",
     type: "warning"
     type: "warning"
   }).then(() => {
   }).then(() => {
-    deleteTableDataApi(row.id).then(() => {
+    deleteEndorseById(row.id).then(() => {
       ElMessage.success("删除成功")
       ElMessage.success("删除成功")
       getTableData()
       getTableData()
     })
     })
@@ -100,27 +121,33 @@ const tableData = ref([])
 const searchFormRef = ref(null)
 const searchFormRef = ref(null)
 const searchData = reactive({
 const searchData = reactive({
   keyword: undefined,
   keyword: undefined,
-  college: undefined,
-  stage: undefined,
-  major: undefined,
-  class: undefined,
+  collegeId: undefined,
+  colleges: [],
+  periodId: undefined,
+  periods: [],
+  majorId: undefined,
+  majors: [],
+  classId: undefined,
+  classList: [],
   createTime: null
   createTime: null
 })
 })
 const getTableData = () => {
 const getTableData = () => {
   loading.value = true
   loading.value = true
-  getTableDataApi({
+  getEndorsePage({
     currentPage: paginationData.currentPage,
     currentPage: paginationData.currentPage,
-    size: paginationData.pageSize,
+    pageCount: paginationData.pageSize,
     keyword: searchData.keyword,
     keyword: searchData.keyword,
-    college: searchData.college,
-    stage: searchData.stage,
-    major: searchData.major,
-    class: searchData.class,
-    starTime: searchData.createTime ? searchData.createTime[0] : undefined,
+    collegeId: searchData.collegeId,
+    periodId: searchData.periodId,
+    majorId: searchData.majorId,
+    classId: searchData.classId,
+    startTime: searchData.createTime ? searchData.createTime[0] : undefined,
     endTime: searchData.createTime ? searchData.createTime[1] : undefined
     endTime: searchData.createTime ? searchData.createTime[1] : undefined
   })
   })
     .then(({ data }) => {
     .then(({ data }) => {
-      paginationData.total = data.total
+      // console.log(data)
+
+      paginationData.total = data.totalCount
       tableData.value = data.list
       tableData.value = data.list
     })
     })
     .catch(() => {
     .catch(() => {
@@ -137,15 +164,96 @@ const resetSearch = () => {
   searchFormRef.value?.resetFields()
   searchFormRef.value?.resetFields()
   handleSearch()
   handleSearch()
 }
 }
+
+// 获取学院集合
+const getColleges = async () => {
+  const res = await getQueryCollegesApi()
+  // console.log(res)
+  searchData.colleges = res.data
+}
+
+// 学院筛选框切换回调
+const changeCollege = async (e) => {
+  const res = await getQueryPeriodsApi({
+    collegeId: e
+  })
+  // console.log(res)
+  searchData.periods = res.data
+}
+
+// 学段筛选框切换回调
+const changePeriod = async (e) => {
+  const res = await getQueryMajorsApi({
+    periodId: e
+  })
+  searchData.majors = res.data
+}
+
+// 专业筛选框切换回调
+const changeMajorId = async (e) => {
+  const res = await getQueryClassesApi({
+    majorId: e
+  })
+  searchData.classList = res.data
+}
+
+// 设置管理员按钮回调
+const handleSet = () => {
+  setAdminDialogVisible.value = true
+  getUserData()
+}
+
+// 获取用户列表以设置管理员
+const getUserData = async () => {
+  const res = await getPageUser({
+    currentPage: 1,
+    pageCount: 999
+  })
+  // console.log(res)
+  setAdminFormData.value.list = res.data.list
+}
 //#endregion
 //#endregion
 
 
 /** 监听分页参数的变化 */
 /** 监听分页参数的变化 */
 watch([() => paginationData.currentPage, () => paginationData.pageSize], getTableData, { immediate: true })
 watch([() => paginationData.currentPage, () => paginationData.pageSize], getTableData, { immediate: true })
 
 
+watch([() => paginationData.currentPage, () => paginationData.pageSize], getColleges, { immediate: true })
+
 /** 导出 */
 /** 导出 */
 const handleDownload = () => {
 const handleDownload = () => {
-  // todo 调用导出接口
-  console.log("导出")
+  ElMessageBox.confirm("确认导出吗?", "提示", {
+    confirmButtonText: "确定",
+    cancelButtonText: "取消",
+    type: "warning"
+  }).then(() => {
+    downloadReq()
+  })
+}
+
+// 导出请求
+const downloadReq = async () => {
+  const res = await exportEndorseExcel({
+    keyword: searchData.keyword,
+    collegeId: searchData.collegeId,
+    periodId: searchData.periodId,
+    majorId: searchData.majorId,
+    classId: searchData.classId,
+    startTime: searchData.createTime ? searchData.createTime[0] : undefined,
+    endTime: searchData.createTime ? searchData.createTime[1] : undefined
+  })
+  // console.log(res)
+  // 请求成功返回后,获取到Excel文件的二进制数据
+  const blob = new Blob([res], { type: "application/vnd.ms-excel" })
+  // 创建下载链接
+  const downloadUrl = URL.createObjectURL(blob)
+  // 创建一个隐藏的a标签,设置下载链接和文件名,模拟点击下载
+  const link = document.createElement("a")
+  link.style.display = "none"
+  link.href = downloadUrl
+  link.download = "母校代言.xlsx"
+  document.body.appendChild(link)
+  link.click()
+  document.body.removeChild(link)
 }
 }
 </script>
 </script>
 
 
@@ -157,24 +265,41 @@ const handleDownload = () => {
           <el-form-item prop="keyword" label="关键字">
           <el-form-item prop="keyword" label="关键字">
             <el-input v-model="searchData.keyword" placeholder="请输入" />
             <el-input v-model="searchData.keyword" placeholder="请输入" />
           </el-form-item>
           </el-form-item>
-          <el-form-item prop="college" label="学院">
-            <el-select v-model="searchData.college" placeholder="请选择" style="width: 178px">
-              <el-option label="todo" value="todo" />
+          <el-form-item prop="collegeId" label="学院">
+            <el-select v-model="searchData.collegeId" placeholder="请选择" style="width: 178px" @change="changeCollege">
+              <el-option v-for="item in searchData.colleges" :label="item.name" :value="item.id" :key="item.id" />
             </el-select>
             </el-select>
           </el-form-item>
           </el-form-item>
-          <el-form-item prop="stage" label="学段">
-            <el-select v-model="searchData.stage" placeholder="请选择" style="width: 178px">
-              <el-option label="todo" value="todo" />
+          <el-form-item prop="periodId" label="学段">
+            <el-select
+              v-model="searchData.periodId"
+              placeholder="请选择"
+              style="width: 178px"
+              :disabled="!searchData.collegeId"
+              @change="changePeriod"
+            >
+              <el-option v-for="item in searchData.periods" :label="item.name" :value="item.id" :key="item.id" />
             </el-select>
             </el-select>
           </el-form-item>
           </el-form-item>
-          <el-form-item prop="major" label="专业">
-            <el-select v-model="searchData.major" placeholder="请选择" style="width: 178px">
-              <el-option label="todo" value="todo" />
+          <el-form-item prop="majorId" label="专业">
+            <el-select
+              v-model="searchData.majorId"
+              placeholder="请选择"
+              style="width: 178px"
+              :disabled="!searchData.periodId"
+              @change="changeMajorId"
+            >
+              <el-option v-for="item in searchData.majors" :label="item.name" :value="item.id" :key="item.id" />
             </el-select>
             </el-select>
           </el-form-item>
           </el-form-item>
-          <el-form-item prop="class" label="班级">
-            <el-select v-model="searchData.class" placeholder="请选择" style="width: 178px">
-              <el-option label="todo" value="todo" />
+          <el-form-item prop="classId" label="班级">
+            <el-select
+              v-model="searchData.classId"
+              placeholder="请选择"
+              style="width: 178px"
+              :disabled="!searchData.majorId"
+            >
+              <el-option v-for="item in searchData.classList" :label="item.name" :value="item.id" :key="item.id" />
             </el-select>
             </el-select>
           </el-form-item>
           </el-form-item>
           <el-form-item prop="createTime" label="创建时间">
           <el-form-item prop="createTime" label="创建时间">
@@ -183,7 +308,7 @@ const handleDownload = () => {
               type="datetimerange"
               type="datetimerange"
               start-placeholder="开始时间"
               start-placeholder="开始时间"
               end-placeholder="结束时间"
               end-placeholder="结束时间"
-              value-format="x"
+              value-format="YYYY-MM-DD HH:mm:ss"
             />
             />
           </el-form-item>
           </el-form-item>
           <el-form-item>
           <el-form-item>
@@ -192,27 +317,41 @@ const handleDownload = () => {
           </el-form-item>
           </el-form-item>
         </el-form>
         </el-form>
         <div>
         <div>
-          <el-button type="primary" @click="setAdminDialogVisible = true">设置管理员</el-button>
+          <el-button type="primary" @click="handleSet">设置管理员</el-button>
           <el-button type="primary" @click="dialogVisible = true">新增</el-button>
           <el-button type="primary" @click="dialogVisible = true">新增</el-button>
-          <el-button plain @click="handleDownload">导出</el-button>
+          <el-button plain :disabled="!tableData.length" @click="handleDownload">导出</el-button>
         </div>
         </div>
       </div>
       </div>
       <div class="table-wrapper">
       <div class="table-wrapper">
         <el-table :data="tableData" max-height="500">
         <el-table :data="tableData" max-height="500">
-          <el-table-column type="index" label="序号" width="100" align="center" />
-          <el-table-column prop="todo" label="编号" align="center" />
+          <el-table-column type="index" label="序号" width="50" align="center" />
+          <el-table-column prop="dataNo" label="编号" align="center" show-overflow-tooltip />
           <el-table-column prop="name" label="姓名" align="center" />
           <el-table-column prop="name" label="姓名" align="center" />
-          <el-table-column prop="todo" label="微卡" align="center" />
-          <el-table-column prop="phone" label="手机" align="center" />
-          <el-table-column prop="college" label="学院" align="center" />
-          <el-table-column prop="stage" label="学段" align="center" />
-          <el-table-column prop="major" label="专业" align="center" />
-          <el-table-column prop="class" label="班级" align="center" />
-          <el-table-column prop="todo" label="上榜方式" align="center" />
-          <el-table-column prop="todo" label="照片" align="center" />
-          <el-table-column prop="todo" label="人物简介" align="center" />
-          <el-table-column prop="createTime" label="创建时间" align="center" />
-          <el-table-column fixed="right" label="操作" width="200" align="center">
+          <el-table-column prop="cardNumber" label="微卡" align="center" show-overflow-tooltip />
+          <el-table-column prop="phone" label="手机" align="center" show-overflow-tooltip />
+          <el-table-column prop="collegeName" label="学院" align="center" show-overflow-tooltip />
+          <el-table-column prop="periodName" label="学段" align="center" />
+          <el-table-column prop="majorName" label="专业" align="center" show-overflow-tooltip />
+          <el-table-column prop="className" label="班级" align="center" />
+          <el-table-column prop="preferredMethodName" label="上榜方式" align="center" />
+
+          <el-table-column label="照片" align="center">
+            <template #default="{ row }">
+              <el-image
+                style="width: 100px; height: 100px"
+                :src="row.image"
+                fit="cover"
+                lazy
+                :preview-src-list="[row.image]"
+                hide-on-click-modal
+                preview-teleported
+              />
+            </template>
+          </el-table-column>
+
+          <el-table-column prop="descript" label="人物简介" align="center" />
+          <el-table-column prop="createTime" label="创建时间" align="center" show-overflow-tooltip />
+          <el-table-column fixed="right" label="操作" width="100" align="center">
             <template #default="scope">
             <template #default="scope">
               <el-link type="danger" @click="handleDelete(scope.row)">删除</el-link>
               <el-link type="danger" @click="handleDelete(scope.row)">删除</el-link>
             </template>
             </template>
@@ -240,25 +379,31 @@ const handleDownload = () => {
       width="50%"
       width="50%"
     >
     >
       <el-form ref="formRef" :model="formData" :rules="formRules" label-width="auto" size="large">
       <el-form ref="formRef" :model="formData" :rules="formRules" label-width="auto" size="large">
-        <el-form-item prop="phone" label="卡号">
-          <el-input v-model="formData.phone" placeholder="请输入" />
+        <el-form-item prop="cardNumber" label="卡号">
+          <el-input v-model="formData.cardNumber" placeholder="请输入" />
         </el-form-item>
         </el-form-item>
         <el-form-item prop="name" label="姓名">
         <el-form-item prop="name" label="姓名">
           <el-input v-model="formData.name" placeholder="请输入" />
           <el-input v-model="formData.name" placeholder="请输入" />
         </el-form-item>
         </el-form-item>
-        <el-form-item prop="img" label="照片">
+        <el-form-item prop="image" label="照片">
           <el-upload
           <el-upload
-            v-model:file-list="formData.img"
-            action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
+            ref="elUploadRef"
+            action="/alumni/api/file/uploadFile"
+            :headers="{
+              Token: getToken() || ''
+            }"
+            v-model="formData.image"
             list-type="picture-card"
             list-type="picture-card"
+            :limit="1"
             :on-success="handleAvatarSuccess"
             :on-success="handleAvatarSuccess"
             :on-remove="handleRemove"
             :on-remove="handleRemove"
+            :on-exceed="handleExceed"
           >
           >
             <el-icon><Plus /></el-icon>
             <el-icon><Plus /></el-icon>
           </el-upload>
           </el-upload>
         </el-form-item>
         </el-form-item>
-        <el-form-item prop="introduction" label="个人简介">
-          <el-input v-model="formData.introduction" type="textarea" :rows="5" placeholder="请输入" />
+        <el-form-item prop="descript" label="个人简介">
+          <el-input v-model="formData.descript" type="textarea" :rows="5" placeholder="请输入" />
         </el-form-item>
         </el-form-item>
       </el-form>
       </el-form>
       <template #footer>
       <template #footer>
@@ -275,9 +420,9 @@ const handleDownload = () => {
         label-width="auto"
         label-width="auto"
         size="large"
         size="large"
       >
       >
-        <el-form-item prop="list" label="管理员">
-          <el-select v-model="setAdminFormData.list" placeholder="请选择" multiple>
-            <el-option label="todo" value="todo" />
+        <el-form-item prop="admins" label="管理员">
+          <el-select v-model="setAdminFormData.admins" placeholder="请选择" multiple value-key="name">
+            <el-option v-for="item in setAdminFormData.list" :label="item.name" :value="item" :key="item.id" />
           </el-select>
           </el-select>
         </el-form-item>
         </el-form-item>
       </el-form>
       </el-form>

+ 3 - 0
vite.config.js

@@ -31,7 +31,10 @@ export default ({ mode }) => {
       /** 接口代理 */
       /** 接口代理 */
       proxy: {
       proxy: {
         "/alumni/api": {
         "/alumni/api": {
+          // 线上地址
           target: "https://chtech.ncjti.edu.cn/alumnus/alumni_api",
           target: "https://chtech.ncjti.edu.cn/alumnus/alumni_api",
+          // 本地地址
+          // target: "http://192.168.161.220:8687/",
           ws: true,
           ws: true,
           /** 是否允许跨域 */
           /** 是否允许跨域 */
           changeOrigin: true
           changeOrigin: true