DrawerFrom.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. <script setup lang="ts">
  2. import md5 from 'js-md5'
  3. import { ElMessage } from 'element-plus'
  4. import { reuls_validator } from './relus'
  5. import { GlobalStore } from '@/stores/index'
  6. import Drawer from '@/components/Drawer/index.vue'
  7. import { User_Power_List } from '@/api/role/index'
  8. import { ref, reactive, onMounted, nextTick } from 'vue'
  9. import type { FormInstance, FormRules } from 'element-plus'
  10. import { User_Post_List, User_Add, User_Edit } from '@/api/user/index'
  11. type Fn = () => void
  12. interface PropsType {
  13. action: boolean
  14. }
  15. const validate_checkPass = (rule: any, value: any, callback: any) => {
  16. if (checkPass.value === '') {
  17. callback(new Error('请再输入一次密码'))
  18. } else if (checkPass.value !== form.value.T_pass) {
  19. callback(new Error('两次密码校验不一致'))
  20. } else {
  21. callback()
  22. }
  23. }
  24. const checkPass = ref('')
  25. const formRef = ref()
  26. const _PASS = '******'
  27. let userPowerList: any = []
  28. let userPostList = ref<any[]>([])
  29. const globalStore = GlobalStore()
  30. const formLabelWidth = ref('105px')
  31. const drawerRef = ref<InstanceType<typeof Drawer> | null>(null)
  32. const rules = reactive<FormRules>({
  33. ...reuls_validator,
  34. checkPass: [{ required: true, validator: validate_checkPass, trigger: 'blur' }]
  35. })
  36. let form = ref({
  37. T_power: '',
  38. T_name: '',
  39. T_user: '',
  40. T_pass: '',
  41. T_dept: '',
  42. T_post: '',
  43. T_sex: '',
  44. T_id_card: '',
  45. T_nation: '',
  46. T_school: '',
  47. T_major: '',
  48. T_education: '',
  49. T_marry: '',
  50. T_phone: '',
  51. T_entry_time: '',
  52. T_spouse_name: '',
  53. T_entry_type: '',
  54. T_contract_start_time: '',
  55. T_contract_end_time: '',
  56. T_remark: '',
  57. T_positive_time: '',
  58. T_spouse_phone: '',
  59. T_expire: '',
  60. T_dept_leader: ''
  61. })
  62. const getUserPowerList = async () => {
  63. const params = {
  64. User_tokey: globalStore.GET_User_tokey,
  65. page: 1,
  66. page_z: 9999
  67. }
  68. const res: any = await User_Power_List(params)
  69. userPowerList = res.Data.Data
  70. }
  71. const changeDept = async (val: number) => {
  72. const res: any = await User_Post_List({ T_dept: val })
  73. userPostList.value = res.Data
  74. }
  75. const resetForm = (formEl: FormInstance | undefined) => {
  76. if (!formEl) return
  77. formEl.resetFields()
  78. checkPass.value = ''
  79. }
  80. const callbackDrawer = (done: Fn) => {
  81. done()
  82. nextTick(() => {
  83. resetForm(formRef.value)
  84. })
  85. }
  86. const openDrawer = () => {
  87. drawerRef.value?.openDrawer()
  88. }
  89. const AddUser = (formEl: FormInstance | undefined) => {
  90. if (!formEl) return
  91. formEl.validate(async valid => {
  92. if (valid) {
  93. let res: any = {}
  94. if (props.action) {
  95. form.value.T_pass = md5(form.value.T_pass)
  96. res = await User_Add(form.value)
  97. } else {
  98. form.value.T_pass === _PASS && (form.value.T_pass = '')
  99. res = await User_Edit(form.value)
  100. }
  101. if (res.Code === 200) {
  102. ElMessage.success(`${props.action ? '添加' : '编辑'}成功!`)
  103. nextTick(() => {
  104. drawerRef.value?.closeDrawer()
  105. emit('onTableList')
  106. resetForm(formRef.value)
  107. emit('onaction', true)
  108. })
  109. }
  110. } else {
  111. return false
  112. }
  113. })
  114. }
  115. const DataEcho = async (row: any) => {
  116. row.T_entry_type = +row.T_entry_type
  117. row.T_pass = _PASS
  118. const res: any = await User_Post_List({ T_dept: row.T_dept })
  119. userPostList.value = res.Data
  120. nextTick(() => {
  121. form.value = { ...row }
  122. })
  123. }
  124. onMounted(() => {
  125. if (userPowerList.length <= 0) {
  126. getUserPowerList()
  127. }
  128. })
  129. const emit = defineEmits<{ (event: 'onTableList'): void; (event: 'onaction', val: boolean): void }>()
  130. const props = defineProps<PropsType>()
  131. defineExpose({
  132. openDrawer,
  133. callbackDrawer,
  134. DataEcho
  135. })
  136. </script>
  137. <template>
  138. <Drawer ref="drawerRef" :handleClose="callbackDrawer">
  139. <template #header="{ params }">
  140. <h4 :id="params.titleId" :class="params.titleClass">{{ action ? '添加' : '编辑' }} - 账户管理</h4>
  141. </template>
  142. <el-form :model="form" ref="formRef" :rules="rules">
  143. <el-form-item label="角色权限:" :label-width="formLabelWidth" prop="T_power">
  144. <el-select v-model="form.T_power" placeholder="请选择角色">
  145. <el-option v-for="item in userPowerList" :key="item.T_id" :label="item.T_name" :value="item.T_id" />
  146. </el-select>
  147. </el-form-item>
  148. <el-form-item label="名称:" :label-width="formLabelWidth" prop="T_name">
  149. <el-input v-model="form.T_name" autocomplete="off" placeholder="名称" />
  150. </el-form-item>
  151. <el-form-item label="负责人:" :label-width="formLabelWidth" prop="T_dept_leader">
  152. <el-radio-group v-model="form.T_dept_leader">
  153. <el-radio :label="0">否</el-radio>
  154. <el-radio :label="1">是</el-radio>
  155. </el-radio-group>
  156. </el-form-item>
  157. <el-form-item label="账号:" :label-width="formLabelWidth" prop="T_user">
  158. <el-input v-model="form.T_user" autocomplete="off" placeholder="账号" />
  159. </el-form-item>
  160. <el-form-item label="密码:" :label-width="formLabelWidth" prop="T_pass">
  161. <el-input v-model="form.T_pass" type="password" autocomplete="off" placeholder="密码" />
  162. </el-form-item>
  163. <el-form-item label="确认密码:" :label-width="formLabelWidth" prop="checkPass">
  164. <el-input v-model="checkPass" type="password" autocomplete="off" placeholder="确认密码" />
  165. </el-form-item>
  166. <el-form-item label="部门:" :label-width="formLabelWidth" prop="T_dept">
  167. <el-select v-model="form.T_dept" placeholder="请选择部门" @change="changeDept">
  168. <el-option v-for="item in globalStore.GET_Dept_List" :key="item.Id" :label="item.T_name" :value="item.Id" />
  169. </el-select>
  170. </el-form-item>
  171. <el-form-item label="岗位:" :label-width="formLabelWidth" prop="T_post">
  172. <el-select v-model="form.T_post" placeholder="请选择岗位">
  173. <el-option v-for="item in userPostList" :key="item.Id" :label="item.T_name" :value="item.Id" />
  174. </el-select>
  175. </el-form-item>
  176. <el-form-item label="性别:" :label-width="formLabelWidth" prop="T_sex">
  177. <el-radio-group v-model="form.T_sex" class="ml-4">
  178. <el-radio :label="1">男</el-radio>
  179. <el-radio :label="2">女</el-radio>
  180. </el-radio-group>
  181. </el-form-item>
  182. <el-form-item label="身份证号:" :label-width="formLabelWidth" prop="T_id_card">
  183. <el-input v-model="form.T_id_card" autocomplete="off" placeholder="身份证号" />
  184. </el-form-item>
  185. <el-form-item label="民族:" :label-width="formLabelWidth" prop="T_nation">
  186. <el-input v-model="form.T_nation" autocomplete="off" placeholder="民族" />
  187. </el-form-item>
  188. <el-form-item label="毕业院校:" :label-width="formLabelWidth" prop="T_school">
  189. <el-input v-model="form.T_school" autocomplete="off" placeholder="毕业院校" />
  190. </el-form-item>
  191. <el-form-item label="专业:" :label-width="formLabelWidth" prop="T_major">
  192. <el-input v-model="form.T_major" autocomplete="off" placeholder="专业" />
  193. </el-form-item>
  194. <el-form-item label="学历:" :label-width="formLabelWidth" prop="T_education">
  195. <el-input v-model="form.T_education" autocomplete="off" placeholder="学历" />
  196. </el-form-item>
  197. <el-form-item label="联系电话:" :label-width="formLabelWidth" prop="T_phone">
  198. <el-input v-model="form.T_phone" autocomplete="off" placeholder="联系电话" />
  199. </el-form-item>
  200. <el-form-item label="婚否:" :label-width="formLabelWidth" prop="T_marry">
  201. <el-radio-group v-model="form.T_marry" class="ml-4">
  202. <el-radio :label="0">未婚</el-radio>
  203. <el-radio :label="1">已婚</el-radio>
  204. </el-radio-group>
  205. </el-form-item>
  206. <el-form-item label="入职时间:" :label-width="formLabelWidth" prop="T_entry_time">
  207. <el-date-picker
  208. style="width: 100%"
  209. class="my-date-picker"
  210. v-model="form.T_entry_time"
  211. type="date"
  212. placeholder="入职时间"
  213. format="YYYY-MM-DD"
  214. value-format="YYYY-MM-DD"
  215. />
  216. </el-form-item>
  217. <el-form-item label="转正时间:" :label-width="formLabelWidth" prop="T_positive_time">
  218. <el-date-picker
  219. style="width: 100%"
  220. class="my-date-picker"
  221. v-model="form.T_positive_time"
  222. type="date"
  223. placeholder="转正时间"
  224. format="YYYY-MM-DD"
  225. value-format="YYYY-MM-DD"
  226. />
  227. </el-form-item>
  228. <el-form-item label="配偶姓名:" label-width="120px">
  229. <el-input v-model="form.T_spouse_name" autocomplete="off" placeholder="配偶姓名" />
  230. </el-form-item>
  231. <el-form-item label="配偶联系电话:" label-width="120px">
  232. <el-input v-model="form.T_spouse_phone" autocomplete="off" placeholder="配偶联系电话" />
  233. </el-form-item>
  234. <el-form-item label="入职类型:" :label-width="formLabelWidth" prop="T_entry_type">
  235. <el-radio-group v-model="form.T_entry_type" class="ml-4">
  236. <el-radio :label="1">全职</el-radio>
  237. <el-radio :label="2">兼职</el-radio>
  238. <el-radio :label="3">实习生</el-radio>
  239. </el-radio-group>
  240. </el-form-item>
  241. <el-form-item label="劳动合同开始时间:" label-width="160px" prop="T_contract_start_time">
  242. <el-date-picker
  243. style="width: 100%"
  244. class="my-date-picker"
  245. v-model="form.T_contract_start_time"
  246. type="date"
  247. placeholder="劳动合同开始时间"
  248. format="YYYY-MM-DD"
  249. value-format="YYYY-MM-DD"
  250. />
  251. </el-form-item>
  252. <el-form-item label="劳动合同结束时间:" label-width="160px" prop="T_contract_end_time">
  253. <el-date-picker
  254. style="width: 100%"
  255. class="my-date-picker"
  256. v-model="form.T_contract_end_time"
  257. type="date"
  258. placeholder="劳动合同结束时间"
  259. format="YYYY-MM-DD"
  260. value-format="YYYY-MM-DD"
  261. />
  262. </el-form-item>
  263. <el-form-item label="是否到期:" :label-width="formLabelWidth" prop="T_expire">
  264. <el-radio-group v-model="form.T_expire" class="ml-4">
  265. <el-radio :label="0">否</el-radio>
  266. <el-radio :label="1">是</el-radio>
  267. </el-radio-group>
  268. </el-form-item>
  269. <el-form-item label="备注:" :label-width="formLabelWidth">
  270. <el-input v-model="form.T_remark" type="textarea" autocomplete="off" placeholder="备注" />
  271. </el-form-item>
  272. <el-form-item :label-width="formLabelWidth">
  273. <el-button v-if="action" color="#626aef" @click="AddUser(formRef)">添加</el-button>
  274. <el-button v-else color="#626aef" @click="AddUser(formRef)">编辑</el-button>
  275. </el-form-item>
  276. </el-form>
  277. </Drawer>
  278. </template>
  279. <style scoped lang="scss"></style>