金币系统前端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

574 lines
18 KiB

  1. <script setup>
  2. import { ref, onMounted, reactive, computed } from "vue";
  3. import ElementPlus from "element-plus";
  4. import { ElMessage, ElMessageBox } from "element-plus";
  5. import axios from "axios";
  6. import moment from "moment";
  7. import { ta } from "element-plus/es/locales.mjs";
  8. import API from "../../api/index.js";
  9. import { UserFilled } from "@element-plus/icons-vue";
  10. import _ from 'lodash';
  11. // 充值明细表格
  12. const tableData = ref([]);
  13. // 搜索===========================================
  14. //分页总条目
  15. const total = ref(100);
  16. // 搜索detailY
  17. const admin = ref({});
  18. // 搜索对象
  19. const getObj = ref({
  20. pageNum: 1,
  21. pageSize: 50,
  22. });
  23. // 新增用户权限弹窗
  24. const permissionAddVisible = ref(false);
  25. // 编辑用户权限弹窗
  26. const permissionEditVisible = ref(false);
  27. //选地区
  28. const area = ref([]);
  29. // 选部门
  30. const store = ref([]);
  31. // 新增用户权限对象
  32. const permissionAddObj = ref({});
  33. // 编辑用户权限对象
  34. const permissionEditObj = ref({});
  35. // 删除权限对象
  36. const delObj = ref({});
  37. // 搜索接口
  38. const get = async function (val) {
  39. try {
  40. // 搜索参数页码赋值
  41. if (typeof val === "number") {
  42. getObj.value.pageNum = val;
  43. }
  44. console.log("搜索参数", getObj.value);
  45. // 发送POST请求
  46. const result = await API.post("/hwjb/admin/search", {
  47. ...getObj.value,
  48. admin: { ...admin.value },
  49. });
  50. tableData.value = result.data.list;
  51. console.log("tableData", tableData.value);
  52. total.value = result.data.total;
  53. } catch (error) {
  54. console.log("请求失败", error)
  55. }
  56. };
  57. // 搜索
  58. const search = function () {
  59. getObj.value.pageNum = 1;
  60. get();
  61. };
  62. // 重置
  63. const reset = function () {
  64. admin.value = {};
  65. };
  66. // 获取地区
  67. const getArea = async function () {
  68. try {
  69. const result = await API.post("/hwjb/admin/area", {});
  70. area.value = result.data;
  71. } catch (error) {
  72. console.log("请求失败", error);
  73. // 在这里可以处理错误逻辑,比如显示错误提示等
  74. }
  75. }
  76. // 获取部门
  77. const getStore = async function () {
  78. try {
  79. const result = await API.post("/hwjb/admin/store", {});
  80. store.value = result.data;
  81. } catch (error) {
  82. console.log("请求失败", error);
  83. // 在这里可以处理错误逻辑,比如显示错误提示等
  84. }
  85. }
  86. // 验证跳转输入框的数字是否合法
  87. const checkNumber = function () {
  88. if (typeof parseInt(getObj.value.pageNum) === "number") {
  89. console.log(
  90. "总共有多少页" + Math.ceil(total.value / getObj.value.pageSize)
  91. );
  92. if (
  93. getObj.value.pageNum > 0 &&
  94. getObj.value.pageNum <= Math.ceil(total.value / getObj.value.pageSize)
  95. ) {
  96. getObj.value.pageNum = parseInt(getObj.value.pageNum);
  97. console.log("输入的数字合法");
  98. get();
  99. } else {
  100. //提示
  101. ElMessage({
  102. type: "error",
  103. message: "请检查输入内容",
  104. });
  105. }
  106. } else {
  107. //提示
  108. ElMessage({
  109. type: "error",
  110. message: "请检查输入内容",
  111. });
  112. }
  113. };
  114. // 打开新增用户权限弹窗
  115. const openPermissionAddVisible = function () {
  116. permissionAddVisible.value = true;
  117. }
  118. // 关闭新增用户权限弹窗
  119. const closePermissionAddVisible = function () {
  120. permissionAddVisible.value = false;
  121. }
  122. // 新增用户权限初始化
  123. const permissionAddInit = function () {
  124. permissionAddObj.value = {};
  125. openPermissionAddVisible();
  126. }
  127. // 通过精网号查询没有权限的用户
  128. const getAdminByJwcodeWithoutPermission = async function () {
  129. try {
  130. const result = await API.post("/hwjb/admin/selectNo", permissionAddObj.value);
  131. if (result.code == 200) {
  132. permissionAddObj.value = result.data[0];
  133. ElMessage.success("精网号查询成功");
  134. } else {
  135. ElMessage.error(result.msg);
  136. }
  137. console.log("精网号查询没有权限的用户", permissionAddObj.value);
  138. } catch (error) {
  139. console.log("请求失败", error);
  140. // 在这里可以处理错误逻辑,比如显示错误提示等
  141. }
  142. }
  143. // 新增用户权限提交
  144. const permissionAdd = async function () {
  145. try {
  146. if ((permissionAddObj.value.jwcode == "" || permissionAddObj.value.jwcode == null) || (permissionAddObj.value.name == "" || permissionAddObj.value.name == null)) {
  147. ElMessage.error("请选择要添加权限的用户");
  148. return;
  149. }
  150. if (permissionAddObj.value.permisson == "" || permissionAddObj.value.permission == null) {
  151. ElMessage.error("请选择权限");
  152. return;
  153. }
  154. console.log("新增用户权限提交", permissionAddObj.value);
  155. const result = await API.post("/hwjb/admin/update", permissionAddObj.value);
  156. // 将响应结果存储到响应式数据中
  157. console.log("请求成功", result);
  158. ElMessage.success("添加成功");
  159. get();
  160. closePermissionAddVisible();
  161. } catch (error) {
  162. console.log("新增用户权限失败", error);
  163. // 在这里可以处理错误逻辑,比如显示错误提示等
  164. ElMessage.error("新增用户权限失败");
  165. closePermissionAddVisible();
  166. }
  167. }
  168. // 使用 _.throttle 并设置 trailing 为 false 实现严格节流,只执行一次
  169. const throttledPermissionAdd = _.throttle(permissionAdd, 5000, { trailing: false });
  170. // 打开编辑用户权限弹窗
  171. const openPermissionEditVisible = function () {
  172. permissionEditVisible.value = true;
  173. }
  174. // 关闭编辑用户权限弹窗
  175. const closePermissionEditVisible = function () {
  176. permissionEditVisible.value = false;
  177. }
  178. // 编辑用户权限初始化
  179. const permissionEditInit = function (row) {
  180. permissionEditObj.value = {};
  181. permissionEditObj.value.jwcode = row.jwcode;
  182. permissionEditObj.value.name = row.name;
  183. permissionEditObj.value.area = row.area;
  184. permissionEditObj.value.store = row.store;
  185. permissionEditObj.value.permission = row.permission;
  186. console.log("编辑用户权限", permissionEditObj.value);
  187. openPermissionEditVisible();
  188. }
  189. // 编辑用户权限提交
  190. const permissionEdit = async function () {
  191. try {
  192. const result = await API.post("/hwjb/admin/update", permissionEditObj.value);
  193. // 将响应结果存储到响应式数据中
  194. console.log("请求成功", result);
  195. ElMessage.success("编辑用户权限成功");
  196. get();
  197. closePermissionEditVisible();
  198. } catch (error) {
  199. console.log("编辑用户权限失败", error);
  200. // 在这里可以处理错误逻辑,比如显示错误提示等
  201. ElMessage.error("编辑用户权限失败");
  202. closePermissionEditVisible();
  203. }
  204. }
  205. const throttledPermissionEdit = _.throttle(permissionEdit, 5000, { trailing: false });
  206. // 删除初始化
  207. const del = function (row) {
  208. delObj.value = {};
  209. console.log(row, "删除初始化");
  210. delObj.value.jwcode = row.jwcode;
  211. }
  212. // 删除权限
  213. const delConfirm = async function () {
  214. try {
  215. delObj.value.permission = "4";
  216. console.log(delObj.value);
  217. const result = await API.post("/hwjb/admin/update", delObj.value);
  218. // 将响应结果存储到响应式数据中
  219. console.log("请求成功", result);
  220. ElMessage.success("删除权限成功");
  221. delObj.value = {};
  222. get();
  223. } catch (error) {
  224. console.log("删除权限失败", error);
  225. // 在这里可以处理错误逻辑,比如显示错误提示等
  226. ElMessage.error("删除权限失败");
  227. }
  228. }
  229. // 禁用启用用户权限
  230. const editStatus =async function (row) {
  231. try {
  232. console.log(row);
  233. permissionEditObj.value = {};
  234. permissionEditObj.value.jwcode = row.jwcode;
  235. permissionEditObj.value.status1 = row.status1;
  236. console.log("修改用户权限状态", permissionEditObj.value);
  237. const result = await API.post("/hwjb/admin/update", permissionEditObj.value);
  238. // 将响应结果存储到响应式数据中
  239. console.log("请求成功", result);
  240. ElMessage.success(permissionEditObj.value.status1==1?"启用成功":"禁用成功");
  241. permissionEditObj.value = {};
  242. get();
  243. } catch (error) {
  244. console.log("修改用户权限失败", error);
  245. // 在这里可以处理错误逻辑,比如显示错误提示等
  246. }
  247. }
  248. // 挂载
  249. onMounted(async function () {
  250. await get();
  251. await getArea();
  252. await getStore();
  253. });
  254. </script>
  255. <template>
  256. <el-row>
  257. <el-col>
  258. <el-card style="margin-bottom: 20px">
  259. <div class="head-card">
  260. <div class="head-card-element">
  261. <el-text class="mx-1" size="large">精网号</el-text>
  262. <el-input v-model="admin.jwcode" style="width: 240px" placeholder="请输入精网号" clearable />
  263. </div>
  264. <div class="head-card-element" style="margin-left: 50px">
  265. <el-text class="mx-1" size="large">所属地区</el-text>
  266. <el-select v-model="admin.area" placeholder="请选择所属地区" style="width: 240px" clearable>
  267. <el-option v-for="item in area" :key="item" :label="item" :value="item" />
  268. </el-select>
  269. </div>
  270. <div class="head-card-element" style="margin-left: 50px">
  271. <el-text class="mx-1" size="large">所属部门</el-text>
  272. <el-select v-model="admin.store" placeholder="请选择部门" style="width: 240px" clearable>
  273. <el-option v-for="item in store" :key="item" :label="item" :value="item" />
  274. </el-select>
  275. </div>
  276. <div class="head-card-btn">
  277. <el-button @click="reset()">重置</el-button>
  278. <el-button type="primary" @click="search()">查询</el-button>
  279. </div>
  280. </div>
  281. </el-card>
  282. </el-col>
  283. </el-row>
  284. <el-row>
  285. <el-col>
  286. <el-card>
  287. <!-- 添加 -->
  288. <div class="add-item">
  289. <el-button style="color: #048efb; border: 1px solid #048efb" @click="permissionAddInit()">新增用户权限</el-button>
  290. </div>
  291. <div>
  292. <el-table :data="tableData" style="width: 100%; ">
  293. <el-table-column type="index" label="序号" width="100px" fixed="left">
  294. <template #default="scope">
  295. <span>{{
  296. scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
  297. }}</span>
  298. </template>
  299. </el-table-column>
  300. <el-table-column prop="jwcode" label="精网号" />
  301. <el-table-column prop="name" label="姓名" />
  302. <el-table-column prop="area" label="所属地区" />
  303. <el-table-column prop="store" label="所属部门" />
  304. <el-table-column prop="permission" label="部门权限">
  305. <template #default="scope">
  306. <span v-if="scope.row.permission === '1'">
  307. 总部管理员
  308. </span>
  309. <span v-if="scope.row.permission === '2'">
  310. 分部财务
  311. </span>
  312. <span v-if="scope.row.permission === '3'">
  313. 分部客服
  314. </span>
  315. </template>
  316. </el-table-column>
  317. <el-table-column prop="remark" label="备注" />
  318. <el-table-column prop="operation" label="操作" width="200px">
  319. <template #default="scope">
  320. <el-button type="warning" text @click="permissionEditInit(scope.row)"
  321. :disabled="scope.row.status1 === 0">
  322. 修改权限
  323. </el-button>
  324. <el-popconfirm title="确定将此条活动删除吗?" @confirm="delConfirm">
  325. <template #reference>
  326. <el-button type="danger" text @click="del(scope.row)" :disabled="scope.row.status1 === 0">
  327. 删除
  328. </el-button>
  329. </template>
  330. <template #actions="{ confirm, cancel }">
  331. <el-button size="small" @click="cancel">取消</el-button>
  332. <el-button type="primary" size="small" @click="confirm">
  333. 确定
  334. </el-button>
  335. </template>
  336. </el-popconfirm>
  337. </template>
  338. </el-table-column>
  339. <el-table-column prop="status1" label="状态">
  340. <template #default="scope">
  341. <el-switch v-model="scope.row.status1" :active-value="1" :inactive-value="0" size="large"
  342. @change="editStatus(scope.row)" style="--el-switch-on-color: #13ce66; --el-switch-off-color: #ff4949"
  343. active-text="启用" inactive-text="禁用" inline-prompt />
  344. </template>
  345. </el-table-column>
  346. </el-table>
  347. </div>
  348. <!-- 分页 -->
  349. <div class="pagination" style="margin-top: 20px">
  350. <el-pagination background :page-size="getObj.pageSize" layout="slot" :total="total">
  351. <div>{{ total }},每页</div>
  352. <el-select v-model="getObj.pageSize" class="page-size" @change="get()" style="width: 80px">
  353. <el-option v-for="item in [5, 10, 20, 50, 100]" :key="item" :label="item" :value="item"></el-option>
  354. </el-select>
  355. <div></div>
  356. </el-pagination>
  357. <el-pagination background layout="prev, pager, next,slot" :page-size="getObj.pageSize" :total="total"
  358. :current-page="getObj.pageNum" @current-change="get">
  359. <div>跳至</div>
  360. <el-input v-model="getObj.pageNum" style="width: 40px" @change="checkNumber" />
  361. <div></div>
  362. </el-pagination>
  363. </div>
  364. </el-card>
  365. </el-col>
  366. </el-row>
  367. <!-- 这是新增用户权限弹窗 -->
  368. <el-dialog v-model="permissionAddVisible" title="新增用户权限" width="800px" :close-on-click-modal="false">
  369. <div style="display: flex; margin: 20px 0px 20px 0px;">
  370. <span class="permissionVisible" style="margin-right: 10px;">精网号:</span>
  371. <el-input placeholder="请输入精网号" v-model="permissionAddObj.jwcode" style="width: 240px; margin-right: 10px;"
  372. clearable></el-input>
  373. <el-button type="primary" @click="getAdminByJwcodeWithoutPermission()">查询</el-button>
  374. </div>
  375. <el-descriptions class="margin-top" :column="2" :size="size" border label-width="200px">
  376. <el-descriptions-item>
  377. <template #label>
  378. <div class="permissionVisible">
  379. <el-icon>
  380. <UserFilled />
  381. </el-icon>
  382. 员工精网号
  383. </div>
  384. </template>
  385. {{ permissionAddObj.jwcode }}
  386. </el-descriptions-item>
  387. <el-descriptions-item>
  388. <template #label>
  389. <div class="permissionVisible">
  390. <el-icon>
  391. <User />
  392. </el-icon>
  393. 员工姓名
  394. </div>
  395. </template>
  396. {{ permissionAddObj.name }}
  397. </el-descriptions-item>
  398. <el-descriptions-item>
  399. <template #label>
  400. <div class="permissionVisible">
  401. <el-icon :style="iconStyle">
  402. <location />
  403. </el-icon>
  404. 所属地区
  405. </div>
  406. </template>
  407. {{ permissionAddObj.area }}
  408. </el-descriptions-item>
  409. <el-descriptions-item>
  410. <template #label>
  411. <div class="permissionVisible">
  412. <el-icon>
  413. <OfficeBuilding />
  414. </el-icon>
  415. 部门
  416. </div>
  417. </template>
  418. {{ permissionAddObj.store }}
  419. </el-descriptions-item>
  420. </el-descriptions>
  421. <el-divider>
  422. <el-icon><star-filled /></el-icon>
  423. </el-divider>
  424. <div>
  425. <span class="permissionVisible" style="margin-right: 20px;">权限设置:</span>
  426. <el-radio-group v-model="permissionAddObj.permission">
  427. <el-radio value="1" border>总部管理员</el-radio>
  428. <el-radio value="2" border>分部管理员</el-radio>
  429. <el-radio value="3" border>分部审核员</el-radio>
  430. </el-radio-group>
  431. </div>
  432. <template #footer>
  433. <div>
  434. <el-button @click="closePermissionAddVisible()">取消</el-button>
  435. <el-button type="primary" @click="throttledPermissionAdd()"> 提交 </el-button>
  436. </div>
  437. </template>
  438. </el-dialog>
  439. <!-- 这是编辑用户权限弹窗 -->
  440. <el-dialog v-model="permissionEditVisible" title="编辑用户权限" width="800px" :close-on-click-modal="false">
  441. <el-descriptions class="margin-top" :column="2" :size="size" border label-width="200px">
  442. <el-descriptions-item>
  443. <template #label>
  444. <div class="permissionVisible">
  445. <el-icon>
  446. <UserFilled />
  447. </el-icon>
  448. 员工精网号
  449. </div>
  450. </template>
  451. {{ permissionEditObj.jwcode }}
  452. </el-descriptions-item>
  453. <el-descriptions-item>
  454. <template #label>
  455. <div class="permissionVisible">
  456. <el-icon>
  457. <User />
  458. </el-icon>
  459. 员工姓名
  460. </div>
  461. </template>
  462. {{ permissionEditObj.name }}
  463. </el-descriptions-item>
  464. <el-descriptions-item>
  465. <template #label>
  466. <div class="permissionVisible">
  467. <el-icon :style="iconStyle">
  468. <location />
  469. </el-icon>
  470. 所属地区
  471. </div>
  472. </template>
  473. {{ permissionEditObj.area }}
  474. </el-descriptions-item>
  475. <el-descriptions-item>
  476. <template #label>
  477. <div class="permissionVisible">
  478. <el-icon>
  479. <OfficeBuilding />
  480. </el-icon>
  481. 部门
  482. </div>
  483. </template>
  484. {{ permissionEditObj.store }}
  485. </el-descriptions-item>
  486. </el-descriptions>
  487. <el-divider>
  488. <el-icon><star-filled /></el-icon>
  489. </el-divider>
  490. <div>
  491. <span class="permissionVisible" style="margin-right: 20px;">权限设置:</span>
  492. <el-radio-group v-model="permissionEditObj.permission">
  493. <el-radio value=1 border>总部管理员</el-radio>
  494. <el-radio value=2 border>分部管理员</el-radio>
  495. <el-radio value=3 border>分部审核员</el-radio>
  496. </el-radio-group>
  497. </div>
  498. <template #footer>
  499. <div>
  500. <el-button @click="closePermissionEditVisible()">取消</el-button>
  501. <el-button type="primary" @click="throttledPermissionEdit()"> 提交 </el-button>
  502. </div>
  503. </template>
  504. </el-dialog>
  505. </template>
  506. <style scoped>
  507. .permissionVisible {
  508. font-size: 16px;
  509. font-weight: bold;
  510. }
  511. .pagination {
  512. display: flex;
  513. }
  514. .status {
  515. display: flex;
  516. }
  517. .head-card {
  518. display: flex;
  519. }
  520. .head-card-element {
  521. margin-right: 20px;
  522. }
  523. .head-card-btn {
  524. margin-left: auto;
  525. }
  526. </style>