RedeemFormForCertification.vue 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. <template>
  2. <div class="redeem-form">
  3. <div class="paper">
  4. <div class="form-item">
  5. <h3>您的称呼</h3>
  6. <input
  7. v-model="name"
  8. type="text"
  9. autofocus
  10. placeholder="请输入内容,5字以内"
  11. >
  12. </div>
  13. <hr>
  14. <div class="number-info-item">
  15. <div class="key">
  16. 您的积分
  17. </div>
  18. <div class="value">
  19. {{ store.state.score }}
  20. </div>
  21. </div>
  22. <div class="number-info-item">
  23. <div class="key">
  24. 礼品消费
  25. </div>
  26. <div class="value red">
  27. -{{ prizeInfo.score }}
  28. </div>
  29. </div>
  30. <div class="number-info-item">
  31. <div class="key bold">
  32. 剩余
  33. </div>
  34. <div class="value">
  35. {{ result }}
  36. </div>
  37. </div>
  38. </div>
  39. <div class="btn-group">
  40. <button
  41. class="submit"
  42. :class="{
  43. needInfo: !name,
  44. notEnough: result < 0,
  45. over: haveSubmitted,
  46. }"
  47. @click="submit"
  48. >
  49. {{ result >= 0 ? '发起兑换' : '积分不足,无法兑换' }}
  50. </button>
  51. <button
  52. class="return"
  53. @click="$router.go(-1)"
  54. >
  55. 返回
  56. </button>
  57. </div>
  58. <transition name="fade-in-out">
  59. <NotifyComp
  60. v-show="ifShowNotify"
  61. text="提交成功,工作人员会与您及时联系"
  62. />
  63. </transition>
  64. </div>
  65. </template>
  66. <script setup>
  67. import { ref, computed, watch, onMounted } from "vue"
  68. import { useRoute, useRouter } from "vue-router"
  69. import { useStore } from "vuex"
  70. import { redeem, getScore } from '@/api.js'
  71. import NotifyComp from '@/components/NotifyComp.vue'
  72. const route = useRoute()
  73. const router = useRouter()
  74. const store = useStore()
  75. const {
  76. windowSizeInCssForRef,
  77. windowSizeWhenDesignForRef,
  78. } = useSizeAdapt(390, 752)
  79. const prizeInfo = JSON.parse(route.query.prizeInfo)
  80. const result = ref(store.state.score - prizeInfo.score)
  81. const name = ref('')
  82. watch(name, (vNew) => {
  83. if (vNew.length > 5) {
  84. vNew = vNew.slice(0, 5)
  85. name.value = vNew
  86. }
  87. })
  88. const ifShowNotify = ref(false)
  89. const haveSubmitted = ref(false)
  90. function submit() {
  91. redeem('', name.value, '', prizeInfo.id, prizeInfo.score, prizeInfo.name).then((res) => {
  92. haveSubmitted.value = true
  93. getScore().then((res) => {
  94. store.commit('setScore', res.total)
  95. store.commit('setIfScoreLimitReached', res.hasOver)
  96. })
  97. router.replace({
  98. name: 'CertificationView'
  99. })
  100. })
  101. }
  102. </script>
  103. <style lang="less" scoped>
  104. .redeem-form{
  105. position: absolute;
  106. left: 0;
  107. top: 0;
  108. width: 100%;
  109. height: 100%;
  110. background-color: rgba(207, 187, 156, 1);
  111. >.paper{
  112. position: absolute;
  113. width: calc(348 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  114. height: calc(582 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  115. top: calc(24 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  116. left: 50%;
  117. transform: translate(-50%, 0);
  118. background-image: url(@/assets/images/redeem-paper.png);
  119. background-size: contain;
  120. background-repeat: no-repeat;
  121. background-position: center center;
  122. padding-top: calc(25 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  123. padding-left: calc(25 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  124. padding-right: calc(25 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  125. >.form-item{
  126. margin-bottom: calc(410 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  127. >h3{
  128. font-size: calc(16 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  129. font-family: Source Han Sans SC, Source Han Sans SC;
  130. font-weight: bold;
  131. color: #A97C46;
  132. line-height: calc(19 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  133. margin-bottom: calc(10 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  134. }
  135. >input{
  136. font-size: calc(16 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  137. font-family: Source Han Sans SC, Source Han Sans SC;
  138. font-weight: 400;
  139. color: rgba(169, 124, 70, 1);
  140. line-height: calc(19 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  141. width: 100%;
  142. border-bottom: 1px dashed #CFBB9C;
  143. padding-bottom: calc(9 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  144. &::placeholder {
  145. font-size: calc(16 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  146. font-family: Source Han Sans SC, Source Han Sans SC;
  147. font-weight: 400;
  148. color: #B8B8B8;
  149. line-height: calc(19 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  150. }
  151. }
  152. }
  153. >.form-item.last{
  154. margin-bottom: calc(60 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  155. }
  156. >hr{
  157. position: absolute;
  158. top: calc(468 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  159. left: 50%;
  160. transform: translate(-50%, 0);
  161. width: calc(306 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  162. height: 0;
  163. border-top: 1px dashed #CFBB9C;
  164. }
  165. >.number-info-item{
  166. margin-bottom: calc(10 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  167. display: flex;
  168. justify-content: space-between;
  169. align-items: center;
  170. >.key{
  171. font-size: calc(16 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  172. font-family: Source Han Sans SC, Source Han Sans SC;
  173. font-weight: 400;
  174. color: #A97C46;
  175. line-height: calc(19 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  176. }
  177. >.key.bold{
  178. font-size: calc(16 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  179. font-family: Source Han Sans SC, Source Han Sans SC;
  180. font-weight: bold;
  181. color: #A97C46;
  182. line-height: calc(19 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  183. }
  184. >.value{
  185. font-size: calc(16 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  186. font-family: Source Han Sans SC, Source Han Sans SC;
  187. font-weight: bold;
  188. color: #A97C46;
  189. line-height: calc(19 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  190. }
  191. >.value.red{
  192. font-size: calc(16 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  193. font-family: Source Han Sans SC, Source Han Sans SC;
  194. font-weight: bold;
  195. color: #FF4040;
  196. line-height: calc(19 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  197. }
  198. }
  199. }
  200. >.btn-group{
  201. position: absolute;
  202. top: calc(620 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  203. width: 100%;
  204. left: 0;
  205. display: flex;
  206. flex-direction: column;
  207. align-items: center;
  208. >button.submit{
  209. width: calc(348 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  210. height: calc(50 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  211. background-color: #FFE6A5;
  212. border-radius: calc(3 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  213. font-size: calc(16 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  214. font-family: Source Han Sans SC, Source Han Sans SC;
  215. font-weight: bold;
  216. color: #A97C46;
  217. line-height: calc(19 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  218. }
  219. >button.submit.needInfo{
  220. opacity: 0.5;
  221. pointer-events: none;
  222. }
  223. >button.submit.notEnough{
  224. opacity: 1;
  225. color: #7B7B7B;
  226. background: #CECECE;
  227. pointer-events: none;
  228. }
  229. >button.submit.over{
  230. pointer-events: none;
  231. }
  232. >button.return{
  233. margin-top: calc(10 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  234. border: 1px solid #fff;
  235. width: calc(348 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  236. height: calc(50 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  237. border-radius: calc(3 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  238. font-size: calc(16 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  239. font-family: Source Han Sans SC, Source Han Sans SC;
  240. font-weight: bold;
  241. color: #fff;
  242. line-height: calc(19 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  243. }
  244. }
  245. }
  246. </style>