PAMapp/assets/ts/api/consultant.ts | ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程 | |
PAMapp/assets/ts/models/account.model.ts | ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程 | |
PAMapp/components/BackActionBar.vue | ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程 | |
PAMapp/components/Consultant-ques.vue | ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程 | |
PAMapp/components/NavBar.vue | ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程 | |
PAMapp/pages/accountSetting/index.vue | ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程 | |
PAMapp/pages/questionnaire/_agentNo.vue | ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程 | |
PAMapp/pages/recommendConsultant/index.vue | ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程 |
PAMapp/assets/ts/api/consultant.ts
@@ -3,6 +3,7 @@ import { AppointmentDetail } from '../models/AppointmentDetail'; import { ConsultantLoginInfo } from '../models/ConsultantLoginInfo'; import _ from 'lodash'; import { UserSetting } from '../models/account.model'; // 顧客ç»å ¥(TODO: OTPèªèéç¼å æ«æä½¿ç¨) export function login(user: any) { @@ -105,6 +106,23 @@ } return service.get('/appointment/getDetail/'+apointmentId, {headers}) } //åå¾ä½¿ç¨è 帳èè³è¨ export function getUserAccountSetting() : Promise<UserSetting> { const headers = { Authorization: 'Bearer ' + localStorage.getItem('id_token') } return service.get<UserSetting>('/customer/info', {headers}).then(res => res.data); } //æ´æ°ä½¿ç¨è 帳èè³è¨ export function updateAccountSetting(params: any) : any { const headers = { Authorization: 'Bearer ' + localStorage.getItem('id_token') } return service.put('/customer/info', params ,{headers}).then(res => res.data); } export interface Consultants { agentNo : string, name : string, PAMapp/assets/ts/models/account.model.ts
¤ñ¹ï·sÀÉ®× @@ -0,0 +1,5 @@ export interface UserSetting { name: string; phone?: string; email?: string; } PAMapp/components/BackActionBar.vue
@@ -41,6 +41,19 @@ break; case 'questionnaire': featureLabel = 'é²è¡é ç´'; break; case 'notification': featureLabel = 'éç¥'; break; case 'record': featureLabel = 'æ¥çç´é'; break; case 'accountSetting': featureLabel = 'å人帳èè¨å®'; break; case 'consultantAccountSetting': featureLabel = 'æ¥ç帳èè³è¨'; break; } return featureLabel; } else { PAMapp/components/Consultant-ques.vue
@@ -57,7 +57,7 @@ selected:false }, { name:'é²ç«ä¿å®ç¸é', name:'åç´ ä¿å®', selected:false } ]; PAMapp/components/NavBar.vue
@@ -57,13 +57,18 @@ title: 'å人帳èè¨å®', }, { authorityOfRoleList: [Role.ADMIN], routeUrl: '/notFinish', authorityOfRoleList:[Role.ADMIN], routeUrl: '/consultantAccountSetting', title: 'æ¥ç帳èè³è¨', }, { authorityOfRoleList: [Role.USER, Role.ADMIN], routeUrl: '/record/contactRecord', authorityOfRoleList:[Role.ADMIN], routeUrl: '/record', title: 'æ¥çç´é', }, { authorityOfRoleList: [Role.USER], routeUrl: '/userReviewsRecord', title: 'æ¥çç´é', }, { PAMapp/pages/accountSetting/index.vue
@@ -1,13 +1,315 @@ <template> <div>å人帳èè¨å®</div> <div class="account-page"> <div class="account-page-title">å人帳èè¨å®</div> <section class="account-card" :class="{'edit': !userNameDisabled }"> <div class="header"> <div class="block"> <div class="setting-title">å§å</div> <div class="contact-type"> <input :disabled="userNameDisabled" v-model="userNameValue" ref="userName" class="input name-input" > <div class="error-txt"> <span v-show="!nameValid" class="error">æ¤æ¬ä½å¿ å¡«</span> </div> </div> </div> <i class="icon-edit icon" @click="editField('userName')" :class="{'icon-color-change': !userNameDisabled}"></i> </div> </section> <section class="account-card" :class="{'edit': !userPhoneDisabled }"> <div class="header"> <div class="block"> <div class="setting-title">ç¶å®</div> <div class="contact-type"> ææ©è碼 <input :disabled="userPhoneDisabled" v-model="phoneValue" :class="{ 'is-invalid': !phoneValid }" ref="userPhone" class="contact-input input" :placeholder="phoneValue || 'å°æªæä¾ææ©è碼'" > <div class="error-txt"> <span v-show="!phoneValid" class="error">ææ©èç¢¼æ ¼å¼æèª¤</span> </div> </div> </div> <i class="icon-edit icon" @click="editField('userPhone')" :class="{'icon-color-change': !userPhoneDisabled}"></i> </div> </section> <section class="account-card" :class="{'edit': !userEmailDisabled }"> <div class="header"> <div class="block"> <div class="setting-title">ç¶å®</div> <div class="contact-type">Email <input :disabled="userEmailDisabled" v-model="emailValue" :class="{ 'is-invalid': !emailValid }" ref="userEmail" class="contact-input input" :placeholder="emailValue || 'å°æªæä¾ Email'" > <div class="error-txt"> <span v-show="!emailValid" class="error">ä¿¡ç®±æ ¼å¼æèª¤</span> </div> </div> </div> <i class="icon-edit icon" @click="editField('userEmail')" :class="{'icon-color-change': !userEmailDisabled}"></i> </div> </section> <div class="account-setting-btn mb-30"> <el-button :disabled="isSubmitBtnDisabled" @click.native="updateAccountSetting">éåº</el-button> </div> </div> </template> <script> export default { <script lang="ts"> import { Vue,Component } from 'vue-property-decorator' import { getUserAccountSetting, updateAccountSetting } from '~/assets/ts/api/consultant'; import { UserSetting } from '~/assets/ts/models/account.model'; @Component export default class AccountSetting extends Vue { _userSetting!: UserSetting; userNameDisabled = true; userPhoneDisabled = true; userEmailDisabled = true ; userNameValue = ''; phoneValue = '' ; emailValue = '' ; onEditMode = false; formValidStatus = { name: true, phone: true, email: true, }; get nameValid(): boolean { this.formValidStatus.name = this.userNameValue ? true : false; return this.formValidStatus.name; } get phoneValid(): boolean { const rule = /^09[0-9]{8}$/; this.formValidStatus.phone = this.phoneValue ? rule.test(this.phoneValue) : true; return this.formValidStatus.phone; } get emailValid(): boolean { const rule = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/; this.formValidStatus.email = this.emailValue ? rule.test(this.emailValue) : true;; return this.formValidStatus.email; } editField(fieldName: string): void { this.onEditMode = true; const enablePromise = new Promise((resolve, reject) => { // æ¤çºpromiseèªæ³ resolve((this as any)[`${fieldName}Disabled`] = false); }); const targetInput = this.$refs[fieldName] as any; enablePromise.then((_) => { targetInput.focus(); }); } get isSubmitBtnDisabled(): boolean { const isFormValid = this.formValidStatus.name && this.formValidStatus.phone && this.formValidStatus.email; return !isFormValid || !this.onEditMode || (!this.phoneValue && !this.emailValue); } updateAccountSetting(): void { // const dataChanged = (): boolean => { // return this._userSetting.name !== this.userNameValue // || this._userSetting.phone !== this.phoneValue // || this._userSetting.email !== this.emailValue; // }; // if (dataChanged) { // } if (!this.onEditMode) return; const editSettingInfo: UserSetting = { name: this.userNameValue, phone: this.phoneValue, email: this.emailValue } updateAccountSetting(editSettingInfo).then((res: any) => { console.log('updateRes:', res); this.resetSettingForm(); }); } private resetSettingForm(): void { this.onEditMode = false; this.userNameDisabled = true; this.userPhoneDisabled = true; this.userEmailDisabled = true ; } mounted(){ getUserAccountSetting().then((userInfo: UserSetting)=>{ this._userSetting = { name: userInfo.name || '', phone: userInfo.phone || '', email: userInfo.email || '', }; this.phoneValue = this._userSetting.phone!; this.userNameValue = this._userSetting.name!; this.emailValue = this._userSetting.email!; }) } } </script> <style lang=""> <style lang="scss" scoped> .account-page{ .block{ display: flex; } .account-page-title{ font-size: 20px; margin-bottom: 34px; } .account-card{ display: flex; flex-direction: column; border-bottom: 1px solid gray; margin-bottom: 33px; .contact-type{ width: 184px; margin-right: 16px; font-size: 20px; display: flex; flex-direction: column; align-items: flex-start; } &.edit { input { border: 1px solid lightgray; background-color: #fff; } } } .account-setting-btn{ display: flex; justify-content: center; } } .error-txt{ padding-bottom: 10px; .error { @extend .smTxt_bold; @extend .text--primary; height: 16px; } } .name-input{ width: 184px; height:27px; margin-bottom: 20px; font-size: 20px; margin-top: -3px; } .setting-title{ margin-left: 28px; margin-bottom:10px; width: 58px; font-size: 20px; } .header{ display: flex; align-items: baseline; justify-content: space-evenly; } .contact-input{ font-size: 20px; margin-bottom: 10px; text-overflow: ellipsis; margin-top: 10px; width: 184px; } .input{ border: 0; background-color: rgba(0,0,0,0) ; outline-color: gainsboro; } .input:focus{ background-color: #fff; } .icon-color-change{ color:$PRIMARY_RED; font-size: 20px; } .icon{ font-size:20px; // color:#1B365D; } @include desktop{ .header{ display: flex; align-items: baseline; justify-content: space-between; } .setting-title{ margin-bottom:10px; width: 58px; font-size: 18px; font-weight: bold; } .account-page{ .account-page-title{ font-size: 20px; margin-bottom: 34px; font-weight: bold; } } .account-card{ display: flex; flex-direction: column; border-bottom: 1px solid gray; margin-bottom: 33px; .contact-type{ margin-left: 10px; font-size: 20px; } } .name-input{ width: 550px; } .contact-input{ width:550px } } </style> PAMapp/pages/questionnaire/_agentNo.vue
@@ -211,30 +211,30 @@ ]; quesAboutList = [ { title:'å¥åº·èä¿é', content:'çªç¼çæå¤æç¾ç ï¼å¾å¾é æå人æå®¶åºæ²éçç¶æ¿è² æï¼å¨å ¨çä¿éªæè½ææä¸åç¡æçæªä¾ã' }, { title:'å女æè²', content:'å©ç¨åç´ ä¿å®ï¼è¦åæè²åºé ææ©çºå女使ºåï¼è®çæ´»æ´æä¿éï¼' }, { title:'è³ç¢è¦å', content:'ç¶è²¡å責任å éæï¼è¦åå è¶³çä¿éãæä¾ç¶æ¿ä¸çåºè·ï¼æ¯äººçæå å¼·çå¾ç¾ã' }, { title:'æ¨æ´»éä¼', content:'å ¼å ·ä¿éªèæè³ééåè½ï¼å¯éæ´»æé å種éç´ï¼é æäººçä¸åéæ®µçéæ´»éè¦ã' }, { title:'ä¿å®å¥æª¢/è¦å', content:'å ¨é¢æª¢è¦èªå·±çä¿éçµæ§æ¯å¦ç¬¦åç¾å¨ææªä¾ç風éªç§»è½éæ±ï¼ééãæ·ãæ¨ãé¢ãæé¢è±å¨åå£ä¸ã' }, { title:'é²ç«ä¿å®', content:'å¹é 度æ¯ééå´é¸é å°æå¿«é篩é¸å¾ï¼å°æ¯ä¸ä½ä¿éªé¡§åè³æé²è¡æ¯å°å¾æåºæ¨è¦çµ¦æ¨çåªåæ¸å¼ï¼æ¨å¯ä»¥ä½çºé¸æé©åé¡§åçåèå¼ã' } { title:'å¥åº·èä¿é', content:'坿æèº«é«ç §é¡§å¥½ï¼ææ¯ä¿é幸ç¦ä¹æ¬ï¼ä¸åç²ç®çççè çï¼åªåç¶»éçé½å ï¼éªå©åå¤èµ°ä¸å©è·¯ï¼äººççç¾æ£è¦éå±ã' }, { title:'å女æè²', content:'å©åï¼æåæ¯éæ¹çå°å¸«ä¹æ¯å¸çï¼é¢å°æªä¾è¦ä¸¦è©ä½æ°ï¼å¸æåæ¢ç¡çãå ææ«æãåæ¼ç財ï¼éæ¢è·¯ä¸æåä¸èµ·å¸ã' }, { title:'è³ç¢è¦å', content:'çæ£ç財å¯ä¾èªå´è¬¹è¦åè³ç¢å³æ¿ï¼çºäººçèä¸å µæµç¦¦è²¡å風éªççï¼ç¢ºä¿è³ç¢ç©©å¥æé·ï¼æ¿å ¨å®¶æçæªä¾å好è¬å ¨æºåã' }, { title:'æ¨æ´»éä¼', content:'æ¼ä¸è¼©åï¼éä¼å¾çæ¥åè¦è¼é¬å¿«æ´»ï¼å°±å¾ææ©ééä¿éªååè¦åéä¼è²¡åï¼æ¿èªå·±åµé ç©©å®æ¶å ¥ï¼çºç²¾å½©çç年人çæéåºå¹ã' }, { title:'ä¿å®å¥æª¢/è¦å', content:'å ¨é¢æª¢è¦èªå·±çä¿éçµæ§æ¯å¦ç¬¦åç¾å¨ææªä¾ç風éªç§»è½éæ±ã' }, { title:'åç´ ä¿å®', content:'åç´ ä¿å® åç´ ä¿å®æ¯å ¼å ·ã忤颍éªãèãç´ å©å ±äº«ãç¹è²çä¿å®ï¼å ·æä¸å®ç©©å®åº¦ï¼è®ä½ å¯ä»¥åæäº«æå£½éªä¿éåç´ å©ï¼' } ]; myRequest: AppointmentRequests = { @@ -475,3 +475,4 @@ } </style> PAMapp/pages/recommendConsultant/index.vue
@@ -198,32 +198,28 @@ queaAboutList = [ { title: 'å¥åº·èä¿é', content: 'çªç¼çæå¤æç¾ç ï¼å¾å¾é æå人æå®¶åºæ²éçç¶æ¿è² æï¼å¨å ¨çä¿éªæè½ææä¸åç¡æçæªä¾ã' content: '坿æèº«é«ç §é¡§å¥½ï¼ææ¯ä¿é幸ç¦ä¹æ¬ï¼ä¸åç²ç®çççè çï¼åªåç¶»éçé½å ï¼éªå©åå¤èµ°ä¸å©è·¯ï¼äººççç¾æ£è¦éå±ã' }, { title: 'å女æè²', content: 'å©ç¨åç´ ä¿å®ï¼è¦åæè²åºé ææ©çºå女使ºåï¼è®çæ´»æ´æä¿éï¼' content: 'å©åï¼æåæ¯éæ¹çå°å¸«ä¹æ¯å¸çï¼é¢å°æªä¾è¦ä¸¦è©ä½æ°ï¼å¸æåæ¢ç¡çãå ææ«æãåæ¼ç財ï¼éæ¢è·¯ä¸æåä¸èµ·å¸ã' }, { title: 'è³ç¢è¦å', content: 'ç¶è²¡å責任å éæï¼è¦åå è¶³çä¿éãæä¾ç¶æ¿ä¸çåºè·ï¼æ¯äººçæå å¼·çå¾ç¾ã' content: 'çæ£ç財å¯ä¾èªå´è¬¹è¦åè³ç¢å³æ¿ï¼çºäººçèä¸å µæµç¦¦è²¡å風éªççï¼ç¢ºä¿è³ç¢ç©©å¥æé·ï¼æ¿å ¨å®¶æçæªä¾å好è¬å ¨æºåã' }, { title: 'æ¨æ´»éä¼', content: 'å ¼å ·ä¿éªèæè³ééåè½ï¼å¯éæ´»æé å種éç´ï¼é æäººçä¸åéæ®µçéæ´»éè¦ã' content: 'æ¼ä¸è¼©åï¼éä¼å¾çæ¥åè¦è¼é¬å¿«æ´»ï¼å°±å¾ææ©ééä¿éªååè¦åéä¼è²¡åï¼æ¿èªå·±åµé ç©©å®æ¶å ¥ï¼çºç²¾å½©çç年人çæéåºå¹ã' }, { title: 'ä¿å®å¥æª¢/è¦å', content: 'å ¨é¢æª¢è¦èªå·±çä¿éçµæ§æ¯å¦ç¬¦åç¾å¨ææªä¾ç風éªç§»è½éæ±ï¼ééãæ·ãæ¨ãé¢ãæé¢è±å¨åå£ä¸ã' content: 'å ¨é¢æª¢è¦èªå·±çä¿éçµæ§æ¯å¦ç¬¦åç¾å¨ææªä¾ç風éªç§»è½éæ±ã' }, { title: 'é²ç«ä¿å®', content: 'å¹é 度æ¯ééå´é¸é å°æå¿«é篩é¸å¾ï¼å°æ¯ä¸ä½ä¿éªé¡§åè³æé²è¡æ¯å°å¾æåºæ¨è¦çµ¦æ¨çåªåæ¸å¼ï¼æ¨å¯ä»¥ä½çºé¸æé©åé¡§åçåèå¼ã' }, { title: 'å ¶ä»', content: 'å¹é 度æ¯ééå´é¸é å°æå¿«é篩é¸å¾ï¼å°æ¯ä¸ä½ä¿éªé¡§åè³æé²è¡æ¯å°å¾æåºæ¨è¦çµ¦æ¨çåªåæ¸å¼ï¼æ¨å¯ä»¥ä½çºé¸æé©åé¡§åçåèå¼ã' }, title: 'åç´ ä¿å®', content: 'åç´ ä¿å® åç´ ä¿å®æ¯å ¼å ·ã忤颍éªãèãç´ å©å ±äº«ãç¹è²çä¿å®ï¼å ·æä¸å®ç©©å®åº¦ï¼è®ä½ å¯ä»¥åæäº«æå£½éªä¿éåç´ å©ï¼' } ]; showDialog = false; showAddress = false; @@ -281,7 +277,7 @@ } </script> <style lang="scss" > <style lang="scss"> .pam-rec-cosultant-page { .rec-pop-container{ @@ -365,6 +361,7 @@ overflow-y: auto; height: 500px; margin-top: 20px; text-align: justify; } .qaTextTitle { @@ -570,7 +567,6 @@ flex-wrap: wrap; } } } }