风险测评小程序前端代码仓库
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.

246 lines
5.3 KiB

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