index.vue 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. <script setup>
  2. import { reactive, ref, watch } from "vue"
  3. import { getImagePage, deleteImageById, setImageAdmin } from "@/api/alumniAlbum"
  4. import { ElMessage, ElMessageBox } from "element-plus"
  5. import { usePagination } from "@/hooks/usePagination"
  6. import { getQueryCollegesApi, getQueryPeriodsApi, getQueryMajorsApi, getQueryClassesApi } from "@/api/alumniManager"
  7. import { getPageUser } from "@/api/schoolEndorsement"
  8. import { cloneDeep } from "lodash-es"
  9. const loading = ref(false)
  10. const { paginationData, handleCurrentChange, handleSizeChange } = usePagination()
  11. //#region 删
  12. const handleDelete = (row) => {
  13. ElMessageBox.confirm("确认删除?", "提示", {
  14. confirmButtonText: "确定",
  15. cancelButtonText: "取消",
  16. type: "warning"
  17. }).then(() => {
  18. deleteImageById(row.id).then(() => {
  19. ElMessage.success("删除成功")
  20. getTableData()
  21. })
  22. })
  23. }
  24. //#endregion
  25. //#region 查
  26. const tableData = ref([])
  27. const searchFormRef = ref(null)
  28. const searchData = reactive({
  29. userName: undefined,
  30. orgName: undefined,
  31. collegeId: undefined,
  32. colleges: [],
  33. periodId: undefined,
  34. periods: [],
  35. majorId: undefined,
  36. majors: [],
  37. classId: undefined,
  38. classList: []
  39. })
  40. const getTableData = () => {
  41. loading.value = true
  42. getImagePage({
  43. currentPage: paginationData.currentPage,
  44. pageCount: paginationData.pageSize,
  45. userName: searchData.userName,
  46. orgName: searchData.orgName,
  47. collegeId: searchData.collegeId,
  48. periodId: searchData.periodId,
  49. majorId: searchData.majorId,
  50. classId: searchData.classId
  51. })
  52. .then(({ data }) => {
  53. // console.log(data)
  54. paginationData.total = data.totalCount
  55. tableData.value = data.list
  56. })
  57. .catch(() => {
  58. tableData.value = []
  59. })
  60. .finally(() => {
  61. loading.value = false
  62. })
  63. }
  64. const handleSearch = () => {
  65. paginationData.currentPage === 1 ? getTableData() : (paginationData.currentPage = 1)
  66. }
  67. const resetSearch = () => {
  68. searchFormRef.value?.resetFields()
  69. handleSearch()
  70. }
  71. // 获取学院集合
  72. const getColleges = async () => {
  73. const res = await getQueryCollegesApi()
  74. // console.log(res)
  75. searchData.colleges = res.data
  76. }
  77. // 学院筛选框切换回调
  78. const changeCollege = async (e) => {
  79. const res = await getQueryPeriodsApi({
  80. collegeId: e
  81. })
  82. // console.log(res)
  83. searchData.periods = res.data
  84. }
  85. // 学段筛选框切换回调
  86. const changePeriod = async (e) => {
  87. const res = await getQueryMajorsApi({
  88. periodId: e
  89. })
  90. searchData.majors = res.data
  91. }
  92. // 专业筛选框切换回调
  93. const changeMajorId = async (e) => {
  94. const res = await getQueryClassesApi({
  95. majorId: e
  96. })
  97. searchData.classList = res.data
  98. }
  99. //#endregion
  100. /** 监听分页参数的变化 */
  101. watch([() => paginationData.currentPage, () => paginationData.pageSize], getTableData, { immediate: true })
  102. watch([() => paginationData.currentPage, () => paginationData.pageSize], getColleges, { immediate: true })
  103. /** 设置管理员 */
  104. const handleSet = () => {
  105. setAdminDialogVisible.value = true
  106. getUserData()
  107. }
  108. // 获取用户列表以设置管理员
  109. const getUserData = async () => {
  110. const res = await getPageUser({
  111. currentPage: 1,
  112. pageCount: 999
  113. })
  114. // console.log(res)
  115. setAdminFormData.value.list = res.data.list
  116. }
  117. //#region 设置管理员
  118. const SET_ADMIN_DEFAULT_FORM_DATA = {
  119. list: [],
  120. admins: []
  121. }
  122. const setAdminDialogVisible = ref(false)
  123. const setAdminFormRef = ref(null)
  124. const setAdminFormData = ref(cloneDeep(SET_ADMIN_DEFAULT_FORM_DATA))
  125. const setAdminFormRules = {
  126. admins: [{ required: true, trigger: "blur", message: "必填" }]
  127. }
  128. const handleSetAdmin = () => {
  129. setAdminFormRef.value?.validate(async (valid, fields) => {
  130. if (!valid) return console.error("表单校验不通过", fields)
  131. // todo 调用设置管理员接口
  132. await setImageAdmin(setAdminFormData.value)
  133. ElMessage.success("操作成功")
  134. setAdminDialogVisible.value = false
  135. resetSetAdminForm()
  136. })
  137. }
  138. const resetSetAdminForm = () => {
  139. setAdminFormRef.value?.clearValidate()
  140. setAdminFormData.value = cloneDeep(SET_ADMIN_DEFAULT_FORM_DATA)
  141. }
  142. //#endregion
  143. </script>
  144. <template>
  145. <div class="app-container">
  146. <el-card v-loading="loading" header="校友相册">
  147. <div class="toolbar-wrapper">
  148. <el-form ref="searchFormRef" :inline="true" :model="searchData">
  149. <el-form-item prop="userName" label="姓名">
  150. <el-input v-model="searchData.userName" placeholder="请输入" />
  151. </el-form-item>
  152. <el-form-item prop="orgName" label="组织名称">
  153. <el-input v-model="searchData.orgName" placeholder="请输入" />
  154. </el-form-item>
  155. <el-form-item prop="collegeId" label="学院">
  156. <el-select v-model="searchData.collegeId" placeholder="请选择" style="width: 178px" @change="changeCollege">
  157. <el-option v-for="item in searchData.colleges" :label="item.name" :value="item.id" :key="item.id" />
  158. </el-select>
  159. </el-form-item>
  160. <el-form-item prop="periodId" label="学段">
  161. <el-select
  162. v-model="searchData.periodId"
  163. placeholder="请选择"
  164. style="width: 178px"
  165. :disabled="!searchData.collegeId"
  166. @change="changePeriod"
  167. >
  168. <el-option v-for="item in searchData.periods" :label="item.name" :value="item.id" :key="item.id" />
  169. </el-select>
  170. </el-form-item>
  171. <el-form-item prop="majorId" label="专业">
  172. <el-select
  173. v-model="searchData.majorId"
  174. placeholder="请选择"
  175. style="width: 178px"
  176. :disabled="!searchData.periodId"
  177. @change="changeMajorId"
  178. >
  179. <el-option v-for="item in searchData.majors" :label="item.name" :value="item.id" :key="item.id" />
  180. </el-select>
  181. </el-form-item>
  182. <el-form-item prop="classId" label="班级">
  183. <el-select
  184. v-model="searchData.classId"
  185. placeholder="请选择"
  186. style="width: 178px"
  187. :disabled="!searchData.majorId"
  188. >
  189. <el-option v-for="item in searchData.classList" :label="item.name" :value="item.id" :key="item.id" />
  190. </el-select>
  191. </el-form-item>
  192. <el-form-item>
  193. <el-button type="primary" @click="handleSearch">查询</el-button>
  194. <el-button @click="resetSearch" plain>重置</el-button>
  195. </el-form-item>
  196. </el-form>
  197. <div>
  198. <el-button plain @click="handleSet">设置管理员</el-button>
  199. </div>
  200. </div>
  201. <div class="table-wrapper">
  202. <el-table :data="tableData" max-height="500">
  203. <el-table-column type="index" label="序号" width="80" align="center" />
  204. <el-table-column prop="name" label="姓名" align="center" />
  205. <el-table-column prop="collegeName" label="学院" align="center" />
  206. <el-table-column prop="periodName" label="学段" align="center" />
  207. <el-table-column prop="majorName" label="专业" align="center" />
  208. <el-table-column prop="majorName" label="班级" align="center" />
  209. <el-table-column prop="categoryName" label="分类" align="center" />
  210. <el-table-column prop="orgName" label="组织" align="center" />
  211. <el-table-column label="图片" align="center">
  212. <template #default="{ row }">
  213. <el-image
  214. style="width: 100px; height: 100px"
  215. :src="row.images[0]"
  216. fit="cover"
  217. lazy
  218. :preview-src-list="row.images"
  219. hide-on-click-modal
  220. preview-teleported
  221. />
  222. </template>
  223. </el-table-column>
  224. <el-table-column prop="createTime" label="创建时间" align="center" show-overflow-tooltip />
  225. <el-table-column fixed="right" label="操作" width="200" align="center">
  226. <template #default="scope">
  227. <el-link type="danger" @click="handleDelete(scope.row)">删除</el-link>
  228. </template>
  229. </el-table-column>
  230. </el-table>
  231. </div>
  232. <div class="pager-wrapper">
  233. <el-pagination
  234. background
  235. :layout="paginationData.layout"
  236. :page-sizes="paginationData.pageSizes"
  237. :total="paginationData.total"
  238. :page-size="paginationData.pageSize"
  239. :currentPage="paginationData.currentPage"
  240. @size-change="handleSizeChange"
  241. @current-change="handleCurrentChange"
  242. />
  243. </div>
  244. </el-card>
  245. <!-- 设置管理员 -->
  246. <el-dialog v-model="setAdminDialogVisible" title="设置管理员" @closed="resetSetAdminForm" width="50%">
  247. <el-form
  248. ref="setAdminFormRef"
  249. :model="setAdminFormData"
  250. :rules="setAdminFormRules"
  251. label-width="auto"
  252. size="large"
  253. >
  254. <el-form-item prop="admins" label="管理员">
  255. <el-select v-model="setAdminFormData.admins" placeholder="请选择" multiple value-key="name">
  256. <el-option v-for="item in setAdminFormData.list" :label="item.name" :value="item" :key="item.id" />
  257. </el-select>
  258. </el-form-item>
  259. </el-form>
  260. <template #footer>
  261. <el-button @click="setAdminDialogVisible = false">取消</el-button>
  262. <el-button type="primary" @click="handleSetAdmin" :loading="loading">确定</el-button>
  263. </template>
  264. </el-dialog>
  265. </div>
  266. </template>
  267. <style lang="scss" scoped>
  268. .toolbar-wrapper {
  269. margin-bottom: 26px;
  270. }
  271. .table-wrapper {
  272. margin-bottom: 29px;
  273. .el-link {
  274. margin-right: 15px;
  275. }
  276. }
  277. .pager-wrapper {
  278. display: flex;
  279. justify-content: flex-end;
  280. }
  281. </style>