account.vue 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327
  1. <template>
  2. <div class="content-box">
  3. <div class="left">
  4. <!-- <el-icon :size="23" class="camera"><VideoCameraFilled /></el-icon> -->
  5. <span class="cameratxt">账号管理</span>
  6. </div>
  7. <div class="scroll">
  8. <div class="middle">
  9. <div class="filter">
  10. <div class="condition">
  11. <span>状态 </span>
  12. <el-select
  13. style="width: 180px"
  14. v-model="searchInput.status"
  15. class="m-2"
  16. placeholder="选择状态"
  17. :clearable="true"
  18. @change="searchBtn"
  19. >
  20. <el-option label="正常" value="1" />
  21. <el-option label="冻结" value="2" />
  22. </el-select>
  23. </div>
  24. <div class="condition">
  25. <span>真实姓名 </span>
  26. <el-input
  27. clearable
  28. v-model.trim="searchInput.name"
  29. class="w-50 m-2"
  30. placeholder="请输入姓名"
  31. style="width: 180px"
  32. @clear="searchBtn"
  33. />
  34. </div>
  35. <div class="condition">
  36. <span>创建日期 </span>
  37. <el-date-picker
  38. v-model="searchInput.createTime"
  39. type="daterange"
  40. range-separator="-"
  41. start-placeholder="起始时间"
  42. end-placeholder="结束时间"
  43. format="YYYY-MM-DD"
  44. value-format="YYYY-MM-DD"
  45. :prefix-icon="Calendar"
  46. placeholder="请选择日期"
  47. style="width: 240px"
  48. @change="searchBtn"
  49. />
  50. </div>
  51. <el-button
  52. style="margin-left: 20px"
  53. color="rgba(0, 97, 255, 1)"
  54. type="primary"
  55. class="search"
  56. @click="searchBtn"
  57. ><el-icon><Search /></el-icon> <span>查询</span></el-button
  58. >
  59. </div>
  60. <!-- 按钮列表 -->
  61. <div class="gongneng">
  62. <el-button
  63. type="primary"
  64. v-if="flagBtn.tianjia == 1"
  65. color="rgba(0, 97, 255, 1)"
  66. @click="addlist"
  67. >添加</el-button
  68. >
  69. </div>
  70. </div>
  71. <div class="footer" v-loading="loading">
  72. <el-table
  73. :row-class-name="tableRowClassName"
  74. :data="tableData.list"
  75. @selection-change="handleSelectionChange"
  76. style="width: 100%"
  77. :header-cell-style="{
  78. background: 'rgba(240, 243, 247, 1)',
  79. height: '50px',
  80. border: 0,
  81. }"
  82. >
  83. <!-- <el-table-column align="center" type="selection" width="80" /> -->
  84. <el-table-column
  85. width="120"
  86. align="center"
  87. label="序号"
  88. type="index"
  89. index="1"
  90. />
  91. <el-table-column align="center" prop="userNumber" label="账号" />
  92. <el-table-column align="center" prop="adminName" label="角色">
  93. <template #default="{ row }">
  94. <span>{{ row.adminMenuName }}</span>
  95. </template>
  96. </el-table-column>
  97. <el-table-column
  98. align="center"
  99. prop="adminName"
  100. label="可管理部门"
  101. width="230"
  102. >
  103. <template #default="{ row }">
  104. <div class="ul" style="display: flex; flex-wrap: wrap">
  105. <el-tag
  106. v-for="i in row.checkOrg"
  107. :key="i.name"
  108. style="margin: 5px"
  109. type="primary"
  110. >{{ i.name }}</el-tag
  111. >
  112. </div>
  113. <!-- <div
  114. class="ul"
  115. v-if="row.checkOrg.length <= 5"
  116. style="display: flex; flex-wrap: wrap"
  117. >
  118. <el-tag
  119. v-for="i in row.checkOrg"
  120. style="margin: 5px"
  121. type="primary"
  122. >{{ i.name }}</el-tag
  123. >
  124. </div>
  125. <div class="ul" v-else style="display: flex; flex-wrap: wrap">
  126. <el-tag v-for="i in 3" style="margin: 5px" type="primary">{{
  127. row.checkOrg[i].name
  128. }}</el-tag>
  129. <el-tooltip
  130. class="box-item"
  131. effect="light"
  132. placement="right"
  133. popper-class="tag_title"
  134. trigger="hover"
  135. >
  136. <template #content>
  137. <el-tag
  138. v-for="i in row.checkOrg"
  139. style="margin: 5px"
  140. type="primary"
  141. >{{ i.name }}</el-tag
  142. >
  143. </template>
  144. <el-tag style="margin: 5px; cursor: pointer" type="primary"
  145. >...</el-tag>
  146. </el-tooltip>
  147. </div> -->
  148. </template>
  149. </el-table-column>
  150. <el-table-column align="center" prop="name" label="真实姓名" />
  151. <el-table-column align="center" prop="phoneNumber" label="手机号码" />
  152. <el-table-column align="center" prop="department" label="身份">
  153. <template #default="{ row }">
  154. <span v-if="row.department == 0">其他</span>
  155. <span v-if="row.department == 1">学生</span>
  156. <span v-if="row.department == 4">教职工</span>
  157. <span v-if="row.department == 5">校友</span>
  158. <span v-if="row.department == 6">访客应用身份</span>
  159. <span v-if="row.department == 7">临时人员</span>
  160. </template>
  161. </el-table-column>
  162. <el-table-column align="center" prop="createTime" label="创建时间" />
  163. <el-table-column align="center" label="操作" width="180">
  164. <template #default="scope">
  165. <div class="options">
  166. <div
  167. v-if="flagBtn.bianji == 1"
  168. class="look"
  169. @click="edit(scope.row)"
  170. >
  171. 编辑
  172. </div>
  173. <el-popconfirm
  174. v-if="flagBtn.shanchu == 1"
  175. width="220"
  176. confirm-button-text="确认"
  177. cancel-button-text="取消"
  178. :icon="InfoFilled"
  179. icon-color="#f89626"
  180. title="是否删除此账号?"
  181. @confirm="del(scope.row)"
  182. @cancel="cancelEvent"
  183. >
  184. <template #reference>
  185. <div class="del">删除</div>
  186. </template>
  187. </el-popconfirm>
  188. </div>
  189. </template>
  190. </el-table-column>
  191. </el-table>
  192. <!-- 分页组件 -->
  193. <div class="pageSize">
  194. <span></span>
  195. <el-pagination
  196. background
  197. :current-page="currentPage"
  198. :page-size="pageSize"
  199. layout="total, prev, pager, next, jumper, slot"
  200. :total="total"
  201. @update:current-page="handleCurrentChange"
  202. />
  203. </div>
  204. <!-- 添加账号弹窗 -->
  205. <el-dialog
  206. class="addStaff"
  207. v-model="addDialogVisible"
  208. :close-on-click-modal="false"
  209. :close-on-press-escape="false"
  210. :title="dialongTitle"
  211. align-center
  212. width="609"
  213. :before-close="cancelAdd"
  214. >
  215. <el-form
  216. ref="ruleFormRef"
  217. :model="ruleForm"
  218. :rules="rules"
  219. label-width="100px"
  220. class="demo-ruleForm"
  221. :size="formSize"
  222. label-position="left"
  223. status-icon
  224. >
  225. <el-form-item label="微校卡号 :" prop="cardNum">
  226. <el-select
  227. v-model="ruleForm.cardNum"
  228. popper-class="more-tag-data"
  229. filterable
  230. remote
  231. :remote-method="conteactMethod"
  232. placeholder="请选择微校卡号"
  233. style="width: 400px"
  234. @change="schoolCardChange"
  235. >
  236. <el-option
  237. v-for="item in schoolCardList"
  238. :key="item.id"
  239. :label="item.cardNumber"
  240. :value="item.cardNumber"
  241. style="padding: 0"
  242. >
  243. <div
  244. style="float: left; width: 100%; padding: 0 20px"
  245. @click="schoolCardChanges(item)"
  246. >
  247. <span style="display: inline-block; width: 80px">{{
  248. item.userName
  249. }}</span>
  250. <span style="display: inline-block; width: 120px"
  251. >部门 : {{ item.departmentName }}</span
  252. >
  253. <span>微校卡号 : {{ item.cardNumber }}</span>
  254. </div>
  255. </el-option>
  256. <template #footer>
  257. <div class="addStudentMore">
  258. <el-button
  259. v-if="
  260. schoolCardPage < schoolCardTotalPage &&
  261. schoolCardTotalPage != 0
  262. "
  263. @click="addschoolCardListMore"
  264. >加载更多+</el-button
  265. >
  266. </div>
  267. </template>
  268. </el-select>
  269. </el-form-item>
  270. <el-form-item label="姓名 :" prop="corpnName">
  271. <el-input
  272. v-model.trim="ruleForm.corpnName"
  273. placeholder="请输入姓名"
  274. clearable
  275. style="width: 400px"
  276. :disabled="true"
  277. />
  278. </el-form-item>
  279. <el-form-item label="身份 :" prop="department">
  280. <el-select
  281. style="width: 400px"
  282. v-model="ruleForm.department"
  283. class="m-2"
  284. placeholder="请选择身份"
  285. :disabled="true"
  286. >
  287. <el-option label="学生" value="1" />
  288. <el-option label="教职工" value="4" />
  289. <el-option label="校友" value="5" />
  290. <el-option label="访客应用身份" value="6" />
  291. <el-option label="临时人员" value="7" />
  292. <el-option label="其他" value="0" />
  293. </el-select>
  294. </el-form-item>
  295. <el-form-item label="手机号码 :" prop="corpnPhone">
  296. <el-input
  297. v-model.trim="ruleForm.corpnPhone"
  298. placeholder="请输入手机号码"
  299. clearable
  300. style="width: 400px"
  301. :disabled="true"
  302. />
  303. </el-form-item>
  304. <el-form-item label="用户名 :" prop="adminName">
  305. <el-input
  306. v-model.trim="ruleForm.adminName"
  307. placeholder="请输入用户名"
  308. clearable
  309. style="width: 400px"
  310. />
  311. </el-form-item>
  312. <el-form-item label="密码 :" prop="password">
  313. <el-input
  314. v-model.trim="ruleForm.password"
  315. placeholder="请输入密码"
  316. clearable
  317. style="width: 400px"
  318. />
  319. </el-form-item>
  320. <el-form-item label="角色 :" prop="adminMenuId">
  321. <el-tree
  322. style="max-width: 600px; width: 400px"
  323. :data="roleData"
  324. ref="editMemberTree"
  325. show-checkbox
  326. default-expand-all
  327. check-strictly
  328. node-key="id"
  329. :props="defaultProps"
  330. @check="editMemberCheckChange"
  331. />
  332. </el-form-item>
  333. <el-form-item label="部门 :" prop="icCard">
  334. <el-select
  335. style="width: 400px"
  336. v-model="ruleForm.icCard"
  337. class="m-2"
  338. placeholder="请选择部门"
  339. multiple
  340. filterable
  341. remote
  342. reserve-keyword
  343. remote-show-suffix
  344. :clearable="true"
  345. >
  346. <el-option
  347. v-for="i in departmentList"
  348. :label="i.name"
  349. :key="i.id"
  350. :value="i.id"
  351. />
  352. </el-select>
  353. </el-form-item>
  354. <el-form-item class="options">
  355. <el-button
  356. color="rgba(0, 97, 255, 1)"
  357. class="queding"
  358. type="primary"
  359. @click="submitAdd(ruleFormRef)"
  360. >
  361. 确定
  362. </el-button>
  363. <el-button @click="cancelAdd(ruleFormRef)">取消</el-button>
  364. </el-form-item>
  365. </el-form>
  366. </el-dialog>
  367. </div>
  368. </div>
  369. </div>
  370. </template>
  371. <script setup>
  372. import {
  373. ref,
  374. watch,
  375. reactive,
  376. nextTick,
  377. onBeforeMount,
  378. onUnmounted,
  379. } from "vue";
  380. import { useRouter } from "vue-router";
  381. import { ElMessage, ElMessageBox } from "element-plus";
  382. import { Calendar } from "@element-plus/icons-vue";
  383. import { dayjs } from "element-plus";
  384. import lodash, { reduce } from "lodash";
  385. import axios from "axios";
  386. import { useStore } from "vuex";
  387. const store = useStore();
  388. const router = useRouter();
  389. // 表格数据
  390. const loading = ref(false);
  391. const tableData = reactive({
  392. list: [],
  393. });
  394. const activeIndex = ref(); // 默认跳转路由
  395. const dialongTitle = ref("新增账号"); // 弹窗标题
  396. const searchInput = reactive({
  397. status: "",
  398. name: "",
  399. createTime: "",
  400. }); // 搜索按钮数据
  401. const flagBtn = ref(); // 按钮权限
  402. const departmentList = ref(); // 部门
  403. watch(
  404. () => searchInput.createTime,
  405. (newVal, oldVal) => {
  406. console.log("监听时间:", newVal);
  407. if (newVal == null) {
  408. getList();
  409. }
  410. },
  411. );
  412. const currentPage = ref(1); // 当前页
  413. const pageSize = ref(10);
  414. const total = ref(); // 当前总数
  415. const api = ref("");
  416. const schoolCardList = ref();
  417. const schoolCardSearch = ref(); // 微信卡号下拉框搜索词
  418. const schoolCardPage = ref(1);
  419. const schoolCardSize = ref(20);
  420. const schoolCardTotalPage = ref();
  421. const addDialogVisible = ref(false); // 控制添加账号弹窗
  422. const editMemberTree = ref(); // 角色ref
  423. const roleData = ref(); // 角色列表
  424. const defaultProps = ref({
  425. children: "children",
  426. label: "name",
  427. });
  428. // 表单数据
  429. const formSize = ref("default");
  430. const ruleFormRef = ref();
  431. const ruleForm = reactive({
  432. adminMenuId: "",
  433. cardNum: "",
  434. corpnName: "",
  435. corpnPhone: "",
  436. adminName: "",
  437. password: "",
  438. department: "",
  439. icCard: "",
  440. id: "",
  441. usersId: "",
  442. });
  443. var checkUserName = (rule, value, callback) => {
  444. if (!value) {
  445. return callback(new Error("请输入用户名)"));
  446. }
  447. var reg = /^[a-zA-Z0-9]{5,16}$/;
  448. if (!reg.test(value)) {
  449. callback(new Error("必须为5-16个数字或字母!"));
  450. } else {
  451. callback();
  452. }
  453. };
  454. var checkFullName = (rule, value, callback) => {
  455. if (!value) {
  456. return callback(new Error("请输入姓名"));
  457. }
  458. var reg =
  459. /^[\u3400-\u4db5\u4e00-\u9fa5\u9fa6-\u9fbb\u{f900}-\u{faff}]{2,6}$/u;
  460. if (!reg.test(value)) {
  461. callback(new Error("必须为2-6个汉字!"));
  462. } else {
  463. callback();
  464. }
  465. };
  466. var checkPhone = (rule, value, callback) => {
  467. if (!value) {
  468. return callback(new Error("请输入手机号"));
  469. }
  470. setTimeout(() => {
  471. var reg = /^1[3456789]\d{9}$/;
  472. if (!reg.test(value)) {
  473. callback(new Error("手机号格式不对"));
  474. } else {
  475. callback();
  476. }
  477. }, 100);
  478. };
  479. // 表单验证
  480. const rules = reactive({
  481. corpnName: [
  482. { required: true, message: "姓名不能为空", trigger: "blur" },
  483. { validator: checkFullName, trigger: "blur" },
  484. ],
  485. adminName: [
  486. { required: true, message: "用户名不能为空", trigger: "blur" },
  487. { validator: checkUserName, trigger: "blur" },
  488. ],
  489. cardNum: [{ required: true, message: "微校卡号不能为空", trigger: "blur" }],
  490. // ^(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*,\._\+(){}])[0-9a-zA-Z!@#$%^&*,\\._\+(){}]{8,20}$
  491. password: [
  492. {
  493. required: true,
  494. message: "密码不能为空",
  495. trigger: "blur",
  496. },
  497. {
  498. min: 8,
  499. max: 20,
  500. pattern:
  501. // /^(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*,\._\+(){}])[0-9a-zA-Z!@#$%^&*,\\._\+(){}]{8,20}$/,
  502. /^(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z]).{8,20}$/,
  503. message: "请输入8-20位正确密码(大小写字母·数字·(字符可选填))",
  504. trigger: "blur",
  505. },
  506. ],
  507. againPass: [
  508. {
  509. required: true,
  510. message: "确认密码不能为空",
  511. trigger: "blur",
  512. },
  513. {
  514. min: 8,
  515. max: 20,
  516. pattern:
  517. /^(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*,\._\+(){}])[0-9a-zA-Z!@#$%^&*,\\._\+(){}]{8,20}$/,
  518. message: "请输入8-20位正确密码(大小写字母·字符·数字)",
  519. trigger: "blur",
  520. },
  521. ],
  522. adminMenuId: [
  523. {
  524. required: true,
  525. message: "角色不能为空",
  526. trigger: "blur",
  527. },
  528. ],
  529. department: [
  530. {
  531. required: true,
  532. message: "部门不能为空",
  533. trigger: "blur",
  534. },
  535. ],
  536. corpnPhone: [
  537. {
  538. required: true,
  539. message: "电话号码不能为空",
  540. trigger: "blur",
  541. },
  542. // { validator: checkPhone, trigger: "blur" },
  543. ],
  544. icCard: [{ required: true, message: "部门不能为空", trigger: "blur" }],
  545. // desc: [{ required: true, message: "Please input activity form", trigger: "blur" }],
  546. });
  547. // 获取账户列表
  548. const getList = async () => {
  549. loading.value = true;
  550. let data = {
  551. page: currentPage.value, // 当前页
  552. size: pageSize.value, // 一页数据条数
  553. permissionSettingId: sessionStorage.getItem("permissionSettingId"),
  554. keyWord: searchInput.name,
  555. status: searchInput.status,
  556. };
  557. if (searchInput.createTime) {
  558. data.startTime = searchInput.createTime[0];
  559. data.endTime = searchInput.createTime[1];
  560. }
  561. let res = await axios({
  562. method: "get",
  563. url: api.value + "/admin/getListPage",
  564. headers: {
  565. token: sessionStorage.getItem("token"),
  566. user_head: sessionStorage.getItem("user_head"),
  567. },
  568. params: data,
  569. });
  570. console.log(res, "账号信息");
  571. if (res.data.code == 200) {
  572. res.data.data.records.forEach((item) => {
  573. if (item.adminMenu) {
  574. item.adminMenuName = item.adminMenu.name;
  575. } else {
  576. item.adminMenuName = "";
  577. }
  578. });
  579. res.data.data.records.forEach((i) => {});
  580. tableData.list = res.data.data.records;
  581. total.value = res.data.data.total;
  582. loading.value = false;
  583. // ElMessage({
  584. // type: "success",
  585. // showClose: true,
  586. // message: res.data.message,
  587. // center: true,
  588. // });
  589. } else {
  590. loading.value = false;
  591. if (res.data.code == 500) {
  592. console.log(res.data);
  593. if (res.data.message == "无效token,请重新登入") {
  594. router.push({ path: "/login" });
  595. }
  596. }
  597. ElMessage({
  598. type: "error",
  599. showClose: true,
  600. message: res.data.message,
  601. center: true,
  602. });
  603. }
  604. };
  605. // 部门数据
  606. const departmentData = async () => {
  607. let res = await axios({
  608. method: "post",
  609. url: api.value + "/organization/queryAll",
  610. headers: {
  611. token: sessionStorage.getItem("token"),
  612. user_head: sessionStorage.getItem("user_head"),
  613. },
  614. });
  615. console.log(res, "部门数据");
  616. if (res.data.code == 200) {
  617. departmentList.value = res.data.data;
  618. } else {
  619. ElMessage({
  620. type: "error",
  621. showClose: true,
  622. message: res.data.message,
  623. center: true,
  624. });
  625. }
  626. };
  627. // 微校卡号数据
  628. const schoolData = async () => {
  629. schoolCardPage.value = 1;
  630. let data = {
  631. permissionSettingId: sessionStorage.getItem("permissionSettingId"),
  632. page: schoolCardPage.value,
  633. size: schoolCardSize.value,
  634. keyWord: schoolCardSearch.value,
  635. };
  636. let res = await axios({
  637. method: "post",
  638. url: api.value + "/admin/getUsersPage",
  639. headers: {
  640. token: sessionStorage.getItem("token"),
  641. user_head: sessionStorage.getItem("user_head"),
  642. },
  643. data: data,
  644. });
  645. console.log(res, "微校卡号人");
  646. if (res.data.code == 200) {
  647. schoolCardList.value = res.data.data.records;
  648. schoolCardTotalPage.value = res.data.data.pages;
  649. } else {
  650. ElMessage({
  651. type: "error",
  652. showClose: true,
  653. message: res.data.message,
  654. center: true,
  655. });
  656. }
  657. };
  658. // 微校卡号搜索
  659. const conteactMethod = (query) => {
  660. console.log(query);
  661. schoolCardSearch.value = query;
  662. schoolData();
  663. };
  664. // 加载更多微校卡号
  665. const addschoolCardListMore = async () => {
  666. if (schoolCardPage.value < schoolCardTotalPage.value) {
  667. schoolCardPage.value++;
  668. // console.log(conteactListInput.value, "滚动里面");
  669. let data = {
  670. permissionSettingId: sessionStorage.getItem("permissionSettingId"),
  671. page: schoolCardPage.value,
  672. size: schoolCardSize.value,
  673. keyWord: schoolCardSearch.value,
  674. };
  675. let res = await axios({
  676. method: "post",
  677. url: api.value + "/admin/getUsersPage",
  678. headers: {
  679. token: sessionStorage.getItem("token"),
  680. user_head: sessionStorage.getItem("user_head"),
  681. },
  682. data: data,
  683. });
  684. console.log(res, "微校卡号人员加载更多");
  685. if (res.data.code == 200) {
  686. // schoolCardList.value = res.data.data.records;
  687. // schoolCardTotalPage.value = res.data.data.pages;
  688. schoolCardList.value = [
  689. ...schoolCardList.value,
  690. ...res.data.data.records,
  691. ];
  692. } else {
  693. ElMessage({
  694. type: "error",
  695. showClose: true,
  696. message: res.data.message,
  697. center: true,
  698. });
  699. }
  700. } else {
  701. console.log("数据全部加载完成");
  702. }
  703. };
  704. // 改变微校卡号
  705. const schoolCardChange = async (value) => {
  706. console.log(value);
  707. // let data = {
  708. // permissionSettingId: sessionStorage.getItem("permissionSettingId"),
  709. // page: 1,
  710. // size: 20,
  711. // keyWord: value,
  712. // };
  713. // let res = await axios({
  714. // method: "post",
  715. // url: api.value + "/admin/getUsersPage",
  716. // headers: {
  717. // token: sessionStorage.getItem("token"),
  718. // user_head: sessionStorage.getItem("user_head"),
  719. // },
  720. // data: data,
  721. // });
  722. // console.log(res, "微校卡号人");
  723. // if (res.data.code == 200) {
  724. // let resdata = res;
  725. // ruleForm.corpnName = res.data.data.records[0].userName;
  726. // ruleForm.corpnPhone = res.data.data.records[0].phone;
  727. // ruleForm.department = res.data.data.records[0].department;
  728. // } else {
  729. // ElMessage({
  730. // type: "error",
  731. // showClose: true,
  732. // message: res.data.message,
  733. // center: true,
  734. // });
  735. // }
  736. };
  737. const schoolCardChanges = async (row) => {
  738. ruleForm.corpnName = row.userName;
  739. ruleForm.corpnPhone = row.phone;
  740. ruleForm.department = row.department;
  741. };
  742. // 角色列表数据
  743. const roleList = async () => {
  744. let res = await axios({
  745. method: "get",
  746. url: api.value + "/admin-menu/getRole",
  747. headers: {
  748. token: sessionStorage.getItem("token"),
  749. user_head: sessionStorage.getItem("user_head"),
  750. },
  751. });
  752. console.log(res, "角色列表");
  753. if (res.data.code == 200) {
  754. roleData.value = res.data.data;
  755. } else {
  756. ElMessage({
  757. type: "error",
  758. showClose: true,
  759. message: res.data.message,
  760. center: true,
  761. });
  762. }
  763. };
  764. // 搜索功能
  765. const searchBtn = lodash.debounce(async () => {
  766. getList();
  767. }, 300);
  768. // 添加账号
  769. const addlist = () => {
  770. dialongTitle.value = "新增账号";
  771. addDialogVisible.value = true;
  772. ruleForm.corpnPhone = "";
  773. ruleForm.corpnName = "";
  774. ruleForm.adminName = "";
  775. ruleForm.cardNum = "";
  776. ruleForm.adminMenuId = "";
  777. ruleForm.password = "";
  778. ruleForm.department = "";
  779. ruleForm.icCard = "";
  780. ruleForm.id = "";
  781. ruleForm.usersId = "";
  782. nextTick(() => {
  783. editMemberTree.value.setCheckedKeys([]);
  784. });
  785. };
  786. // 勾选角色
  787. const editMemberCheckChange = (data, nodes) => {
  788. // console.log(data, nodes, "勾选角色");
  789. editMemberTree.value.setCheckedKeys([]);
  790. nextTick(() => {
  791. editMemberTree.value.setCheckedKeys([data.id]);
  792. ruleForm.adminMenuId = data.id;
  793. });
  794. };
  795. // 取消添加员工
  796. const cancelAdd = () => {
  797. addDialogVisible.value = false;
  798. ruleFormRef.value.resetFields();
  799. };
  800. //编辑按钮
  801. const edit = (row) => {
  802. console.log(row);
  803. dialongTitle.value = "编辑信息";
  804. addDialogVisible.value = true;
  805. ruleForm.id = row.id;
  806. ruleForm.corpnPhone = row.phoneNumber;
  807. ruleForm.corpnName = row.name;
  808. ruleForm.adminName = row.userNumber;
  809. ruleForm.cardNum = row.cardNumber;
  810. ruleForm.adminMenuId = row.adminMenu.id;
  811. ruleForm.password = row.passWord;
  812. ruleForm.department = row.department;
  813. ruleForm.usersId = row.usersId;
  814. if (row.checkOrg) {
  815. let arr = [];
  816. row.checkOrg.forEach((i) => {
  817. arr.push(i.id);
  818. });
  819. ruleForm.icCard = arr;
  820. }
  821. nextTick(() => {
  822. if (row.adminMenu) {
  823. editMemberTree.value.setCheckedKeys([row.adminMenu.id]);
  824. }
  825. });
  826. };
  827. // 确认添加员工
  828. const submitAdd = lodash.debounce(async (formEl) => {
  829. if (!formEl) return;
  830. await formEl.validate(async (valid, fields) => {
  831. if (valid) {
  832. if (ruleForm.id) {
  833. let data = {
  834. permissionSettingId: sessionStorage.getItem("permissionSettingId"),
  835. cardNumber: ruleForm.cardNum,
  836. admin: {
  837. adminMenuId: ruleForm.adminMenuId,
  838. // usersId: ruleForm.cardNum,
  839. name: ruleForm.corpnName,
  840. userNumber: ruleForm.adminName,
  841. passWord: ruleForm.password,
  842. phoneNumber: ruleForm.corpnPhone,
  843. department: ruleForm.department,
  844. checkOrg: ruleForm.icCard.join(","),
  845. id: ruleForm.id,
  846. usersId: ruleForm.usersId,
  847. },
  848. };
  849. let res = await axios({
  850. method: "post",
  851. url: api.value + "/admin/update",
  852. headers: {
  853. token: sessionStorage.getItem("token"),
  854. user_head: sessionStorage.getItem("user_head"),
  855. },
  856. data: data,
  857. });
  858. console.log(res, "编辑账号");
  859. if (res.data.code == 200) {
  860. getList();
  861. ElMessage({
  862. type: "success",
  863. showClose: true,
  864. message: res.data.message,
  865. center: true,
  866. });
  867. addDialogVisible.value = false;
  868. ruleFormRef.value.resetFields();
  869. } else {
  870. ElMessage({
  871. type: "error",
  872. showClose: true,
  873. message: res.data.message,
  874. center: true,
  875. });
  876. }
  877. } else {
  878. let data = {
  879. permissionSettingId: sessionStorage.getItem("permissionSettingId"),
  880. adminMenuId: ruleForm.adminMenuId,
  881. cardNumber: ruleForm.cardNum,
  882. name: ruleForm.corpnName,
  883. userNumber: ruleForm.adminName,
  884. passWord: ruleForm.password,
  885. phoneNumber: ruleForm.corpnPhone,
  886. department: ruleForm.department,
  887. checkOrg: ruleForm.icCard.join(","),
  888. };
  889. let res = await axios({
  890. method: "post",
  891. url: api.value + "/admin/save",
  892. headers: {
  893. token: sessionStorage.getItem("token"),
  894. user_head: sessionStorage.getItem("user_head"),
  895. },
  896. data: data,
  897. });
  898. console.log(res, "添加账号");
  899. if (res.data.code == 200) {
  900. getList();
  901. ElMessage({
  902. type: "success",
  903. showClose: true,
  904. message: res.data.message,
  905. center: true,
  906. });
  907. addDialogVisible.value = false;
  908. ruleFormRef.value.resetFields();
  909. } else {
  910. ElMessage({
  911. type: "error",
  912. showClose: true,
  913. message: res.data.message,
  914. center: true,
  915. });
  916. }
  917. }
  918. } else {
  919. console.log("error submit!", fields);
  920. }
  921. });
  922. }, 1000);
  923. //删除按钮
  924. const del = async (row) => {
  925. // console.log(row);
  926. let data = {
  927. id: row.id,
  928. permissionSettingId: sessionStorage.getItem("permissionSettingId"),
  929. };
  930. let res = await axios({
  931. method: "get",
  932. url: api.value + "/admin/delete",
  933. headers: {
  934. token: sessionStorage.getItem("token"),
  935. user_head: sessionStorage.getItem("user_head"),
  936. },
  937. params: data,
  938. });
  939. if (res.data.code == 200) {
  940. if (tableData.list.length == 1 && currentPage.value != 1) {
  941. currentPage.value = currentPage.value - 1;
  942. }
  943. getList();
  944. ElMessage({
  945. type: "success",
  946. showClose: true,
  947. message: res.data.message,
  948. center: true,
  949. });
  950. } else {
  951. ElMessage({
  952. type: "error",
  953. showClose: true,
  954. message: res.data.message,
  955. center: true,
  956. });
  957. }
  958. // console.log(res);
  959. };
  960. // 取消删除
  961. const cancelEvent = () => {
  962. ElMessage({
  963. type: "info",
  964. showClose: true,
  965. message: "取消删除",
  966. center: true,
  967. });
  968. };
  969. // 重置密码
  970. const reset = async (row) => {
  971. // console.log(row);
  972. let data = {
  973. id: row.id,
  974. };
  975. let res = await axios({
  976. method: "post",
  977. url: api.value + "/mhotel/managerAdminremovePwd.action",
  978. headers: {
  979. // token: sessionStorage.getItem("token"),
  980. // user_head: sessionStorage.getItem("userhead"),
  981. },
  982. params: data,
  983. });
  984. if (res.data.code == 200) {
  985. getList();
  986. ElMessage({
  987. type: "success",
  988. showClose: true,
  989. message: res.data.message,
  990. center: true,
  991. });
  992. } else {
  993. ElMessage({
  994. type: "error",
  995. showClose: true,
  996. message: res.data.message,
  997. center: true,
  998. });
  999. }
  1000. };
  1001. // 多选框功能
  1002. // const handleSelectionChange = (val) => {
  1003. // console.log(val);
  1004. // selectData.list = val;
  1005. // };
  1006. // 表格斑马纹颜色修改
  1007. const tableRowClassName = ({ row, rowIndex }) => {
  1008. if (rowIndex % 2 === 0) {
  1009. return "even";
  1010. } else if (rowIndex % 2 !== 0) {
  1011. return "odd";
  1012. }
  1013. return "";
  1014. };
  1015. // 分页
  1016. const handleCurrentChange = (value) => {
  1017. // console.log(value);
  1018. currentPage.value = value;
  1019. getList();
  1020. };
  1021. onBeforeMount(() => {
  1022. api.value = store.state.user.api;
  1023. const btnflag = JSON.parse(sessionStorage.getItem("btnflag"));
  1024. flagBtn.value = btnflag.account;
  1025. console.log(flagBtn.value, "按钮权限");
  1026. getList();
  1027. roleList();
  1028. schoolData();
  1029. departmentData();
  1030. });
  1031. onUnmounted(() => {
  1032. // document.removeEventListener("keyup", Enters);
  1033. });
  1034. </script>
  1035. <style scoped lang="scss">
  1036. .content-box {
  1037. width: calc(100% - 40px);
  1038. height: calc(100% - 105px);
  1039. margin: 20px auto;
  1040. background-color: #fff;
  1041. color: #fff;
  1042. display: flex;
  1043. flex-direction: column;
  1044. box-shadow: 0px 3px 10px rgba(0, 97, 255, 0.2);
  1045. .left {
  1046. // width: calc(100wh - 40px);
  1047. display: flex;
  1048. align-items: center;
  1049. height: 60px;
  1050. margin: 0 30px;
  1051. border-bottom: 1px solid #ccc;
  1052. color: #000;
  1053. font-size: 18px;
  1054. font-weight: 600;
  1055. .camera {
  1056. margin-right: 15px;
  1057. color: #4392f7;
  1058. }
  1059. }
  1060. .scroll {
  1061. width: calc(100%);
  1062. height: calc(100% - 61px);
  1063. display: flex;
  1064. flex-direction: column;
  1065. }
  1066. .middle {
  1067. width: calc(100% - 60px);
  1068. margin: 0 auto;
  1069. color: #000;
  1070. // border-bottom: 1px solid rgb(231, 231, 231);
  1071. .filter {
  1072. display: flex;
  1073. flex-wrap: wrap;
  1074. align-items: center;
  1075. // margin: 10px 0 0 0;
  1076. .search {
  1077. margin-left: 0 !important;
  1078. color: #fff;
  1079. }
  1080. .condition {
  1081. display: flex;
  1082. align-items: center;
  1083. margin: 10px 30px 10px 0;
  1084. :deep(.el-input .el-input__inner) {
  1085. font-size: 14px;
  1086. }
  1087. span {
  1088. margin: 0 10px 0 0;
  1089. }
  1090. }
  1091. }
  1092. .gongneng {
  1093. margin: 10px 0;
  1094. .el-button {
  1095. color: #fff;
  1096. margin-right: 15px;
  1097. }
  1098. }
  1099. :deep(.cont) {
  1100. width: 60%;
  1101. margin: 20px auto;
  1102. }
  1103. :deep(.download) {
  1104. display: flex;
  1105. align-items: center;
  1106. margin: 10px;
  1107. }
  1108. :deep(.download span) {
  1109. font-size: 16px;
  1110. margin-left: 20px;
  1111. }
  1112. :deep(.cont .el-button) {
  1113. margin-left: 60px;
  1114. margin-bottom: 30px;
  1115. }
  1116. :deep(.cont .accomplish) {
  1117. width: 100%;
  1118. display: flex;
  1119. justify-content: center;
  1120. }
  1121. :deep(.cont .accomplish .el-button) {
  1122. width: 50%;
  1123. margin: 0;
  1124. }
  1125. }
  1126. .footer {
  1127. width: calc(100% - 60px);
  1128. flex: 1;
  1129. margin: 0 auto;
  1130. overflow: auto;
  1131. .el-table--fit {
  1132. height: calc(100% - 60px);
  1133. :deep(.el-table__header-wrapper) {
  1134. background-color: #000;
  1135. font-size: 15px;
  1136. color: #000;
  1137. .cell {
  1138. color: #000;
  1139. }
  1140. }
  1141. :deep(.el-table__row) {
  1142. height: 50px;
  1143. font-size: 15px;
  1144. color: #000;
  1145. }
  1146. :deep(.el-table__row td) {
  1147. padding: 0;
  1148. border: 0;
  1149. }
  1150. .el-button--primary {
  1151. margin-left: 5px;
  1152. }
  1153. :deep(.el-table__body .even) {
  1154. background-color: #fff;
  1155. }
  1156. :deep(.el-table__body .odd) {
  1157. background-color: rgba(240, 243, 247, 1);
  1158. }
  1159. :deep(.options) {
  1160. display: flex;
  1161. justify-content: center;
  1162. align-items: center;
  1163. .reset {
  1164. color: rgba(9, 101, 98, 1);
  1165. cursor: pointer;
  1166. }
  1167. .look {
  1168. margin: 0 15px;
  1169. color: rgba(30, 125, 251, 1);
  1170. cursor: pointer;
  1171. }
  1172. .del {
  1173. color: rgba(212, 48, 48, 1);
  1174. cursor: pointer;
  1175. }
  1176. }
  1177. }
  1178. // 添加员工弹窗样式
  1179. :deep(.addStaff) {
  1180. // height: 420px;
  1181. border-radius: 11px;
  1182. .el-dialog__header {
  1183. border-radius: 11px 11px 0 0;
  1184. background: rgba(237, 241, 245, 1);
  1185. font-weight: 600;
  1186. margin: 0;
  1187. .el-dialog__headerbtn {
  1188. outline: none;
  1189. }
  1190. }
  1191. .el-dialog__body {
  1192. padding: 20px 20px 10px 20px;
  1193. .el-input {
  1194. width: 200px;
  1195. .el-input__suffix-inner {
  1196. color: rgba(61, 81, 232, 1);
  1197. }
  1198. }
  1199. .options {
  1200. margin: 10px 20px 20px 0;
  1201. width: 100%;
  1202. .el-form-item__content {
  1203. display: flex;
  1204. flex-direction: row-reverse;
  1205. }
  1206. .queding {
  1207. color: #fff;
  1208. margin-left: 15px;
  1209. }
  1210. }
  1211. }
  1212. }
  1213. }
  1214. .pageSize {
  1215. display: flex;
  1216. align-items: center;
  1217. justify-content: space-between;
  1218. margin: 0 30px;
  1219. height: 60px;
  1220. span {
  1221. color: #000;
  1222. }
  1223. .el-pagination {
  1224. // width: 1600px;
  1225. :deep(.el-pagination__total) {
  1226. color: #000;
  1227. }
  1228. :deep(.el-pagination__goto) {
  1229. color: #000;
  1230. }
  1231. :deep(.el-pagination__classifier) {
  1232. color: #000;
  1233. }
  1234. :deep(.el-input__wrapper) {
  1235. border: 1px solid rgba(0, 0, 0, 1);
  1236. border-radius: 5px;
  1237. box-shadow: none;
  1238. }
  1239. :deep(.el-pager li) {
  1240. margin: 0 5px;
  1241. border: 1px solid rgba(0, 0, 0, 1);
  1242. border-radius: 5px;
  1243. background-color: transparent;
  1244. }
  1245. :deep(.el-pager li.is-active) {
  1246. // background-color: rgba(0, 97, 255, 0.8);
  1247. border: 1px solid rgba(0, 97, 255, 1);
  1248. color: rgba(0, 97, 255, 1);
  1249. }
  1250. :deep(.btn-prev) {
  1251. margin-right: 5px;
  1252. border: 1px solid rgba(0, 0, 0, 1);
  1253. border-radius: 5px;
  1254. background-color: transparent;
  1255. }
  1256. :deep(.btn-next) {
  1257. margin-left: 5px;
  1258. border: 1px solid rgba(0, 0, 0, 1);
  1259. border-radius: 5px;
  1260. background-color: transparent;
  1261. }
  1262. }
  1263. }
  1264. }
  1265. .el-input {
  1266. width: 192px;
  1267. }
  1268. </style>
  1269. <style lang="scss">
  1270. //添加成员 联系人下拉框样式
  1271. .more-tag-data {
  1272. // border: 1px solid red;
  1273. .el-select-dropdown__wrap {
  1274. height: 200px;
  1275. }
  1276. }
  1277. .el-popper {
  1278. .addStudentMore {
  1279. text-align: center;
  1280. }
  1281. }
  1282. .el-popper.tag_title {
  1283. width: 450px;
  1284. height: 75%;
  1285. overflow: auto;
  1286. // border: 1px solid #409eff;
  1287. }
  1288. </style>