index.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  1. <template>
  2. <div class="m-right-block fr">
  3. <div class="right-block-bd">
  4. <div class="m-account">
  5. <div class="account-tit" style="height:30px">
  6. <a :class="{'current':show===1}" style="text-decoration: none;padding-bottom: 5px" @click="show=1" class="">基础资料</a>
  7. <a :class="{'current':show===2}" style="text-decoration: none;padding-bottom: 5px" @click="show=2" class="">实名认证</a>
  8. <a :class="{'current':show===3}" style="text-decoration: none;padding-bottom: 5px" @click="show=3" class="">额外信息</a>
  9. <a :class="{'current':show===4}" style="text-decoration: none;padding-bottom: 5px" @click="show=4" class="">密码修改</a>
  10. <a :class="{'current':show===5}" style="text-decoration: none;padding-bottom: 5px" @click="show=5" class="">手机修改</a>
  11. </div>
  12. <div v-if="show===1" class="lwh-ul-form">
  13. <form name="user">
  14. <div class="m-img tc"></div>
  15. <el-row :gutter="40" class="mt20">
  16. <el-col :lg="6" :xs="24" class="col-normal tc">
  17. <img :src="userInfo.headImg" :onerror="errorImg" class="setting-img" @click="showImg(userInfo.headImg)">
  18. <do-upload @onFinish="setHeadImg" placeholder="上传头像"> </do-upload>
  19. </el-col>
  20. <el-col :lg="6" :xs="24" class="col-normal tc">
  21. <img :src="userInfo.graduateImg" :onerror="errorImg" class="setting-img" @click="showImg(userInfo.graduateImg)">
  22. <do-upload @onFinish="setGraduateImg" placeholder="上传毕业证"> </do-upload>
  23. </el-col>
  24. </el-row>
  25. <ul class="ul-form">
  26. <li class="txt-r">
  27. <span class="l-t"></span>注:<i></i>只有头像、性别、毕业证可以修改
  28. </li>
  29. <li>
  30. <span class="l-t">姓名:</span>
  31. <input type="text" v-model="userInfo.nickname" class="ipt ng-pristine ng-valid ng-valid-required"
  32. required="" placeholder="请输入用户名" disabled="disabled">
  33. </li>
  34. <li class="ng-binding">
  35. <span class="l-t">证件号:</span>{{userInfo.cardId||'未知'}}</li>
  36. <li>
  37. <span class="l-t"><i></i>性别:</span>
  38. <span class="sex">
  39. <a href="javascript:void(0)" @click="userInfo.gender='男'" :class="{'selected':userInfo.gender=='男'}">
  40. <span class="p-ico2 ico-man"></span>男
  41. </a>
  42. <a href="javascript:void(0)" @click="userInfo.gender='女'" :class="{'selected':userInfo.gender=='女'}">
  43. <span class="p-ico2 ico-woman"></span>女
  44. </a>
  45. </span>
  46. </li>
  47. <li>
  48. <span class="l-t"><i></i>手机号码:</span>
  49. <input type="text" v-model="userInfo.phone" class="ipt" disabled placeholder="请输入手机号码">
  50. <span class="tips ng-scope" v-if="!isPhone()">
  51. <span class="p-ico2"></span>手机格式不对
  52. </span>
  53. </li>
  54. <li class="mt20">
  55. <span class="l-t"></span>
  56. <el-button type="primary" class="confirm" @click="doSaveBaseInfo()">保 存</el-button>
  57. </li>
  58. </ul>
  59. </form>
  60. </div>
  61. <div v-if="show===2" class="lwh-ul-form ng-scope">
  62. <form name="user" class="ng-pristine ng-valid">
  63. <div class="m-img tc"></div>
  64. <el-row :gutter="40" class="mt20">
  65. <el-col :lg="6" :xs="24" class="col-normal tc">
  66. <img :src="userInfo.cardImg" :onerror="errorImg" class="setting-img" @click="showImg(userInfo.cardImg)">
  67. <do-upload @onFinish="setCardImg" placeholder="身份证正面"> </do-upload>
  68. </el-col>
  69. <el-col :lg="6" :xs="24" class="col-normal tc">
  70. <img :src="userInfo.cardBackImg" :onerror="errorImg" class="setting-img" @click="showImg(userInfo.cardBackImg)">
  71. <do-upload @onFinish="setCardBackImg" placeholder="身份证背面"> </do-upload>
  72. </el-col>
  73. </el-row>
  74. <ul class="ul-form mt50 ng-scope">
  75. <li>
  76. <span class="l-t">身份证:</span>
  77. <input v-model="userInfo.cardId" class="ipt1" disabled></input>
  78. </li>
  79. <li>
  80. <span class="l-t">姓名:</span>
  81. <input v-model="userInfo.nickname" class="ipt1" disabled></input>
  82. </li>
  83. <li>
  84. <span class="l-t">手机号:</span>
  85. <input v-model="userInfo.phone" class="ipt1" disabled></input>
  86. </li>
  87. <li class="mt30">
  88. <span class="l-t"></span>
  89. <el-button type="primary" class="confirm" @click="identify()" v-if="!userInfo.identify">实名认证</el-button>
  90. <el-button type="text" v-else >已经完成实名认证</el-button>
  91. </li>
  92. </ul>
  93. </form>
  94. </div>
  95. <div v-if="show===3" >
  96. <el-form ref="elForm" :inline="false" class="mt50">
  97. <el-form-item label="详细地址" label-width='150px' class="mt30" prop="address" >
  98. <el-input placeholder="详细地址" v-model="userInfo.address " class="pass-input">
  99. </el-input>
  100. </el-form-item>
  101. <el-form-item label="邮政编码" label-width='150px' class="mt30" prop="postalCode" >
  102. <el-input placeholder="邮政编码" v-model="userInfo.postalCode " class="pass-input">
  103. </el-input>
  104. </el-form-item>
  105. <el-form-item label="工作年限" label-width='150px' class="mt30" prop="years" >
  106. <el-input placeholder="工作年限" v-model="userInfo.years " class="pass-input">
  107. </el-input>
  108. </el-form-item>
  109. <el-form-item label="工作单位" label-width='150px' class="mt30" prop="company" >
  110. <el-input placeholder="工作单位" v-model="userInfo.company " class="pass-input">
  111. </el-input>
  112. </el-form-item>
  113. <el-form-item label="最高学历" label-width='150px' class="mt30" prop="oldPass" >
  114. <el-select placeholder="选择学历" v-model="userInfo.education" class="pass-input" >
  115. <el-option v-for="(item,index) in educationList" :value="item" :label="item" v-bind:key="index" />
  116. </el-select>
  117. <!-- <el-input placeholder="最高学历" v-model="userInfo.education " class="pass-input">
  118. -->
  119. </el-input>
  120. </el-form-item>
  121. <el-form-item label="" label-width='150px' class="mt30" prop="rePass">
  122. <el-button type="primary" class="confirm" @click="saveMoreInfo()">
  123. 确认修改
  124. </el-button>
  125. </el-form-item>
  126. </el-form>
  127. </div>
  128. <div v-if="show===4" class="ng-scope">
  129. <el-form ref="elForm" :inline="false" :model="passForm" :rules="passRules" class="mt50">
  130. <el-form-item label="输入旧密码" label-width='150px' class="mt30" prop="oldPass" >
  131. <el-input placeholder="输入旧密码" v-model="passForm.oldPass " class="pass-input" type="password"
  132. show-password auto-complete="new-password">
  133. </el-input>
  134. </el-form-item>
  135. <el-form-item label="输入新密码" label-width='150px' class="mt30" prop="newPass" >
  136. <el-input placeholder="输入新密码" v-model="passForm.newPass" class="pass-input" type="password"
  137. show-password auto-complete="new-password">
  138. </el-input>
  139. </el-form-item>
  140. <el-form-item label="确认新密码" label-width='150px' class="mt30" prop="rePass">
  141. <el-input placeholder="确认新密码" v-model="passForm.rePass" class="pass-input" type="password"
  142. show-password auto-complete="new-password">
  143. </el-input>
  144. </el-form-item>
  145. <el-form-item label="" label-width='150px' class="mt30" prop="rePass">
  146. <el-button type="primary" class="confirm" @click="doSavePassword()">
  147. 确认修改
  148. </el-button>
  149. </el-form-item>
  150. </el-form>
  151. </div>
  152. <div v-if="show===5" class="ng-scope">
  153. <el-form ref="elFormPhone" :inline="false" :model="phoneForm" :rules="phoneRules" class="mt50">
  154. <el-form-item label="输入新手机" label-width='150px' class="mt30" prop="phone" >
  155. <el-input placeholder="输入新手机" v-model="phoneForm.phone " style="width: 300px;" :maxlength="11" show-word-limit>
  156. </el-input>
  157. </el-form-item>
  158. <el-form-item label="短信检验码" label-width='150px' class="mt30" prop="code" >
  159. <el-input placeholder="输入短信检验码" v-model="phoneForm.code" style="width: 180px;" :maxlength="6" show-word-limit>
  160. </el-input>
  161. <el-button style="width: 120px;" type="info" v-if="phoneForm.phone.length!=11" disabled>获取检验码</el-button>
  162. <el-button style="width: 120px;" type="primary" v-else-if="!count" @click="getCode()">获取检验码</el-button>
  163. <el-button style="width: 120px;" type="info" disabled v-else>剩余时间{{count}} s</el-button>
  164. </el-form-item>
  165. <el-form-item label="" label-width='150px' class="mt30" prop="code" >
  166. <span style="color: red;">注意:手机必须本人实名认证手机</span>
  167. </el-form-item>
  168. <el-form-item label="" label-width='150px' class="mt30" prop="rePass">
  169. <el-button type="primary" class="confirm" @click="doSavePhone()">
  170. 确认修改
  171. </el-button>
  172. </el-form-item>
  173. </el-form>
  174. </div>
  175. </div>
  176. </div>
  177. <el-dialog
  178. append-to-body
  179. close-on-click-modal
  180. :visible.sync="visible"
  181. :width="width">
  182. <img :src="imgUrl" @load="onLoad" alt="" />
  183. </el-dialog>
  184. </div>
  185. </template>
  186. <script>
  187. import { httpServer } from "@/components/httpServer/httpServer.js";
  188. import UploadImage from "@/components/upload/index.vue";
  189. import ImgView from '@/components/upload/imgView.vue';
  190. import DoUpload from '@/components/upload/index.vue'
  191. import rules from "@/utils/rules.js";
  192. import { mapGetters,mapActions } from "vuex";
  193. export default {
  194. data() {
  195. var validatePass2 = (rule, value, callback) => {
  196. if (value === "") {
  197. callback(new Error("请再次输入密码"));
  198. } else if (value !== this.passForm.newPass) {
  199. callback(new Error("两次输入密码不一致!"));
  200. } else {
  201. callback();
  202. }
  203. };
  204. return {
  205. show: 1,
  206. width: "",
  207. visible: false,
  208. timer: false,
  209. count: 0,
  210. imgUrl:'',
  211. educationList: window.baseConfig.educationList,
  212. passForm:{
  213. oldPass:'',
  214. newPass:'',
  215. rePass:'',
  216. },
  217. passRules:{
  218. oldPass: rules.defaultFun("请输入密码"),
  219. newPass: rules.passwordItem,
  220. rePass: [
  221. { required: true, validator: validatePass2, trigger: "blur" },
  222. ],
  223. },
  224. phoneForm:{
  225. phone:'',
  226. code:''
  227. },
  228. phoneRules:{
  229. phone: rules.defaultFun("请输入新手机"),
  230. code: rules.defaultFun("请输入短信校验码")
  231. },
  232. errorImg: 'this.src="' + require('../../../assets/images/default-photo_hash88f70f5253.jpg') + '"'
  233. }
  234. },
  235. computed: {
  236. ...mapGetters("user", ["userInfo"])
  237. },
  238. components:{DoUpload,UploadImage,ImgView},
  239. methods: {
  240. ...mapActions("user", ["saveBaseInfo"]),
  241. isPhone( ){
  242. let phone = this.userInfo.phone;
  243. return !phone||/^1[0-9]{10}$/.test(phone)
  244. },
  245. checkPhone() {
  246. let phone = this.phoneForm.phone;
  247. if (!/^1[3456789]\d{9}$/.test(phone)) {
  248. this.$message.error("请填写正确的手机号");
  249. return false;
  250. }
  251. return true
  252. },
  253. showImg( url ){
  254. this.imgUrl = url;
  255. this.visible = true;
  256. },
  257. setHeadImg( imgUrl ){
  258. this.userInfo.headImg = imgUrl;
  259. this.saveBaseInfo(this.userInfo)
  260. },
  261. setCardImg( url ){
  262. httpServer("User.addCardImg", {url}).then( res=>{
  263. if( res.code == 200){
  264. this.userInfo.cardImg = res.url;
  265. this.userInfo.nickname = res.nickanme
  266. this.userInfo.address = res.address;
  267. this.saveBaseInfo(this.userInfo)
  268. }
  269. })
  270. },
  271. setCardBackImg( url ){
  272. httpServer("User.addCardBackImg", {url}).then( res=>{
  273. if( res.code == 200){
  274. this.userInfo.cardBackImg = url;
  275. this.saveBaseInfo(this.userInfo)
  276. }
  277. })
  278. },
  279. setGraduateImg( url ){
  280. httpServer("User.addGraduateImg", {url}).then( res=>{
  281. if( res.code == 200){
  282. this.userInfo.graduateImg = url;
  283. this.saveBaseInfo(this.userInfo);
  284. }
  285. })
  286. },
  287. identify(){
  288. httpServer("User.identify", {}).then( res=>{
  289. if( res.code == 200){
  290. this.userInfo.identify = 1;
  291. this.saveBaseInfo(this.userInfo)
  292. this.$message.success( "实名认证成功")
  293. }
  294. })
  295. },
  296. doSaveBaseInfo(){
  297. let param = {
  298. headImg:this.userInfo.headImg,
  299. gender:this.userInfo.gender,
  300. }
  301. httpServer("User.saveBaseInfo", param).then( res=>{
  302. if( res.code == 200){
  303. this.$message.success("保存成功")
  304. this.saveBaseInfo(this.userInfo)
  305. }
  306. })
  307. },
  308. doSavePhone(){
  309. let {phone, code} = this.phoneForm;
  310. this.$refs["elFormPhone"].validate((valid) => {
  311. if (!valid) return;
  312. let param = {
  313. phone: phone,
  314. code: code
  315. }
  316. httpServer("User.ChangePhone", param).then( res=>{
  317. if( res.code == 200){
  318. this.userInfo.phone = phone;
  319. this.$message.success("修改手机成功");
  320. this.saveBaseInfo(this.userInfo);
  321. this.$refs["elFormPhone"].resetFields()
  322. }
  323. })
  324. })
  325. },
  326. getCode() {
  327. if (!this.checkPhone()) return;
  328. let phone = this.phoneForm.phone
  329. this.startTimer()
  330. let type = "changePhone"
  331. httpServer("Auth.getCode", { phone, type}).then(res => {
  332. if (res.code == 200) {
  333. this.$message.successMsg("发送成功", 1)
  334. this.startTimer()
  335. }
  336. })
  337. },
  338. startTimer() {
  339. const TIME_COUNT = 60; //更改倒计时时间
  340. if (this.timer) clearInterval(this.timer);
  341. this.count = TIME_COUNT;
  342. this.timer = setInterval(() => {
  343. if (this.count > 0) {
  344. this.count--;
  345. } else {
  346. clearInterval(this.timer); // 清除定时器
  347. this.timer = null;
  348. this.count = 0;
  349. }
  350. }, 1000)
  351. },
  352. doSavePassword(){
  353. let {oldPass, newPass} = this.passForm;
  354. this.$refs["elForm"].validate((valid) => {
  355. console.log(" valid")
  356. if (!valid) return;
  357. let param = {
  358. oldPass:this.$md5(oldPass),
  359. newPass:this.$md5(newPass)
  360. }
  361. httpServer("User.ResetPass", param).then( res=>{
  362. if( res.code == 200){
  363. this.passForm = {oldPass:'', newPass:'', rePass:''};
  364. this.$message.success("密码修改成功")
  365. this.$refs["elForm"].resetField();
  366. }
  367. })
  368. })
  369. },
  370. onLoad(e) {
  371. const img = e.target;
  372. let width = 0;
  373. if (img.fileSize > 0 || (img.width > 1 && img.height > 1)) {
  374. width = img.width + 40;
  375. }
  376. this.width = width + "px";
  377. console.log( this.width )
  378. },
  379. saveMoreInfo(){
  380. let param = {
  381. education:this.userInfo.education,
  382. address:this.userInfo.address,
  383. years:+this.userInfo.years,
  384. company: this.userInfo.company,
  385. address: this.userInfo.address,
  386. education: this.userInfo.education,
  387. postalCode:this.userInfo.postalCode,
  388. }
  389. httpServer("User.saveMoreInfo", param).then( res=>{
  390. if( res.code == 200){
  391. this.$message.success( "编辑成功")
  392. }
  393. })
  394. }
  395. }
  396. }
  397. </script>
  398. <style>
  399. @import url("./index.css");
  400. @import url("../../../assets/css/m-account.css");
  401. .pass-input{
  402. width: 296px;
  403. }
  404. .confirm{
  405. width: 296px;
  406. }
  407. </style>