partner-apply.vue 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. <template>
  2. <view class="partner-apply">
  3. <!-- 手机号和验证码区域 -->
  4. <u-form :model="form" ref="uForm" :rules="rules" :error-type="['toast']" :label-width="160">
  5. <view class="form-section">
  6. <u-form-item label="新手机号" prop="mobile">
  7. <u-input v-model="form.mobile" placeholder="获取手机号码" />
  8. <u-button slot="right" type="success" size="mini" @click="getMobile" plain>获取手机号</u-button>
  9. </u-form-item>
  10. <u-form-item label="验证码" prop="verifyCode">
  11. <u-input v-model="form.verifyCode" placeholder="请输入验证码" />
  12. <u-button slot="right" type="success" size="mini" @click="getCode" :disabled="counting" plain>
  13. {{ counting ? `${countdown}s后获取` : "获取验证码" }}
  14. </u-button>
  15. </u-form-item>
  16. </view>
  17. <!-- 基本信息区域 -->
  18. <view class="form-section">
  19. <u-form-item label="姓名" prop="name">
  20. <u-input v-model="form.name" placeholder="请输入真实姓名" />
  21. </u-form-item>
  22. <u-form-item label="地址选择" prop="address">
  23. <uni-data-picker v-model="selAddressCodes" :localdata="dataList" placeholder="请选择所在区县"
  24. popup-title="请选择所在区县" @change="cityChange"></uni-data-picker>
  25. </u-form-item>
  26. <u-form-item label="学校" prop="school">
  27. <u-input v-model="form.school" placeholder="请输入学校" />
  28. </u-form-item>
  29. <u-form-item label="院系" prop="faculties">
  30. <u-input v-model="form.faculties" placeholder="请输入院系" />
  31. </u-form-item>
  32. <u-form-item label="专业" prop="specialty">
  33. <u-input v-model="form.specialty" placeholder="请输入专业" />
  34. </u-form-item>
  35. <u-form-item label="年级" prop="grade">
  36. <u-input v-model="form.grade" placeholder="请输入年级" />
  37. </u-form-item>
  38. </view>
  39. </u-form>
  40. <view class="agreement">
  41. <u-checkbox v-model="agreement" shape="circle">
  42. <text>我已阅读并同意</text>
  43. <text class="agreement-link" @click="openAgreement">《书嗨用户协议》</text>
  44. </u-checkbox>
  45. </view>
  46. <view class="fixed-bottom">
  47. <u-button type="primary" color="#38C148" @click="submit">提交</u-button>
  48. </view>
  49. </view>
  50. </template>
  51. <script>
  52. export default {
  53. data() {
  54. return {
  55. form: {
  56. provinceId: '',
  57. cityId: '',
  58. districtId: '',
  59. name: "",
  60. school: "",
  61. faculties: "",
  62. specialty: "",
  63. grade: "",
  64. mobile: "",
  65. verifyCode: "",
  66. },
  67. agreement: false,
  68. counting: false,
  69. countdown: 60,
  70. rules: {
  71. name: [{ required: true, message: "请输入真实姓名" }],
  72. school: [{ required: true, message: "请输入学校" }],
  73. faculties: [{ required: true, message: "请输入院系" }],
  74. specialty: [{ required: true, message: "请输入专业" }],
  75. provinceId: [{ required: true, message: "请选择所在区县" }],
  76. },
  77. // 省市区相关数据
  78. selAddressCodes: [],
  79. dataList: [],
  80. };
  81. },
  82. onLoad() {
  83. // 获取省市区数据
  84. this.getDistrictData();
  85. },
  86. methods: {
  87. // 获取省市区数据
  88. async getDistrictData() {
  89. try {
  90. const res = await uni.$u.http.get('/token/getAllDistrict');
  91. if (res.code == 200) {
  92. this.dataList = res.data;
  93. }
  94. } catch (error) {
  95. uni.$u.toast('获取地区数据失败');
  96. }
  97. },
  98. // 省市区选择回调
  99. cityChange(e) {
  100. let { value } = e.detail;
  101. if (!value.length) return;
  102. this.form.provinceId = value[0].value;
  103. this.form.cityId = value[1].value;
  104. this.form.districtId = value[2].value || '';
  105. },
  106. getMobile() {
  107. // 获取手机号的逻辑
  108. uni.login({
  109. provider: "weixin",
  110. success: async (loginRes) => {
  111. // 这里需要调用获取手机号的相关接口
  112. // 获取成功后设置 form.mobile
  113. },
  114. });
  115. },
  116. async getCode() {
  117. if (!this.form.mobile) {
  118. uni.$u.toast("请先获取手机号");
  119. return;
  120. }
  121. try {
  122. const res = await uni.$u.http.post("/token/applyPartner/getMobileCode", {
  123. mobile: this.form.mobile,
  124. });
  125. if (res.code === 200) {
  126. this.startCountdown();
  127. uni.$u.toast("验证码已发送");
  128. } else {
  129. uni.$u.toast(res.msg);
  130. }
  131. } catch (error) {
  132. uni.$u.toast("获取验证码失败");
  133. }
  134. },
  135. startCountdown() {
  136. this.counting = true;
  137. this.countdown = 60;
  138. const timer = setInterval(() => {
  139. this.countdown--;
  140. if (this.countdown <= 0) {
  141. clearInterval(timer);
  142. this.counting = false;
  143. }
  144. }, 1000);
  145. },
  146. openAgreement() {
  147. // 打开用户协议页面
  148. uni.navigateTo({
  149. url: "/pages/agreement/index",
  150. });
  151. },
  152. async submit() {
  153. if (!this.agreement) {
  154. uni.$u.toast("请先阅读并同意用户协议");
  155. return;
  156. }
  157. try {
  158. this.$refs.uForm.validate(async (valid) => {
  159. if (valid) {
  160. const res = await uni.$u.http.post("/token/applyPartner", this.form);
  161. if (res.code === 200) {
  162. uni.navigateTo({
  163. url: "/pages-mine/pages/partner/partner-status?status=pending",
  164. });
  165. } else {
  166. uni.$u.toast(res.msg);
  167. }
  168. }
  169. });
  170. } catch (error) {
  171. uni.$u.toast("提交失败");
  172. }
  173. },
  174. },
  175. };
  176. </script>
  177. <style lang="scss" scoped>
  178. .partner-apply {
  179. min-height: 100vh;
  180. background-color: #f5f5f5;
  181. padding: 20rpx;
  182. padding-bottom: 120rpx;
  183. .form-section {
  184. background-color: #fff;
  185. margin-bottom: 20rpx;
  186. padding: 0 30rpx;
  187. border-radius: 10rpx;
  188. :deep(.u-form-item) {
  189. .u-form-item--left {
  190. white-space: nowrap;
  191. }
  192. .u-button {
  193. margin-left: 20rpx;
  194. }
  195. }
  196. }
  197. .agreement {
  198. margin: 30rpx;
  199. display: flex;
  200. .agreement-link {
  201. color: #38c148;
  202. }
  203. }
  204. .fixed-bottom {
  205. position: fixed;
  206. left: 0;
  207. right: 0;
  208. bottom: 0;
  209. background-color: #fff;
  210. padding: 20rpx 30rpx;
  211. box-shadow: 0 -2rpx 10rpx rgba(0, 0, 0, 0.05);
  212. padding-bottom: 60rpx;
  213. .u-button {
  214. width: 100%;
  215. height: 80rpx;
  216. display: flex;
  217. align-items: center;
  218. justify-content: center;
  219. }
  220. }
  221. }
  222. </style>