风险测评小程序前端代码仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

261 lines
5.7 KiB

  1. <template>
  2. <view class="page__view">
  3. <navbar title="意见反馈" leftClick @leftClick="$utils.navigateBack" bgColor="transparent" />
  4. <image class="bg" :src="configList.feedback_bg" mode="widthFix"></image>
  5. <!-- <view class="bg">
  6. <view class="title">Hello</view>
  7. <view class="desc">有什么好的建议可以告诉我们哦</view>
  8. </view> -->
  9. <view class="main">
  10. <view class="form">
  11. <uv-form
  12. ref="form"
  13. :model="form"
  14. :rules="rules"
  15. errorType="toast"
  16. >
  17. <view class="form-item">
  18. <uv-form-item prop="content" :customStyle="formItemStyle">
  19. <view class="card feedback">
  20. <view class="feedback-header">
  21. <view class="feedback-header-content">
  22. <view>反馈内容</view>
  23. <view class="feedback-icon">
  24. <image class="icon" src="@/pages_order/static/feedback/icon-star.png" mode="widthFix"></image>
  25. </view>
  26. </view>
  27. </view>
  28. <view>
  29. <formTextarea v-model="form.content" placeholder="请填写10个字以上的内容,以便我们为您提供更好的服务"></formTextarea>
  30. </view>
  31. <view>
  32. <formUpload v-model="form.images"></formUpload>
  33. </view>
  34. </view>
  35. </uv-form-item>
  36. </view>
  37. <view class="form-item">
  38. <uv-form-item prop="phone" :customStyle="formItemStyle">
  39. <view class="flex card phone">
  40. <view class="label">联系电话</view>
  41. <input
  42. v-model="form.phone"
  43. placeholder-style="color: #999999; font-size: 28rpx;"
  44. placeholder="请输入手机号"
  45. />
  46. </view>
  47. </uv-form-item>
  48. </view>
  49. </uv-form>
  50. </view>
  51. </view>
  52. <view class="bottom">
  53. <button class="btn" @click="onSubmit">提交</button>
  54. </view>
  55. </view>
  56. </template>
  57. <script>
  58. import util from '@/utils/utils.js'
  59. import formTextarea from '@/pages_order/components/formTextarea.vue'
  60. import formUpload from '@/pages_order/components/formUpload.vue'
  61. export default {
  62. components: {
  63. formTextarea,
  64. formUpload,
  65. },
  66. data() {
  67. return {
  68. form: {
  69. content: null,
  70. images: [],
  71. phone: null,
  72. },
  73. rules: {
  74. 'content': {
  75. type: 'string',
  76. required: true,
  77. message: '请填写10个字以上的内容,以便我们为您提供更好的服务',
  78. },
  79. 'phone': {
  80. type: 'string',
  81. required: true,
  82. message: '请输入正确的手机号',
  83. validator: (rule, value, callback) => {
  84. return util.verificationPhone(value)
  85. },
  86. },
  87. },
  88. formItemStyle: { padding: 0 },
  89. }
  90. },
  91. onReady() {
  92. this.$refs.form.setRules(this.rules);
  93. },
  94. methods: {
  95. async onSubmit() {
  96. try {
  97. await this.$refs.form.validate()
  98. const {
  99. content,
  100. images,
  101. phone,
  102. } = this.form
  103. const params = {
  104. content,
  105. image: images.join(','),
  106. phone,
  107. }
  108. await this.$fetch('addFeedback', params)
  109. uni.showToast({
  110. title: '提交成功',
  111. icon: 'none'
  112. })
  113. setTimeout(uni.navigateBack, 1000, -1)
  114. } catch (err) {
  115. }
  116. },
  117. },
  118. }
  119. </script>
  120. <style scoped lang="scss">
  121. .page__view {
  122. background: #F5F5F5;
  123. /deep/ .nav-bar__view {
  124. position: fixed;
  125. top: 0;
  126. left: 0;
  127. }
  128. }
  129. .bg {
  130. width: 100%;
  131. height: auto;
  132. min-height: 501rpx;
  133. // height: 501rpx;
  134. // padding-top: 203rpx;
  135. // box-sizing: border-box;
  136. // color: #FFFFFF;
  137. // background: linear-gradient(164deg, #014FA2 30%, #4C8FD6);
  138. // .title {
  139. // padding: 0 73rpx;
  140. // font-size: 64rpx;
  141. // font-weight: 600;
  142. // }
  143. // .desc {
  144. // margin-top: 18rpx;
  145. // padding: 0 68rpx;
  146. // box-sizing: border-box;
  147. // font-size: 28rpx;
  148. // }
  149. }
  150. .main {
  151. width: 100%;
  152. padding: 0 28rpx 200rpx 28rpx;
  153. box-sizing: border-box;
  154. background: #F5F5F5;
  155. }
  156. .form {
  157. // transform: translateY(-98rpx);
  158. transform: translateY(-46rpx);
  159. &-item {
  160. & + & {
  161. margin-top: 36rpx;
  162. }
  163. }
  164. }
  165. .card {
  166. position: relative;
  167. background: #FFFFFF;
  168. border-radius: 15rpx;
  169. }
  170. .feedback {
  171. padding: 43rpx 31rpx;
  172. }
  173. .feedback-header {
  174. position: absolute;
  175. top: 0;
  176. left: 12rpx;
  177. transform: translateY(-100%);
  178. // margin-left: 12rpx;
  179. &-content {
  180. position: relative;
  181. padding: 9rpx 20rpx 3rpx 20rpx;
  182. font-size: 28rpx;
  183. font-weight: 600;
  184. color: #FFFFFF;
  185. border-top-left-radius: 30rpx;
  186. background: linear-gradient(to right, #014FA2, #6A9ACE);
  187. }
  188. }
  189. .feedback-icon {
  190. position: absolute;
  191. top: 0;
  192. right: 0;
  193. transform: translate(30rpx, -10rpx);
  194. .icon {
  195. width: 26rpx;
  196. height: auto;
  197. }
  198. }
  199. .phone {
  200. justify-content: flex-start;
  201. padding: 44rpx 27rpx;
  202. column-gap: 31rpx;
  203. .label {
  204. font-size: 28rpx;
  205. color: #000000;
  206. }
  207. }
  208. .bottom {
  209. position: fixed;
  210. left: 0;
  211. bottom: 0;
  212. width: 100vw;
  213. padding: 0 35rpx 56rpx 35rpx;
  214. padding-bottom: calc(env(safe-area-inset-bottom) + 35rpx);
  215. box-sizing: border-box;
  216. .btn {
  217. width: 100%;
  218. padding: 29rpx 0;
  219. box-sizing: border-box;
  220. font-size: 30rpx;
  221. color: #FFFFFF;
  222. background: #014FA2;
  223. border-radius: 50rpx;
  224. }
  225. }
  226. </style>