Files
sweet-hut-ui/src/store/travel.ts
2026-03-15 21:52:49 +08:00

189 lines
5.6 KiB
TypeScript

import { defineStore } from 'pinia'
import { IDateType, ImagePathEnum } from '@/types'
import type { IDialog } from 'vue3-common/types'
import { IHandleApi } from 'vue3-common/types'
import { ElMessage } from 'element-plus'
import { getCurrentMonth, getCurrentYear, getStartEndDate } from 'vue3-common/utils/dateUtil'
import { ITravelRecord, ITravelSpot, ITravelStats } from '@/types/travel'
import {
addTravelRecordApi, addTravelSpotApi, deleteTravelRecordApi,
deleteTravelSpotApi, queryTravelCategoryApi,
queryTravelRecordApi, queryTravelSpotApi, queryTravelSpotListApi,
queryTravelSpotNameListApi, queryTravelStatsApi,
updateTravelRecordApi, updateTravelSpotApi
} from '@/apis/travel'
export const useTravelStore = defineStore('travel', {
state: () => ({
travelSpotList: [] as ITravelSpot[],
currentTravelSpot: {
id: 0,
name: '',
area: ['', ''],
address: '',
price: 0,
recommendRate: 0,
traffic: '',
router: '',
foods: [''],
projects: [''],
remark: '',
recordList: []
} as ITravelSpot,
travelRecordList: [] as ITravelRecord[],
currentTravelRecord: {
id: 0,
name: '',
area: [],
date: '',
persons: [],
imageList: [],
videoList: []
} as ITravelRecord,
travelSpotNameList: [] as string[],
querySpot: {
category: ''
},
queryRecord: {
year: getCurrentYear(),
month: getCurrentMonth()
},
queryDateType: 'month' as IDateType,
queryDateList: [] as string[],
travelSpotApiType: 'ADD' as IHandleApi,
travelSpotDialog: {
visible: false,
title: '',
data: {}
} as IDialog<ITravelSpot>,
travelRecordApiType: 'ADD' as IHandleApi,
travelRecordDialog: {
visible: false,
title: '',
data: {}
} as IDialog<ITravelRecord>,
editTravelRecordIndex: 0,
travelImagePath: ImagePathEnum.TRAVEL,
travelVideoPath: ImagePathEnum.TRAVEL,
rateColorList: ['#E2DEDC', '#F7BA2A', '#009FA8'],
pageInfo: {
currentPage: 1,
pageSize: 6,
totalSize: 1
},
isScrollEnd: false,
travelCategoryList: [] as string[],
travelStats: {
spotCount: 0,
cityCount: 0,
recordCount: 0
} as ITravelStats,
isRefresh: false
}),
actions: {
async queryTravelSpotList() {
const { currentPage, pageSize } = this.pageInfo
const result = await queryTravelSpotListApi(currentPage, pageSize, this.querySpot)
this.travelSpotList = result.records
this.pageInfo.currentPage = result.current
this.pageInfo.totalSize = result.total
},
async queryMobileTravelSpotList() {
const { currentPage, pageSize } = this.pageInfo
const result = await queryTravelSpotListApi(currentPage, pageSize, this.querySpot)
this.travelSpotList.push(...result.records)
this.pageInfo.totalSize = result.total
},
async queryTravelRecordList() {
const { year, month } = this.queryRecord
const date = this.queryDateType === 'year' ? year : month
this.queryDateList = getStartEndDate(date, this.queryDateType)
this.travelRecordList = await queryTravelRecordApi(this.queryDateList[0], this.queryDateList[1])
},
async queryTravelSpotNameList() {
this.travelSpotNameList = await queryTravelSpotNameListApi()
},
async queryTravelSpot(id: number) {
this.currentTravelSpot = await queryTravelSpotApi(id)
},
async queryTravelStats() {
this.travelStats = await queryTravelStatsApi()
},
async queryTravelCategory() {
this.travelCategoryList = await queryTravelCategoryApi()
},
async handleTravelSpotApi(travelSpot: ITravelSpot) {
switch (this.travelSpotApiType) {
case 'ADD':
await addTravelSpotApi(travelSpot)
ElMessage.success('新增景点成功')
break
case 'UPDATE':
await updateTravelSpotApi(travelSpot.id as number, travelSpot)
ElMessage.success('更新景点成功')
break
case 'DELETE':
await deleteTravelSpotApi(travelSpot.id as number)
ElMessage.success('删除景点成功')
break
default:
break
}
this.travelSpotDialog.visible = false
await this.refreshInfo()
},
async handleTravelRecordApi(travelRecord: ITravelRecord) {
switch (this.travelRecordApiType) {
case 'ADD':
await addTravelRecordApi(travelRecord)
ElMessage.success('新增记录成功')
break
case 'UPDATE':
await updateTravelRecordApi(travelRecord.id as number, travelRecord)
ElMessage.success('更新记录成功')
break
case 'DELETE':
await deleteTravelRecordApi(travelRecord.id as number)
ElMessage.success('删除记录成功')
break
default:
break
}
this.travelRecordDialog.visible = false
},
async refreshInfo() {
await this.queryTravelSpotList()
await this.queryTravelRecordList()
await this.queryTravelStats()
this.isRefresh = !this.isRefresh
},
getEmptyTravelSpot(): ITravelSpot {
return {
address: '',
area: [],
foods: [],
id: 0,
name: '',
price: 0,
projects: [],
recommendRate: 0,
recordList: [],
remark: '',
router: '',
traffic: ''
}
},
getEmptyTravelRecord(): ITravelRecord {
return {
area: [],
date: '',
id: 0,
imageList: [],
videoList: [],
name: '',
persons: []
}
}
}
})