workercard.html 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <link rel="icon" href="/static/image/logo.png">
  8. <!--<link href="https://cdn.jsdelivr.net/npm/@mdi/font@6.x/css/materialdesignicons.min.css" rel="stylesheet">-->
  9. <link href="/static/plugs/font-awesome-4.7.0/css/font-awesome.css" rel="stylesheet">
  10. <link href="/static/plugs/vuetify/vuetify.css" rel="stylesheet">
  11. <!-- 引入样式 -->
  12. <link rel="stylesheet" href="/static/plugs/iview/styles/iview.css">
  13. <title>水猫工匠-用户名片</title>
  14. <style>
  15. [v-cloak] {
  16. display: none !important;
  17. }
  18. body{
  19. color: #000;
  20. }
  21. #app{
  22. /**padding: 1em;*/
  23. }
  24. #images .img_list{
  25. margin-top: 10px;
  26. }
  27. .demo-upload-list{
  28. display: inline-block;
  29. width: 100%;
  30. height: 200px;
  31. text-align: center;
  32. line-height: 200px;
  33. border: 1px solid transparent;
  34. border-radius: 4px;
  35. overflow: hidden;
  36. background: #fff;
  37. position: relative;
  38. box-shadow: 0 1px 1px rgba(0,0,0,.2);
  39. margin-right: 4px;
  40. }
  41. .demo-upload-list img{
  42. width: 100%;
  43. height: 100%;
  44. }
  45. .demo-upload-list-cover{
  46. display: none;
  47. position: absolute;
  48. top: 0;
  49. bottom: 0;
  50. left: 0;
  51. right: 0;
  52. background: rgba(0,0,0,.6);
  53. }
  54. .demo-upload-list:hover .demo-upload-list-cover{
  55. display: block;
  56. }
  57. .demo-upload-list-cover i{
  58. color: #fff;
  59. font-size: 70px;
  60. cursor: pointer;
  61. margin: 0 20px;
  62. }
  63. #form .ivu-card-head{
  64. padding: 0px;
  65. width: 100%;
  66. height: 120px;
  67. }
  68. #form .ivu-card-head div{
  69. width: 100%;
  70. height: 100%;
  71. }
  72. #form .ivu-card-head div img{
  73. width: 100%;
  74. height: 100%;
  75. }
  76. .ivu-btn-primary:hover {
  77. color: #fff;
  78. background-color: #B3000F;
  79. border-color: #B3000F;
  80. }
  81. .ivu-btn-primary {
  82. color: #fff;
  83. background-color: #E60012;
  84. border-color: #E60012;
  85. }
  86. .red{
  87. color: #E60012;
  88. }
  89. .ivu-upload-drag:hover {
  90. border: 1px dashed #E60012;
  91. }
  92. </style>
  93. </head>
  94. <body>
  95. <div id="app" v-cloak>
  96. <!--<div id="header">
  97. <h1>水猫工匠-用户名片</h1>
  98. </div>-->
  99. <Card :bordered="false" id="form">
  100. <div slot="title">
  101. <img src="/static/image/workercard/banner.png">
  102. </div>
  103. <i-form :model="formdata" :label-width="80" :rules="formRule" ref="editform">
  104. <Form-item label="手机号" v-if="!isedit" prop="telno">
  105. <i-input v-model="formdata.telno" placeholder="请输入手机号"></i-input>
  106. </Form-item>
  107. <Form-item label="手机号" prop="telno" v-else>
  108. {{formdata.telno}}
  109. </Form-item>
  110. <div id="editform">
  111. <Form-item label="姓名" prop="name">
  112. <i-input v-model="formdata.name" placeholder="请输入姓名"></i-input>
  113. </Form-item>
  114. <Form-item label="工种" prop="work_type">
  115. <i-input v-model="formdata.work_type" placeholder="请输入工种"></i-input>
  116. </Form-item>
  117. <Form-item label="工种标签" >
  118. <i-select v-model="formdata.key_word" style="width:200px" multiple>
  119. <i-option v-for="(item,key) in worktypeonelabel" :value="item.label" :key="item.id">{{ item.label }}</i-option>
  120. </i-select>
  121. </Form-item>
  122. <Form-item label="年龄" prop="age">
  123. <Input-number :max="100" :min="17" v-model="formdata.age"></Input-number>
  124. </Form-item>
  125. <Form-item label="籍贯" prop="native">
  126. <i-input v-model="formdata.native" placeholder="请输入籍贯"></i-input>
  127. </Form-item>
  128. <Form-item label="工作地区">
  129. <i-input v-model="formdata.region" placeholder="请输入工作地区"></i-input>
  130. </Form-item>
  131. <Form-item label="交通工具">
  132. <i-input v-model="formdata.traffic_tools" placeholder="请输入交通工具"></i-input>
  133. </Form-item>
  134. <Form-item label="工作经历" prop="note">
  135. <i-input type="textarea" v-model="formdata.note" placeholder="请输入工作经历"></i-input>
  136. </Form-item>
  137. <Form-item label="图片上传" v-if="!issavingloading&&!issavingimg">
  138. <div id="images">
  139. <div class="img_list">
  140. <div class="demo-upload-list" v-for="(url,index) in uploadList" :key="index">
  141. <img :src="url">
  142. <div class="demo-upload-list-cover">
  143. <Icon type="ios-eye-outline" @click.native="handleView2(index)" class="red"></Icon>
  144. <Icon type="ios-trash-outline" @click.native="setdel2(index)" class="red"></Icon>
  145. </div>
  146. <i-button type="primary" long>提交</i-button>
  147. </div>
  148. </div>
  149. <!--:max-size="204800"-->
  150. <!--:on-exceeded-size="handleMaxSize" //action="https://app.tjzhxx.cn:5443/api/Cos/savephoto" http://app.tjzhxx.local.cn/api/Cos/savephoto-->
  151. <Upload
  152. multiple
  153. ref="upload"
  154. :show-upload-list="false"
  155. :on-success="handleSuccess"
  156. :format="['jpg','jpeg','png']"
  157. :on-format-error="handleFormatError"
  158. :before-upload="handleBeforeUpload"
  159. :on-exceeded-size="handleMaxSize"
  160. :max-size="2048"
  161. accept="image/*"
  162. name="file"
  163. type="drag"
  164. action="https://app.tjzhxx.cn:5443/api/Cos/savephoto"
  165. style="display: inline-block;width:100%;">
  166. <div style="width: 100%;height:58px;line-height: 58px;">
  167. <Icon type="md-camera" size="20" class="red"></Icon>
  168. </div>
  169. </Upload>
  170. <Modal title="查看图片" v-model="visible">
  171. <img :src="viewimgurl" v-if="visible" style="width: 100%">
  172. </Modal>
  173. </div>
  174. </Form-item>
  175. <Form-item>
  176. <i-button type="primary" long @click="saveinfo" :loading="issavingloading">提交</i-button>
  177. </Form-item>
  178. <Form-item label="用户照片" v-if="imglist&&imglist.length>0">
  179. <div class="img_list">
  180. <div class="demo-upload-list" v-for="(item,index) in imglist" :key="index">
  181. <img :src="item">
  182. <div class="demo-upload-list-cover">
  183. <Icon type="ios-eye-outline" @click.native="handleView(index)" class="red"></Icon>
  184. <Icon type="ios-trash-outline" @click.native="setdel1(item)"></Icon>
  185. </div>
  186. </div>
  187. </div>
  188. </Form-item>
  189. </div>
  190. </i-form>
  191. </Card>
  192. <Modal v-model="del1" width="360">
  193. <p style="color:#f60;text-align:center">
  194. <Icon type="information-circled"></Icon>
  195. <span>确认删除用户图片</span>
  196. </p>
  197. <div slot="footer">
  198. <Button type="error" size="large" long @click="delimg">删除</Button>
  199. </div>
  200. </Modal>
  201. <Modal v-model="del2" width="360">
  202. <p style="color:#f60;text-align:center">
  203. <Icon type="information-circled"></Icon>
  204. <span>确认删除上传图片</span>
  205. </p>
  206. <div slot="footer">
  207. <Button type="error" size="large" long @click="handleRemove2">删除</Button>
  208. </div>
  209. </Modal>
  210. <Modal v-model="showerrormsg" >
  211. <p style="color:#f60;text-align:center">
  212. 用户图片最少有{{minimgs}}张,还需要再上传{{imgcounterror.diff}}张,便可保存
  213. </p>
  214. </Modal>
  215. </div>
  216. <script>
  217. var sharedata = {php}echo json_encode($sharedata);{/php};
  218. </script>
  219. <script src="/static/plugs/vue/vue.js"></script>
  220. <script src="/static/plugs/iview/iview.min.js"></script>
  221. <script src="/static/plugs/jquery/jquery.js"></script>
  222. <script src="/static/plugs/vuetify/vuetify.js"></script>
  223. <script src="/static/plugs/wechat/jweixin-1.0.0.js"></script>
  224. <!--<script src="/static/plugs/jssha/sha.js"></script>-->
  225. <script src="/static/plugs/js-sha1/sha1.js"></script>
  226. <!--<script src="/static/plugs/wechat/wx_share_config.js"></script>-->
  227. <script>
  228. var url =window.location.href;
  229. var string = "jsapi_ticket=" +sharedata.ticket + "&noncestr=" + sharedata.nonceStr+ "&timestamp=" +sharedata. timestamp + "&url=" + url;
  230. sign = sha1(string)
  231. wx.config({
  232. debug:false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  233. appId:sharedata.appid, // 必填,企业号的唯一标识,此处填写企业号corpid
  234. timestamp:sharedata.timestamp , // 必填,生成签名的时间戳
  235. nonceStr:sharedata.nonceStr, // 必填,生成签名的随机串
  236. signature: sign,// 必填,签名,见附录1
  237. jsApiList:['updateAppMessageShareData','onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
  238. });
  239. wx.error(function(res){
  240. // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
  241. //alert(11)
  242. //alert(JSON.stringify(res));
  243. });
  244. var share_info = {
  245. title:"水猫工匠-用户名片",
  246. desc:"水猫工匠-用户名片",
  247. link:window.location.href,
  248. imgUrl:''
  249. };
  250. //alert(JSON.stringify(share_info));
  251. </script>
  252. <script src="/static/plugs/wechat/wx_share.js"></script>
  253. <script>
  254. var app = new Vue({
  255. el: '#app',
  256. vuetify: new Vuetify(),
  257. data: {
  258. issavingloading:false,
  259. issavingimg:false,
  260. formdata:{
  261. name:"",
  262. age:18,
  263. telno:'',
  264. work_type:'',
  265. region:'',
  266. note:'',
  267. native:'',
  268. traffic_tools:'',
  269. key_word:[],
  270. user_id:0
  271. },
  272. imglistobj:{},
  273. imglist:false,
  274. uploadList:[],
  275. viewimgurl:'',
  276. visible:false,
  277. //url_host:"http://newwatercatserver.com/index.php/index",
  278. //url_host:"https://app.tjzhxx.cn:11443/index.php/index",
  279. url_host:"https://app.tjzhxx.cn:10443/index.php/index",
  280. worktypeonelabel:[],
  281. userid:0,
  282. isedit:false,
  283. del1:false,
  284. del2:false,
  285. del_file:false,
  286. del_imgurl:false,
  287. minimgs:3,
  288. showerrormsg:false,
  289. imgcounterror:{},
  290. formRule: {
  291. telno: [
  292. { type: 'string', required: true, pattern: /^1[3456789]{1}\d{9}$/, message: '手机号错误', trigger: 'blur' }
  293. ],
  294. name:[
  295. { type: 'string', required: true, message: '姓名必填', trigger: 'blur' }
  296. ],
  297. age:[
  298. { type: 'integer', required: true, min:18,max:80, message: '年龄最小18最大80', trigger: 'blur' }
  299. ],
  300. native:[
  301. { type: 'string', required: true, message: '籍贯必填', trigger: 'blur' }
  302. ],
  303. work_type:[
  304. { type: 'string', required: true, message: '工种必填', trigger: 'blur' }
  305. ],
  306. note:[
  307. {type: 'string', required: true,min: 10, message: '工作经历,最少10个字', trigger: 'blur' }
  308. ]
  309. },
  310. },
  311. watch: {
  312. 'formdata.telno' (newValue, old) {
  313. //获取用户信息
  314. if(newValue.length==11){
  315. this.getinfobytelno(newValue)
  316. }
  317. }
  318. },
  319. computed: {
  320. isloading: function () {
  321. }
  322. },
  323. methods:{
  324. handleView (index) {
  325. this.viewimgurl = this.imglist[index];
  326. this.visible = true;
  327. },
  328. setdel2(index){
  329. this.del2=true
  330. this.del_index = index;
  331. },
  332. setdel1(imgurl){
  333. //删除用户图片
  334. this.del1=true
  335. this.del_imgurl = imgurl;
  336. },
  337. handleRemove () {
  338. var file =this.del_file
  339. // 从 upload 实例删除数据
  340. const fileList = this.$refs.upload.fileList;
  341. this.$refs.upload.fileList.splice(fileList.indexOf(file), 1);
  342. this.del_file=false
  343. },
  344. handleView2 (key) {
  345. this.viewimgurl = this.uploadList[key];
  346. this.visible = true;
  347. },
  348. handleRemove2 () {
  349. var index = this.del_index
  350. // 从 upload 实例删除数据
  351. //const fileList = this.$refs.upload.fileList;
  352. //console.log(fileList);
  353. //this.$refs.upload.fileList.splice(fileList.indexOf(file), 1);
  354. //this.uploadList = this.$refs.upload.fileList;
  355. //console.log(this.uploadList);
  356. this.uploadList.splice(index, 1);
  357. this.del_index=false
  358. this.del2=false
  359. },
  360. handleSuccess (res, file) {
  361. this.$Message.destroy()
  362. this.issavingimg=false;
  363. if(1!=res.status){
  364. this.$Message.error(res.msg);
  365. return
  366. }
  367. var data = res.data
  368. var path = data.path
  369. // 因为上传过程为实例,这里模拟添加 url
  370. this.uploadList.push(path);
  371. //file.url = 'https://o5wwk8baw.qnssl.com/7eb99afb9d5f317c912f08b5212fd69a/avatar';
  372. //file.name = '7eb99afb9d5f317c912f08b5212fd69a';
  373. },
  374. handleFormatError (file) {
  375. this.$Notice.error({
  376. title: '文件格式不正确',
  377. desc: '文件 ' + file.name + ' 格式不正确,请上传 jpg 或 png 格式的图片。'
  378. });
  379. this.issavingloading=false
  380. this.issavingimg=false
  381. },
  382. handleMaxSize (file) {
  383. this.$Notice.warning({
  384. title: '超出文件大小限制',
  385. desc: '文件 ' + file.name + ' 太大,不能超过 2M。'
  386. });
  387. this.issavingloading=false
  388. this.issavingimg=false
  389. },
  390. handleBeforeUpload () {
  391. const check = this.uploadList.length < 5;
  392. if (!check) {
  393. this.$Notice.warning({
  394. title: '最多只能上传 5 张图片'
  395. });
  396. }
  397. this.$Message.loading('图片上传中', 0);
  398. this.issavingimg=true;
  399. this.issavingloading=false
  400. return check;
  401. },
  402. getinfobytelno(telno){
  403. //根据手机号获取信息
  404. var that = this;
  405. var url= this.url_host+"/workercardv1/getdatabytelnoforweb";
  406. var data ={telno:telno};
  407. $.ajax({
  408. type: 'POST',
  409. url: url,
  410. data:data,
  411. dataType: "json",
  412. success: function(res){
  413. //res = JSON.parse(res);
  414. //console.log(res);
  415. if(200!=res.code){
  416. if(res.code<0){
  417. var data =res.data
  418. that.isedit =false;
  419. if(data.userid>0){
  420. this.userid = data.userid;
  421. }
  422. }else{
  423. that.$Notice.error({
  424. title: res.msg
  425. });
  426. }
  427. }else{
  428. that.isedit =true
  429. that.formdata=res.data
  430. that.userid = that.formdata.user_id;
  431. //查询素材图片
  432. that.getimglist();
  433. that.$refs['editform'].validate();
  434. }
  435. }
  436. });
  437. },
  438. getimglist(){
  439. userid = this.userid;
  440. if(!userid||userid==''){
  441. return false;
  442. }
  443. //获取用户素材图片列表
  444. var that = this;
  445. var url= this.url_host+"/workercardv1/getwcimgdatalistbyuserid";
  446. var data ={userid:userid};
  447. $.ajax({
  448. type: 'POST',
  449. url: url,
  450. data:data,
  451. dataType: "json",
  452. success: function(res){
  453. if(200!=res.code){
  454. /*if(res.code<0){
  455. }else{
  456. that.$Notice.error({
  457. title: res.msg
  458. });
  459. }*/
  460. }else{
  461. var resultData = res.resultData
  462. that.imglistobj = resultData
  463. that.imglist = resultData.urls;
  464. }
  465. },
  466. error:function(XMLHttpRequest, textStatus, errorThrown){
  467. that.$Notice.error({
  468. title: textStatus
  469. });
  470. that.issavingloading = false;
  471. }
  472. });
  473. },
  474. saveinfo(){
  475. this.$refs['editform'].validate((valid) => {
  476. if(valid){
  477. //保存用户信息
  478. var that = this;
  479. var counturl= this.url_host+"/workercardv1/getcountimgbyuserid";
  480. var minimgs = this.minimgs
  481. var num = this.uploadList.length
  482. var data={
  483. userid:this.userid,
  484. num:num
  485. }
  486. $.ajax({
  487. type: 'POST',
  488. url: counturl,
  489. data:data,
  490. dataType: "json",
  491. success: function(res){
  492. if(200!=res.code){
  493. that.$Notice.error({
  494. title: res.msg
  495. });
  496. }else{
  497. var count = res.data;
  498. var diff = minimgs - count;
  499. console.log(diff,count,minimgs)
  500. if(diff>0){
  501. that.imgcounterror.diff = diff;
  502. that.showerrormsg=true
  503. }else{
  504. that.saveinfo2();
  505. }
  506. }
  507. }
  508. })
  509. }
  510. })
  511. },
  512. saveinfo2(){
  513. var that = this;
  514. this.issavingloading = true;
  515. var url= this.url_host+"/workercardv1/savewcidinfoforweb";
  516. var data =this.formdata;
  517. $.ajax({
  518. type: 'POST',
  519. url: url,
  520. data:data,
  521. dataType: "json",
  522. success: function(res){
  523. //console.log(res);
  524. if(200!=res.code){
  525. if(res.code<0){
  526. }else{
  527. that.$Notice.error({
  528. title: res.msg
  529. });
  530. }
  531. }else{
  532. that.isedit=true
  533. that.$Notice.success({
  534. title: "用户信息保存成功"
  535. });
  536. var data = res.data
  537. that.userid = data['uid'];
  538. that.editimg();
  539. }
  540. that.issavingloading = false;
  541. },
  542. error:function(XMLHttpRequest, textStatus, errorThrown){
  543. that.$Notice.error({
  544. title: textStatus
  545. });
  546. that.issavingloading = false;
  547. }
  548. });
  549. },
  550. editimg(){
  551. //编辑素材图片
  552. var that = this;
  553. var url= this.url_host+"/workercardv1/editwcdataphotoimgforweb";
  554. if(this.uploadList.length>0){
  555. var data={userid:this.userid,url:this.uploadList}
  556. $.ajax({
  557. type: 'POST',
  558. url: url,
  559. data:data,
  560. dataType: "json",
  561. success: function(res){
  562. //console.log(res);
  563. if(200!=res.code){
  564. if(res.code<0){
  565. }else{
  566. that.$Notice.error({
  567. title: res.msg
  568. });
  569. }
  570. }else{
  571. that.$Notice.success({
  572. title: "用户图片保存成功"
  573. });
  574. that.imglist=false
  575. that.uploadList=[]
  576. that.getimglist()
  577. }
  578. that.issavingloading = false;
  579. }
  580. });
  581. }
  582. },
  583. getworktypelabel(){
  584. //获取一级标签
  585. var that = this;
  586. var url= this.url_host+"/Worktype/getonelabellist";
  587. $.ajax({
  588. type: 'POST',
  589. url: url,
  590. dataType: "json",
  591. success: function(res){
  592. if(200!=res.code){
  593. that.$Notice.warning({
  594. title: res.msg
  595. });
  596. }else{
  597. that.worktypeonelabel=res.resultData
  598. let list = res.resultData
  599. for(let i in list){
  600. let item = list[i];
  601. if(item.is_default){
  602. that.formdata.key_word.push(item.label);
  603. }
  604. }
  605. }
  606. }
  607. });
  608. },
  609. getUrlParam(name) {
  610. var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象
  611. var r = window.location.search.substr(1).match(reg); //匹配目标参数
  612. if (r != null) return unescape(r[2]); return null; //返回参数值
  613. },
  614. delimg(){
  615. var imgurl = this.del_imgurl
  616. var that = this;
  617. var url= this.url_host+"/workercardv1/deleteuserimg";
  618. var data ={
  619. 'url':imgurl,
  620. 'userid':this.userid
  621. }
  622. $.ajax({
  623. type: 'POST',
  624. url: url,
  625. data:data,
  626. dataType: "json",
  627. success: function(res){
  628. if(200!=res.code){
  629. that.$Notice.warning({
  630. title: res.msg
  631. });
  632. }else{
  633. this.del_imgurl =false
  634. that.$Notice.success({
  635. title: res.msg
  636. });
  637. that.getimglist();
  638. that.del1=false
  639. }
  640. }
  641. });
  642. }
  643. },
  644. mounted() {
  645. var web_user_id=this.getUrlParam('reid');
  646. this.formdata.referrer_uid = web_user_id;
  647. this.getworktypelabel();
  648. }
  649. })
  650. </script>
  651. </body>
  652. </html>