Compare commits
No commits in common. "40a128aedc67f0522156ae39160f410336576146" and "bb0908e7d304b8a7e0c368d0f418ab9e26270ed4" have entirely different histories.
40a128aedc
...
bb0908e7d3
1
.env.production
Normal file
@ -0,0 +1 @@
|
|||||||
|
VITE_API_ORIGIN=https://api.s-good.com
|
||||||
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
node_modules/
|
||||||
|
node_modules
|
||||||
1
.gitignore 2
Normal file
@ -0,0 +1 @@
|
|||||||
|
node_modules/
|
||||||
21
.uniapp-temp/.gitignore
vendored
Normal 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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -0,0 +1,8 @@
|
|||||||
|
import { createSSRApp } from "vue";
|
||||||
|
import App from "./App.vue";
|
||||||
|
export function createApp() {
|
||||||
|
const app = createSSRApp(App);
|
||||||
|
return {
|
||||||
|
app,
|
||||||
|
};
|
||||||
|
}
|
||||||
72
.uniapp-temp/src/manifest.json
Normal 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"
|
||||||
|
}
|
||||||
16
.uniapp-temp/src/pages.json
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
|
||||||
|
{
|
||||||
|
"path": "pages/index/index",
|
||||||
|
"style": {
|
||||||
|
"navigationBarTitleText": "uni-app"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"globalStyle": {
|
||||||
|
"navigationBarTextStyle": "black",
|
||||||
|
"navigationBarTitleText": "uni-app",
|
||||||
|
"navigationBarBackgroundColor": "#F8F8F8",
|
||||||
|
"backgroundColor": "#F8F8F8"
|
||||||
|
}
|
||||||
|
}
|
||||||
41
.uniapp-temp/src/pages/index/index.vue
Normal 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
@ -0,0 +1,6 @@
|
|||||||
|
export {}
|
||||||
|
|
||||||
|
declare module "vue" {
|
||||||
|
type Hooks = App.AppInstance & Page.PageInstance;
|
||||||
|
interface ComponentCustomOptions extends Hooks {}
|
||||||
|
}
|
||||||
BIN
.uniapp-temp/src/static/logo.png
Normal file
|
After Width: | Height: | Size: 3.9 KiB |
76
.uniapp-temp/src/uni.scss
Normal 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;
|
||||||
13
.uniapp-temp/tsconfig.json
Normal 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"]
|
||||||
|
}
|
||||||
7
.uniapp-temp/vite.config.ts
Normal 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
@ -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
@ -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
@ -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
@ -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
21
dist/assets/ReportView-BiTrIIba.js
vendored
Normal file
1
dist/assets/ReportView-Cb7Ywokx.css
vendored
Normal file
1
dist/assets/main-CAB6fnD_.css
vendored
Normal file
1
dist/assets/main-CtAgA79T.js
vendored
Normal file
1
dist/assets/report-CedwYfrt.js
vendored
Normal 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");
|
||||||
1
dist/build/h5/assets/AppIcon-BmFnlHRC.css
vendored
Normal 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%}
|
||||||
1
dist/build/h5/assets/AppIcon.M7CZvvJr.js
vendored
Normal 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};
|
||||||
1
dist/build/h5/assets/Home-BUIwPc96.css
vendored
Normal file
1
dist/build/h5/assets/Login-X3Hplu_R.css
vendored
Normal 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}
|
||||||
1
dist/build/h5/assets/Mine-Dq27wok6.css
vendored
Normal 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}
|
||||||
1
dist/build/h5/assets/MyOrders-DeN2LNwE.css
vendored
Normal 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}
|
||||||
1
dist/build/h5/assets/MyReports-TAbEOjue.css
vendored
Normal 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}
|
||||||
1
dist/build/h5/assets/Profile-DdJa90vi.css
vendored
Normal 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}
|
||||||
1
dist/build/h5/assets/Report-CBT8x_Jm.css
vendored
Normal 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}
|
||||||
1
dist/build/h5/assets/ServiceType-CjAXJyw7.css
vendored
Normal 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}
|
||||||
1
dist/build/h5/assets/Staff-Bzjx0p91.css
vendored
Normal 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}
|
||||||
1
dist/build/h5/assets/Store-BFRomBWw.css
vendored
Normal 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}
|
||||||
1
dist/build/h5/assets/_plugin-vue_export-helper.2L545UbL.js
vendored
Normal 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};
|
||||||
1
dist/build/h5/assets/appointment.SHi7qFlK.js
vendored
Normal 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};
|
||||||
1
dist/build/h5/assets/datetime.CB5sbvg8.js
vendored
Normal 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};
|
||||||
1
dist/build/h5/assets/index-Cg0PdC_j.css
vendored
Normal file
25
dist/build/h5/assets/index-DrZc8biM.js
vendored
Normal file
1
dist/build/h5/assets/index.DsJtDI4O.js
vendored
Normal 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};
|
||||||
1
dist/build/h5/assets/pages-home-Home.Ddvq7wQe.js
vendored
Normal file
1
dist/build/h5/assets/pages-login-Login.CIwfoiFM.js
vendored
Normal file
1
dist/build/h5/assets/pages-mine-Mine.DIiFTf9A.js
vendored
Normal 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};
|
||||||
1
dist/build/h5/assets/pages-mine-MyOrders.BrCwBUxo.js
vendored
Normal 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};
|
||||||
1
dist/build/h5/assets/pages-mine-MyReports.DUWMQM2L.js
vendored
Normal 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};
|
||||||
1
dist/build/h5/assets/pages-mine-Profile.DCcNMmIP.js
vendored
Normal file
1
dist/build/h5/assets/pages-mine-ServiceType.DZbIoYg-.js
vendored
Normal 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};
|
||||||
1
dist/build/h5/assets/pages-mine-Staff.MjRBMiPA.js
vendored
Normal file
1
dist/build/h5/assets/pages-mine-Store.Chv7yw34.js
vendored
Normal 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};
|
||||||
1
dist/build/h5/assets/pages-report-Report.4YqXiEo9.js
vendored
Normal file
1
dist/build/h5/assets/pages-report-view-reportView.DYnt0bpU.js
vendored
Normal file
1
dist/build/h5/assets/reportView-D1bRLJLP.css
vendored
Normal 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
1
dist/build/h5/assets/useNavigator-uhlsy5Ae.css
vendored
Normal 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}
|
||||||
1
dist/build/h5/assets/useNavigator.BKsocaY0.js
vendored
Normal 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
@ -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
@ -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
|
After Width: | Height: | Size: 228 B |
BIN
dist/build/h5/static/tab-home.png
vendored
Normal file
|
After Width: | Height: | Size: 196 B |
BIN
dist/build/h5/static/tab-mine-active.png
vendored
Normal file
|
After Width: | Height: | Size: 224 B |
BIN
dist/build/h5/static/tab-mine.png
vendored
Normal file
|
After Width: | Height: | Size: 210 B |
BIN
dist/build/h5/static/tab-report-active.png
vendored
Normal file
|
After Width: | Height: | Size: 231 B |
BIN
dist/build/h5/static/tab-report.png
vendored
Normal file
|
After Width: | Height: | Size: 227 B |
1
dist/build/mp-weixin/api/index.js
vendored
Normal 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
@ -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
@ -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
7
dist/build/mp-weixin/common/vendor.js
vendored
Normal file
1
dist/build/mp-weixin/components/AppIcon.js
vendored
Normal 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);
|
||||||
4
dist/build/mp-weixin/components/AppIcon.json
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"component": true,
|
||||||
|
"usingComponents": {}
|
||||||
|
}
|
||||||
1
dist/build/mp-weixin/components/AppIcon.wxml
vendored
Normal 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>
|
||||||
1
dist/build/mp-weixin/components/AppIcon.wxss
vendored
Normal 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%}
|
||||||
1
dist/build/mp-weixin/components/TabBar.js
vendored
Normal 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);
|
||||||
6
dist/build/mp-weixin/components/TabBar.json
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"component": true,
|
||||||
|
"usingComponents": {
|
||||||
|
"app-icon": "./AppIcon"
|
||||||
|
}
|
||||||
|
}
|
||||||
1
dist/build/mp-weixin/components/TabBar.wxml
vendored
Normal 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>
|
||||||
1
dist/build/mp-weixin/components/TabBar.wxss
vendored
Normal 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}
|
||||||
1
dist/build/mp-weixin/composables/useNavigator.js
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
"use strict";const a=require("../utils/globalState.js");exports.useNavigator=()=>({goPage:t=>{a.navigateTo(t)},navigateTo:a.navigateTo});
|
||||||
1
dist/build/mp-weixin/pages/home/Home.js
vendored
Normal file
6
dist/build/mp-weixin/pages/home/Home.json
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"usingComponents": {
|
||||||
|
"tab-bar": "../../components/TabBar",
|
||||||
|
"app-icon": "../../components/AppIcon"
|
||||||
|
}
|
||||||
|
}
|
||||||
1
dist/build/mp-weixin/pages/home/Home.wxml
vendored
Normal file
1
dist/build/mp-weixin/pages/home/Home.wxss
vendored
Normal file
1
dist/build/mp-weixin/pages/login/Login.js
vendored
Normal 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);
|
||||||
3
dist/build/mp-weixin/pages/login/Login.json
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"usingComponents": {}
|
||||||
|
}
|
||||||
1
dist/build/mp-weixin/pages/login/Login.wxml
vendored
Normal file
1
dist/build/mp-weixin/pages/login/Login.wxss
vendored
Normal 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}
|
||||||
1
dist/build/mp-weixin/pages/mine/Mine.js
vendored
Normal 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);
|
||||||
6
dist/build/mp-weixin/pages/mine/Mine.json
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"usingComponents": {
|
||||||
|
"tab-bar": "../../components/TabBar",
|
||||||
|
"app-icon": "../../components/AppIcon"
|
||||||
|
}
|
||||||
|
}
|
||||||
1
dist/build/mp-weixin/pages/mine/Mine.wxml
vendored
Normal 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}}"/>
|
||||||
1
dist/build/mp-weixin/pages/mine/Mine.wxss
vendored
Normal 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}
|
||||||
1
dist/build/mp-weixin/pages/mine/MyOrders.js
vendored
Normal 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);
|
||||||
5
dist/build/mp-weixin/pages/mine/MyOrders.json
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"usingComponents": {
|
||||||
|
"app-icon": "../../components/AppIcon"
|
||||||
|
}
|
||||||
|
}
|
||||||
1
dist/build/mp-weixin/pages/mine/MyOrders.wxml
vendored
Normal 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>
|
||||||
1
dist/build/mp-weixin/pages/mine/MyOrders.wxss
vendored
Normal 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}
|
||||||