Initial commit

This commit is contained in:
yan.y
2025-05-24 21:29:02 +08:00
commit 0a0979b5f2
194 changed files with 19763 additions and 0 deletions
+8
View File
@@ -0,0 +1,8 @@
NODE_ENV = development
VITE_APP_API_BASE_URL = 'https://test-pet-house.ifish7.com/pet-house'
# https://pet-house.ifish7.com
# https://test-pet-house.ifish7.com/pet-house
# 是否在打包时生成 sourcemap
VITE_BUILD_SOURCEMAP = true
# 是否在打包时删除 console 代码
VITE_BUILD_DROP_CONSOLE = false
+8
View File
@@ -0,0 +1,8 @@
NODE_ENV = production
VITE_APP_API_BASE_URL = 'https://test-pet-house.ifish7.com/pet-house'
# https://pet-house.ifish7.com/pet-house
# https://test-pet-house.ifish7.com/pet-house
# 是否在打包时生成 sourcemap
VITE_BUILD_SOURCEMAP = 'false'
# 是否在打包时删除 console 代码
VITE_BUILD_DROP_CONSOLE = 'true'
+25
View File
@@ -0,0 +1,25 @@
module.exports = {
root: true, // 停止向上查找父级目录中的配置文件
env: {
browser: true,
es2021: true,
node: true,
},
extends: [
'eslint:recommended',
'plugin:vue/vue3-essential',
'plugin:prettier/recommended',
'prettier', // eslint-config-prettier 的缩写
],
parser: 'vue-eslint-parser', // 指定要使用的解析器
// 给解析器传入一些其他的配置参数
parserOptions: {
ecmaVersion: 'latest', // 支持的es版本
parser: '@typescript-eslint/parser',
sourceType: 'module', // 模块类型,默认为script,我们设置为module
},
plugins: ['vue', 'prettier'], // eslint-plugin- 可以省略
rules: {
'vue/multi-word-component-names': 'off'
},
};
+21
View File
@@ -0,0 +1,21 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
.DS_Store
dist
*.local
# Editor directories and files
.idea
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
+16
View File
@@ -0,0 +1,16 @@
{ // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
// launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
"version": "0.0",
"configurations": [{
"default" :
{
"launchtype" : "local"
},
"mp-weixin" :
{
"launchtype" : "local"
},
"type" : "uniCloud"
}
]
}
+1
View File
@@ -0,0 +1 @@
shamefully-hoist=true # or public-hoist-pattern[]=@vue*
+11
View File
@@ -0,0 +1,11 @@
module.exports = {
printWidth: 100,
tabWidth: 2,
useTabs: true, // 是否使用tab进行缩进,默认为false
singleQuote: true, // 是否使用单引号代替双引号,默认为false
semi: false, // 行尾是否使用分号,默认为true
arrowParens: 'always',
endOfLine: 'auto',
vueIndentScriptAndStyle: true,
htmlWhitespaceSensitivity: 'strict',
};
+103
View File
@@ -0,0 +1,103 @@
/* eslint-disable */
/* prettier-ignore */
// @ts-nocheck
// noinspection JSUnusedGlobalSymbols
// Generated by unplugin-auto-import
export {}
declare global {
const EffectScope: typeof import('vue')['EffectScope']
const acceptHMRUpdate: typeof import('pinia')['acceptHMRUpdate']
const computed: typeof import('vue')['computed']
const createApp: typeof import('vue')['createApp']
const createPinia: typeof import('pinia')['createPinia']
const customRef: typeof import('vue')['customRef']
const defineAsyncComponent: typeof import('vue')['defineAsyncComponent']
const defineComponent: typeof import('vue')['defineComponent']
const defineStore: typeof import('pinia')['defineStore']
const effectScope: typeof import('vue')['effectScope']
const getActivePinia: typeof import('pinia')['getActivePinia']
const getCurrentInstance: typeof import('vue')['getCurrentInstance']
const getCurrentScope: typeof import('vue')['getCurrentScope']
const h: typeof import('vue')['h']
const inject: typeof import('vue')['inject']
const isProxy: typeof import('vue')['isProxy']
const isReactive: typeof import('vue')['isReactive']
const isReadonly: typeof import('vue')['isReadonly']
const isRef: typeof import('vue')['isRef']
const mapActions: typeof import('pinia')['mapActions']
const mapGetters: typeof import('pinia')['mapGetters']
const mapState: typeof import('pinia')['mapState']
const mapStores: typeof import('pinia')['mapStores']
const mapWritableState: typeof import('pinia')['mapWritableState']
const markRaw: typeof import('vue')['markRaw']
const nextTick: typeof import('vue')['nextTick']
const onActivated: typeof import('vue')['onActivated']
const onAddToFavorites: typeof import('@dcloudio/uni-app')['onAddToFavorites']
const onBackPress: typeof import('@dcloudio/uni-app')['onBackPress']
const onBeforeMount: typeof import('vue')['onBeforeMount']
const onBeforeUnmount: typeof import('vue')['onBeforeUnmount']
const onBeforeUpdate: typeof import('vue')['onBeforeUpdate']
const onDeactivated: typeof import('vue')['onDeactivated']
const onError: typeof import('@dcloudio/uni-app')['onError']
const onErrorCaptured: typeof import('vue')['onErrorCaptured']
const onHide: typeof import('@dcloudio/uni-app')['onHide']
const onLaunch: typeof import('@dcloudio/uni-app')['onLaunch']
const onLoad: typeof import('@dcloudio/uni-app')['onLoad']
const onMounted: typeof import('vue')['onMounted']
const onNavigationBarButtonTap: typeof import('@dcloudio/uni-app')['onNavigationBarButtonTap']
const onNavigationBarSearchInputChanged: typeof import('@dcloudio/uni-app')['onNavigationBarSearchInputChanged']
const onNavigationBarSearchInputClicked: typeof import('@dcloudio/uni-app')['onNavigationBarSearchInputClicked']
const onNavigationBarSearchInputConfirmed: typeof import('@dcloudio/uni-app')['onNavigationBarSearchInputConfirmed']
const onNavigationBarSearchInputFocusChanged: typeof import('@dcloudio/uni-app')['onNavigationBarSearchInputFocusChanged']
const onPageNotFound: typeof import('@dcloudio/uni-app')['onPageNotFound']
const onPageScroll: typeof import('@dcloudio/uni-app')['onPageScroll']
const onPullDownRefresh: typeof import('@dcloudio/uni-app')['onPullDownRefresh']
const onReachBottom: typeof import('@dcloudio/uni-app')['onReachBottom']
const onReady: typeof import('@dcloudio/uni-app')['onReady']
const onRenderTracked: typeof import('vue')['onRenderTracked']
const onRenderTriggered: typeof import('vue')['onRenderTriggered']
const onResize: typeof import('@dcloudio/uni-app')['onResize']
const onScopeDispose: typeof import('vue')['onScopeDispose']
const onServerPrefetch: typeof import('vue')['onServerPrefetch']
const onShareAppMessage: typeof import('@dcloudio/uni-app')['onShareAppMessage']
const onShareTimeline: typeof import('@dcloudio/uni-app')['onShareTimeline']
const onShow: typeof import('@dcloudio/uni-app')['onShow']
const onTabItemTap: typeof import('@dcloudio/uni-app')['onTabItemTap']
const onThemeChange: typeof import('@dcloudio/uni-app')['onThemeChange']
const onUnhandledRejection: typeof import('@dcloudio/uni-app')['onUnhandledRejection']
const onUnload: typeof import('@dcloudio/uni-app')['onUnload']
const onUnmounted: typeof import('vue')['onUnmounted']
const onUpdated: typeof import('vue')['onUpdated']
const provide: typeof import('vue')['provide']
const reactive: typeof import('vue')['reactive']
const readonly: typeof import('vue')['readonly']
const ref: typeof import('vue')['ref']
const resolveComponent: typeof import('vue')['resolveComponent']
const setActivePinia: typeof import('pinia')['setActivePinia']
const setMapStoreSuffix: typeof import('pinia')['setMapStoreSuffix']
const shallowReactive: typeof import('vue')['shallowReactive']
const shallowReadonly: typeof import('vue')['shallowReadonly']
const shallowRef: typeof import('vue')['shallowRef']
const storeToRefs: typeof import('pinia')['storeToRefs']
const toRaw: typeof import('vue')['toRaw']
const toRef: typeof import('vue')['toRef']
const toRefs: typeof import('vue')['toRefs']
const toValue: typeof import('vue')['toValue']
const triggerRef: typeof import('vue')['triggerRef']
const unref: typeof import('vue')['unref']
const useAttrs: typeof import('vue')['useAttrs']
const useCssModule: typeof import('vue')['useCssModule']
const useCssVars: typeof import('vue')['useCssVars']
const useSlots: typeof import('vue')['useSlots']
const useToast: typeof import('nutui-uniapp/composables')['useToast']
const watch: typeof import('vue')['watch']
const watchEffect: typeof import('vue')['watchEffect']
const watchPostEffect: typeof import('vue')['watchPostEffect']
const watchSyncEffect: typeof import('vue')['watchSyncEffect']
}
// for type re-export
declare global {
// @ts-ignore
export type { Component, ComponentPublicInstance, ComputedRef, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, VNode, WritableComputedRef } from 'vue'
import('vue')
}
+47
View File
@@ -0,0 +1,47 @@
/* eslint-disable */
/* prettier-ignore */
// @ts-nocheck
// Generated by vite-plugin-uni-components
// Read more: https://github.com/vuejs/core/pull/3399
import '@vue/runtime-core'
export {}
declare module '@vue/runtime-core' {
export interface GlobalComponents {
Carebox: typeof import('./src/components/carebox/index.vue')['default']
CouponItem: typeof import('./src/components/couponItem/index.vue')['default']
Gender: typeof import('./src/components/gender/index.vue')['default']
HasListCareBox: typeof import('./src/components/hasListCareBox/index.vue')['default']
HeaderBox: typeof import('./src/components/headerBox/index.vue')['default']
Largebox: typeof import('./src/components/largebox/index.vue')['default']
NutButton: typeof import('nutui-uniapp/components/button/button.vue')['default']
NutCell: typeof import('nutui-uniapp/components/cell/cell.vue')['default']
NutCellGroup: typeof import('nutui-uniapp/components/cellgroup/cellgroup.vue')['default']
NutCheckbox: typeof import('nutui-uniapp/components/checkbox/checkbox.vue')['default']
NutDatePicker: typeof import('nutui-uniapp/components/datepicker/datepicker.vue')['default']
NutForm: typeof import('nutui-uniapp/components/form/form.vue')['default']
NutFormItem: typeof import('nutui-uniapp/components/formitem/formitem.vue')['default']
NutInput: typeof import('nutui-uniapp/components/input/input.vue')['default']
NutNavbar: typeof import('nutui-uniapp/components/navbar/navbar.vue')['default']
NutPicker: typeof import('nutui-uniapp/components/picker/picker.vue')['default']
NutPopup: typeof import('nutui-uniapp/components/popup/popup.vue')['default']
NutRadio: typeof import('nutui-uniapp/components/radio/radio.vue')['default']
NutRadioGroup: typeof import('nutui-uniapp/components/radiogroup/radiogroup.vue')['default']
NutRate: typeof import('nutui-uniapp/components/rate/rate.vue')['default']
NutSafeArea: typeof import('nutui-uniapp/components/safearea/safearea.vue')['default']
NutStep: typeof import('nutui-uniapp/components/step/step.vue')['default']
NutSteps: typeof import('nutui-uniapp/components/steps/steps.vue')['default']
NutSwiper: typeof import('nutui-uniapp/components/swiper/swiper.vue')['default']
NutSwiperItem: typeof import('nutui-uniapp/components/swiperitem/swiperitem.vue')['default']
NutTabPane: typeof import('nutui-uniapp/components/tabpane/tabpane.vue')['default']
NutTabs: typeof import('nutui-uniapp/components/tabs/tabs.vue')['default']
NutTextarea: typeof import('nutui-uniapp/components/textarea/textarea.vue')['default']
OrderItem: typeof import('./src/components/orderItem/index.vue')['default']
PetHeaderChoose: typeof import('./src/components/petHeaderChoose/index.vue')['default']
PetSmallBox: typeof import('./src/components/petSmallBox/index.vue')['default']
PricePopup: typeof import('./src/components/pricePopup/index.vue')['default']
SmallCardBox: typeof import('./src/components/smallCardBox/index.vue')['default']
Timepopup: typeof import('./src/components/timepopup/index.vue')['default']
}
}
+10
View File
@@ -0,0 +1,10 @@
import globals from "globals";
import pluginJs from "@eslint/js";
import pluginVue from "eslint-plugin-vue";
export default [
{languageOptions: { globals: globals.browser }},
pluginJs.configs.recommended,
...pluginVue.configs["flat/essential"],
];
+20
View File
@@ -0,0 +1,20 @@
<!DOCTYPE html>
<html lang="en">
<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.js"></script>
</body>
</html>
+82
View File
@@ -0,0 +1,82 @@
{
"name": "uni-preset-vue",
"version": "0.0.0",
"scripts": {
"dev:app": "uni -p app --mode development",
"dev:app-android": "uni -p app-android --mode development",
"dev:app-ios": "uni -p app-ios --mode development",
"dev:custom": "uni -p --mode development",
"dev:h5": "uni --mode development",
"dev:h5:ssr": "uni --ssr --mode development",
"dev:mp-alipay": "uni -p mp-alipay --mode development",
"dev:mp-baidu": "uni -p mp-baidu --mode development",
"dev:mp-jd": "uni -p mp-jd --mode development",
"dev:mp-kuaishou": "uni -p mp-kuaishou --mode development",
"dev:mp-lark": "uni -p mp-lark --mode development",
"dev:mp-qq": "uni -p mp-qq --mode development",
"dev:mp-toutiao": "uni -p mp-toutiao --mode development",
"dev:mp-weixin": "uni -p mp-weixin --mode development",
"dev:mp-xhs": "uni -p mp-xhs --mode development",
"dev:quickapp-webview": "uni -p quickapp-webview --mode development",
"dev:quickapp-webview-huawei": "uni -p quickapp-webview-huawei --mode development",
"dev:quickapp-webview-union": "uni -p quickapp-webview-union --mode development",
"build:app": "uni build -p app --mode production",
"build:app-android": "uni build -p app-android --mode production",
"build:app-ios": "uni build -p app-ios --mode production",
"build:custom": "uni build -p --mode production",
"build:h5": "uni build --mode production",
"build:h5:ssr": "uni build --ssr --mode production",
"build:mp-alipay": "uni build -p mp-alipay --mode production",
"build:mp-baidu": "uni build -p mp-baidu --mode production",
"build:mp-jd": "uni build -p mp-jd --mode production",
"build:mp-kuaishou": "uni build -p mp-kuaishou --mode production",
"build:mp-lark": "uni build -p mp-lark --mode production",
"build:mp-qq": "uni build -p mp-qq --mode production",
"build:mp-toutiao": "uni build -p mp-toutiao --mode production",
"build:mp-weixin": "uni build -p mp-weixin --mode production",
"build:mp-xhs": "uni build -p mp-xhs --mode production",
"build:quickapp-webview": "uni build -p quickapp-webview --mode production",
"build:quickapp-webview-huawei": "uni build -p quickapp-webview-huawei --mode production",
"build:quickapp-webview-union": "uni build -p quickapp-webview-union --mode production",
"lint": "eslint --ext .js,.vue,.ts src --fix"
},
"dependencies": {
"@dcloudio/uni-app": "3.0.0-4000820240401001",
"@dcloudio/uni-app-plus": "3.0.0-4000820240401001",
"@dcloudio/uni-components": "3.0.0-4000820240401001",
"@dcloudio/uni-h5": "3.0.0-4000820240401001",
"@dcloudio/uni-mp-alipay": "3.0.0-4000820240401001",
"@dcloudio/uni-mp-baidu": "3.0.0-4000820240401001",
"@dcloudio/uni-mp-jd": "3.0.0-4000820240401001",
"@dcloudio/uni-mp-kuaishou": "3.0.0-4000820240401001",
"@dcloudio/uni-mp-lark": "3.0.0-4000820240401001",
"@dcloudio/uni-mp-qq": "3.0.0-4000820240401001",
"@dcloudio/uni-mp-toutiao": "3.0.0-4000820240401001",
"@dcloudio/uni-mp-weixin": "3.0.0-4000820240401001",
"@dcloudio/uni-mp-xhs": "3.0.0-4000820240401001",
"@dcloudio/uni-quickapp-webview": "3.0.0-4000820240401001",
"moment": "^2.30.1",
"nutui-uniapp": "^1.7.7",
"pinia": "2.0.35",
"vue": "^3.4.21",
"vue-i18n": "^9.12.0"
},
"devDependencies": {
"@dcloudio/types": "^3.4.8",
"@dcloudio/uni-automator": "3.0.0-4000820240401001",
"@dcloudio/uni-cli-shared": "3.0.0-4000820240401001",
"@dcloudio/uni-stacktracey": "3.0.0-4000820240401001",
"@dcloudio/vite-plugin-uni": "3.0.0-4000820240401001",
"@eslint/js": "^9.0.0",
"@uni-helper/vite-plugin-uni-components": "^0.0.9",
"@vue/runtime-core": "^3.4.21",
"eslint": "^9.0.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-vue": "^9.24.1",
"globals": "^15.0.0",
"prettier": "^3.2.5",
"sass": "^1.75.0",
"vite": "4.3.5"
}
}
+7150
View File
File diff suppressed because it is too large Load Diff
+10
View File
@@ -0,0 +1,10 @@
/// <reference types='@dcloudio/types' />
import 'vue'
declare module '@vue/runtime-core' {
type Hooks = App.AppInstance & Page.PageInstance;
interface ComponentCustomOptions extends Hooks {
}
}
+97
View File
@@ -0,0 +1,97 @@
<script setup>
import { useUserInfo } from '@/store'
// import { getuser, getUserInfo } from '@/api/UserService.js'
// const userInfo = useUserInfo()
import eventBus from './utils/eventBus'
// function loginUser(data) {
// getuser(data).then((res) => {
// if (res.code == 200) {
// userInfo.$patch({ token: res.data.token, uid: res.data.uid, role: res.data.role })
// if (res.data.role != 1) {
// uni.switchTab({
// url: `/pages/carepage/index`,
// success: () => {
// wx.eventBus.post({
// params: {
// tips: '触发更新'
// },
// event: 'change'
// })
// }
// })
// }
// console.log(userInfo.token, userInfo.uid, 'patch')
// // uni.hideLoading();
// }
// return getUserInfo()
// }).then(res => {
// if (res.code == 200) {
// userInfo.setuserPets(res.data.userPets)
// userInfo.setheadImgUrl(res.data.headImgUrl)
// userInfo.setrole_amount_nickName(0, res.data.amount, res.data.nickName)
// console.log(userInfo.getuserPets, 'appgetuserPets')
// wx.eventBus.post({
// params: {
// tips: '触发更新'
// },
// event: 'first_init'
// })
// }
// })
// }
onLaunch(() => {
// 挂载eventbus
wx.eventBus = eventBus
console.log('App Launch')
// 验证是否有登陆参数
// console.log(userInfo.token, userInfo.uid, '是否有登陆数据')
// 进行获取用户信息逻辑
// if (userInfo.token != 0 && userInfo.uid != 0 && userInfo.role != 1) {
// console.log('没有登陆的逻辑')
// wx.switchTab({
// url: `/pages/carepage/index`,
// success: () => {
// console.log('没有登陆的逻辑1')
// wx.eventBus.post({
// params: {
// tips: '触发更新'
// },
// event: 'change'
// })
// }
// })
// }
// // 没有登陆的逻辑
// if (userInfo.token == 0 && userInfo.uid == 0) {
// console.log('进行获取用户信息逻辑')
// uni.login({
// success: (res) => {
// if (res.code) {
// var data = {
// code: res.code
// }
// loginUser(data)
// }
// }
// })
// }
})
onShow(() => {
console.log('App Show')
})
onHide(() => {
console.log('App Hide')
})
</script>
<style lang="scss">
@import "nutui-uniapp/styles/index.scss";
view {
--nut-navbar-title-font: 34rpx;
--nut-navbar-title-font-weight: 500;
}
</style>
+41
View File
@@ -0,0 +1,41 @@
import request from '@/utils/request';
// 登陆
export function getuser(data) {
return request({
url: '/auth/login',
data,
method: "post"
})
}
// 获取用户信息
export function getUserInfo() {
return request({
url: '/auth/getUserInfo',
method: "post"
})
}
// 修改用户信息
export function updateUserInfo(data) {
return request({
url: '/auth/updateUserInfo',
method: "post",
data
})
}
// },
// logout() {
// return request({
// url: `${requestPort.users}/user/logout/3`,
// method: 'post',
// });
// },
// logoff(data) {
// return request({
// url: `${requestPort.users}/user/logoff`,
// method: 'post',
// data,
// });
// }
+44
View File
@@ -0,0 +1,44 @@
import request from '@/utils/request';
//地址列表
export function serviceAddrLists(data) {
return request({
url: `/service/serviceAddrList`,
method: 'post',
data,
});
}
export function serviceAddOrEdit(data) {
return request({
url: `/service/serviceAddOrEdit`,
method: 'post',
data,
});
}
export function serviceAreaAddrList(data) {
return request({
url: `/service/serviceAreaAddrList`,
method: 'post',
data,
});
}
// /service/serviceCarLocationUpload
export function serviceCarLocationUpload(data){
return request({
url: `/service/serviceCarLocationUpload`,
method: 'post',
data,
});
}
// /service/serviceCarLocationList
export function serviceCarLocationList(data){
return request({
url: `/service/serviceCarLocationList`,
method: 'post',
data,
});
}
+26
View File
@@ -0,0 +1,26 @@
import request from '@/utils/request';
//地址列表
export function getCouponsList() {
return request({
url: `/coupons/getCouponsList`,
method: 'post'
});
}
// /coupons/getUserCouponsList
export function getUserCouponsList(data) {
return request({
url: `/coupons/getUserCouponsList`,
method: 'post',
data
});
}
// /coupons/drawCoupons
export function drawCoupons(data) {
return request({
url: `/coupons/drawCoupons`,
method: 'post',
data
});
}
+37
View File
@@ -0,0 +1,37 @@
import request from '@/utils/request';
// import { requestPort } from '@/utils/requestPort';
//宠物列表
export function getGoodsList(data) {
return request({
url: `/goods/goodsList`,
method: 'post',
data,
});
}
// /order/orderServiceTime
export function orderServiceTime(data) {
return request({
url: `/order/orderServiceTime`,
method: 'post',
data
});
}
// /order/orderCreate
export function orderCreate(data) {
return request({
url: `/order/orderCreate`,
method: 'post',
data
});
}
// /order/orderCreatePreCheck
export function orderCreatePreCheck(data) {
return request({
url: '/order/orderCreatePreCheck',
method: 'post',
data
})
}
+88
View File
@@ -0,0 +1,88 @@
import request from '@/utils/request';
//订单列表
export function orderList(data) {
return request({
url: `/order/orderList`,
method: 'post',
data,
});
}
//可预约时间
export function orderServiceTime(data) {
return request({
url: `/order/orderServiceTime`,
method: 'post',
data,
});
}
//详情
export function orderDetail(data) {
return request({
url: `/order/orderDetail`,
method: 'post',
data,
});
}
//创建
export function orderCreate(data) {
return request({
url: `/order/orderCreate`,
method: 'post',
data,
});
}
// /car/carServiceOrderList
export function carServiceOrderList(data) {
return request({
url: `/car/carServiceOrderList`,
method: 'post',
data,
});
}
// /car/carServiceProcess
export function carServiceProcess(data){
return request({
url: `/car/carServiceProcess`,
method: 'post',
data,
});
}
// /order/orderGoodsUpdate
export function orderGoodsUpdate(data){
return request({
url: `/order/orderGoodsUpdate`,
method: 'post',
data,
});
}
// /order/orderCancel
export function orderCancel(data){
return request({
url: '/order/orderCancel',
method: 'post',
data
})
}
// /order/orderMarkRecord
export function orderMarkRecord(data){
return request({
url: '/order/orderMarkRecord',
method: 'post',
data
})
}
// /order/orderMarkRecordInfo
export function orderMarkRecordInfo(data){
return request({
url: '/order/orderMarkRecordInfo',
method: 'post',
data
})
}
+26
View File
@@ -0,0 +1,26 @@
import request from '@/utils/request';
//充值
export function toPay(data) {
return request({
url: `/pay/toPay`,
method: 'post',
data,
});
}
//获取充值档位
export function rechargeInfoList(data) {
return request({
url: `/pay/rechargeInfoList`,
method: 'post',
data,
});
}
export function getPayoff(){
return request({
url: '/system/getPayoff',
method: 'post'
})
}
+42
View File
@@ -0,0 +1,42 @@
import request from '@/utils/request';
// import { requestPort } from '@/utils/requestPort';
//宠物列表
export function petList(data) {
return request({
url: `/pet/petList`,
method: 'post',
data,
});
}
//宠物信息
export function petInfo(data) {
return request({
url: `/pet/petInfo`,
method: 'post',
data,
});
}
//宠物基础信息列表
export function petTypeList(data) {
return request({
url: `/pet/petTypeList`,
method: 'post',
data,
});
}
//宠物添加/修改
export function petAddOrEdit(data) {
return request({
url: `/pet/petAddOrEdit`,
method: 'post',
data,
});
}
//删除宠物
export function delPet(data) {
return request({
url: `/pet/delPet`,
method: 'post',
data,
});
}
+19
View File
@@ -0,0 +1,19 @@
import request from '@/utils/request';
//banner
export function systemBanners(data) {
return request({
url: `/system/systemBanners`,
method: 'post',
data,
});
}
//系统配置
export function systemConfigInfo(data) {
return request({
url: `/system/systemConfigInfo`,
method: 'post',
data,
});
}
+3
View File
@@ -0,0 +1,3 @@
// 主色调
$primary-color: #FFCD35;
$primary-color-end: #FFDE5E;
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 980 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 975 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 609 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 339 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 896 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 586 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

