userInvestigate.vue 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884
  1. <template>
  2. <!-- 注册调研员组件 -->
  3. <div class="mainBox">
  4. <div class="layerBox">
  5. <el-form ref="form" :model="form" :rules="loginRules" class="login-form" autocomplete="on" label-position="left"
  6. label-width="120px">
  7. <div class="formDiv">
  8. <!--选择角色 start------------------------------------------>
  9. <el-form-item label="所属角色:" :label-width="formLabelWidth" prop="role_id" class="custom-align-right">
  10. <div class="formLabelFloatBox">
  11. <el-select v-model="form.role_id" placeholder="请选择..">
  12. <el-option v-for="item in role_idArr" :key="item.value" :label="item.label" :value="item.value">
  13. </el-option>
  14. </el-select>
  15. </div>
  16. </el-form-item>
  17. <!--选择角色 end------------------------------------------>
  18. <el-form-item label="登录账号:" :label-width="formLabelWidth" prop="user_name" class="custom-align-right">
  19. <el-input v-model="form.user_name" autocomplete="off" placeholder="请输入登录账号.."></el-input>
  20. </el-form-item>
  21. <div v-if="editId == ''">
  22. <!--新密码 start------------------------------------------>
  23. <div class="PasswordBox">
  24. <el-form-item prop="password" label="登录密码:" class="custom-align-right">
  25. <div class="PasswordBody">
  26. <el-input :key="passwordType1" ref="password1" v-model="form.password" :type="passwordType1"
  27. placeholder="请输入密码" name="password" tabindex="2" autocomplete="off" @blur="capsTooltip2 = false" />
  28. <span class="show-pwd" @click="showPwd(1)">
  29. <svg-icon :icon-class="passwordType1 === 'password' ? 'eye' : 'eye-open'" />
  30. </span>
  31. </div>
  32. </el-form-item>
  33. </div>
  34. <!--新密码 end------------------------------------------>
  35. <!--新密码 start------------------------------------------>
  36. <div class="PasswordBox">
  37. <el-form-item prop="confirm_password" label="确认密码:" class="custom-align-right">
  38. <div class="PasswordBody">
  39. <el-input :key="passwordType2" ref="password2" v-model="form.confirm_password" :type="passwordType2"
  40. placeholder="请输入密码" name="password" tabindex="2" autocomplete="off" @blur="capsTooltip2 = false" />
  41. <span class="show-pwd" @click="showPwd(2)">
  42. <svg-icon :icon-class="passwordType2 === 'password' ? 'eye' : 'eye-open'" />
  43. </span>
  44. </div>
  45. </el-form-item>
  46. </div>
  47. <!--新密码 end------------------------------------------>
  48. </div>
  49. <el-form-item label="调研员编号:" :label-width="formLabelWidth" prop="number" class="custom-align-right">
  50. <el-input v-model="form.number" autocomplete="off" placeholder="请输入调研员编号.."></el-input>
  51. </el-form-item>
  52. <el-form-item label="真实姓名:" :label-width="formLabelWidth" prop="real_name" class="custom-align-right">
  53. <el-input v-model="form.real_name" autocomplete="off" placeholder="请输入真实姓名.."></el-input>
  54. </el-form-item>
  55. <el-form-item label="照片:" :label-width="formLabelWidth" prop="avatar" :class="['custom-form-item']"
  56. class="custom-align-right">
  57. <div class="uploaderBox">
  58. <!--图片上传组件 start ------------------------------------------------------------>
  59. <div class="avatar-upload-container" @mouseenter="hovering = true" @mouseleave="hovering = false">
  60. <!-- 上传组件 -->
  61. <el-upload class="avatar-uploader" action="#" :show-file-list="false"
  62. :before-upload="beforeAvatarUpload">
  63. <!-- 预览图片 -->
  64. <img v-if="photoUrl" :src="photoUrl" class="avatar">
  65. <!-- 上传图标 -->
  66. <div v-else class="chooseImgDiv">
  67. <div>
  68. <img src="@/assets/public/upload/noImage.png">
  69. <div>选择图片</div>
  70. </div>
  71. </div>
  72. </el-upload>
  73. <!-- 删除按钮,当鼠标悬浮时显示 -->
  74. <div v-if="hovering && photoUrl" class="delete-button" @click="handleDelete">
  75. <i class="el-icon-delete"></i>
  76. </div>
  77. <input type="hidden" v-model="form.avatar">
  78. </div>
  79. <!--图片上传组件 end ------------------------------------------------------------>
  80. </div>
  81. </el-form-item>
  82. <el-form-item label="身份证号:" :label-width="formLabelWidth" prop="id_card" class="custom-align-right">
  83. <el-input v-model="form.id_card" autocomplete="off" placeholder="请输入身份证号.."></el-input>
  84. </el-form-item>
  85. <el-form-item label="出生年月:" :label-width="formLabelWidth" prop="birthday" class="custom-align-right">
  86. <el-date-picker v-model="form.birthday" type="date" placeholder="选择日期" disabled>
  87. </el-date-picker>
  88. </el-form-item>
  89. <el-form-item label="性别:" :label-width="formLabelWidth" prop="gender" class="custom-align-right">
  90. <el-radio v-model="form.gender" label="1">男</el-radio>
  91. <el-radio v-model="form.gender" label="2">女</el-radio>
  92. </el-form-item>
  93. <el-form-item label="手机号:" :label-width="formLabelWidth" prop="mobile" class="custom-align-right">
  94. <el-input v-model="form.mobile" autocomplete="off" placeholder="请输入手机号.."></el-input>
  95. </el-form-item>
  96. <el-form-item label="工作区域:" :label-width="formLabelWidth" prop="city_arr_id" class="custom-align-right">
  97. <!-- 级联选择器 -->
  98. <CityCascader v-model="form.city_arr_id" @update-city-id="update_city_arr_id" v-if="isNational == 0">
  99. </CityCascader>
  100. <el-cascader :options="options" :show-all-levels="false" disabled v-else></el-cascader>
  101. <el-checkbox v-model="isNational" :true-label="1" :false-label="0" class="longTimeCheckbox">全国</el-checkbox>
  102. </el-form-item>
  103. <el-form-item label="站点标识:" :label-width="formLabelWidth" prop="sszq" class="custom-align-right">
  104. <!-- 级联选择器 xx-->
  105. <el-cascader v-model="form.sszq" :options="options_arr" filterable clearable></el-cascader>
  106. </el-form-item>
  107. <el-form-item label="有效期:" :label-width="formLabelWidth" prop="timeList" class="custom-align-right">
  108. <el-date-picker v-model="timeList" type="daterange" :disabled="form.long_time === 1" range-separator="至"
  109. start-placeholder="开始日期" end-placeholder="结束日期" :picker-options="pickerOptions">
  110. </el-date-picker>
  111. <el-checkbox v-model="form.long_time" :true-label="1" :false-label="0"
  112. class="longTimeCheckbox">无限期</el-checkbox>
  113. </el-form-item>
  114. <el-form-item label="籍贯:" :label-width="formLabelWidth" prop="" class="custom-align-right">
  115. <CityCascader v-model="form.native_place_arr_id" @update-city-id="update_native_place_arr_id">
  116. </CityCascader>
  117. </el-form-item>
  118. <el-form-item label="QQ:" :label-width="formLabelWidth" prop="" class="custom-align-right">
  119. <el-input v-model="form.qq" autocomplete="off" placeholder="请输入QQ号.."></el-input>
  120. </el-form-item>
  121. <el-form-item label="电子邮箱:" :label-width="formLabelWidth" prop="" class="custom-align-right">
  122. <el-input v-model="form.email" autocomplete="off" placeholder="请输入电子邮箱.."></el-input>
  123. </el-form-item>
  124. <el-form-item label="邮编:" :label-width="formLabelWidth" prop="" class="custom-align-right">
  125. <el-input v-model="form.zip_code" autocomplete="off" placeholder="请输入邮编.."></el-input>
  126. </el-form-item>
  127. <el-form-item label="详细地址:" :label-width="formLabelWidth" prop="" class="custom-align-right">
  128. <CityCascader v-model="form.address_arr_id" @update-city-id="update_address_arr_id"></CityCascader>
  129. </el-form-item>
  130. <el-form-item label="" :label-width="formLabelWidth" prop="" class="custom-align-right">
  131. <el-input v-model="form.address" autocomplete="off" placeholder="请输入门牌号.."></el-input>
  132. </el-form-item>
  133. <el-form-item label="相关资料:" :label-width="formLabelWidth" prop="" class="custom-align-right">
  134. <el-upload class="upload-demo" :action="uploadFileUrl" :headers="headers" accept=".jpg, .jpeg, .png"
  135. :before-remove="beforeRemove" :on-success="handleUploadSuccess" multiple :limit="30"
  136. :on-exceed="handleExceed" :file-list="otherList" list-type="picture" :before-upload="beforeAvatarUpload1">
  137. <el-button size="small" type="primary">点击上传</el-button>
  138. <div slot="tip" class="el-upload__tip">每张图片最大2MB,最多上传30张图片。</div>
  139. </el-upload>
  140. </el-form-item>
  141. <el-form-item label="提示词:" :label-width="formLabelWidth" prop="" class="custom-align-right">
  142. <el-input type="textarea" v-model="form.remark" class="custom-textarea" placeholder="请输入提示词"></el-input>
  143. </el-form-item>
  144. <!-- <el-form-item label="网站选择" :label-width="formLabelWidth" prop="sszq" class="custom-align-right">
  145. <el-select v-model="form.sszq" multiple filterable placeholder="请选择">
  146. <el-option
  147. v-for="item in webSiteList"
  148. :key="item.value"
  149. :label="item.label"
  150. :value="item.value">
  151. </el-option>
  152. </el-select>
  153. </el-form-item> -->
  154. </div>
  155. </el-form>
  156. </div>
  157. <div class="bottomBtnBox">
  158. <el-button type="info" @click="goList">返回</el-button>
  159. <el-button type="primary" @click="addData" v-if="editId == ''">提交</el-button>
  160. <el-button type="primary" @click="editData" v-if="editId != ''">修改</el-button>
  161. <el-button type="warning" @click="resetPassword" v-if="editId != ''">重置密码</el-button>
  162. </div>
  163. </div>
  164. </template>
  165. <script>
  166. // 引入公用样式
  167. import '@/styles/global.less';
  168. // 引入baseUrl
  169. import URL from '@/utils/baseUrl';
  170. //城市级联选择器
  171. import CityCascader from './CityCascader';
  172. //格式化时间
  173. import { formatLocalDate } from '@/utils/public';
  174. // import cjs from 'compression-webpack-plugin';
  175. export default {
  176. components: {
  177. CityCascader, //城市级联选择器
  178. },
  179. data() {
  180. let self = this;
  181. // 配置验证规则:用于表单验证
  182. const validatePassword = (rule, value, callback) => {
  183. if (value.length < 6) {
  184. callback(new Error('密码不能低于6位!'))
  185. } else {
  186. callback()
  187. }
  188. }
  189. const validatePhone = (rule, value, callback) => {
  190. const phoneRegex = /^1[34578]\d{9}$/g; // 正则表达式验证手机号
  191. if (!value || value.trim() === "") {
  192. callback(new Error('该项不能为空!'));
  193. } else if (!phoneRegex.test(value.trim())) {
  194. callback(new Error('请输入有效的手机号')); // 更新错误信息
  195. } else {
  196. console.log("手机号验证通过!")
  197. callback();
  198. }
  199. }
  200. const validateEmpty = (rule, value, callback) => {
  201. if (!value || value.trim() === "") {
  202. callback(new Error('该项不能为空!'));
  203. } else {
  204. callback();
  205. }
  206. }
  207. const validateArray = (rule, value, callback) => {
  208. if (value.length == 0) {
  209. callback(new Error('该项不能为空!'))
  210. } else {
  211. callback()
  212. }
  213. }
  214. const validateTime = (rule, value, callback) => {
  215. if (value === "NaN-NaN-NaN NaN:NaN:NaN") {
  216. callback(new Error('该项不能为空!'))
  217. } else {
  218. callback()
  219. }
  220. }
  221. const validateTimeTo = (rule, value, callback) => {
  222. // console.log(value)
  223. // console.log(self.timeList)
  224. // console.log(self.form.long_time)
  225. if (self.timeList.length == 0 && self.form.long_time == 0) {
  226. callback(new Error('该项不能为空!'))
  227. } else {
  228. callback()
  229. }
  230. }
  231. const validateIdcard = (rule, value, callback) => {
  232. const idCardRegex = /^(?:\d{15}|\d{18}|\d{17}[\dXx])$/; // 正则表达式验证身份证号
  233. if (!value || value.trim() === "") {
  234. callback(new Error('该项不能为空!'));
  235. } else if (!idCardRegex.test(value.trim())) {
  236. callback(new Error('请输入有效的身份证号')); // 更新错误信息
  237. } else {
  238. console.log("身份证号验证通过!");
  239. self.extractBirthdayFromIdcard();
  240. callback();
  241. }
  242. }
  243. return {
  244. options_arr: [],
  245. props_1: { multiple: true },//下拉多选
  246. formLabelWidth: "120px",
  247. editId: "",
  248. uploadFileUrl: URL.baseUrl + "/public/uploadFile",//获得上传地址
  249. headers: {},
  250. website_tag_params: {//xx
  251. keyword: "",//网站名称查询
  252. website_column_id: [],//使用网系id查询
  253. city_id: [],//使用城市id查询
  254. page: 1,//当前是第几页
  255. pageSize: 666666,//一共多少条
  256. name: "",
  257. },
  258. form: {
  259. // websiteTag_arr_id:[], //站点标识下拉id onlyxx
  260. websiteTag_arr_id: [], //站点标识下拉id only
  261. websiteTag_reg: "",
  262. sszq: [], //站点标识下拉id
  263. type_id: 4,//调研员
  264. role_id: "",//角色id
  265. user_name: "",//登录账号
  266. password: "",//密码
  267. confirm_password: "",//确认密码
  268. number: "",//调研员编号
  269. real_name: "",//真实姓名
  270. avatar: "",//照片
  271. id_card: "",//身份证号
  272. birthday: "",//出生年月
  273. gender: "1",//性别
  274. mobile: "",//手机号
  275. native_place_arr_id: [],//籍贯
  276. city_arr_id: "",//工作区域
  277. address_arr_id: [],//详细地址
  278. address: "",//详细地址门牌号
  279. from_time: "",//有效期开始时间
  280. to_time: "",//有效期结束时间
  281. long_time: 0,//是否为长期 //长期1:长期 0:非长期
  282. qq: "",//QQ
  283. email: "",//电子邮箱
  284. other: [],//相关资料
  285. remark: "",//提示词
  286. zip_code: "",//邮编
  287. //sszq: [],//所属网站
  288. },
  289. timeList: [],//时间段
  290. otherList: [],//相关资料列表
  291. role_idArr: [],//角色id池
  292. isNational: 0,//是否为全国
  293. //网站列表
  294. webSiteList: [],
  295. //上传照片
  296. photoUrl: '',
  297. hovering: false, // 鼠标悬浮状态 悬浮时显示删除
  298. //密码验证
  299. capsTooltip1: false,
  300. capsTooltip2: false,
  301. passwordType1: 'password',
  302. passwordType2: 'password',
  303. //配置from表单验证规则
  304. loginRules: {
  305. // 站点标识xx
  306. websiteTag_arr_id: [{ type: 'array', required: true, trigger: 'blur', validator: validateArray }],
  307. //1.角色id
  308. role_id: [{ required: true, trigger: 'blur', validator: validateArray }],
  309. //2.登录账号
  310. user_name: [{ required: true, trigger: 'blur', validator: validatePhone }],
  311. //3.密码和确认密码
  312. password: [{ required: true, trigger: 'blur', validator: validatePassword }],
  313. confirm_password: [{ required: true, trigger: 'blur', validator: validatePassword }],
  314. //4.调研员编号
  315. number: [{ required: true, trigger: 'blur', validator: validateEmpty }],
  316. //5.真实姓名
  317. real_name: [{ required: true, trigger: 'blur', validator: validateEmpty }],
  318. //6.手机号
  319. mobile: [{ required: true, trigger: 'blur', validator: validateEmpty }],
  320. //7.身份证号
  321. id_card: [{ required: true, trigger: 'blur', validator: validateIdcard }],
  322. //8.性别
  323. gender: [{ required: true, trigger: 'blur', validator: validateEmpty }],
  324. //9.手机号
  325. mobile: [{ required: true, trigger: 'blur', validator: validateEmpty }],
  326. //10.工作区域
  327. city_arr_id: [{ required: true, trigger: 'blur', validator: validateArray }],
  328. //11.照片
  329. avatar: [{ required: true, trigger: 'blur', validator: validateEmpty }],
  330. //12.出生年月
  331. birthday: [{ required: true, trigger: 'blur', validator: validateEmpty }],
  332. //13.有效期
  333. timeList: [{ required: true, trigger: 'blur', validator: validateTimeTo }],
  334. //14.网站选择
  335. sszq: [{ required: true, trigger: 'blur', validator: validateArray }]
  336. },
  337. //时间跨度
  338. pickerOptions: {
  339. selectableRange: '1900-01-01 to 2100-12-31', // 允许选择的日期范围
  340. // disabledDate(time) {
  341. // return time.getTime() < Date.now() - 86400000; // 禁用今天之前的日期
  342. // },
  343. },
  344. };
  345. },
  346. methods: {
  347. //1.表单收集 start ------------------------------------------------------------>
  348. //1.1切换密码框的显示与隐藏
  349. showPwd(num) {
  350. const passwordTypeKey = 'passwordType' + num; //动态生成 passwordType 的键
  351. const passwordRefKey = 'password' + num; //动态生成 password 的引用
  352. // 切换密码类型
  353. if (this[passwordTypeKey] === 'password') {
  354. this[passwordTypeKey] = ''; //显示密码
  355. } else {
  356. this[passwordTypeKey] = 'password'; //隐藏密码
  357. }
  358. // 使用 $nextTick 聚焦到对应的密码输入框
  359. this.$nextTick(() => {
  360. this.$refs[passwordRefKey].focus(); //聚焦到对应的密码输入框
  361. });
  362. },
  363. //1.2获得角色列表池
  364. getRoleList() {
  365. let data = {
  366. page: 1,
  367. pageSize: 100
  368. }
  369. this.$store.dispatch('userRole/roleList', data).then(res => {
  370. this.role_idArr = res.data.rows.map(item => ({
  371. value: item.id,
  372. label: item.role_name
  373. }));
  374. }).catch(error => {
  375. this.$message({
  376. type: 'warning',
  377. message: '网络错误,请重试!'
  378. });
  379. })
  380. },
  381. //1.3更新工作区域
  382. update_city_arr_id(value) {
  383. console.log("工作区域ID已更新:", value);
  384. this.form.city_arr_id = value;
  385. console.log(this.form.city_arr_id);
  386. },
  387. //1.4更新籍贯
  388. update_native_place_arr_id(value) {
  389. console.log("籍贯ID已更新:", value);
  390. this.form.native_place_arr_id = value;
  391. },
  392. //1.5更新详细地址
  393. update_address_arr_id(value) {
  394. console.log("详细地址ID已更新:", value);
  395. this.form.address_arr_id = value;
  396. },
  397. //1.5重置表单
  398. clearData() {
  399. },
  400. //表单收集 end ------------------------------------------------------------>
  401. //2.提交表单 start ------------------------------------------------------------>
  402. //2.1 上传图片操作
  403. beforeAvatarUpload(file) {
  404. const isJPG = file.type === 'image/jpeg';
  405. const isPNG = file.type === 'image/png';
  406. const isLt2M = file.size / 1024 / 1024 < 2;
  407. if (!isJPG && !isPNG) {
  408. this.$message.error('上传头像图片只能是 JPG 或 PNG 格式!');
  409. return false;
  410. }
  411. if (!isLt2M) {
  412. this.$message.error('上传头像图片大小不能超过 2MB!');
  413. return false;
  414. }
  415. const formData = new FormData();
  416. formData.append('file', file);
  417. this.$store.dispatch('pool/uploadFile', formData).then(res => {
  418. this.photoUrl = res.data.imgUrl;//显示缩略图
  419. this.form.avatar = res.data.imgUrl;//提供表单地址
  420. console.log(res.data.imgUrl)
  421. }).catch(() => {
  422. this.$message({
  423. type: 'warning',
  424. message: '网络错误,请重试!'
  425. });
  426. })
  427. // 阻止默认的上传行为
  428. return false;
  429. },
  430. //2.2 删除图片
  431. handleDelete() {
  432. this.photoUrl = ''; // 清空图片 URL
  433. },
  434. //2.3 多文件上传
  435. handleExceed(files, fileList) {
  436. this.$message.warning(`当前限制选择 30 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);
  437. },
  438. beforeRemove(file, fileList) {
  439. console.log('file, fileList', file, fileList);
  440. for (let item of fileList) {
  441. this.form.other = this.form.other.filter(item => item !== file.url);
  442. }
  443. return this.$confirm(`确定移除 ${file.name}?`);
  444. },
  445. //获取token
  446. getTokenFromCookie() {
  447. const name = "Admin-Token=";
  448. const decodedCookie = decodeURIComponent(document.cookie);
  449. const cookieArray = decodedCookie.split(';');
  450. for (let i = 0; i < cookieArray.length; i++) {
  451. let cookie = cookieArray[i].trim();
  452. if (cookie.indexOf(name) === 0) {
  453. return cookie.substring(name.length, cookie.length); // 返回 token
  454. }
  455. }
  456. return ""; // 如果没有找到 token,返回空字符串
  457. },
  458. //设置token
  459. setHeaders() {
  460. this.token = this.getTokenFromCookie(); // 从 cookie 中获取 token
  461. this.headers = { token: this.token }; // 设置 headers
  462. console.log(this.headers); // 打印 headers
  463. },
  464. //上传成功以后
  465. handleUploadSuccess(response) {
  466. this.form.other.push(response.data.imgUrl)
  467. console.log('上传成功:', response);
  468. console.log(this.form.other);
  469. },
  470. //只能上传图片
  471. beforeAvatarUpload1(file) {
  472. const isLt2M = file.size / 1024 / 1024 < 2;
  473. if (!isLt2M) {
  474. this.$message.error('上传图片大小不能超过 2MB!');
  475. return false;
  476. }
  477. },
  478. //提交表单
  479. addData() {
  480. console.log(this.timeList)
  481. //1.格式化时间戳
  482. this.form.birthday = formatLocalDate(this.form.birthday);
  483. if (this.form.long_time == 0) {
  484. this.form.from_time = formatLocalDate(this.timeList[0]);
  485. this.form.to_time = formatLocalDate(this.timeList[1]);
  486. } else {
  487. // this.form.from_time = "";
  488. // this.form.to_time = "";
  489. delete this.form.from_time;
  490. delete this.form.to_time;
  491. }
  492. //判断用户工作区域是否为全国
  493. if (this.isNational == 1) {
  494. this.form.city_arr_id = [0];
  495. }
  496. console.log(this.form)
  497. //2.开始验证
  498. this.$refs.form.validate(valid => {
  499. if (valid) {
  500. //3.验证用户是否已经存在
  501. this.$store.dispatch('userMember/verifyUserInfo', { user_name: this.form.user_name }).then(res => {
  502. if (res.code == 0) {
  503. //如果code为0表示用户不存在,提交表单
  504. this.form.sszq = this.form.sszq[0]
  505. console.log("this.form.sszq===", this.form.sszq)
  506. console.log("this.form1===", this.form)
  507. this.$store.dispatch('userMember/createUser', this.form).then(res => {
  508. console.log("this.form222===res", res)
  509. if (res.code == 200) {
  510. // console.log(res);
  511. this.$message({
  512. type: 'success',
  513. message: '用户添加成功!'
  514. });
  515. this.goList();
  516. } else {
  517. this.$message({
  518. type: 'warning',
  519. message: res.message
  520. });
  521. }
  522. })
  523. } else if (res.code == 200) {
  524. //如果code==200 表示用户存在,阻止进一步提交
  525. this.$message({
  526. type: 'warning',
  527. message: '该账号已被注册,请更换其他账号!'
  528. });
  529. }
  530. }).catch(error => {
  531. this.$message({
  532. type: 'warning',
  533. message: '网络错误,请重试!'
  534. });
  535. })
  536. }
  537. })
  538. },
  539. //提交表单 start ------------------------------------------------------------>
  540. //3.编辑表单 start ------------------------------------------------------------>
  541. //获得网站列表
  542. getWebsiteList(userWebList) {
  543. this.$store.dispatch('pool/getWebList', { page: 1, pageSize: 1000 }).then(res => {
  544. if (res.code != 200) {
  545. this.$message.error(res.message)
  546. } else {
  547. for (let item of res.data.rows) {
  548. let data = {
  549. value: item.id,
  550. label: item.website_name
  551. }
  552. this.webSiteList.push(data)
  553. }
  554. // //如果有数据可以回显
  555. // if (userWebList) {
  556. // console.log("显示编辑用户的所属网站!")
  557. // this.form.sszq = userWebList;
  558. // }
  559. }
  560. })
  561. },
  562. //获得用户信息
  563. getUserInfo() {
  564. // console.log("回显数据===");
  565. this.$store.dispatch('userMember/getUser', { id: this.editId }).then(res => {
  566. // 站点标识
  567. this.form.sszq = Number(res.data.sszq);
  568. this.form.type_id = res.data.type_id;
  569. this.form.user_name = res.data.user_name;
  570. this.form.role_id = res.data.role_id;
  571. this.form.real_name = res.data.real_name;
  572. this.form.mobile = res.data.mobile;
  573. this.form.number = res.data.number;
  574. this.photoUrl = res.data.avatar;
  575. this.form.avatar = res.data.avatar;
  576. this.form.id_card = res.data.id_card;
  577. this.form.birthday = res.data.birthday;
  578. this.form.address_arr_id = res.data.address_arr_id;
  579. //判断用户工作区域是否为全国
  580. if (typeof res.data.city_arr_id === 'string') {
  581. this.form.city_arr_id = JSON.parse(res.data.city_arr_id);
  582. }
  583. console.log(this.form.city_arr_id);
  584. if (this.form.city_arr_id[0] == 0) {
  585. this.isNational = 1
  586. }
  587. //还原有效期
  588. if (res.data.long_time == 0) {
  589. this.timeList = [
  590. res.data.from_time,
  591. res.data.to_time
  592. ]
  593. this.form.from_time = res.data.from_time;
  594. this.form.to_time = res.data.to_time;
  595. this.form.long_time = 0;
  596. } else {
  597. this.form.from_time = "";
  598. this.form.to_time = "";
  599. this.form.long_time = 1;
  600. }
  601. this.form.qq = res.data.qq;
  602. this.form.email = res.data.email;
  603. this.form.address = res.data.address;
  604. this.form.zip_code = res.data.zip_code;
  605. this.form.remark = res.data.remark;
  606. this.form.native_place_arr_id = res.data.native_place_arr_id;
  607. // 处理文件列表
  608. const fileArrayString = res.data.other; // 假设这是一个字符串格式的数组
  609. const fileArray = JSON.parse(fileArrayString); // 解析为数组
  610. this.form.other.push(...fileArray); // 将解析出来的值 push 到 this.form.other
  611. // 将文件列表赋值给 otherList,生成默认文件名
  612. this.otherList = fileArray.map((url, index) => ({
  613. name: `文件${index + 1}`, // 生成文件名
  614. url: url, // 文件的 URL
  615. status: 'success' // 设置状态为 success
  616. }));
  617. //获取所有网站列表
  618. //this.getWebsiteList(res.data.sszq);
  619. })
  620. },
  621. //修改用户
  622. editData() {
  623. //当有效期为长期的时候,去掉from_time和to_time字段
  624. if (this.form.long_time == 0) {
  625. this.form.from_time = formatLocalDate(this.timeList[0]);
  626. this.form.to_time = formatLocalDate(this.timeList[1]);
  627. } else {
  628. // this.form.from_time = "";
  629. // this.form.to_time = "";
  630. delete this.form.from_time;
  631. delete this.form.to_time;
  632. }
  633. this.$refs.form.validate(valid => {
  634. if (valid) {
  635. //1.验证用户是否存在
  636. this.$store.dispatch('userMember/verifyUserInfo', { id: this.editId, user_name: this.form.user_name }).then(res => {
  637. if (res.code == 0) {
  638. console.log(this.form);
  639. if (!Array.isArray(this.form.address_arr_id)) {
  640. this.form.address_arr_id = JSON.parse(this.form.address_arr_id);
  641. }
  642. if (!Array.isArray(this.form.native_place_arr_id)) {
  643. this.form.native_place_arr_id = JSON.parse(this.form.native_place_arr_id);
  644. }
  645. if (!Array.isArray(this.form.city_arr_id)) {
  646. this.form.city_arr_id = JSON.parse(this.form.address_arr_id);
  647. }
  648. //this.form.address_arr_id = JSON.parse(this.form.address_arr_id);
  649. //this.form.native_place_arr_id = JSON.parse(this.form.native_place_arr_id);
  650. //this.form.city_arr_id = JSON.parse(this.form.address_arr_id);
  651. //数组转换为数字
  652. if (typeof (this.form.sszq) == 'number') {
  653. this.form.sszq = this.form.sszq
  654. } else {
  655. this.form.sszq = this.form.sszq[0]
  656. }
  657. //2.设置修改的用户id
  658. this.form.id = this.editId;
  659. //判断用户工作区域是否为全国
  660. if (this.isNational == 1) {
  661. this.form.city_arr_id = [0];
  662. }
  663. //3.提交用户修改
  664. //如果code为0表示用户不存在,提交表单
  665. this.$store.dispatch('userMember/updateUser', this.form).then(res => {
  666. console.log(res);
  667. this.$message({
  668. type: 'success',
  669. message: '用户添加成功!'
  670. });
  671. this.goList();
  672. })
  673. } else if (res.code == 200) {
  674. //如果code==200 表示用户存在,阻止进一步提交
  675. this.$message({
  676. type: 'warning',
  677. message: '该账号已被注册,请更换其他账号!'
  678. });
  679. }
  680. }).catch(error => {
  681. this.$message({
  682. type: 'warning',
  683. message: '网络错误,请重试!'
  684. });
  685. })
  686. }
  687. })
  688. },
  689. //重置密码
  690. resetPassword() {
  691. let password = Math.random().toString(36).slice(-6); // 随机生成6个字母的组合
  692. this.$store.dispatch('userMember/resetPassword', { id: this.editId, password: password }).then(res => {
  693. if (res.code == 200) {
  694. this.$message({
  695. type: 'success',
  696. message: '密码重置为:' + password
  697. });
  698. }
  699. }).catch(() => {
  700. this.$message({
  701. type: 'warning',
  702. message: '网络错误,请重试!'
  703. });
  704. })
  705. },
  706. //编辑表单 end ------------------------------------------------------------>
  707. goList() {
  708. this.$router.push({
  709. path: '/userList',
  710. });
  711. },
  712. //提取身份证号中的出生日期
  713. extractBirthdayFromIdcard() {
  714. let idCard = this.form.id_card;
  715. // 1. 取出身份证中的生日部分,例如 "20250129"
  716. let birthStr = idCard.substring(6, 14);
  717. // 2. 截取年、月、日
  718. let year = birthStr.substring(0, 4); // 2025
  719. let month = birthStr.substring(4, 6); // 01
  720. let day = birthStr.substring(6, 8); // 29
  721. // 3. 拼接成需要的格式 "YYYY-MM-DD 00:00:00"
  722. let birthDateTime = `${year}-${month}-${day} 00:00:00`;
  723. this.form.birthday = birthDateTime;
  724. },
  725. get_website_tag_arr_fun() { //得到站点标识所有内容xx
  726. this.$store.dispatch('pool/get_website_tag_arr_actions', this.website_tag_params).then(res => {
  727. // console.log("res.data.listres.data.list",res.data.list)
  728. res.data.list.forEach((per_obj) => {
  729. let new_per = {
  730. label: per_obj.name,
  731. value: per_obj.id,
  732. }
  733. this.options_arr.push(new_per)
  734. })
  735. // console.log("get_website_tag_arr_funget_website_tag_arr_fun")
  736. // console.log("get_website_tag_arr_funget_website_tag_arr_fun",this.options_arr)
  737. })
  738. },
  739. },
  740. mounted() {
  741. this.get_website_tag_arr_fun()//得到站点标识所有内容xx
  742. // console.log("this.get_website_tag_arr_fun()==xx",this.get_website_tag_arr_fun())
  743. this.getRoleList();
  744. //判断是新建还是回显
  745. if (this.$route.query.id != undefined) {
  746. this.editId = this.$route.query.id;
  747. console.log("编辑用户!")
  748. this.getUserInfo();
  749. } else {
  750. console.log("添加用户!")
  751. //获取所有网站列表
  752. this.getWebsiteList();
  753. }
  754. //设置token
  755. this.setHeaders(); // 在组件挂载时设置 headers
  756. }
  757. };
  758. </script>
  759. <style scoped lang="less">
  760. .PasswordBox {
  761. display: flex;
  762. align-items: center;
  763. .el-form-item {
  764. flex: 1;
  765. }
  766. .PasswordTitle {
  767. width: 120px;
  768. text-align: right;
  769. margin-right: 10px;
  770. margin-bottom: 22px;
  771. }
  772. .PasswordBody {
  773. flex: 1;
  774. display: flex;
  775. align-items: center;
  776. }
  777. .show-pwd {
  778. margin-left: 10px;
  779. }
  780. }
  781. .longTimeCheckbox {
  782. margin-left: 10px;
  783. }
  784. //执行v-deep穿透scope选择器 start------------------------------------------------------------>*/
  785. ::v-deep .custom-form-item>.el-form-item__label {
  786. line-height: 140px !important;
  787. }
  788. ::v-deep .custom-textarea .el-textarea__inner {
  789. resize: none;
  790. /* 禁止用户拖拽调整大小 */
  791. }
  792. ::v-deep .custom-align-right .el-form-item__label {
  793. text-align: right;
  794. /* 设置标签文字右对齐 */
  795. }
  796. ::v-deep .el-select {
  797. width: 100%;
  798. /* 禁止用户拖拽调整大小 */
  799. }
  800. ::v-deep .el-upload-list__item {
  801. width: 15%;
  802. float: left;
  803. margin-right: 20px;
  804. }
  805. //执行v-deep穿透scope选择器 end------------------------------------------------------------>*/</style>