pull/4/head
张宇 2 years ago
parent 1d62674b69
commit 345de09c0c

@ -89,4 +89,46 @@ page {
word-break: break-all; word-break: break-all;
overflow: hidden; overflow: hidden;
} }
@keyframes warn {
0% {
transform: scale(.5);
opacity: 1
}
30% {
opacity: .7
}
to {
transform: scale(2.5);
opacity: 0
}
}
.warn-state {
display: inline-block;
width: 8px;
height: 8px;
border-radius: 50%;
vertical-align: middle
}
.warn-status-processing {
position: relative
}
.warn-status-processing:after {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
border-radius: 50%;
background: inherit;
content: "";
animation: warn 1.2s ease-in-out infinite
}
</style> </style>

@ -29,5 +29,13 @@ export default {
}, },
UserGetList(data) {
return request({
url: "/admin/Coupon/UserGetList",
method: "POST",
data,
type: 'store'
});
},
}; };

@ -0,0 +1,91 @@
import {
request
} from "@/utils/request";
export default {
SalesDiscounts: {
List(data) {
return request({
url: "/admin/SalesDiscounts/List",
method: "GET",
data,
type: 'store'
});
},
GetItem(data) {
return request({
url: "/admin/SalesDiscounts/GetItem",
method: "GET",
data,
type: 'store'
});
},
Create(data) {
return request({
url: "/admin/SalesDiscounts/Create",
method: "POST",
data,
type: 'store'
});
},
},
SalesFullDiscounts: {
List(data) {
return request({
url: "/admin/SalesFullDiscounts/List",
method: "GET",
data,
type: 'store'
});
},
GetItem(data) {
return request({
url: "/admin/SalesFullDiscounts/GetItem",
method: "GET",
data,
type: 'store'
});
},
Create(data) {
return request({
url: "/admin/SalesFullDiscounts/Create",
method: "POST",
data,
type: 'store'
});
},
},
SalesFullSetRedution: {
List(data) {
return request({
url: "/admin/SalesFullSetRedution/List",
method: "GET",
data,
type: 'store'
});
},
GetItem(data) {
return request({
url: "/admin/SalesFullSetRedution/GetItem",
method: "GET",
data,
type: 'store'
});
},
Create(data) {
return request({
url: "/admin/SalesFullSetRedution/Create",
method: "POST",
data,
type: 'store'
});
},
}
};

@ -0,0 +1,52 @@
import {
request
} from "@/utils/request";
export default {
List(data) {
return request({
url: "/admin/recharge/List",
method: "GET",
data,
type: 'store'
});
},
save(data) {
return request({
url: "/admin/recharge/save",
method: "GET",
data,
type: 'store'
});
},
recharge_list(data) {
return request({
url: "/admin/recharge/recharge_list",
method: "GET",
data,
type: 'store'
});
},
rechargeSet: {
list(data) {
return request({
url: "/admin/rechargeSet/list",
method: "GET",
data,
type: 'store'
});
},
save(data) {
return request({
url: "/admin/rechargeSet/save",
method: "GET",
data,
type: 'store'
});
},
}
};

@ -5,7 +5,7 @@
<scroll-view scroll-y="true" class="scroll-Y" :style="{ height: props.height }" @scrolltolower="lower"> <scroll-view scroll-y="true" class="scroll-Y" :style="{ height: props.height }" @scrolltolower="lower">
<slot :list="list"></slot> <slot :list="list"></slot>
<view v-show="firstLoading" v-if="list.length == 0"> <view v-show="firstLoading" v-if="list && list.length == 0">
<wd-status-tip image="search" tip="暂无数据 ~" /> <wd-status-tip image="search" tip="暂无数据 ~" />
</view> </view>
</scroll-view> </scroll-view>
@ -56,6 +56,10 @@ const props = defineProps({
height: { height: {
type: String, type: String,
default: "100vh" default: "100vh"
},
noPageSize: {
type: Boolean,
default: false
} }
}); });
@ -86,6 +90,13 @@ const getData = async () => {
...props.params ...props.params
}); });
if (props.noPageSize) {
if (res.data?.length) {
list.value = res.data
} else {
toast.success('全部加载完了');
}
} else {
if (res.data.rows.length) { if (res.data.rows.length) {
query.value.pageSize = res.data.pageSize; query.value.pageSize = res.data.pageSize;
total.value = res.data.total; total.value = res.data.total;
@ -93,6 +104,8 @@ const getData = async () => {
} else { } else {
toast.success('全部加载完了'); toast.success('全部加载完了');
} }
}
loading.value = false; loading.value = false;
firstLoading.value = true; firstLoading.value = true;
@ -111,15 +124,29 @@ const upData = async (upParams = {}) => {
query.value.page = 1; query.value.page = 1;
query.value.pageSize = 20; query.value.pageSize = 20;
list.value = []
const res = await props.apiObj({ const res = await props.apiObj({
...query.value, ...query.value,
...props.params, ...props.params,
...upParams ...upParams
}); });
if (props.noPageSize) {
if (res.data?.length) {
list.value = res.data
} else {
toast.success('全部加载完了');
}
} else {
if (res.data.rows.length) {
query.value.pageSize = res.data.pageSize; query.value.pageSize = res.data.pageSize;
total.value = res.data.total; total.value = res.data.total;
list.value = res.data.rows; list.value = res.data.rows;
} else {
toast.success('全部加载完了');
}
}
loading.value = false; loading.value = false;
}; };