+109
View File
@@ -0,0 +1,109 @@
<!-- 较高的盒子组件 -->
<template>
<view class="care_box">
<!-- 添加按钮 -->
<view class="box_img">
<img src="../../static/images/catgroup.png" alt="" srcset="" class="img_icon">
</view>
<view class="box_content">
<view class="con_title">
添加我的宠物
</view>
<view class="con_sub">
<view class="sub_item">
补充品种
</view>
<view>
补充生日
</view>
</view>
<view class="con_content">
<!-- <view>
上次洗护-
</view> -->
<view>
上次洗护时间-
</view>
</view>
<nut-button size="small">添加宠物</nut-button>
</view>
</view>
</template>
<script setup>
</script>
<style lang="scss">
// page {
// --nut-button-default-bg-color: linear-gradient(90deg, #FFCD35 0%, #FFDE5E 100%);
// --nut-button-small-height: 60rpx;
// --nut-button-small-line-height: 60rpx;
// --nut-button-border-width: 0rpx;
// --nut-button-small-font-size: 28rpx;
// --nut-button-default-color: #312D22;
// }
.care_box {
--nut-button-default-bg-color: linear-gradient(90deg, #FFCD35 0%, #FFDE5E 100%);
--nut-button-small-height: 60rpx;
--nut-button-small-line-height: 60rpx;
--nut-button-border-width: 0rpx;
--nut-button-small-font-size: 28rpx;
--nut-button-default-color: #312D22;
width: 702rpx;
// height: 278rpx;
background: #FFFFFF;
border-radius: 16rpx 16rpx 16rpx 16rpx;
border: 1rpx solid #FFCD35;
box-sizing: border-box;
padding: 24rpx;
display: flex;
flex-flow: row nowrap;
.box_img {
height: 96rpx;
width: 96rpx;
margin-right: 12rpx;
border-radius: 50%;
.img_icon {
width: 100%;
height: 100%;
border-radius: 50%;
}
}
.box_content {
display: flex;
flex-flow: column nowrap;
.con_title {
font-size: $uni-font-size-title;
color: $uni-text-color;
font-weight: 500;
margin-bottom: 10rpx;
}
.con_sub {
font-size: $uni-font-size-base;
color: $uni-text-color-grey;
margin-bottom: 10rpx;
display: flex;
flex-flow: row nowrap;
.sub_item {
margin-right: 16rpx;
}
}
.con_content {
font-size: $uni-font-size-base;
color: $uni-text-color;
margin-bottom: 16rpx;
}
}
}
</style>
+279
View File
@@ -0,0 +1,279 @@
<!-- 较高的盒子组件 -->
<template>
<view class="couponitem_box">
<view class="lastExpireTime" v-if="lastExpireTime">
{{ '最后到期时间' + lastExpireTime }}
</view>
<view class="cou_box_left" :class="{ cou_box_left_disabled: props.type == '1' || props.type == '2' }">
<view class="left_layout" v-if="props.detail.periodType ==
2" :class="{ left_layout_disabled: props.type == '1' || props.type == '2' }">
{{ props.detail.periodType == 1 || props.detail.periodType === 0 ? '' : props.detail.periodType == 2 ||
props.detail.periodType ==
3 ? props.detail.periodInfo[0] : '' }}
</view>
<view class="left_center" :class="{ left_center_disabled: props.type == '1' || props.type == '2' }">
<text class="center_num">{{ parseInt(props.detail.discount) / 10 }}</text>
<text class="center_text">折</text>
</view>
</view>
<view class="cou_box_right">
<view class="cou_content">
<view class="content_title" :class="{ content_title_disabled: props.type == '1' || props.type == '2' }">
{{ props.detail.name }}
</view>
<view class="content_text">
来源:{{ props.detail.source }}
</view>
<view class="content_text">
{{ showtime }}
</view>
</view>
<!-- 领取 -->
<!-- v-if="props.type == '4'" -->
<view class="content_button" @click="handleReceive" v-if="props.type == '4'"
:class="{ content_button_disable: props.detail.receiverStatus === 1 }">
{{ props.detail.receiverStatus === 1 ? '已领取' : '免费领取' }}
</view>
<!-- 未使用 -->
<view class="content_button content_button_one" @click="handleReceive"
v-if="props.type == '0' && props.couponShowType == '0'">
</view>
<!-- 收银台跳转 -->
<view class="content_button content_button_one" @click="handleReceive"
v-if="props.type == '0' && props.couponShowType == '1'">
<nut-checkbox v-model="value" text-position="left" icon-size="20"
:disabled="isdisable || props.detail.isChoose || props.detail.canUse" @change="onChange"></nut-checkbox>
</view>
<!-- 已过期 -->
<view class="content_button content_button_one" @click="handleReceive" v-if="props.type == '1'">
<img src="../../assets/images/已使用.png" alt="">
</view>
<!-- 已使用 -->
<view class="content_button content_button_one" @click="handleReceive" v-if="props.type == '2'">
<img src="../../assets/images/已过期.png" alt="">
</view>
</view>
</view>
</template>
<script setup>
const props = defineProps({
detail: {
type: Object, // 接收的参数类型
default: {}, //默认值
},
type: {
type: String,
default: '4'
},
couponShowType: {
type: String,
default: '0'
}
})
const value = ref(false)
const showtime = ref()
const lastExpireTime = ref()
function hasConsecutiveWeekdays(weekdays) {
const weekDays = ['1', '2', '3', '4', '5', '6', '7'];
const indices = new Map(weekdays.map(day => [day, weekDays.indexOf(day)]));
for (let day of weekdays) {
const index = indices.get(day);
// 检查前一天或后一天是否连续
if (indices.has(weekDays[(index + 1) % 7]) || indices.has(weekDays[(index - 1 + 7) % 7])) {
return true; // 存在连续的星期
}
}
return false; // 没有连续的星期
}
const list = ['未知', '周一', '周二', '周三', '周四', '周五', '周六', '周日']
const emit = defineEmits(['Receive', 'couponlistchoose'])
const isdisable = ref(false)
function handleReceive() {
if (props.detail.receiverStatus === 1) {
return
}
emit('Receive', { id: props.detail.id })
}
function onChange() {
if (value.value) {
emit('couponlistchoose', { id: props.detail.id })
} else {
emit('couponlistchoose')
}
}
watch(() => props.detail, async (newv, oldv) => {
console.log(newv, props.couponShowType, props.type, 'showtimeshowtimeshowtime')
lastExpireTime.value = newv.lastExpireTime
if (newv.periodType == 1) {
let time = new Date()
let nowTime = time.getDay()
if (newv.periodInfo && newv.periodInfo.indexOf(nowTime + '') == -1) {
isdisable.value = true
}
if (newv.periodInfo && hasConsecutiveWeekdays(newv.periodInfo)) {
showtime.value = list[parseInt(newv.periodInfo[0])] + '至' + list[parseInt(newv.periodInfo[newv.periodInfo.length - 1])] + '可用'
} else if (newv.periodInfo && newv.periodInfo.length == 1) {
showtime.value = list[parseInt(newv.periodInfo[0])]
} else {
for (let i in newv.periodInfo) {
showtime.value += list[parseInt(newv.periodInfo[i])] + '、'
}
showtime.value += '可用'
}
} else if (newv.periodType == 2 || newv.periodType == 3) {
showtime.value = newv.periodInfo[0] + '前可用'
let time = new Date(newv.periodInfo[0]).getTime()
let nowDate = new Date().getDate()
if (nowDate - time < 0) {
isdisable.value = false
}
// if(newv.periodInfo.indexOf(nowTime + '') == -1){
// isdisable.value = true
// }
}
}, { immediate: true })
</script>
<style lang="scss">
.couponitem_box {
margin: 24rpx 24rpx 0rpx 24rpx;
width: 702rpx;
height: 176rpx;
border-radius: 16rpx;
background: #FFF;
position: relative;
overflow: hidden;
.lastExpireTime {
position: absolute;
bottom: 5rpx;
left: 216rpx;
color: #999;
font-size: $uni-font-size-sm;
}
.cou_box_left {
width: 192rpx;
height: 176rpx;
background: #FFF4F2;
position: absolute;
left: 0rpx;
top: 0rpx;
.left_layout {
color: #F23C17;
font-size: 24rpx;
width: 160rpx;
height: 40rpx;
background: linear-gradient(90deg, #FFE0DA, rgba(255, 224, 218, 0.00)100%);
}
.left_layout_disabled {
color: #666;
background: linear-gradient(90deg, #E9E9E9, rgba(233, 233, 233, 0.00)100%);
}
.left_center {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
color: #F23C17;
.center_num {
font-size: 80rpx;
font-weight: 600;
line-height: normal;
}
.center_text {
font-size: $uni-font-size-base;
}
}
.left_center_disabled {
color: #666;
background: #F7F7F7;
}
}
.cou_box_left_disabled {
color: #666;
background: #F7F7F7;
}
.cou_box_right {
position: absolute;
right: 0rpx;
top: 0rpx;
width: 510rpx;
height: 176rpx;
display: flex;
flex-flow: row nowrap;
align-items: center;
.cou_content {
width: 320rpx;
height: 176rpx;
padding: 24rpx;
padding-bottom: 36rpx;
box-sizing: border-box;
display: flex;
flex-flow: column nowrap;
justify-content: space-between;
.content_title {
font-size: $uni-font-size-title;
font-weight: 500;
}
.content_title_disabled {
color: #666;
}
.content_text {
color: #999;
font-size: $uni-font-size-sm;
}
}
.content_button {
width: 160rpx;
height: 64rpx;
border-radius: 32rpx;
color: #fff;
background: linear-gradient(90deg, #EC754D, #F23C17);
font-size: $uni-font-size-base;
display: flex;
justify-content: center;
align-items: center;
}
.content_button_disable {
opacity: 0.3;
background: linear-gradient(90deg, #EC754D, #F23C17);
}
.content_button_one {
height: 176rpx;
display: flex;
justify-content: center;
align-items: center;
background: #fff;
image {
height: 148rpx;
width: 148rpx;
}
}
}
}
</style>
+44
View File
@@ -0,0 +1,44 @@
<!-- 较高的盒子组件 -->
<template>
<view class="gender_box">
<img src="../../static/images/Group6147.png" alt="" srcset="" v-if="gender === 0" class="img_icon">
<img src="../../static/images/Group6146.png" alt="" srcset="" v-else class="img_icon">
</view>
</template>
<script setup>
const props = defineProps({
gender: {
type: Number, // 接收的参数类型
default: 0, //默认值
}
})
</script>
<style lang="scss">
// page {
// --nut-button-default-bg-color: linear-gradient(90deg, #FFCD35 0%, #FFDE5E 100%);
// --nut-button-small-height: 60rpx;
// --nut-button-small-line-height: 60rpx;
// --nut-button-border-width: 0rpx;
// --nut-button-small-font-size: 28rpx;
// --nut-button-default-color: #312D22;
// }
.gender_box {
--nut-button-default-bg-color: linear-gradient(90deg, #FFCD35 0%, #FFDE5E 100%);
--nut-button-small-height: 60rpx;
--nut-button-small-line-height: 60rpx;
--nut-button-border-width: 0rpx;
--nut-button-small-font-size: 28rpx;
--nut-button-default-color: #312D22;
width: 28rpx;
height: 28rpx;
.img_icon {
width: 100%;
height: 100%;
}
}
</style>
+129
View File
@@ -0,0 +1,129 @@
<!-- 较高的盒子组件 -->
<template>
<view class="care_box">
<!-- 添加按钮 -->
<view class="box_img">
<img :src="detail.petInfo.headImgUrl || defalitImg" alt="" srcset="" class="img_icon">
</view>
<view class="box_content">
<view class="con_title">
{{ detail.petInfo.nickName }}
</view>
<view class="con_sub">
<Gender :gender="detail.petInfo.gender"></Gender>
<view class="sub_item">
{{ detail.petBaseInfo.assortment }}
</view>
<view>
{{ detail.petInfo.birthday }}
</view>
</view>
<view class="con_content">
<!-- <view>
上次洗护{{ detail.petInfo.lastServiceProj }}
</view> -->
<view>
上次洗护时间{{ detail.petInfo.lastServiceDate }}
</view>
</view>
<nut-button size="small">再来一单</nut-button>
</view>
</view>
</template>
<script setup>
import { onLoad } from '@dcloudio/uni-app';
import Gender from '../gender'
const defalitImg = ref('../../static/images/catgroup.png')
const components = { 'Gender': Gender, };
const props = defineProps({
detail: {
type: Object, // 接收的参数类型
default: {}, //默认值
}
})
// const { detail } = toRefs(props)
onLoad(() => {
console.log({ detail });
})
</script>
<style lang="scss">
// page {
// --nut-button-default-bg-color: linear-gradient(90deg, #FFCD35 0%, #FFDE5E 100%);
// --nut-button-small-height: 60rpx;
// --nut-button-small-line-height: 60rpx;
// --nut-button-border-width: 0rpx;
// --nut-button-small-font-size: 28rpx;
// --nut-button-default-color: #312D22;
// }
.care_box {
--nut-button-default-bg-color: linear-gradient(90deg, #FFCD35 0%, #FFDE5E 100%);
--nut-button-small-height: 60rpx;
--nut-button-small-line-height: 60rpx;
--nut-button-border-width: 0rpx;
--nut-button-small-font-size: 28rpx;
--nut-button-default-color: #312D22;
width: 528rpx;
// height: 278rpx;
background: #FFFFFF;
border-radius: 16rpx 16rpx 16rpx 16rpx;
border: 1rpx solid #FFCD35;
box-sizing: border-box;
padding: 24rpx;
display: flex;
margin-right: 20rpx;
flex-flow: row nowrap;
.box_img {
height: 96rpx;
width: 96rpx;
margin-right: 16rpx;
border-radius: 50%;
.img_icon {
width: 100%;
height: 100%;
border-radius: 50%;
}
}
.box_content {
display: flex;
flex-flow: column nowrap;
.con_title {
font-size: $uni-font-size-lg;
color: $uni-text-color;
font-weight: 500;
margin-bottom: 10rpx;
}
.con_sub {
font-size: $uni-font-size-base;
color: $uni-text-color-grey;
margin-bottom: 16rpx;
display: flex;
flex-flow: row nowrap;
justify-content: center;
align-items: center;
.sub_item {
margin-left: 10rpx;
margin-right: 16rpx;
}
}
.con_content {
font-size: $uni-font-size-base;
color: $uni-text-color;
margin-bottom: 16rpx;
}
}
}
</style>
+55
View File
@@ -0,0 +1,55 @@
<!-- 较高的盒子组件 -->
<template>
<view class="header_box_container">
<view class="title">{{ title }}</view>
<view class="sub" :class="{ sub2: type == 'yellow' }">{{ sub }}</view>
</view>
</template>
<script setup>
import { toRefs } from 'vue'
const props = defineProps({
title: {
type: String, // 接收的参数类型
default: '', //默认值
},
sub: {
type: String, // 接收的参数类型
default: '', //默认值
},
// yellow grey
type: {
type: String, // 接收的参数类型
default: '', //默认值
},
})
const { title, sub, type } = toRefs(props)
</script>
<style lang="scss">
.header_box_container {
display: flex;
flex-flow: row nowrap;
justify-content: space-between;
align-items: center;
.title {
font-size: $uni-font-size-lg;
color: $uni-text-color;
font-weight: 600;
max-width: 400rpx;
}
.sub {
font-size: $uni-font-size-sm;
color: $uni-text-color-grey;
}
.sub2 {
color: $uni-color-primary;
}
}
</style>
+114
View File
@@ -0,0 +1,114 @@
<!-- 较高的盒子组件 -->
<template>
<div class="large-box" @tap="handleChangeType">
<!-- 添加按钮 -->
<div class="add-button" v-if="!ischeck">
+
</div>
<div class="add-button ischoose" v-if="ischeck">
<img src="../../static/images/chooseitem.png" alt="">
</div>
<div class="box-content">
<div class="con-title">{{ name }}</div>
<div class="con-num">¥{{ price }}</div>
</div>
<div class="box-icon">
<img :src="goodsIcon" alt="">
</div>
</div>
</template>
<script setup>
const emit = defineEmits(['goodschooseemit'])
const props = defineProps({
name: {
type: String,
default: ''
},
price: {
type: Number,
default: 0
},
goodsIcon: {
type: String,
default: ''
},
id: {
type: Number,
default: 0
},
ischeck: {
type: Boolean,
default: false
}
})
// const isChoose = ref(false)
function handleChangeType() {
// isChoose.value = !isChoose.value
emit('goodschooseemit', { id: props.id, ischeck: !props.ischeck })
}
</script>
<style lang="scss">
.large-box {
position: relative;
height: 150rpx;
width: 240rpx;
margin-right: 20rpx;
margin-bottom: 20rpx;
border-radius: 16rpx 16rpx 16rpx 16rpx;
border: 2rpx solid #E5E4E4;
overflow: hidden;
color: rgba(49, 45, 34, 1);
.add-button {
position: absolute;
background-color: #000;
top: -2rpx;
right: -2rpx;
width: 32rpx;
height: 32rpx;
color: rgba(217, 217, 217, 1);
// font-size:20rpx;
line-height: 32rpx;
text-align: center;
}
.box-content {
position: absolute;
top: 12rpx;
left: 24rpx;
// height:75rpx;
.con-title {
color: rgba(49, 45, 34, 1);
width: 188rpx;
font-weight: 500;
font-size:$uni-font-size-base;
// height: 28rpx;
margin-bottom: 8rpx;
}
.con-num {
color: rgba(49, 45, 34, 1);
font-size: 26rpx;
height: 26rpx;
}
}
.box-icon {
width: 68rpx;
height: 68rpx;
position: absolute;
right: 10rpx;
bottom: 10rpx;
}
.box-icon image {
width: 100%;
height: 100%;
}
}
</style>
+299
View File
@@ -0,0 +1,299 @@
<!-- 订单页面 -->
<template>
<view class="order_item">
<header-box :title="'下单时间:' + ordertime.split(' ')[0]" :sub="ordertype[cardtype]" :type="'yellow'"></header-box>
<view class="order_content">
<view class="ord_con_icon">
<img :src="imgUrl || defalitImg" alt="" srcset="" class="img_icon">
</view>
<view class="ord_con_content">
<view class="con_content_title">{{ petname + ' ' + pettype }} <Gender :gender="gender"
style="margin-left: 20rpx;"></Gender>
</view>
<view class="con_content">所选服务{{ title }}</view>
<view class="con_content">预约时间{{ servetime }}</view>
</view>
</view>
<!-- 待服务 -->
<view class="button_box" v-if="cardtype == 1">
<view class="item_button" v-if="paystatus == 0 && cardtype == 2">
<!-- <nut-button type="default" custom-color="#BCB9AE" size="small">联系客服</nut-button> -->
<div @tap.stop="handleOnlinePay">在线支付</div>
</view>
<view class="item_button">
<!-- <nut-button type="default" custom-color="#BCB9AE" size="small">联系客服</nut-button> -->
<div @tap.stop="handleGoToCarMap">服务位置</div>
</view>
<view class="item_button">
<!-- <nut-button type="default" custom-color="#BCB9AE" size="small">联系客服</nut-button> -->
<div @tap.stop="handlePhone">联系客服</div>
</view>
<view class="item_button" v-if="dispatchStatus != 1">
<div @tap.stop="cancelOrder">取消订单</div>
</view>
</view>
<!-- 服务中 -->
<view class="button_box" v-if="cardtype == 2">
<view class="item_button" v-if="paystatus == 0 && cardtype == 2">
<!-- <nut-button type="default" custom-color="#BCB9AE" size="small">联系客服</nut-button> -->
<div @tap.stop="handleOnlinePay">在线支付</div>
</view>
<!-- <view class="item_button">
<nut-button size="small">取消订单</nut-button>
</view> -->
<!-- <view class="item_button">
<nut-button size="small">修改预约</nut-button>
</view> -->
</view>
<!-- 已完成 -->
<view class="button_box" v-if="cardtype == 3">
<view class="item_button" v-if="paystatus == 0 && cardtype == 2">
<!-- <nut-button type="default" custom-color="#BCB9AE" size="small">联系客服</nut-button> -->
<div @tap.stop="handleOnlinePay">在线支付</div>
</view>
<view class="item_button">
<!-- <nut-button type="default" custom-color="#BCB9AE" size="small">联系客服</nut-button> -->
<div @click.stop="handlePingJia">评价订单</div>
</view>
<view class="item_button">
<div @click.stop="handlePhone">联系客服</div>
</view>
</view>
<!-- 已派单 -->
<view class="button_box" v-if="cardtype == 4">
<view class="item_button" v-if="paystatus == 0 && cardtype == 2">
<!-- <nut-button type="default" custom-color="#BCB9AE" size="small">联系客服</nut-button> -->
<div @tap.stop="handleOnlinePay">在线支付</div>
</view>
<view class="item_button">
<!-- <nut-button type="default" custom-color="#BCB9AE" size="small">联系客服</nut-button> -->
<div @tap="handlePhone">联系客服</div>
</view>
</view>
<!-- 已取消 -->
<view class="button_box" v-if="cardtype == 5">
<view class="item_button" v-if="paystatus == 0 && cardtype == 2">
<!-- <nut-button type="default" custom-color="#BCB9AE" size="small">联系客服</nut-button> -->
<div @tap.stop="handleOnlinePay">在线支付</div>
</view>
<!-- <view class="item_button">
<nut-button size="small">删除订单</nut-button>
</view> -->
<view class="item_button">
<!-- <nut-button type="default" custom-color="#BCB9AE" size="small">联系客服</nut-button> -->
<div @tap="handlePhone">联系客服</div>
</view>
</view>
</view>
</template>
<script setup>
import headerBox from '../headerBox/index'
const defalitImg = ref('../../static/images/catgroup.png')
import Gender from '../gender'
import { orderCancel } from '../../api/order'
import { systemConfigInfo } from '../../api/system'
// const components = { 'Gender': Gender, };
const emit = defineEmits(['deleteOrder', 'showPingfen', 'OnlinePay'])
const ordertype = ['', '待服务', '服务中', '已完成', '已取消']
const props = defineProps({
dispatchStatus: {
type: Number,
default: 0
},
phoneNum: {
type: Object,
default: {},
},
orderId: {
type: String,
default: 0
},
title: {
type: String,
default: '',
},
// 1待服务 2服务中 3已完成 4已派单 5已取消
cardtype: {
type: Number,
default: '',
},
ordertime: {
type: String,
default: ''
},
servetime: {
type: String,
default: ''
},
paystatus: {
type: Number,
default: 0
},
petname: {
type: String,
default: ''
},
pettype: {
type: String,
default: ''
},
// 1 母 2 公
gender: {
type: Number,
default: ''
},
imgUrl: {
type: String,
default: null
},
markStatus: {
type: Number,
default: 0
}
})
function handleOnlinePay() {
emit('OnlinePay', { orderId: props.orderId })
}
function handlePingJia() {
emit('showPingfen', { orderId: props.orderId })
}
function handleGoToCarMap() {
uni.navigateTo({ url: '/pages/carMap/index?orderid=' + props.orderId })
}
function cancelOrder() {
console.log(props.orderId, 'cancelOrderId')
// /order/orderCancel
uni.showModal({
title: '提示',
content: '您确认要取消订单吗?',
confirmColor: '#FFCD35',
success: function (res) {
if (res.confirm) {
orderCancel({ orderId: props.orderId }).then(res => {
if (res.code == 200) {
uni.showToast({
title: '取消成功',
//将值设置为 success 或者直接不用写icon这个参数
icon: 'success',
//显示持续时间为 2秒
duration: 2000
})
emit('deleteOrder', { status: false })
}
})
} else if (res.cancel) {
console.log('用户点击取消');
}
}
})
}
function handlePhone() {
console.log(props.phoneNum.content, ' props.phoneNum.content')
wx.makePhoneCall({
phoneNumber: props.phoneNum.content,
success: function () {
console.log("拨打电话成功!")
},
fail: function () {
console.log("拨打电话失败!")
}
})
}
// const components = { 'header-box': headerBox }
</script>
<style lang="scss" scoped>
// page {
// --nut-button-default-bg-color: linear-gradient(90deg, #FFCD35 0%, #FFDE5E 100%);
// --nut-button-small-height: 60rpx;
// --nut-button-small-line-height: 60rpx;
// --nut-button-border-width: 0rpx;
// --nut-button-small-font-size: 28rpx;
// --nut-button-default-color: #312D22;
// --nut-button-warning-background-color:
// }
.order_item {
width: 702rpx;
height: 400rpx;
background: #FFFFFF;
border-radius: 16rpx 16rpx 16rpx 16rpx;
box-sizing: border-box;
padding: 32rpx 24rpx 36rpx 24rpx;
display: flex;
flex-flow: column nowrap;
margin-top: 24rpx;
.order_content {
display: flex;
flex-flow: row nowrap;
margin-top: 22rpx;
height: 202rpx;
padding-bottom: 24rpx;
box-sizing: border-box;
border-bottom: 1rpx solid #E5E4E4;
.ord_con_icon {
width: 96rpx;
height: 96rpx;
border-radius: 50%;
.img_icon {
width: 100%;
height: 100%;
border-radius: 50%;
}
}
.ord_con_content {
margin-left: 16rpx;
display: flex;
flex-flow: column nowrap;
.con_content_title {
font-size: 32rpx;
font-weight: 500;
color: $uni-text-color;
display: flex;
}
.con_content {
margin-top: 12rpx;
color: $uni-text-color-grey;
}
}
}
.button_box {
margin-top: 28rpx;
display: flex;
flex-flow: row nowrap;
justify-content: flex-end;
.item_button {
margin-left: 24rpx;
width: 176rpx;
height: 60rpx;
border-radius: 200rpx 200rpx 200rpx 200rpx;
border: 2rpx solid #BCB9AE;
text-align: center;
line-height: 60rpx;
color: #312D22;
}
}
}
</style>
+98
View File
@@ -0,0 +1,98 @@
<!-- 较高的盒子组件 -->
<template>
<div class="small_box">
<!-- 添加按钮 -->
<div class="add-button" v-if="!isChoose" @tap="handleChangeType">
+
</div>
<div class="add-button ischoose" v-if="isChoose" @tap="handleChangeType">
<img src="../../static/images/chooseitem.png" alt="">
</div>
<div class="small_img_box">
<img :src="goodsIcon" alt="">
</div>
<div class="small_img_content">
<div>{{ name }}</div>
<div>¥{{ price }}</div>
</div>
</div>
</template>
<script setup>
const emit = defineEmits(['goodschooseemit'])
const props = defineProps({
name: {
type: String,
default: ''
},
price: {
type: Number,
default: 0
},
goodsIcon: {
type: String,
default: ''
},
id: {
type: Number,
default: 0
}
})
const isChoose = ref(false)
function handleChangeType() {
isChoose.value = !isChoose.value
emit('goodschooseemit', props.id)
}
</script>
<style lang="scss">
image {
width: 100%;
height: 100%;
}
.small_box {
position: relative;
height: 96rpx;
width: 240rpx;
padding-left: 12rpx;
border-radius: 16rpx 16rpx 16rpx 16rpx;
border: 2rpx solid #E5E4E4;
overflow: hidden;
color: rgba(49, 45, 34, 1);
margin-right: 20rpx;
margin-bottom: 20rpx;
display: flex;
flex-flow: row nowrap;
align-items: center;
.add-button {
position: absolute;
background-color: #000;
top: -2rpx;
right: -2rpx;
width: 32rpx;
height: 32rpx;
color: rgba(217, 217, 217, 1);
line-height: 32rpx;
text-align: center;
}
.ischoose {
background-color: $uni-color-primary;
}
.small_img_box {
height: 56rpx;
width: 56rpx;
}
.small_img_content {
margin-left: 12rpx;
color: $uni-text-color;
font-size: $uni-font-size-sm;
}
}
</style>
+163
View File
@@ -0,0 +1,163 @@
<!-- 头像的盒子组件 -->
<template>
<!-- 无值输入时 -->
<div class="hb_main">
<scroll-view class="hb_box" scroll-x="true">
<!-- 有值输入时 -->
<div class="hb_box_list">
<div class="headerbox-container" v-for="(item, index) in petsList" :key="index"
@tap="choosepetbox(1, index, item)">
<!-- 头像框 -->
<div class="headerbox-title" :class="{ ischeck: item.petInfo.ischeck }">
<div class="header_img_box">
<img :src="item.petInfo.headImgUrl == '' ? '../../static/images/catgroup.png' : item.petInfo.headImgUrl"
alt="">
</div>
<!-- 小选择框 -->
<div class="checkbox" :class="{ ischoose: item.petInfo.ischoose }"
@tap.stop="handleinshoplist(item, index)">
<img v-if="item.petInfo.ischoose" src="../../static/images/Vector.png" alt="">
</div>
</div>
<div class="header-content">
{{ item.petInfo.nickName }}
</div>
</div>
<!-- 最后一个 -->
<div class="headerbox-container" @tap="choosepetbox(2)">
<div class="headerbox-title">
<div class="addpet header_img_box">
<img src="../../static/images/shopaddpet.png" alt="">
</div>
</div>
<div class="header-content">
添加宠物
</div>
</div>
</div>
</scroll-view>
</div>
</template>
<script setup>
import { ref } from 'vue'
const emit = defineEmits(['choosepet'])
const props = defineProps({
petsList: {
type: Array,
default: []
}
})
function handleinshoplist(item) {
item.petInfo.ischoose = !item.petInfo.ischoose
}
function choosepetbox(e, index, item) {
if (e === 1) {
for (let i in props.petsList) {
props.petsList[i].petInfo.ischeck = false
}
item.petInfo.ischeck = true
item.petInfo.ischoose = true
emit('choosepet', index)
} else if (e === 2) {
uni.navigateTo({
url: `/pages/petpage/index`
})
}
}
</script>
<style scoped lang="scss">
.hb_main {
padding: 24rpx;
padding-top: 60rpx;
box-sizing: border-box;
.hb_box {
width: 702rpx;
height: 216rpx;
padding: 24rpx;
box-sizing: border-box;
background-color: #FFFFFF;
border-radius: 16rpx 16rpx 16rpx 16rpx;
.hb_box_list {
display: flex;
flex-flow: row nowrap;
align-items: center;
.headerbox-container {
height: 170rpx;
width: 112rpx;
margin-right: 48rpx;
.headerbox-title {
width: 112rpx;
height: 112rpx;
margin-bottom: 16rpx;
border-radius: 56px;
background-color: #E5E4E4;
position: relative;
display: flex;
align-items: center;
justify-content: center;
.addpet {
background-color: #FFFFFF;
width: 112rpx !important;
height: 112rpx !important;
}
.header_img_box {
width: 102rpx;
height: 102rpx;
border-radius: 50%;
overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
}
.checkbox {
width: 40rpx;
height: 40rpx;
position: absolute;
bottom: 0rpx;
right: 0rpx;
border: 2rpx solid #FFCD35;
border-radius: 50%;
background-color: #fff;
display: flex;
justify-content: center;
align-items: center;
image {
height: 40%;
width: 50%;
}
}
.ischoose {
background-color: #FFCD35;
}
}
.ischeck {
background-color: #FFCD35;
}
.header-content {
text-align: center;
font-size: $uni-font-size-base;
color: $uni-text-color;
}
}
}
}
}
</style>
+330
View File
@@ -0,0 +1,330 @@
<template>
<div>
<nut-popup position="bottom" :visible="showbottom" @close="handleClose" closeable round>
<div class="price_popup_container">
<!-- -->
<div class="price_popup_title"> 预约单 </div>
<!-- 宠物框 -->
<scroll-view class="pet_list" scroll-x="true">
<!-- 循环宠物列表 -->
<div class="show_pet_header_list">
<div class="header_item" v-for="(item, index) in pricelist" :key="index" @tap="chooseselforderlist(item)">
<div class="header_img">
<div class="header_img_box">
<img :src="item.petdata.petInfo.headImgUrl" alt="">
</div>
<div class="checkbox" :class="{ ischoose: item.petdata.petInfo.ischoose }">
<img v-if="item.petdata.petInfo.ischoose" src="../../static/images/Vector.png" alt="">
</div>
</div>
<div class="header_context">
{{ item.petdata.petInfo.nickName }}
</div>
</div>
</div>
</scroll-view>
<!-- 价格框 -->
<scroll-view class="order_list" scroll-y="true">
<div class="order_list_item" v-for="(item, index) in pricelist" :key="index">
<div v-for="(goodsitem, index1) in item.goodsIds" :key="index1" class="item_out"
v-if="item.petdata.petInfo.ischoose">
<div class="item_name">
{{ goodsitem.name }}
</div>
<div class="item_price">
¥{{ goodsitem.price }}
</div>
</div>
</div>
</scroll-view>
<!-- 购买框 -->
<div class="pet_price_box">
<div class="add_box">
<div class="add_left" v-if="!(userInfo.getdiscount == 1 || userInfo.getdiscount == 0)">原有金额¥</div>
<div class="add_left" v-if="userInfo.getdiscount == 1 || userInfo.getdiscount == 0">金额¥</div>
<div class="add_price" :class="{ isline: !(userInfo.getdiscount == 1 || userInfo.getdiscount == 0) }">{{
allPrice }}</div>
<!-- <div class="add_price" v-if="userInfo.getdiscount != 1 && userInfo.getdiscount != 0">{{ parseFloat(allPrice
* userInfo.getdiscount).toFixed(1) }}</div> -->
<!-- * userInfo.getdiscount -->
<!-- <div class="add_price" v-if="userInfo.getdiscount != 1">{{ userInfo.getdiscount }}</div> -->
</div>
<div class="add_box">
<div class="add_left" v-if="userInfo.getdiscount != 1 && userInfo.getdiscount != 0">
折后金额¥
</div>
<div class="add_price" v-if="userInfo.getdiscount != 1 && userInfo.getdiscount != 0">{{ parseFloat(allPrice
* userInfo.getdiscount).toFixed(1) }}</div>
</div>
<div class="buy_now" @click="handleoutprice">
立即预约
</div>
</div>
<nut-safe-area position="bottom"></nut-safe-area>
</div>
</nut-popup>
</div>
</template>
<script setup>
import { watch } from 'vue'
import { useUserInfo } from '@/store'
const allPrice = ref(0)
const emit = defineEmits(['selfclose', 'orderpricelist'])
const userInfo = useUserInfo()
const props = defineProps({
showbottomstates: {
type: Boolean,
default: false
},
pricelist: {
type: Array,
default: []
}
})
function chooseselforderlist(e) {
e.petdata.petInfo.ischoose = !e.petdata.petInfo.ischoose
}
function handleClose(e) {
showbottom.value = false
emit('selfclose', false)
}
function handleoutprice() {
let results = {data:[],results:[]}
wx.requestSubscribeMessage({
tmplIds: ['S1eCDKVtBX1mkiZtCKYvcDOP1-rqulEJwK3fogF6pIw'],
success(e) {
console.log(e)
},
fail(e) {
wx.requestSubscribeMessage({
tmplIds: ['zA6Z1PE2pO65QYhf5SE6Gt5ta8STeZ0eXc0Y8GoXoIE'],
success(e) {
console.log(e)
},
fail(e) {
console.log(e)
},
complete(e) {
console.log(e)
}
})
},
complete(e) {
console.log(e)
}
})
// return
for (let i in props.pricelist) {
let data = { goodsIds: [] }
if (props.pricelist[i].petdata.petInfo.ischoose) {
data.petId = props.pricelist[i].petId
results.data.push(props.pricelist[i])
for (let j in props.pricelist[i].goodsIds) {
data.goodsIds.push(props.pricelist[i].goodsIds[j].id)
}
}
if (data.goodsIds.length > 0) {
results.results.push(data)
}
}
if (results.results.length > 0) {
console.log('返回页面数据')
emit('orderpricelist', results)
} else {
uni.showModal({
title: '提示',
content: '请至少选择一个宠物',
showCancel: false,
confirmColor: '#FFCD35',
success: function (res) {
if (res.confirm) {
console.log('用户点击确定');
} else if (res.cancel) {
console.log('用户点击取消');
}
}
})
}
console.log(results)
}
watch(() => props.pricelist, async (newv, oldv) => {
console.log(newv, 'newv')
let price = 0
newv.forEach((res) => {
if (res.petdata.petInfo.ischoose) {
res.goodsIds.forEach((pricedata) => {
price += pricedata.price
})
}
})
allPrice.value = price
console.log(price, 'pricepricepriceprice')
}, { deep: true })
watch(() => props.showbottomstates, async (newv, oldv) => {
console.log(newv, oldv)
showbottom.value = newv
})
const showbottom = ref(false)
</script>
<style lang="scss">
.price_popup_container {
.price_popup_title {
height: 96rpx;
text-align: center;
line-height: 96rpx;
font-size: 36rpx;
color: #000000;
font-weight: 600;
}
.pet_list {
height: 200rpx;
width: 702rpx;
margin-left: 24rpx;
margin-right: 24rpx;
box-sizing: border-box;
border-bottom: 2rpx solid #E5E5E5;
.show_pet_header_list {
display: flex;
flex-flow: row nowrap;
padding-right: 24rpx;
box-sizing: border-box;
.header_item {
display: flex;
flex-flow: column nowrap;
align-items: center;
margin-right: 48rpx;
box-sizing: border-box;
.header_img {
width: 112rpx;
height: 112rpx;
border-radius: 50%;
border: 4rpx solid #FFCD35;
margin-bottom: 16rpx;
box-sizing: border-box;
position: relative;
display: flex;
align-items: center;
justify-content: center;
.header_img_box {
width: 106rpx;
height: 106rpx;
border-radius: 50%;
overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
}
.checkbox {
width: 40rpx;
height: 40rpx;
position: absolute;
bottom: 0rpx;
right: 0rpx;
border: 2rpx solid #FFCD35;
border-radius: 50%;
background-color: #fff;
display: flex;
justify-content: center;
align-items: center;
image {
height: 40%;
width: 50%;
}
}
.ischoose {
background-color: #FFCD35;
}
}
.header_context {
font-weight: 400;
font-size: 28rpx;
color: #312D22;
}
}
}
}
.order_list {
height: 264rpx;
padding-top: 32rpx;
box-sizing: border-box;
.order_list_item {
.item_out {
display: flex;
flex-flow: row nowrap;
justify-content: space-between;
margin-bottom: 32rpx;
padding: 0rpx 24rpx;
box-sizing: border-box;
.item_name {
font-weight: 500;
font-size: 28rpx;
color: #312D22;
}
.item_price {
font-size: 28rpx;
color: #312D22;
}
}
}
}
.pet_price_box {
padding: 0rpx 24rpx;
box-sizing: border-box;
height: 128rpx;
display: flex;
flex-flow: row nowrap;
align-items: center;
justify-content: space-between;
.add_box {
display: flex;
flex-flow: row nowrap;
align-items: center;
.add_left {
font-size: 28rpx;
color: #312D22;
}
.add_price {
font-size: 36rpx;
color: #312D22;
}
}
.buy_now {
width: 200rpx;
height: 88rpx;
background: linear-gradient(270deg, #FFCD35 0%, #FFDE5E 100%);
border-radius: 74rpx 74rpx 74rpx 74rpx;
text-align: center;
line-height: 88rpx;
}
}
}
.isline {
text-decoration: line-through
}
</style>
+167
View File
@@ -0,0 +1,167 @@
<!-- 护理页面用box -->
<template>
<view class="card_box">
<!-- 车辆 -->
<div class="card_box_car" v-if="cardtype == 2">
<headerbox :title="title" :sub="sub" :type="titletype"></headerbox>
<div class="card_text card_margin">
{{ '当前护理人员:' + nickname }}
</div>
<!-- <div class="card_text card_margin">
{{ '预约时间:' + reservetime }}
</div> -->
</div>
<!-- 服务中订单 -->
<div class="card_box_pet" v-if="cardtype == 1">
<div class="card_box_img">
<img :src="headImgUrl" alt="">
<!-- {{ headImgUrl }} -->
</div>
<div class="card_box_content">
<headerbox :title="'下单日期:' + createTime" :sub="sub" :type="titletype"></headerbox>
<headerbox :title="''" :sub="payStatus == 1 ? '已支付' : '未支付'" :type="titletype"></headerbox>
<!-- title -->
<div class="pet_info card_text card_margin">
<div class="item_item">
<Gender :gender="gender"></Gender>
</div>
<div class="item_item">{{ catname }}</div>
<div>{{ cattype }}</div>
</div>
<div class="card_text card_margin">{{ '所选服务:' + title }} </div>
<div class="card_text card_margin">
{{ '预约时间:' + reservetime }}
</div>
</div>
</div>
</view>
</template>
<script setup>
import headerbox from '../headerBox/index.vue'
import Gender from '../gender'
const props = defineProps({
title: {
type: String,
default: '',
},
createTime: {
type: String,
default: '',
},
nickname:{
type: String,
default: '',
},
sub: {
type: String,
default: '',
},
titletype: {
type: String,
default: 'yellow',
},
// 1 宠物 2 车辆
cardtype: {
type: Number,
default: 1,
},
catname: {
type: String,
default: '',
},
cattype: {
type: String,
default: '',
},
gender: {
type: Number,
default: 0,
},
reservetime: {
type: String,
default: '',
},
headImgUrl: {
type: String,
default: ''
},
payStatus: {
type: Number,
default: 0
}
})
</script>
<style lang="scss">
// page {
// --nut-button-default-bg-color: linear-gradient(90deg, #FFCD35 0%, #FFDE5E 100%);
// --nut-button-small-height: 60rpx;
// --nut-button-small-line-height: 60rpx;
// --nut-button-border-width: 0rpx;
// --nut-button-small-font-size: 28rpx;
// --nut-button-default-color: #312D22;
// }
.card_text {
color: $uni-text-color-grey
}
.card_margin {
margin-top: 14rpx;
}
.card_box {
--nut-button-default-bg-color: linear-gradient(90deg, #FFCD35 0%, #FFDE5E 100%);
--nut-button-small-height: 60rpx;
--nut-button-small-line-height: 60rpx;
--nut-button-border-width: 0rpx;
--nut-button-small-font-size: 28rpx;
--nut-button-default-color: #312D22;
width: 702rpx;
// height: 202rpx;
background: #FFFFFF;
border-radius: 16rpx 16rpx 16rpx 16rpx;
margin-bottom: 24rpx;
padding: 24rpx;
box-sizing: border-box;
.card_box_car {
display: flex;
flex-flow: column nowrap;
}
.card_box_pet {
display: flex;
flex-flow: row nowrap;
justify-content: space-between;
.card_box_img {
width: 96rpx;
height: 96rpx;
// background-color: #000;
border-radius: 50%;
overflow: hidden;
image {
height: 100%;
width: 100%;
}
}
.card_box_content {
width: calc(100% - 96rpx - 20rpx);
.pet_info {
display: flex;
flex-flow: row nowrap;
.item_item {
margin-right: 16rpx;
}
}
}
}
}
</style>
+253
View File
@@ -0,0 +1,253 @@
<template>
<div>
<nut-popup position="bottom" :visible="showbottom" @close="handleClose" closeable round>
<div class="time_popup_container">
<!-- title -->
<div class="titlebox">
预约时间
</div>
<!-- 宠物框 -->
<!-- <scroll-view class="time_day_list" scroll-x="true"> -->
<scroll-view class="time_day_list" scroll-x="true">
<div class="scroll_view_list_class">
<div v-for="(item, index) in timelists" :key="index" class="time_day_item" @tap="handlechoooseDay(index)">
<div class="list_day" :class="{ yellow: item.ischeck }">
{{ timedaylist[item.date] }}
</div>
<div class="list_date" :class="{ yellow: item.ischeck }">
{{ item.day }}
</div>
<div class="yellowbottom" v-if="item.ischeck"></div>
</div>
</div>
</scroll-view>
<!-- 价格框 -->
<div class="time_order_list">
<div v-for="(item, index) in showtimelist" :key="index" @tap="handletimeitemlist(index)"
class="time_order_list_item" :class="{ isdisable: !item.y, ischecked: item.ischeck }">
{{ item.time }}
</div>
</div>
<!-- 购买框 -->
<div class="bottom_box">
<div class="future_time">预计时间{{ showtime }}</div>
<div class="button_class" @click="handleupdate">确认</div>
</div>
</div>
<nut-safe-area position="bottom"></nut-safe-area>
</nut-popup>
</div>
</template>
<script setup>
import { reactive, toRefs, watch } from 'vue';
const emit = defineEmits(['selfclose', 'uploadtime'])
const props = defineProps({
showbottomstates: {
type: Boolean,
default: false
},
timelists: {
type: Array,
default: []
}
})
const timedaylist = ref(['周日', '周一', '周二', '周三', '周四', '周五', '周六'])
const showtimelist = ref([])
const showtitle = ref([])
const showtime = ref('')
const backtime = ref('')
const isfirsttime = ref(true)
function handleupdate(e) {
console.log(backtime.value + ' ' + showtime.value)
if (showtime.value) {
emit('uploadtime', backtime.value + ' ' + showtime.value)
emit('selfclose', false)
}
}
function handletimeitemlist(e) {
isfirsttime.value = false
console.log(showtimelist.value[e])
for (let i in showtimelist.value) {
showtimelist.value[i].ischeck = false
}
if (!showtimelist.value[e].y) {
return
}
console.log(showtimelist.value)
for (let i in props.timelists) {
if (props.timelists[i].ischeck) {
backtime.value = props.timelists[i].backtime
}
}
showtimelist.value[e].ischeck = true
showtime.value = showtimelist.value[e].time
}
function handlechoooseDay(e) {
isfirsttime.value = false
console.log('handlechoooseDay', e)
showtimelist.value.splice(0, showtimelist.value.length)
for (let i in props.timelists) {
props.timelists[i].ischeck = false
}
props.timelists[e].ischeck = true
backtime.value = props.timelists[e].backtime
console.log(props.timelists[e], ' props.timelists')
showtimelist.value = JSON.parse(JSON.stringify(props.timelists[e].timelist))
console.log(showtimelist.value)
// props.timelists[e].timelist.forEach(element => {
// showtimelist.value.push(element)
// });
}
function handleClose(e) {
showbottom.value = false
emit('selfclose', false)
}
watch(() => props.timelists, (newv, oldv) => {
if (newv && newv[0] && isfirsttime.value) {
showtimelist.value = JSON.parse(JSON.stringify(props.timelists[0].timelist))
// if (showtimelist.value.length > 0) {
// showtimelist.value.splice(0, showtimelist.value.length)
// }
// newv[0].timelist.forEach(e => {
// // ischeck
// let data = { ...e, ischeck: false }
// showtimelist.value.push(JSON.parse(JSON.stringify(data)))
// })
}
}, { deep: true })
watch(() => props.showbottomstates, (newv, oldv) => {
console.log(newv, oldv)
showbottom.value = newv
})
const showbottom = ref(false)
</script>
<style lang="scss">
.time_popup_container {
height: 1000rpx;
.titlebox {
width: 750rpx;
height: 96rpx;
font-size: $uni-font-size-lg;
color: #000;
font-weight: 600;
display: flex;
justify-content: center;
align-items: center;
}
.time_day_list {
height: 112rpx;
width: 750rpx;
box-shadow: inset 0rpx -1rpx 0rpx 0rpx #E5E4E4;
padding-right: 30rpx;
box-sizing: border-box;
.scroll_view_list_class {
display: flex;
flex-flow: row nowrap;
height: 100%;
.time_day_item {
width: 76rpx;
text-align: center;
margin-right: 36rpx;
margin-left: 36rpx;
position: relative;
height: 100%;
.list_day {
color: $uni-text-color-grey;
font-size: $uni-font-size-sm;
margin-bottom: 16rpx;
}
.list_date {
color: $uni-text-color;
font-size: 30rpx;
}
.yellow {
color: $uni-color-primary !important;
}
.yellowbottom {
position: absolute;
bottom: 2rpx;
left: 25rpx;
width: 32rpx;
height: 4rpx;
background: $uni-color-primary;
border-radius: 0rpx 0rpx 0rpx 0rpx;
}
}
}
}
.time_order_list {
height: 664rpx;
padding: 11rpx;
box-sizing: border-box;
display: flex;
flex-flow: row wrap;
align-items: flex-start;
align-content: start;
.time_order_list_item {
width: 156rpx;
height: 96rpx;
background: #F3F3F3;
border-radius: 16rpx 16rpx 16rpx 16rpx;
text-align: center;
line-height: 96rpx;
box-sizing: border-box;
margin: 13rpx;
}
.isdisable {
background: #F3F3F3;
color: #BCB9AE;
}
.ischecked {
background: #FFCD35;
color: #312D22
}
}
.bottom_box {
height: 128rpx;
display: flex;
flex-flow: row nowrap;
padding: 0rpx 24rpx;
align-items: center;
justify-content: space-between;
.future_time {
font-size: 28rpx;
color: #312D22;
}
.button_class {
width: 240rpx;
height: 88rpx;
background: linear-gradient(270deg, #FFCD35 0%, #FFDE5E 100%);
border-radius: 74rpx 74rpx 74rpx 74rpx;
display: flex;
justify-content: center;
align-items: center;
}
}
}
</style>
+79
View File
@@ -0,0 +1,79 @@
Component({
data: {
selected: 0,
color: "#B8BBC3",
selectedColor: "#312D22",
key: 'tabbar_key',
list: [
{
pagePath: "/pages/index/index",
iconPath: "/static/images/home2.png",
selectedIconPath: "/static/images/home.png",
text: "首页"
},
{
pagePath: "/pages/user/index",
iconPath: "/static/images/user2.png",
selectedIconPath: "/static/images/user.png",
text: "用户"
}
]
},
moved(){
console.log('moved')
},
attached() {
console.log( '123attachedattachedattached123')
// wx.eventBus.on({
// key: this.key,
// event: 'change',
// listener: () => {
try {
let value = wx.getStorageSync('store_userinfo').role
console.log(value,`wx.getStorageSync('store_userinfo').role`)
if (value == 1) {
this.setData({
list: [{
pagePath: "/pages/carepage/index",
iconPath: "/static/images/Group2.png",
selectedIconPath: "/static/images/Group.png",
text: "护理"
}]
})
}else if(value == 0){
this.setData({
list: [{
pagePath: "/pages/index/index",
iconPath: "/static/images/home2.png",
selectedIconPath: "/static/images/home.png",
text: "首页"
},
{
pagePath: "/pages/user/index",
iconPath: "/static/images/user2.png",
selectedIconPath: "/static/images/user.png",
text: "用户"
}]
})
}
} catch (e) {
// Do something when catch error
}
// }
// })
// 可以在这里控制显示
},
methods: {
switchTab(e) {
const data = e.currentTarget.dataset
const url = data.path
// console.log(url)
wx.switchTab({ url })
this.setData({
selected: data.index
})
}
}
})
+3
View File
@@ -0,0 +1,3 @@
{
"component": true
}
+7
View File
@@ -0,0 +1,7 @@
<!--miniprogram/custom-tab-bar/index.wxml-->
<cover-view class="tab-bar">
<cover-view wx:for="{{list}}" wx:key="index" class="tab-bar-item" data-path="{{item.pagePath}}" data-index="{{index}}" bindtap="switchTab">
<cover-image class="tab-bar-item-img" src="{{selected === index ? item.selectedIconPath : item.iconPath}}"></cover-image>
<cover-view style="color: {{selected === index ? selectedColor : color}}">{{item.text}}</cover-view>
</cover-view>
</cover-view>
+28
View File
@@ -0,0 +1,28 @@
.tab-bar {
position: fixed;
bottom: 0;
left: 0;
right: 0;
height: 48px;
background: white;
display: flex;
padding-bottom: env(safe-area-inset-bottom);
box-shadow: 0rpx -1rpx 0rpx 0rpx #ECECEC;
}
.tab-bar-item {
flex: 1;
text-align: center;
display: flex;
flex-flow: row nowrap;
justify-content: center;
align-items: center;
}
.tab-bar-item .tab-bar-item-img {
width: 27px;
height: 27px;
margin-right: 16rpx;
}
+14
View File
@@ -0,0 +1,14 @@
import {
createSSRApp
} from "vue";
import App from "./App.vue";
import store from './store';
export function createApp() {
const app = createSSRApp(App);
app.use(store);
console.log('挂在pinia')
return {
app,
};
}
+78
View File
@@ -0,0 +1,78 @@
{
"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": {
"requiredPrivateInfos": ["chooseLocation","getLocation"],
"appid": "wxd3eb721e29d5049a",
"setting": {
"urlCheck": false
},
"permission":{
"scope.userLocation": {
"desc": "你的位置信息将用于小程序位置接口的效果展示"
}
},
"usingComponents": true
},
"mp-alipay": {
"usingComponents": true
},
"mp-baidu": {
"usingComponents": true
},
"mp-toutiao": {
"usingComponents": true
},
"uniStatistics": {
"enable": false
},
"vueVersion": "3"
}
+180
View File
@@ -0,0 +1,180 @@
{
"pages": [
{
"path": "pages/index/index",
"style": {
"navigationBarTitleText": "",
"navigationStyle": "custom"
}
},
{
"path": "pages/user/index",
"style": {
"navigationBarTitleText": "",
"navigationStyle": "custom"
}
},
{
"path": "pages/orderlist/index",
"style": {
"navigationBarTitleText": "",
"navigationStyle": "custom"
}
},
{
"path": "pages/petpage/index",
"style": {
"navigationBarTitleText": "",
"navigationStyle": "custom"
}
},
{
"path": "pages/shoppage/index",
"style": {
"navigationBarTitleText": "",
"navigationStyle": "custom"
}
},
{
"path": "pages/carepage/index",
"style": {
"navigationBarTitleText": "",
"navigationStyle": "custom"
}
},
{
"path": "pages/petlist/index",
"style": {
"navigationBarTitleText": "",
"navigationStyle": "custom"
}
},
{
"path": "pages/topup/index",
"style": {
"navigationBarTitleText": "",
"navigationStyle": "custom"
}
},
{
"path": "pages/addressconfig/index",
"style": {
"navigationBarTitleText": "",
"navigationStyle": "custom"
}
},
{
"path": "pages/addresslist/index",
"style": {
"navigationBarTitleText": "",
"navigationStyle": "custom"
}
},
{
"path": "pages/orderinfo/index",
"style": {
"navigationBarTitleText": "",
"navigationStyle": "custom"
}
},
{
"path": "pages/paysuccess/index",
"style": {
"navigationBarTitleText": "",
"navigationStyle": "custom"
}
},
{
"path": "pages/mappage/index",
"style": {
"navigationBarTitleText": "服务区域选择"
}
},
{
"path": "pages/webview/index",
"style": {
"navigationBarTitleText": "webview"
}
},
{
"path": "pages/login/index",
"style": {
"navigationBarTitleText": "登录"
}
},
{
"path": "pages/careorderinfo/index",
"style": {
"navigationBarTitleText": "护理订单详情",
"navigationStyle": "custom"
}
},
{
"path": "pages/finalcareorderpage/index",
"style": {
"navigationBarTitleText": "结束订单",
"navigationStyle": "custom"
}
},
{
"path": "pages/careorderconfig/index",
"style": {
"navigationBarTitleText": "确认订单",
"navigationStyle": "custom"
}
},
{
"path": "pages/orderchangegoodspage/index",
"style": {
"navigationBarTitleText": "确认订单商品",
"navigationStyle": "custom"
}
},
{
"path": "pages/checkstand/index",
"style": {
"navigationBarTitleText": "收银台",
"navigationStyle": "custom"
}
},
{
"path": "pages/couponlist/index",
"style": {
"navigationBarTitleText": "优惠券",
"navigationStyle": "custom"
}
},
{
"path": "pages/carMap/index",
"style": {
"navigationBarTitleText": "车辆轨迹"
}
}
],
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "uni-app",
"navigationBarBackgroundColor": "#F8F8F8",
"backgroundColor": "#F8F8F8"
},
"tabBar": {
"custom": true,
"color": "#B8BBC3",
"selectedColor": "#312D22",
"backgroundColor": "#ffffff",
"list": [
{
"pagePath": "pages/index/index",
"text": "首页"
},
{
"pagePath": "pages/carepage/index",
"text": "分类"
},
{
"pagePath": "pages/user/index",
"text": "分类"
}
]
}
}

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