index.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  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 :span="6" 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 :span="6" 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 :span="6" 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 :span="6" 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-input placeholder="最高学历" v-model="userInfo.education " class="pass-input">
  115. </el-input>
  116. </el-form-item>
  117. <el-form-item label="" label-width='150px' class="mt30" prop="rePass">
  118. <el-button type="primary" class="confirm" @click="saveMoreInfo()">
  119. 确认修改
  120. </el-button>
  121. </el-form-item>
  122. </el-form>
  123. </div>
  124. <div v-if="show===4" class="ng-scope">
  125. <el-form ref="elForm" :inline="false" :model="passForm" :rules="passRules" class="mt50">
  126. <el-form-item label="输入旧密码" label-width='150px' class="mt30" prop="oldPass" >
  127. <el-input placeholder="输入旧密码" v-model="passForm.oldPass " class="pass-input" type="password"
  128. show-password auto-complete="new-password">
  129. </el-input>
  130. </el-form-item>
  131. <el-form-item label="输入新密码" label-width='150px' class="mt30" prop="newPass" >
  132. <el-input placeholder="输入新密码" v-model="passForm.newPass" class="pass-input" type="password"
  133. show-password auto-complete="new-password">
  134. </el-input>
  135. </el-form-item>
  136. <el-form-item label="确认新密码" label-width='150px' class="mt30" prop="rePass">
  137. <el-input placeholder="确认新密码" v-model="passForm.rePass" class="pass-input" type="password"
  138. show-password auto-complete="new-password">
  139. </el-input>
  140. </el-form-item>
  141. <el-form-item label="" label-width='150px' class="mt30" prop="rePass">
  142. <el-button type="primary" class="confirm" @click="doSavePassword()">
  143. 确认修改
  144. </el-button>
  145. </el-form-item>
  146. </el-form>
  147. </div>
  148. <div v-if="show===5" class="ng-scope">
  149. <el-form ref="elFormPhone" :inline="false" :model="phoneForm" :rules="phoneRules" class="mt50">
  150. <el-form-item label="输入新手机" label-width='150px' class="mt30" prop="phone" >
  151. <el-input placeholder="输入新手机" v-model="phoneForm.phone " style="width: 300px;" :maxlength="11" show-word-limit>
  152. </el-input>
  153. </el-form-item>
  154. <el-form-item label="短信检验码" label-width='150px' class="mt30" prop="code" >
  155. <el-input placeholder="输入短信检验码" v-model="phoneForm.code" style="width: 180px;" :maxlength="6" show-word-limit>
  156. </el-input>
  157. <el-button style="width: 120px;" type="info" v-if="phoneForm.phone.length!=11" disabled>获取检验码</el-button>
  158. <el-button style="width: 120px;" type="primary" v-else-if="!count" @click="getCode()">获取检验码</el-button>
  159. <el-button style="width: 120px;" type="info" disabled v-else>剩余时间{{count}} s</el-button>
  160. </el-form-item>
  161. <el-form-item label="" label-width='150px' class="mt30" prop="code" >
  162. <span style="color: red;">注意:手机必须本人实名认证手机</span>
  163. </el-form-item>
  164. <el-form-item label="" label-width='150px' class="mt30" prop="rePass">
  165. <el-button type="primary" class="confirm" @click="doSavePhone()">
  166. 确认修改
  167. </el-button>
  168. </el-form-item>
  169. </el-form>
  170. </div>
  171. </div>
  172. </div>
  173. <el-dialog
  174. append-to-body
  175. close-on-click-modal
  176. :visible.sync="visible"
  177. :width="width">
  178. <img :src="imgUrl" @load="onLoad" alt="" />
  179. </el-dialog>
  180. </div>
  181. </template>
  182. <script>
  183. import { httpServer } from "@/components/httpServer/httpServer.js";
  184. import UploadImage from "@/components/upload/index.vue";
  185. import ImgView from '@/components/upload/imgView.vue';
  186. import DoUpload from '@/components/upload/index.vue'
  187. import rules from "@/utils/rules.js";
  188. import { mapGetters,mapActions } from "vuex";
  189. export default {
  190. data() {
  191. var validatePass2 = (rule, value, callback) => {
  192. if (value === "") {
  193. callback(new Error("请再次输入密码"));
  194. } else if (value !== this.passForm.newPass) {
  195. callback(new Error("两次输入密码不一致!"));
  196. } else {
  197. callback();
  198. }
  199. };
  200. return {
  201. show: 1,
  202. width: "",
  203. visible: false,
  204. timer: false,
  205. count: 0,
  206. imgUrl:'',
  207. passForm:{
  208. oldPass:'',
  209. newPass:'',
  210. rePass:'',
  211. },
  212. passRules:{
  213. oldPass: rules.defaultFun("请输入密码"),
  214. newPass: rules.passwordItem,
  215. rePass: [
  216. { required: true, validator: validatePass2, trigger: "blur" },
  217. ],
  218. },
  219. phoneForm:{
  220. phone:'',
  221. code:''
  222. },
  223. phoneRules:{
  224. phone: rules.defaultFun("请输入新手机"),
  225. code: rules.defaultFun("请输入短信校验码")
  226. },
  227. errorImg: 'this.src="' + require('../../../assets/images/default-photo_hash88f70f5253.jpg') + '"'
  228. }
  229. },
  230. computed: {
  231. ...mapGetters("user", ["userInfo"])
  232. },
  233. components:{DoUpload,UploadImage,ImgView},
  234. methods: {
  235. ...mapActions("user", ["saveBaseInfo"]),
  236. isPhone( ){
  237. let phone = this.userInfo.phone;
  238. return !phone||/^1[0-9]{10}$/.test(phone)
  239. },
  240. checkPhone() {
  241. let phone = this.phoneForm.phone;
  242. if (!/^1[3456789]\d{9}$/.test(phone)) {
  243. this.$message.error("请填写正确的手机号");
  244. return false;
  245. }
  246. return true
  247. },
  248. showImg( url ){
  249. this.imgUrl = url;
  250. this.visible = true;
  251. },
  252. setHeadImg( imgUrl ){
  253. this.userInfo.headImg = imgUrl;
  254. this.saveBaseInfo(this.userInfo)
  255. },
  256. setCardImg( url ){
  257. httpServer("User.addCardImg", {url}).then( res=>{
  258. if( res.code == 200){
  259. this.userInfo.cardImg = res.url;
  260. this.userInfo.nickname = res.nickanme
  261. this.userInfo.address = res.address;
  262. this.saveBaseInfo(this.userInfo)
  263. }
  264. })
  265. },
  266. setCardBackImg( url ){
  267. httpServer("User.addCardBackImg", {url}).then( res=>{
  268. if( res.code == 200){
  269. this.userInfo.cardBackImg = url;
  270. this.saveBaseInfo(this.userInfo)
  271. }
  272. })
  273. },
  274. setGraduateImg( url ){
  275. httpServer("User.addGraduateImg", {url}).then( res=>{
  276. if( res.code == 200){
  277. this.userInfo.graduateImg = url;
  278. this.saveBaseInfo(this.userInfo);
  279. }
  280. })
  281. },
  282. identify(){
  283. httpServer("User.identify", {}).then( res=>{
  284. if( res.code == 200){
  285. this.userInfo.identify = 1;
  286. this.saveBaseInfo(this.userInfo)
  287. this.$message.success( "实名认证成功")
  288. }
  289. })
  290. },
  291. doSaveBaseInfo(){
  292. let param = {
  293. headImg:this.userInfo.headImg,
  294. gender:this.userInfo.gender,
  295. }
  296. httpServer("User.saveBaseInfo", param).then( res=>{
  297. if( res.code == 200){
  298. this.$message.success("保存成功")
  299. this.saveBaseInfo(this.userInfo)
  300. }
  301. })
  302. },
  303. doSavePhone(){
  304. let {phone, code} = this.phoneForm;
  305. this.$refs["elFormPhone"].validate((valid) => {
  306. if (!valid) return;
  307. let param = {
  308. phone: phone,
  309. code: code
  310. }
  311. httpServer("User.ChangePhone", param).then( res=>{
  312. if( res.code == 200){
  313. this.userInfo.phone = phone;
  314. this.$message.success("修改手机成功");
  315. this.saveBaseInfo(this.userInfo);
  316. this.$refs["elFormPhone"].resetFields()
  317. }
  318. })
  319. })
  320. },
  321. getCode() {
  322. if (!this.checkPhone()) return;
  323. let phone = this.phoneForm.phone
  324. this.startTimer()
  325. let type = "changePhone"
  326. httpServer("Auth.getCode", { phone, type}).then(res => {
  327. if (res.code == 200) {
  328. this.$message.successMsg("发送成功", 1)
  329. this.startTimer()
  330. }
  331. })
  332. },
  333. startTimer() {
  334. const TIME_COUNT = 60; //更改倒计时时间
  335. if (this.timer) clearInterval(this.timer);
  336. this.count = TIME_COUNT;
  337. this.timer = setInterval(() => {
  338. if (this.count > 0) {
  339. this.count--;
  340. } else {
  341. clearInterval(this.timer); // 清除定时器
  342. this.timer = null;
  343. this.count = 0;
  344. }
  345. }, 1000)
  346. },
  347. doSavePassword(){
  348. let {oldPass, newPass} = this.passForm;
  349. this.$refs["elForm"].validate((valid) => {
  350. console.log(" valid")
  351. if (!valid) return;
  352. let param = {
  353. oldPass:this.$md5(oldPass),
  354. newPass:this.$md5(newPass)
  355. }
  356. httpServer("User.ResetPass", param).then( res=>{
  357. if( res.code == 200){
  358. this.passForm = {oldPass:'', newPass:'', rePass:''};
  359. this.$message.success("密码修改成功")
  360. this.$refs["elForm"].resetField();
  361. }
  362. })
  363. })
  364. },
  365. onLoad(e) {
  366. const img = e.target;
  367. let width = 0;
  368. if (img.fileSize > 0 || (img.width > 1 && img.height > 1)) {
  369. width = img.width + 40;
  370. }
  371. this.width = width + "px";
  372. console.log( this.width )
  373. },
  374. saveMoreInfo(){
  375. let param = {
  376. education:this.userInfo.education,
  377. address:this.userInfo.address,
  378. years:+this.userInfo.years,
  379. company: this.userInfo.company,
  380. address: this.userInfo.address,
  381. education: this.userInfo.education,
  382. postalCode:this.userInfo.postalCode,
  383. }
  384. httpServer("User.saveMoreInfo", param).then( res=>{
  385. if( res.code == 200){
  386. this.$message.success( "编辑成功")
  387. }
  388. })
  389. }
  390. }
  391. }
  392. </script>
  393. <style>
  394. @import url("./index.css");
  395. @import url("../../../assets/css/m-account.css");
  396. .pass-input{
  397. width: 296px;
  398. }
  399. .confirm{
  400. width: 296px;
  401. }
  402. </style>