Browse Source

feat: 添加手机号修改功能,包含发送验证码和更新手机号的接口

EvilDragon 3 months ago
parent
commit
689935d3b0

+ 7 - 0
packages/app/src/core/libs/requests.ts

@@ -106,8 +106,15 @@ export const weixinMiniAppLogin = (phoneCode: string, loginCode: string, state:
     loginCode,
     state,
   })
+export const getPhoneCode = (data: { mobile: string; scene: 2 }) =>
+  httpPost<any>('/app-api/member/auth/send-sms-code', data)
 export const testLogin = (data: { mobile: string; password: string }) =>
   httpPost<any>('/app-api/member/auth/login2', data)
+/**
+ * 修改手机号
+ */
+export const updateMobile = (data: { mobile: string; code: string }) =>
+  httpPut('/app-api/member/user/update-mobile', data)
 export const getMemberUserInfo = () => httpGet<any>('/app-api/member/user/get')
 export const updateMemberUserInfo = (data = {}) => httpPut<any>('/app-api/member/user/update', data)
 export const getByDictType = (

+ 14 - 0
packages/app/src/pages.json

@@ -538,6 +538,13 @@
       }
     },
     {
+      "path": "pages/mine/setting/mobile/index",
+      "type": "page",
+      "style": {
+        "navigationBarTitleText": "手机号"
+      }
+    },
+    {
       "path": "pages/home/mall/purchased/success/index",
       "type": "page",
       "style": {
@@ -574,6 +581,13 @@
         "navigationBarTitleText": "",
         "navigationBarBackgroundColor": "#fff"
       }
+    },
+    {
+      "path": "pages/mine/setting/mobile/modify/index",
+      "type": "page",
+      "style": {
+        "navigationBarTitleText": "修改手机号"
+      }
     }
   ],
   "subPackages": []

+ 2 - 1
packages/app/src/pages/mine/setting/index.vue

