step.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515
  1. <template>
  2. <view class="page">
  3. <view class="list_info">
  4. <block v-if="step == 1">
  5. <view class="name">请问你的性别是:</view>
  6. <view class="itemSex">
  7. <view class="sex2" :class="sex == 1?'active':''" style="margin-right: 10rpx;" @click="chkSex(1)">
  8. <image class="photo" src="../../static/me/sex_1.png" mode="widthFix" />
  9. <text>男性</text>
  10. </view>
  11. <view class="sex2" :class="sex == 2?'active':''" style="margin-left: 10rpx;" @click="chkSex(2)">
  12. <image class="photo" src="../../static/me/sex_2.png" mode="widthFix" />
  13. <text>女性</text>
  14. </view>
  15. </view>
  16. <view class="name">给自己取个名字吧:</view>
  17. <view class="item">
  18. <input type="text" class="input" placeholder="请输入昵称" v-model="nickname" maxlength="10" />
  19. </view>
  20. <view class="name">你的微信号是:</view>
  21. <view class="item">
  22. <input type="text" class="input" placeholder="请输入微信号" v-model="wechat" maxlength="32" />
  23. </view>
  24. <view class="name">选一张你的真实照片作为封面:</view>
  25. <view class="bcenter">
  26. <view class="avator" @click="upload">
  27. <image :src="avator" mode="aspectFill" class="img" />
  28. <image class="photo" src="../../static/me/photo.png" mode="widthFix" />
  29. </view>
  30. </view>
  31. </block>
  32. <block v-if="step == 2">
  33. <view class="name">给自己写一个个性签名:</view>
  34. <view class="item">
  35. <input type="text" class="input" placeholder="请输入个性签名" v-model="qianmin" maxlength="64" />
  36. </view>
  37. <view class="name">职业:</view>
  38. <view class="item">
  39. <input type="text" class="input" placeholder="请输入职业" v-model="ziye" maxlength="50" />
  40. </view>
  41. <view class="name">年龄:</view>
  42. <view class="itemSingle">
  43. <slider class="slider" :value="age" @change="sliderChange1" activeColor="#FF2A95"
  44. background-color="#282828" block-color="#FF2A95" block-size="12" min="10" max="100"
  45. show-value />
  46. </view>
  47. <view class="name">身高(CM):</view>
  48. <view class="itemSingle">
  49. <slider class="slider" :value="height" @change="sliderChange2" activeColor="#FF2A95"
  50. background-color="#282828" block-color="#FF2A95" block-size="12" min="150" max="220"
  51. show-value />
  52. </view>
  53. <view class="name">体重(KG):</view>
  54. <view class="itemSingle">
  55. <slider class="slider" :value="weight" @change="sliderChange3" activeColor="#FF2A95"
  56. background-color="#282828" block-color="#FF2A95" block-size="12" min="30" max="100"
  57. show-value />
  58. </view>
  59. </block>
  60. <block v-if="step == 3">
  61. <view class="name">学历:</view>
  62. <view class="item" @click="SetXueli">
  63. <input type="text" class="input" placeholder="请选择" v-model="xueli_sel" disabled="true" />
  64. <image class="arrow" src="../../static/me/arrow_right_gray.png" mode="widthFix" />
  65. </view>
  66. <view class="name">您的星座是:</view>
  67. <view class="item" @click="SetXinzuo">
  68. <input type="text" class="input" placeholder="请选择" v-model="xinzuo_sel" disabled="true" />
  69. <image class="arrow" src="../../static/me/arrow_right_gray.png" mode="widthFix" />
  70. </view>
  71. </block>
  72. <block v-if="step == 4">
  73. <view class="name">兴趣爱好:
  74. <view class="right" @click="showPop = true;">添加+</view>
  75. </view>
  76. <view class="item_tag">
  77. <view class="tag" v-for="(item,index) in sel_tags">
  78. {{item}}
  79. <image class="close" src="../../static/me/close.png" mode="widthFix" @click="delTag(item)" />
  80. </view>
  81. </view>
  82. </block>
  83. <view class="blankHeight"></view>
  84. </view>
  85. <view class="btn_submit" v-if="step == 1" @click="step ++;">下一步</view>
  86. <view class="btn_list" v-if="step == 2 || step == 3">
  87. <view class="btn_submit1" @click="step --;">上一步</view>
  88. <view class="btn_submit2" @click="step ++;">下一步</view>
  89. </view>
  90. <view class="btn_list" v-if="step == 4">
  91. <view class="btn_submit1" @click="step --;">上一步</view>
  92. <view class="btn_submit2" @click="submitData()">完成</view>
  93. </view>
  94. <view class="popSel" v-if="showPop" @tap.stop="onPreview">
  95. <view class="list_info">
  96. <view class="name">你的兴趣爱好是?</view>
  97. <view class="desc">提示:最多选择10个兴趣爱好标签</view>
  98. <view class="item_tag">
  99. <view @tap.stop="chkTag(item)" class="tag" :class="selTags(item)?'active':''"
  100. v-for="(item,index) in list_tag">
  101. {{item}}
  102. </view>
  103. </view>
  104. </view>
  105. <view class="btn_submit" @click="showPop = false;">提交选择</view>
  106. </view>
  107. <view class="tag_all_select">
  108. <view class="tag_items">
  109. <view
  110. v-for="(item, index) in tagList"
  111. :key="index"
  112. class="tag_item"
  113. :class="[item.size, {'active': selectedTags.includes(index)}]"
  114. @click="selectTag(index)"
  115. >
  116. {{item.name}}
  117. </view>
  118. </view>
  119. </view>
  120. <view class="blankHeight"></view>
  121. <view class="blankHeight"></view>
  122. <view class="blankHeight"></view>
  123. <ToastW3 ref="ToastW3"></ToastW3>
  124. <DialogBox ref="DialogBox"></DialogBox>
  125. <view v-if="showRights"
  126. style="width:100%;height:300rpx;background-color: rgba(255,255,255,0.9);position: fixed;top:0;display: flex;flex-direction: column;justify-content: center;align-items: center;">
  127. <text
  128. style="width:90%;color:#000000;font-size:38rpx;text-align: left;padding:10rpx 20rpx;padding-top:10rpx;">正在获取相机、存储权限</text>
  129. <text
  130. style="width:90%;color:#666666;font-size:28rpx;text-align: left;padding:10rpx 20rpx;">该权限用于获取设备拍摄或获取本地应用相册,进行头像或图片上传。</text>
  131. </view>
  132. </view>
  133. </template>
  134. <script>
  135. import {
  136. requestAndroidPermission,
  137. gotoAppPermissionSetting
  138. } from '../index/permission.js'
  139. export default {
  140. components: {},
  141. data() {
  142. return {
  143. showRights: false,
  144. title: '',
  145. step: 1,
  146. sel: 1,
  147. info: {},
  148. showPop: false,
  149. nickname: '',
  150. wechat: '',
  151. sex: 1,
  152. age: 18,
  153. height: 160,
  154. weight: 50,
  155. avator: '../../static/me/avator.png',
  156. ziye: '',
  157. qianmin: '',
  158. xueli_sel: '',
  159. xueli: ['初中', '初中', '中专', '高中', '专科', '本科', '研究生', '硕士', '博士'],
  160. xinzuo_sel: '',
  161. xinzuo: ['水瓶座', '双鱼座', '白羊座', '金牛座', '双子座', '巨蟹座', '狮子座', '处女座', '天秤座', '天蝎座', '射手座', '摩羯座'],
  162. list_tag: [
  163. '篮球', '排球', '足球', '羽毛球', '健身达人', '美食达人'
  164. ],
  165. sel_tags: [],
  166. selectedTags: [],
  167. tagList: [
  168. { name: '游戏', size: 'large' },
  169. { name: '音乐', size: 'medium' },
  170. { name: '盲盒', size: 'large' },
  171. { name: '小可爱', size: 'small' },
  172. { name: '娃娃人', size: 'medium' },
  173. { name: '纹身', size: 'large' },
  174. { name: '洛丽塔', size: 'small' },
  175. { name: '女装', size: 'medium' },
  176. { name: '萌球', size: 'small' }
  177. ]
  178. }
  179. },
  180. onLoad() {
  181. this.step = 1;
  182. let tagStr =
  183. "篮球、羽毛球、兵乓球、足球、滑板、滑旱冰、跑步、跳绳、举重、听音乐、看电影、绘画、写小说、看书、做弹弓玩、做木剑玩、做橡皮枪玩、积木、用麻将搭金字塔、拼图、拆装、扑克牌、小汽车、手表、鞋之类的、弹吉他、钢琴、萨克斯、葫芦丝、大号、小号、折纸、剪纸、品茶、涂鸦、英雄联盟、qq堂、cs、cf、地下城勇士、桌面游戏";
  184. this.list_tag = tagStr.split("、");
  185. this.getInfoData();
  186. },
  187. onShow() {},
  188. methods: {
  189. onBack() {},
  190. chkSel() {
  191. if (this.sel == 1) {
  192. this.sel = 0;
  193. } else {
  194. this.sel = 1;
  195. }
  196. },
  197. chkSex(sex) {
  198. this.sex = sex;
  199. },
  200. delTag(tg) {
  201. let list_tag2 = [];
  202. for (let i = 0; i < this.sel_tags.length; i++) {
  203. if (this.sel_tags[i] != tg && this.sel_tags[i] != '') {
  204. list_tag2.push(this.sel_tags[i]);
  205. }
  206. }
  207. this.sel_tags = list_tag2;
  208. },
  209. selTags(itm) {
  210. let that = this;
  211. let isIn = false;
  212. for (let entry of this.sel_tags) {
  213. // console.log(entry); // 1, "string", false
  214. if (entry == itm) {
  215. isIn = true;
  216. break;
  217. }
  218. }
  219. return isIn;
  220. },
  221. chkTag(itm) {
  222. if (this.selTags(itm)) {
  223. let tmpTags = [];
  224. for (let entry of this.sel_tags) {
  225. // console.log(entry); // 1, "string", false
  226. if (entry != itm && entry != '') {
  227. tmpTags.push(entry);
  228. }
  229. }
  230. this.sel_tags = tmpTags;
  231. } else {
  232. if (this.sel_tags.length >= 10) {
  233. this.$refs['ToastW3'].showToast({
  234. title: "最多选择10个标签",
  235. animation: 0
  236. });
  237. return;
  238. }
  239. this.sel_tags.push(itm);
  240. }
  241. },
  242. sliderChange1(e) {
  243. this.age = e.detail.value;
  244. },
  245. sliderChange2(e) {
  246. this.height = e.detail.value;
  247. },
  248. sliderChange3(e) {
  249. this.weight = e.detail.value;
  250. },
  251. SetXueli() {
  252. let that = this;
  253. uni.showActionSheet({
  254. itemColor: '#000000',
  255. itemList: this.xueli,
  256. success: function(res) {
  257. that.xueli_sel = that.xueli[res.tapIndex];
  258. // console.log('选中了第' + (res.tapIndex + 1) + '个按钮');
  259. },
  260. fail: function(res) {
  261. console.log(res.errMsg);
  262. }
  263. });
  264. },
  265. SetXinzuo() {
  266. let that = this;
  267. uni.showActionSheet({
  268. itemColor: '#000000',
  269. itemList: this.xinzuo,
  270. success: function(res) {
  271. that.xinzuo_sel = that.xinzuo[res.tapIndex];
  272. // console.log('选中了第' + (res.tapIndex + 1) + '个按钮');
  273. },
  274. fail: function(res) {
  275. console.log(res.errMsg);
  276. }
  277. });
  278. },
  279. getInfoData() {
  280. console.log(this.$apiHost + '/Member/getinfoData');
  281. uni.request({
  282. url: this.$apiHost + '/Member/getinfoData', //仅为示例,并非真实接口地址。
  283. data: {
  284. uuid: getApp().globalData.uuid
  285. },
  286. header: {
  287. 'content-type': 'application/json' //自定义请求头信息
  288. },
  289. success: (res) => {
  290. console.log("res", res.data)
  291. this.nickname = res.data.nickname;
  292. this.wechat = res.data.wechat;
  293. this.sex = res.data.sex || 2;
  294. this.age = res.data.age || 18;
  295. this.height = res.data.height || 160;
  296. this.weight = res.data.weight || 50;
  297. this.xueli_sel = res.data.xueli;
  298. this.xinzuo_sel = res.data.xinzuo;
  299. this.ziye = res.data.ziye;
  300. this.qianmin = res.data.qianmin;
  301. if (res.data.avator != "") {
  302. this.avator = res.data.avator;
  303. }
  304. if (res.data.aihao != null && res.data.aihao != undefined) {
  305. if (res.data.aihao.length > 0) {
  306. this.sel_tags = res.data.aihao.split(",");
  307. }
  308. }
  309. }
  310. });
  311. },
  312. submitData() {
  313. let aihao = this.sel_tags.join(',')
  314. let obj2 = {
  315. uuid: getApp().globalData.uuid,
  316. avator: this.avator,
  317. nickname: this.nickname,
  318. wechat: this.wechat,
  319. sex: this.sex,
  320. age: this.age,
  321. height: this.height,
  322. weight: this.weight,
  323. xueli: this.xueli_sel,
  324. xinzuo: this.xinzuo_sel,
  325. ziye: this.ziye,
  326. qianmin: this.qianmin,
  327. aihao: aihao
  328. }
  329. // console.log("obj2", obj2);
  330. uni.request({
  331. url: this.$apiHost + '/Member/setinfoData', //仅为示例,并非真实接口地址。
  332. data: obj2,
  333. method: 'POST',
  334. header: {
  335. 'Content-Type': 'application/x-www-form-urlencoded',
  336. 'sign': getApp().globalData.headerSign
  337. },
  338. dataType: 'json',
  339. // header: {
  340. // 'content-type': 'application/json', //自定义请求头信息
  341. // 'Access-Control-Allow-Origin': '*'
  342. // },
  343. success: (res) => {
  344. console.log("res", res.data)
  345. this.$refs['ToastW3'].showToast({
  346. title: res.data.str,
  347. animation: 0
  348. });
  349. if (res.data.success == "yes") {
  350. uni.switchTab({
  351. url: "/pages/index/index",
  352. });
  353. }
  354. }
  355. });
  356. },
  357. // upload() {
  358. // let that = this;
  359. // this.$refs['DialogBox'].confirm({
  360. // title: '提示',
  361. // content: '该权限用于获取设备拍摄或获取本地应用相册,进行头像的图片上传。',
  362. // DialogType: 'inquiry',
  363. // btn1: '拒绝',
  364. // btn2: '同意',
  365. // animation: 0
  366. // }).then((res) => {
  367. // that.upload2();
  368. // })
  369. // },
  370. upload() {
  371. this.checkRights();
  372. console.log("----upload");
  373. var _self = this;
  374. uni.chooseImage({
  375. count: 1,
  376. sizeType: ['compressed'], //可以指定是原图还是压缩图,默认二者都有
  377. sourceType: ['album', 'camera'], //从相册、相机选择
  378. extension: ['.png', '.jpeg', '.jpg'],
  379. success: function(res) {
  380. console.log('res:', res)
  381. _self.imglocal = res.tempFilePaths[0]
  382. const tempFilePaths = res.tempFilePaths[0];
  383. console.log('tempFilePaths:', tempFilePaths);
  384. // 图片上传
  385. const uploadTask = uni.uploadFile({
  386. url: _self.$apiHost + '/Xweb/upload_img?skey=' + _self.skey, // post请求地址
  387. filePath: res.tempFilePaths[0],
  388. name: 'file', // 待确认
  389. success: function(uploadFileRes) {
  390. let resdata = JSON.parse(uploadFileRes.data)
  391. console.log('Success11:', uploadFileRes);
  392. console.log('Success21:', resdata);
  393. if (resdata.success == 'yes') {
  394. _self.avator = resdata.url;
  395. }
  396. },
  397. fail: function(uploadFileFail) {
  398. console.log('Error:', uploadFileFail.data);
  399. },
  400. complete: () => {
  401. console.log('Complete:');
  402. }
  403. });
  404. },
  405. error: function(e) {
  406. console.log(e);
  407. }
  408. });
  409. },
  410. checkRights() {
  411. let that = this;
  412. that.showRights = true;
  413. requestAndroidPermission('android.permission.CAMERA')
  414. .then(result => {
  415. that.showRights = false;
  416. // 根据返回的结果进行处理
  417. if (result === 1) {} else if (result === 0) {
  418. console.log('权限被拒绝');
  419. } else if (result === -1) {
  420. console.log('权限被永久拒绝');
  421. }
  422. })
  423. .catch(error => {
  424. that.showRights = true;
  425. console.log('权限申请失败:', error);
  426. });
  427. },
  428. selectTag(index) {
  429. const tagIndex = this.selectedTags.indexOf(index);
  430. if (tagIndex === -1) {
  431. // 如果未选中,则添加到选中数组
  432. this.selectedTags.push(index);
  433. } else {
  434. // 如果已选中,则从数组中移除
  435. this.selectedTags.splice(tagIndex, 1);
  436. }
  437. }
  438. }
  439. }
  440. </script>
  441. <style scoped lang="scss">
  442. @import 'normal.scss';
  443. .popSel {
  444. position: fixed;
  445. z-index: 999999;
  446. top: 0;
  447. left: 0;
  448. background-color: #121212;
  449. width: 100vh;
  450. height: 100vh;
  451. }
  452. .tag_all_select {
  453. padding: 20rpx;
  454. .tag_items {
  455. display: flex;
  456. flex-wrap: wrap;
  457. gap: 30rpx;
  458. justify-content: center;
  459. align-items: center;
  460. .tag_item {
  461. display: flex;
  462. align-items: center;
  463. justify-content: center;
  464. border-radius: 50%;
  465. background: rgba(255,255,255,0.1);
  466. color: #fff;
  467. font-size: 26rpx;
  468. transition: all 0.3s ease;
  469. cursor: pointer;
  470. &.small {
  471. width: 120rpx;
  472. height: 120rpx;
  473. }
  474. &.medium {
  475. width: 160rpx;
  476. height: 160rpx;
  477. font-size: 28rpx;
  478. }
  479. &.large {
  480. width: 200rpx;
  481. height: 200rpx;
  482. font-size: 32rpx;
  483. }
  484. &.active {
  485. transform: scale(1.2);
  486. background: rgba(255,255,255,0.2);
  487. box-shadow: 0 0 20rpx rgba(255,255,255,0.3);
  488. z-index: 1;
  489. }
  490. &:not(.active):hover {
  491. transform: scale(1.05);
  492. }
  493. }
  494. }
  495. }
  496. </style>