index.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. <template>
  2. <com-head :options="headList" >
  3. <el-form label-width="84px" inline="true">
  4. <el-form-item label="所属架构:">
  5. <com-company :checkStrictly="true" v-model="search.state.departmentId" />
  6. </el-form-item>
  7. <el-form-item label="用户账户:">
  8. <el-input v-model="search.state.userName" placeholder="请输入手机号"></el-input>
  9. </el-form-item>
  10. <el-form-item label="用户姓名:">
  11. <el-input v-model="search.state.nickName" placeholder="请输入"></el-input>
  12. </el-form-item>
  13. <el-form-item label="状态:">
  14. <el-select v-model="search.state.status" placeholder="全部">
  15. <el-option label="全部" :value="''"></el-option>
  16. <el-option label="可用" :value="1"></el-option>
  17. <el-option label="禁用" :value="0"></el-option>
  18. </el-select>
  19. </el-form-item>
  20. <el-form-item class="searh-btns">
  21. <el-button type="primary" @click="search.submit">查询</el-button>
  22. <el-button type="primary" plain @click="search.reset">重置</el-button>
  23. </el-form-item>
  24. </el-form>
  25. </com-head>
  26. <div class="body-layer" style="padding-top: 8px">
  27. <div class="body-head">
  28. <!-- <h3 style="visibility: hidden;">用户列表</h3> -->
  29. </div>
  30. <el-table
  31. class="user-table"
  32. ref="multipleTable"
  33. :data="dataList.state"
  34. tooltip-effect="dark"
  35. style="width: 100%"
  36. @row-click="selectRow"
  37. >
  38. <el-table-column label="序号" width="55" v-slot:default="{ $index }">
  39. <div style="text-align: center">{{ pag.state.size * (pag.state.currPage - 1) + $index + 1 }}</div>
  40. </el-table-column>
  41. <el-table-column label="手机号(账号)" prop="userName"></el-table-column>
  42. <el-table-column label="用户姓名" prop="nickName"></el-table-column>
  43. <el-table-column label="所属架构" prop="departmentName"></el-table-column>
  44. <el-table-column label="角色" prop="roleName"></el-table-column>
  45. <el-table-column label="状态" v-slot:default="{ row }">
  46. {{row.status ? '可用': '禁用'}}
  47. </el-table-column>
  48. <el-table-column label="操作" v-slot:default="{ row }" v-if="auth.update || auth.updatePwd || auth.delete">
  49. <template v-if="row.id !== ADMIN_USER_ID && row.id !== user.info.id">
  50. <span class="oper-span" @click="updateInfo(row)" v-if="auth.update">修改</span>
  51. <span class="oper-span" @click="changeUserStatus(row)" v-if="auth.delete" style="color: var(--primaryColor)">
  52. {{ row.status ? '禁用' : '启用' }}
  53. </span>
  54. <span class="oper-span" @click="detailInfo(row)" v-if="auth.update" style="color: var(--primaryColor)">删除</span>
  55. </template>
  56. </el-table-column>
  57. </el-table>
  58. <com-pagination
  59. @size-change="pag.sizeChange"
  60. @current-change="pag.currentChange"
  61. :current-page="pag.state.currPage"
  62. :page-size="pag.state.size"
  63. layout="total, sizes, prev, pager, next, jumper"
  64. :total="pag.state.total"/>
  65. </div>
  66. <com-dialog
  67. :title="(operRoleId ? '修改架构' : '启用')"
  68. v-model:show="oper.state.show"
  69. @submit="operItem"
  70. width="540"
  71. >
  72. <el-form ref="form" :model="form" label-width="90px" class="user-from">
  73. <el-form-item label="用户姓名:" class="roleName">
  74. <el-input ref="groupName" v-model="oper.state.nickName" :maxlength="usermaxlength" @input="changeValue" placeholder="请输入"></el-input>
  75. </el-form-item>
  76. <el-form-item label="所属架构:" class="mandatory" v-show="operRoleId">
  77. <com-company v-model="oper.state.departmentId" @update:data="({level}) => (oper.state.roleId = level)" style="width: 100%" hideAll />
  78. </el-form-item>
  79. <el-form-item label="角色:" class="roleName">
  80. <com-role v-model="oper.state.roleId" style="width: 100%" allText="请选择" hideAll :notDefault="true" :disabled="true" />
  81. </el-form-item>
  82. <el-form-item v-if="!operRoleId">
  83. <p class="maker">注:首次启用,需设置用户角色;用户被启用后,可正常登录使用。</p>
  84. </el-form-item>
  85. </el-form>
  86. </com-dialog>
  87. </template>
  88. <script>
  89. import { ref } from "vue";
  90. import getTableState from "@/state/tableRef";
  91. import comDialog from "@/components/dialog";
  92. import comHead from "@/components/head";
  93. import comCompany from "@/components/company-select";
  94. import comPagination from "@/components/pagination";
  95. import roleCompany from "@/components/role-select";
  96. import auth from "@/state/viewAuth";
  97. import user from "@/state/user";
  98. import axios from 'axios'
  99. import {encryption} from '@/util'
  100. import {PSW, PHONE} from '@/constant/REG'
  101. import {ADMIN_USER_ID} from "@/constant";
  102. import {
  103. getUserList,
  104. updateUser,
  105. changeUserStatus,
  106. remove
  107. } from '@/request/config'
  108. import { getApp } from '../../app';
  109. export default {
  110. name: 'user',
  111. setup() {
  112. const state = getTableState({
  113. getUrl: getUserList,
  114. updateUrl: updateUser,
  115. operAttr: {
  116. nickName: "",
  117. userName: "",
  118. departmentId: "",
  119. password: '',
  120. confirmPwd: '',
  121. roleId: "",
  122. maxlevel: 1,
  123. },
  124. searchAttr: { nickName: "", status: '', departmentId: '',userName: '' },
  125. });
  126. const headList = ref([{ name: "用户管理", value: 2 }]);
  127. const operRoleId = ref('')
  128. const usermaxlength = ref(30)
  129. const updateInfo = (row) => {
  130. if (!row.status) {
  131. return getApp().$message.error('请先启用用户', '提示')
  132. }
  133. operRoleId.value = row.roleId
  134. state.oper.value.readyUpdate(row)
  135. }
  136. console.log(user)
  137. return { ...state, headList, updateInfo, auth, user, operRoleId, ADMIN_USER_ID,usermaxlength };
  138. },
  139. methods: {
  140. changeValue () {
  141. let leng = this.validateTextLength(this.oper.state.nickName)
  142. if (leng >= 15) {
  143. this.usermaxlength = leng
  144. } else {
  145. this.usermaxlength = 30
  146. }
  147. },
  148. validateTextLength (value) {
  149. // 中文、中文标点、全角字符按1长度,英文、英文符号、数字按0.5长度计算
  150. let cnReg = /([\u4e00-\u9fa5]|[\u3000-\u303F]|[\uFF00-\uFF60])/g
  151. let mat = value.match(cnReg)
  152. let length
  153. if (mat) {
  154. length = (mat.length + (value.length - mat.length) * 0.5)
  155. return length
  156. } else {
  157. return value.length * 0.5
  158. }
  159. },
  160. async operItem() {
  161. const updatePhone = this.oper.state.__oldData ? this.oper.state.__oldData.userName !== this.oper.state.userName : true
  162. if (updatePhone && !PHONE.REG.test(this.oper.state.userName)) {
  163. return this.$message.error(PHONE.tip, '提示')
  164. }
  165. if (this.oper.state.password !== this.oper.state.confirmPwd) {
  166. return this.$message.error('两次密码不一致!', '提示')
  167. }
  168. if (!this.oper.state.roleId) {
  169. return this.$message.error('请选择用户角色', '提示')
  170. }
  171. if (!this.operRoleId && !(await this.$confirm('用户被启用后,可正常登录使用。确定要启用吗?', '提示'))) {
  172. return;
  173. }
  174. if (this.oper.state.id) {
  175. let updateState = {...this.oper.state, password: void 0, confirmPwd: void 0, updatePwd: void 0, userId: this.oper.state.id}
  176. if (!updatePhone) {
  177. delete updateState.userName
  178. }
  179. let state = {...this.oper.state}
  180. await this.oper.update(updateState)
  181. await this.changeUserStatus(state, true)
  182. } else if (this.oper.state.password === this.oper.state.confirmPwd) {
  183. if (PSW.REG.test(this.oper.state.password)) {
  184. let cryPsw = encryption(this.oper.state.password)
  185. this.oper.insert({
  186. ...this.oper.state,
  187. password: cryPsw,
  188. confirmPwd: cryPsw,
  189. updatePwd: void 0
  190. })
  191. } else {
  192. this.$message.error(PSW.tip, '提示')
  193. }
  194. }
  195. },
  196. async changeUserStatus (row, d) {
  197. if (!d && (!row.roleId && !row.status)) {
  198. this.operRoleId = row.roleId
  199. return this.oper.readyUpdate(row)
  200. }
  201. let msg = row.status ? `用户被禁用后,无法登录使用。确定要禁用吗?` : `用户被启用后,可正常登录使用。确定要启用吗?`
  202. try {
  203. if (d || (await this.$confirm(msg, '提示'))) {
  204. await axios.post(changeUserStatus, {status: Number(!row.status), userId: row.id})
  205. this.dataList.refer()
  206. }
  207. return true
  208. } catch {
  209. return false
  210. }
  211. },
  212. async detailInfo (row){
  213. let msg = `用户被删除后,无法登录使用。 确定要删除吗?`
  214. try {
  215. if (await this.$confirm(msg, '提示')) {
  216. await axios.get(remove+row.id,{id:row.id})
  217. this.dataList.refer()
  218. }
  219. return true
  220. } catch {
  221. return false
  222. }
  223. }
  224. },
  225. components: {
  226. "com-dialog": comDialog,
  227. "com-head": comHead,
  228. "com-company": comCompany,
  229. "com-role": roleCompany,
  230. "com-pagination": comPagination
  231. },
  232. };
  233. </script>
  234. <style lang="scss" scoped>
  235. .table-ctrl-right {
  236. .search-scene {
  237. margin: 0 20px 0 26px;
  238. }
  239. i {
  240. margin-left: 20px;
  241. font-size: 1.7rem;
  242. vertical-align: middle;
  243. cursor: pointer;
  244. &.active {
  245. color: var(--primaryColor);
  246. }
  247. }
  248. }
  249. .user-from {
  250. // width: 380px;
  251. margin: 0 auto;
  252. }
  253. .tip {
  254. position: fixed;
  255. left: 50%;
  256. top: 50%;
  257. z-index: 999;
  258. &::before {
  259. content: '密码重置为Fcb20210225,可登录修改';
  260. position: absolute;
  261. width: 205px;
  262. left: 50%;
  263. transform: translateX(-50%);
  264. bottom: 100%;
  265. border-radius: 4px;
  266. padding: 10px;
  267. z-index: 2000;
  268. font-size: 12px;
  269. line-height: 1.2;
  270. min-width: 10px;
  271. word-wrap: break-word;
  272. background: #303133;
  273. color: #fff;
  274. margin-bottom: 6px;
  275. }
  276. &::after {
  277. content: '';
  278. position: absolute;
  279. display: block;
  280. width: 0;
  281. height: 0;
  282. bottom: 100%;
  283. left: 50%;
  284. transform: translateX(-50%);
  285. border-color: transparent;
  286. border-style: solid;
  287. border-width: 6px;
  288. border-top-color: #303133;
  289. border-bottom-width: 0;
  290. }
  291. }
  292. .maker {
  293. font-weight: 400;
  294. color: #969799;
  295. line-height: 20px;
  296. }
  297. </style>
  298. <style>
  299. .user-table.el-table .cell {
  300. overflow: inherit;
  301. }
  302. </style>