Merge main into master

This commit is contained in:
MaDaLei 2026-04-12 23:07:00 +08:00
commit 3e01102898
281 changed files with 29232 additions and 25 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
node_modules/

21
.uniapp-temp/.gitignore vendored Normal file
View File

@ -0,0 +1,21 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
.DS_Store
dist
*.local
# Editor directories and files
.idea
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

20
.uniapp-temp/index.html Normal file
View File

@ -0,0 +1,20 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<script>
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
CSS.supports('top: constant(a)'))
document.write(
'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
(coverSupport ? ', viewport-fit=cover' : '') + '" />')
</script>
<title></title>
<!--preload-links-->
<!--app-context-->
</head>
<body>
<div id="app"><!--app-html--></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>

71
.uniapp-temp/package.json Normal file
View File

@ -0,0 +1,71 @@
{
"name": "uni-preset-vue",
"version": "0.0.0",
"scripts": {
"dev:custom": "uni -p",
"dev:h5": "uni",
"dev:h5:ssr": "uni --ssr",
"dev:mp-alipay": "uni -p mp-alipay",
"dev:mp-baidu": "uni -p mp-baidu",
"dev:mp-jd": "uni -p mp-jd",
"dev:mp-kuaishou": "uni -p mp-kuaishou",
"dev:mp-lark": "uni -p mp-lark",
"dev:mp-qq": "uni -p mp-qq",
"dev:mp-toutiao": "uni -p mp-toutiao",
"dev:mp-harmony": "uni -p mp-harmony",
"dev:mp-weixin": "uni -p mp-weixin",
"dev:mp-xhs": "uni -p mp-xhs",
"dev:quickapp-webview": "uni -p quickapp-webview",
"dev:quickapp-webview-huawei": "uni -p quickapp-webview-huawei",
"dev:quickapp-webview-union": "uni -p quickapp-webview-union",
"build:custom": "uni build -p",
"build:h5": "uni build",
"build:h5:ssr": "uni build --ssr",
"build:mp-alipay": "uni build -p mp-alipay",
"build:mp-baidu": "uni build -p mp-baidu",
"build:mp-jd": "uni build -p mp-jd",
"build:mp-kuaishou": "uni build -p mp-kuaishou",
"build:mp-lark": "uni build -p mp-lark",
"build:mp-qq": "uni build -p mp-qq",
"build:mp-toutiao": "uni build -p mp-toutiao",
"build:mp-harmony": "uni build -p mp-harmony",
"build:mp-weixin": "uni build -p mp-weixin",
"build:mp-xhs": "uni build -p mp-xhs",
"build:quickapp-webview": "uni build -p quickapp-webview",
"build:quickapp-webview-huawei": "uni build -p quickapp-webview-huawei",
"build:quickapp-webview-union": "uni build -p quickapp-webview-union",
"type-check": "vue-tsc --noEmit"
},
"dependencies": {
"@dcloudio/uni-app": "3.0.0-4080420251103001",
"@dcloudio/uni-app-harmony": "3.0.0-4080420251103001",
"@dcloudio/uni-app-plus": "3.0.0-4080420251103001",
"@dcloudio/uni-components": "3.0.0-4080420251103001",
"@dcloudio/uni-h5": "3.0.0-4080420251103001",
"@dcloudio/uni-mp-alipay": "3.0.0-4080420251103001",
"@dcloudio/uni-mp-baidu": "3.0.0-4080420251103001",
"@dcloudio/uni-mp-harmony": "3.0.0-4080420251103001",
"@dcloudio/uni-mp-jd": "3.0.0-4080420251103001",
"@dcloudio/uni-mp-kuaishou": "3.0.0-4080420251103001",
"@dcloudio/uni-mp-lark": "3.0.0-4080420251103001",
"@dcloudio/uni-mp-qq": "3.0.0-4080420251103001",
"@dcloudio/uni-mp-toutiao": "3.0.0-4080420251103001",
"@dcloudio/uni-mp-weixin": "3.0.0-4080420251103001",
"@dcloudio/uni-mp-xhs": "3.0.0-4080420251103001",
"@dcloudio/uni-quickapp-webview": "3.0.0-4080420251103001",
"vue": "^3.4.21",
"vue-i18n": "^9.1.9"
},
"devDependencies": {
"@dcloudio/types": "^3.4.8",
"@dcloudio/uni-automator": "3.0.0-4080420251103001",
"@dcloudio/uni-cli-shared": "3.0.0-4080420251103001",
"@dcloudio/uni-stacktracey": "3.0.0-4080420251103001",
"@dcloudio/vite-plugin-uni": "3.0.0-4080420251103001",
"@vue/tsconfig": "^0.1.3",
"@vue/runtime-core": "^3.4.21",
"typescript": "^4.9.4",
"vite": "5.2.8",
"vue-tsc": "^1.0.24"
}
}

10
.uniapp-temp/shims-uni.d.ts vendored Normal file
View File

@ -0,0 +1,10 @@
/// <reference types='@dcloudio/types' />
import 'vue'
declare module '@vue/runtime-core' {
type Hooks = App.AppInstance & Page.PageInstance;
interface ComponentCustomOptions extends Hooks {
}
}

13
.uniapp-temp/src/App.vue Normal file
View File

@ -0,0 +1,13 @@
<script setup lang="ts">
import { onLaunch, onShow, onHide } from "@dcloudio/uni-app";
onLaunch(() => {
console.log("App Launch");
});
onShow(() => {
console.log("App Show");
});
onHide(() => {
console.log("App Hide");
});
</script>
<style></style>

8
.uniapp-temp/src/env.d.ts vendored Normal file
View File

@ -0,0 +1,8 @@
/// <reference types="vite/client" />
declare module '*.vue' {
import { DefineComponent } from 'vue'
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types
const component: DefineComponent<{}, {}, any>
export default component
}

8
.uniapp-temp/src/main.ts Normal file
View File

@ -0,0 +1,8 @@
import { createSSRApp } from "vue";
import App from "./App.vue";
export function createApp() {
const app = createSSRApp(App);
return {
app,
};
}

View File

@ -0,0 +1,72 @@
{
"name" : "",
"appid" : "",
"description" : "",
"versionName" : "1.0.0",
"versionCode" : "100",
"transformPx" : false,
/* 5+App */
"app-plus" : {
"usingComponents" : true,
"nvueStyleCompiler" : "uni-app",
"compilerVersion" : 3,
"splashscreen" : {
"alwaysShowBeforeRender" : true,
"waiting" : true,
"autoclose" : true,
"delay" : 0
},
/* */
"modules" : {},
/* */
"distribute" : {
/* android */
"android" : {
"permissions" : [
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
"<uses-feature android:name=\"android.hardware.camera\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
]
},
/* ios */
"ios" : {},
/* SDK */
"sdkConfigs" : {}
}
},
/* */
"quickapp" : {},
/* */
"mp-weixin" : {
"appid" : "",
"setting" : {
"urlCheck" : false
},
"usingComponents" : true
},
"mp-alipay" : {
"usingComponents" : true
},
"mp-baidu" : {
"usingComponents" : true
},
"mp-toutiao" : {
"usingComponents" : true
},
"uniStatistics": {
"enable": false
},
"vueVersion" : "3"
}

View File

@ -0,0 +1,16 @@
{
"pages": [ //pageshttps://uniapp.dcloud.io/collocation/pages
{
"path": "pages/index/index",
"style": {
"navigationBarTitleText": "uni-app"
}
}
],
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "uni-app",
"navigationBarBackgroundColor": "#F8F8F8",
"backgroundColor": "#F8F8F8"
}
}

View File

@ -0,0 +1,41 @@
<template>
<view class="content">
<image class="logo" src="/static/logo.png" />
<view class="text-area">
<text class="title">{{ title }}</text>
</view>
</view>
</template>
<script setup lang="ts">
import { ref } from 'vue'
const title = ref('Hello')
</script>
<style>
.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.logo {
height: 200rpx;
width: 200rpx;
margin-top: 200rpx;
margin-left: auto;
margin-right: auto;
margin-bottom: 50rpx;
}
.text-area {
display: flex;
justify-content: center;
}
.title {
font-size: 36rpx;
color: #8f8f94;
}
</style>

6
.uniapp-temp/src/shime-uni.d.ts vendored Normal file
View File

@ -0,0 +1,6 @@
export {}
declare module "vue" {
type Hooks = App.AppInstance & Page.PageInstance;
interface ComponentCustomOptions extends Hooks {}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

76
.uniapp-temp/src/uni.scss Normal file
View File

@ -0,0 +1,76 @@
/**
* 这里是uni-app内置的常用样式变量
*
* uni-app 官方扩展插件及插件市场https://ext.dcloud.net.cn上很多三方插件均使用了这些样式变量
* 如果你是插件开发者建议你使用scss预处理并在插件代码中直接使用这些变量无需 import 这个文件方便用户通过搭积木的方式开发整体风格一致的App
*
*/
/**
* 如果你是App开发者插件使用者你可以通过修改这些变量来定制自己的插件主题实现自定义主题功能
*
* 如果你的项目同样使用了scss预处理你也可以直接在你的 scss 代码中使用如下变量同时无需 import 这个文件
*/
/* 颜色变量 */
/* 行为相关颜色 */
$uni-color-primary: #007aff;
$uni-color-success: #4cd964;
$uni-color-warning: #f0ad4e;
$uni-color-error: #dd524d;
/* 文字基本颜色 */
$uni-text-color: #333; // 基本色
$uni-text-color-inverse: #fff; // 反色
$uni-text-color-grey: #999; // 辅助灰色如加载更多的提示信息
$uni-text-color-placeholder: #808080;
$uni-text-color-disable: #c0c0c0;
/* 背景颜色 */
$uni-bg-color: #fff;
$uni-bg-color-grey: #f8f8f8;
$uni-bg-color-hover: #f1f1f1; // 点击状态颜色
$uni-bg-color-mask: rgba(0, 0, 0, 0.4); // 遮罩颜色
/* 边框颜色 */
$uni-border-color: #c8c7cc;
/* 尺寸变量 */
/* 文字尺寸 */
$uni-font-size-sm: 12px;
$uni-font-size-base: 14px;
$uni-font-size-lg: 16;
/* 图片尺寸 */
$uni-img-size-sm: 20px;
$uni-img-size-base: 26px;
$uni-img-size-lg: 40px;
/* Border Radius */
$uni-border-radius-sm: 2px;
$uni-border-radius-base: 3px;
$uni-border-radius-lg: 6px;
$uni-border-radius-circle: 50%;
/* 水平间距 */
$uni-spacing-row-sm: 5px;
$uni-spacing-row-base: 10px;
$uni-spacing-row-lg: 15px;
/* 垂直间距 */
$uni-spacing-col-sm: 4px;
$uni-spacing-col-base: 8px;
$uni-spacing-col-lg: 12px;
/* 透明度 */
$uni-opacity-disabled: 0.3; // 组件禁用态的透明度
/* 文章场景相关 */
$uni-color-title: #2c405a; // 文章标题颜色
$uni-font-size-title: 20px;
$uni-color-subtitle: #555; // 二级标题颜色
$uni-font-size-subtitle: 18px;
$uni-color-paragraph: #3f536e; // 文章段落颜色
$uni-font-size-paragraph: 15px;

View File

@ -0,0 +1,13 @@
{
"extends": "@vue/tsconfig/tsconfig.json",
"compilerOptions": {
"sourceMap": true,
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
},
"lib": ["esnext", "dom"],
"types": ["@dcloudio/types"]
},
"include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"]
}

View File

@ -0,0 +1,7 @@
import { defineConfig } from "vite";
import uni from "@dcloudio/vite-plugin-uni";
// https://vitejs.dev/config/
export default defineConfig({
plugins: [uni()],
});

63
App.vue Normal file
View File

@ -0,0 +1,63 @@
<script>
export default {
onLaunch() {
console.log('App Launch')
},
onShow() {
console.log('App Show')
},
onHide() {
console.log('App Hide')
}
}
</script>
<style>
@import './uni.scss';
/* 全局样式 */
page {
background-color: #f5f5f5;
font-size: 14px;
color: #333333;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
box-sizing: border-box;
}
/* 通用卡片 */
.card {
background: #ffffff;
border-radius: 12px;
padding: 16px;
margin: 12px 16px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
}
/* 通用按钮样式 */
.btn-primary {
background: #07c160 !important;
border-color: #07c160 !important;
color: #ffffff !important;
}
.btn-default {
background: #ffffff !important;
border-color: #eeeeee !important;
color: #333333 !important;
}
/* 通用标题 */
.section-title {
font-size: 15px;
font-weight: 600;
color: #333333;
margin-bottom: 12px;
}
/* 通用分割线 */
.divider {
height: 1px;
background: #eeeeee;
margin: 12px 0;
}
</style>

119
README.md
View File

@ -1,37 +1,106 @@
# petstore-frontend
# 宠伴生活馆 - UniApp 项目
#### 介绍
宠伴生活馆
从 H5 (Vite+Vue3+Vant) 迁移到 UniApp+Vue3用于生成微信小程序。
#### 软件架构
软件架构说明
## 项目结构
```
frontend/
├── pages/
│ ├── login/login.vue # 登录注册页
│ ├── home/home.vue # 首页:预约列表
│ ├── report/report.vue # 填写洗美报告
│ ├── report-view/reportView.vue # 报告查看页(独立链接)
│ └── mine/
│ ├── mine.vue # 我的
│ ├── staff.vue # 员工管理
│ ├── service-type.vue # 服务类型管理
│ ├── store.vue # 店铺设置
│ ├── my-reports.vue # 我的报告列表
│ └── my-orders.vue # 我的订单
├── static/
│ └── tab-*.svg # tabBar 图标
├── utils/
│ └── api.js # API 封装uni.request
├── pages.json # 路由配置
├── manifest.json # 小程序配置
├── vite.config.js
├── package.json
└── uni.scss # 全局样式变量
```
#### 安装教程
## 快速开始
1. xxxx
2. xxxx
3. xxxx
### 1. 安装依赖
#### 使用说明
```bash
cd /Users/wac/Desktop/www/_src/petstore/frontend
npm install
```
1. xxxx
2. xxxx
3. xxxx
### 2. 安装图标(自动创建 tabBar 图标)
#### 参与贡献
```bash
bash setup-icons.sh
```
1. Fork 本仓库
2. 新建 Feat_xxx 分支
3. 提交代码
4. 新建 Pull Request
这会生成 6 个 PNG 图标文件到 `static/` 目录。
> **注意:** 如果 bash 脚本执行失败Python3 找不到),手动将 `static/` 下的 `.svg` 文件改名为 `.png` 并替换。
#### 特技
### 3. 配置 manifest.json
1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
打开 `manifest.json`,填写你的微信小程序 AppID
```json
"mp-weixin": {
"appid": "your-appid-here"
}
```
### 4. 启动开发服务器
```bash
# 微信小程序开发
npm run dev:mp-weixin
# H5 开发(浏览器预览)
npm run dev:h5
```
微信小程序编译产物在 `dist/dev/mp-weixin/`,用微信开发者工具打开该目录。
### 5. 配置后端域名
开发阶段:在微信开发者工具中勾选「不校验合法域名」(设置 → 项目设置)
生产阶段:在微信公众平台后台添加以下合法域名:
- `http://localhost:8080`(开发用)
- 你的实际后端域名
## API 配置
- 后端 baseURL`http://localhost:8080/api`
- 图片路径拼接:`http://localhost:8080` + 数据库中的路径
- 本地存储:`uni.setStorageSync('petstore_user')` / `uni.setStorageSync('petstore_store')`
## 页面说明
| 页面 | 路径 | 说明 |
|------|------|------|
| 登录 | /pages/login/login | Tab切换员工登录/老板登录/注册老板/注册员工 |
| 首页 | /pages/home/home | 预约列表 Tab待确认/进行中/已完成)+ 新建预约 |
| 洗美报告 | /pages/report/report | 填写报告 + 提交后显示链接+二维码 |
| 报告页 | /pages/report-view/reportView | 独立访问的报告页token=xxx |
| 我的 | /pages/mine/mine | 个人中心,老板有额外菜单 |
| 员工管理 | /pages/mine/staff | 老板功能:管理员工 |
| 服务类型 | /pages/mine/service-type | 老板功能:服务类型 CRUD |
| 店铺设置 | /pages/mine/store | 老板功能:店铺信息 |
| 我的报告 | /pages/mine/my-reports | 报告列表(相册网格) |
| 我的订单 | /pages/mine/my-orders | 订单列表 |
## 登录说明
- 登录成功后,`petstore_user` 和 `petstore_store` 存入本地存储
- 用户 ID 决定能看到哪些数据(员工看自己,老板看全店)
- role = 'boss' 时,显示员工管理/服务类型/店铺设置菜单

BIN
dist/.DS_Store vendored Normal file

Binary file not shown.

21
dist/assets/ReportView-BiTrIIba.js vendored Normal file

File diff suppressed because one or more lines are too long

1
dist/assets/ReportView-Cb7Ywokx.css vendored Normal file

File diff suppressed because one or more lines are too long

1
dist/assets/main-CAB6fnD_.css vendored Normal file

File diff suppressed because one or more lines are too long

1
dist/assets/main-CtAgA79T.js vendored Normal file

File diff suppressed because one or more lines are too long

1
dist/assets/report-CedwYfrt.js vendored Normal file
View File

@ -0,0 +1 @@
import{S as a,R as t,U as e}from"./ReportView-BiTrIIba.js";const p=a(t);p.use(e);p.mount("#app");

View File

@ -0,0 +1 @@
.app-icon[data-v-385dda18]{display:inline-flex;align-items:center;justify-content:center}.app-icon svg[data-v-385dda18]{width:100%;height:100%}

View File