@@ -182,7 +182,8 @@ onMounted(async () => {
       title="手机号"
       size="sm"
       :end-text="userInfo?.mobile"
-      :end-arrow="false"
+      :end-arrow="true"
+      path="/pages/mine/setting/mobile/index"
     ></SectionHeading>
     <template v-if="isDesigner">
       <SectionHeading title="公司" size="sm" :end-text="userAuthInfo?.employer"></SectionHeading>

+ 31 - 0
packages/app/src/pages/mine/setting/mobile/index.vue

@@ -0,0 +1,31 @@
+<route lang="json">
+{ "style": { "navigationBarTitleText": "手机号" } }
+</route>
+<script setup lang="ts">
+import BottomAppBar from '@/components/bottom-app-bar.vue'
+import { useUserStore } from '../../../../store'
+const userStore = useUserStore()
+const { userInfo } = userStore
+const handleModify = () => {
+  uni.navigateTo({
+    url: '/pages/mine/setting/mobile/modify/index',
+  })
+}
+</script>
+<template>
+  <div class="flex-grow bg-white px-4">
+    <div class="px-3.5">
+      <div
+        class="mt-26.25 text-black/90 text-base font-normal font-['PingFang SC'] leading-[10.18px]"
+      >
+        您已绑定手机号
+      </div>
+      <div class="mt-8.25 text-black/90 text-2xl font-normal font-['PingFang SC'] leading-none">
+        {{ userInfo.mobile?.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2') }}
+      </div>
+    </div>
+    <BottomAppBar fixed :border="false">
+      <wd-button block :round="false" @click="handleModify">去更换</wd-button>
+    </BottomAppBar>
+  </div>
+</template>

+ 101 - 0
packages/app/src/pages/mine/setting/mobile/modify/index.vue

@@ -0,0 +1,101 @@
+<route lang="json">
+{ "style": { "navigationBarTitleText": "修改手机号" } }
+</route>
+<script setup lang="ts">
+import BottomAppBar from '@/components/bottom-app-bar.vue'
+import { useUserStore } from '../../../../../store'
+import { requestToast } from '../../../../../core/utils/common'
+import { getPhoneCode, updateMobile } from '../../../../../core/libs/requests'
+import { useRouter } from '../../../../../core/utils/router'
+const userStore = useUserStore()
+const { reset } = userStore
+const router = useRouter()
+const formData = ref<{ mobile?: string; code?: string }>({})
+const disabled = computed(() => !formData.value.mobile || !formData.value.code)
+const sendCodeDisabled = computed(() => !formData.value.mobile && timer.value === 0)
+const timer = ref(0)
+const interval = ref()
+const handleSendCode = async () => {
+  const { code } = await requestToast(
+    () => getPhoneCode({ mobile: formData.value.mobile, scene: 2 }),
+    {
+      success: true,
+      successTitle: '验证码已发送',
+    },
+  )
+  if (code !== 0) return
+  if (timer.value > 0) {
+    return
+  }
+  timer.value = 60
+  interval.value = setInterval(() => {
+    timer.value--
+    if (timer.value === 0) {
+      clearInterval(interval.value)
+    }
+  }, 1000)
+}
+const handleSubmit = async () => {
+  const { code } = await requestToast(
+    () => updateMobile({ mobile: formData.value.mobile, code: formData.value.code }),
+    {
+      success: true,
+      successTitle: '修改成功',
+    },
+  )
+  if (code === 0) {
+    reset()
+    router.replace('/pages/login/index')
+  }
+}
+</script>
+<template>
+  <div class="flex-grow bg-white px-4">
+    <div class="form-item mt-18">
+      <div class="w-12 text-black/90 text-base font-normal font-['PingFang_SC'] leading-relaxed">
+        +86
+      </div>
+      <wd-input
+        v-model="formData.mobile"
+        type="number"
+        no-border
+        placeholder="请输入手机号"
+        class="flex-grow"
+      ></wd-input>
+    </div>
+    <div class="form-item">
+      <div class="w-12 text-black/90 text-base font-normal font-['PingFang SC'] leading-relaxed">
+        验证码
+      </div>
+      <wd-input
+        v-model="formData.code"
+        type="number"
+        no-border
+        placeholder="请输入验证码"
+        class="flex-grow"
+      ></wd-input>
+      <!-- <div class="text-[#3f598f] text-sm font-normal font-['PingFang SC'] leading-relaxed">
+        获取验证码
+      </div> -->
+      <wd-button
+        block
+        type="text"
+        :round="false"
+        :disabled="sendCodeDisabled"
+        class="text-[#3f598f]!"
+        @click="handleSendCode"
+      >
+        {{ timer === 0 ? '获取验证码' : `${timer}s` }}
+        <!-- {{ timer }} -->
+      </wd-button>
+    </div>
+    <BottomAppBar fixed :border="false">
+      <wd-button block :round="false" :disabled="disabled" @click="handleSubmit">确定</wd-button>
+    </BottomAppBar>
+  </div>
+</template>
+<style lang="scss">
+.form-item {
+  @apply flex items-center py-4 gap-8 border-b b-b-solid b-b-[#f4f4f4];
+}
+</style>

+ 3 - 1
packages/app/src/types/uni-pages.d.ts

@@ -61,11 +61,13 @@ interface NavigateToOptions {
        "/pages/mine/orders/code/index" |
        "/pages/mine/orders/detail/index" |
        "/pages/mine/scan/result/index" |
+       "/pages/mine/setting/mobile/index" |
        "/pages/home/mall/purchased/success/index" |
        "/pages/home/spread/case-shooting/photographer/index" |
        "/pages/mine/authentication/submit/success/index" |
        "/pages/mine/homepage/consult/success/index" |
-       "/pages/mine/scan/pay/success/index";
+       "/pages/mine/scan/pay/success/index" |
+       "/pages/mine/setting/mobile/modify/index";
 }
 interface RedirectToOptions extends NavigateToOptions {}