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.

512 lines
16 KiB

2 weeks ago
4 days ago
4 days ago
2 weeks ago
4 days ago
4 days ago
2 weeks ago
2 weeks ago
2 weeks ago
4 days ago
4 days ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
  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 { UserFilled } from '@element-plus/icons-vue'
  9. import _ from 'lodash'
  10. import request from '@/util/http'
  11. <<<<<<< HEAD
  12. =======
  13. // 客户明细表格
  14. >>>>>>> milestone-20250623-金币前端
  15. const tableData = ref([])
  16. //分页总条目
  17. const total = ref(100)
  18. <<<<<<< HEAD
  19. =======
  20. // 搜索admin
  21. >>>>>>> milestone-20250623-金币前端
  22. const admin = ref({})
  23. // 搜索对象
  24. const getObj = ref({
  25. pageNum: 1,
  26. pageSize: 10
  27. })
  28. // 控制新增权限弹窗的
  29. const addVisible = ref(false)
  30. // 控制编辑权限弹窗的
  31. const editVisible = ref(false)
  32. const area = ref([])
  33. const store = ref([])// 好像是部门
  34. // 新增权限的对象,做初始化的
  35. const addInit = ref({})
  36. // 新增权限对象,传给后端的
  37. const addObj = ref({})
  38. // 编辑权限的对象
  39. const editObj = ref({})
  40. // 删除权限的对象
  41. const delObj = ref({})
  42. <<<<<<< HEAD
  43. =======
  44. // 搜索接口search
  45. >>>>>>> milestone-20250623-金币前端
  46. const get = async function (val) {
  47. try {
  48. if (admin.value.jwcode) {
  49. admin.value.jwcode = admin.value.jwcode.replace(/\s/g, '');
  50. }
  51. if (typeof val === 'number') {
  52. getObj.value.pageNum = val
  53. } else {
  54. getObj.value.pageNum = 1
  55. }
  56. const result = await request({
  57. url: '',// 待补充
  58. data: {
  59. ...getObj.value,
  60. admin: { ...admin.value }
  61. }
  62. })
  63. tableData.value = result.data.list
  64. total.value = result.data.total
  65. } catch (error) {
  66. console.log('请求失败', error)
  67. }
  68. }
  69. const reset = function () {
  70. admin.value = {}
  71. }
  72. const getArea = async function () {
  73. try {
  74. const result = await request({
  75. url: '',
  76. data: {}
  77. })
  78. area.value = result.data
  79. } catch (error) {
  80. console.log('请求失败', error)
  81. }
  82. }
  83. const getStore = async function () {
  84. try {
  85. const result = await request({
  86. url: '',
  87. data: {}
  88. })
  89. store.value = result.data
  90. } catch (error) {
  91. console.log('请求失败', error)
  92. }
  93. }
  94. // 打开新增用户权限弹窗
  95. const openaddVisible = function () {
  96. addVisible.value = true
  97. }
  98. // 关闭新增用户权限弹窗
  99. const closeaddVisible = function () {
  100. addVisible.value = false
  101. }
  102. // 新增用户权限初始化
  103. const permissionAddInit = function () {
  104. addInit.value = {}
  105. openaddVisible()
  106. }
  107. const permissionAdd = async function () {
  108. Ref.value.validate(async (valid) => {
  109. if (valid) {
  110. try {
  111. addObj.value.adminFlag = 1
  112. addObj.value.status1 = 1
  113. const result = await request({
  114. url: '',
  115. data: addObj.value
  116. })
  117. if (result.code == 200) {
  118. ElMessage.success('添加成功')
  119. } else {
  120. ElMessage.error(result.msg)
  121. }
  122. addObj.value = {}
  123. closeaddVisible()
  124. get()
  125. } catch (error) {
  126. console.log('新增用户权限失败', error)
  127. ElMessage.error('新增用户权限失败')
  128. closeaddVisible()
  129. }
  130. } else {
  131. ElMessage({
  132. type: 'error',
  133. message: '请检查输入内容'
  134. })
  135. }
  136. })
  137. } // 这个要简化,哪来那么多if-else
  138. const rules = reactive({// 只有一个必填属性的话,能否直接设置在表单中
  139. jwcode: [{ required: true, message: '请输入精网号', trigger: 'blur' }],
  140. name: [{ required: true, message: '请输入用户名', trigger: 'blur' }],
  141. store: [{ required: true, message: '请输入职称', trigger: 'blur' }],
  142. machineId: [{ required: true, message: '请输入精网号', trigger: 'blur' }],
  143. area: [{ required: true, message: '请选择所属地区', trigger: 'blur' }],
  144. permission: [{ required: true, message: '请选择权限', trigger: 'blur' }]
  145. })
  146. // 表单验证ref
  147. const Ref = ref(null)
  148. // 使用 _.throttle 并设置 trailing 为 false 实现严格节流,只执行一次 节吗呢?什么鬼
  149. const throttledPermissionAdd = _.throttle(permissionAdd, 5000, {
  150. trailing: false
  151. })
  152. // 权限类别
  153. const list = [
  154. {
  155. label: '总部',
  156. value: '1'
  157. },
  158. {
  159. label: '',
  160. value: ''
  161. }
  162. ]
  163. // 地区列表
  164. const areaList = ref([])
  165. const getAreas = async function () {
  166. try {
  167. const result = await request({
  168. url: '',
  169. data: {}
  170. })
  171. console.log('result', result)
  172. areaList.value = result.data
  173. console.log('地区', area.value)
  174. } catch (error) {
  175. console.log('请求失败', error)
  176. }
  177. }
  178. // 打开编辑用户权限弹窗
  179. const openVisable = function () {
  180. editVisible.value = true
  181. }
  182. // 关闭编辑用户权限弹窗
  183. const closeEdit = function () {
  184. editVisible.value = false
  185. }
  186. // 编辑用户权限初始化
  187. const editInit = function (row) {
  188. editObj.value = {}
  189. editObj.value.jwcode = row.jwcode
  190. editObj.value.name = row.name
  191. editObj.value.area = row.area
  192. editObj.value.store = row.store
  193. editObj.value.permission = row.permission
  194. console.log('编辑用户权限', editObj.value)
  195. openVisable()
  196. }
  197. // 编辑用户权限提交
  198. const permissionEdit = async function () {
  199. try {
  200. const result = await request({
  201. url: '',
  202. data: editObj.value
  203. })
  204. console.log('请求成功', result)
  205. ElMessage.success('编辑用户权限成功')
  206. closeEdit()
  207. get()
  208. } catch (error) {
  209. ElMessage.error('编辑用户权限失败')
  210. closeEdit()
  211. }
  212. }
  213. const throttledPermissionEdit = _.throttle(permissionEdit, 5000, {
  214. trailing: false
  215. })
  216. // 删除初始化
  217. const del = function (row) {
  218. delObj.value = {}
  219. console.log(row, '删除初始化')
  220. delObj.value.jwcode = row.jwcode
  221. }
  222. // 删除权限
  223. const delConfirm = async function () {
  224. try {
  225. delObj.value.permission = '4'
  226. console.log(delObj.value)
  227. const result = await request({
  228. url: '',
  229. data: delObj.value
  230. })
  231. console.log('请求成功', result)
  232. ElMessage.success('删除权限成功')
  233. delObj.value = {}
  234. get()
  235. } catch (error) {
  236. console.log('删除权限失败', error)
  237. ElMessage.error('删除权限失败')
  238. get()
  239. }
  240. }
  241. // 禁用启用用户权限
  242. const editStatus = async function (row) {
  243. try {
  244. console.log(row)
  245. editObj.value = {}
  246. editObj.value.jwcode = row.jwcode
  247. editObj.value.status1 = row.status1
  248. console.log('修改用户权限状态', editObj.value)
  249. const result = await request({
  250. url: '',
  251. data: editObj.value
  252. })
  253. console.log('请求成功', result)
  254. ElMessage.success(
  255. editObj.value.status1 == 1 ? '启用成功' : '禁用成功'
  256. )
  257. editObj.value = {}
  258. get()
  259. } catch (error) {
  260. console.log('修改用户权限失败', error)
  261. }
  262. }
  263. // 挂载
  264. onMounted(async function () {
  265. await get()
  266. await getArea()
  267. await getStore()
  268. })
  269. const handlePageSizeChange = function (val) {
  270. getObj.value.pageSize = val
  271. get()
  272. }
  273. const handleCurrentChange = function (val) {
  274. getObj.value.pageNum = val
  275. get()
  276. }
  277. </script>
  278. <template>
  279. <el-row>
  280. <el-col>
  281. <el-card style="margin-bottom: 20px">
  282. <div style="display:flex">
  283. <div>
  284. <el-text size="large">OA号</el-text>
  285. <el-input v-model="admin.jwcode" style="width: 240px" placeholder="请输入OA号" clearable />
  286. </div>
  287. <div style="margin-left: 50px">
  288. <el-text size="large">所属地区</el-text>
  289. <el-select v-model="admin.area" placeholder="请选择所属地区" style="width: 240px" clearable>
  290. <el-option v-for="item in area" :key="item" :label="item" :value="item" />
  291. </el-select>
  292. </div>
  293. <div style="margin-left: 50px">
  294. <el-text size="large">职位名称</el-text>
  295. <el-select v-model="admin.store" placeholder="请选择职位名称" style="width: 240px" clearable>
  296. <el-option v-for="item in store" :key="item" :label="item" :value="item" />
  297. </el-select>
  298. </div>
  299. <div style="margin-left:20px">
  300. <el-button type="success" @click="reset()">重置</el-button>
  301. <el-button type="primary" @click="get()">查询</el-button>
  302. </div>
  303. </div>
  304. </el-card>
  305. </el-col>
  306. </el-row>
  307. <el-row>
  308. <el-col>
  309. <el-card>
  310. <div class="add-item">
  311. <el-button style="color: #048efb; border: 1px solid #048efb" @click="permissionAddInit()">新增用户</el-button>
  312. </div>
  313. <div>
  314. <el-table :data="tableData" style="width: 100%">
  315. <el-table-column type="index" label="序号" width="100px" fixed="left"><!-- 序号始终固定在左边 -->
  316. <template #default="scope">
  317. <!-- index下标从0开始计算时要+1后面算页数(num页码数-1) * 每页记录数加起来是总条数 -->
  318. <span>{{ scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize }}</span>
  319. </template>
  320. </el-table-column>
  321. <el-table-column prop="jwcode" label="精网号" width="120px" />
  322. <el-table-column prop="name" label="姓名" width="120px" />
  323. <el-table-column prop="area" label="所属地区" width="120px" />
  324. <el-table-column prop="store" label="职位" width="120px" />
  325. <el-table-column prop="permission" label="部门权限" width="120px">
  326. <template #default="scope">
  327. <span v-if="scope.row.permission === '1'">总部管理员</span>
  328. 待补充..................................................................................................
  329. </template>
  330. </el-table-column>
  331. <el-table-column prop="remark" label="备注" width="200px" show-overflow-tooltip />
  332. <el-table-column prop="operation" label="操作" width="200px">
  333. <template #default="scope">
  334. <el-button type="warning" @click="editInit(scope.row)"
  335. :disabled="scope.row.status1 === 0">修改权限</el-button>
  336. <el-popconfirm title="确定将此用户删除吗?" @confirm="delConfirm">
  337. <template #reference>
  338. <el-button type="danger" @click="del(scope.row)" :disabled="scope.row.status1 === 0">删除</el-button>
  339. </template>
  340. <template #actions="{ confirm, cancel }">
  341. <el-button size="small" @click="cancel">取消</el-button>
  342. <el-button type="primary" size="small" @click="confirm">确定</el-button>
  343. </template>
  344. </el-popconfirm>
  345. </template>
  346. </el-table-column>
  347. <el-table-column prop="status1" label="状态" width="200px">
  348. <template #default="scope">
  349. <el-switch v-model="scope.row.status1" :active-value="1" :inactive-value="0" size="large"
  350. @change="editStatus(scope.row)" style="
  351. --el-switch-on-color: #13ce66;
  352. --el-switch-off-color: #ff4949;" active-text="启用" inactive-text="禁用" />
  353. </template>
  354. </el-table-column>
  355. </el-table>
  356. </div>
  357. <div class="pagination" style="margin-top: 20px">
  358. <el-pagination background :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]"
  359. layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handlePageSizeChange"
  360. @current-change="handleCurrentChange">
  361. </el-pagination>
  362. </div>
  363. </el-card>
  364. </el-col>
  365. </el-row>
  366. <!-- 新增用户权限 -->
  367. <el-dialog v-model="addVisible" title="新增用户权限" :close-on-click-modal="false">
  368. <template #footer>
  369. <el-form ref="Ref" :rules="rules" :model="addObj" label-width="auto" style="align-items: center" >
  370. <el-form-item prop="jwcode" label="精网号:">
  371. <el-input v-model="addObj.jwcode" placeholder="请输入精网号" style="width: 220px" />
  372. </el-form-item>
  373. <el-form-item prop="name" label="用户名:">
  374. <el-input v-model="addObj.name" placeholder="请输入用户名" style="width: 220px" />
  375. </el-form-item>
  376. <el-form-item prop="area" label="所属地区:">
  377. <el-select v-model="addObj.area" placeholder="请选择所属地区" style="width: 220px"
  378. @change="() => Ref.value.validateField('area')">
  379. <el-option v-for="item in areaList" :key="item" :label="item" :value="item"></el-option>
  380. </el-select>
  381. </el-form-item>
  382. <el-form-item prop="permission" label="权限类别:">
  383. <el-select v-model="addObj.permission" placeholder="请选择权限" style="width: 220px"
  384. @change="() => Ref.value.validateField('permission')">
  385. <el-option v-for="item in list" :key="item.value" :label="item.label" :value="item.value"></el-option>
  386. </el-select>
  387. </el-form-item>
  388. <el-form-item prop="store" label="职位:">
  389. <el-input v-model="addObj.store" placeholder="请输入职称" style="width: 220px" />
  390. </el-form-item>
  391. <el-form-item prop="machineId" label="机器码:">
  392. <el-input v-model="addObj.machineId" placeholder="请输入机器码" style="width: 220px" />
  393. </el-form-item>
  394. <el-form-item prop="remark" label="备注">
  395. <el-input v-model="addObj.remark" style="width: 300px" :rows="2" maxlength="100" show-word-limit
  396. type="textarea" />
  397. </el-form-item>
  398. </el-form>
  399. <div>
  400. <el-button @click="closeaddVisible()">取消</el-button>
  401. <el-button type="primary" @click="throttledPermissionAdd()">
  402. 提交
  403. </el-button>
  404. </div>
  405. </template>
  406. </el-dialog>
  407. <!-- 这是编辑用户权限弹窗 -->
  408. <el-dialog v-model="editVisible" title="编辑用户权限" width="800px" :close-on-click-modal="false">
  409. <el-descriptions :column="2" :size="size" border label-width="200px">
  410. <el-descriptions-item>
  411. <template #label>
  412. <div class="permissionVisible">
  413. <el-icon><UserFilled /></el-icon>
  414. 员工精网号
  415. </div>
  416. </template>
  417. {{ editObj.jwcode }}
  418. </el-descriptions-item>
  419. <el-descriptions-item>
  420. <template #label>
  421. <div class="permissionVisible">
  422. <el-icon><User /></el-icon>
  423. 员工姓名
  424. </div>
  425. </template>
  426. {{ editObj.name }}
  427. </el-descriptions-item>
  428. <el-descriptions-item>
  429. <template #label>
  430. <div class="permissionVisible">
  431. <el-icon><location /></el-icon>
  432. 所属地区
  433. </div>
  434. </template>
  435. {{ editObj.area }}
  436. </el-descriptions-item>
  437. <el-descriptions-item>
  438. <template #label>
  439. <div class="permissionVisible">
  440. <el-icon><OfficeBuilding /></el-icon>
  441. 部门
  442. </div>
  443. </template>
  444. {{ editObj.store }}
  445. </el-descriptions-item>
  446. </el-descriptions>
  447. <el-divider>
  448. <el-icon><star-filled /></el-icon>
  449. </el-divider>
  450. <div>
  451. <span class="permissionVisible" style="margin-right: 20px">权限设置:</span>
  452. <el-radio-group v-model="editObj.permission">
  453. <el-radio value="1" border>总部管理员</el-radio>
  454. ..............................................................................待补充
  455. </el-radio-group>
  456. </div>
  457. <template #footer>
  458. <div>
  459. <el-button @click="closeEdit()">取消</el-button>
  460. <el-button type="primary" @click="throttledPermissionEdit()">提交</el-button>
  461. </div>
  462. </template>
  463. </el-dialog>
  464. </template>
  465. <style scoped>
  466. .permissionVisible {
  467. font-size: 16px;
  468. font-weight: bold;
  469. }
  470. .pagination {
  471. display: flex;
  472. }
  473. .head-card {
  474. display: flex;
  475. }
  476. /* 新增样式让弹窗内容居中 */
  477. .el-dialog__body {
  478. display: flex;
  479. flex-direction: column;
  480. align-items: center;
  481. }
  482. .el-dialog__footer {
  483. display: flex;
  484. flex-direction: column;
  485. align-items: center;
  486. }
  487. </style>