@ -0,0 +1 @@
import{q as e,g as C,z as s,w as o,c as M,F as r,y as t,v as a,f as n}from"./index-DrZc8biM.js";import{_ as p}from"./_plugin-vue_export-helper.2L545UbL.js";const H=p({__name:"AppIcon",props:{name:{type:String,required:!0},size:{type:Number,default:18},color:{type:String,default:"#475569"}},setup(p){const H=p,i={home:["M3 10.5L12 3L21 10.5","M6 9.5V20H18V9.5","M10 20V14H14V20"],report:["M7 3.5H14L18 7.5V20.5H7V3.5Z","M14 3.5V7.5H18","M9.5 12H15.5","M9.5 16H14"],mine:["M12 12C14.4853 12 16.5 9.98528 16.5 7.5C16.5 5.01472 14.4853 3 12 3C9.51472 3 7.5 5.01472 7.5 7.5C7.5 9.98528 9.51472 12 12 12Z","M4 20C4.9 16.7 8 14.5 12 14.5C16 14.5 19.1 16.7 20 20"],staff:["M7 11C8.65685 11 10 9.65685 10 8C10 6.34315 8.65685 5 7 5C5.34315 5 4 6.34315 4 8C4 9.65685 5.34315 11 7 11Z","M17 10C18.3807 10 19.5 8.88071 19.5 7.5C19.5 6.11929 18.3807 5 17 5C15.6193 5 14.5 6.11929 14.5 7.5C14.5 8.88071 15.6193 10 17 10Z","M3.5 19C4.1 16.7 5.9 15.2 8.4 15.2C10.9 15.2 12.7 16.7 13.3 19","M14 19C14.4 17.3 15.6 16.2 17.3 16.2C19 16.2 20.2 17.3 20.6 19"],service:["M5 8.5H19","M7.5 8.5V6.5C7.5 5.4 8.4 4.5 9.5 4.5H14.5C15.6 4.5 16.5 5.4 16.5 6.5V8.5","M6.5 8.5L7.2 18.5H16.8L17.5 8.5","M10 12.5L14 12.5"],store:["M4 9L5.5 4.5H18.5L20 9","M5 9V19H19V9","M8.5 19V14H15.5V19"],profile:["M12 12C14.4853 12 16.5 9.98528 16.5 7.5C16.5 5.01472 14.4853 3 12 3C9.51472 3 7.5 5.01472 7.5 7.5C7.5 9.98528 9.51472 12 12 12Z","M4.5 20C5.5 16.9 8.4 14.8 12 14.8C15.6 14.8 18.5 16.9 19.5 20"],orders:["M6 5H18","M6 9H18","M6 13H14","M6 3.5H18C18.8 3.5 19.5 4.2 19.5 5V19C19.5 19.8 18.8 20.5 18 20.5H6C5.2 20.5 4.5 19.8 4.5 19V5C4.5 4.2 5.2 3.5 6 3.5Z"],logout:["M10 6V4.5H5V19.5H10V18","M14 8L18 12L14 16","M18 12H9"],back:["M15 5L8 12L15 19"],close:["M6 6L18 18","M18 6L6 18"],camera:["M4.5 8.5H8L9.5 6.5H14.5L16 8.5H19.5V18.5H4.5V8.5Z","M12 16C13.933 16 15.5 14.433 15.5 12.5C15.5 10.567 13.933 9 12 9C10.067 9 8.5 10.567 8.5 12.5C8.5 14.433 10.067 16 12 16"],phone:["M2.25 6.75C2.25 15.03 8.97 21.75 17.25 21.75H19.5C20.7426 21.75 21.75 20.7426 21.75 19.5V19.128C21.75 18.612 21.399 18.162 20.898 18.03L16.475 16.924C16.035 16.814 15.573 16.979 15.303 17.354L14.333 18.647C14.051 19.047 13.53 19.188 13.098 19.035C10.834 18.208 8.792 16.166 7.965 13.902C7.812 13.47 7.953 12.949 8.353 12.667L9.646 11.697C10.021 11.427 10.186 10.965 10.076 10.525L8.97 6.102C8.838 5.601 8.388 5.25 7.872 5.25H4.5C3.25736 5.25 2.25 6.25736 2.25 7.5V6.75Z"],pin:["M15 10.5a3 3 0 11-6 0 3 3 0 016 0z","M19.5 10.5c0 7.142-7.5 11.25-7.5 11.25S4.5 17.642 4.5 10.5a7.5 7.5 0 1115 0z"]},l=e(()=>i[H.name]||i.profile);return(e,H)=>{const i=n;return C(),s(i,{class:"app-icon",style:a({width:`${p.size}px`,height:`${p.size}px`})},{default:o(()=>[(C(),M("svg",{viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg"},[(C(!0),M(r,null,t(l.value,(e,s)=>(C(),M("path",{key:`${p.name}-${s}`,d:e,stroke:p.color,"stroke-width":"1.9","stroke-linecap":"round","stroke-linejoin":"round"},null,8,["d","stroke"]))),128))]))]),_:1},8,["style"])}}},[["__scopeId","data-v-385dda18"]]);export{H as A};

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
.login-page[data-v-1ba576fe]{min-height:100vh;background:radial-gradient(circle at top left,#22c55e,#16a34a 46%,#15803d);display:flex;flex-direction:column;padding:60px 32px 32px}.login-logo[data-v-1ba576fe]{text-align:center;margin-bottom:44px}.login-logo-text[data-v-1ba576fe]{font-size:30px;font-weight:800;color:#fff;letter-spacing:2px;text-shadow:0 4px 12px rgba(0,0,0,.18)}.login-logo-sub[data-v-1ba576fe]{font-size:13px;color:rgba(255,255,255,.82);margin-top:6px}.form-title[data-v-1ba576fe]{font-size:18px;font-weight:600;color:#333;margin-bottom:20px;text-align:center}.login-divider[data-v-1ba576fe]{text-align:center;margin:16px 0 12px;color:#999;font-size:13px;position:relative}.login-divider[data-v-1ba576fe]:before,.login-divider[data-v-1ba576fe]:after{content:"";position:absolute;top:50%;width:28%;height:1px;background:#eee}.login-divider[data-v-1ba576fe]:before{left:0}.login-divider[data-v-1ba576fe]:after{right:0}.links[data-v-1ba576fe]{display:flex;justify-content:space-between;font-size:13px}.link[data-v-1ba576fe]{color:#16a34a;font-weight:600;cursor:pointer}.invite-hint[data-v-1ba576fe]{background:#f0f9f4;border:1px solid #b7eb8f;border-radius:8px;padding:12px;font-size:13px;color:#52c41a;margin-bottom:12px}.wechat-icon[data-v-1ba576fe]{margin-right:6px}.success-icon[data-v-1ba576fe]{font-size:60px;text-align:center;margin-bottom:16px}.success-title[data-v-1ba576fe]{font-size:20px;font-weight:600;text-align:center;color:#333;margin-bottom:8px}.success-sub[data-v-1ba576fe]{font-size:14px;color:#999;text-align:center;margin-bottom:24px}.success-info[data-v-1ba576fe]{background:#f9f9f9;border-radius:12px;padding:16px;margin-bottom:20px}.info-row[data-v-1ba576fe]{display:flex;justify-content:space-between;padding:6px 0;font-size:14px}.info-row .label[data-v-1ba576fe]{color:#999}.info-row .value[data-v-1ba576fe]{color:#333;font-weight:500}.sms-field[data-v-1ba576fe]{display:flex;align-items:center;gap:8px;margin-bottom:12px}.sms-input[data-v-1ba576fe]{flex:1}.top-gap-sm[data-v-1ba576fe]{margin-top:12px}.top-gap-md[data-v-1ba576fe]{margin-top:20px}

View File

@ -0,0 +1 @@
.mine-page[data-v-27768e55]{padding-bottom:4.375rem;background:#f5f7fb;min-height:100vh}.user-card[data-v-27768e55]{background:linear-gradient(135deg,#22c55e,#16a34a);border-radius:0 0 24px 24px;padding:24px 16px 22px;color:#fff;cursor:pointer;box-shadow:0 10px 24px rgba(34,197,94,.25)}.user-info[data-v-27768e55]{display:flex;align-items:center;gap:12px}.user-info-content[data-v-27768e55]{flex:1}.user-avatar[data-v-27768e55]{width:58px;height:58px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:24px;overflow:hidden;flex-shrink:0;border:2px solid rgba(255,255,255,.3)}.avatar-img[data-v-27768e55]{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.avatar-initials[data-v-27768e55]{color:#fff;font-size:22px;font-weight:700}.user-name[data-v-27768e55]{font-size:21px;font-weight:700;color:#fff;line-height:1.1}.user-phone[data-v-27768e55]{font-size:14px;opacity:.92;margin-top:4px}.role-pill[data-v-27768e55]{margin-top:8px;display:inline-flex;align-items:center;height:24px;padding:0 10px;border-radius:999px;font-size:12px;font-weight:700;background:rgba(255,255,255,.92);color:#166534}.menu-section[data-v-27768e55]{padding:0 14px;margin-top:12px}.menu-card[data-v-27768e55]{background:#fff;border:1px solid #e6ecf4;border-radius:16px;box-shadow:0 8px 20px rgba(15,23,42,.05);overflow:hidden}.menu-title[data-v-27768e55]{font-size:12px;color:#94a3b8;font-weight:700;padding:12px 14px 8px}.menu-item[data-v-27768e55]{min-height:54px;padding:0 14px;display:flex;align-items:center;justify-content:space-between}.menu-item+.menu-item[data-v-27768e55]{border-top:1px solid #eef2f7}.menu-left[data-v-27768e55]{display:flex;align-items:center;gap:10px}.menu-icon[data-v-27768e55]{width:28px;height:28px;border-radius:8px;background:#f1f5f9;display:inline-flex;align-items:center;justify-content:center;font-size:16px}.menu-text[data-v-27768e55]{font-size:16px;color:#1f2937;font-weight:600}.menu-arrow[data-v-27768e55]{color:#c4cfdd;font-size:18px}.logout-btn[data-v-27768e55]{width:100%;height:44px;display:inline-flex;align-items:center;justify-content:center;gap:6px;border-radius:12px;border:1px solid #fecaca;background:#fff1f2;color:#dc2626;font-size:15px;font-weight:700}

View File

@ -0,0 +1 @@
.orders-page[data-v-be66263e]{padding-bottom:3.75rem}.nav-placeholder[data-v-be66263e]{width:32px}.btn-mt[data-v-be66263e]{margin-top:10px}.orders-hero[data-v-be66263e]{margin-top:12px;padding:14px 16px;border:1px solid #dcefe3;border-radius:14px;background:linear-gradient(135deg,#f3fff7,#ecfbf3)}.hero-title[data-v-be66263e]{font-size:16px;font-weight:700;color:#166534}.hero-sub[data-v-be66263e]{margin-top:4px;font-size:12px;color:#4b5563;line-height:1.45}.orders-nav[data-v-be66263e]{padding:14px 16px;display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:10}.nav-back[data-v-be66263e]{font-size:20px;color:#fff}.nav-title[data-v-be66263e]{font-size:18px;font-weight:700;color:#fff}.order-item[data-v-be66263e]{background:#fff;margin-bottom:12px;border-radius:14px;padding:16px;border:1px solid #e8edf4;box-shadow:0 6px 16px rgba(15,23,42,.05)}.order-head[data-v-be66263e]{display:flex;align-items:center;justify-content:space-between;gap:8px}.order-title[data-v-be66263e]{font-size:15px;font-weight:700;color:#1f2937;margin-bottom:6px}.order-desc[data-v-be66263e]{font-size:13px;color:#6b7280;margin-bottom:10px;display:flex;align-items:center;gap:6px}.desc-icon[data-v-be66263e]{width:18px;height:18px;border-radius:6px;background:#eef2f7;display:inline-flex;align-items:center;justify-content:center}.order-footer[data-v-be66263e]{display:flex;justify-content:space-between;align-items:center}.order-time[data-v-be66263e]{font-size:12px;color:#94a3b8;display:inline-flex;align-items:center;gap:4px}.action-btns[data-v-be66263e]{display:flex;gap:8px;margin-top:10px}

View File

@ -0,0 +1 @@
.my-reports-page[data-v-b92fb009]{padding:0 0 3.75rem}.nav-placeholder[data-v-b92fb009]{width:32px}.nav-home-btn[data-v-b92fb009]{background:rgba(255,255,255,.2);border:1px solid rgba(255,255,255,.35)}.reports-hero[data-v-b92fb009]{margin-top:12px;padding:14px 16px;border:1px solid #dcefe3;border-radius:14px;background:linear-gradient(135deg,#f3fff7,#ecfbf3)}.hero-title[data-v-b92fb009]{font-size:16px;font-weight:700;color:#166534}.hero-sub[data-v-b92fb009]{margin-top:4px;font-size:12px;color:#4b5563;line-height:1.45}.hero-count[data-v-b92fb009]{font-weight:700;color:#16a34a}.placeholder-icon[data-v-b92fb009]{width:36px;height:36px;border-radius:10px;background:#e2e8f0;display:inline-flex;align-items:center;justify-content:center}.report-nav[data-v-b92fb009]{padding:14px 16px;display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:10}.nav-back[data-v-b92fb009]{font-size:20px;color:#fff}.nav-title[data-v-b92fb009]{font-size:18px;font-weight:700;color:#fff}.gallery-grid[data-v-b92fb009]{display:grid;grid-template-columns:1fr 1fr;gap:12px;padding-top:14px}.gallery-item[data-v-b92fb009]{border-radius:14px;overflow:hidden;cursor:pointer;background:#fff;border:1px solid #e8edf4;box-shadow:0 8px 18px rgba(15,23,42,.06)}.gallery-cover[data-v-b92fb009]{position:relative;width:100%;aspect-ratio:1;overflow:hidden}.cover-img[data-v-b92fb009]{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.cover-placeholder[data-v-b92fb009]{width:100%;height:100%;background:#f0ede8;display:flex;align-items:center;justify-content:center}.gallery-overlay[data-v-b92fb009]{position:absolute;bottom:0;left:0;right:0;padding:8px 10px;background:linear-gradient(transparent,rgba(0,0,0,.65));color:#fff}.overlay-name[data-v-b92fb009]{font-size:13px;font-weight:600}.overlay-service[data-v-b92fb009]{font-size:11px;opacity:.9;margin-top:2px}.gallery-meta[data-v-b92fb009]{padding:8px 10px 10px;background:#fff}.meta-chip[data-v-b92fb009]{display:inline-flex;align-items:center;gap:4px;height:22px;padding:0 8px;border-radius:999px;background:#f1f5f9;color:#64748b;font-size:11px}

View File

@ -0,0 +1 @@
.profile-page[data-v-2268527d]{padding-bottom:3.75rem;background:var(--pet-bg, #f5f7fb);min-height:100vh}.nav-placeholder[data-v-2268527d]{width:32px}.profile-nav[data-v-2268527d]{padding:14px 16px 12px;display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:10}.nav-back[data-v-2268527d]{font-size:20px;color:#fff}.nav-title[data-v-2268527d]{font-size:18px;font-weight:700;color:#fff}.profile-hero[data-v-2268527d]{margin:14px 14px 0;padding:18px 16px 14px;background:#fff;border:1px solid #e6ecf4;border-radius:16px;box-shadow:var(--pet-card-shadow, 0 8px 24px rgba(15, 23, 42, .06))}.hero-main-row[data-v-2268527d]{display:flex;align-items:center;gap:14px}.avatar-wrap[data-v-2268527d]{position:relative;flex-shrink:0;-webkit-tap-highlight-color:transparent}.avatar-img[data-v-2268527d],.avatar-placeholder[data-v-2268527d]{width:84px;height:84px;border-radius:50%;border:2px solid #e8edf4;-o-object-fit:cover;object-fit:cover;display:flex;align-items:center;justify-content:center}.avatar-placeholder[data-v-2268527d]{background:rgba(226,232,240,.75)}.avatar-initials[data-v-2268527d]{font-size:30px;font-weight:700;color:#fff}.avatar-badge[data-v-2268527d]{position:absolute;bottom:2px;right:2px;width:28px;height:28px;background:#fff;border-radius:50%;border:1px solid #e2e8f0;display:flex;align-items:center;justify-content:center;box-shadow:0 2px 8px rgba(15,23,42,.08)}.hero-text[data-v-2268527d]{flex:1;min-width:0}.hero-name[data-v-2268527d]{font-size:19px;line-height:1.25;letter-spacing:.02em}.hero-phone[data-v-2268527d]{margin-top:6px;font-size:14px;color:var(--pet-subtext, #6b7280)}.hero-tags[data-v-2268527d]{margin-top:10px}.role-pill[data-v-2268527d]{display:inline-flex;align-items:center;height:26px;padding:0 12px;border-radius:999px;font-size:12px;font-weight:700;background:#fff7ed;color:#c2410c}.role-pill.hero-role.role-staff[data-v-2268527d],.role-pill.role-staff[data-v-2268527d]{background:#ecfdf3;color:#166534}.role-pill-compact[data-v-2268527d]{height:24px;padding:0 10px;font-size:12px}.hero-hint[data-v-2268527d]{margin-top:12px;padding-top:12px;border-top:1px solid #f1f5f9;font-size:12px;color:#94a3b8;text-align:center}.menu-section[data-v-2268527d]{padding:0 14px;margin-top:12px}.menu-card[data-v-2268527d]{background:#fff;border:1px solid #e6ecf4;border-radius:16px;box-shadow:0 8px 20px rgba(15,23,42,.05);overflow:hidden}.menu-title[data-v-2268527d]{font-size:12px;color:#94a3b8;font-weight:700;padding:12px 14px 8px}.menu-item[data-v-2268527d]{min-height:54px;padding:0 14px;display:flex;align-items:center;justify-content:space-between;gap:10px;transition:background .15s ease}.menu-item[data-v-2268527d]:active:not(.menu-item-static){background:#f8fafc}.menu-item+.menu-item[data-v-2268527d]{border-top:1px solid #eef2f7}.menu-item-static[data-v-2268527d]{cursor:default}.menu-left[data-v-2268527d]{display:flex;align-items:center;gap:10px;min-width:0}.menu-icon[data-v-2268527d]{width:28px;height:28px;border-radius:8px;background:#f1f5f9;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.menu-text[data-v-2268527d]{font-size:16px;color:#1f2937;font-weight:600}.menu-right[data-v-2268527d]{display:inline-flex;align-items:center;gap:4px;flex-shrink:0;max-width:55%;justify-content:flex-end}.menu-value[data-v-2268527d]{font-size:14px;color:#64748b;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:right}.menu-arrow[data-v-2268527d]{color:#c4cfdd;font-size:18px;line-height:1}.field-label-gap[data-v-2268527d]{margin-top:12px}.profile-popup-mask[data-v-2268527d]{z-index:3000;align-items:flex-end}.profile-popup-sheet[data-v-2268527d]{width:100%;max-width:100%;max-height:88vh;border-radius:20px 20px 0 0;display:flex;flex-direction:column}.profile-popup-sheet .popup-header[data-v-2268527d]{flex-shrink:0;padding:18px 20px 14px;border-bottom:1px solid #f0f0f0}.profile-popup-sheet .popup-title[data-v-2268527d]{font-size:17px;font-weight:600;color:#1a1a1a}.profile-popup-sheet .popup-close[data-v-2268527d]{width:36px;height:36px;display:flex;align-items:center;justify-content:center;margin:-6px -8px -6px 0;border-radius:10px}.profile-popup-sheet .popup-close[data-v-2268527d]:active{background:#f1f5f9}.profile-popup-sheet .popup-body[data-v-2268527d]{flex:1;overflow-y:auto;padding:16px 20px}.profile-popup-footer[data-v-2268527d]{flex-shrink:0;padding:8px 20px max(env(safe-area-inset-bottom),20px);border-top:1px solid #f1f5f9;background:#fff}.sms-row[data-v-2268527d]{display:flex;align-items:center;gap:8px}.sms-input[data-v-2268527d]{flex:1;min-width:0}.footer-tip[data-v-2268527d]{text-align:center;margin-top:28px;font-size:12px;color:#94a3b8}

View File

@ -0,0 +1 @@
.report-page[data-v-e2283bdf]{padding-bottom:4.375rem}.report-nav[data-v-e2283bdf]{padding:14px 16px;display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:10}.nav-back[data-v-e2283bdf]{font-size:20px;color:#fff}.nav-title[data-v-e2283bdf]{font-size:18px;font-weight:700;color:#fff}.nav-placeholder[data-v-e2283bdf]{width:32px}.report-url-input[data-v-e2283bdf]{margin-top:8px}.btn-ghost[data-v-e2283bdf]{background:#fff!important;color:#666!important;border:1px solid #e0e0e0!important;box-shadow:none!important}.notice-bar[data-v-e2283bdf]{padding:10px 16px;font-size:13px}.notice-bar.success[data-v-e2283bdf]{background:#f8fafc;color:#334155;border-left:3px solid #16a34a}.result-wrap[data-v-e2283bdf],.result-content[data-v-e2283bdf]{padding:0}.result-link-row[data-v-e2283bdf]{display:flex;justify-content:space-between;align-items:center}.qr-wrap[data-v-e2283bdf]{text-align:center;padding:20px;background:#f8fafc;border:1px solid #e8edf4;border-radius:14px;margin:16px 0}.qr-img[data-v-e2283bdf]{width:180px;height:180px}.report-hero[data-v-e2283bdf]{margin-top:12px;padding:12px 14px;border:1px solid #e5ebf3;border-radius:14px;background:#fff}.hero-title[data-v-e2283bdf]{font-size:16px;font-weight:700;color:#1f2937}.hero-sub[data-v-e2283bdf]{margin-top:4px;font-size:12px;color:#6b7280;line-height:1.45}.report-form .form-section[data-v-e2283bdf]{background:#fff;border:1px solid #e5ebf3;border-radius:16px;box-shadow:0 6px 18px rgba(15,23,42,.04);overflow:hidden}.section-title[data-v-e2283bdf]{display:flex;align-items:center;gap:6px;padding:12px 14px 4px;font-size:13px;color:#64748b;font-weight:700}.section-icon[data-v-e2283bdf]{width:18px;height:18px;border-radius:6px;background:#f8fafc;display:inline-flex;align-items:center;justify-content:center;border:1px solid #e2e8f0}.section-body[data-v-e2283bdf]{padding:0 14px 10px}.form-field-wrap[data-v-e2283bdf]{padding:0 0 10px}.field-label[data-v-e2283bdf]{margin:0 0 6px;font-size:13px;color:#64748b;font-weight:600}.photo-row[data-v-e2283bdf]{display:flex;gap:10px}.photo-col[data-v-e2283bdf]{flex:1;min-width:0}.upload-wrap[data-v-e2283bdf]{display:flex;align-items:center;margin-top:6px}.upload-box[data-v-e2283bdf]{width:100%;aspect-ratio:1 / 1;min-height:110px;border:1px dashed #d8e0ea;border-radius:14px;display:flex;flex-direction:column;align-items:center;justify-content:center;color:#94a3b8;cursor:pointer;background:#fbfdff}.upload-icon[data-v-e2283bdf]{width:28px;height:28px;border-radius:8px;background:#f1f5f9;display:inline-flex;align-items:center;justify-content:center;border:1px solid #e2e8f0}.upload-preview[data-v-e2283bdf]{position:relative}.preview-img[data-v-e2283bdf]{width:100%;aspect-ratio:1 / 1;border-radius:14px;-o-object-fit:cover;object-fit:cover;border:1px solid #e8edf4}.preview-remove[data-v-e2283bdf]{position:absolute;top:-6px;right:-6px;width:18px;height:18px;background:rgba(0,0,0,.6);color:#fff;border-radius:50%;font-size:10px;display:flex;align-items:center;justify-content:center}.loading-mask[data-v-e2283bdf]{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.4);display:flex;align-items:center;justify-content:center;z-index:999}.loading-box[data-v-e2283bdf]{background:#fff;padding:20px 40px;border-radius:12px;font-size:15px}.picker-field[data-v-e2283bdf]{display:flex;align-items:center;background:#fff;border-radius:12px;padding:8px 12px;color:#333;min-height:44px}.form-section[data-v-e2283bdf]{margin:12px 0 0}.form-submit-wrap[data-v-e2283bdf]{padding:0 0 16px}.field-label-tight[data-v-e2283bdf]{margin-bottom:0}.upload-tip[data-v-e2283bdf]{font-size:12px;margin-top:6px;color:#64748b}.remark-textarea[data-v-e2283bdf]{min-height:120px;line-height:1.5}.report-submit-btn[data-v-e2283bdf]{margin-top:6px!important}.result-content .van-button--primary[data-v-e2283bdf]{box-shadow:0 6px 14px rgba(34,197,94,.2)!important}

View File

@ -0,0 +1 @@
.st-page[data-v-663ba7c1]{padding-bottom:3.75rem}.nav-placeholder[data-v-663ba7c1]{width:32px}.add-btn-wrap[data-v-663ba7c1]{padding:0}.card-section[data-v-663ba7c1]{margin:0}.st-list[data-v-663ba7c1]{border-radius:16px;overflow:hidden}.st-cell[data-v-663ba7c1]{min-height:52px}.st-name-row[data-v-663ba7c1]{display:flex;align-items:center;gap:8px}.st-dot[data-v-663ba7c1]{width:24px;height:24px;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;background:#f1f5f9}.st-name[data-v-663ba7c1]{font-size:15px;font-weight:600;color:#1f2937}.system-tag[data-v-663ba7c1]{margin-left:8px}.st-swipe-wrap[data-v-663ba7c1]{overflow:hidden;border-radius:12px}.st-swipe-wrap+.st-swipe-wrap[data-v-663ba7c1]{border-top:1px solid #eef2f7}.st-swipe-track[data-v-663ba7c1]{display:flex;width:calc(100% + 76px);transform:translate(0);transition:transform .2s ease}.st-swipe-wrap.is-open .st-swipe-track[data-v-663ba7c1]{transform:translate(-76px)}.swipe-delete-btn[data-v-663ba7c1]{width:76px;background:#ef4444;color:#fff;display:inline-flex;align-items:center;justify-content:center;font-size:13px;font-weight:700;flex-shrink:0}.st-nav[data-v-663ba7c1]{padding:14px 16px;display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:10}.nav-back[data-v-663ba7c1]{font-size:20px;color:#fff}.nav-title[data-v-663ba7c1]{font-size:18px;font-weight:700;color:#fff}.popup-mask[data-v-663ba7c1]{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.5);z-index:100;display:flex;align-items:flex-end;justify-content:center}.popup-content[data-v-663ba7c1]{background:#fff;border-radius:16px 16px 0 0;width:430px;max-width:100%;display:flex;flex-direction:column}.popup-header[data-v-663ba7c1]{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid #f0f0f0}.popup-title[data-v-663ba7c1]{font-size:16px;font-weight:600}.popup-close[data-v-663ba7c1]{font-size:18px;color:#999}.popup-body[data-v-663ba7c1]{padding:16px 20px}.popup-footer[data-v-663ba7c1]{padding:12px 20px 20px}.popup-desc[data-v-663ba7c1]{font-size:12px;color:#6b7280;line-height:1.45;margin-bottom:10px}.popup-actions[data-v-663ba7c1]{display:flex;align-items:center;gap:10px}.btn-ghost[data-v-663ba7c1]{width:96px;border:1px solid #dbe3ee!important;background:#fff!important;color:#64748b!important}.btn-confirm[data-v-663ba7c1]{flex:1}

View File

@ -0,0 +1 @@
.staff-page[data-v-8ecf2675]{padding-bottom:3.75rem}.nav-placeholder[data-v-8ecf2675]{width:32px}.add-btn-wrap[data-v-8ecf2675]{padding:0}.card-section[data-v-8ecf2675]{margin:0}.invite-card[data-v-8ecf2675]{overflow:hidden}.staff-cell[data-v-8ecf2675]{min-height:58px}.invite-code-cell[data-v-8ecf2675]{display:flex;align-items:center;gap:8px}.invite-code[data-v-8ecf2675]{font-family:monospace;font-size:15px;color:#16a34a;font-weight:700;letter-spacing:2px}.staff-info-row[data-v-8ecf2675]{display:flex;align-items:center;gap:12px;flex:1}.staff-name[data-v-8ecf2675]{font-weight:700;font-size:15px;color:#1f2937}.staff-meta[data-v-8ecf2675]{font-size:12px;color:#6b7280}.staff-swipe-wrap[data-v-8ecf2675]{position:relative;overflow:hidden;border-radius:12px;background:#fff}.staff-swipe-wrap+.staff-swipe-wrap[data-v-8ecf2675]{border-top:1px solid #eef2f7}.staff-main[data-v-8ecf2675]{position:relative;z-index:2;transform:translate(0);transition:transform .2s ease;background:#fff}.staff-swipe-wrap.is-open .staff-main[data-v-8ecf2675]{transform:translate(-76px)}.swipe-delete-btn[data-v-8ecf2675]{position:absolute;right:0;top:0;bottom:0;width:76px;background:#ef4444;color:#fff;display:inline-flex;align-items:center;justify-content:center;font-size:13px;font-weight:700;flex-shrink:0}.staff-nav[data-v-8ecf2675]{padding:14px 16px;display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:10}.nav-back[data-v-8ecf2675]{font-size:20px;color:#fff}.nav-title[data-v-8ecf2675]{font-size:18px;font-weight:700;color:#fff}.avatar[data-v-8ecf2675]{width:42px;height:42px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:18px;color:#fff;overflow:hidden;flex-shrink:0;border:1px solid #e8edf4}.avatar-img[data-v-8ecf2675]{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.avatar-initials[data-v-8ecf2675]{font-weight:600}.popup-mask[data-v-8ecf2675]{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.5);z-index:100;display:flex;align-items:flex-end;justify-content:center}.popup-content[data-v-8ecf2675]{background:#fff;border-radius:16px 16px 0 0;width:430px;max-width:100%;display:flex;flex-direction:column}.popup-header[data-v-8ecf2675]{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid #f0f0f0}.popup-title[data-v-8ecf2675]{font-size:16px;font-weight:600}.popup-close[data-v-8ecf2675]{font-size:18px;color:#999}.popup-body[data-v-8ecf2675]{padding:16px 20px}.popup-footer[data-v-8ecf2675]{padding:12px 20px 20px}.popup-desc[data-v-8ecf2675]{font-size:12px;color:#6b7280;line-height:1.45;margin-bottom:10px}.popup-actions[data-v-8ecf2675]{display:flex;align-items:center;gap:10px}.btn-ghost[data-v-8ecf2675]{width:96px;border:1px solid #dbe3ee!important;background:#fff!important;color:#64748b!important}.btn-confirm[data-v-8ecf2675]{flex:1}

View File

@ -0,0 +1 @@
.store-page[data-v-eb0ed336]{min-height:100vh;background:var(--pet-bg, #f5f7fb);padding-bottom:3.75rem}.nav-placeholder[data-v-eb0ed336]{width:32px}.store-nav[data-v-eb0ed336]{padding:14px 16px 12px;display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:10}.nav-back[data-v-eb0ed336]{font-size:20px;color:#fff}.nav-title[data-v-eb0ed336]{font-size:18px;font-weight:700;color:#fff}.store-body[data-v-eb0ed336]{padding:12px 14px 28px}.store-hero[data-v-eb0ed336]{display:flex;gap:12px;align-items:flex-start;padding:16px 14px;border-radius:16px;background:linear-gradient(135deg,#fff,#ecfdf3 55%,#f0fdf4);border:1px solid #d8f0e2;box-shadow:var(--pet-card-shadow, 0 8px 24px rgba(15, 23, 42, .06));margin-bottom:14px}.store-hero-icon[data-v-eb0ed336]{width:44px;height:44px;border-radius:12px;background:rgba(255,255,255,.9);border:1px solid #bbf7d0;display:flex;align-items:center;justify-content:center;flex-shrink:0}.store-hero-title[data-v-eb0ed336]{font-size:17px;font-weight:700;color:#14532d;letter-spacing:.02em}.store-hero-desc[data-v-eb0ed336]{margin-top:6px;font-size:13px;line-height:1.55;color:#4b5563}.store-card[data-v-eb0ed336]{background:#fff;border:1px solid #e6ecf4;border-radius:16px;box-shadow:0 8px 22px rgba(15,23,42,.06);padding:4px 4px 8px;overflow:hidden}.store-card-head[data-v-eb0ed336]{padding:14px 14px 6px}.store-card-kicker[data-v-eb0ed336]{font-size:12px;font-weight:700;color:#94a3b8;letter-spacing:.04em}.store-field[data-v-eb0ed336]{padding:12px 12px 4px}.store-field+.store-field[data-v-eb0ed336]{border-top:1px solid #f1f5f9}.store-field-label[data-v-eb0ed336]{display:flex;align-items:center;gap:8px;margin-bottom:8px;font-size:14px;font-weight:600;color:#374151}.store-ico[data-v-eb0ed336]{width:28px;height:28px;border-radius:8px;background:#f1f5f9;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.store-input[data-v-eb0ed336]{margin-top:0!important}.address-row[data-v-eb0ed336]{display:flex;align-items:stretch;gap:10px}.address-input[data-v-eb0ed336]{flex:1;min-width:0}.pick-location-btn[data-v-eb0ed336]{flex-shrink:0;padding:0 14px;min-height:44px;border-radius:12px;border:1px solid #16a34a;background:#f0fdf4;color:#15803d;font-size:14px;font-weight:600;line-height:44px;-webkit-tap-highlight-color:transparent}.pick-location-btn[data-v-eb0ed336]:active:not([disabled]){opacity:.92;transform:translateY(1px)}.pick-location-btn[disabled][data-v-eb0ed336]{opacity:.55}.geo-hint[data-v-eb0ed336]{margin-top:8px;font-size:12px;color:#16a34a;line-height:1.4}.intro-textarea[data-v-eb0ed336]{min-height:112px!important;line-height:1.55!important;padding-top:12px!important;padding-bottom:12px!important;resize:none}.store-field-last[data-v-eb0ed336]{padding-bottom:14px}.store-actions[data-v-eb0ed336]{margin-top:18px}.store-save-btn[data-v-eb0ed336]{margin-top:0!important;box-shadow:0 10px 26px rgba(34,197,94,.35)!important}.store-actions-hint[data-v-eb0ed336]{margin-top:10px;text-align:center;font-size:12px;color:#94a3b8;line-height:1.45}.store-footer-tip[data-v-eb0ed336]{margin-top:28px;text-align:center;font-size:12px;color:#cbd5e1}

View File

@ -0,0 +1 @@
import{Y as e,Z as s}from"./index-DrZc8biM.js";const r={login:"/pages/login/Login",home:"/pages/home/Home",report:"/pages/report/Report",mine:"/pages/mine/Mine"},o={staff:"/pages/mine/Staff",serviceType:"/pages/mine/ServiceType",store:"/pages/mine/Store",profile:"/pages/mine/Profile",myReports:"/pages/mine/MyReports",myOrders:"/pages/mine/MyOrders"},n=n=>{const p=r[n];if(p)return void e({url:p});const i=o[n];i&&s({url:i})},p=(e,s)=>{const r=e.__vccOpts||e;for(const[o,n]of s)r[o]=n;return r};export{p as _,n};

View File

@ -0,0 +1 @@
const a={new:"待确认",doing:"服务中",done:"已完成",cancel:"已取消"},n=n=>a[n]||a.new,e=a=>({new:"warning",doing:"primary",done:"success",cancel:"default"}[a]||"default"),c=a=>({new:"tag-warning",doing:"tag-primary",done:"tag-success",cancel:"tag-default"}[a]||"tag-default");export{c as a,e as b,n as g};

View File

@ -0,0 +1 @@
const t=t=>{if(!t)return"";return new Date(t).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"})},r=t=>{if(!t)return"";const r=new Date(t);return`${r.getFullYear()}-${String(r.getMonth()+1).padStart(2,"0")}-${String(r.getDate()).padStart(2,"0")} ${String(r.getHours()).padStart(2,"0")}:${String(r.getMinutes()).padStart(2,"0")}`};export{r as a,t as f};

File diff suppressed because one or more lines are too long

25
dist/build/h5/assets/index-DrZc8biM.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
import{X as e}from"./index-DrZc8biM.js";const t="http://localhost:8080".replace(/\/$/,""),s=`${t}/api`,a=t=>new Promise((a,r)=>{e({url:s+t.url,method:t.method||"GET",data:t.data||{},header:t.header||{},success:e=>a(e.data),fail:e=>r(e)})}),r=(e,t={})=>{const s=Object.entries(t).filter(([,e])=>null!=e).map(([e,t])=>`${encodeURIComponent(e)}=${encodeURIComponent(t)}`).join("&");return a({url:`${e}${s?"?"+s:""}`,method:"GET"})},o=(e,t={})=>a({url:e,method:"POST",data:t,header:{"Content-Type":"application/json"}}),n=(e,t={})=>a({url:e,method:"PUT",data:t,header:{"Content-Type":"application/json"}}),p=e=>a({url:e,method:"DELETE"}),d=e=>e?e.startsWith("http")?e:`${t}${e}`:"",i=e=>o("/sms/send",{phone:e}),l=(e,t)=>o("/user/login",{phone:e,code:t}),c=e=>o("/user/register-boss",e),u=e=>o("/user/register-staff",e),m=(e,t)=>r("/appointment/list",{userId:e,storeId:t}),h=e=>o("/appointment/create",e),f=(e,t)=>o("/appointment/start",{appointmentId:e,staffUserId:t}),$=e=>n(`/appointment/status?id=${e}&status=cancel`),I=e=>o("/report/create",e),T=e=>r("/report/get",{token:e}),j=e=>r("/report/list",e),g=e=>r("/service-type/list",{storeId:e}),y=(e,t)=>o("/service-type/create",{storeId:e,name:t}),E=e=>p(`/service-type/delete?id=${e}`),C=e=>r("/user/staff-list",{storeId:e}),U=e=>o("/user/create-staff",e),b=e=>p(`/user/staff?staffId=${e}`),v=e=>n("/user/update",e),P=e=>n("/store/update",e);export{t as A,s as B,u as a,g as b,f as c,$ as d,h as e,I as f,m as g,C as h,d as i,b as j,U as k,l,E as m,y as n,j as o,v as p,T as q,c as r,i as s,P as u};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
import{m as s,p as e,q as a,c as n,b as l,x as i,v as t,t as c,d as o,e as r,w as m,F as u,i as p,g as d,h as v,G as f,P as g}from"./index-DrZc8biM.js";import{T as h,u as C}from"./useNavigator.BKsocaY0.js";import{A as k}from"./AppIcon.M7CZvvJr.js";import{_ as x}from"./_plugin-vue_export-helper.2L545UbL.js";const y=x({__name:"Mine",emits:["change-page"],setup(x,{emit:y}){const _=s(),{goPage:w,navigateTo:z}=C(),b=(()=>{var s,a;let n=((null==(s=e)?void 0:s().statusBarHeight)||20)+12;const l=null==(a=uni.getMenuButtonBoundingClientRect)?void 0:a.call(uni);return l&&l.top&&l.height&&(n=l.top+l.height+8),`padding-top:${n}px;`})(),j=a(()=>_.name?_.name.slice(0,1).toUpperCase():"?"),A=a(()=>{var s;if(_.avatar)return{};const e=["#ff7c43","#07c160","#8b6914","#e06040","#5090d0"];return{background:e[((null==(s=_.name)?void 0:s.charCodeAt(0))||0)%e.length]}}),B=()=>{f({title:"提示",content:"确定退出登录?",success:s=>{s.confirm&&(g(),z("login"))}})};return(s,e)=>{const a=p;return d(),n(u,null,[l("div",{class:"mine-page"},[l("div",{class:"user-card",style:t(i(b)),onClick:e[0]||(e[0]=s=>i(z)("profile"))},[l("div",{class:"user-info"},[l("div",{class:"user-avatar",style:t(A.value)},[i(_).avatar?(d(),n("img",{key:0,src:i(_).avatar,class:"avatar-img"},null,8,["src"])):(d(),n("span",{key:1,class:"avatar-initials"},c(j.value),1))],4),l("div",{class:"user-info-content"},[l("div",{class:"user-name"},c(i(_).name),1),l("div",{class:"user-phone"},c(i(_).phone),1),l("div",{class:"role-pill"},c("boss"===i(_).role?"店长":"员工"),1)])])],4),"boss"===i(_).role?(d(),n("div",{key:0,class:"menu-section"},[l("div",{class:"menu-card"},[l("div",{class:"menu-title"},"店铺管理"),l("div",{class:"menu-item",onClick:e[1]||(e[1]=s=>i(z)("staff"))},[l("div",{class:"menu-left"},[l("span",{class:"menu-icon"},[o(k,{name:"staff",size:15})]),l("span",{class:"menu-text"},"员工管理")]),l("span",{class:"menu-arrow"},"")]),l("div",{class:"menu-item",onClick:e[2]||(e[2]=s=>i(z)("serviceType"))},[l("div",{class:"menu-left"},[l("span",{class:"menu-icon"},[o(k,{name:"service",size:15})]),l("span",{class:"menu-text"},"服务类型")]),l("span",{class:"menu-arrow"},"")]),l("div",{class:"menu-item",onClick:e[3]||(e[3]=s=>i(z)("store"))},[l("div",{class:"menu-left"},[l("span",{class:"menu-icon"},[o(k,{name:"store",size:15})]),l("span",{class:"menu-text"},"店铺设置")]),l("span",{class:"menu-arrow"},"")])])])):r("",!0),l("div",{class:"menu-section"},[l("div",{class:"menu-card"},[l("div",{class:"menu-title"},"个人中心"),l("div",{class:"menu-item",onClick:e[4]||(e[4]=s=>i(z)("profile"))},[l("div",{class:"menu-left"},[l("span",{class:"menu-icon"},[o(k,{name:"profile",size:15})]),l("span",{class:"menu-text"},"个人信息")]),l("span",{class:"menu-arrow"},"")]),l("div",{class:"menu-item",onClick:e[5]||(e[5]=s=>i(z)("myReports"))},[l("div",{class:"menu-left"},[l("span",{class:"menu-icon"},[o(k,{name:"report",size:15})]),l("span",{class:"menu-text"},"我的报告")]),l("span",{class:"menu-arrow"},"")]),l("div",{class:"menu-item",onClick:e[6]||(e[6]=s=>i(z)("myOrders"))},[l("div",{class:"menu-left"},[l("span",{class:"menu-icon"},[o(k,{name:"orders",size:15})]),l("span",{class:"menu-text"},"我的订单")]),l("span",{class:"menu-arrow"},"")])])]),l("div",{class:"menu-section"},[o(a,{class:"logout-btn",onClick:B},{default:m(()=>[o(k,{name:"logout",size:15,color:"#dc2626"}),v("退出登录")]),_:1})])]),o(h,{"current-page":"mine",onChange:i(w)},null,8,["onChange"])],64)}}},[["__scopeId","data-v-27768e55"]]);export{y as default};

View File

@ -0,0 +1 @@
import{m as e,p as a,r as t,q as s,u as n,c as l,d as i,w as o,v as c,x as r,z as d,e as u,f as p,g as m,A as v,h as f,F as g,y as _,B as y,t as b,b as h,i as k,j as T,G as w,H as x}from"./index-DrZc8biM.js";import{A as C}from"./AppIcon.M7CZvvJr.js";import{_ as j,n as N}from"./_plugin-vue_export-helper.2L545UbL.js";import{g as $,c as z,d as B}from"./index.DsJtDI4O.js";import{f as A}from"./datetime.CB5sbvg8.js";import{g as I,b as M}from"./appointment.SHi7qFlK.js";const H=j({__name:"MyOrders",emits:["change-page"],setup(j,{emit:H}){const O=e(),q=O.id,F=(()=>{var e,t;const s=(null==(e=a)?void 0:e().statusBarHeight)||20;let n=s+44;const l=null==(t=uni.getMenuButtonBoundingClientRect)?void 0:t.call(uni);if(l&&l.top&&l.height){n=s+2*Math.max(l.top-s,4)+l.height}return`padding-top:${s}px;height:${n}px;`})(),G=t("new"),J=t([]),R=[{title:"待确认",name:"new"},{title:"进行中",name:"doing"},{title:"已完成",name:"done"}],S=s(()=>J.value.filter(e=>"new"===G.value?"new"===e.status:"doing"===G.value?"doing"===e.status:"done"!==G.value||("done"===e.status||"cancel"===e.status))),D=async()=>{if(!q)return;const e=await $(q);200===e.code&&(J.value=e.data.map(e=>({id:e.id,title:e.serviceType||"洗澡美容预约",desc:`${e.petType||""} - ${e.petName||""}`,time:A(e.appointmentTime),status:e.status||"new",statusText:I(e.status),petName:e.petName,petType:e.petType,serviceType:e.serviceType,appointmentTime:e.appointmentTime})))};return n(()=>D()),(e,a)=>{const t=v,s=p,n=k;return m(),l("div",{class:"page-shell orders-page"},[i(s,{class:"orders-nav nav-gradient",style:c(r(F))},{default:o(()=>[i(t,{class:"nav-back",onClick:a[0]||(a[0]=e=>r(N)("mine"))},{default:o(()=>[i(C,{name:"back",size:18,color:"#ffffff"})]),_:1}),i(t,{class:"nav-title"},{default:o(()=>[f("我的订单")]),_:1}),i(s,{class:"nav-placeholder"})]),_:1},8,["style"]),i(s,{class:"page-section orders-hero"},{default:o(()=>[i(s,{class:"hero-title"},{default:o(()=>[f("服务进度一目了然")]),_:1}),i(s,{class:"hero-sub"},{default:o(()=>[f("按状态查看订单,待确认可快速开始服务,进行中可直接填写报告。")]),_:1})]),_:1}),i(s,{class:"van-tabs"},{default:o(()=>[(m(),l(g,null,_(R,e=>i(s,{key:e.name,class:y(["van-tabs__tab",{active:G.value===e.name}]),onClick:a=>G.value=e.name},{default:o(()=>[f(b(e.title),1)]),_:2},1032,["class","onClick"])),64))]),_:1}),i(s,{class:"page-section section-gap"},{default:o(()=>[(m(!0),l(g,null,_(S.value,e=>{return m(),l("div",{key:e.id,class:"order-item"},[h("div",{class:"order-head"},[h("div",{class:"order-title"},b(e.title),1),i(s,{class:y(`van-tag van-tag--${a=e.status,M(a)}`)},{default:o(()=>[f(b(e.statusText),1)]),_:2},1032,["class"])]),h("div",{class:"order-desc"},[h("span",{class:"desc-icon"},[i(C,{name:"profile",size:12})]),h("span",null,b(e.desc),1)]),h("div",{class:"order-footer"},[h("span",{class:"order-time"},[i(C,{name:"orders",size:12,color:"#94a3b8"}),i(t,null,{default:o(()=>[f(b(e.time),1)]),_:2},1024)])]),"new"===e.status?(m(),l("div",{key:0,class:"action-btns"},[i(n,{class:"van-button van-button--small van-button--primary",onClick:a=>(async e=>{const a=await z(e.id,O.id);200===a.code?(T({title:"已开始服务",icon:"success"}),D()):T({title:a.message||"操作失败",icon:"none"})})(e)},{default:o(()=>[f("开始服务")]),_:2},1032,["onClick"]),i(n,{class:"van-button van-button--small",onClick:a=>(async e=>{w({title:"提示",content:"确定取消该预约?",success:async a=>{a.confirm&&200===(await B(e.id)).code&&(T({title:"已取消",icon:"success"}),D())}})})(e)},{default:o(()=>[f("取消")]),_:2},1032,["onClick"])])):"doing"===e.status?(m(),d(n,{key:1,class:"van-button van-button--small btn-mt",onClick:a=>(e=>{x("petstore_report_prefill",JSON.stringify({appointmentId:e.id,petName:e.petName,serviceType:e.serviceType,appointmentTime:e.appointmentTime})),N("report")})(e)},{default:o(()=>[f("填写报告")]),_:2},1032,["onClick"])):u("",!0)]);var a}),128))]),_:1}),0===S.value.length?(m(),d(s,{key:0,class:"empty"},{default:o(()=>[i(t,null,{default:o(()=>[f("暂无数据")]),_:1})]),_:1})):u("",!0)])}}},[["__scopeId","data-v-be66263e"]]);export{H as default};

View File

@ -0,0 +1 @@
import{m as e,n as a,p as s,r as l,u as t,c as o,d as r,w as n,v as c,x as i,F as d,y as p,e as u,z as v,f as g,g as h,A as m,h as f,t as y,b as _}from"./index-DrZc8biM.js";import{A as b}from"./AppIcon.M7CZvvJr.js";import{_ as k,n as x}from"./_plugin-vue_export-helper.2L545UbL.js";import{o as w,i as j,A as z}from"./index.DsJtDI4O.js";const A=k({__name:"MyReports",emits:["change-page"],setup(k,{emit:A}){const C=e(),I=a(),$=(()=>{var e,a;const l=(null==(e=s)?void 0:e().statusBarHeight)||20;let t=l+44;const o=null==(a=uni.getMenuButtonBoundingClientRect)?void 0:a.call(uni);if(o&&o.top&&o.height){t=l+2*Math.max(o.top-l,4)+o.height}return`padding-top:${l}px;height:${t}px;`})(),B=l(!1),M=l([]),P=()=>{x("home")};return t(()=>(async()=>{B.value=!0;const e="boss"===C.role?{storeId:I.id}:{userId:C.id},a=await w(e);B.value=!1,200===a.code&&(M.value=a.data)})()),(e,a)=>{const s=m,l=g;return h(),o("div",{class:"page-shell my-reports-page"},[r(l,{class:"report-nav nav-gradient",style:c(i($))},{default:n(()=>[r(s,{class:"nav-back nav-home-btn",onClick:P},{default:n(()=>[r(b,{name:"home",size:16,color:"#ffffff"})]),_:1}),r(s,{class:"nav-title"},{default:n(()=>[f("我的报告")]),_:1}),r(l,{class:"nav-placeholder"})]),_:1},8,["style"]),r(l,{class:"page-section reports-hero"},{default:n(()=>[r(l,{class:"hero-title"},{default:n(()=>[f("服务成果回顾")]),_:1}),r(l,{class:"hero-sub"},{default:n(()=>[f("已生成 "),r(s,{class:"hero-count"},{default:n(()=>[f(y(M.value.length),1)]),_:1}),f(" 份报告,点击卡片可查看详情并分享。")]),_:1})]),_:1}),M.value.length>0?(h(),o("div",{key:0,class:"page-section section-gap gallery-grid"},[(h(!0),o(d,null,p(M.value,e=>(h(),o("div",{key:e.id,class:"gallery-item",onClick:a=>(e=>{let a=z;a=window.location.origin;const s=`${a}/report.html?token=${e.reportToken}`;window.location.href=s})(e)},[_("div",{class:"gallery-cover"},[e.beforePhoto?(h(),o("img",{key:0,src:i(j)(e.beforePhoto),class:"cover-img"},null,8,["src"])):(h(),o("div",{key:1,class:"cover-placeholder"},[_("span",{class:"placeholder-icon"},[r(b,{name:"camera",size:18,color:"#94a3b8"})])])),_("div",{class:"gallery-overlay"},[_("div",{class:"overlay-name"},y(e.petName),1),_("div",{class:"overlay-service"},y(e.serviceType),1)])]),_("div",{class:"gallery-meta"},[_("span",{class:"meta-chip"},[r(b,{name:"report",size:11,color:"#64748b"}),r(s,null,{default:n(()=>[f("查看报告")]),_:1})])])],8,["onClick"]))),128))])):u("",!0),B.value||0!==M.value.length?u("",!0):(h(),v(l,{key:1,class:"empty"},{default:n(()=>[r(s,null,{default:n(()=>[f("暂无报告")]),_:1})]),_:1}))])}}},[["__scopeId","data-v-b92fb009"]]);export{A as default};

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
import{n as a,p as e,r as s,u as l,c as t,d as n,w as u,v as o,x as c,z as d,e as i,f as p,g as v,A as r,h as f,i as _,F as m,y as g,B as h,C as k,b,t as y,I as C,G as w,j as x}from"./index-DrZc8biM.js";import{A as T}from"./AppIcon.M7CZvvJr.js";import{_ as I,n as j}from"./_plugin-vue_export-helper.2L545UbL.js";import{b as B,m as z,n as A}from"./index.DsJtDI4O.js";const V=I({__name:"ServiceType",emits:["change-page"],setup(I,{emit:V}){const M=a(),X=(()=>{var a,s;const l=(null==(a=e)?void 0:a().statusBarHeight)||20;let t=l+44;const n=null==(s=uni.getMenuButtonBoundingClientRect)?void 0:s.call(uni);if(n&&n.top&&n.height){t=l+2*Math.max(n.top-l,4)+n.height}return`padding-top:${l}px;height:${t}px;`})(),$=s([]),F=s(!1),G=s(""),H=s(null),R=s(0),S=s(0),U=async()=>{const a=await B(M.id);200===a.code&&($.value=a.data)},q=async()=>{if(!G.value)return void x({title:"请输入服务类型名称",icon:"none"});const a=await A(M.id,G.value);200===a.code?(x({title:"添加成功",icon:"success"}),G.value="",F.value=!1,U()):x({title:a.message||"添加失败",icon:"none"})},D=a=>{var e,s;return(null==(e=null==a?void 0:a.touches)?void 0:e[0])?a.touches[0].pageX:(null==(s=null==a?void 0:a.changedTouches)?void 0:s[0])?a.changedTouches[0].pageX:0};return l(()=>U()),(a,e)=>{const s=r,l=p,I=_,B=C;return v(),t("div",{class:"page-shell st-page"},[n(l,{class:"st-nav nav-gradient",style:o(c(X))},{default:u(()=>[n(s,{class:"nav-back",onClick:e[0]||(e[0]=a=>c(j)("mine"))},{default:u(()=>[n(T,{name:"back",size:18,color:"#ffffff"})]),_:1}),n(s,{class:"nav-title"},{default:u(()=>[f("服务类型")]),_:1}),n(l,{class:"nav-placeholder"})]),_:1},8,["style"]),n(l,{class:"page-section add-btn-wrap"},{default:u(()=>[n(I,{class:"van-button van-button--primary van-button--block",onClick:e[1]||(e[1]=a=>F.value=!0)},{default:u(()=>[f("新增服务类型")]),_:1})]),_:1}),n(l,{class:"page-section"},{default:u(()=>[n(l,{class:"van-cell-group card-section st-list"},{default:u(()=>[(v(!0),t(m,null,g($.value,a=>(v(),d(l,{key:a.id,class:h(["st-swipe-wrap",{"is-open":H.value===a.id&&!!a.storeId}])},{default:u(()=>[n(l,{class:"st-swipe-track",onTouchstart:e=>((a,e)=>{const s=D(a);R.value=s,S.value=s,H.value&&H.value!==e.id&&(H.value=null)})(e,a),onTouchmove:e[2]||(e[2]=k(a=>{return e=a,void(S.value=D(e));var e},["stop"])),onTouchend:e=>((a,e)=>{if(!e.storeId)return;const s=(D(a)||S.value)-R.value;s<-40?H.value=e.id:s>24&&H.value===e.id&&(H.value=null)})(e,a)},{default:u(()=>[n(l,{class:"van-cell st-cell"},{default:u(()=>[n(l,{class:"st-name-row"},{default:u(()=>[b("span",{class:"st-dot"},[n(T,{name:"service",size:14})]),n(s,{class:"st-name"},{default:u(()=>[f(y(a.name),1)]),_:2},1024),a.storeId?i("",!0):(v(),d(l,{key:0,class:"van-tag van-tag--success van-tag--small system-tag"},{default:u(()=>[f("系统默认")]),_:1}))]),_:2},1024)]),_:2},1024),a.storeId?(v(),d(l,{key:0,class:"swipe-delete-btn",onClick:k(e=>(async a=>{w({title:"提示",content:"确定删除?",success:async e=>{e.confirm&&200===(await z(a)).code&&(H.value=null,x({title:"已删除",icon:"success"}),U())}})})(a.id),["stop"])},{default:u(()=>[f(" 删除 ")]),_:2},1032,["onClick"])):i("",!0)]),_:2},1032,["onTouchstart","onTouchend"])]),_:2},1032,["class"]))),128))]),_:1})]),_:1}),0===$.value.length?(v(),d(l,{key:0,class:"empty"},{default:u(()=>[n(s,null,{default:u(()=>[f("暂无服务类型")]),_:1})]),_:1})):i("",!0),F.value?(v(),d(l,{key:1,class:"popup-mask",onClick:e[7]||(e[7]=a=>F.value=!1)},{default:u(()=>[n(l,{class:"popup-content",onClick:e[6]||(e[6]=k(()=>{},["stop"]))},{default:u(()=>[n(l,{class:"popup-header"},{default:u(()=>[n(s,{class:"popup-title"},{default:u(()=>[f("新增服务类型")]),_:1}),n(s,{class:"popup-close",onClick:e[3]||(e[3]=a=>F.value=!1)},{default:u(()=>[f("✕")]),_:1})]),_:1}),n(l,{class:"popup-body"},{default:u(()=>[n(l,{class:"popup-desc"},{default:u(()=>[f("建议使用简洁明确的命名,方便前台下单与报告展示。")]),_:1}),n(l,{class:"field-label"},{default:u(()=>[f("服务类型名称")]),_:1}),n(B,{modelValue:G.value,"onUpdate:modelValue":e[4]||(e[4]=a=>G.value=a),class:"van-field",placeholder:"请输入"},null,8,["modelValue"])]),_:1}),n(l,{class:"popup-footer"},{default:u(()=>[n(l,{class:"popup-actions"},{default:u(()=>[n(I,{class:"van-button btn-ghost",onClick:e[5]||(e[5]=a=>F.value=!1)},{default:u(()=>[f("取消")]),_:1}),n(I,{class:"van-button van-button--primary btn-confirm",onClick:q},{default:u(()=>[f("确认创建")]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})):i("",!0)])}}},[["__scopeId","data-v-663ba7c1"]]);export{V as default};

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
import{n as e,p as a,r as l,q as s,u as t,c as o,d as n,w as i,v as d,x as r,b as u,e as c,f as v,A as p,I as f,i as m,E as h,g,h as b,Q as _,j as V,l as x}from"./index-DrZc8biM.js";import{A as k}from"./AppIcon.M7CZvvJr.js";import{_ as y,n as j}from"./_plugin-vue_export-helper.2L545UbL.js";import{u as z}from"./index.DsJtDI4O.js";const B=y({__name:"Store",emits:["change-page"],setup(y){const B=e(),C=(()=>{var e,l;const s=(null==(e=a)?void 0:e().statusBarHeight)||20;let t=s+44;const o=null==(l=uni.getMenuButtonBoundingClientRect)?void 0:l.call(uni);if(o&&o.top&&o.height){t=s+2*Math.max(o.top-s,4)+o.height}return`padding-top:${s}px;height:${t}px;`})(),U=l(!1),w=l(!1),A=l({name:"",phone:"",address:"",intro:"",latitude:null,longitude:null}),I=s(()=>null!=A.value.latitude&&null!=A.value.longitude),M=e=>{if(null==e||""===e)return null;const a="number"==typeof e?e:parseFloat(e);return Number.isFinite(a)?a:null},F=()=>{w.value=!0,_({success:e=>{const a=e.name||"",l=e.address||"";A.value.address=[a,l].filter(Boolean).join(" · ")||l||a,A.value.latitude=M(e.latitude),A.value.longitude=M(e.longitude)},fail:e=>{const a=e&&e.errMsg||"";/cancel|取消/i.test(a)||V({title:"无法打开选点,请手动填写",icon:"none"})},complete:()=>{w.value=!1}})},$=async()=>{U.value=!0;const e=await z({id:B.id,...A.value});if(U.value=!1,200===e.code){V({title:"保存成功",icon:"success"});const a=e.data?{...B,...e.data}:{...B,...A.value};x(a)}else V({title:e.message||"保存失败",icon:"none"})};return t(()=>{A.value={name:B.name||"",phone:B.phone||"",address:B.address||"",intro:B.intro||"",latitude:M(B.latitude),longitude:M(B.longitude)}}),(e,a)=>{const l=p,s=v,t=f,_=m,V=h;return g(),o("div",{class:"page-shell store-page"},[n(s,{class:"store-nav nav-gradient",style:d(r(C))},{default:i(()=>[n(l,{class:"nav-back",onClick:a[0]||(a[0]=e=>r(j)("mine"))},{default:i(()=>[n(k,{name:"back",size:18,color:"#ffffff"})]),_:1}),n(l,{class:"nav-title"},{default:i(()=>[b("店铺设置")]),_:1}),n(s,{class:"nav-placeholder"})]),_:1},8,["style"]),u("div",{class:"store-body"},[u("div",{class:"store-hero"},[n(s,{class:"store-hero-icon","aria-hidden":"true"},{default:i(()=>[n(k,{name:"store",size:22,color:"#15803d"})]),_:1}),u("div",{class:"store-hero-text"},[u("div",{class:"store-hero-title"},"门店资料"),u("div",{class:"store-hero-desc"},"以下信息会用于预约展示与客户联系,建议保持准确、易读。")])]),u("div",{class:"store-card"},[u("div",{class:"store-card-head"},[u("span",{class:"store-card-kicker"},"基础信息")]),u("div",{class:"store-field"},[u("div",{class:"store-field-label"},[u("span",{class:"store-ico"},[n(k,{name:"store",size:15,color:"#475569"})]),n(l,null,{default:i(()=>[b("店铺名称")]),_:1})]),n(t,{modelValue:A.value.name,"onUpdate:modelValue":a[1]||(a[1]=e=>A.value.name=e),class:"van-field store-input",placeholder:"请输入店铺名称"},null,8,["modelValue"])]),u("div",{class:"store-field"},[u("div",{class:"store-field-label"},[u("span",{class:"store-ico"},[n(k,{name:"phone",size:15,color:"#475569"})]),n(l,null,{default:i(()=>[b("联系电话")]),_:1})]),n(t,{modelValue:A.value.phone,"onUpdate:modelValue":a[2]||(a[2]=e=>A.value.phone=e),type:"tel",class:"van-field store-input",placeholder:"请输入联系电话",maxlength:"20"},null,8,["modelValue"])]),u("div",{class:"store-field"},[u("div",{class:"store-field-label"},[u("span",{class:"store-ico"},[n(k,{name:"pin",size:15,color:"#475569"})]),n(l,null,{default:i(()=>[b("地址")]),_:1})]),u("div",{class:"address-row"},[n(t,{modelValue:A.value.address,"onUpdate:modelValue":a[3]||(a[3]=e=>A.value.address=e),class:"van-field store-input address-input",placeholder:"输入地址或点右侧选点"},null,8,["modelValue"]),n(_,{type:"button",class:"pick-location-btn",disabled:w.value,onClick:F},{default:i(()=>[b(" 地图选点 ")]),_:1},8,["disabled"])]),I.value?(g(),o("div",{key:0,class:"geo-hint"},"已选地图位置,可再微调上方文字后保存")):c("",!0)]),u("div",{class:"store-field store-field-last"},[u("div",{class:"store-field-label"},[u("span",{class:"store-ico"},[n(k,{name:"report",size:15,color:"#475569"})]),n(l,null,{default:i(()=>[b("简介")]),_:1})]),n(V,{modelValue:A.value.intro,"onUpdate:modelValue":a[4]||(a[4]=e=>A.value.intro=e),class:"van-field store-input intro-textarea",placeholder:"一句话介绍门店特色、服务亮点等"},null,8,["modelValue"])])]),u("div",{class:"store-actions"},[n(_,{class:"van-button van-button--primary van-button--block store-save-btn",loading:U.value,onClick:$},{default:i(()=>[b(" 保存设置 ")]),_:1},8,["loading"]),u("div",{class:"store-actions-hint"},"保存后立即生效,并写入本地缓存。")]),u("div",{class:"store-footer-tip"},"宠伴生活馆 · 商家版")])])}}},[["__scopeId","data-v-eb0ed336"]]);export{B as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
.report-view[data-v-3d43fb47]{background:#f5f7fb;min-height:100vh}.loading-wrap[data-v-3d43fb47]{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:100vh;gap:16px;color:#999}.loading-spinner[data-v-3d43fb47]{width:32px;height:32px;border:3px solid #e0e0e0;border-top-color:#07c160;border-radius:50%;animation:spin-3d43fb47 .8s linear infinite}@keyframes spin-3d43fb47{to{transform:rotate(360deg)}}.not-found[data-v-3d43fb47]{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:100vh}.report-content[data-v-3d43fb47]{max-width:430px;margin:0 auto;background:#f8fafc;min-height:100vh;box-shadow:0 10px 30px rgba(15,23,42,.06)}.brand-header[data-v-3d43fb47]{background:linear-gradient(135deg,#22c55e,#16a34a);padding:20px 20px 18px;text-align:center;color:#fff;border-radius:0 0 16px 16px;box-shadow:0 8px 20px rgba(34,197,94,.24);position:relative}.header-actions[data-v-3d43fb47]{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.header-btn[data-v-3d43fb47]{width:30px;height:30px;border-radius:999px;border:1px solid rgba(255,255,255,.45);background:rgba(255,255,255,.2);display:inline-flex;align-items:center;justify-content:center}.header-placeholder[data-v-3d43fb47]{width:30px;height:30px}.brand-logo[data-v-3d43fb47]{font-size:20px;font-weight:700;letter-spacing:1px;margin-bottom:4px}.brand-sub[data-v-3d43fb47]{font-size:12px;opacity:.7;margin-bottom:12px}.brand-contact[data-v-3d43fb47]{font-size:12px;opacity:.85;display:flex;justify-content:center;gap:16px;flex-wrap:wrap}.report-title-wrap[data-v-3d43fb47]{text-align:center;padding:20px 20px 14px}.report-title[data-v-3d43fb47]{font-size:22px;font-weight:700;color:#333}.report-time[data-v-3d43fb47]{font-size:13px;color:#999;margin-top:6px}.service-info[data-v-3d43fb47]{margin:0 16px 12px;border-radius:14px!important}.section-card[data-v-3d43fb47]{margin:0 16px 12px;background:#fff;border:1px solid #e8edf4;border-radius:14px;padding:12px;box-shadow:0 6px 16px rgba(15,23,42,.04)}.section-label[data-v-3d43fb47]{font-size:15px;font-weight:700;color:#1f2937;margin-bottom:10px}.photo-grid[data-v-3d43fb47]{display:grid;grid-template-columns:1fr 1fr;gap:12px}.photo-image[data-v-3d43fb47]{width:100%;aspect-ratio:1 / 1;border-radius:12px;border:1px solid #e5e7eb}.photo-empty[data-v-3d43fb47]{width:100%;aspect-ratio:1 / 1;background:#f1f5f9;border:1px dashed #d1d9e6;border-radius:12px;display:flex;align-items:center;justify-content:center;color:#94a3b8;font-size:13px}.remark-content[data-v-3d43fb47]{background:#f8fafc;border:1px solid #e8edf4;border-radius:12px;padding:14px;font-size:14px;color:#64748b;line-height:1.6;min-height:60px}.action-section[data-v-3d43fb47]{margin:0 16px 24px}

1
dist/build/h5/assets/uni.dacb0817.css vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
.tabbar[data-v-09922235]{position:fixed;bottom:0;left:0;right:0;height:calc(3.25rem + env(safe-area-inset-bottom));padding-bottom:env(safe-area-inset-bottom);background:rgba(255,255,255,.96);backdrop-filter:blur(8px);border-top:1px solid #e8edf4;display:flex;flex-direction:row;z-index:999}.tabbar-item[data-v-09922235]{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:#94a3b8;transition:color .2s ease}.tabbar-item.active[data-v-09922235]{color:#16a34a}.tabbar-icon[data-v-09922235]{width:1.25rem;height:1.25rem;border-radius:.34375rem;background:#eaf0f7;display:flex;align-items:center;justify-content:center;margin-bottom:.125rem}.tabbar-item.active .tabbar-icon[data-v-09922235]{background:#dcfce7}.tabbar-text[data-v-09922235]{font-size:.6875rem;line-height:1;font-weight:600}

View File

@ -0,0 +1 @@
import{g as a,z as e,w as t,d as r,f as s,A as c,h as o,B as l}from"./index-DrZc8biM.js";import{A as n}from"./AppIcon.M7CZvvJr.js";import{_ as i,n as u}from"./_plugin-vue_export-helper.2L545UbL.js";const b=i({__name:"TabBar",props:{currentPage:{type:String,default:"home"}},emits:["change"],setup(i,{emit:u}){const b=i,m=u;function p(a){b.currentPage!==a&&m("change",a)}return(i,u)=>{const m=s,g=c;return a(),e(m,{class:"tabbar"},{default:t(()=>[r(m,{class:l(["tabbar-item",{active:"home"===b.currentPage}]),onClick:u[0]||(u[0]=a=>p("home"))},{default:t(()=>[r(m,{class:"tabbar-icon"},{default:t(()=>[r(n,{name:"home",size:16,color:"home"===b.currentPage?"#16a34a":"#64748b"},null,8,["color"])]),_:1}),r(g,{class:"tabbar-text"},{default:t(()=>[o("服务预约")]),_:1})]),_:1},8,["class"]),r(m,{class:l(["tabbar-item",{active:"report"===b.currentPage}]),onClick:u[1]||(u[1]=a=>p("report"))},{default:t(()=>[r(m,{class:"tabbar-icon"},{default:t(()=>[r(n,{name:"report",size:16,color:"report"===b.currentPage?"#16a34a":"#64748b"},null,8,["color"])]),_:1}),r(g,{class:"tabbar-text"},{default:t(()=>[o("洗美报告")]),_:1})]),_:1},8,["class"]),r(m,{class:l(["tabbar-item",{active:"mine"===b.currentPage}]),onClick:u[2]||(u[2]=a=>p("mine"))},{default:t(()=>[r(m,{class:"tabbar-icon"},{default:t(()=>[r(n,{name:"mine",size:16,color:"mine"===b.currentPage?"#16a34a":"#64748b"},null,8,["color"])]),_:1}),r(g,{class:"tabbar-text"},{default:t(()=>[o("我的")]),_:1})]),_:1},8,["class"])]),_:1})}}},[["__scopeId","data-v-09922235"]]),m=()=>({goPage:a=>{u(a)},navigateTo:u});export{b as T,m as u};

16
dist/build/h5/index.html vendored Normal file
View File

@ -0,0 +1,16 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<link rel="stylesheet" href="/assets/uni.dacb0817.css">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>宠伴生活馆</title>
<meta name="description" content="宠伴生活馆 - 宠物服务,让爱更专业">
<script type="module" crossorigin src="/assets/index-DrZc8biM.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-Cg0PdC_j.css">
</head>
<body>
<div id="app"></div>
</body>
</html>

92
dist/build/h5/static/make-icons.py vendored Normal file
View File

@ -0,0 +1,92 @@
#!/usr/bin/env python3
"""Generate simple PNG icons for tabBar using only stdlib"""
import struct, zlib, math, os
def save_png(img_data, w, h, filepath):
"""img_data: list of (r,g,b) tuples, row-major"""
def chunk(ctype, data):
c = ctype + data
return struct.pack('>I', len(data)) + c + struct.pack('>I', zlib.crc32(c) & 0xffffffff)
sig = b'\x89PNG\r\n\x1a\n'
ihdr = chunk(b'IHDR', struct.pack('>IIBBBBB', w, h, 8, 2, 0, 0, 0))
raw = b''
for row in img_data:
raw += b'\x00'
for r, g, b in row:
raw += bytes([r, g, b])
idat = chunk(b'IDAT', zlib.compress(raw, 9))
iend = chunk(b'IEND', b'')
with open(filepath, 'wb') as f:
f.write(sig + ihdr + idat + iend)
def draw_circle(img, w, h, cx, cy, radius, r, g, b, fill=True):
for y in range(h):
for x in range(w):
d = math.sqrt((x-cx)**2 + (y-cy)**2)
if fill and d <= radius:
img[y][x] = (r, g, b)
elif not fill and abs(d - radius) < 1.0:
img[y][x] = (r, g, b)
def solid_img(w, h, r, g, b):
return [[(r, g, b)] * w for _ in range(h)]
def home_icon(active):
img = solid_img(81, 81, 0, 0, 0)
base = (180, 180, 180) if not active else (7, 193, 96)
accent = (7, 193, 96) if active else (120, 120, 120)
# house shape: triangle roof + rectangle body
roof = [(40,15),(15,40),(66,40)] # simplified triangle roof points
for y in range(81):
for x in range(81):
# roof triangle
if y <= 40 and x >= 15 and x <= 66:
in_roof = (y - 15) >= abs(x - 40) * 0.8
else:
in_roof = False
# body rectangle
in_body = x >= 22 and x <= 60 and y >= 38 and y <= 66
if in_roof or in_body:
img[y][x] = accent
return img
def report_icon(active):
img = solid_img(81, 81, 0, 0, 0)
accent = (7, 193, 96) if active else (180, 180, 180)
for y in range(81):
for x in range(81):
# doc rectangle with folded corner
in_doc = x >= 20 and x <= 62 and y >= 12 and y <= 70
corner = x >= 46 and y <= 28 and (x - 46 + y - 28) <= 6
if in_doc and not corner:
img[y][x] = accent
if 28 <= y <= 50 and x >= 30 and x <= 52 and (y - 28) > abs(x - 41) * 0.7:
img[y][x] = (255,255,255) if active else (220,220,220)
return img
def mine_icon(active):
img = solid_img(81, 81, 0, 0, 0)
accent = (7, 193, 96) if active else (180, 180, 180)
cx, cy = 40, 36
r = 18
for y in range(81):
for x in range(81):
d = math.sqrt((x-cx)**2 + (y-cy)**2)
if d <= r:
img[y][x] = accent
# shoulders
for y in range(55, 75):
for x in range(15, 66):
d = math.sqrt((x-40)**2/900 + (y-62)**2/225)
if d <= 1:
img[y][x] = accent
return img
static = '/Users/wac/Desktop/www/_src/petstore/frontend/src/static'
save_png(home_icon(False), 81, 81, f'{static}/tab-home.png')
save_png(home_icon(True), 81, 81, f'{static}/tab-home-active.png')
save_png(report_icon(False), 81, 81, f'{static}/tab-report.png')
save_png(report_icon(True), 81, 81, f'{static}/tab-report-active.png')
save_png(mine_icon(False), 81, 81, f'{static}/tab-mine.png')
save_png(mine_icon(True), 81, 81, f'{static}/tab-mine-active.png')
print('done')

BIN
dist/build/h5/static/tab-home-active.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 B

BIN
dist/build/h5/static/tab-home.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 B

BIN
dist/build/h5/static/tab-mine-active.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 B

BIN
dist/build/h5/static/tab-mine.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 231 B

BIN
dist/build/h5/static/tab-report.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 B

1
dist/build/mp-weixin/api/index.js vendored Normal file
View File

@ -0,0 +1 @@
"use strict";const e=require("../common/vendor.js"),t="http://localhost:8080".replace(/\/$/,""),r=`${t}/api`,s=t=>new Promise((s,o)=>{e.index.request({url:r+t.url,method:t.method||"GET",data:t.data||{},header:t.header||{},success:e=>s(e.data),fail:e=>o(e)})}),o=(e,t={})=>{const r=Object.entries(t).filter(([,e])=>null!=e).map(([e,t])=>`${encodeURIComponent(e)}=${encodeURIComponent(t)}`).join("&");return s({url:`${e}${r?"?"+r:""}`,method:"GET"})},p=(e,t={})=>s({url:e,method:"POST",data:t,header:{"Content-Type":"application/json"}}),a=(e,t={})=>s({url:e,method:"PUT",data:t,header:{"Content-Type":"application/json"}}),n=e=>s({url:e,method:"DELETE"});exports.API_ORIGIN=t,exports.BASE_URL=r,exports.cancelAppointment=e=>a(`/appointment/status?id=${e}&status=cancel`),exports.createAppointment=e=>p("/appointment/create",e),exports.createReport=e=>p("/report/create",e),exports.createServiceType=(e,t)=>p("/service-type/create",{storeId:e,name:t}),exports.createStaff=e=>p("/user/create-staff",e),exports.deleteServiceType=e=>n(`/service-type/delete?id=${e}`),exports.deleteStaff=e=>n(`/user/staff?staffId=${e}`),exports.getAppointmentList=(e,t)=>o("/appointment/list",{userId:e,storeId:t}),exports.getReportByToken=e=>o("/report/get",{token:e}),exports.getReportList=e=>o("/report/list",e),exports.getServiceTypeList=e=>o("/service-type/list",{storeId:e}),exports.getStaffList=e=>o("/user/staff-list",{storeId:e}),exports.imgUrl=e=>e?e.startsWith("http")?e:`${t}${e}`:"",exports.login=(e,t)=>p("/user/login",{phone:e,code:t}),exports.registerBoss=e=>p("/user/register-boss",e),exports.registerStaff=e=>p("/user/register-staff",e),exports.sendSms=e=>p("/sms/send",{phone:e}),exports.startAppointment=(e,t)=>p("/appointment/start",{appointmentId:e,staffUserId:t}),exports.updateStore=e=>a("/store/update",e),exports.updateUser=e=>a("/user/update",e);

1
dist/build/mp-weixin/app.js vendored Normal file
View File

@ -0,0 +1 @@
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./common/vendor.js"),n=require("./utils/session.js");Math;function r(){setTimeout(()=>{try{if(n.isLoggedIn())return;const r=getCurrentPages(),t=r[r.length-1];if((e=>!(!e||!e.includes("pages/login/Login")&&!e.includes("pages/report-view/reportView")))(t&&t.route?t.route:""))return;e.index.reLaunch({url:"/pages/login/Login"})}catch(r){e.index.reLaunch({url:"/pages/login/Login"})}},50)}const t={onLaunch(){r()},onShow(){r()}};function o(){return{app:e.createSSRApp(t)}}o().app.mount("#app"),exports.createApp=o;

32
dist/build/mp-weixin/app.json vendored Normal file
View File

@ -0,0 +1,32 @@
{
"pages": [
"pages/login/Login",
"pages/home/Home",
"pages/report/Report",
"pages/mine/Mine",
"pages/mine/Staff",
"pages/mine/ServiceType",
"pages/mine/Store",
"pages/mine/MyReports",
"pages/mine/MyOrders",
"pages/mine/Profile",
"pages/report-view/reportView"
],
"window": {
"navigationStyle": "custom",
"navigationBarTextStyle": "white",
"navigationBarTitleText": "宠伴生活馆",
"navigationBarBackgroundColor": "#07c160",
"backgroundColor": "#F8F8F8"
},
"lazyCodeLoading": "requiredComponents",
"permission": {
"scope.userLocation": {
"desc": "用于在地图上选择门店位置"
}
},
"requiredPrivateInfos": [
"chooseLocation"
],
"usingComponents": {}
}

2
dist/build/mp-weixin/app.wxss vendored Normal file

File diff suppressed because one or more lines are too long

7
dist/build/mp-weixin/common/vendor.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
"use strict";const e=require("../common/vendor.js");if(!Array){(e.resolveComponent("path")+e.resolveComponent("svg"))()}const C={__name:"AppIcon",props:{name:{type:String,required:!0},size:{type:Number,default:18},color:{type:String,default:"#475569"}},setup(C){const o=C,M={home:["M3 10.5L12 3L21 10.5","M6 9.5V20H18V9.5","M10 20V14H14V20"],report:["M7 3.5H14L18 7.5V20.5H7V3.5Z","M14 3.5V7.5H18","M9.5 12H15.5","M9.5 16H14"],mine:["M12 12C14.4853 12 16.5 9.98528 16.5 7.5C16.5 5.01472 14.4853 3 12 3C9.51472 3 7.5 5.01472 7.5 7.5C7.5 9.98528 9.51472 12 12 12Z","M4 20C4.9 16.7 8 14.5 12 14.5C16 14.5 19.1 16.7 20 20"],staff:["M7 11C8.65685 11 10 9.65685 10 8C10 6.34315 8.65685 5 7 5C5.34315 5 4 6.34315 4 8C4 9.65685 5.34315 11 7 11Z","M17 10C18.3807 10 19.5 8.88071 19.5 7.5C19.5 6.11929 18.3807 5 17 5C15.6193 5 14.5 6.11929 14.5 7.5C14.5 8.88071 15.6193 10 17 10Z","M3.5 19C4.1 16.7 5.9 15.2 8.4 15.2C10.9 15.2 12.7 16.7 13.3 19","M14 19C14.4 17.3 15.6 16.2 17.3 16.2C19 16.2 20.2 17.3 20.6 19"],service:["M5 8.5H19","M7.5 8.5V6.5C7.5 5.4 8.4 4.5 9.5 4.5H14.5C15.6 4.5 16.5 5.4 16.5 6.5V8.5","M6.5 8.5L7.2 18.5H16.8L17.5 8.5","M10 12.5L14 12.5"],store:["M4 9L5.5 4.5H18.5L20 9","M5 9V19H19V9","M8.5 19V14H15.5V19"],profile:["M12 12C14.4853 12 16.5 9.98528 16.5 7.5C16.5 5.01472 14.4853 3 12 3C9.51472 3 7.5 5.01472 7.5 7.5C7.5 9.98528 9.51472 12 12 12Z","M4.5 20C5.5 16.9 8.4 14.8 12 14.8C15.6 14.8 18.5 16.9 19.5 20"],orders:["M6 5H18","M6 9H18","M6 13H14","M6 3.5H18C18.8 3.5 19.5 4.2 19.5 5V19C19.5 19.8 18.8 20.5 18 20.5H6C5.2 20.5 4.5 19.8 4.5 19V5C4.5 4.2 5.2 3.5 6 3.5Z"],logout:["M10 6V4.5H5V19.5H10V18","M14 8L18 12L14 16","M18 12H9"],back:["M15 5L8 12L15 19"],close:["M6 6L18 18","M18 6L6 18"],camera:["M4.5 8.5H8L9.5 6.5H14.5L16 8.5H19.5V18.5H4.5V8.5Z","M12 16C13.933 16 15.5 14.433 15.5 12.5C15.5 10.567 13.933 9 12 9C10.067 9 8.5 10.567 8.5 12.5C8.5 14.433 10.067 16 12 16"],phone:["M2.25 6.75C2.25 15.03 8.97 21.75 17.25 21.75H19.5C20.7426 21.75 21.75 20.7426 21.75 19.5V19.128C21.75 18.612 21.399 18.162 20.898 18.03L16.475 16.924C16.035 16.814 15.573 16.979 15.303 17.354L14.333 18.647C14.051 19.047 13.53 19.188 13.098 19.035C10.834 18.208 8.792 16.166 7.965 13.902C7.812 13.47 7.953 12.949 8.353 12.667L9.646 11.697C10.021 11.427 10.186 10.965 10.076 10.525L8.97 6.102C8.838 5.601 8.388 5.25 7.872 5.25H4.5C3.25736 5.25 2.25 6.25736 2.25 7.5V6.75Z"],pin:["M15 10.5a3 3 0 11-6 0 3 3 0 016 0z","M19.5 10.5c0 7.142-7.5 11.25-7.5 11.25S4.5 17.642 4.5 10.5a7.5 7.5 0 1115 0z"]},r=e.computed(()=>M[o.name]||M.profile);return(o,M)=>({a:e.f(r.value,(o,M,r)=>({a:`${C.name}-${M}`,b:"385dda18-1-"+r+",385dda18-0",c:e.p({d:o,stroke:C.color,"stroke-width":"1.9","stroke-linecap":"round","stroke-linejoin":"round"})})),b:e.p({viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg"}),c:`${C.size}px`,d:`${C.size}px`})}},o=e._export_sfc(C,[["__scopeId","data-v-385dda18"]]);wx.createComponent(o);

View File

@ -0,0 +1,4 @@
{
"component": true,
"usingComponents": {}
}

View File

@ -0,0 +1 @@
<view class="app-icon data-v-385dda18" style="{{'width:' + c + ';' + ('height:' + d)}}"><svg wx:if="{{b}}" class="data-v-385dda18" u-s="{{['d']}}" u-i="385dda18-0" bind:__l="__l" u-p="{{b}}"><path wx:for="{{a}}" wx:for-item="d" wx:key="a" class="data-v-385dda18" u-i="{{d.b}}" bind:__l="__l" u-p="{{d.c}}"/></svg></view>

View File

@ -0,0 +1 @@
.app-icon.data-v-385dda18{display:inline-flex;align-items:center;justify-content:center}.app-icon svg.data-v-385dda18{width:100%;height:100%}

View File

@ -0,0 +1 @@
"use strict";const e=require("../common/vendor.js");Math||r();const r=()=>"./AppIcon.js",o={__name:"TabBar",props:{currentPage:{type:String,default:"home"}},emits:["change"],setup(r,{emit:o}){const n=r,t=o;function a(e){n.currentPage!==e&&t("change",e)}return(r,o)=>({a:e.p({name:"home",size:16,color:"home"===n.currentPage?"#16a34a":"#64748b"}),b:"home"===n.currentPage?1:"",c:e.o(e=>a("home")),d:e.p({name:"report",size:16,color:"report"===n.currentPage?"#16a34a":"#64748b"}),e:"report"===n.currentPage?1:"",f:e.o(e=>a("report")),g:e.p({name:"mine",size:16,color:"mine"===n.currentPage?"#16a34a":"#64748b"}),h:"mine"===n.currentPage?1:"",i:e.o(e=>a("mine"))})}},n=e._export_sfc(o,[["__scopeId","data-v-09922235"]]);wx.createComponent(n);

View File

@ -0,0 +1,6 @@
{
"component": true,
"usingComponents": {
"app-icon": "./AppIcon"
}
}

View File

@ -0,0 +1 @@
<view class="tabbar data-v-09922235"><view class="{{['tabbar-item', 'data-v-09922235', b && 'active']}}" bindtap="{{c}}"><view class="tabbar-icon data-v-09922235"><app-icon wx:if="{{a}}" class="data-v-09922235" u-i="09922235-0" bind:__l="__l" u-p="{{a}}"/></view><text class="tabbar-text data-v-09922235">服务预约</text></view><view class="{{['tabbar-item', 'data-v-09922235', e && 'active']}}" bindtap="{{f}}"><view class="tabbar-icon data-v-09922235"><app-icon wx:if="{{d}}" class="data-v-09922235" u-i="09922235-1" bind:__l="__l" u-p="{{d}}"/></view><text class="tabbar-text data-v-09922235">洗美报告</text></view><view class="{{['tabbar-item', 'data-v-09922235', h && 'active']}}" bindtap="{{i}}"><view class="tabbar-icon data-v-09922235"><app-icon wx:if="{{g}}" class="data-v-09922235" u-i="09922235-2" bind:__l="__l" u-p="{{g}}"/></view><text class="tabbar-text data-v-09922235">我的</text></view></view>

View File

@ -0,0 +1 @@
.tabbar.data-v-09922235{position:fixed;bottom:0;left:0;right:0;height:calc(104rpx + env(safe-area-inset-bottom));padding-bottom:env(safe-area-inset-bottom);background:rgba(255,255,255,.96);backdrop-filter:blur(8px);border-top:1px solid #e8edf4;display:flex;flex-direction:row;z-index:999}.tabbar-item.data-v-09922235{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:#94a3b8;transition:color .2s ease}.tabbar-item.active.data-v-09922235{color:#16a34a}.tabbar-icon.data-v-09922235{width:40rpx;height:40rpx;border-radius:11rpx;background:#eaf0f7;display:flex;align-items:center;justify-content:center;margin-bottom:4rpx}.tabbar-item.active .tabbar-icon.data-v-09922235{background:#dcfce7}.tabbar-text.data-v-09922235{font-size:22rpx;line-height:1;font-weight:600}

View File

@ -0,0 +1 @@
"use strict";const a=require("../utils/globalState.js");exports.useNavigator=()=>({goPage:t=>{a.navigateTo(t)},navigateTo:a.navigateTo});

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,6 @@
{
"usingComponents": {
"tab-bar": "../../components/TabBar",
"app-icon": "../../components/AppIcon"
}
}

View File

@ -0,0 +1 @@
<view class="page-shell home-page data-v-d5a02c57"><view class="home-nav nav-gradient data-v-d5a02c57" style="{{b}}"><text class="nav-title data-v-d5a02c57">宠伴生活馆</text><button class="btn-primary data-v-d5a02c57" bindtap="{{a}}">新建预约</button></view><view class="page-section home-hero data-v-d5a02c57"><view class="hero-title data-v-d5a02c57">今日服务看板</view><view class="hero-sub data-v-d5a02c57">待确认、进行中、已完成实时同步,支持一键开始服务与快速填报。</view></view><view class="page-section custom-tabs data-v-d5a02c57"><view wx:for="{{c}}" wx:for-item="tab" wx:key="d" class="{{['data-v-d5a02c57', 'tab-item', tab.e]}}" bindtap="{{tab.f}}">{{tab.a}} <label wx:if="{{tab.b}}" class="tab-badge data-v-d5a02c57">{{tab.c}}</label></view></view><view class="page-section list-content data-v-d5a02c57"><view wx:if="{{d}}" class="timeline data-v-d5a02c57"><view wx:for="{{e}}" wx:for-item="item" wx:key="q" class="timeline-item data-v-d5a02c57"><view class="{{['timeline-dot', 'data-v-d5a02c57', item.a]}}"><label class="dot-inner data-v-d5a02c57"></label></view><view class="timeline-line data-v-d5a02c57"></view><view class="{{['order-card', 'data-v-d5a02c57', item.p]}}"><view class="card-header data-v-d5a02c57"><view class="pet-info data-v-d5a02c57"><label class="pet-emoji data-v-d5a02c57"><app-icon wx:if="{{f}}" class="data-v-d5a02c57" u-i="{{item.b}}" bind:__l="__l" u-p="{{f}}"/></label><label class="pet-name data-v-d5a02c57">{{item.c}}</label></view><view class="{{['data-v-d5a02c57', item.e]}}">{{item.d}}</view></view><view class="service-row data-v-d5a02c57"><label class="{{['service-tag', 'data-v-d5a02c57', item.g]}}">{{item.f}}</label></view><view class="card-body data-v-d5a02c57"><view class="card-time data-v-d5a02c57"><app-icon wx:if="{{g}}" class="data-v-d5a02c57" u-i="{{item.h}}" bind:__l="__l" u-p="{{g}}"/>{{item.i}}</view></view><view class="card-footer data-v-d5a02c57"><view wx:if="{{item.j}}" class="action-btns data-v-d5a02c57"><button class="btn-primary data-v-d5a02c57" bindtap="{{item.k}}">开始服务</button><button class="btn-secondary data-v-d5a02c57" bindtap="{{item.l}}">取消</button></view><button wx:elif="{{item.m}}" class="btn-secondary data-v-d5a02c57" bindtap="{{item.n}}">填写报告</button><label wx:else class="done-label data-v-d5a02c57">{{item.o}}</label></view></view></view></view><view wx:if="{{h}}" class="empty data-v-d5a02c57"><text class="data-v-d5a02c57">暂无数据</text></view></view><view wx:if="{{i}}" class="popup-mask data-v-d5a02c57" bindtap="{{F}}"><view class="popup-content data-v-d5a02c57" catchtap="{{E}}"><view class="popup-header data-v-d5a02c57"><text class="popup-title data-v-d5a02c57">新建预约</text><text class="popup-close data-v-d5a02c57" bindtap="{{j}}">✕</text></view><view class="popup-body data-v-d5a02c57"><view class="popup-desc data-v-d5a02c57">填写基础信息后即可创建预约,后续可在列表中继续处理。</view><view class="field-label data-v-d5a02c57">宠物名字</view><input class="van-field data-v-d5a02c57" placeholder="请输入" value="{{k}}" bindinput="{{l}}"/><view class="field-label data-v-d5a02c57">宠物类型</view><picker class="data-v-d5a02c57" mode="selector" range="{{n}}" range-key="label" bindchange="{{o}}"><view class="van-field picker-field data-v-d5a02c57">{{m}}</view></picker><view class="field-label data-v-d5a02c57">服务类型</view><picker class="data-v-d5a02c57" mode="selector" range="{{q}}" range-key="label" bindchange="{{r}}"><view class="van-field picker-field data-v-d5a02c57">{{p}}</view></picker><view class="field-label data-v-d5a02c57">预约日期</view><picker class="data-v-d5a02c57" mode="date" value="{{t}}" bindchange="{{v}}"><view class="van-field picker-field data-v-d5a02c57">{{s}}</view></picker><view class="field-label data-v-d5a02c57">预约时间</view><picker class="data-v-d5a02c57" mode="time" value="{{x}}" bindchange="{{y}}"><view class="van-field picker-field data-v-d5a02c57">{{w}}</view></picker><view class="field-label data-v-d5a02c57">备注(可选)</view><block wx:if="{{r0}}"><textarea class="van-field remark-textarea data-v-d5a02c57" placeholder="可选" value="{{z}}" bindinput="{{A}}"/></block></view><view class="popup-footer data-v-d5a02c57"><view class="popup-actions data-v-d5a02c57"><button class="btn-ghost data-v-d5a02c57" bindtap="{{B}}">取消</button><button class="btn-block data-v-d5a02c57" loading="{{C}}" bindtap="{{D}}">确认创建</button></view></view></view></view></view><tab-bar wx:if="{{H}}" class="data-v-d5a02c57" bindchange="{{G}}" u-i="d5a02c57-2" bind:__l="__l" u-p="{{H}}"/>

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
"use strict";const e=require("../../common/vendor.js"),o=require("../../api/index.js"),a=require("../../utils/session.js"),l=require("../../utils/globalState.js"),n={__name:"Login",setup(n){const s=e.ref("login"),t=e.reactive({phone:"13800138001",code:"123456"}),r=e.reactive({storeName:"",bossName:"",phone:"",password:""}),u=e.reactive({inviteCode:"",name:"",phone:"",password:""}),i=e.ref(!1),v=e.ref(!1),d=e.ref(0),c=e.ref(!1),p=e.ref(!1),h=e.ref({store:{},user:{}});let g=null;const f=o=>e.index.showToast({title:o,icon:"none"}),m=async()=>{if(!t.phone||11!==t.phone.length)return f("请输入正确的手机号");const e=await o.sendSms(t.phone);200===e.code?(f("验证码已发送"),d.value=60,g=setInterval(()=>{d.value--,d.value<=0&&clearInterval(g)},1e3)):f(e.message||"发送失败")},w=async()=>{if(!t.phone||11!==t.phone.length)return f("请输入正确的手机号");if(!t.code||6!==t.code.length)return f("请输入6位验证码");i.value=!0;try{const e=await o.login(t.phone,t.code);200===e.code?(a.setUserSession(e.data.user),a.setStoreSession(e.data.store),l.navigateTo("home")):f(e.message||"登录失败")}catch(e){f("网络异常,请检查服务是否启动")}finally{i.value=!1}},b=()=>{f("跳转到微信授权..."),setTimeout(()=>{a.setUserSession({id:99,name:"微信用户",phone:"",role:"staff"}),a.setStoreSession({id:2,name:"宠伴生活馆测试店"}),l.navigateTo("home")},1500)},S=async()=>{const e=r;if(!e.storeName)return f("请输入店铺名称");if(!e.bossName)return f("请输入您的姓名");if(!e.phone||11!==e.phone.length)return f("请输入正确的手机号");if(!e.password||e.password.length<6)return f("密码至少6位");v.value=!0;const a=await o.registerBoss(e);v.value=!1,200===a.code?(h.value=a.data,c.value=!0):f(a.message||"注册失败")},C=async()=>{const e=u;if(!e.inviteCode||8!==e.inviteCode.length)return f("请输入8位邀请码");if(!e.name)return f("请输入您的姓名");if(!e.phone||11!==e.phone.length)return f("请输入正确的手机号");if(!e.password||e.password.length<6)return f("密码至少6位");v.value=!0;const a=await o.registerStaff(e);v.value=!1,200===a.code?(h.value=a.data,p.value=!0):f(a.message||"注册失败")},N=()=>{var o,a;e.index.setClipboardData({data:(null==(a=null==(o=h.value)?void 0:o.store)?void 0:a.inviteCode)||"",success:()=>e.index.showToast({title:"邀请码已复制",icon:"none"})})},x=()=>{s.value="login",c.value=!1,p.value=!1};return e.onUnmounted(()=>{g&&clearInterval(g)}),(o,a)=>{var l,n,g,f,y,T,_,j,q,I,U,B,D,L;return e.e({a:c.value},c.value?{b:e.t(null==(n=null==(l=h.value)?void 0:l.store)?void 0:n.name),c:e.t(null==(f=null==(g=h.value)?void 0:g.user)?void 0:f.phone),d:e.t(null==(T=null==(y=h.value)?void 0:y.user)?void 0:T.password),e:e.t(null==(j=null==(_=h.value)?void 0:_.store)?void 0:j.inviteCode),f:e.o(N),g:e.o(x)}:p.value?{i:e.t(null==(I=null==(q=h.value)?void 0:q.store)?void 0:I.name),j:e.t(null==(B=null==(U=h.value)?void 0:U.store)?void 0:B.name),k:e.t(null==(L=null==(D=h.value)?void 0:D.user)?void 0:L.phone),l:e.o(x)}:"login"===s.value?{n:t.phone,o:e.o(e=>t.phone=e.detail.value),p:t.code,q:e.o(e=>t.code=e.detail.value),r:e.t(d.value>0?d.value+"s":"获取验证码"),s:d.value>0,t:e.o(m),v:i.value,w:e.o(w),x:e.o(b),y:e.o(e=>s.value="staff-reg"),z:e.o(e=>s.value="boss-reg")}:"boss-reg"===s.value?{B:r.storeName,C:e.o(e=>r.storeName=e.detail.value),D:r.bossName,E:e.o(e=>r.bossName=e.detail.value),F:r.phone,G:e.o(e=>r.phone=e.detail.value),H:r.password,I:e.o(e=>r.password=e.detail.value),J:v.value,K:e.o(S),L:e.o(e=>s.value="login")}:"staff-reg"===s.value?{N:u.inviteCode,O:e.o(e=>u.inviteCode=e.detail.value),P:u.name,Q:e.o(e=>u.name=e.detail.value),R:u.phone,S:e.o(e=>u.phone=e.detail.value),T:u.password,U:e.o(e=>u.password=e.detail.value),V:v.value,W:e.o(C),X:e.o(e=>s.value="login")}:{},{h:p.value,m:"login"===s.value,A:"boss-reg"===s.value,M:"staff-reg"===s.value})}}},s=e._export_sfc(n,[["__scopeId","data-v-3e0cfe9c"]]);wx.createPage(s);

View File

@ -0,0 +1,3 @@
{
"usingComponents": {}
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
.login-page.data-v-3e0cfe9c{min-height:100vh;background:radial-gradient(circle at top left,#22c55e,#16a34a 46%,#15803d);display:flex;flex-direction:column;padding:60px 32px 32px}.login-logo.data-v-3e0cfe9c{text-align:center;margin-bottom:44px}.login-logo-text.data-v-3e0cfe9c{font-size:30px;font-weight:800;color:#fff;letter-spacing:2px;text-shadow:0 4px 12px rgba(0,0,0,.18)}.login-logo-sub.data-v-3e0cfe9c{font-size:13px;color:rgba(255,255,255,.82);margin-top:6px}.form-title.data-v-3e0cfe9c{font-size:18px;font-weight:600;color:#333;margin-bottom:20px;text-align:center}.login-divider.data-v-3e0cfe9c{text-align:center;margin:16px 0 12px;color:#999;font-size:13px;position:relative}.login-divider.data-v-3e0cfe9c:before,.login-divider.data-v-3e0cfe9c:after{content:"";position:absolute;top:50%;width:28%;height:1px;background:#eee}.login-divider.data-v-3e0cfe9c:before{left:0}.login-divider.data-v-3e0cfe9c:after{right:0}.links.data-v-3e0cfe9c{display:flex;justify-content:space-between;font-size:13px}.link.data-v-3e0cfe9c{color:#16a34a;font-weight:600;cursor:pointer}.invite-hint.data-v-3e0cfe9c{background:#f0f9f4;border:1px solid #b7eb8f;border-radius:8px;padding:12px;font-size:13px;color:#52c41a;margin-bottom:12px}.wechat-icon.data-v-3e0cfe9c{margin-right:6px}.success-icon.data-v-3e0cfe9c{font-size:60px;text-align:center;margin-bottom:16px}.success-title.data-v-3e0cfe9c{font-size:20px;font-weight:600;text-align:center;color:#333;margin-bottom:8px}.success-sub.data-v-3e0cfe9c{font-size:14px;color:#999;text-align:center;margin-bottom:24px}.success-info.data-v-3e0cfe9c{background:#f9f9f9;border-radius:12px;padding:16px;margin-bottom:20px}.info-row.data-v-3e0cfe9c{display:flex;justify-content:space-between;padding:6px 0;font-size:14px}.info-row .label.data-v-3e0cfe9c{color:#999}.info-row .value.data-v-3e0cfe9c{color:#333;font-weight:500}.sms-field.data-v-3e0cfe9c{display:flex;align-items:center;gap:8px;margin-bottom:12px}.sms-input.data-v-3e0cfe9c{flex:1}.top-gap-sm.data-v-3e0cfe9c{margin-top:12px}.top-gap-md.data-v-3e0cfe9c{margin-top:20px}

View File

@ -0,0 +1 @@
"use strict";const e=require("../../common/vendor.js"),n=require("../../utils/session.js"),o=require("../../composables/useNavigator.js");Math||(t+r)();const r=()=>"../../components/TabBar.js",t=()=>"../../components/AppIcon.js",s={__name:"Mine",emits:["change-page"],setup(r,{emit:t}){const s=n.getUserSession(),{goPage:a,navigateTo:i}=o.useNavigator(),u=(()=>{var n,o,r,t;let s=((null==(o=(n=e.index).getSystemInfoSync)?void 0:o.call(n).statusBarHeight)||20)+12;const a=null==(t=(r=e.index).getMenuButtonBoundingClientRect)?void 0:t.call(r);return a&&a.top&&a.height&&(s=a.top+a.height+8),`padding-top:${s}px;`})(),c=e.computed(()=>s.name?s.name.slice(0,1).toUpperCase():"?"),p=e.computed(()=>{var e;if(s.avatar)return{};const n=["#ff7c43","#07c160","#8b6914","#e06040","#5090d0"];return{background:n[((null==(e=s.name)?void 0:e.charCodeAt(0))||0)%n.length]}}),f=()=>{e.index.showModal({title:"提示",content:"确定退出登录?",success:e=>{e.confirm&&(n.clearSession(),i("login"))}})};return(n,o)=>e.e({a:e.unref(s).avatar},e.unref(s).avatar?{b:e.unref(s).avatar}:{c:e.t(c.value)},{d:e.s(p.value),e:e.t(e.unref(s).name),f:e.t(e.unref(s).phone),g:e.t("boss"===e.unref(s).role?"店长":"员工"),h:e.s(e.unref(u)),i:e.o(n=>e.unref(i)("profile")),j:"boss"===e.unref(s).role},"boss"===e.unref(s).role?{k:e.p({name:"staff",size:15}),l:e.o(n=>e.unref(i)("staff")),m:e.p({name:"service",size:15}),n:e.o(n=>e.unref(i)("serviceType")),o:e.p({name:"store",size:15}),p:e.o(n=>e.unref(i)("store"))}:{},{q:e.p({name:"profile",size:15}),r:e.o(n=>e.unref(i)("profile")),s:e.p({name:"report",size:15}),t:e.o(n=>e.unref(i)("myReports")),v:e.p({name:"orders",size:15}),w:e.o(n=>e.unref(i)("myOrders")),x:e.p({name:"logout",size:15,color:"#dc2626"}),y:e.o(f),z:e.o(e.unref(a)),A:e.p({"current-page":"mine"})})}},a=e._export_sfc(s,[["__scopeId","data-v-27768e55"]]);wx.createPage(a);

View File

@ -0,0 +1,6 @@
{
"usingComponents": {
"tab-bar": "../../components/TabBar",
"app-icon": "../../components/AppIcon"
}
}

View File

@ -0,0 +1 @@
<view class="mine-page data-v-27768e55"><view class="user-card data-v-27768e55" style="{{h}}" bindtap="{{i}}"><view class="user-info data-v-27768e55"><view class="user-avatar data-v-27768e55" style="{{d}}"><image wx:if="{{a}}" src="{{b}}" class="avatar-img data-v-27768e55"/><label wx:else class="avatar-initials data-v-27768e55">{{c}}</label></view><view class="user-info-content data-v-27768e55"><view class="user-name data-v-27768e55">{{e}}</view><view class="user-phone data-v-27768e55">{{f}}</view><view class="role-pill data-v-27768e55">{{g}}</view></view></view></view><view wx:if="{{j}}" class="menu-section data-v-27768e55"><view class="menu-card data-v-27768e55"><view class="menu-title data-v-27768e55">店铺管理</view><view class="menu-item data-v-27768e55" bindtap="{{l}}"><view class="menu-left data-v-27768e55"><label class="menu-icon data-v-27768e55"><app-icon wx:if="{{k}}" class="data-v-27768e55" u-i="27768e55-0" bind:__l="__l" u-p="{{k}}"/></label><label class="menu-text data-v-27768e55">员工管理</label></view><label class="menu-arrow data-v-27768e55"></label></view><view class="menu-item data-v-27768e55" bindtap="{{n}}"><view class="menu-left data-v-27768e55"><label class="menu-icon data-v-27768e55"><app-icon wx:if="{{m}}" class="data-v-27768e55" u-i="27768e55-1" bind:__l="__l" u-p="{{m}}"/></label><label class="menu-text data-v-27768e55">服务类型</label></view><label class="menu-arrow data-v-27768e55"></label></view><view class="menu-item data-v-27768e55" bindtap="{{p}}"><view class="menu-left data-v-27768e55"><label class="menu-icon data-v-27768e55"><app-icon wx:if="{{o}}" class="data-v-27768e55" u-i="27768e55-2" bind:__l="__l" u-p="{{o}}"/></label><label class="menu-text data-v-27768e55">店铺设置</label></view><label class="menu-arrow data-v-27768e55"></label></view></view></view><view class="menu-section data-v-27768e55"><view class="menu-card data-v-27768e55"><view class="menu-title data-v-27768e55">个人中心</view><view class="menu-item data-v-27768e55" bindtap="{{r}}"><view class="menu-left data-v-27768e55"><label class="menu-icon data-v-27768e55"><app-icon wx:if="{{q}}" class="data-v-27768e55" u-i="27768e55-3" bind:__l="__l" u-p="{{q}}"/></label><label class="menu-text data-v-27768e55">个人信息</label></view><label class="menu-arrow data-v-27768e55"></label></view><view class="menu-item data-v-27768e55" bindtap="{{t}}"><view class="menu-left data-v-27768e55"><label class="menu-icon data-v-27768e55"><app-icon wx:if="{{s}}" class="data-v-27768e55" u-i="27768e55-4" bind:__l="__l" u-p="{{s}}"/></label><label class="menu-text data-v-27768e55">我的报告</label></view><label class="menu-arrow data-v-27768e55"></label></view><view class="menu-item data-v-27768e55" bindtap="{{w}}"><view class="menu-left data-v-27768e55"><label class="menu-icon data-v-27768e55"><app-icon wx:if="{{v}}" class="data-v-27768e55" u-i="27768e55-5" bind:__l="__l" u-p="{{v}}"/></label><label class="menu-text data-v-27768e55">我的订单</label></view><label class="menu-arrow data-v-27768e55"></label></view></view></view><view class="menu-section data-v-27768e55"><button class="logout-btn data-v-27768e55" bindtap="{{y}}"><app-icon wx:if="{{x}}" class="data-v-27768e55" u-i="27768e55-6" bind:__l="__l" u-p="{{x}}"/>退出登录</button></view></view><tab-bar wx:if="{{A}}" class="data-v-27768e55" bindchange="{{z}}" u-i="27768e55-7" bind:__l="__l" u-p="{{A}}"/>

View File

@ -0,0 +1 @@
.mine-page.data-v-27768e55{padding-bottom:140rpx;background:#f5f7fb;min-height:100vh}.user-card.data-v-27768e55{background:linear-gradient(135deg,#22c55e,#16a34a);border-radius:0 0 24px 24px;padding:24px 16px 22px;color:#fff;cursor:pointer;box-shadow:0 10px 24px rgba(34,197,94,.25)}.user-info.data-v-27768e55{display:flex;align-items:center;gap:12px}.user-info-content.data-v-27768e55{flex:1}.user-avatar.data-v-27768e55{width:58px;height:58px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:24px;overflow:hidden;flex-shrink:0;border:2px solid rgba(255,255,255,.3)}.avatar-img.data-v-27768e55{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.avatar-initials.data-v-27768e55{color:#fff;font-size:22px;font-weight:700}.user-name.data-v-27768e55{font-size:21px;font-weight:700;color:#fff;line-height:1.1}.user-phone.data-v-27768e55{font-size:14px;opacity:.92;margin-top:4px}.role-pill.data-v-27768e55{margin-top:8px;display:inline-flex;align-items:center;height:24px;padding:0 10px;border-radius:999px;font-size:12px;font-weight:700;background:rgba(255,255,255,.92);color:#166534}.menu-section.data-v-27768e55{padding:0 14px;margin-top:12px}.menu-card.data-v-27768e55{background:#fff;border:1px solid #e6ecf4;border-radius:16px;box-shadow:0 8px 20px rgba(15,23,42,.05);overflow:hidden}.menu-title.data-v-27768e55{font-size:12px;color:#94a3b8;font-weight:700;padding:12px 14px 8px}.menu-item.data-v-27768e55{min-height:54px;padding:0 14px;display:flex;align-items:center;justify-content:space-between}.menu-item+.menu-item.data-v-27768e55{border-top:1px solid #eef2f7}.menu-left.data-v-27768e55{display:flex;align-items:center;gap:10px}.menu-icon.data-v-27768e55{width:28px;height:28px;border-radius:8px;background:#f1f5f9;display:inline-flex;align-items:center;justify-content:center;font-size:16px}.menu-text.data-v-27768e55{font-size:16px;color:#1f2937;font-weight:600}.menu-arrow.data-v-27768e55{color:#c4cfdd;font-size:18px}.logout-btn.data-v-27768e55{width:100%;height:44px;display:inline-flex;align-items:center;justify-content:center;gap:6px;border-radius:12px;border:1px solid #fecaca;background:#fff1f2;color:#dc2626;font-size:15px;font-weight:700}

View File

@ -0,0 +1 @@
"use strict";const e=require("../../common/vendor.js"),t=require("../../utils/globalState.js"),n=require("../../api/index.js"),i=require("../../utils/session.js"),a=require("../../utils/datetime.js"),s=require("../../utils/appointment.js");Math||o();const o=()=>"../../components/AppIcon.js",p={__name:"MyOrders",emits:["change-page"],setup(o,{emit:p}){const c=i.getUserSession(),r=c.id,u=(()=>{var t,n,i,a;const s=(null==(n=(t=e.index).getSystemInfoSync)?void 0:n.call(t).statusBarHeight)||20;let o=s+44;const p=null==(a=(i=e.index).getMenuButtonBoundingClientRect)?void 0:a.call(i);if(p&&p.top&&p.height){o=s+2*Math.max(p.top-s,4)+p.height}return`padding-top:${s}px;height:${o}px;`})(),d=e.ref("new"),m=e.ref([]),l=[{title:"待确认",name:"new"},{title:"进行中",name:"doing"},{title:"已完成",name:"done"}],g=e.computed(()=>m.value.filter(e=>"new"===d.value?"new"===e.status:"doing"===d.value?"doing"===e.status:"done"!==d.value||("done"===e.status||"cancel"===e.status))),v=async()=>{if(!r)return;const e=await n.getAppointmentList(r);200===e.code&&(m.value=e.data.map(e=>({id:e.id,title:e.serviceType||"洗澡美容预约",desc:`${e.petType||""} - ${e.petName||""}`,time:a.formatDateTimeCN(e.appointmentTime),status:e.status||"new",statusText:s.getAppointmentStatusText(e.status),petName:e.petName,petType:e.petType,serviceType:e.serviceType,appointmentTime:e.appointmentTime})))};return e.onMounted(()=>v()),(i,a)=>e.e({a:e.p({name:"back",size:18,color:"#ffffff"}),b:e.o(n=>e.unref(t.navigateTo)("mine")),c:e.s(e.unref(u)),d:e.f(l,(t,n,i)=>({a:e.t(t.title),b:t.name,c:e.n({active:d.value===t.name}),d:e.o(e=>d.value=t.name,t.name)})),e:e.f(g.value,(i,a,o)=>{return e.e({a:e.t(i.title),b:e.t(i.statusText),c:e.n(`van-tag van-tag--${p=i.status,s.getAppointmentTagType(p)}`),d:"be66263e-1-"+o,e:e.t(i.desc),f:"be66263e-2-"+o,g:e.t(i.time),h:"new"===i.status},"new"===i.status?{i:e.o(t=>(async t=>{const i=await n.startAppointment(t.id,c.id);200===i.code?(e.index.showToast({title:"已开始服务",icon:"success"}),v()):e.index.showToast({title:i.message||"操作失败",icon:"none"})})(i),i.id),j:e.o(t=>(async t=>{e.index.showModal({title:"提示",content:"确定取消该预约?",success:async i=>{i.confirm&&200===(await n.cancelAppointment(t.id)).code&&(e.index.showToast({title:"已取消",icon:"success"}),v())}})})(i),i.id)}:"doing"===i.status?{l:e.o(n=>(n=>{e.index.setStorageSync("petstore_report_prefill",JSON.stringify({appointmentId:n.id,petName:n.petName,serviceType:n.serviceType,appointmentTime:n.appointmentTime})),t.navigateTo("report")})(i),i.id)}:{},{k:"doing"===i.status,m:i.id});var p}),f:e.p({name:"profile",size:12}),g:e.p({name:"orders",size:12,color:"#94a3b8"}),h:0===g.value.length},(g.value.length,{}))}},c=e._export_sfc(p,[["__scopeId","data-v-be66263e"]]);wx.createPage(c);

View File

@ -0,0 +1,5 @@
{
"usingComponents": {
"app-icon": "../../components/AppIcon"
}
}

View File

@ -0,0 +1 @@
<view class="page-shell orders-page data-v-be66263e"><view class="orders-nav nav-gradient data-v-be66263e" style="{{c}}"><text class="nav-back data-v-be66263e" bindtap="{{b}}"><app-icon wx:if="{{a}}" class="data-v-be66263e" u-i="be66263e-0" bind:__l="__l" u-p="{{a}}"/></text><text class="nav-title data-v-be66263e">我的订单</text><view class="nav-placeholder data-v-be66263e"></view></view><view class="page-section orders-hero data-v-be66263e"><view class="hero-title data-v-be66263e">服务进度一目了然</view><view class="hero-sub data-v-be66263e">按状态查看订单,待确认可快速开始服务,进行中可直接填写报告。</view></view><view class="van-tabs data-v-be66263e"><view wx:for="{{d}}" wx:for-item="tab" wx:key="b" class="{{['data-v-be66263e', 'van-tabs__tab', tab.c]}}" bindtap="{{tab.d}}">{{tab.a}}</view></view><view class="page-section section-gap data-v-be66263e"><view wx:for="{{e}}" wx:for-item="item" wx:key="m" class="order-item data-v-be66263e"><view class="order-head data-v-be66263e"><view class="order-title data-v-be66263e">{{item.a}}</view><view class="{{['data-v-be66263e', item.c]}}">{{item.b}}</view></view><view class="order-desc data-v-be66263e"><label class="desc-icon data-v-be66263e"><app-icon wx:if="{{f}}" class="data-v-be66263e" u-i="{{item.d}}" bind:__l="__l" u-p="{{f}}"/></label><label class="data-v-be66263e">{{item.e}}</label></view><view class="order-footer data-v-be66263e"><label class="order-time data-v-be66263e"><app-icon wx:if="{{g}}" class="data-v-be66263e" u-i="{{item.f}}" bind:__l="__l" u-p="{{g}}"/><text class="data-v-be66263e">{{item.g}}</text></label></view><view wx:if="{{item.h}}" class="action-btns data-v-be66263e"><button class="van-button van-button--small van-button--primary data-v-be66263e" bindtap="{{item.i}}">开始服务</button><button class="van-button van-button--small data-v-be66263e" bindtap="{{item.j}}">取消</button></view><button wx:elif="{{item.k}}" class="van-button van-button--small btn-mt data-v-be66263e" bindtap="{{item.l}}">填写报告</button></view></view><view wx:if="{{h}}" class="empty data-v-be66263e"><text class="data-v-be66263e">暂无数据</text></view></view>

View File

@ -0,0 +1 @@
.orders-page.data-v-be66263e{padding-bottom:120rpx}.nav-placeholder.data-v-be66263e{width:32px}.btn-mt.data-v-be66263e{margin-top:10px}.orders-hero.data-v-be66263e{margin-top:12px;padding:14px 16px;border:1px solid #dcefe3;border-radius:14px;background:linear-gradient(135deg,#f3fff7,#ecfbf3)}.hero-title.data-v-be66263e{font-size:16px;font-weight:700;color:#166534}.hero-sub.data-v-be66263e{margin-top:4px;font-size:12px;color:#4b5563;line-height:1.45}.orders-nav.data-v-be66263e{padding:14px 16px;display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:10}.nav-back.data-v-be66263e{font-size:20px;color:#fff}.nav-title.data-v-be66263e{font-size:18px;font-weight:700;color:#fff}.order-item.data-v-be66263e{background:#fff;margin-bottom:12px;border-radius:14px;padding:16px;border:1px solid #e8edf4;box-shadow:0 6px 16px rgba(15,23,42,.05)}.order-head.data-v-be66263e{display:flex;align-items:center;justify-content:space-between;gap:8px}.order-title.data-v-be66263e{font-size:15px;font-weight:700;color:#1f2937;margin-bottom:6px}.order-desc.data-v-be66263e{font-size:13px;color:#6b7280;margin-bottom:10px;display:flex;align-items:center;gap:6px}.desc-icon.data-v-be66263e{width:18px;height:18px;border-radius:6px;background:#eef2f7;display:inline-flex;align-items:center;justify-content:center}.order-footer.data-v-be66263e{display:flex;justify-content:space-between;align-items:center}.order-time.data-v-be66263e{font-size:12px;color:#94a3b8;display:inline-flex;align-items:center;gap:4px}.action-btns.data-v-be66263e{display:flex;gap:8px;margin-top:10px}

View File

@ -0,0 +1 @@
"use strict";const e=require("../../common/vendor.js"),t=require("../../utils/globalState.js"),o=require("../../api/index.js"),n=require("../../utils/session.js");Math||a();const a=()=>"../../components/AppIcon.js",r={__name:"MyReports",emits:["change-page"],setup(a,{emit:r}){const s=n.getUserSession(),i=n.getStoreSession(),l=(()=>{var t,o,n,a;const r=(null==(o=(t=e.index).getSystemInfoSync)?void 0:o.call(t).statusBarHeight)||20;let s=r+44;const i=null==(a=(n=e.index).getMenuButtonBoundingClientRect)?void 0:a.call(n);if(i&&i.top&&i.height){s=r+2*Math.max(i.top-r,4)+i.height}return`padding-top:${r}px;height:${s}px;`})(),u=e.ref(!1),c=e.ref([]),p=()=>{t.navigateTo("home")};return e.onMounted(()=>(async()=>{u.value=!0;const e="boss"===s.role?{storeId:i.id}:{userId:s.id},t=await o.getReportList(e);u.value=!1,200===t.code&&(c.value=t.data)})()),(t,n)=>e.e({a:e.p({name:"home",size:16,color:"#ffffff"}),b:e.o(p),c:e.s(e.unref(l)),d:e.t(c.value.length),e:c.value.length>0},c.value.length>0?{f:e.f(c.value,(t,n,a)=>e.e({a:t.beforePhoto},t.beforePhoto?{b:e.unref(o.imgUrl)(t.beforePhoto)}:{c:"7cf97651-1-"+a,d:e.p({name:"camera",size:18,color:"#94a3b8"})},{e:e.t(t.petName),f:e.t(t.serviceType),g:"7cf97651-2-"+a,h:t.id,i:e.o(n=>(t=>{o.API_ORIGIN,t.reportToken,e.index.navigateTo({url:`/pages/report-view/reportView?token=${t.reportToken}`})})(t),t.id)})),g:e.p({name:"report",size:11,color:"#64748b"})}:{},{h:!u.value&&0===c.value.length},(u.value||c.value.length,{}))}},s=e._export_sfc(r,[["__scopeId","data-v-7cf97651"]]);wx.createPage(s);

View File

@ -0,0 +1,5 @@
{
"usingComponents": {
"app-icon": "../../components/AppIcon"
}
}

View File

@ -0,0 +1 @@
<view class="page-shell my-reports-page data-v-7cf97651"><view class="report-nav nav-gradient data-v-7cf97651" style="{{c}}"><text class="nav-back nav-home-btn data-v-7cf97651" bindtap="{{b}}"><app-icon wx:if="{{a}}" class="data-v-7cf97651" u-i="7cf97651-0" bind:__l="__l" u-p="{{a}}"/></text><text class="nav-title data-v-7cf97651">我的报告</text><view class="nav-placeholder data-v-7cf97651"></view></view><view class="page-section reports-hero data-v-7cf97651"><view class="hero-title data-v-7cf97651">服务成果回顾</view><view class="hero-sub data-v-7cf97651">已生成 <text class="hero-count data-v-7cf97651">{{d}}</text> 份报告,点击卡片可查看详情并分享。</view></view><view wx:if="{{e}}" class="page-section section-gap gallery-grid data-v-7cf97651"><view wx:for="{{f}}" wx:for-item="r" wx:key="h" class="gallery-item data-v-7cf97651" bindtap="{{r.i}}"><view class="gallery-cover data-v-7cf97651"><image wx:if="{{r.a}}" src="{{r.b}}" class="cover-img data-v-7cf97651"/><view wx:else class="cover-placeholder data-v-7cf97651"><label class="placeholder-icon data-v-7cf97651"><app-icon wx:if="{{r.d}}" class="data-v-7cf97651" u-i="{{r.c}}" bind:__l="__l" u-p="{{r.d}}"/></label></view><view class="gallery-overlay data-v-7cf97651"><view class="overlay-name data-v-7cf97651">{{r.e}}</view><view class="overlay-service data-v-7cf97651">{{r.f}}</view></view></view><view class="gallery-meta data-v-7cf97651"><label class="meta-chip data-v-7cf97651"><app-icon wx:if="{{g}}" class="data-v-7cf97651" u-i="{{r.g}}" bind:__l="__l" u-p="{{g}}"/><text class="data-v-7cf97651">查看报告</text></label></view></view></view><view wx:if="{{h}}" class="empty data-v-7cf97651"><text class="data-v-7cf97651">暂无报告</text></view></view>

View File

@ -0,0 +1 @@
.my-reports-page.data-v-7cf97651{padding:0 0 120rpx}.nav-placeholder.data-v-7cf97651{width:32px}.nav-home-btn.data-v-7cf97651{background:rgba(255,255,255,.2);border:1px solid rgba(255,255,255,.35)}.reports-hero.data-v-7cf97651{margin-top:12px;padding:14px 16px;border:1px solid #dcefe3;border-radius:14px;background:linear-gradient(135deg,#f3fff7,#ecfbf3)}.hero-title.data-v-7cf97651{font-size:16px;font-weight:700;color:#166534}.hero-sub.data-v-7cf97651{margin-top:4px;font-size:12px;color:#4b5563;line-height:1.45}.hero-count.data-v-7cf97651{font-weight:700;color:#16a34a}.placeholder-icon.data-v-7cf97651{width:36px;height:36px;border-radius:10px;background:#e2e8f0;display:inline-flex;align-items:center;justify-content:center}.report-nav.data-v-7cf97651{padding:14px 16px;display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:10}.nav-back.data-v-7cf97651{font-size:20px;color:#fff}.nav-title.data-v-7cf97651{font-size:18px;font-weight:700;color:#fff}.gallery-grid.data-v-7cf97651{display:grid;grid-template-columns:1fr 1fr;gap:12px;padding-top:14px}.gallery-item.data-v-7cf97651{border-radius:14px;overflow:hidden;cursor:pointer;background:#fff;border:1px solid #e8edf4;box-shadow:0 8px 18px rgba(15,23,42,.06)}.gallery-cover.data-v-7cf97651{position:relative;width:100%;aspect-ratio:1;overflow:hidden}.cover-img.data-v-7cf97651{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.cover-placeholder.data-v-7cf97651{width:100%;height:100%;background:#f0ede8;display:flex;align-items:center;justify-content:center}.gallery-overlay.data-v-7cf97651{position:absolute;bottom:0;left:0;right:0;padding:8px 10px;background:linear-gradient(transparent,rgba(0,0,0,.65));color:#fff}.overlay-name.data-v-7cf97651{font-size:13px;font-weight:600}.overlay-service.data-v-7cf97651{font-size:11px;opacity:.9;margin-top:2px}.gallery-meta.data-v-7cf97651{padding:8px 10px 10px;background:#fff}.meta-chip.data-v-7cf97651{display:inline-flex;align-items:center;gap:4px;height:22px;padding:0 8px;border-radius:999px;background:#f1f5f9;color:#64748b;font-size:11px}

Some files were not shown because too many files have changed in this diff Show More