feat 搭建架构骨架
This commit is contained in:
258
src/stores/modules/profile.ts
Normal file
258
src/stores/modules/profile.ts
Normal file
@@ -0,0 +1,258 @@
|
||||
import { defineStore } from 'pinia'
|
||||
import { ref } from 'vue'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import type { BusinessType, PageResult } from '@/types/api'
|
||||
import type { Case } from '@/types/business/cases'
|
||||
import type {
|
||||
Address,
|
||||
ChangePasswordParams,
|
||||
Feedback,
|
||||
FavoritesQuery,
|
||||
HelpFaqGroup,
|
||||
ListQuery,
|
||||
Profile,
|
||||
Qualification,
|
||||
QualificationInput,
|
||||
} from '@/types/business/profile'
|
||||
import {
|
||||
bindEmail,
|
||||
bindPhone,
|
||||
changePassword,
|
||||
createAddress,
|
||||
createQualification,
|
||||
deleteAccount as deleteAccountApi,
|
||||
deleteAddress,
|
||||
deleteQualification,
|
||||
getAddresses,
|
||||
getCaseCounts,
|
||||
getFavorites,
|
||||
getHelpFaqs,
|
||||
getProfile,
|
||||
getQualifications,
|
||||
setDefaultAddress,
|
||||
submitFeedback as submitFeedbackApi,
|
||||
unbindEmail,
|
||||
updateAddress,
|
||||
updateNickname,
|
||||
updateQualification,
|
||||
verifyIdentity,
|
||||
} from '@/api/profile'
|
||||
import { storage } from '@/utils/storage'
|
||||
|
||||
function createDefaultAddressQuery(): ListQuery {
|
||||
return { page: 1, pageSize: 6 }
|
||||
}
|
||||
|
||||
function createDefaultQualificationQuery(): ListQuery {
|
||||
return { page: 1, pageSize: 6 }
|
||||
}
|
||||
|
||||
function createDefaultFavoritesQuery(): FavoritesQuery {
|
||||
return { page: 1, pageSize: 8, keyword: '', category: 'all' }
|
||||
}
|
||||
|
||||
/** 个人中心数据(资料/安全/地址/收藏/资质/反馈/帮助) */
|
||||
export const useProfileStore = defineStore('profile', () => {
|
||||
// ── 账号资料 ──
|
||||
const profile = ref<Profile | null>(null)
|
||||
|
||||
async function fetchProfile(): Promise<void> {
|
||||
profile.value = await getProfile()
|
||||
}
|
||||
|
||||
async function saveNickname(name: string): Promise<void> {
|
||||
profile.value = await updateNickname(name)
|
||||
ElMessage.success('昵称修改成功')
|
||||
}
|
||||
|
||||
// ── 账号安全 ──
|
||||
async function changePasswordAction(params: ChangePasswordParams): Promise<void> {
|
||||
await changePassword(params)
|
||||
profile.value = await getProfile()
|
||||
ElMessage.success('密码修改成功')
|
||||
}
|
||||
|
||||
async function bindPhoneAction(phone: string, code: string): Promise<void> {
|
||||
profile.value = await bindPhone(phone, code)
|
||||
ElMessage.success('手机号绑定成功')
|
||||
}
|
||||
|
||||
async function bindEmailAction(email: string, code: string): Promise<void> {
|
||||
profile.value = await bindEmail(email, code)
|
||||
ElMessage.success('邮箱绑定成功')
|
||||
}
|
||||
|
||||
async function unbindEmailAction(): Promise<void> {
|
||||
profile.value = await unbindEmail()
|
||||
ElMessage.success('已取消邮箱绑定')
|
||||
}
|
||||
|
||||
async function verifyIdentityAction(phone: string, code: string): Promise<void> {
|
||||
await verifyIdentity(phone, code)
|
||||
}
|
||||
|
||||
async function deleteAccountAction(): Promise<void> {
|
||||
await deleteAccountApi()
|
||||
storage.remove('token')
|
||||
ElMessage.success('注销成功')
|
||||
}
|
||||
|
||||
// ── 收货地址 ──
|
||||
const addresses = ref<Address[]>([])
|
||||
const addressTotal = ref(0)
|
||||
const addressQuery = ref<ListQuery>(createDefaultAddressQuery())
|
||||
|
||||
async function fetchAddresses(): Promise<void> {
|
||||
const result: PageResult<Address> = await getAddresses(addressQuery.value)
|
||||
addresses.value = result.list
|
||||
addressTotal.value = result.total
|
||||
}
|
||||
|
||||
async function createAddressAction(input: Omit<Address, 'id' | 'isDefault'>): Promise<void> {
|
||||
await createAddress(input)
|
||||
ElMessage.success('新增地址成功')
|
||||
addressQuery.value = { ...addressQuery.value, page: 1 }
|
||||
await fetchAddresses()
|
||||
}
|
||||
|
||||
async function updateAddressAction(id: string, input: Omit<Address, 'id' | 'isDefault'>): Promise<void> {
|
||||
await updateAddress(id, input)
|
||||
ElMessage.success('地址保存成功')
|
||||
await fetchAddresses()
|
||||
}
|
||||
|
||||
async function deleteAddressAction(id: string): Promise<void> {
|
||||
await deleteAddress(id)
|
||||
ElMessage.success('地址删除成功')
|
||||
await fetchAddresses()
|
||||
}
|
||||
|
||||
async function setDefaultAddressAction(id: string): Promise<void> {
|
||||
await setDefaultAddress(id)
|
||||
ElMessage.success('已设为默认地址')
|
||||
await fetchAddresses()
|
||||
}
|
||||
|
||||
async function changeAddressPage(page: number): Promise<void> {
|
||||
addressQuery.value = { ...addressQuery.value, page }
|
||||
await fetchAddresses()
|
||||
}
|
||||
|
||||
// ── 我的收藏 ──
|
||||
const favorites = ref<Case[]>([])
|
||||
const favoritesTotal = ref(0)
|
||||
const favoritesCounts = ref<Partial<Record<BusinessType, number>>>({})
|
||||
const favoritesQuery = ref<FavoritesQuery>(createDefaultFavoritesQuery())
|
||||
|
||||
async function fetchFavorites(): Promise<void> {
|
||||
const result: PageResult<Case> = await getFavorites(favoritesQuery.value)
|
||||
favorites.value = result.list
|
||||
favoritesTotal.value = result.total
|
||||
}
|
||||
|
||||
async function fetchFavoritesCounts(): Promise<void> {
|
||||
favoritesCounts.value = await getCaseCounts()
|
||||
}
|
||||
|
||||
async function searchFavorites(patch: Partial<FavoritesQuery>): Promise<void> {
|
||||
favoritesQuery.value = { ...favoritesQuery.value, ...patch, page: 1 }
|
||||
await fetchFavorites()
|
||||
}
|
||||
|
||||
async function resetFavorites(): Promise<void> {
|
||||
favoritesQuery.value = createDefaultFavoritesQuery()
|
||||
await fetchFavorites()
|
||||
}
|
||||
|
||||
async function changeFavoritesPage(page: number): Promise<void> {
|
||||
favoritesQuery.value = { ...favoritesQuery.value, page }
|
||||
await fetchFavorites()
|
||||
}
|
||||
|
||||
// ── 资质管理 ──
|
||||
const qualifications = ref<Qualification[]>([])
|
||||
const qualificationTotal = ref(0)
|
||||
const qualificationQuery = ref<ListQuery>(createDefaultQualificationQuery())
|
||||
|
||||
async function fetchQualifications(): Promise<void> {
|
||||
const result: PageResult<Qualification> = await getQualifications(qualificationQuery.value)
|
||||
qualifications.value = result.list
|
||||
qualificationTotal.value = result.total
|
||||
}
|
||||
|
||||
async function createQualificationAction(input: QualificationInput): Promise<void> {
|
||||
await createQualification(input)
|
||||
ElMessage.success('资质提交成功')
|
||||
qualificationQuery.value = { ...qualificationQuery.value, page: 1 }
|
||||
await fetchQualifications()
|
||||
}
|
||||
|
||||
async function updateQualificationAction(id: string, input: QualificationInput): Promise<void> {
|
||||
await updateQualification(id, input)
|
||||
ElMessage.success('资质保存成功')
|
||||
await fetchQualifications()
|
||||
}
|
||||
|
||||
async function deleteQualificationAction(id: string): Promise<void> {
|
||||
await deleteQualification(id)
|
||||
ElMessage.success('资质删除成功')
|
||||
await fetchQualifications()
|
||||
}
|
||||
|
||||
async function changeQualificationPage(page: number): Promise<void> {
|
||||
qualificationQuery.value = { ...qualificationQuery.value, page }
|
||||
await fetchQualifications()
|
||||
}
|
||||
|
||||
// ── 意见反馈 / 帮助中心 ──
|
||||
async function submitFeedbackAction(feedback: Feedback): Promise<void> {
|
||||
await submitFeedbackApi(feedback)
|
||||
}
|
||||
|
||||
const helpFaqs = ref<HelpFaqGroup[]>([])
|
||||
|
||||
async function fetchHelpFaqs(): Promise<void> {
|
||||
helpFaqs.value = await getHelpFaqs()
|
||||
}
|
||||
|
||||
return {
|
||||
profile,
|
||||
fetchProfile,
|
||||
saveNickname,
|
||||
changePassword: changePasswordAction,
|
||||
bindPhone: bindPhoneAction,
|
||||
bindEmail: bindEmailAction,
|
||||
unbindEmail: unbindEmailAction,
|
||||
verifyIdentity: verifyIdentityAction,
|
||||
deleteAccount: deleteAccountAction,
|
||||
addresses,
|
||||
addressTotal,
|
||||
addressQuery,
|
||||
fetchAddresses,
|
||||
createAddress: createAddressAction,
|
||||
updateAddress: updateAddressAction,
|
||||
deleteAddress: deleteAddressAction,
|
||||
setDefaultAddress: setDefaultAddressAction,
|
||||
changeAddressPage,
|
||||
favorites,
|
||||
favoritesTotal,
|
||||
favoritesCounts,
|
||||
favoritesQuery,
|
||||
fetchFavorites,
|
||||
fetchFavoritesCounts,
|
||||
searchFavorites,
|
||||
resetFavorites,
|
||||
changeFavoritesPage,
|
||||
qualifications,
|
||||
qualificationTotal,
|
||||
qualificationQuery,
|
||||
fetchQualifications,
|
||||
createQualification: createQualificationAction,
|
||||
updateQualification: updateQualificationAction,
|
||||
deleteQualification: deleteQualificationAction,
|
||||
changeQualificationPage,
|
||||
submitFeedback: submitFeedbackAction,
|
||||
helpFaqs,
|
||||
fetchHelpFaqs,
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user