| src/api/Patients/index.ts | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/api/login/index.ts | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/layout/navBars/topBar/user.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/router/frontEnd.ts | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/stores/userInfo.ts | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/types/pinia.d.ts | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/types/views.d.ts | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/login/component/account.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/personal/component/editUserInfo.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/personal/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/api/Patients/index.ts
@@ -49,6 +49,16 @@ data: params, }); } export function getUserDetail2(params: string) { return request({ url: '/user/info/detail2', method: 'post', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, data: params, }); } // 保存患者套餐对象 export function updateNurtion(params: Object) { return request({ src/api/login/index.ts
@@ -33,3 +33,29 @@ method: 'post' }) } // 修改用户信息 export function editUserInfo(params:object) { return request({ url: '/user/info/update', method: 'post', data: params }) } export function confirmClient(params: string) { return request({ url: '/user/info/confirmClient', method: 'post', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, data: params, }); } export function getclients(params: object) { return request({ url: '/client/info/list', method: 'post', params, }); } src/layout/navBars/topBar/user.vue
@@ -1,6 +1,22 @@ <template> <div class="layout-navbars-breadcrumb-user pr15" :style="{ flex: layoutUserFlexNum }"> <el-dropdown :show-timeout="70" :hide-timeout="50" trigger="click" @command="onComponentSizeChange"> <el-dropdown :show-timeout="70" :hide-timeout="50" trigger="click"> <div class="layout-navbars-breadcrumb-user-icon"> <span style="font-weight: 800;">{{userInfos.clientName}}</span> <el-icon><Location /></el-icon> </div> <template #dropdown> <el-dropdown-menu> <el-dropdown-item v-for="(client,key) in userInfos.clientInfos" :key="key" @click="clientSet(client)" > <span :style="{color:userInfos.clientName===client.clientName?'#409EFF':''}"> {{client.clientName}} </span> </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> <!-- <el-dropdown :show-timeout="70" :hide-timeout="50" trigger="click" @command="onComponentSizeChange"> <div class="layout-navbars-breadcrumb-user-icon"> <i class="iconfont icon-ziti" :title="$t('message.user.title0')"></i> </div> @@ -11,8 +27,8 @@ <el-dropdown-item command="small" :disabled="state.disabledSize === 'small'">{{ $t('message.user.dropdownSmall') }}</el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> <el-dropdown :show-timeout="70" :hide-timeout="50" trigger="click" @command="onLanguageChange"> </el-dropdown> --> <!-- <el-dropdown :show-timeout="70" :hide-timeout="50" trigger="click" @command="onLanguageChange"> <div class="layout-navbars-breadcrumb-user-icon"> <i class="iconfont" @@ -27,16 +43,16 @@ <el-dropdown-item command="zh-tw" :disabled="state.disabledI18n === 'zh-tw'">繁體中文</el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> <div class="layout-navbars-breadcrumb-user-icon" @click="onSearchClick"> </el-dropdown> --> <!-- <div class="layout-navbars-breadcrumb-user-icon" @click="onSearchClick"> <el-icon :title="$t('message.user.title2')"> <ele-Search /> </el-icon> </div> <div class="layout-navbars-breadcrumb-user-icon" @click="onLayoutSetingClick"> </div> --> <!-- <div class="layout-navbars-breadcrumb-user-icon" @click="onLayoutSetingClick"> <i class="icon-skin iconfont" :title="$t('message.user.title3')"></i> </div> <div class="layout-navbars-breadcrumb-user-icon" ref="userNewsBadgeRef" v-click-outside="onUserNewsClick"> </div> --> <!-- <div class="layout-navbars-breadcrumb-user-icon" ref="userNewsBadgeRef" v-click-outside="onUserNewsClick"> <el-badge :is-dot="true"> <el-icon :title="$t('message.user.title4')"> <ele-Bell /> @@ -54,14 +70,14 @@ :persistent="false" > <UserNews /> </el-popover> <div class="layout-navbars-breadcrumb-user-icon mr10" @click="onScreenfullClick"> </el-popover> --> <!-- <div class="layout-navbars-breadcrumb-user-icon mr10" @click="onScreenfullClick"> <i class="iconfont" :title="state.isScreenfull ? $t('message.user.title6') : $t('message.user.title5')" :class="!state.isScreenfull ? 'icon-fullscreen' : 'icon-tuichuquanping'" ></i> </div> </div> --> <el-dropdown :show-timeout="70" :hide-timeout="50" @command="onHandleCommandClick"> <span class="layout-navbars-breadcrumb-user-link"> <img :src="userInfos.photo" class="layout-navbars-breadcrumb-user-link-photo mr5" /> @@ -73,10 +89,10 @@ <template #dropdown> <el-dropdown-menu> <el-dropdown-item command="/home">{{ $t('message.user.dropdown1') }}</el-dropdown-item> <el-dropdown-item command="wareHouse">{{ $t('message.user.dropdown6') }}</el-dropdown-item> <!-- <el-dropdown-item command="wareHouse">{{ $t('message.user.dropdown6') }}</el-dropdown-item> --> <el-dropdown-item command="/personal">{{ $t('message.user.dropdown2') }}</el-dropdown-item> <el-dropdown-item command="/404">{{ $t('message.user.dropdown3') }}</el-dropdown-item> <el-dropdown-item command="/401">{{ $t('message.user.dropdown4') }}</el-dropdown-item> <!-- <el-dropdown-item command="/404">{{ $t('message.user.dropdown3') }}</el-dropdown-item> --> <!-- <el-dropdown-item command="/401">{{ $t('message.user.dropdown4') }}</el-dropdown-item> --> <el-dropdown-item divided command="logOut">{{ $t('message.user.dropdown5') }}</el-dropdown-item> </el-dropdown-menu> </template> @@ -93,6 +109,8 @@ import { useI18n } from 'vue-i18n'; import { storeToRefs } from 'pinia'; import { useUserInfo } from '/@/stores/userInfo'; import {confirmClient} from '/@/api/login' import { useThemeConfig } from '/@/stores/themeConfig'; import other from '/@/utils/other'; import mittBus from '/@/utils/mitt'; @@ -212,6 +230,14 @@ const initI18nOrSize = (value: string, attr: string) => { (<any>state)[attr] = Local.get('themeConfig')[value]; }; const clientSet=(client:any)=>{ useUserInfo().setUserCilent({code:client.code,clientName:client.clientName}); confirmClient('clientCode='+client.code).then((res)=>{ // 更新token Session.set('token', res.data); window.location.reload(); }) } // 页面加载时 onMounted(() => { if (Local.get('themeConfig')) { @@ -219,6 +245,7 @@ initI18nOrSize('globalI18n', 'disabledI18n'); } }); </script> <style scoped lang="scss"> src/router/frontEnd.ts
@@ -23,6 +23,7 @@ if (window.nextLoading === undefined) NextLoading.start(); // 无 token 停止执行下一步 if (!Session.get('token')) return false; //检查用户是管理员账号可以选择客户登录 // 触发初始化用户信息 pinia // https://gitee.com/lyt-top/vue-next-admin/issues/I5F1HP await useUserInfo(pinia).setUserInfos(); src/stores/userInfo.ts
@@ -17,7 +17,8 @@ roles: [], authBtnList: [], clientCode:'', clientName:'' clientName:'', clientInfos:[], }, }), actions: { @@ -85,13 +86,18 @@ authBtnList: defaultAuthBtnList, clientCode:userRet.currentClientInfo.code, clientName:userRet.currentClientInfo.clientName, clientInfos:userRet.clientInfos }; console.log('-----------------2222------------------------------') console.log(defaultRoles) console.log(userInfos) // Session.set('userInfo', userInfos); resolve(userInfos); }, 0); }); }, async setUserCilent(client:clientInfo){ this.userInfos.clientCode=client.code this.userInfos.clientName=client.clientName } }, }); src/types/pinia.d.ts
@@ -1,6 +1,10 @@ /** * pinia 类型定义 */ declare interface clientInfo { code:string, clientName:string, } // 用户信息 declare interface UserInfos<T = any> { @@ -10,7 +14,8 @@ time: number; userName: string; clientCode:string, clientName:string clientName:string, clientInfos:[] [key: string]: T; } declare interface UserInfosState { src/types/views.d.ts
@@ -17,13 +17,15 @@ newsInfoList: NewInfo[]; recommendList: Recommend[]; personalForm: { id:number, code:string, name: string; email: string; autograph: string; occupation: string; phone: string; sex: string; sex: number; roles:Array; }; isShowDialog:boolean; }; /** src/views/login/component/account.vue
@@ -27,6 +27,11 @@ </template> </el-input> </el-form-item> <el-form-item v-if="state.clients.length>1"> <el-select v-model="state.ruleForm.clientCode" placeholder="请选择登录客户"> <el-option v-for="item in state.clients" :key="item.code" :label="item.clientName" :value="item.code" /> </el-select> </el-form-item> <!-- <el-form-item class="login-animation3"> <el-col :span="15"> <el-input @@ -65,11 +70,10 @@ import { useThemeConfig } from '/@/stores/themeConfig'; import { initFrontEndControlRoutes } from '/@/router/frontEnd'; import { initBackEndControlRoutes } from '/@/router/backEnd'; import { Session } from '/@/utils/storage'; import { Session,Local } from '/@/utils/storage'; import { formatAxis } from '/@/utils/formatTime'; import { NextLoading } from '/@/utils/loading'; import { signIn } from '/@/api/login'; import { error } from 'console'; import { confirmClient, getuserinfo, signIn,getclients } from '/@/api/login'; // 定义变量内容 const { t } = useI18n(); @@ -78,12 +82,15 @@ const route = useRoute(); const router = useRouter(); const state = reactive({ LS_token: '', isShowPassword: false, ruleForm: { userName: 'cycems', password: '123456', code: '1234', clientCode: '', }, clients: [], loading: { signIn: false, }, @@ -95,24 +102,80 @@ }); // 登录 const onSignIn = async () => { try{ state.loading.signIn = true; const signInRes = await signIn(`user_no=${state.ruleForm.userName}&user_password=${state.ruleForm.password}`) if(signInRes.data){ // 存储 token 到浏览器缓存 Session.set('token', signInRes.data); try { // 第二次请求登录获取到了客户 换绑定token if (state.ruleForm.clientCode) { // 重新绑定token const tokenRe= await confirmClient('clientCode='+state.ruleForm.clientCode); // 更新token Session.set('token', tokenRe.data); // 更新客户选择缓存 Local.set('client_'+state.ruleForm.userName,state.ruleForm.clientCode) console.log('更新tokeng重新请求用户信息') // 模拟数据,对接接口时,记得删除多余代码及对应依赖的引入。用于 `/src/stores/userInfo.ts` 中不同用户登录判断(模拟数据) Cookies.set('userName', state.ruleForm.userName); // 前端控制路由,2、请注意执行顺序 const isNoPower = await initFrontEndControlRoutes(); signInSuccess(isNoPower); } else { //第一次登录没有选择到客户 state.loading.signIn = true; const signInRes = await signIn(`user_no=${state.ruleForm.userName}&user_password=${state.ruleForm.password}`); if (signInRes.data) { // 存储 token 到浏览器缓存 Session.set('token', signInRes.data); const userinfoRes = await getuserinfo(); if (userinfoRes?.data?.clientInfos.length > 1) { console.log('多中心管理账号'); console.log(userinfoRes.data); state.clients = userinfoRes?.data?.clientInfos; state.loading.signIn = false; console.log(Local.get('client_'+state.ruleForm.userName)) // 看看有没有缓存客户选择 const lscode=Local.get('client_'+state.ruleForm.userName) if(lscode){ const x=state.clients.findIndex((cl:any)=>{return cl.code===lscode}) if(x>=0){ // 默认选择客户项 state.ruleForm.clientCode=lscode } } ElMessage.success('请选择登录客户再登录') } else if ( userinfoRes?.data?.roles.findIndex((ro: any) => { return ro.roleName === 'admin'; }) >= 0 ) { console.log('管理员登录'); var ps= new Object ({ page: 0, size: 0, wherecondition: '', ordercondition: 'create_time desc' }) getclients(ps).then(re=>{ state.clients = re.data.list; }).finally(()=>{ state.loading.signIn = false; }) } else { console.log('普通登录'); console.log('-----------用token 换用户信息---------------'); // 模拟数据,对接接口时,记得删除多余代码及对应依赖的引入。用于 `/src/stores/userInfo.ts` 中不同用户登录判断(模拟数据) Cookies.set('userName', state.ruleForm.userName); // 前端控制路由,2、请注意执行顺序 const isNoPower = await initFrontEndControlRoutes(); signInSuccess(isNoPower); } } } }catch(err){ console.log(err) state.loading.signIn = false } catch (err) { console.log(err); state.loading.signIn = false; } // 存储 token 到浏览器缓存 // Session.set('token', '999'); src/views/personal/component/editUserInfo.vue
New file @@ -0,0 +1,118 @@ <template> <el-dialog title="密码修改" v-model="isShowDialog" width="400px"> <div class="personal-info"> <el-form :model="form" label-width="120px" :rules="rules" ref="formRef" size="small"> <el-form-item label="新密码:" prop="newUserPassword"> <el-input type="password" show-password v-model="form.newUserPassword" placeholder="输入输入新密码"></el-input> </el-form-item> <el-form-item label="确认密码:" prop="userPassword"> <el-input type="password" show-password v-model="form.userPassword" placeholder="输入输入确认密码"></el-input> </el-form-item> </el-form> </div> <template #footer> <div style="text-align:center"> <el-button type="danger" @click="isShowDialog = false" size="small">取消</el-button> <el-button type="primary" size="small" @click="save">保存</el-button> </div> </template> </el-dialog> </template> <script lang="ts"> import { reactive, toRefs, getCurrentInstance } from 'vue' import { editUserInfo } from '/@/api/login' import { ElMessage, ElMessageBox } from 'element-plus'; import { Session, Local } from '/@/utils/storage'; import { useRouter } from 'vue-router'; export default { name: 'personalInfo', setup() { const {proxy} = getCurrentInstance() as any const router = useRouter(); const state = reactive({ // 是否显示dialog isShowDialog: false, // 表单 form: { id: 0, // 用户名 userNo: '', // 用户姓名 userName: '', // 用户手机号 userMobile: '', newUserPassword:'', // 用户密码 userPassword: '', // 邮箱 userEmail: '' }, // 表单校验 rules: { newUserPassword: { min: 6, max:16,required: true, message: '请输入6-16位密码', trigger: 'blur'}, userPassword: [{ min: 6, max:16,required: true, message: '请输入6-16位密码', trigger: 'blur' }, { validator: (rule, value, callback) => { if (value !== state.form.newUserPassword) callback(new Error('两次密码不一致')) else callback() }, }], } }) // 保存 const save = () => { proxy.$refs['formRef'].validate((valid:boolean) => { if (valid) { const pasm={ id:state.form.id, userPassword:state.form.userPassword } editUserInfo(pasm).then(() => { state.isShowDialog = false ElMessageBox.confirm( '密码修改成功,您需要重新登录吗??', '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', } ) .then(() => { Session.clear(); // 清除缓存/token等 router.push('/login'); }) .catch(() => { }) }) } }) } // 打开dialog const openDialog = (content) => { console.log('打开--') console.log(content) state.form.id = content.id state.form.newUserPassword = '' state.form.userPassword = '' state.isShowDialog = true } return { // 保存 save, ...toRefs(state), // 打开dialog openDialog } } } </script> <style lang="scss" scoped> .personal-info { } </style> src/views/personal/index.vue
@@ -16,25 +16,22 @@ <el-col :span="24"> <el-row> <el-col :xs="24" :sm="8" class="personal-item mb6"> <div class="personal-item-label">昵称:</div> <div class="personal-item-value">小柒</div> <div class="personal-item-label">姓名:</div> <div class="personal-item-value">{{state.personalForm.name}}</div> </el-col> <el-col :xs="24" :sm="16" class="personal-item mb6"> <div class="personal-item-label">身份:</div> <div class="personal-item-value">超级管理</div> <div class="personal-item-value"> <el-tag style="margin-right:20px" type="warning" v-for="item in state.personalForm.roles" :key="item">{{item.roleText}}</el-tag> </div> </el-col> </el-row> </el-col> <el-col :span="24"> <el-row> <el-col :xs="24" :sm="8" class="personal-item mb6"> <div class="personal-item-label">登录IP:</div> <div class="personal-item-value">192.168.1.1</div> </el-col> <el-col :xs="24" :sm="16" class="personal-item mb6"> <div class="personal-item-label">登录时间:</div> <div class="personal-item-value">2021-02-05 18:47:26</div> </el-col> <div v-for="item in userInfos.clientInfos" :key="item.code"> <el-tag style="margin-right:20px" type="primary" >{{item.clientName}}</el-tag> </div> </el-row> </el-col> </el-row> @@ -60,22 +57,7 @@ </el-card> </el-col> <!-- 营销推荐 --> <el-col :span="24"> <el-card shadow="hover" class="mt15" header="营销推荐"> <el-row :gutter="15" class="personal-recommend-row"> <el-col :sm="6" v-for="(v, k) in state.recommendList" :key="k" class="personal-recommend-col"> <div class="personal-recommend" :style="{ 'background-color': v.bg }"> <SvgIcon :name="v.icon" :size="70" :style="{ color: v.iconColor }" /> <div class="personal-recommend-auto"> <div>{{ v.title }}</div> <div class="personal-recommend-msg">{{ v.msg }}</div> </div> </div> </el-col> </el-row> </el-card> </el-col> <!-- 更新信息 --> <el-col :span="24"> @@ -84,27 +66,13 @@ <el-form :model="state.personalForm" size="default" label-width="40px" class="mt35 mb35"> <el-row :gutter="35"> <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20"> <el-form-item label="昵称"> <el-form-item label="姓名"> <el-input v-model="state.personalForm.name" placeholder="请输入昵称" clearable></el-input> </el-form-item> </el-col> <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20"> <el-form-item label="邮箱"> <el-input v-model="state.personalForm.email" placeholder="请输入邮箱" clearable></el-input> </el-form-item> </el-col> <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20"> <el-form-item label="签名"> <el-input v-model="state.personalForm.autograph" placeholder="请输入签名" clearable></el-input> </el-form-item> </el-col> <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20"> <el-form-item label="职业"> <el-select v-model="state.personalForm.occupation" placeholder="请选择职业" clearable class="w100"> <el-option label="计算机 / 互联网 / 通信" value="1"></el-option> <el-option label="生产 / 工艺 / 制造" value="2"></el-option> <el-option label="医疗 / 护理 / 制药" value="3"></el-option> </el-select> </el-form-item> </el-col> <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20"> @@ -115,14 +83,14 @@ <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20"> <el-form-item label="性别"> <el-select v-model="state.personalForm.sex" placeholder="请选择性别" clearable class="w100"> <el-option label="男" value="1"></el-option> <el-option label="女" value="2"></el-option> <el-option label="男" :value="0"></el-option> <el-option label="女" :value="1"></el-option> </el-select> </el-form-item> </el-col> <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24"> <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20"> <el-form-item> <el-button type="primary"> <el-button type="primary" @click="updatePat"> <el-icon> <ele-Position /> </el-icon> @@ -137,75 +105,98 @@ <div class="personal-edit-safe-item"> <div class="personal-edit-safe-item-left"> <div class="personal-edit-safe-item-left-label">账户密码</div> <div class="personal-edit-safe-item-left-value">当前密码强度:强</div> <div class="personal-edit-safe-item-left-value">当前密码强度:一般</div> </div> <div class="personal-edit-safe-item-right"> <el-button text type="primary">立即修改</el-button> <el-button text type="primary" @click="updataPSWD">立即修改</el-button> </div> </div> </div> <div class="personal-edit-safe-box"> <div class="personal-edit-safe-item"> <div class="personal-edit-safe-item-left"> <div class="personal-edit-safe-item-left-label">密保手机</div> <div class="personal-edit-safe-item-left-value">已绑定手机:132****4108</div> </div> <div class="personal-edit-safe-item-right"> <el-button text type="primary">立即修改</el-button> </div> </div> </div> <div class="personal-edit-safe-box"> <div class="personal-edit-safe-item"> <div class="personal-edit-safe-item-left"> <div class="personal-edit-safe-item-left-label">密保问题</div> <div class="personal-edit-safe-item-left-value">已设置密保问题,账号安全大幅度提升</div> </div> <div class="personal-edit-safe-item-right"> <el-button text type="primary">立即设置</el-button> </div> </div> </div> <div class="personal-edit-safe-box"> <div class="personal-edit-safe-item"> <div class="personal-edit-safe-item-left"> <div class="personal-edit-safe-item-left-label">绑定QQ</div> <div class="personal-edit-safe-item-left-value">已绑定QQ:110****566</div> </div> <div class="personal-edit-safe-item-right"> <el-button text type="primary">立即设置</el-button> </div> </div> </div> </el-card> </el-col> </el-row> <editTemplate ref="editTemplateRef"></editTemplate> </div> </template> <script setup lang="ts" name="personal"> import { reactive, computed } from 'vue'; import editTemplate from '/@/views/personal/component/editUserInfo.vue' import { reactive, computed, onMounted, ref } from 'vue'; import { formatAxis } from '/@/utils/formatTime'; import { newsInfoList, recommendList } from './mock'; import { storeToRefs } from 'pinia'; import { useUserInfo } from '/@/stores/userInfo'; import { recommendList } from './mock'; import {getUserDetail2} from '/@/api/Patients' import {editUserInfo} from '/@/api/login' import { ElLoading } from 'element-plus'; const stores = useUserInfo(); const { userInfos } = storeToRefs(stores); // 定义变量内容 const state = reactive<PersonalState>({ newsInfoList, newsInfoList:[], recommendList, personalForm: { id:0, code:'', name: '', email: '', autograph: '', occupation: '', phone: '', sex: '', sex: 0, roles:[] }, isShowDialog:false, }); const editTemplateRef=ref() // 当前时间提示语 const currentTime = computed(() => { return formatAxis(new Date()); }); const updatePat=()=>{ const data={ id: state.personalForm.id, code:state.personalForm.code, userGender: state.personalForm.sex, userName: state.personalForm.name, userMobile: state.personalForm.phone, userEmail:state.personalForm.email } console.log(data) const loading = ElLoading.service({ lock: true, text: 'Loading', background: 'rgba(0, 0, 0, 0.7)', }) editUserInfo(data).then(res=>{ console.log(res.data) }).finally(()=>{ loading.close() getDetail() }) } // 获取当前用户信息 const getDetail = () => { getUserDetail2(`code=${userInfos.value.code}`).then((res) => { state.personalForm.id=res.data.id state.personalForm.code=res.data.code state.personalForm.name = res.data.userName state.personalForm.phone = res.data.userMobile state.personalForm.email = res.data.userEmail state.personalForm.sex = res.data.userGender state.personalForm.roles=res.data.roles console.log(state.personalForm,'0000000') }) } const updataPSWD=()=>{ editTemplateRef.value.openDialog(state.personalForm) } onMounted(()=>{ console.log(userInfos,'00000') getDetail() }) </script> <style scoped lang="scss"> @@ -252,6 +243,7 @@ } .personal-item-value { @include text-ellipsis(1); } } }