Kaynağa Gözat

feat: 添加开发登录页面,更新用户基本信息接口,优化用户设置页面

EvilDragon 3 ay önce
ebeveyn
işleme
6e0a7409d0

+ 1 - 0
packages/app/pages.config.ts

@@ -49,6 +49,7 @@ export default defineUniPages({
     list: [
       { name: '设计游学', path: 'pages/index/study-tour/index' },
       { name: '登录', path: 'pages/login/index' },
+      { name: '开发登录', path: 'pages/login/index', query: 'type=test' },
       { name: '我的', path: 'pages/mine/index' },
       { name: '设计师认证', path: 'pages/mine/authentication/index' },
       { name: '设计师认证提交成功', path: 'pages/mine/authentication/submit/success/index' },

+ 1 - 0
packages/app/src/components/data-form.ts

@@ -5,6 +5,7 @@ export interface DataFormProps {
   columns?: { label: string; value: string }[]
   disabled?: boolean
   'onUpdate:modelValue'?: (value: string) => void
+  type?: 'nickname'
 }
 export interface DataFormSchema {
   [key: symbol | string]: {

+ 8 - 11
packages/app/src/components/form-message-box.vue

@@ -1,6 +1,10 @@
 <script setup lang="ts">
 import { DataFormSchema } from './data-form'
 import DataForm from './data-form.vue'
+const modelValue = defineModel({
+  type: Object,
+  default: () => ({}),
+})
 withDefaults(defineProps<{ selector?: string; schema?: DataFormSchema }>(), {
   selector: 'wd-message-box-slot',
   schema: () => ({ test: { type: 'TextField', label: 'Test' } }),
@@ -8,16 +12,9 @@ withDefaults(defineProps<{ selector?: string; schema?: DataFormSchema }>(), {
 </script>
 <template>
   <wd-message-box :selector="selector">
-    <!-- <wd-rate custom-class="custom-rate-class" v-model="rate" /> -->
-    <DataForm :schema="schema"></DataForm>
-    <wd-config-provider :themeVars="{ textareaBg: 'transparent', textareaCellHeight: '100rpx' }">
-      <!-- <wd-textarea
-        custom-class="bg-[#f6f6f6]! rounded-lg border border-solid border-[#9f9f9f]/20"
-        v-model=""
-        line="2"
-        height="100rpx"
-        placeholder="请输入驳回原因"
-      /> -->
-    </wd-config-provider>
+    <DataForm v-model="modelValue" :schema="schema"></DataForm>
+    <wd-config-provider
+      :themeVars="{ textareaBg: 'transparent', textareaCellHeight: '100rpx' }"
+    ></wd-config-provider>
   </wd-message-box>
 </template>

+ 26 - 0
packages/app/src/core/libs/models.ts

@@ -505,6 +505,32 @@ export interface PointsOrder {
    */
   gainType?: number
 }
+export interface UserBasicInfo {
+  id: number
+  userId: number
+  avatar: string
+  name: string
+  sex: number
+  birthday: string
+  mobile: string
+  referrer: string
+  brokerName: string
+  employer: string
+  companyAddress: string
+  idCardNumber: string
+  passportNumber: string
+  householdAddress: string
+  cooperationTime: string
+  joinTime: string
+  circle: string
+  hobbies: string
+  sharingIntent: number
+  createTime: string
+  imageNumber: number
+  imageUrl: string
+  maritalStatus: number
+  maritalStatusStr: string
+}
 export interface UserAuthInfo {
   id: number
   designerName: string

+ 11 - 1
packages/app/src/core/libs/requests.ts

@@ -21,9 +21,9 @@ import {
   MyStudyTour,
   Badge,
   Certificate,
+  UserBasicInfo,
 } from './models'
 import dayjs from 'dayjs'
-import { pointsCancel } from '../../../../merchant/node_modules/@designer-hub/app/src/core/libs/requests'
 
 export const getUserInfo = () =>
   httpGetMock<any>({
@@ -140,6 +140,16 @@ export const createUserAuthInfo = (
   }>,
 ) => httpPost<any>('/app-api/member/user-auth-info/create', data)
 /**
+ * 获取设计师基本信息
+ */
+export const getUserBasicInfo = () =>
+  httpGet<UserBasicInfo>('/app-api/member/stylist-basic-info/get')
+/**
+ * 更新设计师基本信息
+ */
+export const updateUserBasicInfo = (data: Partial<UserBasicInfo>) =>
+  httpPut('/app-api/member/stylist-basic-info/update', data)
+/**
  * 获取设计师审核信息
  */
 export const getUserAuthInfo = () => httpGet<UserAuthInfo>('/app-api/member/user-auth-info/get')

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

@@ -50,6 +50,11 @@
         "path": "pages/login/index"
       },
       {
+        "name": "开发登录",
+        "path": "pages/login/index",
+        "query": "type=test"
+      },
+      {
         "name": "我的",
         "path": "pages/mine/index"
       },

+ 126 - 15
packages/app/src/pages/mine/setting/index.vue

@@ -5,15 +5,27 @@
 import SectionHeading from '@/components/section-heading.vue'
 import { useUserStore } from '../../../store'
 import { storeToRefs } from 'pinia'
-import { updateMemberUserInfo } from '../../../core/libs/requests'
+import {
+  getUserAuthInfo,
+  updateMemberUserInfo,
+  getUserBasicInfo,
+  updateUserBasicInfo,
+} from '../../../core/libs/requests'
 import { NetImages } from '../../../core/libs/net-images'
-import ButtonEvo from '@/components/button-evo.vue'
-import TiltedButton from '@/components/tilted-button.vue'
-import ImgBtnEvo from '@/components/img-btn-evo.vue'
+import FormMessageBox from '@/components/form-message-box.vue'
+import { useMessage } from 'wot-design-uni'
+import { requestToast } from '../../../core/utils/common'
+import { DataFormSchema } from '../../../components/data-form'
 
 const userStore = useUserStore()
-const { userInfo } = storeToRefs(userStore)
+const { userInfo, isDesigner } = storeToRefs(userStore)
 const { setUserInfo } = userStore
+const { confirm } = useMessage('nickname')
+const formData = ref<any>({})
+const schema = ref<DataFormSchema>()
+const birthday = ref<string>('')
+const { data: userAuthInfo, run: setUserAuthInfo } = useRequest(() => getUserAuthInfo(), {})
+const { data: userBasicInfo, run: setUserBasicInfo } = useRequest(() => getUserBasicInfo(), {})
 const handleChooseAvatar = async ({ detail: { avatarUrl } }) => {
   const { data } = await uni.uploadFile({
     url: '/app-api/infra/file/upload',
@@ -47,12 +59,83 @@ const handleLogout = () => {
     url: '/pages/home/index',
   })
 }
+const handleSetNickname = async () => {
+  if (isDesigner.value) {
+    return false
+  }
+  formData.value = {
+    nickname: userInfo.value.nickname,
+  }
+  schema.value = { nickname: { type: 'TextField', label: '姓名', props: { type: 'nickname' } } }
+  confirm({
+    title: '修改姓名',
+    beforeConfirm: async ({ resolve }) => {
+      const { code } = await requestToast(() => updateMemberUserInfo(formData.value), {
+        success: true,
+        successTitle: '修改成功',
+      })
+      if (code === 0) {
+        setUserInfo({
+          ...userInfo.value,
+          nickname: formData.value?.nickname,
+        })
+        resolve(true)
+        formData.value = {}
+      }
+      resolve(false)
+    },
+  })
+}
+const handleSetSex = async () => {
+  formData.value = {
+    sex: userInfo.value.sex.toString(),
+  }
+  schema.value = {
+    sex: {
+      type: 'Radio',
+      label: '性别',
+      props: {
+        columns: [
+          { label: '男', value: '0' },
+          { label: '女', value: '1' },
+        ],
+      },
+    },
+  }
+  confirm({
+    title: '修改性别',
+    beforeConfirm: async ({ resolve }) => {
+      const res = await Promise.all([
+        updateMemberUserInfo(formData.value),
+        // updateUserBasicInfo({ ...formData.value, userId: userInfo.value.userId }),
+      ])
+      console.log(res)
+      setUserInfo({
+        ...userInfo.value,
+        sex: formData.value.sex,
+      })
+      resolve(true)
+      formData.value = {}
+      uni.showToast({
+        title: '修改成功',
+        icon: 'none',
+        mask: true,
+      })
+    },
+  })
+}
+onMounted(async () => {
+  await setUserAuthInfo()
+  if (isDesigner.value) {
+    await Promise.all([setUserBasicInfo()])
+  }
+})
 </script>
 <template>
   <div class="flex-grow bg-white flex flex-col p-4.5 gap-8">
     <div class="flex flex-col items-center">
       <button
-        class="p-0 leading-0 bg-transparent"
+        class="p-0 leading-0 bg-transparent after:b-none"
         open-type="chooseAvatar"
         @chooseavatar="handleChooseAvatar"
       >
@@ -68,23 +151,51 @@ const handleLogout = () => {
         更换头像
       </div>
     </div>
-    <button class="w-full p-0 leading-0 bg-transparent hover:bg-transparent" open-type="choose">
+    <button
+      class="w-full p-0 leading-0 bg-transparent hover:bg-transparent after:b-none"
+      @click="handleSetNickname"
+    >
       <SectionHeading
         title="姓名"
         size="sm"
         :end-text="userInfo.nickname"
-        end-arrow
+        :end-arrow="!isDesigner"
       ></SectionHeading>
     </button>
-    <SectionHeading title="性别" size="sm" end-text="设置" end-arrow></SectionHeading>
-    <SectionHeading title="生日" size="sm" end-text="设置" end-arrow></SectionHeading>
-
-    <SectionHeading title="手机号" size="sm" :end-text="''" end-arrow></SectionHeading>
-    <SectionHeading title="公司" size="sm"></SectionHeading>
-    <SectionHeading title="推荐人" size="sm"></SectionHeading>
-    <SectionHeading title="经纪人" size="sm"></SectionHeading>
+    <template v-if="isDesigner">
+      <SectionHeading
+        title="性别"
+        size="sm"
+        end-text="设置"
+        end-arrow
+        @click="handleSetSex"
+      ></SectionHeading>
+      <!-- <div class="relative">
+        <SectionHeading title="生日" size="sm" end-text="设置" end-arrow></SectionHeading>
+      </div> -->
+      <!-- <wd-datetime-picker-view type="date" v-model="formData" label="年月日" /> -->
+      <!-- <div class="absolute left-0 top-0 w-full h-full opacity-" style="visibility: hidden">
+          <wd-datetime-picker type="date" v-model="birthday" custom-class=""></wd-datetime-picker>
+        </div> -->
+    </template>
+    <SectionHeading
+      title="手机号"
+      size="sm"
+      :end-text="userInfo?.mobile"
+      :end-arrow="false"
+    ></SectionHeading>
+    <template v-if="isDesigner">
+      <SectionHeading title="公司" size="sm" :end-text="userAuthInfo?.employer"></SectionHeading>
+      <SectionHeading title="推荐人" size="sm" :end-text="userAuthInfo?.referrer"></SectionHeading>
+      <SectionHeading
+        title="经纪人"
+        size="sm"
+        :end-text="userBasicInfo?.brokerName"
+      ></SectionHeading>
+    </template>
     <div class="flex-1"></div>
     <div><wd-button block :round="false" @click="handleLogout">退出登录</wd-button></div>
+    <FormMessageBox v-model="formData" selector="nickname" :schema="schema"></FormMessageBox>
   </div>
 </template>
 <style lang="scss">