diff --git a/src/components/Calender/README.md b/src/components/Calender/README.md deleted file mode 100644 index 6da457f..0000000 --- a/src/components/Calender/README.md +++ /dev/null @@ -1,586 +0,0 @@ -# 日历组件 (Calendar Component) - -## 功能需求分析 - -基于设计图片分析,该日历组件是一个酒店预订场景的低价日历弹窗,支持通过日期图标点击触发显示,需要实现以下细分功能: - -## 交互使用方式 - -### 基础用法 - -通过点击日期图标打开日历组件: - -```vue - - - - 选择日期 - {{ selectedDate }} - 请点击日期图标选择 - - - - - - - - - - - -``` - -### 演示文件 - -- `year-demo.vue` - 全年日历演示(推荐) -- `demo.vue` - 完整的交互演示页面 -- `example.vue` - 详细的使用示例,包含单选和范围选择 - -### 跨年日历 - -组件支持显示从当前月份到明年同月份的13个月日历,用户可以连续选择入住和离店日期: - -1. 点击第一个日期设置入住日期 -2. 点击第二个日期设置离店日期 -3. 自动显示"入住"和"离店"标签 -4. 支持滚动浏览跨年日期范围 - -### 1. 弹窗容器结构 - -#### 1.1 弹窗基础框架 - -- [ ] 实现遮罩层背景(半透明黑色) -- [ ] 弹窗居中显示,支持垂直居中 -- [ ] 弹窗圆角设计(建议12px) -- [ ] 弹窗阴影效果 -- [ ] 弹窗动画效果(淡入淡出) - -#### 1.2 弹窗头部区域 - -- [ ] 标题文字:"低价日历" -- [ ] 副标题文字:"以下价格为单晚参考价" -- [ ] 右上角关闭按钮(X图标) -- [ ] 关闭按钮点击交互 -- [ ] 头部区域背景色和分割线 - -### 2. 日历主体结构 - -#### 2.1 周标题行 - -- [ ] 显示周几标题:一、二、三、四、五、六、日 -- [ ] 周标题居中对齐 -- [ ] 周标题字体样式(灰色、小字号) - -#### 2.2 月份导航 - -- [ ] 月份标题显示:"2024年5月"、"2024年6月" -- [ ] 月份标题居中显示 -- [ ] 月份标题字体加粗 -- [ ] 支持上下滑动切换月份(可选) - -### 3. 日期网格系统 - -#### 3.1 日期格子基础 - -- [ ] 7列网格布局(对应周一到周日) -- [ ] 每个格子固定宽高比 -- [ ] 格子间距设计 -- [ ] 格子圆角设计 - -#### 3.2 日期内容显示 - -- [ ] 日期数字显示(居中对齐) -- [ ] 价格信息显示(¥449格式) -- [ ] 日期数字字体大小和颜色 -- [ ] 价格字体大小和颜色(较小、灰色) - -#### 3.3 日期状态管理 - -- [ ] 普通可选日期(白色背景) -- [ ] 当前选中日期(蓝色背景,白色文字) -- [ ] 入住日期标记("入住"标签) -- [ ] 离店日期标记("离店"标签) -- [ ] 选择范围内日期(浅蓝色背景) -- [ ] 不可选日期(灰色背景,禁用状态) - -### 4. 交互功能实现 - -#### 4.1 日期选择逻辑 - -- [ ] 单击日期选择功能 -- [ ] 日期范围选择(入住-离店) -- [ ] 选择状态视觉反馈 -- [ ] 选择完成后的回调事件 - -#### 4.2 用户体验优化 - -- [ ] 点击动画效果 -- [ ] 触摸反馈 -- [ ] 防止快速重复点击 -- [ ] 选择范围的视觉连接线(可选) - -### 5. 数据处理功能 - -#### 5.1 价格数据管理 - -- [ ] 价格数据结构设计 -- [ ] 价格数据绑定到日期 -- [ ] 价格格式化显示 -- [ ] 无价格数据的处理 - -#### 5.2 日期计算功能 - -- [ ] 月份天数计算 -- [ ] 月份第一天星期几计算 -- [ ] 跨月份日期处理 -- [ ] 日期有效性验证 - -### 6. 响应式适配 - -#### 6.1 移动端适配 - -- [ ] 触摸屏操作优化 -- [ ] 不同屏幕尺寸适配 -- [ ] 横竖屏切换适配 -- [ ] 安全区域适配(刘海屏等) - -#### 6.2 字体和尺寸适配 - -- [ ] 字体大小响应式调整 -- [ ] 格子尺寸响应式调整 -- [ ] 间距响应式调整 - -## 技术实现细节 - -### 组件接口设计 - -#### Props 属性 - -```javascript -props: { - // 弹窗显示控制 - visible: { - type: Boolean, - default: false, - required: true - }, - - // 价格数据对象 - priceData: { - type: Object, - default: () => ({}), - // 格式: { '2024-05-17': 449, '2024-05-18': 399 } - }, - - // 默认选中日期 - defaultValue: { - type: [String, Array], - default: '', - // 单选: '2024-05-17' - // 范围选择: ['2024-05-17', '2024-05-19'] - }, - - // 选择模式 - mode: { - type: String, - default: 'single', - validator: (value) => ['single', 'range'].includes(value) - }, - - // 最小可选日期 - minDate: { - type: String, - default: () => new Date().toISOString().split('T')[0] - }, - - // 最大可选日期 - maxDate: { - type: String, - default: '' - }, - - // 禁用日期数组 - disabledDates: { - type: Array, - default: () => [] - }, - - // 自定义标签 - customLabels: { - type: Object, - default: () => ({}) - // 格式: { '2024-05-17': '入住', '2024-05-19': '离店' } - } -} -``` - -#### Events 事件 - -```javascript -// 日期选择事件 -this.$emit("select", { - date: "2024-05-17", - price: 449, - mode: "single", -}); - -// 范围选择事件 -this.$emit("range-select", { - startDate: "2024-05-17", - endDate: "2024-05-19", - startPrice: 449, - endPrice: 399, - totalDays: 2, -}); - -// 弹窗关闭事件 -this.$emit("close"); - -// 月份切换事件 -this.$emit("month-change", { - year: 2024, - month: 5, - direction: "next", // 'prev' | 'next' -}); - -// 日期点击事件(包含所有点击) -this.$emit("date-click", { - date: "2024-05-17", - price: 449, - disabled: false, - selected: true, -}); -``` - -### 核心算法实现 - -#### 日期计算工具函数 - -```javascript -// 获取月份天数 -getDaysInMonth(year, month) { - return new Date(year, month, 0).getDate() -} - -// 获取月份第一天是星期几 -getFirstDayOfMonth(year, month) { - return new Date(year, month - 1, 1).getDay() -} - -// 生成日期网格数据 -generateCalendarGrid(year, month) { - const daysInMonth = this.getDaysInMonth(year, month) - const firstDay = this.getFirstDayOfMonth(year, month) - const grid = [] - - // 填充空白格子 - for (let i = 0; i < firstDay; i++) { - grid.push(null) - } - - // 填充日期 - for (let day = 1; day <= daysInMonth; day++) { - const dateStr = `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}` - grid.push({ - date: dateStr, - day: day, - price: this.priceData[dateStr] || null, - disabled: this.isDateDisabled(dateStr), - selected: this.isDateSelected(dateStr), - inRange: this.isDateInRange(dateStr), - label: this.customLabels[dateStr] || '' - }) - } - - return grid -} -``` - -#### 选择状态管理 - -```javascript -data() { - return { - selectedDates: [], - currentMonth: new Date().getMonth() + 1, - currentYear: new Date().getFullYear(), - isRangeSelecting: false, - rangeStart: null, - rangeEnd: null - } -}, - -methods: { - handleDateClick(dateInfo) { - if (dateInfo.disabled) return - - if (this.mode === 'single') { - this.selectedDates = [dateInfo.date] - this.$emit('select', dateInfo) - } else if (this.mode === 'range') { - this.handleRangeSelection(dateInfo) - } - }, - - handleRangeSelection(dateInfo) { - if (!this.rangeStart || (this.rangeStart && this.rangeEnd)) { - // 开始新的范围选择 - this.rangeStart = dateInfo.date - this.rangeEnd = null - this.isRangeSelecting = true - } else { - // 完成范围选择 - this.rangeEnd = dateInfo.date - this.isRangeSelecting = false - - // 确保开始日期小于结束日期 - if (new Date(this.rangeStart) > new Date(this.rangeEnd)) { - [this.rangeStart, this.rangeEnd] = [this.rangeEnd, this.rangeStart] - } - - this.$emit('range-select', { - startDate: this.rangeStart, - endDate: this.rangeEnd, - startPrice: this.priceData[this.rangeStart], - endPrice: this.priceData[this.rangeEnd], - totalDays: this.calculateDaysBetween(this.rangeStart, this.rangeEnd) - }) - } - } -} -``` - -### 样式设计规范 - -#### 颜色系统 - -```scss -// 主色调 -$primary-color: #1890ff; -$primary-light: #e6f7ff; -$primary-dark: #0050b3; - -// 中性色 -$text-primary: #262626; -$text-secondary: #8c8c8c; -$text-disabled: #bfbfbf; -$background-white: #ffffff; -$background-gray: #f5f5f5; -$border-color: #d9d9d9; - -// 状态色 -$success-color: #52c41a; -$warning-color: #faad14; -$error-color: #ff4d4f; -``` - -#### 尺寸规范 - -```scss -// 弹窗尺寸 -$modal-width: 350px; -$modal-max-height: 80vh; -$modal-border-radius: 12px; -$modal-padding: 20px; - -// 日期格子尺寸 -$date-cell-size: 44px; -$date-cell-gap: 2px; -$date-cell-border-radius: 6px; - -// 字体大小 -$font-size-title: 18px; -$font-size-subtitle: 14px; -$font-size-date: 16px; -$font-size-price: 12px; -$font-size-label: 10px; -``` - -## 开发实施计划 - -### 第一阶段:基础框架(1-2天) - -- [ ] 创建组件基础结构 -- [ ] 实现弹窗容器和遮罩 -- [ ] 添加头部区域和关闭功能 -- [ ] 建立基础样式系统 - -### 第二阶段:日历核心(2-3天) - -- [ ] 实现日期计算算法 -- [ ] 构建日期网格布局 -- [ ] 添加周标题和月份显示 -- [ ] 实现基础日期显示 - -### 第三阶段:交互功能(2-3天) - -- [ ] 实现日期选择逻辑 -- [ ] 添加范围选择功能 -- [ ] 实现状态管理和视觉反馈 -- [ ] 添加价格数据绑定 - -### 第四阶段:优化完善(1-2天) - -- [ ] 添加动画效果 -- [ ] 优化移动端体验 -- [ ] 完善边界情况处理 -- [ ] 性能优化和测试 - -## 使用示例 - -### 基础用法 - -```vue - - - 选择日期 - - - - - - -``` - -### 高级用法 - -```vue - - - - - -``` - -## 测试用例 - -### 单元测试 - -- [ ] 日期计算函数测试 -- [ ] 选择逻辑测试 -- [ ] 价格数据绑定测试 -- [ ] 边界条件测试 - -### 集成测试 - -- [ ] 用户交互流程测试 -- [ ] 不同设备适配测试 -- [ ] 性能压力测试 - -### 可访问性测试 - -- [ ] 键盘导航测试 -- [ ] 屏幕阅读器兼容性 -- [ ] 色彩对比度检查 diff --git a/src/components/Calender/demo.vue b/src/components/Calender/demo.vue deleted file mode 100644 index e6b0a4c..0000000 --- a/src/components/Calender/demo.vue +++ /dev/null @@ -1,249 +0,0 @@ - - - - - 日历组件交互演示 - 点击日期图标打开日历 - - - - - - - 选择日期 - {{ - formatDate(selectedDate) - }} - 请点击日期图标选择 - - - - - - - - - - - 已选择日期 - {{ formatDate(selectedDate) }} - 价格:¥{{ selectedPrice }} - - - - - - - - - - - diff --git a/src/components/Calender/example.vue b/src/components/Calender/example.vue deleted file mode 100644 index fb9f64e..0000000 --- a/src/components/Calender/example.vue +++ /dev/null @@ -1,337 +0,0 @@ - - - - - 日历组件使用示例 - - - - - - - 选择日期 - {{ - selectedDate - }} - 请选择日期 - - - - - - - - 选择日期范围 - - {{ selectedRange.start }} 至 {{ selectedRange.end }} - - 请选择日期范围 - - - - - - - - 选择有价格的日期范围 - - {{ selectedRange.start }} 至 {{ selectedRange.end }} - - 请选择价格区间(仅含有价夜晚) - - - - - - - - 选择结果: - - 单选日期: - {{ selectedDate }} - - ¥{{ selectedDatePrice }} - - - - 日期范围: - {{ selectedRange.start }} 至 {{ selectedRange.end }} - (共{{ rangeDays }}天) - - 总价:¥{{ selectedRangeTotal }} - - - - - - - - - - - - - - - - - - diff --git a/src/components/Calender/index.vue b/src/components/Calender/index.vue index a56f2b9..32d9da8 100644 --- a/src/components/Calender/index.vue +++ b/src/components/Calender/index.vue @@ -1,19 +1,12 @@ - + - 日历选择 - 选择住宿日期,以下价格为单晚参考价 + 日历选择 + 选择住宿日期,以下价格为单晚参考价 @@ -22,41 +15,28 @@ - + {{ day }} - + - - {{ monthData.title }} + + {{ monthData.title }} - + - + {{ dateInfo.label }} - - {{ dateInfo.day }} - ¥{{ dateInfo.price }} + + {{ dateInfo.day }} + ¥{{ dateInfo.price }} diff --git a/src/components/Calender/year-demo.vue b/src/components/Calender/year-demo.vue deleted file mode 100644 index 9309c98..0000000 --- a/src/components/Calender/year-demo.vue +++ /dev/null @@ -1,283 +0,0 @@ - - - - 跨年日历演示 - 支持从当前月份到明年同月份的日期连续选择 - - - - - - - 📅 - - - 选择入住和离店日期 - - - {{ formatDateRange() }} - - - - - - - - 选择结果: - - 入住日期: - {{ - formatDate(selectedRange.start) - }} - - - 离店日期: - {{ formatDate(selectedRange.end) }} - - - 住宿天数: - {{ calculateDays() }}晚 - - - - - - - - - - - - diff --git a/src/constants/base.ts b/src/constants/base.ts new file mode 100644 index 0000000..22c4825 --- /dev/null +++ b/src/constants/base.ts @@ -0,0 +1,52 @@ +/** + * 客户端配置管理模块 + * + * 功能说明: + * 所有配置从根目录的 client-configs.json 文件中读取 + */ + +// 直接导入配置文件 +import rawConfigs from "../../client-configs.json" with { type: "json" }; + +// 所有用户端的配置 - 处理后的配置 +export const CLIENT_CONFIGS = rawConfigs; + +// 获取当前用户端配置 +export const getCurrentConfig = () => CLIENT_CONFIGS.xiaoqi; +export const clientId = getCurrentConfig().clientId; +export const appId = getCurrentConfig().appId; + +/// 客户端类型 +export const ClientType = { + // 智念 + ZHINIAN: "ZHINIAN", + // 小七 + XIAOQI: "XIAOQI", + // 朵花 + DUOHUA: "DUOHUA", + // 天沐 + TIANMU: "TIANMU", + // 念念助手 + NIANHELPER: "NIANHELPER", +}; + +/// 获取当前客户端类型 +export const currentClientType = () => { + switch (getCurrentConfig().name) { + case "念念": + return ClientType.ZHINIAN; + case "小七": + return ClientType.XIAOQI; + case "朵朵": + return ClientType.DUOHUA; + case "沐沐": + return ClientType.TIANMU; + case "念念助手": + return ClientType.NIANHELPER; + default: + return ClientType.ZHINIAN; + } +}; + +// 环境配置 - 智念客户端使用测试环境,其他客户端使用生产环境 +export const isZhiNian = currentClientType() === ClientType.ZHINIAN; diff --git a/src/constants/constant.ts b/src/constants/constant.ts new file mode 100644 index 0000000..8c26898 --- /dev/null +++ b/src/constants/constant.ts @@ -0,0 +1,19 @@ +// 登录成功 +export const NOTICE_EVENT_LOGIN_SUCCESS = "NOTICE_EVENT_LOGIN_SUCCESS"; +// 退出登录 +export const NOTICE_EVENT_LOGOUT = "NOTICE_EVENT_LOGOUT"; + +// 滚动到底部 +export const SCROLL_TO_BOTTOM = "SCROLL_TO_BOTTOM"; + +// 发送消息文本类型 +export const SEND_MESSAGE_CONTENT_TEXT = "SEND_MESSAGE_CONTENT_TEXT"; + +// 发送消息命令类型 +export const SEND_MESSAGE_COMMAND_TYPE = "SEND_MESSAGE_COMMAND_TYPE"; + +// 切换到伴游tab +export const SWITCH_TO_COMPANION_TAB = "SWITCH_TO_COMPANION_TAB"; + +// 切换到发现tab +export const SWITCH_TO_DISCOVERY_TAB = "SWITCH_TO_DISCOVERY_TAB"; \ No newline at end of file diff --git a/src/constants/speech.ts b/src/constants/speech.ts new file mode 100644 index 0000000..0fb9e34 --- /dev/null +++ b/src/constants/speech.ts @@ -0,0 +1,7 @@ +// App 端 yao-asdRealSpeech 使用的阿里云 DashScope 实时语音识别配置。 +// 将 apikey 填成实际的 DashScope API Key 后,App 端语音识别即可发起连接。 +export const appSpeechRecognitionOptions = { + apikey: "sk-2cab1c221b4b47749119d33ab991360a", + language_hints: ["zh"], + saveAudioFile: false, +}; diff --git a/src/constants/token.ts b/src/constants/token.ts new file mode 100644 index 0000000..41ea5ff --- /dev/null +++ b/src/constants/token.ts @@ -0,0 +1,35 @@ +import { currentClientType } from "@/constant/base"; + +// 存储在本地的认证 token 键名 +const CLIENT_TYPE = currentClientType(); +const ACCESS_TOKEN = `${CLIENT_TYPE}_ACCESS_TOKEN`; +const REFRESH_ACCESS_TOKEN = `${CLIENT_TYPE}_REFRESH_ACCESS_TOKEN`; + +// 设置本地存储的认证 token +export const setAccessToken = (token) => { + return uni.setStorageSync(ACCESS_TOKEN, token); +}; + +// 设置本地存储的刷新 token +export const setRefreshToken = (token) => { + return uni.setStorageSync(REFRESH_ACCESS_TOKEN, token); +}; + +// 获取本地存储的刷新 token +export const getRefreshToken = () => { + return uni.getStorageSync(REFRESH_ACCESS_TOKEN); +}; + +// 获取本地存储的认证 token +export const getAccessToken = () => { + return uni.getStorageSync(ACCESS_TOKEN); +}; + +// 移除本地存储的认证 token +export const removeAccessToken = () => { + return uni.removeStorageSync(ACCESS_TOKEN); +}; + +export const removeRefreshToken = () => { + return uni.removeStorageSync(REFRESH_ACCESS_TOKEN); +}; diff --git a/src/constants/type.ts b/src/constants/type.ts new file mode 100644 index 0000000..f15a6b3 --- /dev/null +++ b/src/constants/type.ts @@ -0,0 +1,7 @@ +// 商品类型 +export const GOODS_TYPE = { + 0: "客房", + 1: "门票", + 2: "餐饮", + 3: "套餐", +}; diff --git a/src/hooks/useGoHome.ts b/src/hooks/useGoHome.ts new file mode 100644 index 0000000..600b96c --- /dev/null +++ b/src/hooks/useGoHome.ts @@ -0,0 +1 @@ +export const goHome = () => uni.reLaunch({ url: "/pages/index/index" }); diff --git a/src/hooks/useGoLogin.ts b/src/hooks/useGoLogin.ts new file mode 100644 index 0000000..748644d --- /dev/null +++ b/src/hooks/useGoLogin.ts @@ -0,0 +1,115 @@ +import { oauthToken, checkUserPhone } from "@/request/api/LoginApi"; +import { + authLogin, + refreshAuthLogin, + checkRefreshToken, +} from "@/manager/LoginManager"; +import { clientId } from "@/constant/base"; +import { + getAccessToken, + removeAccessToken, + setAccessToken, +} from "../constant/token"; +import { NOTICE_EVENT_LOGIN_SUCCESS } from "@/constant/constant"; + +// 跳转登录 +export const goLogin = () => uni.navigateTo({ url: "/pages/login/index" }); + +// 登录成功后,返回上一页 +export const goBack = () => uni.navigateBack({ delta: 1 }); + +// 检测token +export const checkToken = () => { + const token = getAccessToken(); + return new Promise((resolve) => { + if (!token) { + goLogin(); + return; + } + resolve(); + }); +}; + +// 登录逻辑 +export const onLogin = async (e) => { + console.info("onLogin code: ", e); + + return new Promise(async (resolve, reject) => { + // 判断用户拒绝 + if (e !== undefined && e && e.detail && e.detail.errno === 104) { + reject(); + return; + } + + await authLogin(e).then(async () => { + console.log("authLogin resolve success"); + // 检查手机号是否绑定 + const checkRes = await checkUserPhone(); + if (checkRes.data) { + resolve(); + return; + } + + if (e === undefined) { + resolve(); + return; + } + + const { code } = e.detail; + + // 绑定手机号 + const params = { wechatPhoneCode: code, clientId: clientId }; + const res = await bindUserPhone(params); + if (res.data) { + // 登录成功后,触发登录成功事件 + uni.$emit(NOTICE_EVENT_LOGIN_SUCCESS); + resolve(); + } else { + console.log("绑定手机号失败"); + removeAccessToken(); + reject(); + } + }); + }); +}; + +/// 检查手机号登录 +export const onCheckPhoneLogin = async () => { + return new Promise(async (resolve) => { + await refreshAuthLogin().then(async () => { + // 刷新成功后,检查手机号是否绑定 + const access_token = getAccessToken(); + const checkRes = await checkUserPhone({ + token: access_token, + }); + + if (checkRes.data) { + // 登录成功后,触发登录成功事件 + uni.$emit(NOTICE_EVENT_LOGIN_SUCCESS); + resolve(false); + } else { + resolve(true); + } + }); + }); +}; + +// apple登录 +export const onAppleLogin = async (e) => { + return new Promise(async (resolve) => { + await refreshAuthLogin() + .then(() => { + // 登录成功后,触发登录成功事件 + uni.$emit(NOTICE_EVENT_LOGIN_SUCCESS); + resolve(true); + }) + .catch(() => { + resolve(false); + }); + }); +}; + +// 刷新 token +export const refreshToken = async () => { + await checkRefreshToken(); +}; diff --git a/src/main.ts b/src/main.ts index f7d96d0..1dcc81b 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,9 +1,11 @@ import { createApp } from "vue"; import App from "./App.vue"; import { i18n } from "./i18n"; -import { pinia } from "./stores"; +import * as Pinia from "pinia"; import { router } from "./router"; import "vant/lib/index.css"; import "@/styles/main.css"; +const pinia = Pinia.createPinia(); + createApp(App).use(pinia).use(i18n).use(router).mount("#app"); diff --git a/src/store/index.ts b/src/store/index.ts new file mode 100644 index 0000000..49d8f6a --- /dev/null +++ b/src/store/index.ts @@ -0,0 +1 @@ +export * from "./modules"; diff --git a/src/store/modules/app.ts b/src/store/modules/app.ts new file mode 100644 index 0000000..d6dece4 --- /dev/null +++ b/src/store/modules/app.ts @@ -0,0 +1,26 @@ +import { defineStore } from "pinia"; +import { devUrl, wssDevUrl } from "../../request/base/baseUrl"; + +export const useAppStore = defineStore("app", { + state() { + return { + sceneId: "", // 分身场景id + serverConfig: { // 服务器配置 + baseUrl: devUrl, // 服务器基础地址 + wssUrl: wssDevUrl, // 服务器ws地址 + }, + }; + }, + getters: {}, + + actions: { + setSceneId(data) { + this.sceneId = data; + }, + setServerConfig(data) { + this.serverConfig = data; + }, + }, + + unistorage: true, +}); diff --git a/src/store/modules/index.ts b/src/store/modules/index.ts new file mode 100644 index 0000000..c87793d --- /dev/null +++ b/src/store/modules/index.ts @@ -0,0 +1,6 @@ +import { useAppStore } from "./app"; +import { useSelectedDateStore } from "./selectedDate"; +import { usePictureStore } from "./picture"; +import { useLocationStore } from "./location"; + +export { useAppStore, useSelectedDateStore, usePictureStore, useLocationStore }; diff --git a/src/store/modules/location.ts b/src/store/modules/location.ts new file mode 100644 index 0000000..b00326e --- /dev/null +++ b/src/store/modules/location.ts @@ -0,0 +1,19 @@ +import { defineStore } from "pinia"; + +export const useLocationStore = defineStore("location", { + state() { + return { + latitude: 0, // 纬度 + longitude: 0, // 经度 + }; + }, + + actions: { + setLocationData(data) { + this.latitude = data.latitude; + this.longitude = data.longitude; + }, + }, + + unistorage: true, +}); diff --git a/src/store/modules/picture.ts b/src/store/modules/picture.ts new file mode 100644 index 0000000..fb44816 --- /dev/null +++ b/src/store/modules/picture.ts @@ -0,0 +1,17 @@ +import { defineStore } from "pinia"; + +export const usePictureStore = defineStore("picture", { + state() { + return { + previewImageData: [], // 预览图片数据 + }; + }, + + actions: { + setPreviewImageData(data) { + this.previewImageData = data; + }, + }, + + unistorage: true, +}); diff --git a/src/store/modules/selectedDate.ts b/src/store/modules/selectedDate.ts new file mode 100644 index 0000000..c13eac5 --- /dev/null +++ b/src/store/modules/selectedDate.ts @@ -0,0 +1,21 @@ +import { defineStore } from "pinia"; + +export const useSelectedDateStore = defineStore("selectedDate", { + state() { + return { + selectedDate: { + startDate: "", + endDate: "", + totalDays: 1, + }, + }; + }, + + actions: { + setData(data) { + this.selectedDate = data; + }, + }, + + unistorage: true, +}); diff --git a/src/stores/index.ts b/src/stores/index.ts deleted file mode 100644 index cafea68..0000000 --- a/src/stores/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { createPinia } from "pinia"; - -export const pinia = createPinia();