userInvestigate.vue 34 KB

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