Compare commits

...

No commits in common. "40a128aedc67f0522156ae39160f410336576146" and "bb0908e7d304b8a7e0c368d0f418ab9e26270ed4" have entirely different histories.

260 changed files with 26762 additions and 1 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

1
.env.production Normal file
View File

@ -0,0 +1 @@
VITE_API_ORIGIN=https://api.s-good.com

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
node_modules/
node_modules

1
.gitignore 2 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 2.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>

201
LICENSE Normal file
View File

@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

36
README.en.md Normal file
View File

@ -0,0 +1,36 @@
# petstore-frontend
#### Description
宠伴生活馆
#### Software Architecture
Software architecture description
#### Installation
1. xxxx
2. xxxx
3. xxxx
#### Instructions
1. xxxx
2. xxxx
3. xxxx
#### Contribution
1. Fork the repository
2. Create Feat_xxx branch
3. Commit your code
4. Create Pull Request
#### Gitee Feature
1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
2. Gitee blog [blog.gitee.com](https://blog.gitee.com)
3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
4. The most valuable open source project [GVP](https://gitee.com/gvp)
5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

106
README.md
View File

@ -1,2 +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. 安装依赖
```bash
cd /Users/wac/Desktop/www/_src/petstore/frontend
npm install
```
### 2. 安装图标(自动创建 tabBar 图标)
```bash
bash setup-icons.sh
```
这会生成 6 个 PNG 图标文件到 `static/` 目录。
> **注意:** 如果 bash 脚本执行失败Python3 找不到),手动将 `static/` 下的 `.svg` 文件改名为 `.png` 并替换。
### 3. 配置 manifest.json
打开 `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 t(){setTimeout(()=>{try{if(n.isLoggedIn())return;const t=getCurrentPages();if(0===t.length)return;const r=t[t.length-1];if((e=>!(!e||!e.includes("pages/login/Login")&&!e.includes("pages/report-view/reportView")))(r&&r.route?r.route:""))return;e.index.reLaunch({url:"/pages/login/Login"})}catch(t){e.index.reLaunch({url:"/pages/login/Login"})}},50)}const r={onLaunch(){t()},onShow(){t()}};function o(){return{app:e.createSSRApp(r)}}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"
}
}

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 @@
"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"),r=require("../../utils/session.js"),n=require("../../composables/useNavigator.js");Math||(t+o)();const o=()=>"../../components/TabBar.js",t=()=>"../../components/AppIcon.js",s={__name:"Mine",emits:["change-page"],setup(o,{emit:t}){const s=r.getUserSession(),{goPage:a,navigateTo:u}=n.useNavigator(),i=(()=>{var r,n,o,t;let s=((null==(n=(r=e.index).getSystemInfoSync)?void 0:n.call(r).statusBarHeight)||20)+12;const a=null==(t=(o=e.index).getMenuButtonBoundingClientRect)?void 0:t.call(o);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 r=["#ff7c43","#07c160","#8b6914","#e06040","#5090d0"];return{background:r[((null==(e=s.name)?void 0:e.charCodeAt(0))||0)%r.length]}}),f=()=>{e.index.showModal({title:"提示",content:"确定退出登录?",success:e=>{e.confirm&&(r.clearSession(),u("login"))}})};return(r,n)=>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?"店长":"customer"===e.unref(s).role?"客户":"员工"),h:e.s(e.unref(i)),i:e.o(r=>e.unref(u)("profile")),j:"boss"===e.unref(s).role},"boss"===e.unref(s).role?{k:e.p({name:"staff",size:15}),l:e.o(r=>e.unref(u)("staff")),m:e.p({name:"service",size:15}),n:e.o(r=>e.unref(u)("serviceType")),o:e.p({name:"store",size:15}),p:e.o(r=>e.unref(u)("store"))}:{},{q:e.p({name:"profile",size:15}),r:e.o(r=>e.unref(u)("profile")),s:"customer"!==e.unref(s).role},"customer"!==e.unref(s).role?{t:e.p({name:"report",size:15}),v:e.o(r=>e.unref(u)("myReports"))}:{},{w:e.p({name:"orders",size:15}),x:e.o(r=>e.unref(u)("myOrders")),y:e.p({name:"logout",size:15,color:"#dc2626"}),z:e.o(f),A:e.o(e.unref(a)),B:e.p({"current-page":"mine"})})}},a=e._export_sfc(s,[["__scopeId","data-v-5428c025"]]);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-5428c025"><view class="user-card data-v-5428c025" style="{{h}}" bindtap="{{i}}"><view class="user-info data-v-5428c025"><view class="user-avatar data-v-5428c025" style="{{d}}"><image wx:if="{{a}}" src="{{b}}" class="avatar-img data-v-5428c025"/><label wx:else class="avatar-initials data-v-5428c025">{{c}}</label></view><view class="user-info-content data-v-5428c025"><view class="user-name data-v-5428c025">{{e}}</view><view class="user-phone data-v-5428c025">{{f}}</view><view class="role-pill data-v-5428c025">{{g}}</view></view></view></view><view wx:if="{{j}}" class="menu-section data-v-5428c025"><view class="menu-card data-v-5428c025"><view class="menu-title data-v-5428c025">店铺管理</view><view class="menu-item data-v-5428c025" bindtap="{{l}}"><view class="menu-left data-v-5428c025"><label class="menu-icon data-v-5428c025"><app-icon wx:if="{{k}}" class="data-v-5428c025" u-i="5428c025-0" bind:__l="__l" u-p="{{k}}"/></label><label class="menu-text data-v-5428c025">员工管理</label></view><label class="menu-arrow data-v-5428c025"></label></view><view class="menu-item data-v-5428c025" bindtap="{{n}}"><view class="menu-left data-v-5428c025"><label class="menu-icon data-v-5428c025"><app-icon wx:if="{{m}}" class="data-v-5428c025" u-i="5428c025-1" bind:__l="__l" u-p="{{m}}"/></label><label class="menu-text data-v-5428c025">服务类型</label></view><label class="menu-arrow data-v-5428c025"></label></view><view class="menu-item data-v-5428c025" bindtap="{{p}}"><view class="menu-left data-v-5428c025"><label class="menu-icon data-v-5428c025"><app-icon wx:if="{{o}}" class="data-v-5428c025" u-i="5428c025-2" bind:__l="__l" u-p="{{o}}"/></label><label class="menu-text data-v-5428c025">店铺设置</label></view><label class="menu-arrow data-v-5428c025"></label></view></view></view><view class="menu-section data-v-5428c025"><view class="menu-card data-v-5428c025"><view class="menu-title data-v-5428c025">个人中心</view><view class="menu-item data-v-5428c025" bindtap="{{r}}"><view class="menu-left data-v-5428c025"><label class="menu-icon data-v-5428c025"><app-icon wx:if="{{q}}" class="data-v-5428c025" u-i="5428c025-3" bind:__l="__l" u-p="{{q}}"/></label><label class="menu-text data-v-5428c025">个人信息</label></view><label class="menu-arrow data-v-5428c025"></label></view><view wx:if="{{s}}" class="menu-item data-v-5428c025" bindtap="{{v}}"><view class="menu-left data-v-5428c025"><label class="menu-icon data-v-5428c025"><app-icon wx:if="{{t}}" class="data-v-5428c025" u-i="5428c025-4" bind:__l="__l" u-p="{{t}}"/></label><label class="menu-text data-v-5428c025">我的报告</label></view><label class="menu-arrow data-v-5428c025"></label></view><view class="menu-item data-v-5428c025" bindtap="{{x}}"><view class="menu-left data-v-5428c025"><label class="menu-icon data-v-5428c025"><app-icon wx:if="{{w}}" class="data-v-5428c025" u-i="5428c025-5" bind:__l="__l" u-p="{{w}}"/></label><label class="menu-text data-v-5428c025">我的订单</label></view><label class="menu-arrow data-v-5428c025"></label></view></view></view><view class="menu-section data-v-5428c025"><button class="logout-btn data-v-5428c025" bindtap="{{z}}"><app-icon wx:if="{{y}}" class="data-v-5428c025" u-i="5428c025-6" bind:__l="__l" u-p="{{y}}"/>退出登录</button></view></view><tab-bar wx:if="{{B}}" class="data-v-5428c025" bindchange="{{A}}" u-i="5428c025-7" bind:__l="__l" u-p="{{B}}"/>

View File

@ -0,0 +1 @@
.mine-page.data-v-5428c025{padding-bottom:140rpx;background:#f5f7fb;min-height:100vh}.user-card.data-v-5428c025{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-5428c025{display:flex;align-items:center;gap:12px}.user-info-content.data-v-5428c025{flex:1}.user-avatar.data-v-5428c025{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-5428c025{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.avatar-initials.data-v-5428c025{color:#fff;font-size:22px;font-weight:700}.user-name.data-v-5428c025{font-size:21px;font-weight:700;color:#fff;line-height:1.1}.user-phone.data-v-5428c025{font-size:14px;opacity:.92;margin-top:4px}.role-pill.data-v-5428c025{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-5428c025{padding:0 14px;margin-top:12px}.menu-card.data-v-5428c025{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-5428c025{font-size:12px;color:#94a3b8;font-weight:700;padding:12px 14px 8px}.menu-item.data-v-5428c025{min-height:54px;padding:0 14px;display:flex;align-items:center;justify-content:space-between}.menu-item+.menu-item.data-v-5428c025{border-top:1px solid #eef2f7}.menu-left.data-v-5428c025{display:flex;align-items:center;gap:10px}.menu-icon.data-v-5428c025{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-5428c025{font-size:16px;color:#1f2937;font-weight:600}.menu-arrow.data-v-5428c025{color:#c4cfdd;font-size:18px}.logout-btn.data-v-5428c025{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}

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