index.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656
  1. <script setup>
  2. import { reactive, ref, watch } from "vue"
  3. import {
  4. getActivityPages,
  5. createInsertActivity,
  6. updateActivity,
  7. getClubPage,
  8. deleteActivityById,
  9. exportActivityExcel,
  10. setImageAdmin,
  11. getDetailInfoById
  12. } from "@/api/activityManagement"
  13. import { getPageUser } from "@/api/schoolEndorsement"
  14. import { getQueryCollegesApi, getQueryPeriodsApi, getQueryMajorsApi, getQueryClassesApi } from "@/api/alumniManager"
  15. import { ElMessage, ElMessageBox } from "element-plus"
  16. import { usePagination } from "@/hooks/usePagination"
  17. import { cloneDeep } from "lodash-es"
  18. import Map from "@/components/Map/index.vue"
  19. import CustomEditor from "@/components/customEditor/index.vue"
  20. const loading = ref(false)
  21. const { paginationData, handleCurrentChange, handleSizeChange } = usePagination()
  22. const mapDialogVisible = ref(false)
  23. //#region 设置管理员
  24. const SET_ADMIN_DEFAULT_FORM_DATA = {
  25. list: [],
  26. admins: []
  27. }
  28. const setAdminDialogVisible = ref(false)
  29. const setAdminFormRef = ref(null)
  30. const setAdminFormData = ref(cloneDeep(SET_ADMIN_DEFAULT_FORM_DATA))
  31. const setAdminFormRules = {
  32. admins: [{ required: true, trigger: "blur", message: "必填" }]
  33. }
  34. const handleSetAdmin = () => {
  35. setAdminFormRef.value?.validate(async (valid, fields) => {
  36. if (!valid) return console.error("表单校验不通过", fields)
  37. // todo 调用设置管理员接口
  38. await setImageAdmin(setAdminFormData.value)
  39. ElMessage.success("操作成功")
  40. setAdminDialogVisible.value = false
  41. resetSetAdminForm()
  42. })
  43. }
  44. const resetSetAdminForm = () => {
  45. setAdminFormRef.value?.clearValidate()
  46. setAdminFormData.value = cloneDeep(SET_ADMIN_DEFAULT_FORM_DATA)
  47. }
  48. //#endregion
  49. //#region 增
  50. const DEFAULT_FORM_DATA = {
  51. id: undefined,
  52. orgId: "",
  53. orgName: "",
  54. organization: [],
  55. theme: "",
  56. themeDetail: "",
  57. poster: "",
  58. activityTime: null,
  59. address: "",
  60. lng: "",
  61. lat: "",
  62. describes: "",
  63. registrationTime: null,
  64. totalNumber: undefined,
  65. scope: "",
  66. phone: "",
  67. isImage: 2
  68. }
  69. const dialogVisible = ref(false)
  70. const formRef = ref(null)
  71. const formData = ref(cloneDeep(DEFAULT_FORM_DATA))
  72. const validatePass = (_rule, value, callback) => {
  73. if (value === "") {
  74. callback(new Error("咨询方式必填"))
  75. }
  76. const reg = /^1[3-9]\d{9}$/
  77. if (!reg.test(value)) {
  78. callback(new Error("咨询方式格式有误,请输入手机号"))
  79. }
  80. }
  81. const formRules = {
  82. orgId: [{ required: true, trigger: "blur", message: "必填" }],
  83. theme: [{ required: true, trigger: "blur", message: "必填" }],
  84. themeDetail: [{ required: true, trigger: "blur", message: "必填" }],
  85. activityTime: [{ required: true, trigger: "blur", message: "必填" }],
  86. address: [{ required: true, trigger: "blur", message: "必填" }],
  87. describes: [{ required: true, trigger: "blur", message: "必填" }],
  88. registrationTime: [{ required: true, trigger: "blur", message: "必填" }],
  89. totalNumber: [{ required: true, trigger: "blur", message: "必填" }],
  90. scope: [{ required: true, trigger: "blur", message: "必填" }],
  91. phone: [{ validator: validatePass, trigger: "blur" }]
  92. }
  93. const handleCreateOrUpdate = () => {
  94. formRef.value?.validate((valid, fields) => {
  95. if (!valid) return console.error("表单校验不通过", fields)
  96. loading.value = true
  97. const api = formData.value.id === undefined ? createInsertActivity : updateActivity
  98. api({
  99. ...formData.value,
  100. startTime: formData.value.activityTime ? formData.value.activityTime[0] : undefined,
  101. endTime: formData.value.activityTime ? formData.value.activityTime[1] : undefined,
  102. lng: "115.831653",
  103. lat: "28.705019",
  104. signsTime: formData.value.registrationTime ? formData.value.registrationTime[0] : undefined,
  105. signeTime: formData.value.registrationTime ? formData.value.registrationTime[1] : undefined
  106. })
  107. .then(() => {
  108. ElMessage.success("操作成功")
  109. dialogVisible.value = false
  110. getTableData()
  111. })
  112. .catch(() => {
  113. loading.value = false
  114. })
  115. })
  116. }
  117. const resetForm = () => {
  118. formRef.value?.clearValidate()
  119. formData.value = cloneDeep(DEFAULT_FORM_DATA)
  120. }
  121. //#endregion
  122. //#region 删
  123. const handleDelete = (row) => {
  124. ElMessageBox.confirm("确认删除?", "提示", {
  125. confirmButtonText: "确定",
  126. cancelButtonText: "取消",
  127. type: "warning"
  128. }).then(() => {
  129. deleteActivityById(row.id).then(() => {
  130. ElMessage.success("删除成功")
  131. getTableData()
  132. })
  133. })
  134. }
  135. //#endregion
  136. //#region 改
  137. const handleUpdate = (row) => {
  138. getOrgList()
  139. getDetailInfo(row.id)
  140. }
  141. const getDetailInfo = async (id) => {
  142. const res = await getDetailInfoById({
  143. id
  144. })
  145. // console.log(res)
  146. formData.value = res.data
  147. formData.value.activityTime = [res.data.startTime, res.data.endTime]
  148. formData.value.registrationTime = [res.data.signsTime, res.data.signeTime]
  149. dialogVisible.value = true
  150. }
  151. //#endregion
  152. //#region 查
  153. const tableData = ref([])
  154. const searchFormRef = ref(null)
  155. const searchData = reactive({
  156. orgName: undefined,
  157. userName: undefined,
  158. theme: undefined,
  159. collegeId: undefined,
  160. colleges: [],
  161. periodId: undefined,
  162. periods: [],
  163. majorId: undefined,
  164. majors: [],
  165. classId: undefined,
  166. classList: [],
  167. statuId: undefined,
  168. createTime: null,
  169. activityTime: null,
  170. registrationTime: null
  171. })
  172. const getTableData = () => {
  173. loading.value = true
  174. getActivityPages({
  175. currentPage: paginationData.currentPage,
  176. pageCount: paginationData.pageSize,
  177. orgName: searchData.orgName,
  178. userName: searchData.userName,
  179. theme: searchData.theme,
  180. collegeId: searchData.collegeId,
  181. periodId: searchData.periodId,
  182. majorId: searchData.majorId,
  183. classId: searchData.classId,
  184. statuId: searchData.statuId,
  185. createStartTime: searchData.createTime ? searchData.createTime[0] : undefined,
  186. createEndTime: searchData.createTime ? searchData.createTime[1] : undefined,
  187. startTime: searchData.activityTime ? searchData.activityTime[0] : undefined,
  188. endTime: searchData.activityTime ? searchData.activityTime[1] : undefined,
  189. signsTime: searchData.registrationTime ? searchData.registrationTime[0] : undefined,
  190. signeTime: searchData.registrationTime ? searchData.registrationTime[1] : undefined
  191. })
  192. .then(({ data }) => {
  193. // console.log(data)
  194. paginationData.total = data.totalCount
  195. tableData.value = data.list
  196. })
  197. .catch(() => {
  198. tableData.value = []
  199. })
  200. .finally(() => {
  201. loading.value = false
  202. })
  203. }
  204. const handleSearch = () => {
  205. paginationData.currentPage === 1 ? getTableData() : (paginationData.currentPage = 1)
  206. }
  207. const resetSearch = () => {
  208. searchFormRef.value?.resetFields()
  209. handleSearch()
  210. }
  211. // 获取学院集合
  212. const getColleges = async () => {
  213. const res = await getQueryCollegesApi()
  214. // console.log(res)
  215. searchData.colleges = res.data
  216. }
  217. // 学院筛选框切换回调
  218. const changeCollege = async (e) => {
  219. const res = await getQueryPeriodsApi({
  220. collegeId: e
  221. })
  222. // console.log(res)
  223. searchData.periods = res.data
  224. }
  225. // 学段筛选框切换回调
  226. const changePeriod = async (e) => {
  227. const res = await getQueryMajorsApi({
  228. periodId: e
  229. })
  230. searchData.majors = res.data
  231. }
  232. // 专业筛选框切换回调
  233. const changeMajorId = async (e) => {
  234. const res = await getQueryClassesApi({
  235. majorId: e
  236. })
  237. searchData.classList = res.data
  238. }
  239. // 新增按钮回调
  240. const handleAdd = () => {
  241. dialogVisible.value = true
  242. getOrgList()
  243. }
  244. // 获取弹窗组织列表
  245. const getOrgList = async () => {
  246. const res = await getClubPage({
  247. currentPage: 1,
  248. pageCount: 999
  249. })
  250. // console.log(res)
  251. formData.value.organization = res.data.list
  252. }
  253. // 切换 弹窗组织筛选框回调
  254. const changeOrg = (e) => {
  255. // console.log(e)
  256. const v = formData.value.organization.findIndex((item) => item.id == e)
  257. formData.value.orgName = formData.value.organization[v].name
  258. }
  259. // 设置管理员按钮回调
  260. const handleSet = () => {
  261. setAdminDialogVisible.value = true
  262. getUserData()
  263. }
  264. // 获取用户列表以设置管理员
  265. const getUserData = async () => {
  266. const res = await getPageUser({
  267. currentPage: 1,
  268. pageCount: 999
  269. })
  270. // console.log(res)
  271. setAdminFormData.value.list = res.data.list
  272. }
  273. const clickInput = () => {
  274. mapDialogVisible.value = true
  275. }
  276. //#endregion
  277. // 富文本编辑器组件自定义事件
  278. const getEditorValue = (data) => {
  279. // console.log(data)
  280. formData.value.themeDetail = data
  281. }
  282. /** 监听分页参数的变化 */
  283. watch([() => paginationData.currentPage, () => paginationData.pageSize], getTableData, { immediate: true })
  284. watch([() => paginationData.currentPage, () => paginationData.pageSize], getColleges, { immediate: true })
  285. /** 导出 */
  286. const handleDownload = () => {
  287. ElMessageBox.confirm("确认导出吗?", "提示", {
  288. confirmButtonText: "确定",
  289. cancelButtonText: "取消",
  290. type: "warning"
  291. }).then(() => {
  292. downloadReq()
  293. })
  294. }
  295. // 导出请求
  296. const downloadReq = async () => {
  297. const res = await exportActivityExcel({
  298. orgName: searchData.orgName,
  299. userName: searchData.userName,
  300. theme: searchData.theme,
  301. collegeId: searchData.collegeId,
  302. periodId: searchData.periodId,
  303. majorId: searchData.majorId,
  304. classId: searchData.classId,
  305. statuId: searchData.statuId,
  306. createStartTime: searchData.createTime ? searchData.createTime[0] : undefined,
  307. createEndTime: searchData.createTime ? searchData.createTime[1] : undefined,
  308. startTime: searchData.activityTime ? searchData.activityTime[0] : undefined,
  309. endTime: searchData.activityTime ? searchData.activityTime[1] : undefined,
  310. signsTime: searchData.registrationTime ? searchData.registrationTime[0] : undefined,
  311. signeTime: searchData.registrationTime ? searchData.registrationTime[1] : undefined
  312. })
  313. // console.log(res)
  314. // 请求成功返回后,获取到Excel文件的二进制数据
  315. const blob = new Blob([res], { type: "application/vnd.ms-excel" })
  316. // 创建下载链接
  317. const downloadUrl = URL.createObjectURL(blob)
  318. // 创建一个隐藏的a标签,设置下载链接和文件名,模拟点击下载
  319. const link = document.createElement("a")
  320. link.style.display = "none"
  321. link.href = downloadUrl
  322. link.download = "活动管理.xlsx"
  323. document.body.appendChild(link)
  324. link.click()
  325. document.body.removeChild(link)
  326. }
  327. // 地图弹窗自定义事件
  328. const getAddressInfo = (data) => {
  329. // console.log(data)
  330. const { address, lat, lng } = data
  331. mapDialogVisible.value = false
  332. formData.value.address = address
  333. formData.value.lat = lat
  334. formData.value.lng = lng
  335. }
  336. </script>
  337. <template>
  338. <div class="app-container">
  339. <el-card v-loading="loading" header="活动管理">
  340. <div class="toolbar-wrapper">
  341. <el-form ref="searchFormRef" :inline="true" :model="searchData">
  342. <el-form-item prop="orgName" label="组织名称">
  343. <el-input v-model="searchData.orgName" placeholder="请输入" />
  344. </el-form-item>
  345. <el-form-item prop="userName" label="发起人">
  346. <el-input v-model="searchData.userName" placeholder="请输入" />
  347. </el-form-item>
  348. <el-form-item prop="theme" label="活动主题">
  349. <el-input v-model="searchData.theme" placeholder="请输入" />
  350. </el-form-item>
  351. <el-form-item prop="collegeId" label="学院">
  352. <el-select v-model="searchData.collegeId" placeholder="请选择" style="width: 178px" @change="changeCollege">
  353. <el-option v-for="item in searchData.colleges" :label="item.name" :value="item.id" :key="item.id" />
  354. </el-select>
  355. </el-form-item>
  356. <el-form-item prop="periodId" label="学段">
  357. <el-select
  358. v-model="searchData.periodId"
  359. placeholder="请选择"
  360. style="width: 178px"
  361. :disabled="!searchData.collegeId"
  362. @change="changePeriod"
  363. >
  364. <el-option v-for="item in searchData.periods" :label="item.name" :value="item.id" :key="item.id" />
  365. </el-select>
  366. </el-form-item>
  367. <el-form-item prop="majorId" label="专业">
  368. <el-select
  369. v-model="searchData.majorId"
  370. placeholder="请选择"
  371. style="width: 178px"
  372. :disabled="!searchData.periodId"
  373. @change="changeMajorId"
  374. >
  375. <el-option v-for="item in searchData.majors" :label="item.name" :value="item.id" :key="item.id" />
  376. </el-select>
  377. </el-form-item>
  378. <el-form-item prop="classId" label="班级">
  379. <el-select
  380. v-model="searchData.classId"
  381. placeholder="请选择"
  382. style="width: 178px"
  383. :disabled="!searchData.majorId"
  384. >
  385. <el-option v-for="item in searchData.classList" :label="item.name" :value="item.id" :key="item.id" />
  386. </el-select>
  387. </el-form-item>
  388. <el-form-item prop="statuId" label="状态">
  389. <el-select v-model="searchData.statuId" placeholder="请选择" style="width: 178px">
  390. <el-option label="全部" value="0" />
  391. <el-option label="未开始" value="1" />
  392. <el-option label="进行中" value="2" />
  393. <el-option label="已结束" value="3" />
  394. </el-select>
  395. </el-form-item>
  396. <el-form-item prop="createTime" label="创建时间">
  397. <el-date-picker
  398. v-model="searchData.createTime"
  399. type="datetimerange"
  400. start-placeholder="开始时间"
  401. end-placeholder="结束时间"
  402. value-format="YYYY-MM-DD HH:mm:ss"
  403. />
  404. </el-form-item>
  405. <el-form-item prop="activityTime" label="活动时间">
  406. <el-date-picker
  407. v-model="searchData.activityTime"
  408. type="datetimerange"
  409. start-placeholder="开始时间"
  410. end-placeholder="结束时间"
  411. value-format="YYYY-MM-DD HH:mm:ss"
  412. />
  413. </el-form-item>
  414. <el-form-item prop="registrationTime" label="报名时间">
  415. <el-date-picker
  416. v-model="searchData.registrationTime"
  417. type="datetimerange"
  418. start-placeholder="开始时间"
  419. end-placeholder="结束时间"
  420. value-format="YYYY-MM-DD HH:mm:ss"
  421. />
  422. </el-form-item>
  423. <el-form-item>
  424. <el-button type="primary" @click="handleSearch">查询</el-button>
  425. <el-button @click="resetSearch" plain>重置</el-button>
  426. </el-form-item>
  427. </el-form>
  428. <div>
  429. <el-button type="primary" @click="handleSet">设置管理员</el-button>
  430. <el-button type="primary" @click="handleAdd">新增</el-button>
  431. <el-button plain @click="handleDownload">导出</el-button>
  432. </div>
  433. </div>
  434. <div class="table-wrapper">
  435. <el-table :data="tableData" max-height="500">
  436. <el-table-column type="index" label="序号" width="80" align="center" />
  437. <el-table-column prop="name" label="发起人" align="center" show-overflow-tooltip />
  438. <el-table-column prop="collegeName" label="学院" align="center" show-overflow-tooltip />
  439. <el-table-column prop="periodName" label="学段" align="center" />
  440. <el-table-column prop="majorName" label="专业" align="center" show-overflow-tooltip />
  441. <el-table-column prop="className" label="班级" align="center" />
  442. <el-table-column prop="orgName" label="所属组织" align="center" />
  443. <el-table-column prop="theme" label="活动主题" align="center" />
  444. <el-table-column label="活动时间" align="center" show-overflow-tooltip>
  445. <template #default="{ row }">
  446. <div>{{ row.startTime }} -- {{ row.endTime }}</div>
  447. </template>
  448. </el-table-column>
  449. <el-table-column label="报名时间" align="center" show-overflow-tooltip>
  450. <template #default="{ row }">
  451. <div>{{ row.signsTime }} -- {{ row.signeTime }}</div>
  452. </template>
  453. </el-table-column>
  454. <el-table-column label="状态" align="center">
  455. <template #default="{ row }">
  456. <div style="color: #366fff" v-if="row.activityStatuName == 1">未开始</div>
  457. <div style="color: #e6a23c" v-if="row.activityStatuName == 2">进行中</div>
  458. <div style="color: #d43030" v-if="row.activityStatuName == 3">已结束</div>
  459. </template>
  460. </el-table-column>
  461. <el-table-column label="已报名" align="center" show-overflow-tooltip>
  462. <template #default="{ row }">
  463. <div style="color: #d43030" v-if="row.reportNumber == 0">未报名</div>
  464. <div style="color: #366fff" v-else>已报名</div>
  465. </template>
  466. </el-table-column>
  467. <el-table-column label="已签到" align="center" show-overflow-tooltip>
  468. <template #default="{ row }">
  469. <div style="color: #d43030" v-if="row.signinNumber == 0">未签到</div>
  470. <div style="color: #366fff" v-else>已签到</div>
  471. </template>
  472. </el-table-column>
  473. <el-table-column prop="createTime" label="创建时间" align="center" show-overflow-tooltip />
  474. <el-table-column fixed="right" label="操作" width="200" align="center">
  475. <template #default="scope">
  476. <el-link type="primary" @click="handleUpdate(scope.row)">详情</el-link>
  477. <el-link type="danger" @click="handleDelete(scope.row)">删除</el-link>
  478. </template>
  479. </el-table-column>
  480. </el-table>
  481. </div>
  482. <div class="pager-wrapper">
  483. <el-pagination
  484. background
  485. :layout="paginationData.layout"
  486. :page-sizes="paginationData.pageSizes"
  487. :total="paginationData.total"
  488. :page-size="paginationData.pageSize"
  489. :currentPage="paginationData.currentPage"
  490. @size-change="handleSizeChange"
  491. @current-change="handleCurrentChange"
  492. />
  493. </div>
  494. </el-card>
  495. <!-- 新增/修改 -->
  496. <el-dialog
  497. v-model="dialogVisible"
  498. :title="formData.id === undefined ? '创建活动' : '编辑活动'"
  499. @closed="resetForm"
  500. width="50%"
  501. top="1vh"
  502. >
  503. <el-form ref="formRef" :model="formData" :rules="formRules" label-width="auto" size="large">
  504. <el-form-item prop="orgId" label="所属组织">
  505. <el-select v-model="formData.orgId" placeholder="请选择" @change="changeOrg">
  506. <el-option v-for="item in formData.organization" :label="item.name" :value="item.id" :key="item.id" />
  507. </el-select>
  508. </el-form-item>
  509. <el-form-item prop="theme" label="活动主题">
  510. <el-input v-model="formData.theme" placeholder="请输入" />
  511. </el-form-item>
  512. <el-form-item prop="themeDetail" label="活动详情">
  513. <CustomEditor v-if="dialogVisible" :value="formData.themeDetail" @change="getEditorValue" />
  514. </el-form-item>
  515. <el-form-item prop="activityTime" label="活动时间">
  516. <el-date-picker
  517. v-model="formData.activityTime"
  518. type="datetimerange"
  519. start-placeholder="开始时间"
  520. end-placeholder="结束时间"
  521. value-format="YYYY-MM-DD HH:mm:ss"
  522. />
  523. </el-form-item>
  524. <el-form-item prop="address" label="活动地址">
  525. <el-input v-model="formData.address" placeholder="请选择活动地址" v-show="false" />
  526. <div class="input_box" :class="{ novalue: !formData.address }" @click="clickInput">
  527. {{ formData.address ? formData.address : "请选择活动地址" }}
  528. </div>
  529. </el-form-item>
  530. <el-form-item prop="describes" label="参与说明">
  531. <el-input v-model="formData.describes" type="textarea" :rows="5" placeholder="请输入" />
  532. </el-form-item>
  533. <el-form-item prop="registrationTime" label="报名时间">
  534. <el-date-picker
  535. v-model="formData.registrationTime"
  536. type="datetimerange"
  537. start-placeholder="开始时间"
  538. end-placeholder="结束时间"
  539. value-format="YYYY-MM-DD HH:mm:ss"
  540. />
  541. </el-form-item>
  542. <el-form-item prop="totalNumber" label="报名总人数">
  543. <el-input v-model.number="formData.totalNumber" type="number" placeholder="请输入" />
  544. </el-form-item>
  545. <el-form-item prop="scope" label="报名范围">
  546. <el-select v-model="formData.scope" placeholder="请选择">
  547. <el-option label="全部" :value="2" />
  548. <el-option label="组织成员" :value="1" />
  549. </el-select>
  550. </el-form-item>
  551. <el-form-item prop="phone" label="咨询方式">
  552. <el-input v-model="formData.phone" placeholder="请输入" />
  553. </el-form-item>
  554. <el-form-item prop="isImage" label="活动相册">
  555. <el-switch v-model="formData.isImage" :active-value="1" :inactive-value="2" />
  556. </el-form-item>
  557. </el-form>
  558. <template #footer>
  559. <el-button @click="dialogVisible = false">取消</el-button>
  560. <el-button type="primary" @click="handleCreateOrUpdate" :loading="loading">确定</el-button>
  561. </template>
  562. </el-dialog>
  563. <!-- 设置管理员 -->
  564. <el-dialog v-model="setAdminDialogVisible" title="设置管理员" @closed="resetSetAdminForm" width="50%">
  565. <el-form
  566. ref="setAdminFormRef"
  567. :model="setAdminFormData"
  568. :rules="setAdminFormRules"
  569. label-width="auto"
  570. size="large"
  571. >
  572. <el-form-item prop="admins" label="管理员">
  573. <el-select v-model="setAdminFormData.admins" placeholder="请选择" multiple value-key="name">
  574. <el-option v-for="item in setAdminFormData.list" :label="item.name" :value="item" :key="item.id" />
  575. </el-select>
  576. </el-form-item>
  577. </el-form>
  578. <template #footer>
  579. <el-button @click="setAdminDialogVisible = false">取消</el-button>
  580. <el-button type="primary" @click="handleSetAdmin" :loading="loading">确定</el-button>
  581. </template>
  582. </el-dialog>
  583. <!-- 地图弹窗 -->
  584. <el-dialog v-model="mapDialogVisible" title="选择地址" width="50%">
  585. <Map @change="getAddressInfo" />
  586. </el-dialog>
  587. </div>
  588. </template>
  589. <style lang="scss" scoped>
  590. .toolbar-wrapper {
  591. margin-bottom: 26px;
  592. }
  593. .table-wrapper {
  594. margin-bottom: 29px;
  595. .el-link {
  596. margin-right: 15px;
  597. }
  598. }
  599. .pager-wrapper {
  600. display: flex;
  601. justify-content: flex-end;
  602. }
  603. .input_box {
  604. padding: 0 10px;
  605. width: 100%;
  606. line-height: 40px;
  607. border-radius: 5px;
  608. border: 1px solid #dcdfe6;
  609. cursor: pointer;
  610. }
  611. .novalue {
  612. color: #a8abb2;
  613. }
  614. </style>