index.vue 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263
  1. <template>
  2. <div class="app-container">
  3. <el-row :gutter="24">
  4. <!--用户数据-->
  5. <el-col :span="24" :xs="24">
  6. <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" label-width="68px">
  7. <el-form-item label="用户账号" prop="username">
  8. <el-input
  9. maxlength="20"
  10. v-model="queryParams.username"
  11. placeholder="请输入用户账号"
  12. clearable
  13. style="width: 240px"
  14. />
  15. </el-form-item>
  16. <el-form-item label="手机号码" prop="phonenumber">
  17. <el-input
  18. maxlength="11"
  19. v-model="queryParams.phonenumber"
  20. placeholder="请输入手机号码"
  21. clearable
  22. style="width: 240px"
  23. />
  24. </el-form-item>
  25. <el-form-item label="用户状态" prop="status">
  26. <el-select
  27. v-model="queryParams.status"
  28. placeholder="请选择用户状态"
  29. clearable
  30. style="width: 240px"
  31. >
  32. <el-option
  33. v-for="item in statusOptions"
  34. :key="item.value"
  35. :label="item.label"
  36. :value="item.value">
  37. </el-option>
  38. </el-select>
  39. </el-form-item>
  40. <el-form-item>
  41. <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
  42. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
  43. </el-form-item>
  44. </el-form>
  45. <el-row :gutter="10" class="mb8">
  46. <el-col :span="1.5">
  47. <el-button
  48. type="primary"
  49. plain
  50. icon="el-icon-plus"
  51. size="mini"
  52. @click="handleAdd"
  53. v-hasPermi="['system:user:add']"
  54. >新增
  55. </el-button>
  56. </el-col>
  57. <el-col :span="1.5">
  58. <el-button
  59. type="success"
  60. plain
  61. icon="el-icon-edit"
  62. size="mini"
  63. @click="handleUpdate"
  64. v-hasPermi="['system:user:edit']"
  65. >修改
  66. </el-button>
  67. </el-col>
  68. <!-- <el-col :span="1.5">-->
  69. <!-- <el-button-->
  70. <!-- type="danger"-->
  71. <!-- plain-->
  72. <!-- icon="el-icon-delete"-->
  73. <!-- size="mini"-->
  74. <!-- @click="handleDelete"-->
  75. <!-- v-hasPermi="['system:user:remove']"-->
  76. <!-- >删除-->
  77. <!-- </el-button>-->
  78. <!-- </el-col>-->
  79. <el-col :span="1.5">
  80. <el-button
  81. type="danger"
  82. plain
  83. icon="el-icon-delete"
  84. size="mini"
  85. @click="handleLogOff"
  86. v-hasPermi="['system:user:logoff']"
  87. >注销
  88. </el-button>
  89. </el-col>
  90. <el-col :span="1.5">
  91. <el-button
  92. type="success"
  93. plain
  94. icon="el-icon-unlock"
  95. size="mini"
  96. @click="handleRelock"
  97. v-hasPermi="['system:user:relock']"
  98. >解锁
  99. </el-button>
  100. </el-col>
  101. </el-row>
  102. <div style="padding-top: 10px">
  103. <vxe-table
  104. :row-style="setRowClass"
  105. ref="userTable"
  106. align="center"
  107. :loading="loading"
  108. class="mytable-style"
  109. auto-resize
  110. border
  111. resizable
  112. highlight-current-row
  113. show-overflow
  114. max-height="700"
  115. :radio-config="{trigger: 'row'}"
  116. :data="userList.slice((currentPage-1)*pageSize,currentPage*pageSize)"
  117. >
  118. <vxe-column type="radio" width="60"/>
  119. <vxe-table-column field="username" title="用户账号"/>
  120. <vxe-table-column field="nickname" title="用户姓名"/>
  121. <vxe-table-column field="idcard" title="身份证号码"/>
  122. <vxe-table-column field="mailbox" title="用户邮箱"/>
  123. <vxe-table-column field="phonenumber" title="手机号码"/>
  124. <vxe-table-column field="status" title="用户状态" :formatter="statusFormat"/>
  125. <vxe-table-column field="usertype" title="用户类型" :formatter="typeFormat"/>
  126. <vxe-table-column field="expDate" title="账号截止日期"/>
  127. <vxe-table-column title="操作" width="320">
  128. <template slot-scope="scope">
  129. <el-button
  130. v-if="scope.row.id !== 1 && scope.row.id !== 2"
  131. size="mini"
  132. type="text"
  133. icon="el-icon-edit"
  134. @click="handleResetPwd(scope.row)"
  135. v-hasPermi="['system:user:send']"
  136. >初始/重置密码
  137. </el-button>
  138. <el-button
  139. v-if="scope.row.id !== 1 && scope.row.id !== 2"
  140. size="mini"
  141. type="text"
  142. icon="el-icon-circle-check"
  143. @click="handleAuthRole(scope.row)"
  144. v-hasPermi="['system:user:role']"
  145. >分配角色
  146. </el-button>
  147. </template>
  148. </vxe-table-column>
  149. </vxe-table>
  150. <vxe-pager
  151. v-show="showTable"
  152. perfect
  153. :current-page.sync="currentPage"
  154. :page-size.sync="pageSize"
  155. :total="total"
  156. :page-sizes="[10,50,100]"
  157. :layouts="['PrevJump', 'PrevPage','JumpNumber', 'NextPage', 'NextJump', 'Sizes', 'FullJump', 'Total']"
  158. >
  159. </vxe-pager>
  160. </div>
  161. </el-col>
  162. </el-row>
  163. <!-- 添加或修改用户配置对话框 -->
  164. <el-dialog :title="title" :visible.sync="open" width="750px" append-to-body>
  165. <el-form ref="form" :model="form" :rules="rules" width="730px" label-width="100px">
  166. <el-row>
  167. <el-col :span="12">
  168. <el-form-item label="用户账号" prop="username">
  169. <el-input id="un" ref="un" style="width: 220px" v-model="form.username" placeholder="请输入用户账号"
  170. maxlength="20" :disabled="edit"/>
  171. </el-form-item>
  172. </el-col>
  173. <el-col :span="12">
  174. <el-form-item label="身份证号码" prop="idcard">
  175. <el-input style="width: 220px" v-model="form.idcard" placeholder="请输入身份证号码" maxlength="18" :disabled="edit"/>
  176. </el-form-item>
  177. </el-col>
  178. </el-row>
  179. <el-row>
  180. <el-col :span="12">
  181. <el-form-item label="用户类型">
  182. <el-select style="width: 220px" v-model="form.usertype" placeholder="请选择类型" :disabled="edit">
  183. <el-option
  184. v-for="item in typeOptions"
  185. :key="item.value"
  186. :label="item.label"
  187. :value="item.value"
  188. ></el-option>
  189. </el-select>
  190. </el-form-item>
  191. </el-col>
  192. <el-col :span="12">
  193. <el-form-item label="用户姓名" prop="nickname">
  194. <el-input style="width: 220px" v-model="form.nickname" placeholder="请输入用户姓名" maxlength="30"/>
  195. </el-form-item>
  196. </el-col>
  197. </el-row>
  198. <el-row>
  199. <el-col :span="12">
  200. <el-form-item label="用户邮箱" prop="mailbox">
  201. <el-input style="width: 220px" v-model="form.mailbox" placeholder="请输入邮箱" maxlength="50"/>
  202. </el-form-item>
  203. </el-col>
  204. <el-col :span="12">
  205. <el-form-item label="手机号码" prop="phonenumber">
  206. <el-input style="width: 220px" v-model="form.phonenumber" placeholder="请输入手机号码" maxlength="11"/>
  207. </el-form-item>
  208. </el-col>
  209. </el-row>
  210. <el-row>
  211. <el-col :span="12">
  212. <el-form-item label="账号截止日期">
  213. <el-date-picker
  214. value-format="yyyy-MM-dd"
  215. v-model="form.expDate"
  216. type="date"
  217. placeholder="请选择账号截止日期"
  218. :picker-options="pickerOptions">
  219. </el-date-picker>
  220. </el-form-item>
  221. </el-col>
  222. </el-row>
  223. </el-form>
  224. <div slot="footer" class="dialog-footer">
  225. <el-button type="primary" @click="submitForm">确 定</el-button>
  226. <el-button @click="cancel">取 消</el-button>
  227. </div>
  228. </el-dialog>
  229. <!-- 分配角色对话框 -->
  230. <el-dialog :title="jstitle" :visible.sync="jsopen" width="650px" append-to-body>
  231. <el-form width="630px" label-width="80px">
  232. <el-row>
  233. <el-col :span="12">
  234. <el-form-item label="用户账号">
  235. <el-input style="width: 220px" v-model="jsusername"
  236. maxlength="20" :disabled="true"/>
  237. </el-form-item>
  238. </el-col>
  239. <el-col :span="12">
  240. <el-form-item label="用户姓名">
  241. <el-input style="width: 220px" v-model="jsnickname" maxlength="30" :disabled="true"/>
  242. </el-form-item>
  243. </el-col>
  244. </el-row>
  245. <el-row>
  246. <el-col :span="12">
  247. <el-form-item label="角色类型" style="width: 100px">
  248. <el-select style="width: 220px" v-model="userRoleId" placeholder="请选择类型" :disabled="edit" @change="getMenu(userRoleId)">
  249. <el-option
  250. v-for="item in roleList"
  251. :key="item.roleId"
  252. :label="item.roleName"
  253. :value="item.roleId"
  254. ></el-option>
  255. </el-select>
  256. </el-form-item>
  257. </el-col>
  258. </el-row>
  259. <el-row>
  260. <el-col :span="12">
  261. <el-form-item label="菜单权限">
  262. <el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event, 'menu')">展开/折叠</el-checkbox>
  263. <el-tree
  264. class="tree-border"
  265. :data="menuOptions"
  266. ref="menu"
  267. node-key="id"
  268. empty-text="无数据,请选择字符标识!"
  269. :props="defaultProps"
  270. ></el-tree>
  271. </el-form-item>
  272. </el-col>
  273. </el-row>
  274. </el-form>
  275. <div slot="footer" class="dialog-footer">
  276. <el-button type="primary" @click="jssubmitForm">确 定</el-button>
  277. <el-button @click="jscancel">取 消</el-button>
  278. </div>
  279. </el-dialog>
  280. </div>
  281. </template>
  282. <script>
  283. import {debounce} from 'lodash'
  284. export default {
  285. name: "User",
  286. data() {
  287. return {
  288. pickerOptions:{
  289. disabledDate(time){
  290. return time.getTime()<Date.now()-8.64e7
  291. }
  292. },
  293. id: undefined,
  294. username: undefined,
  295. nickname: undefined,
  296. idcard: undefined,
  297. phonenumber: undefined,
  298. mailbox: undefined,
  299. status: "0",
  300. usertype: "0",
  301. remark: undefined,
  302. expDate: undefined,
  303. // 角色表格数据
  304. jsuserid: '',
  305. roleList: [],
  306. jsusername: '',
  307. jsnickname: '',
  308. userRoleId: '',
  309. jsusertype: '',
  310. statusOptions: [
  311. {value: '0', label: '正常'},
  312. {value: '1', label: '锁定'},
  313. {value: '2', label: '注销'}
  314. ],
  315. typeOptions: [
  316. {value: '0', label: '管理员'},
  317. {value: '1', label: '业务用户'}
  318. ],
  319. // 遮罩层
  320. loading: true,
  321. showTable: true,
  322. // 选中数组
  323. ids: [],
  324. // 非单个禁用
  325. single: true,
  326. // 非多个禁用
  327. multiple: true,
  328. currentPage: 1,
  329. pageSize: 10,
  330. // 总条数
  331. total: 0,
  332. // 用户表格数据
  333. userList: [],
  334. // 弹出层标题
  335. title: "",
  336. // 角色分配弹出层标题
  337. jstitle: "",
  338. // 是否显示弹出层
  339. open: false,
  340. // 角色是否显示弹出层
  341. jsopen: false,
  342. // 默认密码
  343. initPassword: undefined,
  344. // 角色选项
  345. roleOptions: [],
  346. // 表单参数
  347. form: {},
  348. // 查询参数
  349. queryParams: {
  350. username: undefined,
  351. phonenumber: undefined,
  352. status: undefined
  353. },
  354. menuExpand: false,
  355. // 菜单列表
  356. menuOptions: [],
  357. defaultProps: {
  358. children: "children",
  359. label: "label"
  360. },
  361. edit: false,
  362. // 表单校验
  363. rules: {
  364. username: [
  365. {required: true, message: "用户账号不能为空", trigger: "blur"},
  366. {min: 5, max: 20, message: '用户账号长度必须介于 5 和 20 之间', trigger: 'blur'}
  367. ],
  368. nickname: [
  369. {required: true, message: "用户姓名不能为空", trigger: "blur"},
  370. {min: 2, max: 20, message: '用户姓名长度必须介于 2 和 20 之间', trigger: 'blur'}
  371. ],
  372. idcard: [
  373. {required: true, message: "身份证号码不能为空", trigger: "blur"},
  374. {min: 15, max: 18, message: '身份证号请输入15位或者18位', trigger: 'blur'}
  375. ],
  376. mailbox: [
  377. {required: true, message: "邮箱不能为空", trigger: "blur"},
  378. {type: "email", message: "请输入正确的邮箱地址", trigger: ["blur", "change"]}
  379. ],
  380. phonenumber: [
  381. {required: true, message: "手机号码不能为空", trigger: "blur"},
  382. {pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码", trigger: "blur"}
  383. ]
  384. }
  385. };
  386. },
  387. watch: {},
  388. created() {
  389. this.getList()
  390. },
  391. methods: {
  392. // 树权限(展开/折叠)
  393. handleCheckedTreeExpand(value, type) {
  394. if (type == 'menu') {
  395. let treeList = this.menuOptions;
  396. for (let i = 0; i < treeList.length; i++) {
  397. this.$refs.menu.store.nodesMap[treeList[i].id].expanded = value;
  398. }
  399. }
  400. },
  401. setRowClass({row, rowIndex}){
  402. if(row.signstr === '1'){
  403. return "background: #FFEFD5";
  404. }
  405. },
  406. // 注销操作
  407. handleLogOff(){
  408. let _selectData = this.$refs.userTable.getRadioRecord(true)
  409. if (_selectData == null) {
  410. this.$message({
  411. type: 'warning',
  412. message: '请选择记录!'
  413. });
  414. return
  415. }
  416. if (_selectData.id == 1) {
  417. this.$message({
  418. type: 'warning',
  419. message: '内置系统管理员用户不能注销!'
  420. });
  421. return
  422. }
  423. if (_selectData.id == 2) {
  424. this.$message({
  425. type: 'warning',
  426. message: '内置审计管理员用户不能注销!'
  427. });
  428. return
  429. }
  430. if (_selectData.status == 2) {
  431. this.$message({
  432. type: 'warning',
  433. message: '已注销的账号不能再次注销!'
  434. });
  435. return
  436. }
  437. if (_selectData.signstr == '1') {
  438. this.$message({
  439. type: 'warning',
  440. message: '存在待审核,审核管理员审核后请刷新列表'
  441. });
  442. return
  443. }
  444. this.$prompt('请输入登录密码', '鉴别操作', {
  445. confirmButtonText: '确定',
  446. cancelButtonText: '取消',
  447. inputType: 'text',
  448. customClass:'no-autofill-pwd',
  449. inputValidator: (val) => {
  450. if (val === null || val.length < 1 || val.length > 20) {
  451. return false;
  452. }
  453. },
  454. inputErrorMessage: '不能为空,最多可录入20个字符',
  455. beforeClose(action, instance, done) {
  456. if (action === "confirm") {
  457. instance.$refs["confirm"].$el.onclick = (function (e) {
  458. e = e || window.event;
  459. if (e.detail != 0) {
  460. done();
  461. }
  462. })();
  463. } else {
  464. done();
  465. }
  466. }
  467. }).then(async ({value}) => {
  468. this.doLogoff(_selectData, value)
  469. }).catch((e) => {
  470. })
  471. },
  472. /**
  473. * 注销提交
  474. */
  475. doLogoff: debounce(async function (_selectData, againPwd) {
  476. let sysTime
  477. let lk
  478. await this.$axios.get('/sysPolicyController/getLicenseKey').then((res) => {
  479. sysTime = res.data.sysTime
  480. lk = res.data.lk
  481. }).catch((error) => {
  482. })
  483. const param = {
  484. id: _selectData.id,
  485. againPwd: againPwd,
  486. sysTime: sysTime,
  487. lk: lk
  488. }
  489. await this.$axios.post('/sysUserController/logOffUser', param).then((res) => {
  490. if (res.code == 0) {
  491. this.$message({
  492. type: 'success',
  493. message: res.data
  494. });
  495. this.getList();
  496. } else {
  497. this.$message({
  498. type: 'error',
  499. message: res.data
  500. });
  501. }
  502. }).catch((error) => {
  503. this.$message({
  504. type: 'error',
  505. message: '删除失败!'
  506. });
  507. this.loading = false
  508. })
  509. }, 500),
  510. // 列表状态格式化
  511. statusFormat({cellValue}) {
  512. let belongTo = '未知的类型'
  513. for (let i = 0; i < this.statusOptions.length; i++) {
  514. if (cellValue == "0") {
  515. belongTo = "正常"
  516. } else if (cellValue == "1") {
  517. belongTo = "锁定"
  518. } else if (cellValue == "2") {
  519. belongTo = "注销"
  520. }
  521. }
  522. return belongTo
  523. },
  524. // 列表状态格式化
  525. typeFormat({cellValue}) {
  526. let belongTo = '未知的类型'
  527. for (let i = 0; i < this.typeOptions.length; i++) {
  528. if (cellValue == "0") {
  529. belongTo = "管理员"
  530. } else if (cellValue == "1") {
  531. belongTo = "业务用户"
  532. }
  533. }
  534. return belongTo
  535. },
  536. /** 搜索按钮操作 */
  537. handleQuery: debounce(function () {
  538. this.currentPage = 1
  539. this.pageSize = 10
  540. this.getList()
  541. }, 1000),
  542. /** 查询用户列表 */
  543. async getList() {
  544. this.loading = true;
  545. let sysTime
  546. let lk
  547. await this.$axios.get('/sysPolicyController/getLicenseKey').then((res) => {
  548. sysTime = res.data.sysTime
  549. lk = res.data.lk
  550. }).catch((error) => {
  551. this.loading = false;
  552. })
  553. var searchParams = {
  554. currentPage: this.currentPage,
  555. pageSize: this.pageSize,
  556. username: this.queryParams.username,
  557. phonenumber: this.queryParams.phonenumber,
  558. status: this.queryParams.status,
  559. sysTime: sysTime,
  560. lk: lk
  561. }
  562. await this.$axios.get('/sysUserController/getAll',
  563. {params: searchParams}).then((res) => {
  564. this.userList = res.data
  565. this.total = res.data.length
  566. if (res.data.records == '') {
  567. this.showTable = false
  568. } else {
  569. this.showTable = true
  570. }
  571. this.loading = false
  572. }).catch((error) => {
  573. this.loading = false;
  574. // this.$message.error(error)
  575. })
  576. },
  577. // 用户状态修改
  578. handleStatusChange(row) {
  579. let text = row.status === "0" ? "启用" : "停用";
  580. this.$modal.confirm('确认要"' + text + '""' + row.userName + '"用户吗?').then(function () {
  581. return changeUserStatus(row.userId, row.status);
  582. }).then(() => {
  583. this.$modal.msgSuccess(text + "成功");
  584. }).catch(function () {
  585. row.status = row.status === "0" ? "1" : "0";
  586. });
  587. },
  588. // 取消按钮
  589. cancel() {
  590. this.getList()
  591. this.open = false;
  592. this.reset();
  593. },
  594. // 角色取消按钮
  595. jscancel() {
  596. this.jsopen = false;
  597. },
  598. // 表单重置
  599. reset() {
  600. this.edit = false;
  601. this.form = {
  602. id: undefined,
  603. username: undefined,
  604. nickname: undefined,
  605. idcard: undefined,
  606. phonenumber: undefined,
  607. mailbox: undefined,
  608. status: "0",
  609. usertype: "0",
  610. remark: undefined,
  611. expDate: undefined
  612. };
  613. // this.resetForm("form");
  614. },
  615. /** 重置按钮操作 */
  616. resetQuery() {
  617. this.resetForm("queryForm");
  618. },
  619. /** 新增按钮操作 */
  620. handleAdd() {
  621. this.reset();
  622. this.edit = false;
  623. this.open = true;
  624. this.title = "添加用户";
  625. this.form.password = this.initPassword;
  626. },
  627. /** 提交按钮 */
  628. submitForm: debounce(function () {
  629. this.$refs["form"].validate(async valid => {
  630. if (valid) {
  631. if (this.form.id != undefined) {
  632. this.$prompt('请输入登录密码', '鉴别操作', {
  633. confirmButtonText: '确定',
  634. cancelButtonText: '取消',
  635. inputType: 'text',
  636. customClass:'no-autofill-pwd',
  637. inputValidator: (val) => {
  638. if (val === null || val.length < 1 || val.length > 20) {
  639. return false;
  640. }
  641. },
  642. inputErrorMessage: '不能为空,最多可录入20个字符',
  643. beforeClose(action, instance, done) {
  644. if (action === "confirm") {
  645. instance.$refs["confirm"].$el.onclick = (function (e) {
  646. e = e || window.event;
  647. if (e.detail != 0) {
  648. done();
  649. }
  650. })();
  651. } else {
  652. done();
  653. }
  654. }
  655. }).then(async ({value}) => {
  656. let sysTime
  657. let lk
  658. await this.$axios.get('/sysPolicyController/getLicenseKey').then((res) => {
  659. sysTime = res.data.sysTime
  660. lk = res.data.lk
  661. }).catch((error) => {
  662. })
  663. this.form.sysTime = sysTime
  664. this.form.lk = lk
  665. this.form.againPwd = value
  666. // 更新操作
  667. await this.$axios.post('/sysUserController/updateUser', this.form).then((res) => {
  668. if (res.code == 0) {
  669. this.$message.success(res.data)
  670. this.open = false;
  671. this.reset();
  672. this.getList();
  673. }
  674. if (res.code == 1) {
  675. this.$message.error(res.data)
  676. }
  677. this.loading = false
  678. }).catch((error) => {
  679. // this.$message.error(error)
  680. this.loading = false
  681. })
  682. }).catch((e) => {
  683. })
  684. } else {
  685. let sysTime
  686. let lk
  687. await this.$axios.get('/sysPolicyController/getLicenseKey').then((res) => {
  688. sysTime = res.data.sysTime
  689. lk = res.data.lk
  690. }).catch((error) => {
  691. })
  692. this.form.sysTime = sysTime
  693. this.form.lk = lk
  694. await this.$axios.post('/sysUserController/addUser', this.form).then((res) => {
  695. if (res.code == 0) {
  696. this.$message.success(res.data)
  697. this.open = false;
  698. this.reset();
  699. this.getList();
  700. }
  701. if (res.code == 1) {
  702. this.$message.error(res.data)
  703. }
  704. this.loading = false
  705. }).catch((error) => {
  706. // this.$message.error(error)
  707. this.loading = false
  708. })
  709. }
  710. }
  711. });
  712. }, 1000),
  713. /** 重置密码按钮操作 */
  714. handleResetPwd(row) {
  715. if (row.signstr == '1') {
  716. this.$message({
  717. type: 'warning',
  718. message: '存在待审核,审核管理员审核后请刷新列表'
  719. });
  720. return
  721. }
  722. if (row.status == '2') {
  723. this.$message({
  724. type: 'warning',
  725. message: '已注销的账号不能初始/重置密码!'
  726. });
  727. return
  728. }
  729. this.$prompt('请输入登录密码', '鉴别操作', {
  730. confirmButtonText: '确定',
  731. cancelButtonText: '取消',
  732. inputType: 'text',
  733. customClass:'no-autofill-pwd',
  734. inputValidator: (val) => {
  735. if (val === null || val.length < 1 || val.length > 20) {
  736. return false;
  737. }
  738. },
  739. inputErrorMessage: '不能为空,最多可录入20个字符',
  740. beforeClose(action, instance, done) {
  741. if (action === "confirm") {
  742. instance.$refs["confirm"].$el.onclick = (function (e) {
  743. e = e || window.event;
  744. if (e.detail != 0) {
  745. done();
  746. }
  747. })();
  748. } else {
  749. done();
  750. }
  751. }
  752. }).then(async ({value}) => {
  753. this.doResetPwd(row, value)
  754. }).catch((e) => {
  755. })
  756. },
  757. doResetPwd: debounce(async function (row,againPwd) {
  758. let sysTime
  759. let lk
  760. await this.$axios.get('/sysPolicyController/getLicenseKey').then((res) => {
  761. sysTime = res.data.sysTime
  762. lk = res.data.lk
  763. }).catch((error) => {
  764. })
  765. const param = {
  766. id: row.id,
  767. againPwd: againPwd,
  768. sysTime: sysTime,
  769. lk: lk
  770. }
  771. await this.$axios.post('/sysUserController/resetPassword', param).then((res) => {
  772. if (res.code == 0) {
  773. this.$message({
  774. type: 'success',
  775. message: '创建并发送成功!'
  776. });
  777. } else {
  778. this.$message({
  779. type: 'error',
  780. message: res.data
  781. });
  782. }
  783. }).catch((error) => {
  784. this.$message({
  785. type: 'error',
  786. message: '创建密码失败!'
  787. });
  788. console.log(error)
  789. this.loading = false
  790. })
  791. }, 1000),
  792. /** 删除按钮操作 */
  793. handleDelete() {
  794. const _selectData = this.$refs.userTable.getRadioRecord(true)
  795. if (_selectData == null) {
  796. this.$message({
  797. type: 'warning',
  798. message: '请选择记录!'
  799. });
  800. return
  801. }
  802. if (_selectData.id == 1) {
  803. this.$message({
  804. type: 'warning',
  805. message: '内置系统管理员不能删除!'
  806. });
  807. return
  808. }
  809. if (_selectData.id == 2) {
  810. this.$message({
  811. type: 'warning',
  812. message: '内置审计管理员不能删除!'
  813. });
  814. return
  815. }
  816. this.$prompt('请输入密码', '鉴别操作', {
  817. confirmButtonText: '确定',
  818. cancelButtonText: '取消',
  819. inputType: 'text',
  820. customClass:'no-autofill-pwd',
  821. inputValidator: (val) => {
  822. if (val === null || val.length < 1 || val.length > 20) {
  823. return false;
  824. }
  825. },
  826. inputErrorMessage: '不能为空,最多可录入20个字符',
  827. beforeClose(action, instance, done) {
  828. if (action === "confirm") {
  829. instance.$refs["confirm"].$el.onclick = (function (e) {
  830. e = e || window.event;
  831. if (e.detail != 0) {
  832. done();
  833. }
  834. })();
  835. } else {
  836. done();
  837. }
  838. }
  839. }).then(async ({value}) => {
  840. this.doDelete(_selectData, value)
  841. }).catch((e) => {
  842. })
  843. },
  844. /**
  845. * 删除提交
  846. */
  847. doDelete: debounce(async function (_selectData, againPwd) {
  848. let sysTime
  849. let lk
  850. await this.$axios.get('/sysPolicyController/getLicenseKey').then((res) => {
  851. sysTime = res.data.sysTime
  852. lk = res.data.lk
  853. }).catch((error) => {
  854. })
  855. const param = {
  856. id: _selectData.id,
  857. againPwd: againPwd,
  858. sysTime: sysTime,
  859. lk: lk
  860. }
  861. await this.$axios.post('/sysUserController/delUser', param).then((res) => {
  862. if (res.code == 0) {
  863. this.$message({
  864. type: 'success',
  865. message: res.data
  866. });
  867. this.getList();
  868. } else {
  869. this.$message({
  870. type: 'error',
  871. message: res.data
  872. });
  873. }
  874. }).catch((error) => {
  875. this.$message({
  876. type: 'error',
  877. message: '删除失败!'
  878. });
  879. this.loading = false
  880. })
  881. }, 500),
  882. /** 修改按钮操作 */
  883. handleUpdate() {
  884. this.reset();
  885. let _selectData = this.$refs.userTable.getRadioRecord(true)
  886. if (_selectData == null) {
  887. this.$message({
  888. type: 'warning',
  889. message: '请选择记录!'
  890. });
  891. return
  892. }
  893. if (_selectData.id == 1) {
  894. this.$message({
  895. type: 'warning',
  896. message: '内置系统管理员不能修改!'
  897. });
  898. return
  899. }
  900. if (_selectData.id == 2) {
  901. this.$message({
  902. type: 'warning',
  903. message: '内置审计管理员不能修改!'
  904. });
  905. return
  906. }
  907. if (_selectData.status == 2) {
  908. this.$message({
  909. type: 'warning',
  910. message: '注销的账号不能操作!'
  911. });
  912. return
  913. }
  914. if (_selectData.signstr == '1') {
  915. this.$message({
  916. type: 'warning',
  917. message: '存在待审核,审核管理员审核后请刷新列表'
  918. });
  919. return
  920. }
  921. this.form = _selectData;
  922. this.open = true;
  923. this.title = "修改用户";
  924. this.edit = true;
  925. },
  926. /** 解锁按钮操作 */
  927. handleRelock() {
  928. const _selectData = this.$refs.userTable.getRadioRecord(true)
  929. if (_selectData == null) {
  930. this.$message({
  931. type: 'warning',
  932. message: '请选择记录!'
  933. });
  934. return
  935. }
  936. if (_selectData.status !== '1') {
  937. this.$message({
  938. type: 'warning',
  939. message: '只能对【锁定】状态的进行解锁!'
  940. });
  941. return
  942. }
  943. if (_selectData.signstr == '1') {
  944. this.$message({
  945. type: 'warning',
  946. message: '存在待审核,审核管理员审核后请刷新列表'
  947. });
  948. return
  949. }
  950. this.$prompt('请输入登录密码', '鉴别操作', {
  951. confirmButtonText: '确定',
  952. cancelButtonText: '取消',
  953. inputType: 'text',
  954. customClass:'no-autofill-pwd',
  955. inputValidator: (val) => {
  956. if (val === null || val.length < 1 || val.length > 20) {
  957. return false;
  958. }
  959. },
  960. inputErrorMessage: '不能为空,最多可录入20个字符',
  961. beforeClose(action, instance, done) {
  962. if (action === "confirm") {
  963. instance.$refs["confirm"].$el.onclick = (function (e) {
  964. e = e || window.event;
  965. if (e.detail != 0) {
  966. done();
  967. }
  968. })();
  969. } else {
  970. done();
  971. }
  972. }
  973. }).then(async ({value}) => {
  974. this.doRelock(_selectData, value)
  975. }).catch((e) => {
  976. })
  977. },
  978. /**
  979. * 解锁提交
  980. */
  981. doRelock: debounce(async function (_selectData, againPwd) {
  982. let sysTime
  983. let lk
  984. await this.$axios.get('/sysPolicyController/getLicenseKey').then((res) => {
  985. sysTime = res.data.sysTime
  986. lk = res.data.lk
  987. }).catch((error) => {
  988. })
  989. const param = {
  990. id: _selectData.id,
  991. againPwd: againPwd,
  992. sysTime: sysTime,
  993. lk: lk
  994. }
  995. await this.$axios.post('/sysUserController/relockUser', param).then((res) => {
  996. if (res.code == 0) {
  997. this.$message({
  998. type: 'success',
  999. message: '解锁成功!'
  1000. });
  1001. this.getList();
  1002. } else {
  1003. this.$message({
  1004. type: 'error',
  1005. message: res.data
  1006. });
  1007. }
  1008. }).catch((error) => {
  1009. this.$message({
  1010. type: 'error',
  1011. message: '解锁失败!'
  1012. });
  1013. console.log(error)
  1014. this.loading = false
  1015. })
  1016. }, 1000),
  1017. /**
  1018. * 角色类型改变时更改权限列表
  1019. * @param rowRoleId
  1020. * @returns {Promise<unknown>}
  1021. */
  1022. getMenu(rowRoleId){
  1023. console.log("rowRoleId="+rowRoleId)
  1024. const a = this.$axios
  1025. const _this = this
  1026. return new Promise(async function (resolve, reject) {
  1027. let sysTime
  1028. let lk
  1029. await a.get('/sysPolicyController/getLicenseKey').then((res) => {
  1030. sysTime = res.data.sysTime
  1031. lk = res.data.lk
  1032. }).catch((error) => {
  1033. })
  1034. var param1 = {
  1035. roleId: rowRoleId,
  1036. sysTime: sysTime,
  1037. lk: lk
  1038. }
  1039. await a.get('/sysMenuController/roleMenuTreeselect',
  1040. {params: param1}).then((res) => {
  1041. _this.menuOptions = res.data.menus;
  1042. })
  1043. }).catch((error) => {
  1044. console.error('获取用户角色出错' + error)
  1045. })
  1046. },
  1047. getUserRole(userid) {
  1048. const a = this.$axios
  1049. const _this = this
  1050. return new Promise(async function (resolve, reject) {
  1051. let sysTime
  1052. let lk
  1053. await a.get('/sysPolicyController/getLicenseKey').then((res) => {
  1054. sysTime = res.data.sysTime
  1055. lk = res.data.lk
  1056. }).catch((error) => {
  1057. })
  1058. var userRoleParams = {
  1059. userId: userid,
  1060. sysTime: sysTime,
  1061. lk: lk
  1062. }
  1063. await a.get('/sysUserController/getUserRole',
  1064. {params: userRoleParams}).then(res => {
  1065. _this.userRoleId = res.data.roleId
  1066. // 返回userRole对象
  1067. resolve(res.data)
  1068. })
  1069. let sysTime1
  1070. let lk1
  1071. await a.get('/sysPolicyController/getLicenseKey').then((res) => {
  1072. sysTime1 = res.data.sysTime
  1073. lk1 = res.data.lk
  1074. }).catch((error) => {
  1075. })
  1076. var param1 = {
  1077. roleId: _this.userRoleId,
  1078. sysTime: sysTime1,
  1079. lk: lk1
  1080. }
  1081. await a.get('/sysMenuController/roleMenuTreeselect',
  1082. {params: param1}).then((res) => {
  1083. _this.menuOptions = res.data.menus;
  1084. })
  1085. }).catch((error) => {
  1086. console.error('获取用户角色出错' + error)
  1087. })
  1088. },
  1089. getRoleByType(usertype) {
  1090. // 根据用户类型获取角色列表
  1091. const a = this.$axios
  1092. let _this = this
  1093. return new Promise(async function (resolve, reject) {
  1094. let sysTime
  1095. let lk
  1096. await a.get('/sysPolicyController/getLicenseKey').then((res) => {
  1097. sysTime = res.data.sysTime
  1098. lk = res.data.lk
  1099. }).catch((error) => {
  1100. })
  1101. var searchParams = {
  1102. usertype: usertype,
  1103. sysTime: sysTime,
  1104. lk: lk
  1105. }
  1106. await a.get('/sysRoleController/getRoleByType',
  1107. {params: searchParams}).then(res => {
  1108. if (res.code == 0) {
  1109. // 返回角色列表
  1110. _this.roleList = res.data
  1111. resolve(res.data)
  1112. } else {
  1113. // 输出后端返回信息
  1114. this.$message({
  1115. type: 'error',
  1116. message: res.data
  1117. });
  1118. }
  1119. })
  1120. }).catch((error) => {
  1121. this.loading = false
  1122. this.$message.error(error)
  1123. })
  1124. },
  1125. /** 分配角色操作 */
  1126. handleAuthRole: debounce(function (row) {
  1127. if (row.id == 1) {
  1128. this.$message({
  1129. type: 'warning',
  1130. message: '内置系统管理员不能修改!'
  1131. });
  1132. return
  1133. }
  1134. if (row.id == 2) {
  1135. this.$message({
  1136. type: 'warning',
  1137. message: '内置审计管理员不能修改!'
  1138. });
  1139. return
  1140. }
  1141. if (row.status == '2') {
  1142. this.$message({
  1143. type: 'warning',
  1144. message: '注销的账号不能操作!'
  1145. });
  1146. return
  1147. }
  1148. if (row.signstr == '1') {
  1149. this.$message({
  1150. type: 'warning',
  1151. message: '存在待审核,审核管理员审核后请刷新列表'
  1152. });
  1153. return
  1154. }
  1155. this.jsuserid = row.id
  1156. this.jsusername = row.username
  1157. this.jsnickname = row.nickname
  1158. this.getRoleByType(row.usertype)
  1159. this.getUserRole(this.jsuserid)
  1160. this.jsopen = true;
  1161. this.title = "分配角色";
  1162. // Promise.all([this.getRoleByType(row.usertype), this.getUserRole(this.jsuserid)]).then((res) => {
  1163. // if (res[1] != '' && res[1] != undefined) {
  1164. // const roleTable = this.$refs.xTable.getTableData()
  1165. // for (var i = 0; i < roleTable.tableData.length; i++) {
  1166. // if (res[1].roleId == roleTable.tableData[i].roleId) {
  1167. // // 将原有的角色勾选上
  1168. // this.$refs.xTable.setCheckboxRow(roleTable.tableData[i], true)
  1169. // }
  1170. // }
  1171. // }
  1172. // }).catch(e => {
  1173. // this.loading = false
  1174. // this.$message.error("获取分配角色异常:" + e)
  1175. // })
  1176. }, 1000),
  1177. /** 角色分配提交按钮 */
  1178. jssubmitForm: debounce(async function () {
  1179. let sysTime
  1180. let lk
  1181. await this.$axios.get('/sysPolicyController/getLicenseKey').then((res) => {
  1182. sysTime = res.data.sysTime
  1183. lk = res.data.lk
  1184. }).catch((error) => {
  1185. })
  1186. // 提交后台角色分配
  1187. const param = {
  1188. userId: this.jsuserid,
  1189. roleId: this.userRoleId,
  1190. sysTime: sysTime,
  1191. lk: lk
  1192. }
  1193. await this.$axios.post('/sysUserController/authRole', param).then((res) => {
  1194. if (res.code == 0) {
  1195. this.$message({
  1196. type: 'success',
  1197. message: res.data
  1198. });
  1199. this.jscancel()
  1200. this.getList()
  1201. } else {
  1202. this.$message({
  1203. type: 'error',
  1204. message: res.data
  1205. });
  1206. }
  1207. }).catch((error) => {
  1208. this.$message({
  1209. type: 'error',
  1210. message: '角色分配失败!'
  1211. });
  1212. this.loading = false
  1213. })
  1214. }, 1000)
  1215. }
  1216. };
  1217. </script>
  1218. <style rel="stylesheet/scss" lang="scss">
  1219. .no-autofill-pwd{
  1220. .el-message-box__content{
  1221. .el-input__inner{
  1222. text-security:disc!important;
  1223. -webkit-text-security:disc!important;
  1224. }
  1225. }
  1226. }
  1227. </style>