@ -29,6 +29,18 @@
} }
} }
}, },
{
"path": "function/index",
"style": {
"navigationBarTitleText": "应用中心",
"enablePullDownRefresh": false,
"mp-alipay": {
"transparentTitle": "always",
"titlePenetrate": "YES",
"gestureBack": "YES"
}
}
},
{ {
"path": "goods/index", "path": "goods/index",
"style": { "style": {
@ -89,6 +101,138 @@
} }
} }
}, },
{
"path": "coupon/userCoupon",
"style": {
"navigationBarTitleText": "领取记录",
"enablePullDownRefresh": false,
"mp-alipay": {
"transparentTitle": "always",
"titlePenetrate": "YES",
"gestureBack": "YES"
}
}
},
{
"path": "discount/discount/index",
"style": {
"navigationBarTitleText": "限时折扣",
"enablePullDownRefresh": false,
"mp-alipay": {
"transparentTitle": "always",
"titlePenetrate": "YES",
"gestureBack": "YES"
}
}
},
{
"path": "discount/discount/edit",
"style": {
"navigationBarTitleText": "限时折扣",
"enablePullDownRefresh": false,
"mp-alipay": {
"transparentTitle": "always",
"titlePenetrate": "YES",
"gestureBack": "YES"
}
}
},
{
"path": "discount/full_discount/index",
"style": {
"navigationBarTitleText": "梯度折扣",
"enablePullDownRefresh": false,
"mp-alipay": {
"transparentTitle": "always",
"titlePenetrate": "YES",
"gestureBack": "YES"
}
}
},
{
"path": "discount/full_discount/edit",
"style": {
"navigationBarTitleText": "梯度折扣",
"enablePullDownRefresh": false,
"mp-alipay": {
"transparentTitle": "always",
"titlePenetrate": "YES",
"gestureBack": "YES"
}
}
},
{
"path": "discount/full_set_redution/index",
"style": {
"navigationBarTitleText": "满额立减",
"enablePullDownRefresh": false,
"mp-alipay": {
"transparentTitle": "always",
"titlePenetrate": "YES",
"gestureBack": "YES"
}
}
},
{
"path": "discount/full_set_redution/edit",
"style": {
"navigationBarTitleText": "满额立减",
"enablePullDownRefresh": false,
"mp-alipay": {
"transparentTitle": "always",
"titlePenetrate": "YES",
"gestureBack": "YES"
}
}
},
{
"path": "recharge/index",
"style": {
"navigationBarTitleText": "充值管理",
"enablePullDownRefresh": false,
"mp-alipay": {
"transparentTitle": "always",
"titlePenetrate": "YES",
"gestureBack": "YES"
}
}
},
{
"path": "recharge/edit",
"style": {
"navigationBarTitleText": "充值方案",
"enablePullDownRefresh": false,
"mp-alipay": {
"transparentTitle": "always",
"titlePenetrate": "YES",
"gestureBack": "YES"
}
}
},
{
"path": "recharge/userRecharge",
"style": {
"navigationBarTitleText": "充值记录",
"enablePullDownRefresh": false,
"mp-alipay": {
"transparentTitle": "always",
"titlePenetrate": "YES",
"gestureBack": "YES"
}
}
},
{
"path": "recharge/setUp",
"style": {
"navigationBarTitleText": "设置",
"enablePullDownRefresh": false,
"mp-alipay": {
"transparentTitle": "always",
"titlePenetrate": "YES",
"gestureBack": "YES"
}
}
},
{ {
"path": "inpersonPay/index", "path": "inpersonPay/index",
"style": { "style": {

@ -3,7 +3,9 @@
<wd-tabbar custom-class="mb-3" fixed safeAreaInsetBottom placeholder v-model="tab" shape="round"> <wd-tabbar custom-class="mb-3" fixed safeAreaInsetBottom placeholder v-model="tab" shape="round">
<wd-tabbar-item @click="utils.toUrl('/store/index/index')" name="home" title="首页" icon="home"></wd-tabbar-item> <wd-tabbar-item @click="utils.toUrl('/store/index/index')" name="home" title="首页" icon="home"></wd-tabbar-item>
<!-- <wd-tabbar-item name="cart" title="分类" icon="cart"></wd-tabbar-item> --> <!-- <wd-tabbar-item name="cart" title="分类" icon="cart"></wd-tabbar-item> -->
<wd-tabbar-item name="user" @click="utils.toUrl('/store/user/list')" title="用户管理" icon="user"></wd-tabbar-item> <wd-tabbar-item name="function" @click="utils.toUrl('/store/function/index')" title="应用中心"
icon="layers"></wd-tabbar-item>
<!-- <wd-tabbar-item name="user" @click="utils.toUrl('/store/user/list')" title="用户管理" icon="user"></wd-tabbar-item> -->
<wd-tabbar-item @click="utils.toUrl('/store/shop/list')" name="shop" title="门店管理" icon="detection"></wd-tabbar-item> <wd-tabbar-item @click="utils.toUrl('/store/shop/list')" name="shop" title="门店管理" icon="detection"></wd-tabbar-item>
<!-- <wd-tabbar-item name="user" title="我的" icon="user"></wd-tabbar-item> --> <!-- <wd-tabbar-item name="user" title="我的" icon="user"></wd-tabbar-item> -->
</wd-tabbar> </wd-tabbar>

@ -27,6 +27,10 @@
<view class="mr-2"> <view class="mr-2">
<wd-button @click="utils.toUrl('/store/coupon/edit')" size="small">新增券</wd-button> <wd-button @click="utils.toUrl('/store/coupon/edit')" size="small">新增券</wd-button>
</view> </view>
<view class="mr-2">
<wd-button @click="utils.toUrl('/store/coupon/userCoupon')" size="small">领取记录</wd-button>
</view>
</view> </view>
<!-- <view class="flex-1 bg-white pb-2"> <!-- <view class="flex-1 bg-white pb-2">

@ -0,0 +1,211 @@
<template>
<view class="content">
<view class=" bg-white sticky top-0 z-50">
<div class="flex items-center">
<view class="flex-1">
<wd-search @search="search" @clear="search({ value: '' })" v-model="params.keywords" hide-cancel>
<template #prefix>
<wd-popover v-model="popover" mode="menu" :content="menu" @menuclick="changeSearchType">
<view class="search-type">
<text>{{ searchType }}</text>
<wd-icon custom-class="icon-arrow" name="fill-arrow-down"></wd-icon>
</view>
</wd-popover>
</template>
</wd-search>
</view>
</div>
<wd-tabs @change="(e) => {
params.coupon_type = e.index
search({ value: params.keywords })
}" v-model="params.coupon_type">
<wd-tab v-for="item in status" :key="item" :title="`${item.content}`"></wd-tab>
</wd-tabs>
</view>
<view class="goodsBox p-2">
<yList ref="yListRef" :apiObj="couponApi.UserGetList" :params="{ ...params }">
<template #default="{ list }">
<view>
<view v-for="item of list" class="goods">
<wd-card type="rectangle">
<template #title>
<view class="title">
<view>
<span class="mr-2">用户{{ item?.user_info?.nickname }}</span>
</view>
<view class="title-tip">
<span style="font-size: 24rpx;margin-left: 8px;">券ID{{ item.coupon?.id }}</span>
</view>
</view>
</template>
<view class="bg-gray-50 p-2 mb-2 flex justify-between" style="font-size: 22rpx;">
<view><text class="text-black">{{ item.coupon?.name || 0 }}</text></view>
</view>
<view class="bg-gray-50 p-2 mb-2 flex justify-between" style="font-size: 22rpx;">
<view>满减金额<text class="text-red-600"> {{ item.coupon?.full_price || 0 }}</text></view>
<view>优惠金额<text class="text-red-600"> {{ item.coupon?.price || 0 }}</text></view>
</view>
<template #footer>
<!-- <view class="bg-gray-50 p-2 mb-2.5 flex justify-between" style="font-size: 22rpx;">
<view>
售后状态:
</view>
</view> -->
<view class="flex justify-between items-center">
<!-- <view class="font-bold">实付: {{ item.pay_price }} </view> -->
<view>
<wd-button :round="false" size="small"
:type="['warning', 'success', 'warning', 'success', 'info'][item.coupon.coupon_type]">
<div>{{ ["优惠券", "商品", "分类", "当面付"][item.coupon.coupon_type] }} · 可用</div>
</wd-button>
</view>
<view class="flex-1 flex justify-end">
<!-- <view v-if="item.apply_cancel === 1" class="mr-2">
<wd-button type="error" @click="orderApproval(item)" size="small">退款</wd-button>
</view>
<view class="mr-2">
<wd-button @click="printing(item)" size="small">小票打印</wd-button>
</view>
<view class="mr-2">
<wd-button @click="orderNotes(item)" size="small">备注</wd-button>
</view>
<view v-if="item.status == 1" class="">
<wd-button @click="shipments(item)" size="small">发货</wd-button>
</view> -->
</view>
</view>
</template>
</wd-card>
</view>
</view>
</template>
</yList>
</view>
<wd-toast />
</view>
</template>
<script setup>
import utils from '@/utils/utils.js';
import couponApi from '@/api/store/coupon.js';
import yList from "/components/yList/index.vue";
import { useMessage } from '@/uni_modules/wot-design-uni';
import { useToast } from '@/uni_modules/wot-design-uni';
import { ref } from 'vue';
const message = useMessage('wd-message-box-slot');
const toast = useToast();
const params = ref({
keywords: "",
coupon_type: 0,
});
const yListRef = ref(null);
const search = ({ value }) => {
yListRef.value.upData({
keywords: value,
coupon_type: params.value.coupon_type
});
};
const searchType = ref('券名');
const popover = ref(false);
const status = ref([
{ content: '全部' },
{ content: '商品' },
{ content: '分类' },
{ content: '当面付' },
]);
const menu = ref([
{ content: '券名' },
{ content: '券金额' },
]);
/**
* 切换搜索类型
* @param {Object} item - 切换的项
*/
function changeSearchType({ item, index }) {
if (searchType.value == '券名') {
yListRef.value.upData({
name: params.value.keywords,
});
} else if (searchType.value == '券金额') {
yListRef.value.upData({
price: params.value.keywords
});
} else {
yListRef.value.upData({});
}
}
</script>
<style lang="scss" scoped>
.search-type {
position: relative;
height: 30px;
line-height: 30px;
padding: 0 8px 0 10px;
font-size: 22rpx;
color: rgba(0, 0, 0, .45);
}
.search-type::after {
position: absolute;
content: '';
width: 1px;
right: 0;
top: 5px;
bottom: 5px;
background: rgba(0, 0, 0, 0.25);
}
.search-type {
:deep(.icon-arrow) {
display: inline-block;
font-size: 20px;
vertical-align: middle;
}
}
.goodsBox {
.content,
.title {
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
}
.content {
justify-content: flex-start;
}
.title {
justify-content: space-between;
}
.title-tip {
color: rgba(0, 0, 0, 0.25);
font-size: 12px;
}
}
</style>

@ -0,0 +1,186 @@
<template>
<view>
<kevyloading v-if="loading" type="bsm-loader" color="#618af8" transparent></kevyloading>
<wd-form v-if="!loading" :model="form" :rules="rules" :disabled="mode == 'show'" ref="dialogForm" label-width="100px">
<wd-form-item label="折扣名称" prop="name">
<wd-input placeholder="请输入折扣名称" v-model="dataForm.name" clearable style="width: 100%"></wd-input>
</wd-form-item>
<wd-cell-group class="flex py-2 w-full" title="活动背景">
<view class="ml-3">
<yUpload v-model="dataForm.bg_pic" :size="1"></yUpload>
</view>
</wd-cell-group>
<wd-form-item label="活动背景颜色" prop="name">
<wd-input placeholder="请输入十六进制颜色" v-model="dataForm.bg_color" clearable style="width: 100%"></wd-input>
</wd-form-item>
<wd-form-item label="折扣比例" prop="discount">
<wd-input type="number" placeholder="请输入折扣比例" step="1" v-model.number="dataForm.discount" clearable
style="width: 100%"></wd-input>
<div style="color: #666;font-size: 12px;">
如商品单价100折扣比例40 (4)仅需付40元
</div>
</wd-form-item>
<wd-form-item label="选择商品">
<yGoods v-model="dataForm.deatil" :size="1"></yGoods>
</wd-form-item>
<div style="display: flex;flex-direction: column;">
<wd-datetime-picker v-model="dataForm.start_time" label="开始时间" />
<wd-datetime-picker v-model="dataForm.end_time" label="结束时间" />
</div>
<!-- 是否启用 -->
<wd-form-item label="是否启用:" prop="status">
<wd-switch v-model="dataForm.status" :active-value="1" :inactive-value="0"></wd-switch>
</wd-form-item>
<!-- 提交按钮 -->
<view class="mt-2 px-12 py-3 bg-slate-50">
<wd-button type="primary" size="large" @click="handleSubmit" block>
保存
</wd-button>
</view>
</wd-form>
</view>
</template>
<script>
import { ref } from 'vue';
import yGoods from "@/components/yGoods/index.vue";
import uniDataPicker from "@/components/uni-data-picker/components/uni-data-picker/uni-data-picker.vue";
import kevyloading from "@/components/kevy-loading/kevy-loading";
import utils from '@/utils/utils.js'
import userMembers from '@/api/store/userMembers.js';
import { useApi } from "@/hooks/useApi.js"
import discountApi from '@/api/store/discount.js';
import yUpload from "@/components/yUpload/index.vue";
console.log(yGoods);
/**
* 从本地存储中获取用户信息
*/
const user_info = uni.getStorageSync("user_info");
export default {
components: {
yGoods, uniDataPicker, kevyloading, yUpload
},
data() {
return {
utils,
user_info,
//
dataForm: {
"id": 0,
},
columns: [],
loading: false
};
},
onLoad(e) {
if (e.id) {
this.getData(e.id)
// this.dataForm = JSON.parse(e.edit)
// this.dataForm.start_time = new Date(this.dataForm.start_time * 1000)
// this.dataForm.end_time = new Date(this.dataForm.end_time * 1000)
// console.log(this.dataForm);
} else {
this.dataForm.start_time = new Date()
this.dataForm.end_time = new Date()
}
for (let index = 1; index <= 100; index++) {
this.columns.push(index)
}
},
methods: {
async getData(id) {
const { fetchData } = await useApi(discountApi.SalesDiscounts.GetItem)
fetchData({ id }).then(res => {
console.log(res);
this.dataForm = res.data
this.dataForm.deatil = res.data.deatil.filter(item => item)
this.dataForm.start_time = new Date(res.data.start_time * 1000)
this.dataForm.end_time = new Date(res.data.end_time * 1000)
})
},
/**
* 处理省市区选择变化
* @param {Object} value - 选择的值
*/
areaChange(value) {
//
},
/**
* 处理省市区选择
* @param {Object} detail - 选择器详细信息
*/
select({ detail }) {
if (detail.value.length) {
const [province_id, city_id, district_id] = detail.value.map(
(el) => el.value
);
this.datadataForm.province_id = province_id;
this.datadataForm.city_id = city_id;
this.datadataForm.district_id = district_id;
this.datadataForm.district = [province_id, city_id, district_id];
}
},
/**
* 处理表单提交
*/
async handleSubmit() {
console.log(this.dataForm.deatil.map(item => [item.id]));
//
const res = await discountApi.SalesDiscounts.Create({
...this.dataForm,
start_time: utils.dateFormat(this.dataForm.start_time),
end_time: utils.dateFormat(this.dataForm.end_time),
mix_id_list: this.dataForm.deatil.map(item => [item.id])
});
if (res.code == 0) {
setTimeout(() => {
uni.showToast({
title: '保存成功!',
icon: 'success'
});
}, 100);
uni.navigateBack()
}
},
},
};
</script>
<style>
/* 在这里添加样式,根据需要自定义表单样式 */
</style>

@ -0,0 +1,247 @@
<template>
<view class="content">
<kevyloading v-if="loading" type="bsm-loader" color="#618af8" transparent></kevyloading>
<!-- <view class="w-full">
<wd-navbar fixed safeAreaInsetTop :leftText="coupon_info?.info?.name || '商城首页'">
<template #right>
<wd-icon @click="utils.toUrl('/store/setup/index')" name="setting" size="22px"></wd-icon>
</template>
</wd-navbar>
</view> -->
<view class=" bg-white sticky top-0 z-50 flex items-center">
<view class="flex-1">
<wd-search @search="search" @clear="search" v-model="params.keywords" hide-cancel>
<template #prefix>
<wd-popover v-model="popover" mode="menu" :content="menu" @menuclick="changeSearchType">
<view class="search-type">
<text>{{ searchType }}</text>
<wd-icon custom-class="icon-arrow" name="fill-arrow-down"></wd-icon>
</view>
</wd-popover>
</template>
</wd-search>
</view>
<view class="mr-2">
<wd-button @click="utils.toUrl('/store/discount/discount/edit')" size="small">新增折扣</wd-button>
</view>
<!-- <view class="mr-2">
<wd-button @click="utils.toUrl('/store/coupon/userCoupon')" size="small">领取记录</wd-button>
</view> -->
</view>
<!-- <view class="flex-1 bg-white pb-2">
<div class="rounded-md overflow-hidden">
<wd-tabs @change="search">
<wd-tab :title="`全部`" :name="null"></wd-tab>
<wd-tab :title="`领取后过期`" :name="0"></wd-tab>
<wd-tab :title="`定时过期`" :name="1"></wd-tab>
</wd-tabs>
</div>
</view> -->
<view class="grid p-2">
<yList height="91vh" ref="yListRef" :apiObj="discountApi.SalesDiscounts.List" :params="{ ...params }">
<template #default="{ list }">
<view>
<view v-for="item of list" class="goods">
<wd-card type="rectangle">
<template #title>
<view class="title">
<view>
<span class="mr-2">ID{{ item?.id }}</span>
</view>
<!-- <view @click="utils.copy(item.order_no, '已复制单号')" class="title-tip">
<span style="font-size: 24rpx;margin-left: 8px;">单号{{ item.order_no }}</span>
</view> -->
</view>
</template>
<view class="bg-gray-50 p-2 mb-2 flex justify-between" style="font-size: 22rpx;">
<view>折扣名称<text class="text-black">{{ item.name }}</text></view>
<view>折扣<text class="text-black">{{ item.discount || 0 }}</text></view>
</view>
<view class="bg-gray-50 p-2 mb-2 flex justify-between" style="font-size: 22rpx;">
<view>
时间
<wd-tag type="primary">{{ utils.dateFormat(item.start_time * 1000) }}</wd-tag> - <wd-tag>{{
utils.dateFormat(item.end_time * 1000) }}</wd-tag>
</view>
</view>
<template #footer>
<!-- <view class="bg-gray-50 p-2 mb-2.5 flex justify-between" style="font-size: 22rpx;">
<view>
售后状态:
</view>
</view> -->
<view class="flex justify-between items-center">
<!-- <view class="font-bold">实付: {{ item.pay_price }} </view> -->
<view>
<wd-button :round="false" size="small"
:type="['warning', 'success', 'warning', 'success', 'info'][item.status]">
<div>{{ ["关闭", "开启", "已取消"][item.status] }}</div>
</wd-button>
</view>
<view class="flex-1 flex justify-end">
<view class="mr-2">
<wd-button @click="utils.toUrl('/store/discount/discount/edit?id=' + item.id)"
size="small">编辑</wd-button>
</view>
<!-- <view v-if="item.apply_cancel === 1" class="mr-2">
<wd-button type="error" @click="orderApproval(item)" size="small">退款</wd-button>
</view>
<view class="mr-2">
<wd-button @click="printing(item)" size="small">小票打印</wd-button>
</view>
<view class="mr-2">
<wd-button @click="orderNotes(item)" size="small">备注</wd-button>
</view>
<view v-if="item.status == 1" class="">
<wd-button @click="shipments(item)" size="small">发货</wd-button>
</view> -->
</view>
</view>
</template>
</wd-card>
</view>
</view>
</template>
</yList>
</view>
<wd-toast />
<wd-message-box></wd-message-box>
</view>
</template>
<script setup>
import { ref, nextTick } from 'vue';
import utils from '@/utils/utils.js';
import discountApi from '@/api/store/discount.js';
import kevyloading from "@/components/kevy-loading/kevy-loading";
import yList from "/components/yList/index.vue";
import {
onShow,
} from "@dcloudio/uni-app";
const yListRef = ref(null);
const searchType = ref('折扣名称');
const popover = ref(false);
const search = () => {
if (searchType.value == '折扣名称') {
yListRef.value.upData({
name: params.value.keywords,
});
} else if (searchType.value == '折扣') {
yListRef.value.upData({
discount: params.value.keywords
});
}
};
const menu = ref([
{ content: '折扣名称' },
{ content: '折扣' },
]);
const params = ref({
name: null,
price: null,
send_type: null
});
/**
* 切换搜索类型
* @param {Object} item - 切换的项
*/
function changeSearchType({ item, index }) {
searchType.value = item.content;
search(params.value.keywords)
}
/**
* @type {Ref<boolean>}
* 控制页面加载状态的 Ref
*/
const loading = ref(false);
//
onShow(() => {
search?.()
// search('')
// getcouponList();
})
</script>
<style lang="scss" scoped>
.search-type {
position: relative;
height: 30px;
line-height: 30px;
padding: 0 8px 0 16px;
font-size: 24rpx;
color: rgba(0, 0, 0, .45);
}
.search-type::after {
position: absolute;
content: '';
width: 1px;
right: 0;
top: 5px;
bottom: 5px;
background: rgba(0, 0, 0, 0.25);
}
.search-type {
:deep(.icon-arrow) {
display: inline-block;
font-size: 20px;
vertical-align: middle;
}
}
.couponBox,
.title {
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
}
.couponBox {
justify-content: flex-start;
}
.title {
justify-content: space-between;
}
.title-tip {
color: rgba(0, 0, 0, 0.25);
font-size: 12px;
}
</style>

@ -0,0 +1,136 @@
<template>
<view>
<kevyloading v-if="loading" type="bsm-loader" color="#618af8" transparent></kevyloading>
<wd-form v-if="!loading" :model="form" :rules="rules" :disabled="mode == 'show'" ref="dialogForm" label-width="100px">
<wd-form-item label="折扣名称" prop="name">
<wd-input placeholder="请输入折扣名称" v-model="dataForm.name" clearable style="width: 100%"></wd-input>
</wd-form-item>
<wd-form-item label="满减数量" prop="full_discount">
<wd-input type="number" placeholder="请输入折扣比例" step="1" v-model.number="dataForm.full_discount" clearable
style="width: 100%"></wd-input>
</wd-form-item>
<wd-form-item label="折扣比例" prop="discount">
<wd-input type="number" placeholder="请输入折扣比例" step="1" v-model.number="dataForm.discount" clearable
style="width: 100%"></wd-input>
<div style="color: #666;font-size: 12px;">
如商品单价100折扣比例40 (4)仅需付40元
</div>
</wd-form-item>
<!-- 是否启用 -->
<wd-form-item label="是否启用:" prop="status">
<wd-switch v-model="dataForm.status" :active-value="1" :inactive-value="0"></wd-switch>
</wd-form-item>
<!-- 提交按钮 -->
<view class="mt-2 px-12 py-3 bg-slate-50">
<wd-button type="primary" size="large" @click="handleSubmit" block>
保存
</wd-button>
</view>
</wd-form>
</view>
</template>
<script>
import yGoods from "@/components/yGoods/index.vue";
import uniDataPicker from "@/components/uni-data-picker/components/uni-data-picker/uni-data-picker.vue";
import kevyloading from "@/components/kevy-loading/kevy-loading";
import utils from '@/utils/utils.js'
import { useApi } from "@/hooks/useApi.js"
import discountApi from '@/api/store/discount.js';
import yUpload from "@/components/yUpload/index.vue";
console.log(yGoods);
/**
* 从本地存储中获取用户信息
*/
const user_info = uni.getStorageSync("user_info");
export default {
components: {
yGoods, uniDataPicker, kevyloading, yUpload
},
data() {
return {
utils,
user_info,
//
dataForm: {
"id": 0,
},
columns: [],
loading: false
};
},
onLoad(e) {
if (e.id) {
this.getData(e.id)
// this.dataForm = JSON.parse(e.edit)
// this.dataForm.start_time = new Date(this.dataForm.start_time * 1000)
// this.dataForm.end_time = new Date(this.dataForm.end_time * 1000)
// console.log(this.dataForm);
} else {
}
for (let index = 1; index <= 100; index++) {
this.columns.push(index)
}
},
methods: {
async getData(id) {
const { fetchData } = await useApi(discountApi.SalesFullDiscounts.GetItem)
fetchData({ id }).then(res => {
this.dataForm = res.data
})
},
/**
* 处理省市区选择变化
* @param {Object} value - 选择的值
*/
areaChange(value) {
//
},
/**
* 处理表单提交
*/
async handleSubmit() {
//
const res = await discountApi.SalesFullDiscounts.Create({
...this.dataForm,
});
if (res.code == 0) {
setTimeout(() => {
uni.showToast({
title: '保存成功!',
icon: 'success'
});
}, 100);
uni.navigateBack()
}
},
},
};
</script>
<style>
/* 在这里添加样式,根据需要自定义表单样式 */
</style>

@ -0,0 +1,237 @@
<template>
<view class="content">
<kevyloading v-if="loading" type="bsm-loader" color="#618af8" transparent></kevyloading>
<!-- <view class="w-full">
<wd-navbar fixed safeAreaInsetTop :leftText="coupon_info?.info?.name || '商城首页'">
<template #right>
<wd-icon @click="utils.toUrl('/store/setup/index')" name="setting" size="22px"></wd-icon>
</template>
</wd-navbar>
</view> -->
<view class=" bg-white sticky top-0 z-50 flex items-center">
<view class="flex-1">
<wd-search @search="search" @clear="search" v-model="params.keywords" hide-cancel>
<template #prefix>
<wd-popover v-model="popover" mode="menu" :content="menu" @menuclick="changeSearchType">
<view class="search-type">
<text>{{ searchType }}</text>
<wd-icon custom-class="icon-arrow" name="fill-arrow-down"></wd-icon>
</view>
</wd-popover>
</template>
</wd-search>
</view>
<view class="mr-2">
<wd-button @click="utils.toUrl('/store/discount/full_discount/edit')" size="small">新增折扣</wd-button>
</view>
<!-- <view class="mr-2">
<wd-button @click="utils.toUrl('/store/coupon/userCoupon')" size="small">领取记录</wd-button>
</view> -->
</view>
<!-- <view class="flex-1 bg-white pb-2">
<div class="rounded-md overflow-hidden">
<wd-tabs @change="search">
<wd-tab :title="`全部`" :name="null"></wd-tab>
<wd-tab :title="`领取后过期`" :name="0"></wd-tab>
<wd-tab :title="`定时过期`" :name="1"></wd-tab>
</wd-tabs>
</div>
</view> -->
<view class="grid p-2">
<yList height="91vh" ref="yListRef" :apiObj="fullDiscountApi.SalesFullDiscounts.List" :params="{ ...params }">
<template #default="{ list }">
<view>
<view v-for="item of list" class="goods">
<wd-card type="rectangle">
<template #title>
<view class="title">
<view>
<span class="mr-2">ID{{ item?.id }}</span>
</view>
<!-- <view @click="utils.copy(item.order_no, '已复制单号')" class="title-tip">
<span style="font-size: 24rpx;margin-left: 8px;">单号{{ item.order_no }}</span>
</view> -->
</view>
</template>
<view class="bg-gray-50 p-2 mb-2 flex justify-between" style="font-size: 22rpx;">
<view>折扣名称<text class="text-black">{{ item.name }}</text></view>
<view>折扣<text class="text-black">{{ item.fullDiscount || 0 }}</text></view>
</view>
<template #footer>
<!-- <view class="bg-gray-50 p-2 mb-2.5 flex justify-between" style="font-size: 22rpx;">
<view>
售后状态:
</view>
</view> -->
<view class="flex justify-between items-center">
<!-- <view class="font-bold">实付: {{ item.pay_price }} </view> -->
<view>
<wd-button :round="false" size="small"
:type="['warning', 'success', 'warning', 'success', 'info'][item.status]">
<div>{{ ["关闭", "开启", "已取消"][item.status] }}</div>
</wd-button>
</view>
<view class="flex-1 flex justify-end">
<view class="mr-2">
<wd-button @click="utils.toUrl('/store/discount/full_discount/edit?id=' + item.id)"
size="small">编辑</wd-button>
</view>
<!-- <view v-if="item.apply_cancel === 1" class="mr-2">
<wd-button type="error" @click="orderApproval(item)" size="small">退款</wd-button>
</view>
<view class="mr-2">
<wd-button @click="printing(item)" size="small">小票打印</wd-button>
</view>
<view class="mr-2">
<wd-button @click="orderNotes(item)" size="small">备注</wd-button>
</view>
<view v-if="item.status == 1" class="">
<wd-button @click="shipments(item)" size="small">发货</wd-button>
</view> -->
</view>
</view>
</template>
</wd-card>
</view>
</view>
</template>
</yList>
</view>
<wd-toast />
<wd-message-box></wd-message-box>
</view>
</template>
<script setup>
import { ref, nextTick } from 'vue';
import utils from '@/utils/utils.js';
import fullDiscountApi from '@/api/store/discount.js';
import kevyloading from "@/components/kevy-loading/kevy-loading";
import yList from "/components/yList/index.vue";
import {
onShow,
} from "@dcloudio/uni-app";
const yListRef = ref(null);
const searchType = ref('折扣名称');
const popover = ref(false);
const search = () => {
if (searchType.value == '折扣名称') {
yListRef.value.upData({
name: params.value.keywords,
});
} else if (searchType.value == '折扣') {
yListRef.value.upData({
fullDiscount: params.value.keywords
});
}
};
const menu = ref([
{ content: '折扣名称' },
{ content: '折扣' },
]);
const params = ref({
name: null,
price: null,
send_type: null
});
/**
* 切换搜索类型
* @param {Object} item - 切换的项
*/
function changeSearchType({ item, index }) {
searchType.value = item.content;
search(params.value.keywords)
}
/**
* @type {Ref<boolean>}
* 控制页面加载状态的 Ref
*/
const loading = ref(false);
//
onShow(() => {
search?.()
// search('')
// getcouponList();
})
</script>
<style lang="scss" scoped>
.search-type {
position: relative;
height: 30px;
line-height: 30px;
padding: 0 8px 0 16px;
font-size: 24rpx;
color: rgba(0, 0, 0, .45);
}
.search-type::after {
position: absolute;
content: '';
width: 1px;
right: 0;
top: 5px;
bottom: 5px;
background: rgba(0, 0, 0, 0.25);
}
.search-type {
:deep(.icon-arrow) {
display: inline-block;
font-size: 20px;
vertical-align: middle;
}
}
.couponBox,
.title {
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
}
.couponBox {
justify-content: flex-start;
}
.title {
justify-content: space-between;
}
.title-tip {
color: rgba(0, 0, 0, 0.25);
font-size: 12px;
}
</style>

@ -0,0 +1,193 @@
<template>
<view>
<kevyloading v-if="loading" type="bsm-loader" color="#618af8" transparent></kevyloading>
<wd-form v-if="!loading" :model="form" :rules="rules" :disabled="mode == 'show'" ref="dialogForm" label-width="100px">
<wd-form-item label="折扣名称" prop="name">
<wd-input placeholder="请输入折扣名称" v-model="dataForm.name" clearable style="width: 100%"></wd-input>
</wd-form-item>
<wd-cell-group class="flex py-2 w-full" title="活动背景">
<view class="ml-3">
<yUpload v-model="dataForm.bg_pic" :size="1"></yUpload>
</view>
</wd-cell-group>
<wd-form-item label="活动背景颜色" prop="name">
<wd-input placeholder="请输入十六进制颜色" v-model="dataForm.bg_color" clearable style="width: 100%"></wd-input>
</wd-form-item>
<wd-form-item label="满减金额" prop="name">
<wd-input placeholder="请输入" v-model="dataForm.full_price" clearable style="width: 100%"></wd-input>
</wd-form-item>
<wd-form-item label="折扣比例" prop="discount">
<wd-input type="number" placeholder="请输入折扣比例" step="1" v-model.number="dataForm.discount" clearable
style="width: 100%"></wd-input>
<div style="color: #666;font-size: 12px;">
如商品单价100折扣比例40 (4)仅需付40元
</div>
</wd-form-item>
<wd-form-item label="选择商品">
<yGoods v-model="dataForm.deatil" :size="1"></yGoods>
</wd-form-item>
<div style="display: flex;flex-direction: column;">
<wd-datetime-picker v-model="dataForm.start_time" label="开始时间" />
<wd-datetime-picker v-model="dataForm.end_time" label="结束时间" />
</div>
<!-- 是否启用 -->
<wd-form-item label="是否启用:" prop="status">
<wd-switch v-model="dataForm.status" :active-value="1" :inactive-value="0"></wd-switch>
</wd-form-item>
<!-- 提交按钮 -->
<view class="mt-2 px-12 py-3 bg-slate-50">
<wd-button type="primary" size="large" @click="handleSubmit" block>
保存
</wd-button>
</view>
</wd-form>
</view>
</template>
<script>
import { ref } from 'vue';
import yGoods from "@/components/yGoods/index.vue";
import uniDataPicker from "@/components/uni-data-picker/components/uni-data-picker/uni-data-picker.vue";
import kevyloading from "@/components/kevy-loading/kevy-loading";
import utils from '@/utils/utils.js'
import userMembers from '@/api/store/userMembers.js';
import { useApi } from "@/hooks/useApi.js"
import discountApi from '@/api/store/discount.js';
import yUpload from "@/components/yUpload/index.vue";
console.log(yGoods);
/**
* 从本地存储中获取用户信息
*/
const user_info = uni.getStorageSync("user_info");
export default {
components: {
yGoods, uniDataPicker, kevyloading, yUpload
},
data() {
return {
utils,
user_info,
//
dataForm: {
"id": 0,
},
columns: [],
loading: false
};
},
onLoad(e) {
if (e.id) {
this.getData(e.id)
// this.dataForm = JSON.parse(e.edit)
// this.dataForm.start_time = new Date(this.dataForm.start_time * 1000)
// this.dataForm.end_time = new Date(this.dataForm.end_time * 1000)
// console.log(this.dataForm);
} else {
this.dataForm.start_time = new Date()
this.dataForm.end_time = new Date()
}
for (let index = 1; index <= 100; index++) {
this.columns.push(index)
}
},
methods: {
async getData(id) {
const { fetchData } = await useApi(discountApi.SalesFullSetRedution.GetItem)
fetchData({ id }).then(res => {
console.log(res);
this.dataForm = res.data
this.dataForm.deatil = res.data.deatil.filter(item => item)
this.dataForm.start_time = new Date(res.data.start_time * 1000)
this.dataForm.end_time = new Date(res.data.end_time * 1000)
})
},
/**
* 处理省市区选择变化
* @param {Object} value - 选择的值
*/
areaChange(value) {
//
},
/**
* 处理省市区选择
* @param {Object} detail - 选择器详细信息
*/
select({ detail }) {
if (detail.value.length) {
const [province_id, city_id, district_id] = detail.value.map(
(el) => el.value
);
this.datadataForm.province_id = province_id;
this.datadataForm.city_id = city_id;
this.datadataForm.district_id = district_id;
this.datadataForm.district = [province_id, city_id, district_id];
}
},
/**
* 处理表单提交
*/
async handleSubmit() {
console.log(this.dataForm.deatil.map(item => [item.id]));
//
const res = await discountApi.SalesFullSetRedution.Create({
...this.dataForm,
start_time: utils.dateFormat(this.dataForm.start_time),
end_time: utils.dateFormat(this.dataForm.end_time),
mix_id_list: this.dataForm.deatil.map(item => [item.id])
});
if (res.code == 0) {
setTimeout(() => {
uni.showToast({
title: '保存成功!',
icon: 'success'
});
}, 100);
uni.navigateBack()
}
},
},
};
</script>
<style>
/* 在这里添加样式,根据需要自定义表单样式 */
</style>

@ -0,0 +1,247 @@
<template>
<view class="content">
<kevyloading v-if="loading" type="bsm-loader" color="#618af8" transparent></kevyloading>
<!-- <view class="w-full">
<wd-navbar fixed safeAreaInsetTop :leftText="coupon_info?.info?.name || '商城首页'">
<template #right>
<wd-icon @click="utils.toUrl('/store/setup/index')" name="setting" size="22px"></wd-icon>
</template>
</wd-navbar>
</view> -->
<view class=" bg-white sticky top-0 z-50 flex items-center">
<view class="flex-1">
<wd-search @search="search" @clear="search" v-model="params.keywords" hide-cancel>
<template #prefix>
<wd-popover v-model="popover" mode="menu" :content="menu" @menuclick="changeSearchType">
<view class="search-type">
<text>{{ searchType }}</text>
<wd-icon custom-class="icon-arrow" name="fill-arrow-down"></wd-icon>
</view>
</wd-popover>
</template>
</wd-search>
</view>
<view class="mr-2">
<wd-button @click="utils.toUrl('/store/discount/full_set_redution/edit')" size="small">新增折扣</wd-button>
</view>
<!-- <view class="mr-2">
<wd-button @click="utils.toUrl('/store/coupon/userCoupon')" size="small">领取记录</wd-button>
</view> -->
</view>
<!-- <view class="flex-1 bg-white pb-2">
<div class="rounded-md overflow-hidden">
<wd-tabs @change="search">
<wd-tab :title="`全部`" :name="null"></wd-tab>
<wd-tab :title="`领取后过期`" :name="0"></wd-tab>
<wd-tab :title="`定时过期`" :name="1"></wd-tab>
</wd-tabs>
</div>
</view> -->
<view class="grid p-2">
<yList height="91vh" ref="yListRef" :apiObj="discountApi.SalesFullSetRedution.List" :params="{ ...params }">
<template #default="{ list }">
<view>
<view v-for="item of list" class="goods">
<wd-card type="rectangle">
<template #title>
<view class="title">
<view>
<span class="mr-2">ID{{ item?.id }}</span>
</view>
<!-- <view @click="utils.copy(item.order_no, '已复制单号')" class="title-tip">
<span style="font-size: 24rpx;margin-left: 8px;">单号{{ item.order_no }}</span>
</view> -->
</view>
</template>
<view class="bg-gray-50 p-2 mb-2 flex justify-between" style="font-size: 22rpx;">
<view>折扣名称<text class="text-black">{{ item.name }}</text></view>
<view>满减金额<text class="text-black">{{ item.full_price || 0 }}</text></view>
<view>折扣<text class="text-black">{{ item.discount || 0 }}</text></view>
</view>
<view class="bg-gray-50 p-2 mb-2 flex justify-between" style="font-size: 22rpx;">
<view>
时间
<wd-tag type="primary">{{ utils.dateFormat(item.start_time * 1000) }}</wd-tag> - <wd-tag>{{
utils.dateFormat(item.end_time * 1000) }}</wd-tag>
</view>
</view>
<template #footer>
<!-- <view class="bg-gray-50 p-2 mb-2.5 flex justify-between" style="font-size: 22rpx;">
<view>
售后状态:
</view>
</view> -->
<view class="flex justify-between items-center">
<!-- <view class="font-bold">实付: {{ item.pay_price }} </view> -->
<view>
<wd-button :round="false" size="small"
:type="['warning', 'success', 'warning', 'success', 'info'][item.status]">
<div>{{ ["关闭", "开启", "已取消"][item.status] }}</div>
</wd-button>
</view>
<view class="flex-1 flex justify-end">
<view class="mr-2">
<wd-button @click="utils.toUrl('/store/discount/full_set_redution/edit?id=' + item.id)"
size="small">编辑</wd-button>
</view>
<!-- <view v-if="item.apply_cancel === 1" class="mr-2">
<wd-button type="error" @click="orderApproval(item)" size="small">退款</wd-button>
</view>
<view class="mr-2">
<wd-button @click="printing(item)" size="small">小票打印</wd-button>
</view>
<view class="mr-2">
<wd-button @click="orderNotes(item)" size="small">备注</wd-button>
</view>
<view v-if="item.status == 1" class="">
<wd-button @click="shipments(item)" size="small">发货</wd-button>
</view> -->
</view>
</view>
</template>
</wd-card>
</view>
</view>
</template>
</yList>
</view>
<wd-toast />
<wd-message-box></wd-message-box>
</view>
</template>
<script setup>
import { ref, nextTick } from 'vue';
import utils from '@/utils/utils.js';
import discountApi from '@/api/store/discount.js';
import kevyloading from "@/components/kevy-loading/kevy-loading";
import yList from "/components/yList/index.vue";
import {
onShow,
} from "@dcloudio/uni-app";
const yListRef = ref(null);
const searchType = ref('折扣名称');
const popover = ref(false);
const search = () => {
if (searchType.value == '折扣名称') {
yListRef.value?.upData({
name: params.value.keywords,
});
} else if (searchType.value == '折扣') {
yListRef.value?.upData({
discount: params.value.keywords
});
}
};
const menu = ref([
{ content: '折扣名称' },
{ content: '折扣' },
]);
const params = ref({
name: null,
price: null,
send_type: null
});
/**
* 切换搜索类型
* @param {Object} item - 切换的项
*/
function changeSearchType({ item, index }) {
searchType.value = item.content;
search(params.value.keywords)
}
/**
* @type {Ref<boolean>}
* 控制页面加载状态的 Ref
*/
const loading = ref(false);
//
onShow(() => {
search?.()
// search('')
// getcouponList();
})
</script>
<style lang="scss" scoped>
.search-type {
position: relative;
height: 30px;
line-height: 30px;
padding: 0 8px 0 16px;
font-size: 24rpx;
color: rgba(0, 0, 0, .45);
}
.search-type::after {
position: absolute;
content: '';
width: 1px;
right: 0;
top: 5px;
bottom: 5px;
background: rgba(0, 0, 0, 0.25);
}
.search-type {
:deep(.icon-arrow) {
display: inline-block;
font-size: 20px;
vertical-align: middle;
}
}
.couponBox,
.title {
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
}
.couponBox {
justify-content: flex-start;
}
.title {
justify-content: space-between;
}
.title-tip {
color: rgba(0, 0, 0, 0.25);
font-size: 12px;
}
</style>

@ -0,0 +1,187 @@
<template>
<view class="content">
<kevyloading v-if="loading" type="bsm-loader" color="#618af8" transparent></kevyloading>
<view class="px-2 my-2">
<div class="relative flex flex-col rounded-md bg-white p-4 shadow-sm">
<div class="mb-2 pointer-events-auto relative inline-flex bg-white font-medium ">
<div class="flex items-baseline text-xs px-2">
<span class="mr-2 warn-state warn-status-processing bg-emerald-400"></span>
基础功能
</div>
</div>
<view class="grid grid-cols-3 gap-3">
<div @click="utils.toUrl('/store/cat/index')"
class="item border-2 border-solid border-gray-100 rounded bg-slate-50 p-2 flex justify-between"
style="font-size: 0.75rem;">
商品分类
</div>
<div @click="utils.toUrl('/store/goods/index')"
class="item border-2 border-solid border-gray-100 rounded bg-slate-50 p-2 flex justify-between"
style="font-size: 0.75rem;">
商品管理
</div>
</view>
</div>
</view>
<view class="px-2 my-2">
<div class="relative flex flex-col rounded-md bg-white p-4 shadow-sm">
<div class="mb-2 pointer-events-auto relative inline-flex bg-white font-medium ">
<div class="flex items-baseline text-xs px-2">
<span class="mr-2 warn-state warn-status-processing bg-yellow-600"></span>
订单管理
</div>
</div>
<view class="grid grid-cols-3 gap-3">
<div @click="utils.toUrl('/store/order/index')"
class="item border-2 border-solid border-gray-100 rounded bg-slate-50 p-2 flex justify-between"
style="font-size: 0.75rem;">
普通订单
</div>
<div @click="utils.toUrl('/store/afterSale/index')"
class="item border-2 border-solid border-gray-100 rounded bg-slate-50 p-2 flex justify-between"
style="font-size: 0.75rem;">
售后订单
</div>
<div @click="utils.toUrl('/store/inpersonPay/index')"
class="item border-2 border-solid border-gray-100 rounded bg-slate-50 p-2 flex justify-between"
style="font-size: 0.75rem;">
当面付订单
</div>
</view>
</div>
</view>
<view class="px-2 my-2">
<div class="relative flex flex-col rounded-md bg-white p-4 shadow-sm">
<div class="mb-2 pointer-events-auto relative inline-flex bg-white font-medium ">
<div class="flex items-baseline text-xs px-2">
<span class="mr-2 warn-state warn-status-processing bg-stone-800"></span>
折扣管理
</div>
</div>
<view class="grid grid-cols-2 gap-3">
<div @click="utils.toUrl('/store/discount/discount/index')"
class="item border-2 border-solid border-gray-100 rounded bg-slate-50 p-2 flex justify-between"
style="font-size: 0.75rem;">
限时折扣
</div>
<div @click="utils.toUrl('/store/discount/full_discount/index')"
class="item border-2 border-solid border-gray-100 rounded bg-slate-50 p-2 flex justify-between"
style="font-size: 0.75rem;">
梯度折扣
</div>
<div @click="utils.toUrl('/store/discount/full_set_redution/index')"
class="item border-2 border-solid border-gray-100 rounded bg-slate-50 p-2 flex justify-between"
style="font-size: 0.75rem;">
满额立减
</div>
<!-- <div class="item border-2 border-solid border-gray-100 rounded bg-slate-50 p-2 flex justify-between"
style="font-size: 0.75rem;">
套餐优惠
</div> -->
</view>
</div>
</view>
<view class="px-2 my-2">
<div class="relative flex flex-col rounded-md bg-white p-4 shadow-sm">
<div class="mb-2 pointer-events-auto relative inline-flex bg-white font-medium ">
<div class="flex items-baseline text-xs px-2">
<span class="mr-2 warn-state warn-status-processing bg-violet-700"></span>
更多功能
</div>
</div>
<view class="grid grid-cols-2 gap-3">
<div @click="utils.toUrl('/store/coupon/index')"
class="item border-2 border-solid border-gray-100 rounded bg-slate-50 p-2 flex justify-between"
style="font-size: 0.75rem;">
优惠券
</div>
<div @click="utils.toUrl('/store/check/list')"
class="item border-2 border-solid border-gray-100 rounded bg-slate-50 p-2 flex justify-between"
style="font-size: 0.75rem;">
核销记录
</div>
<div @click="utils.toUrl('/store/user/list')"
class="item border-2 border-solid border-gray-100 rounded bg-slate-50 p-2 flex justify-between"
style="font-size: 0.75rem;">
会员管理
</div>
<div @click="utils.toUrl('/store/user/memberList')"
class="item border-2 border-solid border-gray-100 rounded bg-slate-50 p-2 flex justify-between"
style="font-size: 0.75rem;">
会员等级
</div>
</view>
</div>
</view>
<view class="bg-transparent h-[80px]"></view>
<view class="fixed left-2 right-2 bottom-4 z-50">
<myTabbar tab="function"></myTabbar>
</view>
</view>
</template>
<script setup>
import { ref } from 'vue';
import utils from '@/utils/utils.js';
import index from '@/api/store/index.js';
import myTabbar from "../components/myTabbar/index.vue";
import bar from "../components/bar/bar.vue";
import kevyloading from "@/components/kevy-loading/kevy-loading";
/**
* @type {Ref<boolean>}
* 控制页面加载状态的 Ref
*/
const loading = ref(false);
/**
* 从本地存储中获取用户信息
*/
const store_info = uni.getStorageSync("store_info");
</script>
<style lang="scss" scoped>
.content {}
</style>

@ -24,7 +24,7 @@
<view @click="utils.toUrl('/store/user/list')" class="text-white rounded-3xl p-4 pb-0 shadow-lg overflow-hidden" <view @click="utils.toUrl('/store/user/list')" class="text-white rounded-3xl p-4 pb-0 shadow-lg overflow-hidden"
style="background-image: linear-gradient(to top, #7ea0ff 0%, #a9bdf5 100%);"> style="background-image: linear-gradient(to top, #7ea0ff 0%, #a9bdf5 100%);">
<view class="font-bold">用户管理</view> <view class="font-bold">会员管理</view>
<view class="h-0.5 w-5 mt-0.5 bg-white"></view> <view class="h-0.5 w-5 mt-0.5 bg-white"></view>
<view class="flex justify-end"> <view class="flex justify-end">
@ -34,31 +34,6 @@
</view> </view>
</view> </view>
<view @click="utils.toUrl('/store/user/memberList')"
class="text-white rounded-3xl p-4 pb-0 shadow-lg overflow-hidden"
style="background-image: linear-gradient(to top, #7ea0ff 0%, #a9bdf5 100%);">
<view class="font-bold">等级管理</view>
<view class="h-0.5 w-5 mt-0.5 bg-white"></view>
<view class="flex justify-end">
<div class="rotate-[-28deg] translate-y-3 translate-x-5">
<wd-icon name="layers opacity-80" class="opacity-80" size="42px"></wd-icon>
</div>
</view>
</view>
<view @click="utils.toUrl('/store/cat/index')" class="text-white rounded-3xl p-4 pb-0 shadow-lg overflow-hidden"
style="background-image: linear-gradient(to top, #7ea0ff 0%, #a9bdf5 100%);">
<view class="font-bold">分类管理</view>
<view class="h-0.5 w-5 mt-0.5 bg-white"></view>
<view class="flex justify-end">
<div class="rotate-[-28deg] translate-y-3 translate-x-5">
<wd-icon name="chat opacity-80" class="opacity-80" size="42px"></wd-icon>
</div>
</view>
</view>
<view @click="utils.toUrl('/store/goods/index')" class="text-white rounded-3xl p-4 pb-0 shadow-lg overflow-hidden" <view @click="utils.toUrl('/store/goods/index')" class="text-white rounded-3xl p-4 pb-0 shadow-lg overflow-hidden"
style="background-image: linear-gradient(to top, #7ea0ff 0%, #a9bdf5 100%);"> style="background-image: linear-gradient(to top, #7ea0ff 0%, #a9bdf5 100%);">
<view class="font-bold">商品管理</view> <view class="font-bold">商品管理</view>
@ -71,18 +46,6 @@
</view> </view>
</view> </view>
<view @click="utils.toUrl('/store/order/index')" class="text-white rounded-3xl p-4 pb-0 shadow-lg overflow-hidden"
style="background-image: linear-gradient(to top, #7ea0ff 0%, #a9bdf5 100%);">
<view class="font-bold">商城订单</view>
<view class="h-0.5 w-5 mt-0.5 bg-white"></view>
<view class="flex justify-end">
<div class="rotate-[-28deg] translate-y-3 translate-x-5">
<wd-icon name="gift opacity-80" class="opacity-80" size="42px"></wd-icon>
</div>
</view>
</view>
<view @click="utils.toUrl('/store/check/list')" class="text-white rounded-3xl p-4 pb-0 shadow-lg overflow-hidden" <view @click="utils.toUrl('/store/check/list')" class="text-white rounded-3xl p-4 pb-0 shadow-lg overflow-hidden"
style="background-image: linear-gradient(to top, #7ea0ff 0%, #a9bdf5 100%);"> style="background-image: linear-gradient(to top, #7ea0ff 0%, #a9bdf5 100%);">
<view class="font-bold">核销记录</view> <view class="font-bold">核销记录</view>
@ -90,51 +53,14 @@
<view class="flex justify-end"> <view class="flex justify-end">
<div class="rotate-[-28deg] translate-y-3 translate-x-5"> <div class="rotate-[-28deg] translate-y-3 translate-x-5">
<wd-icon name="phone" class="opacity-80" size="42px"></wd-icon> <wd-icon name="lenovo opacity-80" class="opacity-80" size="42px"></wd-icon>
</div> </div>
</view> </view>
</view> </view>
<view @click="utils.toUrl('/store/inpersonPay/index')"
class="text-white rounded-3xl p-4 pb-0 shadow-lg overflow-hidden"
style="background-image: linear-gradient(to top, #7ea0ff 0%, #a9bdf5 100%);">
<view class="font-bold">当面付</view>
<view class="h-0.5 w-5 mt-0.5 bg-white"></view>
<view class="flex justify-end">
<div class="rotate-[-28deg] translate-y-3 translate-x-5">
<wd-icon name="phone" class="opacity-80" size="42px"></wd-icon>
</div>
</view>
</view>
<view @click="utils.toUrl('/store/coupon/index')" class="text-white rounded-3xl p-4 pb-0 shadow-lg overflow-hidden"
style="background-image: linear-gradient(to top, #7ea0ff 0%, #a9bdf5 100%);">
<view class="font-bold">优惠券</view>
<view class="h-0.5 w-5 mt-0.5 bg-white"></view>
<view class="flex justify-end">
<div class="rotate-[-28deg] translate-y-3 translate-x-5">
<wd-icon name="phone" class="opacity-80" size="42px"></wd-icon>
</div>
</view>
</view>
<!-- <view @click="utils.toUrl('/store/order/index')" class="text-white rounded-3xl p-4 pb-0 shadow-lg overflow-hidden"
style="background-image: linear-gradient(to top, #7ea0ff 0%, #a9bdf5 100%);">
<view class="font-bold">订单管理</view>
<view class="h-0.5 w-5 mt-0.5 bg-white"></view>
<view class="flex justify-end">
<div class="rotate-[-28deg] translate-y-3 translate-x-5">
<wd-icon name="gift opacity-80" size="42px"></wd-icon>
</div>
</view>
</view> -->
</view> </view>
<view style="transition: 1s;" class="w-full h-full bg-white pt-4 rounded-tr-3xl rounded-tl-3xl shadow-lg oh"> <view style="transition: 1s;" class="w-full h-full bg-white pt-2 rounded-tr-2xl rounded-tl-2xl shadow-lg oh">
<view class="order mb-2"> <view class="order mb-2">
<wd-grid v-show="oneLine.ok"> <wd-grid v-show="oneLine.ok">
<wd-grid-item @click="utils.toUrl('/store/user/list')" icon="round" :text="`用户 (${oneLine.user_count})`" /> <wd-grid-item @click="utils.toUrl('/store/user/list')" icon="round" :text="`用户 (${oneLine.user_count})`" />

@ -0,0 +1,121 @@
<template>
<view>
<kevyloading v-if="loading" type="bsm-loader" color="#618af8" transparent></kevyloading>
<wd-form ref="form" :model="formData" :rules="formRules">
<!-- 基础信息 -->
<wd-cell-group title="充值方案" border>
<wd-input label="充值名称" v-model="formData.name" />
<wd-cell-group title="支付金额" border>
<view class="p-4">
<wd-input-number v-model="formData.money" min="0" />
</view>
</wd-cell-group>
<wd-cell-group title="赠送金额" border>
<view class="p-4">
<wd-input-number v-model="formData.gift_money" min="0" />
</view>
</wd-cell-group>
</wd-cell-group>
<!-- 提交按钮 -->
<view class="mt-2 px-12 py-3 bg-slate-50">
<wd-button type="primary" size="large" @click="handleSubmit" block>
保存
</wd-button>
</view>
</wd-form>
</view>
</template>
<script>
import kevyloading from "@/components/kevy-loading/kevy-loading";
import utils from '@/utils/utils.js'
import rechargeApi from '@/api/store/recharge.js'
export default {
components: {
kevyloading
},
data() {
return {
utils,
//
formData: {
"name": "", //
"money": "", //
"gift_money": "", //
},
//
formRules: {
//
},
//
addrList: [
//
],
classifyList: [],
loading: false
};
},
async onLoad(e) {
// this.getDistrict();
if (e.edit) {
this.formData = JSON.parse(e.edit)
}
// this.formData = JSON.parse(e.edit)
},
methods: {
/**
* 处理表单提交
*/
async handleSubmit() {
console.log(this.formData);
try {
//
const res = await rechargeApi.save({
...this.formData,
});
if (res.code == 0) {
setTimeout(() => {
uni.showToast({
title: '保存成功!',
icon: 'success'
});
}, 100);
uni.navigateBack()
} else {
uni.showToast({
title: res.msg,
icon: 'none'
});
}
} catch (error) {
console.log(error);
setTimeout(() => {
uni.showToast({
title: '请检查表单!',
icon: 'none'
});
}, 100);
}
},
},
};
</script>
<style>
/* 在这里添加样式,根据需要自定义表单样式 */
</style>

@ -0,0 +1,252 @@
<template>
<view class="content">
<kevyloading v-if="loading" type="bsm-loader" color="#618af8" transparent></kevyloading>
<view class="justify-center sticky top-0 z-50 grid items-center py-3 w-full gap-3 grid-cols-3">
<view @click="utils.toUrl('/store/recharge/edit')"
class="text-white rounded-r-3xl p-4 px-3 shadow-lg overflow-hidden"
style="background-image: linear-gradient(to left, #b5b5b5 0%, rgb(110, 114, 125) 100%);">
<view class="font-bold"> 添加充值方案 </view>
</view>
<view @click="utils.toUrl('/store/recharge/userRecharge')"
class="text-white rounded-3xl p-4 shadow-lg overflow-hidden text-center"
style="background-image: linear-gradient(to top, #b5b5b5 0%, rgb(110, 114, 125) 100%);">
<view class="font-bold"> 充值记录 </view>
</view>
<view @click="utils.toUrl('/store/recharge/setUp')"
class="text-center text-white rounded-l-3xl p-4 shadow-lg overflow-hidden"
style="background-image: linear-gradient(to top, #b5b5b5 0%, rgb(110, 114, 125) 100%);">
<view class="font-bold"> 设置 </view>
</view>
</view>
<!-- <view class="flex-1 bg-white pb-2">
<div class="rounded-md overflow-hidden">
<wd-tabs @change="search">
<wd-tab :title="`全部`" :name="null"></wd-tab>
<wd-tab :title="`领取后过期`" :name="0"></wd-tab>
<wd-tab :title="`定时过期`" :name="1"></wd-tab>
</wd-tabs>
</div>
</view> -->
<view class="grid p-2">
<yList height="91vh" ref="yListRef" noPageSize :apiObj="recharge.List" :params="{ ...params }">
<template #default="{ list: rechargeList }">
<view class="flex flex-col">
<view v-for="recharge of rechargeList" class="overflow-hidden relative">
<wd-swipe-action class="rounded-xl overflow-hidden mb-3 ">
<view class="rechargeCart relative"
style="background-image: linear-gradient(to bottom, #b5b5b5 0%, rgb(110, 114, 125) 100%);">
<view class="relative px-4 py-4" style="z-index: 1;">
<view
class="rounded-r-xl font-bold absolute top-0 left-0 px-3 py-1 text-[12px] bg-neutral-900 text-orange-500 z-30">
ID: {{ recharge.id }}
</view>
<view class="flex">
<view class="mt-4 mr-6">
<!-- <view class="price text-[16px] text-orange-300">
</view> -->
<view class="leading-4 mt-1">
<view class="price mb-1 text-[14px] text-orange-300">
{{ recharge.name }}
</view>
<div class="flex flex-col">
<view class="price text-white text-[12px] mr-4">
支付金额 {{ recharge.money }}
</view>
<view class="price text-white text-[12px]">
赠送金额 {{ recharge.gift_money }}
</view>
</div>
</view>
</view>
</view>
</view>
</view>
<template #right>
<view class="flex h-full ">
<view class="px-4 text-nowrap h-full bg-stone-700 text-white flex items-center justify-center">
<view @click="utils.toUrl('/store/recharge/edit?edit=' + JSON.stringify(recharge))" style="writing-mode: vertical-rl;
text-orientation: upright;">
编辑
</view>
</view>
<view class="px-4 text-nowrap h-full bg-stone-800 text-white flex items-center justify-center">
<view @click="utils.toUrl('/store/recharge/edit?id=' + recharge.id)" style="writing-mode: vertical-rl;
text-orientation: upright;">
删除
</view>
</view>
</view>
</template>
</wd-swipe-action>
</view>
</view>
</template>
</yList>
</view>
<wd-toast />
<wd-message-box></wd-message-box>
</view>
</template>
<script setup>
import { ref, nextTick } from 'vue';
import utils from '@/utils/utils.js';
import recharge from '@/api/store/recharge.js';
import kevyloading from "@/components/kevy-loading/kevy-loading";
import { useMessage } from '@/uni_modules/wot-design-uni';
import { useToast } from '@/uni_modules/wot-design-uni'
import yList from "/components/yList/index.vue";
import {
onShow,
} from "@dcloudio/uni-app";
const yListRef = ref(null);
const searchType = ref('券名');
const popover = ref(false);
const search = ({ value } = {}) => {
if (searchType.value == '券名') {
yListRef.value.upData({
name: params.value.keywords,
});
} else if (searchType.value == '券金额') {
yListRef.value.upData({
price: params.value.keywords
});
} else {
yListRef.value.upData({});
}
};
const menu = ref([
{ content: '券名' },
{ content: '券金额' },
]);
const params = ref({
name: null,
price: null,
send_type: null
});
/**
* 切换搜索类型
* @param {Object} item - 切换的项
*/
function changeSearchType({ item, index }) {
searchType.value = item.content;
search(params.value.keywords)
}
/**
* @type {Ref<boolean>}
* 控制页面加载状态的 Ref
*/
const loading = ref(false);
const formatOfTime = (theTimeStamp) => {
const date = new Date(theTimeStamp * 1000); //
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
return `${year}-${month}-${day} ${hours}`;
}
//
onShow(() => {
nextTick(() => {
search({ value: params.value.keywords = '' })
})
// search('')
// getrechargeList();
})
</script>
<style lang="scss" scoped>
.search-type {
position: relative;
height: 30px;
line-height: 30px;
padding: 0 8px 0 16px;
font-size: 24rpx;
color: rgba(0, 0, 0, .45);
}
.search-type::after {
position: absolute;
content: '';
width: 1px;
right: 0;
top: 5px;
bottom: 5px;
background: rgba(0, 0, 0, 0.25);
}
.search-type {
:deep(.icon-arrow) {
display: inline-block;
font-size: 20px;
vertical-align: middle;
}
}
.rechargeBox,
.title {
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
}
.rechargeBox {
justify-content: flex-start;
}
.title {
justify-content: space-between;
}
.title-tip {
color: rgba(0, 0, 0, 0.25);
font-size: 12px;
}
</style>

@ -0,0 +1,137 @@
<template>
<view>
<kevyloading v-if="loading" type="bsm-loader" color="#618af8" transparent></kevyloading>
<wd-form ref="form" :model="formData" :rules="formRules">
<view class="p-3 bg-white rounded mb-2">
<div class="name mb-2 text-xs">开启自定义金额</div>
<view class="bg-white px-3 py-2 rounded flex items-center">
<wd-switch v-model="formData.status" :active-value="1" :inactive-value="0" />
</view>
</view>
<div class="mb-2">
<!-- 广告图片 -->
<wd-cell-group class="flex py-2 w-full" title="广告图片">
<view class="ml-3">
<yUpload v-model="formData.adv_img" :size="1"></yUpload>
</view>
</wd-cell-group>
<!-- 充值说明图标 -->
<wd-cell-group class="flex py-2 w-full" title="充值说明图标">
<view class="ml-3">
<yUpload v-model="formData.icon" :size="1"></yUpload>
</view>
</wd-cell-group>
</div>
<!-- 基础信息 -->
<wd-cell-group title="基础信息" border>
<wd-input label="充值说明" v-model="formData.tip" />
</wd-cell-group>
<!-- 提交按钮 -->
<view class="mt-2 px-12 py-3 bg-slate-50">
<wd-button type="primary" size="large" @click="handleSubmit" block>
保存
</wd-button>
</view>
</wd-form>
</view>
</template>
<script>
import kevyloading from "@/components/kevy-loading/kevy-loading";
import utils from '@/utils/utils.js'
import rechargeApi from '@/api/store/recharge.js'
import yUpload from "@/components/yUpload/index.vue";
export default {
components: {
kevyloading, yUpload
},
data() {
return {
utils,
//
formData: {
"adv_url": "", //
},
//
formRules: {
//
},
//
addrList: [
//
],
classifyList: [],
loading: false
};
},
async onLoad(e) {
this.getData();
if (e.edit) {
this.formData = JSON.parse(e.edit)
}
},
methods: {
async getData() {
const res = await rechargeApi.rechargeSet.list({
...this.formData,
});
this.formData = res.data || {}
},
/**
* 处理表单提交
*/
async handleSubmit() {
console.log(this.formData);
try {
//
const res = await rechargeApi.rechargeSet.save({
...this.formData,
});
if (res.code == 0) {
setTimeout(() => {
uni.showToast({
title: '保存成功!',
icon: 'success'
});
}, 100);
// uni.navigateBack()
} else {
uni.showToast({
title: res.msg,
icon: 'none'
});
}
} catch (error) {
console.log(error);
setTimeout(() => {
uni.showToast({
title: '请检查表单!',
icon: 'none'
});
}, 100);
}
},
},
};
</script>
<style>
/* 在这里添加样式,根据需要自定义表单样式 */
</style>

@ -0,0 +1,162 @@
<template>
<view class="content">
<view class="goodsBox p-2">
<yList ref="yListRef" :apiObj="rechargeApi.recharge_list" :params="{ ...params }">
<template #default="{ list }">
<view>
<view v-for="item of list" class="goods">
<wd-card type="rectangle">
<template #title>
<view class="title">
<view>
<view>ID<text class="text-black">{{ item.id || 0 }}</text></view>
</view>
<view class="title-tip">
<span style="font-size: 24rpx;margin-left: 8px;">订单号{{ item.order_no }}</span>
</view>
</view>
</template>
<view class="bg-gray-50 p-2 mb-2 flex justify-between" style="font-size: 22rpx;">
<view>充值用户<text class="text-black">{{ item?.user?.nickname }}</text></view>
<view>充值时间<text class="text-black">{{ item?.create_time }}</text></view>
</view>
<template #footer>
<!-- <view class="bg-gray-50 p-2 mb-2.5 flex justify-between" style="font-size: 22rpx;">
<view>
售后状态:
</view>
</view> -->
<view class="flex w-full">
<view class="bg-gray-50 p-2 mb-2 flex flex-1 justify-between" style="font-size: 22rpx;">
<view>支付金额<text class="text-red-600"> {{ item.pay_price || 0 }}</text></view>
<view>赠送金额<text class="text-red-600"> {{ item.gift_money || 0 }}</text></view>
</view>
</view>
</template>
</wd-card>
</view>
</view>
</template>
</yList>
</view>
<wd-toast />
</view>
</template>
<script setup>
import rechargeApi from '@/api/store/recharge.js';
import yList from "/components/yList/index.vue";
import { useMessage } from '@/uni_modules/wot-design-uni';
import { useToast } from '@/uni_modules/wot-design-uni';
import { ref } from 'vue';
const params = ref({
keywords: "",
coupon_type: 0,
});
const yListRef = ref(null);
const search = ({ value }) => {
yListRef.value.upData({
keywords: value,
coupon_type: params.value.coupon_type
});
};
const searchType = ref('券名');
const popover = ref(false);
const status = ref([
{ content: '全部' },
{ content: '商品' },
{ content: '分类' },
{ content: '当面付' },
]);
const menu = ref([
{ content: '券名' },
{ content: '券金额' },
]);
/**
* 切换搜索类型
* @param {Object} item - 切换的项
*/
function changeSearchType({ item, index }) {
if (searchType.value == '券名') {
yListRef.value.upData({
name: params.value.keywords,
});
} else if (searchType.value == '券金额') {
yListRef.value.upData({
price: params.value.keywords
});
} else {
yListRef.value.upData({});
}
}
</script>
<style lang="scss" scoped>
.search-type {
position: relative;
height: 30px;
line-height: 30px;
padding: 0 8px 0 10px;
font-size: 22rpx;
color: rgba(0, 0, 0, .45);
}
.search-type::after {
position: absolute;
content: '';
width: 1px;
right: 0;
top: 5px;
bottom: 5px;
background: rgba(0, 0, 0, 0.25);
}
.search-type {
:deep(.icon-arrow) {
display: inline-block;
font-size: 20px;
vertical-align: middle;
}
}
.goodsBox {
.content,
.title {
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
}
.content {
justify-content: flex-start;
}
.title {
justify-content: space-between;
}
.title-tip {
color: rgba(0, 0, 0, 0.25);
font-size: 12px;
}
}
</style>

@ -95,10 +95,10 @@
</div> </div>
<view class="h-[64px]"></view> <!-- <view class="h-[64px]"></view>
<view class="fixed left-2 right-2 bottom-4 z-50"> <view class="fixed left-2 right-2 bottom-4 z-50">
<myTabbar tab="user"></myTabbar> <myTabbar tab="user"></myTabbar>
</view> </view> -->
<wd-toast /> <wd-toast />
<wd-message-box></wd-message-box> <wd-message-box></wd-message-box>

Loading…
Cancel
Save