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.

500 lines
16 KiB

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