user.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. <template>
  2. <HcCard>
  3. <template #header>
  4. <div class="w-40">
  5. <el-select v-model="searchForm.deptId" placeholder="选择岗位类型" clearable size="large">
  6. <el-option label="暂无接口1" :value="1"/>
  7. <el-option label="暂无接口2" :value="2"/>
  8. </el-select>
  9. </div>
  10. <div class="w-64 ml-3">
  11. <el-input v-model="searchForm.realName" size="large" placeholder="请输入名称搜索" clearable/>
  12. </div>
  13. <div class="ml-3">
  14. <el-button type="primary" @click="searchClick" size="large">
  15. <HcIcon name="search-2"/>
  16. <span>搜索</span>
  17. </el-button>
  18. </div>
  19. </template>
  20. <template #extra>
  21. <el-button type="primary" @click="addUserClick" size="large">
  22. <HcIcon name="add"/>
  23. <span>创建账户</span>
  24. </el-button>
  25. <el-button type="danger" @click="delClick" size="large" :disabled="tableCheckedKeys.length <= 0">
  26. <HcIcon name="delete-bin-2"/>
  27. <span>注销账户</span>
  28. </el-button>
  29. </template>
  30. <HcTable :column="tableColumn" :datas="tableData" isCheck @selection-change="tableSelectionChange" :loading="tableLoaing">
  31. <template #status="{row}">
  32. <span>{{row.status === 1 ? '启用': '停用'}}</span>
  33. </template>
  34. <template #action="{row}">
  35. <el-button size="small" type="primary" @click="rowEidtClick(row)">编辑</el-button>
  36. </template>
  37. </HcTable>
  38. <template #action>
  39. <HcPages :pages="searchForm" @change="pageChange"></HcPages>
  40. </template>
  41. <!--用户信息弹窗-->
  42. <HcDialog bgColor="#ffffff" isToBody isTable :show="formModal" saveText="确定创建" :title="formModel.id ? '编辑账户' : '创建账户'"
  43. @save="formModalSave" @close="formModalClose" widths="51rem"
  44. >
  45. <HcCardItem ui="hac-bg-grey" class="h-auto">
  46. <template #header>
  47. <div class="hac-card-title">基础信息</div>
  48. </template>
  49. <el-form ref="formRef" :model="formModel" :rules="formRules" size="large" label-width="auto" label-position="left">
  50. <el-form-item label="登录账号:" prop="account">
  51. <el-input v-model="formModel.account" placeholder="仅支持英文或拼音" autocomplete="new-password"/>
  52. </el-form-item>
  53. <el-form-item label="登录密码:" prop="password">
  54. <el-input v-model="formModel.password" placeholder="请输入密码" autocomplete="new-password" show-password type="password"/>
  55. </el-form-item>
  56. <el-form-item label="确认密码:" prop="password1">
  57. <el-input v-model="formModel.password1" placeholder="请输入确认密码" autocomplete="new-password" show-password type="password"/>
  58. </el-form-item>
  59. </el-form>
  60. </HcCardItem>
  61. <HcCardItem ui="hac-bg-grey" class="h-auto mt-4">
  62. <template #header>
  63. <div class="hac-card-title">机构信息</div>
  64. </template>
  65. <template v-for="(item, index) in formModel.organization">
  66. <el-form :ref="(el) => setFormItemRefs(el, index)" class="mt-4" :model="item" :rules="formRules" label-position="top" size="large">
  67. <el-row :gutter="10">
  68. <el-col :span="7">
  69. <el-form-item prop="deptId">
  70. <el-select v-model="item.deptId" placeholder="选择部门">
  71. <el-option label="暂无接口" :value="1"/>
  72. </el-select>
  73. </el-form-item>
  74. </el-col>
  75. <el-col :span="7">
  76. <el-form-item prop="postId">
  77. <el-select v-model="item.postId" placeholder="选择岗位">
  78. <el-option label="暂无接口" :value="1"/>
  79. </el-select>
  80. </el-form-item>
  81. </el-col>
  82. <el-col :span="7">
  83. <el-form-item prop="principal">
  84. <el-select v-model="item.principal" placeholder="是否为部门负责人">
  85. <el-option label="是" :value="1"/>
  86. <el-option label="否" :value="0"/>
  87. </el-select>
  88. </el-form-item>
  89. </el-col>
  90. <el-col :span="3">
  91. <div class="form-organization-row-btn">
  92. <el-button type="primary" :icon="Plus" circle size="small" @click="addOrganizationClick(item)"/>
  93. <el-button type="danger" :icon="Delete" circle size="small" :disabled="index===0" @click="delOrganizationClick(index)"/>
  94. </div>
  95. </el-col>
  96. </el-row>
  97. </el-form>
  98. </template>
  99. </HcCardItem>
  100. <HcCardItem ui="hac-bg-grey" class="h-auto mt-4">
  101. <template #header>
  102. <div class="hac-card-title">详细信息</div>
  103. </template>
  104. <el-form ref="formRef1" :model="formModel" :rules="formRules" label-position="left" label-width="auto" size="large">
  105. <el-form-item label="用户姓名:" prop="real_name">
  106. <el-input v-model="formModel.real_name"/>
  107. </el-form-item>
  108. <el-form-item prop="phone" label="手机号码:">
  109. <el-input v-model="formModel.phone" placeholder="请输入绑定手机"/>
  110. </el-form-item>
  111. <el-form-item label="身份证号:">
  112. <el-input v-model="formModel.idNumber"/>
  113. </el-form-item>
  114. <el-form-item label="日单价:">
  115. <el-input v-model="formModel.roleName"/>
  116. </el-form-item>
  117. <el-form-item label="启用状态:">
  118. <el-select v-model="formModel.status" class="block">
  119. <el-option label="启用" :value="1"/>
  120. <el-option label="停用" :value="0"/>
  121. </el-select>
  122. </el-form-item>
  123. </el-form>
  124. </HcCardItem>
  125. </HcDialog>
  126. </HcCard>
  127. </template>
  128. <script setup>
  129. import {ref, onMounted} from "vue";
  130. import {arrIndex, isPhone} from "js-fast-way"
  131. import mainApi from '~api/system/user.js';
  132. import {getArrValue} from "js-fast-way"
  133. import {Plus, Delete} from '@element-plus/icons-vue'
  134. onMounted(() => {
  135. getTableData()
  136. })
  137. const searchForm = ref({deptId: null, realName: '', current: 1, size: 20, total: 0})
  138. //分页被点击
  139. const pageChange = ({current, size}) => {
  140. searchForm.value.current = current
  141. searchForm.value.size = size
  142. getTableData()
  143. }
  144. const searchClick = () => {
  145. searchForm.value.current = 1
  146. getTableData()
  147. }
  148. //表格数据
  149. const tableColumn = [
  150. {key: 'name', name: '用户名称'},
  151. {key: 'account', name: '账号ID'},
  152. {key: 'plaintextPassword', name: '密码'},
  153. {key: 'deptName', name: '所属部门'},
  154. {key: 'postName', name: '岗位'},
  155. {key: 'createTime', name: '创建日期'},
  156. {key: 'status', name: '启用状态'},
  157. {key: 'action', name: '操作', width: 100}
  158. ]
  159. const tableData = ref([])
  160. //获取表格数据
  161. const tableLoaing = ref(false)
  162. const getTableData = async()=>{
  163. tableLoaing.value = true
  164. const { error, code, data } = await mainApi.page(searchForm.value)
  165. tableLoaing.value = false
  166. if (!error && code === 200) {
  167. tableData.value = getArrValue(data['records'])
  168. searchForm.value.total = data['total']
  169. } else {
  170. tableData.value = []
  171. searchForm.value.total = 0
  172. }
  173. }
  174. const tableCheckedKeys = ref([]);
  175. const tableSelectionChange = (rows) => {
  176. tableCheckedKeys.value = rows
  177. }
  178. //用户信息弹窗
  179. const formModal = ref(false)
  180. //用户信息表单
  181. const formRef = ref(null)
  182. const formRef1 = ref(null)
  183. //循环表单的ref
  184. const formRefs = ref([])
  185. const setFormItemRefs = (el, index) => {
  186. if (el) {
  187. let indexs = arrIndex(formRefs.value, 'index', index)
  188. if (indexs !== -1) {
  189. formRefs.value[index].ref = el
  190. } else {
  191. formRefs.value.push({index: index, ref: el});
  192. }
  193. }
  194. }
  195. //获取表单的ref
  196. const getFormRef = async (index) => {
  197. const indexs = arrIndex(formRefs.value, 'index', index)
  198. return formRefs.value[indexs].ref
  199. }
  200. const formModel = ref({
  201. organization: [{}],
  202. })
  203. const formRules = {
  204. projectId: [{required: true, message: '请选择所属项目', trigger: 'change'}],
  205. phone: {
  206. required: true,
  207. validator: (rule, value, callback) => {
  208. if (!value) {
  209. callback(new Error('请输入手机号'))
  210. } else if (!isPhone(value)) {
  211. callback(new Error('手机号码格式错误'))
  212. } else {
  213. callback()
  214. }
  215. },
  216. trigger: "blur"
  217. },
  218. account: {
  219. required: true,
  220. validator: (rule, value, callback) => {
  221. if (!value) {
  222. callback(new Error('请输入登录账号'))
  223. } else {
  224. callback()
  225. }
  226. },
  227. trigger: "blur"
  228. },
  229. password: {
  230. required: true,
  231. validator: (rule, value, callback) => {
  232. if (!value) {
  233. callback(new Error('请输入新密码'))
  234. } else {
  235. callback()
  236. }
  237. },
  238. trigger: "blur"
  239. },
  240. password1: {
  241. required: true,
  242. validator: (rule, value, callback) => {
  243. if (!value) {
  244. callback(new Error('请确认新密码'))
  245. } else {
  246. callback()
  247. }
  248. },
  249. trigger: "blur"
  250. },
  251. }
  252. //添加用户
  253. const addUserClick = () => {
  254. formModel.value = {
  255. organization: [{}],
  256. }
  257. formModal.value = true
  258. }
  259. //编辑用户信息
  260. const rowEidtClick = (row) => {
  261. row.organization = row.organization ?? [{}]
  262. row.password = ''
  263. formModel.value = row
  264. formModal.value = true
  265. }
  266. //新增组织
  267. const addOrganizationClick = (row) => {
  268. formModel.value.organization.push({})
  269. }
  270. //删除组织
  271. const delOrganizationClick = (index) => {
  272. formModel.value.organization.splice(index, 1)
  273. }
  274. //保存
  275. const formModalSave = () => {
  276. }
  277. //关闭用户信息弹窗
  278. const formModalClose = () => {
  279. formModal.value = false
  280. formModel.value = {}
  281. }
  282. //删除用户
  283. const delClick = () => {
  284. }
  285. </script>
  286. <style lang="scss">
  287. .hc-card-item-box.h-auto {
  288. height: auto;
  289. }
  290. .form-organization-row-btn {
  291. position: relative;
  292. margin-left: 8px;
  293. top: 7px;
  294. .el-button + .el-button {
  295. margin-left: 18px;
  296. }
  297. }
  298. </style>