MBTI人格测试 uniapp

career_old.vue 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545
  1. <template>
  2. <view class="page-wrap">
  3. <!--pages/career/career.wxml-->
  4. <!-- 跑马灯 -->
  5. <view class="box">
  6. <text class="title"
  7. >温馨提示:请在心态平和的情况下开始答题,每题考虑时间不宜超过10秒钟,选项之间无对错好坏之分,请选择与你实际做法相符的,而不是你认为怎样做是对的!</text
  8. >
  9. </view>
  10. <form class="section section_gap" @submit="onSubmit" @reset="onReset">
  11. <!-- 第一部分 -->
  12. <view class="group1">
  13. <block v-for="(item, index) in 7" :key="index">
  14. <view :class="['section__title', 'num'+index]">
  15. <text>{{ option.title[index] }}</text>
  16. </view>
  17. <view class="two">
  18. <radio-group
  19. name="radio-group"
  20. @change="onRadioChange"
  21. :data-index="index"
  22. >
  23. <view class="first">
  24. <radio value="radio1" />
  25. <text>{{ option.toptext[index] }}</text>
  26. </view>
  27. <view class="first">
  28. <radio value="radio2" />
  29. <text>{{ option.bottext[index] }}</text>
  30. </view>
  31. </radio-group>
  32. </view>
  33. </block>
  34. </view>
  35. <!-- 分割线 -->
  36. <view class="fgx"></view>
  37. <!-- 第二部分 -->
  38. <view class="group2">
  39. <block v-for="(item, index) in 7" :key="index">
  40. <view :class="['section__title', 'num'+(7+index)]">
  41. <text>{{ option.title2[index] }}</text>
  42. </view>
  43. <view class="two">
  44. <radio-group
  45. name="radio-group"
  46. @change="onRadioChange"
  47. :data-index="7+index"
  48. >
  49. <view class="first">
  50. <radio value="radio1" />
  51. <text>{{ option.toptext2[index] }}</text>
  52. </view>
  53. <view class="first">
  54. <radio value="radio2" />
  55. <text>{{ option.bottext2[index] }}</text>
  56. </view>
  57. </radio-group>
  58. </view>
  59. </block>
  60. </view>
  61. <!-- 分割线 -->
  62. <view class="fgx"></view>
  63. <!-- 第三部分 -->
  64. <view class="group3">
  65. <block v-for="(item, index) in 7" :key="index">
  66. <view :class="['section__title', 'num'+(14+index)]">
  67. <text>{{ option.title3[index] }}</text>
  68. </view>
  69. <view class="two">
  70. <radio-group
  71. name="radio-group"
  72. @change="onRadioChange"
  73. :data-index="14+index"
  74. >
  75. <view class="first">
  76. <radio value="radio1" />
  77. <text>{{ option.toptext3[index] }}</text>
  78. </view>
  79. <view class="first">
  80. <radio value="radio2" />
  81. <text>{{ option.bottext3[index] }}</text>
  82. </view>
  83. </radio-group>
  84. </view>
  85. </block>
  86. </view>
  87. <!-- 分割线 -->
  88. <view class="fgx"></view>
  89. <!-- 第四部分 -->
  90. <view class="group4">
  91. <block v-for="(item, index) in 7" :key="index">
  92. <view :class="['section__title', 'num'+(21+index)]">
  93. <text>{{ option.title4[index] }}</text>
  94. </view>
  95. <view class="two">
  96. <radio-group
  97. name="radio-group"
  98. @change="onRadioChange"
  99. :data-index="21+index"
  100. >
  101. <view class="first">
  102. <radio value="radio1" />
  103. <text>{{ option.toptext4[index] }}</text>
  104. </view>
  105. <view class="first">
  106. <radio value="radio2" />
  107. <text>{{ option.bottext4[index] }}</text>
  108. </view>
  109. </radio-group>
  110. </view>
  111. </block>
  112. </view>
  113. <!-- 分割线 -->
  114. <view class="fgx"></view>
  115. <!-- 按钮 -->
  116. <view class="btn">
  117. <!-- bindtap 事件是在手指触摸屏幕后立即触发,响应速度更快,适用于交互频繁的场景。-->
  118. <!-- bindclick 事件是在手指触摸屏幕后、手指离开屏幕后 300ms 内触发,响应速度较慢,适用于一些需要判断手势的场景。-->
  119. <button class="btn1" formType="submit">提交</button>
  120. <button class="btn2" formType="reset" @click="MoveToTop">重做</button>
  121. </view>
  122. </form>
  123. </view>
  124. </template>
  125. <script>
  126. const app = getApp();
  127. export default {
  128. components: {},
  129. data() {
  130. return {
  131. appName: app.globalData.$appInfo.appName,
  132. pageContentTop: app.globalData.pageContentTop,
  133. option: {
  134. title: [
  135. "1.你倾向从何处得到力量:",
  136. "2.当你参加一个社交聚会时,你会:",
  137. "3.下列哪一件事听起来比较吸引你?",
  138. "4.在约会中,你通常:",
  139. "5.过去,你遇见你大部分的异性朋友是:",
  140. "6.你倾向拥有:",
  141. "7.过去,你的朋友和同事倾向对你说:",
  142. ],
  143. toptext: [
  144. "别人",
  145. "在夜色很深时,一旦你开始投入,也许就是最晚离开的那一个",
  146. "与情人到有很多人且社交活动频繁的地方",
  147. "整体来说很健谈",
  148. "在宴会中、夜总会、工作上、休闲活动中、会议上或当朋友介绍我给他们的朋友时",
  149. "很多认识的人和很亲密的朋友",
  150. "你难道不可以安静一会儿吗?",
  151. ],
  152. bottext: [
  153. "自己的想法",
  154. "在夜晚刚开始的时候,我就疲倦了并且想回家",
  155. "待在家中与情人做一些特别的事情,例如说观赏一部有趣的录影带并享用你最喜欢的外卖食物",
  156. "较安静并保留,直到你觉得舒服",
  157. "通过私人的方式,例如个人广告、录影约会,或是由亲密的朋友和家人介绍",
  158. "一些很亲密的朋友和一些认识的人",
  159. "可以请你从你的世界中出来一下吗",
  160. ],
  161. title2: [
  162. "8.你倾向通过以下哪种方式收集信息:",
  163. "9.你倾向相信:",
  164. "10.当你置身于一段关系中时,你倾向相信:",
  165. "11.当你对一个约会觉得放心时,你偏向谈论:",
  166. "12.你是这种人:",
  167. "13.你是这类型的人:",
  168. "14.你通常:",
  169. ],
  170. toptext2: [
  171. "你对有可能发生之事的想像和期望",
  172. "你的直觉",
  173. "永远有进步的空间",
  174. "未来,关于改进或发明事物和生活的种种可能性。例如,你也许会谈论一个新的科学发明,或一个更好的方法来表达你的感受",
  175. "喜欢先纵观全局",
  176. "与其活在现实中,不如活在想像里",
  177. "偏向于去想像一大堆关于即将来临的约会的事情",
  178. ],
  179. bottext2: [
  180. "你对目前状况的实际认知",
  181. "你直接的观察和现成的经验",
  182. "若它没有被破坏,不予修补",
  183. "实际的、具体的、关于“此时此地”的事物。例如,你也许会谈论品酒的好方法,或你即将要参加的新奇旅程",
  184. "喜欢先掌握细节",
  185. "与其活在想像里,不如活在现实中",
  186. "偏向于拘谨地想像即将来临的约会,只期待让它自然地发生",
  187. ],
  188. title3: [
  189. "15.你倾向如此做决定:",
  190. "16.你倾向比较能够察觉到:",
  191. "17.当和某人分手时:",
  192. "18.当与一个人交往时,你倾向于看重:",
  193. "19.当你不同意情人的想法时:",
  194. "20.认识你的人倾向形容你为:",
  195. "21.你把大部分和别人的相遇视为:",
  196. ],
  197. toptext3: [
  198. "首先依你的心意,然后依你的逻辑",
  199. "当人们需要情感上的支持时",
  200. "你通常让自己的情绪深陷其中,很难抽身出来",
  201. "情感上的相容性:表达爱意和对另一半的需求很敏感",
  202. "你尽可能地避免伤害对方的感情;若是会对对方造成伤害的话,你就不会说",
  203. "热情和敏感",
  204. "友善及重要的",
  205. ],
  206. bottext3: [
  207. "首先依你的逻辑,然后依你的心意",
  208. "当人们不合逻辑时",
  209. "虽然你觉得受伤,但一旦下定决心,你会直截了当地将过去恋人的影子甩开",
  210. "智慧上的相容性:沟通重要的想法;客观地讨论和辩论事情",
  211. "你通常毫无保留地说话,并且对情人直言不讳,因为对的就是对的",
  212. "逻辑和明确",
  213. "另有目的",
  214. ],
  215. title4: [
  216. "22.若你有时间和金钱,你的朋友邀请你到国外度假,并且在前一天才通知,你会:",
  217. "23.在第一次约会中:",
  218. "24.你偏好:",
  219. "25.你选择的生活充满着:",
  220. "26.哪一项较常见:",
  221. "27.你是这种喜欢……的人:",
  222. "28.你是此类型的人:",
  223. ],
  224. toptext4: [
  225. "必须先检查你的时间表",
  226. "若你所约的人来迟了,你会很不高兴",
  227. "事先知道约会的行程:要去哪里、有谁参加、你会在那里多久、该如何打扮",
  228. "日程表和组织",
  229. "你准时出席而其他人都迟到",
  230. "下定决心并且做出最后肯定的结论",
  231. "喜欢在一段时间里专心于一件事情直到完成",
  232. ],
  233. bottext4: [
  234. "立刻收拾行装",
  235. "一点儿都不在乎,因为你自己常常迟到",
  236. "让约会自然地发生,不做太多事先的计划",
  237. "自然发生和弹性",
  238. "其他人都准时出席而你迟到",
  239. "放宽你的选择面并且持续收集信息",
  240. "享受同时进行好几件事情",
  241. ],
  242. choices: [
  243. null,
  244. null,
  245. null,
  246. null,
  247. null,
  248. null,
  249. null,
  250. null,
  251. null,
  252. null,
  253. null,
  254. null,
  255. null,
  256. null,
  257. null,
  258. null,
  259. null,
  260. null,
  261. null,
  262. null,
  263. null,
  264. null,
  265. null,
  266. null,
  267. null,
  268. null,
  269. null,
  270. null,
  271. ],
  272. },
  273. };
  274. },
  275. onLoad() {
  276. app.handleSetNavTitle();
  277. },
  278. onShow() {},
  279. onPullDownRefresh() {},
  280. onReachBottom() {},
  281. methods: {
  282. onRadioChange(e) {
  283. let index = e.currentTarget.dataset.index;
  284. let value = e.detail.value;
  285. let choices = this.option.choices;
  286. choices[index] = value;
  287. // console.log(choices);
  288. this.option.choices = choices
  289. },
  290. onSubmit(e) {
  291. let choices = this.option.choices;
  292. console.log('choices => ', choices)
  293. for (let i = 0; i < choices.length; i++) {
  294. if (choices[i] === null) {
  295. // 如果有未做完题目,使用 `uni.pageScrollTo` 方法滚动页面到未做完题目所在的位置
  296. uni.showToast({
  297. title: "请完成所有题目",
  298. icon: "none",
  299. duration: 2000,
  300. });
  301. let jump = ".num" + i;
  302. uni.pageScrollTo({
  303. selector: jump,
  304. duration: 300,
  305. /*success: data => {
  306. console.log('scroll success', data);
  307. },
  308. fail: data => {
  309. console.log('scroll fail', data);
  310. },
  311. complete: data => {
  312. console.log('scroll complete', data);
  313. }*/
  314. });
  315. return;
  316. }
  317. }
  318. /* function CountAnswer */
  319. {
  320. let E = 0,
  321. I = 0,
  322. N = 0,
  323. S = 0,
  324. F = 0,
  325. T = 0,
  326. J = 0,
  327. P = 0;
  328. let choices = this.option.choices;
  329. let testResult;
  330. for (let i = 0; i < choices.length; i++) {
  331. if (i < 7) {
  332. if (choices[i] == "radio1") E++;
  333. else I++;
  334. continue;
  335. }
  336. if (i < 14) {
  337. if (choices[i] == "radio1") N++;
  338. else S++;
  339. continue;
  340. }
  341. if (i < 21) {
  342. if (choices[i] == "radio1") F++;
  343. else T++;
  344. continue;
  345. }
  346. if (i < 28) {
  347. if (choices[i] == "radio1") J++;
  348. else P++;
  349. }
  350. }
  351. if (E > I) testResult = "E";
  352. else testResult = "I";
  353. if (N > S) testResult += "N";
  354. else testResult += "S";
  355. if (F > T) testResult += "F";
  356. else testResult += "T";
  357. if (J > P) testResult += "J";
  358. else testResult += "P";
  359. console.log(testResult);
  360. app.globalData.testResult = testResult; // 保存到全局
  361. uni.navigateTo({
  362. url: "/pages/result/result",
  363. });
  364. }
  365. },
  366. onReset() {
  367. this.option.choices = this.option.choices.map(() => null)
  368. },
  369. MoveToTop: function () {
  370. uni.showToast({
  371. title: "重置成功",
  372. icon: "none",
  373. duration: 2000,
  374. });
  375. // 最好是先显示提示后滚动;否则就会先回去之后再提示(感觉那样有些奇怪)
  376. uni.pageScrollTo({
  377. scrollTop: 0, // 回到顶端
  378. duration: 300,
  379. });
  380. },
  381. },
  382. };
  383. </script>
  384. <style lang="scss" scoped>
  385. .page-wrap {
  386. min-height: 100vh;
  387. width: 750rpx;
  388. }
  389. /* pages/career/career.wxss */
  390. /* 跑马灯 */
  391. .box {
  392. width: 750rpx;
  393. margin: 10rpx auto;
  394. background: #feece7;
  395. border-radius: 10rpx;
  396. padding: 10rpx;
  397. box-sizing: border-box;
  398. overflow: hidden;
  399. }
  400. .title {
  401. white-space: nowrap;
  402. animation: 25s loop linear infinite normal;
  403. display: inline-block;
  404. vertical-align: top;
  405. font-size: 26rpx;
  406. color: #ec6e40;
  407. opacity: 0.8;
  408. }
  409. @keyframes loop {
  410. 0% {
  411. transform: translateX(700rpx);
  412. -webkit-transform: translateX(700rpx);
  413. }
  414. 100% {
  415. transform: translateX(-100%);
  416. -webkit-transform: translateX(-100%);
  417. }
  418. }
  419. @-webkit-keyframes loop {
  420. 0% {
  421. transform: translateX(600rpx);
  422. -webkit-transform: translateX(600rpx);
  423. }
  424. 100% {
  425. transform: translateX(-100%);
  426. -webkit-transform: translateX(-100%);
  427. }
  428. }
  429. /* 选择题 */
  430. .section {
  431. background-color: rgb(255, 247, 240);
  432. border-radius: 10rpx;
  433. width: 710rpx;
  434. margin: 10rpx auto;
  435. }
  436. .section .group1,
  437. .group2,
  438. .group3,
  439. .group4 {
  440. /* border: deepskyblue solid 1px; */
  441. width: 660rpx;
  442. margin: 10rpx auto;
  443. padding-top: 20rpx;
  444. }
  445. .section__title {
  446. /* border: rgb(0, 255, 34) solid 1px; */
  447. margin-top: 20rpx;
  448. }
  449. .two {
  450. /* border: rgb(255, 0, 221) solid 1px; */
  451. margin-top: 20rpx;
  452. margin-bottom: 40rpx;
  453. }
  454. radio-group {
  455. margin-left: 10rpx;
  456. }
  457. radio {
  458. transform: scale(0.9);
  459. }
  460. text {
  461. font-size:30rpx;
  462. color: #666666;
  463. margin-top: 2rpx;
  464. }
  465. .section__title text {
  466. color: #f0865e;
  467. font-size: 34rpx;
  468. font-weight: bold;
  469. }
  470. .two .first {
  471. margin: 20rpx 0;
  472. display: flex;
  473. }
  474. /* 分割线 */
  475. .fgx {
  476. border: rgb(224, 224, 224) solid;
  477. margin-top: 30rpx;
  478. }
  479. /* 按钮 */
  480. .btn {
  481. border: rgb(255, 255, 255) solid 2rpx;
  482. background-color: white;
  483. display: flex;
  484. align-items: center;
  485. }
  486. .btn button {
  487. /* border: tomato solid 1px; */
  488. background-color: limegreen;
  489. color: rgb(255, 255, 255);
  490. margin-top: 40rpx;
  491. margin-bottom: 60rpx;
  492. font-size: 28rpx;
  493. height: 80rpx;
  494. line-height: 80rpx;
  495. width: 150rpx;
  496. text-align: center;
  497. }
  498. .btn .btn1 {
  499. margin-right: 20rpx;
  500. }
  501. .btn .btn2 {
  502. background: linear-gradient(90deg, #FF9048 0%, #fd6a68 100%);
  503. margin-left: 40rpx;
  504. }
  505. </style>