Commit 2e68a523 by owen

Merge remote-tracking branch 'origin/dev' into member_dev

# Conflicts:
#	src/views/member/user/UserForm.vue
parents e9120f06 55772cbb
...@@ -7,18 +7,20 @@ export interface BargainActivityVO { ...@@ -7,18 +7,20 @@ export interface BargainActivityVO {
startTime?: Date startTime?: Date
endTime?: Date endTime?: Date
status?: number status?: number
spuId?: number
userSize?: number // 达到该人数,才能砍到低价 userSize?: number // 达到该人数,才能砍到低价
bargainCount?: number // 最大帮砍次数 bargainCount?: number // 最大帮砍次数
totalLimitCount?: number // 最大购买次数 totalLimitCount?: number // 最大购买次数
stock?: number // 活动总库存 spuId: number
skuId: number
bargainFirstPrice: number // 砍价起始价格,单位分
bargainPrice: number // 砍价底价
stock: number // 活动库存
randomMinPrice?: number // 用户每次砍价的最小金额,单位:分 randomMinPrice?: number // 用户每次砍价的最小金额,单位:分
randomMaxPrice?: number // 用户每次砍价的最大金额,单位:分 randomMaxPrice?: number // 用户每次砍价的最大金额,单位:分
successCount?: number // 砍价成功数量 successCount?: number // 砍价成功数量
products?: BargainProductVO[]
} }
// 砍价活动所需属性 // 砍价活动所需属性。选择的商品和属性的时候使用方便使用活动的通用封装
export interface BargainProductVO { export interface BargainProductVO {
spuId: number spuId: number
skuId: number skuId: number
......
...@@ -19,6 +19,11 @@ export const getDeliveryExpress = async (id: number) => { ...@@ -19,6 +19,11 @@ export const getDeliveryExpress = async (id: number) => {
return await request.get({ url: '/trade/delivery/express/get?id=' + id }) return await request.get({ url: '/trade/delivery/express/get?id=' + id })
} }
// 获得快递公司精简信息列表
export const getSimpleDeliveryExpressList = () => {
return request.get({ url: '/trade/delivery/express/list-all-simple' })
}
// 新增快递公司 // 新增快递公司
export const createDeliveryExpress = async (data: DeliveryExpressVO) => { export const createDeliveryExpress = async (data: DeliveryExpressVO) => {
return await request.post({ url: '/trade/delivery/express/create', data }) return await request.post({ url: '/trade/delivery/express/create', data })
......
...@@ -16,7 +16,7 @@ export interface DeliveryPickUpStoreVO { ...@@ -16,7 +16,7 @@ export interface DeliveryPickUpStoreVO {
} }
// 查询自提门店列表 // 查询自提门店列表
export const getDeliveryPickUpStorePage = async (params: DeliveryPickUpStorePageReqVO) => { export const getDeliveryPickUpStorePage = async (params) => {
return await request.get({ url: '/trade/delivery/pick-up-store/page', params }) return await request.get({ url: '/trade/delivery/pick-up-store/page', params })
} }
...@@ -25,6 +25,11 @@ export const getDeliveryPickUpStore = async (id: number) => { ...@@ -25,6 +25,11 @@ export const getDeliveryPickUpStore = async (id: number) => {
return await request.get({ url: '/trade/delivery/pick-up-store/get?id=' + id }) return await request.get({ url: '/trade/delivery/pick-up-store/get?id=' + id })
} }
// 查询自提门店精简列表
export const getListAllSimple = async () => {
return await request.get({ url: '/trade/delivery/pick-up-store/list-all-simple' })
}
// 新增自提门店 // 新增自提门店
export const createDeliveryPickUpStore = async (data: DeliveryPickUpStoreVO) => { export const createDeliveryPickUpStore = async (data: DeliveryPickUpStoreVO) => {
return await request.post({ url: '/trade/delivery/pick-up-store/create', data }) return await request.post({ url: '/trade/delivery/pick-up-store/create', data })
...@@ -39,8 +44,3 @@ export const updateDeliveryPickUpStore = async (data: DeliveryPickUpStoreVO) => ...@@ -39,8 +44,3 @@ export const updateDeliveryPickUpStore = async (data: DeliveryPickUpStoreVO) =>
export const deleteDeliveryPickUpStore = async (id: number) => { export const deleteDeliveryPickUpStore = async (id: number) => {
return await request.delete({ url: '/trade/delivery/pick-up-store/delete?id=' + id }) return await request.delete({ url: '/trade/delivery/pick-up-store/delete?id=' + id })
} }
// 导出自提门店 Excel
export const exportDeliveryPickUpStoreApi = async (params) => {
return await request.download({ url: '/trade/delivery/pick-up-store/export-excel', params })
}
import request from '@/config/axios' import request from '@/config/axios'
// 获得交易订单分页 export interface OrderVO {
// TODO @xiaobai:改成 getOrderPage id?: number | null // 订单编号
export const getOrderList = (params: PageParam) => { no?: string // 订单流水号
return request.get({ url: '/trade/order/page', params }) createTime?: Date | null // 下单时间
} type?: number | null // 订单类型
terminal?: number | null // 订单来源
// 获得交易订单详情 userId?: number | null // 用户编号
export const getOrderDetail = (id: number) => { userIp?: string // 用户 IP
return request.get({ url: '/trade/order/get-detail?id=' + id }) userRemark?: string // 用户备注
} status?: number | null // 订单状态
productCount?: number | null // 购买的商品数量
finishTime?: Date | null // 订单完成时间
cancelTime?: Date | null // 订单取消时间
cancelType?: number | null // 取消类型
remark?: string // 商家备注
payOrderId: number | null // 支付订单编号
payed?: boolean // 是否已支付
payTime?: Date | null // 付款时间
payChannelCode?: string // 支付渠道
originalPrice?: number | null // 商品原价(总)
orderPrice?: number | null // 订单原价(总)
discountPrice?: number | null // 订单优惠(总)
deliveryPrice?: number | null // 运费金额
adjustPrice?: number | null // 订单调价(总)
payPrice?: number | null // 应付金额(总)
deliveryType?: number | null // 发货方式
deliveryTemplateId?: number | null // 配送模板编号
logisticsId?: number | null | null // 发货物流公司编号
logisticsNo?: string // 发货物流单号
deliveryStatus?: number | null // 发货状态
deliveryTime?: Date | null // 发货时间
receiveTime?: Date | null // 收货时间
receiverName?: string // 收件人名称
receiverMobile?: string // 收件人手机
receiverAreaId?: number | null // 收件人地区编号
receiverPostCode?: number | null // 收件人邮编
receiverDetailAddress?: string // 收件人详细地址
afterSaleStatus?: number | null // 售后状态
refundPrice?: number | null // 退款金额
couponId?: number | null // 优惠劵编号
couponPrice?: number | null // 优惠劵减免金额
pointPrice?: number | null // 积分抵扣的金额
receiverAreaName?: string //收件人地区名字
items?: OrderItemRespVO[] // 订单项列表
//用户信息
user?: {
id?: number | null
nickname?: string
avatar?: string
}
}
export interface OrderItemRespVO {
// ========== 订单项基本信息 ==========
id?: number | null // 编号
userId?: number | null // 用户编号
orderId?: number | null // 订单编号
// ========== 商品基本信息 ==========
spuId?: number | null // 商品 SPU 编号
spuName?: string //商品 SPU 名称
skuId?: number | null // 商品 SKU 编号
picUrl?: string //商品图片
count?: number | null //购买数量
// ========== 价格 + 支付基本信息 ==========
originalPrice?: number | null //商品原价(总)
originalUnitPrice?: number | null //商品原价(单)
discountPrice?: number | null //商品优惠(总)
payPrice?: number | null //商品实付金额(总)
orderPartPrice?: number | null //子订单分摊金额(总)
orderDividePrice?: number | null //分摊后子订单实付金额(总)
// ========== 营销基本信息 ==========
// TODO 芋艿:在捉摸一下
// ========== 售后基本信息 ==========
afterSaleStatus?: number | null // 售后状态
properties?: ProductPropertiesVO[] //属性数组
}
export interface ProductPropertiesVO {
propertyId?: number | null // 属性的编号
propertyName?: string // 属性的名称
valueId?: number | null //属性值的编号
valueName?: string // 属性值的名称
}
// 查询交易订单列表
export const getOrderPage = async (params) => {
return await request.get({ url: `/trade/order/page`, params })
}
// 查询交易订单详情
export const getOrder = async (id: number | null) => {
return await request.get({ url: `/trade/order/get-detail?id=` + id })
}
export interface DeliveryVO {
id: number // 订单编号
logisticsId: number | null // 物流公司编号
logisticsNo: string // 物流编号
}
// 订单发货
export const delivery = async (data: DeliveryVO) => {
return await request.post({ url: `/trade/order/delivery`, data })
}
// 订单备注
export const remark = async (data) => {
return await request.post({ url: `/trade/order/remark`, data })
}
// 订单调价
export const adjustPrice = async (data) => {
return await request.post({ url: `/trade/order/adjust-price`, data })
}
// 修改订单地址
export const adjustAddress = async (data) => {
return await request.post({ url: `/trade/order/adjust-address`, data })
}
// TODO @xiaobai:这个放到 order/index.ts 里哈
// TODO @xiaobai:注释放到变量后面,这样简洁一点
// TODO @xiaobai:这个改成 TradeOrderRespVO
export interface TradeOrderPageItemRespVO {
// 订单编号
id?: number
// 订单流水号
no?: string
// 下单时间
createTime?: Date
// 订单类型
type?: number
// 订单来源
terminal?: number
// 用户编号
userId?: number
// 用户 IP
userIp?: string
// 用户备注
userRemark?: string
// 订单状态
status?: number
// 购买的商品数量
productCount?: number
// 订单完成时间
finishTime?: Date
// 订单取消时间
cancelTime?: Date
// 取消类型
cancelType?: number
// 商家备注
remark?: string
// 支付订单编号
payOrderId: number
// 是否已支付
payed?: boolean
// 付款时间
payTime?: Date
// 支付渠道
payChannelCode?: string
// 商品原价(总)
originalPrice?: number
// 订单原价(总)
orderPrice?: number
// 订单优惠(总)
discountPrice?: number
// 运费金额
deliveryPrice?: number
// 订单调价(总)
adjustPrice?: number
// 应付金额(总)
payPrice?: number
// 配送模板编号
deliveryTemplateId?: number
// 发货物流公司编号
logisticsId?: number
// 发货物流单号
logisticsNo?: string
// 发货状态
deliveryStatus?: number
// 发货时间
deliveryTime?: Date
// 收货时间
receiveTime?: Date
// 收件人名称
receiverName?: string
// 收件人手机
receiverMobile?: string
// 收件人地区编号
receiverAreaId?: number
// 收件人邮编
receiverPostCode?: number
// 收件人详细地址
receiverDetailAddress?: string
// 售后状态
afterSaleStatus?: number
// 退款金额
refundPrice?: number
// 优惠劵编号
couponId?: number
// 优惠劵减免金额
couponPrice?: number
// 积分抵扣的金额
pointPrice?: number
//收件人地区名字
receiverAreaName?: string
// 订单项列表
items?: TradeOrderItemBaseVO[]
//用户信息
user?: MemberUserRespDTO
}
// TODO @xiaobai:这个改成 TradeOrderItemRespVO
/**
* 交易订单项 Base VO,提供给添加、修改、详细的子 VO 使用
* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
*/
export interface TradeOrderItemBaseVO {
// ========== 订单项基本信息 ==========
/**
* 编号
*/
id?: number
/**
* 用户编号
*/
userId?: number
/**
* 订单编号
*/
orderId?: number
// ========== 商品基本信息 ==========
/**
* 商品 SPU 编号
*/
spuId?: number
/**
* 商品 SPU 名称
*/
spuName?: string
/**
* 商品 SKU 编号
*/
skuId?: number
/**
* 商品图片
*/
picUrl?: string
/**
* 购买数量
*/
count?: number
// ========== 价格 + 支付基本信息 ==========
/**
* 商品原价(总)
*/
originalPrice?: number
/**
* 商品原价(单)
*/
originalUnitPrice?: number
/**
* 商品优惠(总)
*/
discountPrice?: number
/**
* 商品实付金额(总)
*/
payPrice?: number
/**
* 子订单分摊金额(总)
*/
orderPartPrice?: number
/**
* 分摊后子订单实付金额(总)
*/
orderDividePrice?: number
// ========== 营销基本信息 ==========
// TODO 芋艿:在捉摸一下
// ========== 售后基本信息 ==========
/**
* 售后状态
*/
afterSaleStatus?: number
//属性数组
properties?: ProductPropertyValueDetailRespVO[]
}
/**
* 管理后台 - 商品属性值的明细 Response VO
*/
export interface ProductPropertyValueDetailRespVO {
/**
* 属性的编号
*/
propertyId?: number
/**
* 属性的名称
*/
propertyName?: string
/**
* 属性值的编号
*/
valueId?: number
/**
* 属性值的名称
*/
valueName?: string
}
/**
* 订单详情查询 请求
*/
export interface TradeOrderPageReqVO {
pageNo: number
pageSize: number
no?: string
userId?: string
userNickname?: string
userMobile?: string
receiverName?: string
receiverMobile?: string
terminal?: string
type?: number
status?: number
payChannelCode?: string
createTime?: [Date, Date]
spuName?: string
itemCount?: string
all?: string
}
//用户信息
export interface MemberUserRespDTO {
id?: number
nickname?: string
status?: number
avatar?: string
mobile?: string
}
//订单详情选中type
export interface SelectType {
queryParams: TradeOrderPageReqVO
selectTotal: number //选中的数量
selectAllFlag: boolean //全选标识
selectData: Map<number, Set<string>> //存放涉及选中得页面以及每页选中得数据订单号 全选时根据条件查询 排除取消的list订单
unSelectList: Set<string> //登记取消的list 全选标识为true 时登记单独取消的list,再次选中时排除, 全选标识为false 时清空list
}
...@@ -5,7 +5,7 @@ export interface LevelVO { ...@@ -5,7 +5,7 @@ export interface LevelVO {
name: string name: string
experience: number experience: number
value: number value: number
discount: number discountPercent: number
icon: string icon: string
bgUrl: string bgUrl: string
status: number status: number
......
...@@ -8,10 +8,7 @@ export interface RecordVO { ...@@ -8,10 +8,7 @@ export interface RecordVO {
description: string description: string
point: number point: number
totalPoint: number totalPoint: number
status: number
userId: number userId: number
freezingTime: Date
thawingTime: Date
createDate: Date createDate: Date
} }
......
...@@ -8,26 +8,26 @@ export interface SignInConfigVO { ...@@ -8,26 +8,26 @@ export interface SignInConfigVO {
} }
// 查询积分签到规则列表 // 查询积分签到规则列表
export const getSignInConfigPage = async () => { export const getSignInConfigList = async () => {
return await request.get({ url: `/member/point/sign-in-config/list` }) return await request.get({ url: `/member/sign-in/config/list` })
} }
// 查询积分签到规则详情 // 查询积分签到规则详情
export const getSignInConfig = async (id: number) => { export const getSignInConfig = async (id: number) => {
return await request.get({ url: `/member/point/sign-in-config/get?id=` + id }) return await request.get({ url: `/member/sign-in/config/get?id=` + id })
} }
// 新增积分签到规则 // 新增积分签到规则
export const createSignInConfig = async (data: SignInConfigVO) => { export const createSignInConfig = async (data: SignInConfigVO) => {
return await request.post({ url: `/member/point/sign-in-config/create`, data }) return await request.post({ url: `/member/sign-in/config/create`, data })
} }
// 修改积分签到规则 // 修改积分签到规则
export const updateSignInConfig = async (data: SignInConfigVO) => { export const updateSignInConfig = async (data: SignInConfigVO) => {
return await request.put({ url: `/member/point/sign-in-config/update`, data }) return await request.put({ url: `/member/sign-in/config/update`, data })
} }
// 删除积分签到规则 // 删除积分签到规则
export const deleteSignInConfig = async (id: number) => { export const deleteSignInConfig = async (id: number) => {
return await request.delete({ url: `/member/point/sign-in-config/delete?id=` + id }) return await request.delete({ url: `/member/sign-in/config/delete?id=` + id })
} }
...@@ -9,10 +9,5 @@ export interface SignInRecordVO { ...@@ -9,10 +9,5 @@ export interface SignInRecordVO {
// 查询用户签到积分列表 // 查询用户签到积分列表
export const getSignInRecordPage = async (params) => { export const getSignInRecordPage = async (params) => {
return await request.get({ url: `/member/point/sign-in-record/page`, params }) return await request.get({ url: `/member/sign-in/record/page`, params })
}
// 导出用户签到积分 Excel
export const exportSignInRecord = async (params) => {
return await request.download({ url: `/member/point/sign-in-record/export-excel`, params })
} }
...@@ -18,6 +18,25 @@ export interface UserVO { ...@@ -18,6 +18,25 @@ export interface UserVO {
createTime: Date createTime: Date
} }
// TODO @梦:和 UserVO 搞成一个把。
export interface UserBaseInfoVO {
id: number | undefined | null
mobile: string
password: string | null | undefined
status: number
registerIp: string | null | undefined
loginIp: string | null | undefined
loginDate: Date | null | undefined
nickname: string | null | undefined
avatar: string | null | undefined
name: string | null | undefined
sex: number
areaId: number | null | undefined
birthday: Date | null | undefined
mark: string | null | undefined
createTime: Date | null | undefined
}
// 查询会员用户列表 // 查询会员用户列表
export const getUserPage = async (params) => { export const getUserPage = async (params) => {
return await request.get({ url: `/member/user/page`, params }) return await request.get({ url: `/member/user/page`, params })
......
...@@ -31,7 +31,7 @@ let requestList: any[] = [] ...@@ -31,7 +31,7 @@ let requestList: any[] = []
// 是否正在刷新中 // 是否正在刷新中
let isRefreshToken = false let isRefreshToken = false
// 请求白名单,无须token的接口 // 请求白名单,无须token的接口
const whiteList: string[] = ['/login', '/refresh-token', '/system/tenant/get-id-by-name'] const whiteList: string[] = ['/login', '/refresh-token']
// 创建axios实例 // 创建axios实例
const service: AxiosInstance = axios.create({ const service: AxiosInstance = axios.create({
...@@ -47,7 +47,8 @@ service.interceptors.request.use( ...@@ -47,7 +47,8 @@ service.interceptors.request.use(
let isToken = (config!.headers || {}).isToken === false let isToken = (config!.headers || {}).isToken === false
whiteList.some((v) => { whiteList.some((v) => {
if (config.url) { if (config.url) {
return (isToken = config.url.indexOf(v) > -1) config.url.indexOf(v) > -1
return (isToken = false)
} }
}) })
if (getAccessToken() && !isToken) { if (getAccessToken() && !isToken) {
......
...@@ -5,32 +5,32 @@ const { t } = useI18n() ...@@ -5,32 +5,32 @@ const { t } = useI18n()
* redirect: noredirect 当设置 noredirect 的时候该路由在面包屑导航中不可被点击 * redirect: noredirect 当设置 noredirect 的时候该路由在面包屑导航中不可被点击
* name:'router-name' 设定路由的名字,一定要填写不然使用<keep-alive>时会出现各种问题 * name:'router-name' 设定路由的名字,一定要填写不然使用<keep-alive>时会出现各种问题
* meta : { * meta : {
hidden: true 当设置 true 的时候该路由不会再侧边栏出现 如404,login等页面(默认 false) hidden: true 当设置 true 的时候该路由不会再侧边栏出现 如404,login等页面(默认 false)
alwaysShow: true 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式, alwaysShow: true 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式,
只有一个时,会将那个子路由当做根路由显示在侧边栏, 只有一个时,会将那个子路由当做根路由显示在侧边栏,
若你想不管路由下面的 children 声明的个数都显示你的根路由, 若你想不管路由下面的 children 声明的个数都显示你的根路由,
你可以设置 alwaysShow: true,这样它就会忽略之前定义的规则, 你可以设置 alwaysShow: true,这样它就会忽略之前定义的规则,
一直显示根路由(默认 false) 一直显示根路由(默认 false)
title: 'title' 设置该路由在侧边栏和面包屑中展示的名字 title: 'title' 设置该路由在侧边栏和面包屑中展示的名字
icon: 'svg-name' 设置该路由的图标 icon: 'svg-name' 设置该路由的图标
noCache: true 如果设置为true,则不会被 <keep-alive> 缓存(默认 false) noCache: true 如果设置为true,则不会被 <keep-alive> 缓存(默认 false)
breadcrumb: false 如果设置为false,则不会在breadcrumb面包屑中显示(默认 true) breadcrumb: false 如果设置为false,则不会在breadcrumb面包屑中显示(默认 true)
affix: true 如果设置为true,则会一直固定在tag项中(默认 false) affix: true 如果设置为true,则会一直固定在tag项中(默认 false)
noTagsView: true 如果设置为true,则不会出现在tag中(默认 false) noTagsView: true 如果设置为true,则不会出现在tag中(默认 false)
activeMenu: '/dashboard' 显示高亮的路由路径 activeMenu: '/dashboard' 显示高亮的路由路径
followAuth: '/dashboard' 跟随哪个路由进行权限过滤 followAuth: '/dashboard' 跟随哪个路由进行权限过滤
canTo: true 设置为true即使hidden为true,也依然可以进行路由跳转(默认 false) canTo: true 设置为true即使hidden为true,也依然可以进行路由跳转(默认 false)
} }
**/ **/
const remainingRouter: AppRouteRecordRaw[] = [ const remainingRouter: AppRouteRecordRaw[] = [
{ {
...@@ -347,9 +347,9 @@ const remainingRouter: AppRouteRecordRaw[] = [ ...@@ -347,9 +347,9 @@ const remainingRouter: AppRouteRecordRaw[] = [
] ]
}, },
{ {
path: '/property', path: '/property', // TODO @puhui999:这里的 path 有问题,应该是 /product/property
component: Layout, component: Layout,
name: 'property', name: 'Property',
meta: { meta: {
hidden: true hidden: true
}, },
...@@ -412,6 +412,40 @@ const remainingRouter: AppRouteRecordRaw[] = [ ...@@ -412,6 +412,40 @@ const remainingRouter: AppRouteRecordRaw[] = [
] ]
}, },
{ {
path: '/trade/order',
component: Layout,
name: 'Detail',
meta: {
hidden: true
},
children: [
{
path: 'detail/:orderId(\\d+)',
component: () => import('@/views/mall/trade/order/components/OrderDetailForm.vue'),
name: 'TradeOrderDetailForm',
meta: { title: '订单详情', icon: '', activeMenu: '/trade/trade/order' }
}
]
},
{
path: '/member',
component: Layout,
name: 'member',
meta: { hidden: true },
children: [
{
path: 'user/detail',
name: 'MemberUserDetail',
meta: {
title: '会员详情',
noCache: true,
hidden: true
},
component: () => import('@/views/member/user/detail/index.vue')
}
]
},
{
path: '/pay', path: '/pay',
component: Layout, component: Layout,
name: 'pay', name: 'pay',
......
...@@ -90,6 +90,7 @@ export enum DICT_TYPE { ...@@ -90,6 +90,7 @@ export enum DICT_TYPE {
USER_TYPE = 'user_type', USER_TYPE = 'user_type',
COMMON_STATUS = 'common_status', COMMON_STATUS = 'common_status',
SYSTEM_TENANT_PACKAGE_ID = 'system_tenant_package_id', SYSTEM_TENANT_PACKAGE_ID = 'system_tenant_package_id',
TERMINAL = 'terminal', // 终端
// ========== SYSTEM 模块 ========== // ========== SYSTEM 模块 ==========
SYSTEM_USER_SEX = 'system_user_sex', SYSTEM_USER_SEX = 'system_user_sex',
...@@ -142,7 +143,6 @@ export enum DICT_TYPE { ...@@ -142,7 +143,6 @@ export enum DICT_TYPE {
// ========== MALL - 会员模块 ========== // ========== MALL - 会员模块 ==========
MEMBER_POINT_BIZ_TYPE = 'member_point_biz_type', // 积分的业务类型 MEMBER_POINT_BIZ_TYPE = 'member_point_biz_type', // 积分的业务类型
MEMBER_POINT_STATUS = 'member_point_status', // 积分的状态
// ========== MALL - 商品模块 ========== // ========== MALL - 商品模块 ==========
PRODUCT_UNIT = 'product_unit', // 商品单位 PRODUCT_UNIT = 'product_unit', // 商品单位
...@@ -156,7 +156,7 @@ export enum DICT_TYPE { ...@@ -156,7 +156,7 @@ export enum DICT_TYPE {
TRADE_ORDER_TYPE = 'trade_order_type', // 订单 - 类型 TRADE_ORDER_TYPE = 'trade_order_type', // 订单 - 类型
TRADE_ORDER_STATUS = 'trade_order_status', // 订单 - 状态 TRADE_ORDER_STATUS = 'trade_order_status', // 订单 - 状态
TRADE_ORDER_ITEM_AFTER_SALE_STATUS = 'trade_order_item_after_sale_status', // 订单项 - 售后状态 TRADE_ORDER_ITEM_AFTER_SALE_STATUS = 'trade_order_item_after_sale_status', // 订单项 - 售后状态
TERMINAL = 'terminal', // 终端 TRADE_DELIVERY_TYPE = 'trade_delivery_type', // 配送方式
// ========== MALL - 营销模块 ========== // ========== MALL - 营销模块 ==========
PROMOTION_DISCOUNT_TYPE = 'promotion_discount_type', // 优惠类型 PROMOTION_DISCOUNT_TYPE = 'promotion_discount_type', // 优惠类型
......
...@@ -21,8 +21,8 @@ ...@@ -21,8 +21,8 @@
v-model="loginData.loginForm.tenantName" v-model="loginData.loginForm.tenantName"
:placeholder="t('login.tenantNamePlaceholder')" :placeholder="t('login.tenantNamePlaceholder')"
:prefix-icon="iconHouse" :prefix-icon="iconHouse"
type="primary"
link link
type="primary"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
...@@ -148,8 +148,6 @@ import { ElLoading } from 'element-plus' ...@@ -148,8 +148,6 @@ import { ElLoading } from 'element-plus'
import LoginFormTitle from './LoginFormTitle.vue' import LoginFormTitle from './LoginFormTitle.vue'
import type { RouteLocationNormalizedLoaded } from 'vue-router' import type { RouteLocationNormalizedLoaded } from 'vue-router'
import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
const { wsCache } = useCache()
import { useIcon } from '@/hooks/web/useIcon' import { useIcon } from '@/hooks/web/useIcon'
import * as authUtil from '@/utils/auth' import * as authUtil from '@/utils/auth'
...@@ -246,7 +244,6 @@ const handleLogin = async (params) => { ...@@ -246,7 +244,6 @@ const handleLogin = async (params) => {
if (!res) { if (!res) {
return return
} }
wsCache.delete(CACHE_KEY.USER) // 清除上次登录用户信息
ElLoading.service({ ElLoading.service({
lock: true, lock: true,
text: '正在加载系统中...', text: '正在加载系统中...',
......
<template> <template>
<Form ref="formRef" :labelWidth="80" :rules="rules" :schema="schema"> <Form ref="formRef" :labelWidth="200" :rules="rules" :schema="schema">
<template #sex="form"> <template #sex="form">
<el-radio-group v-model="form['sex']"> <el-radio-group v-model="form['sex']">
<el-radio :label="1">{{ t('profile.user.man') }}</el-radio> <el-radio :label="1">{{ t('profile.user.man') }}</el-radio>
...@@ -7,8 +7,10 @@ ...@@ -7,8 +7,10 @@
</el-radio-group> </el-radio-group>
</template> </template>
</Form> </Form>
<XButton :title="t('common.save')" @click="submit()" /> <div style="text-align: center">
<XButton :title="t('common.reset')" type="danger" @click="init()" /> <XButton :title="t('common.save')" type="primary" @click="submit()" />
<XButton :title="t('common.reset')" type="danger" @click="init()" />
</div>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import type { FormRules } from 'element-plus' import type { FormRules } from 'element-plus'
......
<template> <template>
<el-form ref="formRef" :model="password" :rules="rules" label-width="80px"> <el-form ref="formRef" :model="password" :rules="rules" :label-width="200">
<el-form-item :label="t('profile.password.oldPassword')"> <el-form-item :label="t('profile.password.oldPassword')" prop="oldPassword">
<InputPassword v-model="password.oldPassword" /> <InputPassword v-model="password.oldPassword" />
</el-form-item> </el-form-item>
<el-form-item :label="t('profile.password.newPassword')"> <el-form-item :label="t('profile.password.newPassword')" prop="newPassword">
<InputPassword v-model="password.newPassword" strength /> <InputPassword v-model="password.newPassword" strength />
</el-form-item> </el-form-item>
<el-form-item :label="t('profile.password.confirmPassword')"> <el-form-item :label="t('profile.password.confirmPassword')" prop="confirmPassword">
<InputPassword v-model="password.confirmPassword" strength /> <InputPassword v-model="password.confirmPassword" strength />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
...@@ -33,17 +33,18 @@ const password = reactive({ ...@@ -33,17 +33,18 @@ const password = reactive({
}) })
// 表单校验 // 表单校验
const equalToPassword = (value, callback) => { const equalToPassword = (_rule, value, callback) => {
if (password.newPassword !== value) { if (password.newPassword !== value) {
callback(new Error(t('profile.password.diffPwd'))) callback(new Error(t('profile.password.diffPwd')))
} else { } else {
callback() callback()
} }
} }
const rules = reactive<FormRules>({ const rules = reactive<FormRules>({
oldPassword: [ oldPassword: [
{ required: true, message: t('profile.password.oldPwdMsg'), trigger: 'blur' }, { required: true, message: t('profile.password.oldPwdMsg'), trigger: 'blur' },
{ min: 3, max: 5, message: t('profile.password.pwdRules'), trigger: 'blur' } { min: 6, max: 20, message: t('profile.password.pwdRules'), trigger: 'blur' }
], ],
newPassword: [ newPassword: [
{ required: true, message: t('profile.password.newPwdMsg'), trigger: 'blur' }, { required: true, message: t('profile.password.newPwdMsg'), trigger: 'blur' },
...@@ -54,6 +55,7 @@ const rules = reactive<FormRules>({ ...@@ -54,6 +55,7 @@ const rules = reactive<FormRules>({
{ required: true, validator: equalToPassword, trigger: 'blur' } { required: true, validator: equalToPassword, trigger: 'blur' }
] ]
}) })
const submit = (formEl: FormInstance | undefined) => { const submit = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
formEl.validate(async (valid) => { formEl.validate(async (valid) => {
...@@ -63,6 +65,7 @@ const submit = (formEl: FormInstance | undefined) => { ...@@ -63,6 +65,7 @@ const submit = (formEl: FormInstance | undefined) => {
} }
}) })
} }
const reset = (formEl: FormInstance | undefined) => { const reset = (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
formEl.resetFields() formEl.resetFields()
......
...@@ -45,9 +45,9 @@ ...@@ -45,9 +45,9 @@
<el-button class="float-right" text type="primary" @click="copy(item.code)"> <el-button class="float-right" text type="primary" @click="copy(item.code)">
{{ t('common.copy') }} {{ t('common.copy') }}
</el-button> </el-button>
<div> <el-scrollbar height="600px">
<pre><code v-dompurify-html="highlightedCode(item)" class="hljs"></code></pre> <pre><code v-dompurify-html="highlightedCode(item)" class="hljs"></code></pre>
</div> </el-scrollbar>
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</el-card> </el-card>
......
...@@ -73,9 +73,7 @@ ...@@ -73,9 +73,7 @@
> >
编辑 编辑
</el-button> </el-button>
<el-button link type="primary"> <el-button link type="primary" @click="goValueList(scope.row.id)">属性值</el-button>
<router-link :to="'/property/value/' + scope.row.id">属性值</router-link>
</el-button>
<el-button <el-button
v-hasPermi="['product:property:delete']" v-hasPermi="['product:property:delete']"
link link
...@@ -103,6 +101,7 @@ ...@@ -103,6 +101,7 @@
import { dateFormatter } from '@/utils/formatTime' import { dateFormatter } from '@/utils/formatTime'
import * as PropertyApi from '@/api/mall/product/property' import * as PropertyApi from '@/api/mall/product/property'
import PropertyForm from './PropertyForm.vue' import PropertyForm from './PropertyForm.vue'
const { push } = useRouter()
defineOptions({ name: 'ProductProperty' }) defineOptions({ name: 'ProductProperty' })
...@@ -163,6 +162,11 @@ const handleDelete = async (id: number) => { ...@@ -163,6 +162,11 @@ const handleDelete = async (id: number) => {
} catch {} } catch {}
} }
/** 跳转商品属性列表 */
const goValueList = (id: number) => {
push({ path: '/property/value/' + id })
}
/** 初始化 **/ /** 初始化 **/
onMounted(() => { onMounted(() => {
getList() getList()
......
...@@ -334,7 +334,7 @@ const validateSku = () => { ...@@ -334,7 +334,7 @@ const validateSku = () => {
for (const sku of formData.value!.skus!) { for (const sku of formData.value!.skus!) {
// 作为活动组件的校验 // 作为活动组件的校验
if (props.isActivityComponent) { if (props.isActivityComponent) {
for (const rule of props.ruleConfig) { for (const rule of props?.ruleConfig) {
const arg = getValue(sku, rule.name) const arg = getValue(sku, rule.name)
if (!rule.rule(arg)) { if (!rule.rule(arg)) {
validate = false // 只要有一个不通过则直接不通过 validate = false // 只要有一个不通过则直接不通过
...@@ -534,9 +534,10 @@ watch( ...@@ -534,9 +534,10 @@ watch(
} }
) )
const activitySkuListRef = ref<InstanceType<typeof ElTable>>() const activitySkuListRef = ref<InstanceType<typeof ElTable>>()
const clearSelection = () => {
activitySkuListRef.value.clearSelection() const getSkuTableRef = () => {
return activitySkuListRef.value
} }
// 暴露出生成 sku 方法,给添加属性成功时调用 // 暴露出生成 sku 方法,给添加属性成功时调用
defineExpose({ generateTableData, validateSku, clearSelection }) defineExpose({ generateTableData, validateSku, getSkuTableRef })
</script> </script>
...@@ -51,7 +51,7 @@ ...@@ -51,7 +51,7 @@
<el-button @click="dialogVisible = false">取 消</el-button> <el-button @click="dialogVisible = false">取 消</el-button>
</template> </template>
</Dialog> </Dialog>
<SpuSelect ref="spuSelectRef" :isSelectSku="true" @confirm="selectSpu" /> <SpuSelect ref="spuSelectRef" :isSelectSku="true" :radio="true" @confirm="selectSpu" />
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import * as BargainActivityApi from '@/api/mall/promotion/bargain/bargainActivity' import * as BargainActivityApi from '@/api/mall/promotion/bargain/bargainActivity'
...@@ -83,17 +83,17 @@ const ruleConfig: RuleConfig[] = [ ...@@ -83,17 +83,17 @@ const ruleConfig: RuleConfig[] = [
{ {
name: 'productConfig.bargainFirstPrice', name: 'productConfig.bargainFirstPrice',
rule: (arg) => arg > 0, rule: (arg) => arg > 0,
message: '商品砍价起始价格不能小于0 !!!' message: '商品砍价起始价格不能小于 0 !!!'
}, },
{ {
name: 'productConfig.bargainPrice', name: 'productConfig.bargainPrice',
rule: (arg) => arg > 0, rule: (arg) => arg >= 0,
message: '商品砍价底价不能小于0 !!!' message: '商品砍价底价不能小于 0 !!!'
}, },
{ {
name: 'productConfig.stock', name: 'productConfig.stock',
rule: (arg) => arg > 1, rule: (arg) => arg >= 1,
message: '商品活动库存不能小于1 !!!' message: '商品活动库存不能小于 1 !!!'
} }
] ]
const selectSpu = (spuId: number, skuIds: number[]) => { const selectSpu = (spuId: number, skuIds: number[]) => {
...@@ -164,7 +164,20 @@ const open = async (type: string, id?: number) => { ...@@ -164,7 +164,20 @@ const open = async (type: string, id?: number) => {
// 用户每次砍价金额分转元, 分转元 // 用户每次砍价金额分转元, 分转元
data.randomMinPrice = formatToFraction(data.randomMinPrice) data.randomMinPrice = formatToFraction(data.randomMinPrice)
data.randomMaxPrice = formatToFraction(data.randomMaxPrice) data.randomMaxPrice = formatToFraction(data.randomMaxPrice)
await getSpuDetails(data.spuId!, data.products?.map((sku) => sku.skuId), data.products) // 对齐活动商品处理结构
await getSpuDetails(
data.spuId!,
[data.skuId],
[
{
spuId: data.spuId!,
skuId: data.skuId,
bargainFirstPrice: data.bargainFirstPrice, // 砍价起始价格,单位分
bargainPrice: data.bargainPrice, // 砍价底价
stock: data.stock // 活动库存
}
]
)
formRef.value.setValues(data) formRef.value.setValues(data)
} finally { } finally {
formLoading.value = false formLoading.value = false
...@@ -201,12 +214,12 @@ const submitForm = async () => { ...@@ -201,12 +214,12 @@ const submitForm = async () => {
// 用户每次砍价金额分转元, 元转分 // 用户每次砍价金额分转元, 元转分
data.randomMinPrice = convertToInteger(data.randomMinPrice) data.randomMinPrice = convertToInteger(data.randomMinPrice)
data.randomMaxPrice = convertToInteger(data.randomMaxPrice) data.randomMaxPrice = convertToInteger(data.randomMaxPrice)
data.products = products const formData = { ...data, ...products[0] }
if (formType.value === 'create') { if (formType.value === 'create') {
await BargainActivityApi.createBargainActivity(data) await BargainActivityApi.createBargainActivity(formData)
message.success(t('common.createSuccess')) message.success(t('common.createSuccess'))
} else { } else {
await BargainActivityApi.updateBargainActivity(data) await BargainActivityApi.updateBargainActivity(formData)
message.success(t('common.updateSuccess')) message.success(t('common.updateSuccess'))
} }
dialogVisible.value = false dialogVisible.value = false
......
<template>
<div></div>
</template>
<script lang="ts" name="CombinationRecord" setup></script>
...@@ -127,7 +127,8 @@ defineOptions({ name: 'PromotionSpuSelect' }) ...@@ -127,7 +127,8 @@ defineOptions({ name: 'PromotionSpuSelect' })
const props = defineProps({ const props = defineProps({
// 默认不需要(不需要的情况下只返回 spu,需要的情况下返回 选中的 spu 和 sku 列表) // 默认不需要(不需要的情况下只返回 spu,需要的情况下返回 选中的 spu 和 sku 列表)
// 其它活动需要选择商品和商品属性导入此组件即可,需添加组件属性 :isSelectSku='true' // 其它活动需要选择商品和商品属性导入此组件即可,需添加组件属性 :isSelectSku='true'
isSelectSku: propTypes.bool.def(false) // 是否需要选择 sku 属性 isSelectSku: propTypes.bool.def(false), // 是否需要选择 sku 属性
radio: propTypes.bool.def(false) // 是否单选 sku
}) })
const message = useMessage() // 消息弹窗 const message = useMessage() // 消息弹窗
...@@ -146,7 +147,7 @@ const queryParams = ref({ ...@@ -146,7 +147,7 @@ const queryParams = ref({
}) // 查询参数 }) // 查询参数
const propertyList = ref<PropertyAndValues[]>([]) // 商品属性列表 const propertyList = ref<PropertyAndValues[]>([]) // 商品属性列表
const spuListRef = ref<InstanceType<typeof ElTable>>() const spuListRef = ref<InstanceType<typeof ElTable>>()
const skuListRef = ref() // 商品属性选择 Ref const skuListRef = ref<InstanceType<typeof SkuList>>() // 商品属性选择 Ref
const spuData = ref<ProductSpuApi.Spu>() // 商品详情 const spuData = ref<ProductSpuApi.Spu>() // 商品详情
const isExpand = ref(false) // 控制 SKU 列表显示 const isExpand = ref(false) // 控制 SKU 列表显示
const expandRowKeys = ref<number[]>() // 控制展开行需要设置 row-key 属性才能使用,该属性为展开行的 keys 数组。 const expandRowKeys = ref<number[]>() // 控制展开行需要设置 row-key 属性才能使用,该属性为展开行的 keys 数组。
...@@ -155,12 +156,30 @@ const expandRowKeys = ref<number[]>() // 控制展开行需要设置 row-key 属 ...@@ -155,12 +156,30 @@ const expandRowKeys = ref<number[]>() // 控制展开行需要设置 row-key 属
const selectedSpuId = ref<number>(0) // 选中的商品 spuId const selectedSpuId = ref<number>(0) // 选中的商品 spuId
const selectedSkuIds = ref<number[]>([]) // 选中的商品 skuIds const selectedSkuIds = ref<number[]>([]) // 选中的商品 skuIds
const selectSku = (val: ProductSpuApi.Sku[]) => { const selectSku = (val: ProductSpuApi.Sku[]) => {
const skuTable = skuListRef.value?.getSkuTableRef()
if (selectedSpuId.value === 0) { if (selectedSpuId.value === 0) {
message.warning('请先选择商品再选择相应的规格!!!') message.warning('请先选择商品再选择相应的规格!!!')
skuListRef.value.clearSelection() skuTable?.clearSelection()
return return
} }
selectedSkuIds.value = val.map((sku) => sku.id!) if (val.length === 0) {
selectedSkuIds.value = []
return
}
if (props.radio) {
// 只选择一个
selectedSkuIds.value = [val.map((sku) => sku.id!)[0]]
// 如果大于1个
if (val.length > 1) {
// 清空选择
skuTable?.clearSelection()
// 变更为最后一次选择的
skuTable?.toggleRowSelection(val.pop(), true)
return
}
} else {
selectedSkuIds.value = val.map((sku) => sku.id!)
}
} }
const selectSpu = (val: ProductSpuApi.Spu[]) => { const selectSpu = (val: ProductSpuApi.Spu[]) => {
if (val.length === 0) { if (val.length === 0) {
...@@ -176,9 +195,9 @@ const selectSpu = (val: ProductSpuApi.Spu[]) => { ...@@ -176,9 +195,9 @@ const selectSpu = (val: ProductSpuApi.Spu[]) => {
// 如果大于1个 // 如果大于1个
if (val.length > 1) { if (val.length > 1) {
// 清空选择 // 清空选择
spuListRef.value.clearSelection() spuListRef.value?.clearSelection()
// 变更为最后一次选择的 // 变更为最后一次选择的
spuListRef.value.toggleRowSelection(val.pop(), true) spuListRef.value?.toggleRowSelection(val.pop(), true)
return return
} }
expandChange(val[0], val) expandChange(val[0], val)
...@@ -194,7 +213,7 @@ const expandChange = async (row: ProductSpuApi.Spu, expandedRows?: ProductSpuApi ...@@ -194,7 +213,7 @@ const expandChange = async (row: ProductSpuApi.Spu, expandedRows?: ProductSpuApi
expandRowKeys.value = [selectedSpuId.value] expandRowKeys.value = [selectedSpuId.value]
return return
} }
// 如果展开 skuList 则选择此对应的 spu 不需要重新获取渲染 skuList // 如果展开 skuList 则选择此对应的 spu 不需要重新获取渲染 skuList
if (isExpand.value && spuData.value?.id === row.id) { if (isExpand.value && spuData.value?.id === row.id) {
return return
} }
......
<template> <template>
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
<ContentWrap> <ContentWrap>
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true"> <el-form ref="queryFormRef" :inline="true" :model="queryParams" class="-mb-15px">
<el-form-item label="门店手机" prop="phone"> <el-form-item label="门店手机" prop="phone">
<el-input <el-input
v-model="queryParams.phone" v-model="queryParams.phone"
placeholder="请输门店手机" class="!w-240px"
clearable clearable
placeholder="请输门店手机"
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
class="!w-240px"
/> />
</el-form-item> </el-form-item>
<el-form-item label="门店名称" prop="name"> <el-form-item label="门店名称" prop="name">
<el-input <el-input
v-model="queryParams.name" v-model="queryParams.name"
placeholder="请输门店名称" class="!w-240px"
clearable clearable
placeholder="请输门店名称"
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
class="!w-240px"
/> />
</el-form-item> </el-form-item>
<el-form-item label="门店状态" prop="status"> <el-form-item label="门店状态" prop="status">
<el-select v-model="queryParams.status" placeholder="门店状态" clearable class="!w-240px"> <el-select v-model="queryParams.status" class="!w-240px" clearable placeholder="门店状态">
<el-option <el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)" v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
:key="dict.value" :key="dict.value"
...@@ -33,32 +33,30 @@ ...@@ -33,32 +33,30 @@
<el-form-item label="创建时间" prop="createTime"> <el-form-item label="创建时间" prop="createTime">
<el-date-picker <el-date-picker
v-model="queryParams.createTime" v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="datetimerange"
start-placeholder="开始日期"
end-placeholder="结束日期"
class="!w-240px" class="!w-240px"
end-placeholder="结束日期"
start-placeholder="开始日期"
type="datetimerange"
value-format="YYYY-MM-DD HH:mm:ss"
/> />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button> <el-button @click="handleQuery">
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button> <Icon class="mr-5px" icon="ep:search" />
<el-button 搜索
type="primary" </el-button>
plain <el-button @click="resetQuery">
@click="openForm('create')" <Icon class="mr-5px" icon="ep:refresh" />
v-hasPermi="['trade:delivery:pick-up-store:create']" 重置
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button> </el-button>
<el-button <el-button
type="success" v-hasPermi="['trade:delivery:pick-up-store:create']"
plain plain
@click="handleExport" type="primary"
:loading="exportLoading" @click="openForm('create')"
v-hasPermi="['trade:delivery:pick-up-store:export']"
> >
<Icon icon="ep:download" class="mr-5px" /> 导出 <Icon class="mr-5px" icon="ep:plus" />
新增
</el-button> </el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
...@@ -75,34 +73,34 @@ ...@@ -75,34 +73,34 @@
</el-table-column> </el-table-column>
<el-table-column label="门店名称" prop="name" /> <el-table-column label="门店名称" prop="name" />
<el-table-column label="门店手机" prop="phone" /> <el-table-column label="门店手机" prop="phone" />
<el-table-column label="门店详细地址" align="center" prop="detailAddress" /> <el-table-column align="center" label="门店详细地址" prop="detailAddress" />
<el-table-column label="开启状态" align="center" prop="status"> <el-table-column align="center" label="开启状态" prop="status">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" /> <dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
label="创建时间" :formatter="dateFormatter"
align="center" align="center"
label="创建时间"
prop="createTime" prop="createTime"
width="180" width="180"
:formatter="dateFormatter"
/> />
<el-table-column label="操作" align="center"> <el-table-column align="center" label="操作">
<template #default="scope"> <template #default="scope">
<el-button <el-button
v-hasPermi="['trade:delivery:pick-up-store:update']"
link link
type="primary" type="primary"
@click="openForm('update', scope.row.id)" @click="openForm('update', scope.row.id)"
v-hasPermi="['trade:delivery:pick-up-store:update']"
> >
编辑 编辑
</el-button> </el-button>
<el-button <el-button
v-hasPermi="['trade:delivery:pick-up-store:delete']"
link link
type="danger" type="danger"
@click="handleDelete(scope.row.id)" @click="handleDelete(scope.row.id)"
v-hasPermi="['trade:delivery:pick-up-store:delete']"
> >
删除 删除
</el-button> </el-button>
...@@ -113,18 +111,17 @@ ...@@ -113,18 +111,17 @@
<!-- 表单弹窗:添加/修改 --> <!-- 表单弹窗:添加/修改 -->
<DeliveryPickUpStoreForm ref="formRef" @success="getList" /> <DeliveryPickUpStoreForm ref="formRef" @success="getList" />
</template> </template>
<script setup lang="ts" name="DeliveryPickUpStore"> <script lang="ts" name="DeliveryPickUpStore" setup>
import * as DeliveryPickUpStoreApi from '@/api/mall/trade/delivery/pickUpStore' import * as DeliveryPickUpStoreApi from '@/api/mall/trade/delivery/pickUpStore'
import DeliveryPickUpStoreForm from './PickUpStoreForm.vue' import DeliveryPickUpStoreForm from './PickUpStoreForm.vue'
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime' import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
const message = useMessage() // 消息弹窗 const message = useMessage() // 消息弹窗
const { t } = useI18n() // 国际化 const { t } = useI18n() // 国际化
const total = ref(0) // 列表的总页数 const total = ref(0) // 列表的总页数
const loading = ref(true) // 列表的加载中 const loading = ref(true) // 列表的加载中
const exportLoading = ref(false) // 导出的加载中
const list = ref<any[]>([]) // 列表的数据 const list = ref<any[]>([]) // 列表的数据
const queryParams = reactive({ const queryParams = reactive({
pageNo: 1, pageNo: 1,
...@@ -179,21 +176,6 @@ const resetQuery = () => { ...@@ -179,21 +176,6 @@ const resetQuery = () => {
handleQuery() handleQuery()
} }
/** 导出按钮操作 */
const handleExport = async () => {
try {
// 导出的二次确认
await message.exportConfirm()
// 发起导出
exportLoading.value = true
const data = await DeliveryPickUpStoreApi.exportDeliveryPickUpStoreApi(queryParams)
download.excel(data, '自提门店.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/ /** 初始化 **/
onMounted(() => { onMounted(() => {
getList() getList()
......
<template>
<Dialog v-model="dialogVisible" title="订单发货" width="25%">
<el-form ref="formRef" v-loading="formLoading" :model="formData" label-width="80px">
<el-form-item label="发货方式">
<el-radio-group v-model="radio">
<el-radio border label="1">快递物流</el-radio>
<el-radio border label="2">无需发货</el-radio>
</el-radio-group>
</el-form-item>
<template v-if="radio === '1'">
<el-form-item label="物流公司">
<el-select v-model="formData.logisticsId" placeholder="请选择" style="width: 100%">
<el-option
v-for="item in deliveryExpressList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="物流单号">
<el-input v-model="formData.logisticsNo" />
</el-form-item>
</template>
</el-form>
<template #footer>
<el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
<el-button @click="dialogVisible = false">取 消</el-button>
</template>
</Dialog>
</template>
<script lang="ts" setup>
import * as DeliveryExpressApi from '@/api/mall/trade/delivery/express'
import * as TradeOrderApi from '@/api/mall/trade/order'
// TODO @puhui999:是不是名字叫 OrderDeliveryForm 保持统一
defineOptions({ name: 'DeliveryOrderForm' })
const { t } = useI18n() // 国际化
const message = useMessage() // 消息弹窗
const dialogVisible = ref(false) // 弹窗的是否展示
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
const radio = ref('1') // TODO @puhui999:尽量不用 radio 这种命名,无业务含义。这里的话,可以考虑用 expressType,如果值是 express,则是快递;none 则是无;未来做同城配送,就比较容易拓展啦;
const formData = ref<TradeOrderApi.DeliveryVO>({
id: 0, // 订单编号
logisticsId: null, // 物流公司编号
logisticsNo: '' // 物流编号
})
const formRef = ref() // 表单 Ref
// TODO @puhui999:每次点击发货的时候,是不是可以把之前的信息带过来哈。
/** 打开弹窗 */
const open = async (orderId: number) => {
resetForm()
// 设置数据
formData.value.id = orderId
dialogVisible.value = true
}
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
/** 提交表单 */
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
const submitForm = async () => {
// 提交请求
formLoading.value = true
try {
const data = unref(formData)
if (radio.value === '2') {
// 无需发货的情况
data.logisticsId = 0
data.logisticsNo = ''
}
await TradeOrderApi.delivery(data)
message.success(t('common.updateSuccess'))
dialogVisible.value = false
// 发送操作成功的事件
emit('success', true)
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: 0, // 订单编号
logisticsId: null, // 物流公司编号
logisticsNo: '' // 物流编号
}
formRef.value?.resetFields()
}
const deliveryExpressList = ref([])
onMounted(async () => {
deliveryExpressList.value = await DeliveryExpressApi.getSimpleDeliveryExpressList()
})
</script>
<template>
<Dialog v-model="dialogVisible" title="修改订单收货地址" width="35%">
<el-form ref="formRef" v-loading="formLoading" :model="formData" label-width="120px">
<el-form-item label="收件人名称">
<el-input v-model="formData.receiverName" />
</el-form-item>
<el-form-item label="收件人手机">
<el-input v-model="formData.receiverMobile" />
</el-form-item>
<!-- TODO @puhui999:应该是个地区下拉框,可以看下 UserForm 所在地 -->
<el-form-item label="收件人地区编号">
<el-input v-model="formData.receiverAreaId" />
</el-form-item>
<el-form-item label="收件人详细地址">
<el-input v-model="formData.receiverDetailAddress" />
</el-form-item>
</el-form>
<template #footer>
<el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
<el-button @click="dialogVisible = false">取 消</el-button>
</template>
</Dialog>
</template>
<script lang="ts" setup>
import * as TradeOrderApi from '@/api/mall/trade/order'
import { copyValueToTarget } from '@/utils'
// TODO @puhui999:OrderAdjustAddressForm 改成 OrderUpdateAddressForm 更新哈,保持统一;
defineOptions({ name: 'OrderAdjustAddressForm' })
const { t } = useI18n() // 国际化
const message = useMessage() // 消息弹窗
const dialogVisible = ref(false) // 弹窗的是否展示
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
const formData = ref({
id: 0, // 订单编号
receiverName: '', // 收件人名称
receiverMobile: '', // 收件人手机
receiverAreaId: null, //收件人地区编号
receiverDetailAddress: '' //收件人详细地址
})
const formRef = ref() // 表单 Ref
/** 打开弹窗 */
const open = async (row: TradeOrderApi.OrderVO) => {
resetForm()
// 设置数据
copyValueToTarget(formData.value, row)
dialogVisible.value = true
}
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
/** 提交表单 */
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
const submitForm = async () => {
// 提交请求
formLoading.value = true
try {
const data = unref(formData)
await TradeOrderApi.adjustAddress(data)
message.success(t('common.updateSuccess'))
dialogVisible.value = false
// 发送操作成功的事件
emit('success', true)
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: 0, // 订单编号
receiverName: '', // 收件人名称
receiverMobile: '', // 收件人手机
receiverAreaId: null, //收件人地区编号
receiverDetailAddress: '' //收件人详细地址
}
formRef.value?.resetFields()
}
</script>
<template>
<Dialog v-model="dialogVisible" title="订单调价" width="25%">
<el-form ref="formRef" v-loading="formLoading" :model="formData" label-width="100px">
<el-form-item label="应付金额(总)">
<el-input v-model="formData.payPrice" disabled />
</el-form-item>
<el-form-item label="订单调价">
<el-input-number v-model="formData.adjustPrice" :precision="2" :step="0.1" class="w-100%" />
<el-tag class="mt-10px" type="warning">订单调价。 正数,加价;负数,减价</el-tag>
</el-form-item>
<el-form-item label="调价后">
<el-input v-model="formData.newPayPrice" disabled />
</el-form-item>
</el-form>
<template #footer>
<el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
<el-button @click="dialogVisible = false">取 消</el-button>
</template>
</Dialog>
</template>
<script lang="ts" setup>
import * as TradeOrderApi from '@/api/mall/trade/order'
import { convertToInteger, formatToFraction } from '@/utils'
import { cloneDeep } from 'lodash-es'
// TODO @puhui999:OrderAdjustPriceForm 改成 OrderUpdatePriceForm 更新哈,保持统一;
defineOptions({ name: 'OrderAdjustPriceForm' })
const { t } = useI18n() // 国际化
const message = useMessage() // 消息弹窗
const dialogVisible = ref(false) // 弹窗的是否展示
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
const formData = ref({
id: 0, // 订单编号
adjustPrice: 0, // 订单调价
payPrice: '', // 应付金额(总)
newPayPrice: '' // 调价后应付金额(总)
})
watch(
() => formData.value.adjustPrice,
(data: number) => {
formData.value.newPayPrice = formData.value.payPrice.replace('元', '') * 1 + data + '元'
}
)
const formRef = ref() // 表单 Ref
/** 打开弹窗 */
const open = async (row: TradeOrderApi.OrderVO) => {
resetForm()
formData.value.id = row.id
// 设置数据
formData.value.adjustPrice = formatToFraction(row.adjustPrice)
formData.value.payPrice = formatToFraction(row.payPrice) + '元'
dialogVisible.value = true
}
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
/** 提交表单 */
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
const submitForm = async () => {
// 提交请求
formLoading.value = true
try {
const data = cloneDeep(unref(formData))
data.adjustPrice = convertToInteger(data.adjustPrice)
delete data.payPrice
delete data.newPayPrice
await TradeOrderApi.adjustPrice(data)
message.success(t('common.updateSuccess'))
dialogVisible.value = false
// 发送操作成功的事件
emit('success', true)
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: 0, // 订单编号
adjustPrice: 0, // 订单调价
payPrice: '', // 应付金额(总)
newPayPrice: '' // 调价后应付金额(总)
}
formRef.value?.resetFields()
}
</script>
<template>
<Dialog v-model="dialogVisible" title="商家备注" width="25%">
<el-form ref="formRef" v-loading="formLoading" :model="formData" label-width="80px">
<el-form-item label="备注">
<el-input v-model="formData.remark" />
</el-form-item>
</el-form>
<template #footer>
<el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
<el-button @click="dialogVisible = false">取 消</el-button>
</template>
</Dialog>
</template>
<script lang="ts" setup>
import * as TradeOrderApi from '@/api/mall/trade/order'
// TODO @puhui999:OrderRemarksForm 改成 OrderUpdateRemarkForm 更新哈,保持统一;
defineOptions({ name: 'OrderRemarksForm' })
const { t } = useI18n() // 国际化
const message = useMessage() // 消息弹窗
const dialogVisible = ref(false) // 弹窗的是否展示
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
const formData = ref({
id: 0, // 订单编号
remark: '' // 订单备注
})
const formRef = ref() // 表单 Ref
/** 打开弹窗 */
const open = async (row: TradeOrderApi.OrderVO) => {
resetForm()
// 设置数据
formData.value.id = row.id
formData.value.remark = row.remark
dialogVisible.value = true
}
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
/** 提交表单 */
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
const submitForm = async () => {
// 提交请求
formLoading.value = true
try {
const data = unref(formData)
console.log(data)
await TradeOrderApi.remark(data)
message.success(t('common.updateSuccess'))
dialogVisible.value = false
// 发送操作成功的事件
emit('success', true)
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: 0, // 订单编号
remark: '' // 订单备注
}
formRef.value?.resetFields()
}
</script>
...@@ -10,9 +10,6 @@ ...@@ -10,9 +10,6 @@
<el-form-item label="名称" prop="name"> <el-form-item label="名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入名称" /> <el-input v-model="formData.name" placeholder="请输入名称" />
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" placeholder="请输入备注" />
</el-form-item>
<el-form-item label="状态" prop="status"> <el-form-item label="状态" prop="status">
<el-radio-group v-model="formData.status"> <el-radio-group v-model="formData.status">
<el-radio <el-radio
...@@ -24,6 +21,9 @@ ...@@ -24,6 +21,9 @@
</el-radio> </el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" placeholder="请输入备注" />
</el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button> <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
......
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
/> />
</el-select> </el-select>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import * as GroupApi from '@/api/member/group' import * as GroupApi from '@/api/member/group'
......
...@@ -38,9 +38,9 @@ ...@@ -38,9 +38,9 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="享受折扣(%)" prop="discount"> <el-form-item label="享受折扣(%)" prop="discountPercent">
<el-input-number <el-input-number
v-model="formData.discount" v-model="formData.discountPercent"
:min="0" :min="0"
:max="100" :max="100"
:precision="0" :precision="0"
...@@ -100,7 +100,7 @@ const formData = ref({ ...@@ -100,7 +100,7 @@ const formData = ref({
name: undefined, name: undefined,
experience: undefined, experience: undefined,
level: undefined, level: undefined,
discount: undefined, discountPercent: undefined,
icon: undefined, icon: undefined,
backgroundUrl: undefined, backgroundUrl: undefined,
status: CommonStatusEnum.ENABLE status: CommonStatusEnum.ENABLE
...@@ -109,7 +109,7 @@ const formRules = reactive({ ...@@ -109,7 +109,7 @@ const formRules = reactive({
name: [{ required: true, message: '等级名称不能为空', trigger: 'blur' }], name: [{ required: true, message: '等级名称不能为空', trigger: 'blur' }],
experience: [{ required: true, message: '升级经验不能为空', trigger: 'blur' }], experience: [{ required: true, message: '升级经验不能为空', trigger: 'blur' }],
level: [{ required: true, message: '等级不能为空', trigger: 'blur' }], level: [{ required: true, message: '等级不能为空', trigger: 'blur' }],
discount: [{ required: true, message: '享受折扣不能为空', trigger: 'blur' }], discountPercent: [{ required: true, message: '享受折扣不能为空', trigger: 'blur' }],
status: [{ required: true, message: '状态不能为空', trigger: 'change' }] status: [{ required: true, message: '状态不能为空', trigger: 'change' }]
}) })
const formRef = ref() // 表单 Ref const formRef = ref() // 表单 Ref
...@@ -165,7 +165,7 @@ const resetForm = () => { ...@@ -165,7 +165,7 @@ const resetForm = () => {
name: undefined, name: undefined,
experience: undefined, experience: undefined,
level: undefined, level: undefined,
discount: undefined, discountPercent: undefined,
icon: undefined, icon: undefined,
backgroundUrl: undefined, backgroundUrl: undefined,
status: CommonStatusEnum.ENABLE status: CommonStatusEnum.ENABLE
......
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
</el-option> </el-option>
</el-select> </el-select>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import * as LevelApi from '@/api/member/level' import * as LevelApi from '@/api/member/level'
......
...@@ -62,7 +62,7 @@ ...@@ -62,7 +62,7 @@
<el-table-column label="等级名称" align="center" prop="name" min-width="100" /> <el-table-column label="等级名称" align="center" prop="name" min-width="100" />
<el-table-column label="等级" align="center" prop="level" min-width="60" /> <el-table-column label="等级" align="center" prop="level" min-width="60" />
<el-table-column label="升级经验" align="center" prop="experience" min-width="80" /> <el-table-column label="升级经验" align="center" prop="experience" min-width="80" />
<el-table-column label="享受折扣(%)" align="center" prop="discount" min-width="110" /> <el-table-column label="享受折扣(%)" align="center" prop="discountPercent" min-width="110" />
<el-table-column label="状态" align="center" prop="status" min-width="70"> <el-table-column label="状态" align="center" prop="status" min-width="70">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" /> <dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
......
...@@ -58,7 +58,7 @@ ...@@ -58,7 +58,7 @@
</ContentWrap> </ContentWrap>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import * as ConfigApi from '@/api/point/config' import * as ConfigApi from '@/api/member/point/config'
defineOptions({ name: 'MemberPointConfig' }) defineOptions({ name: 'MemberPointConfig' })
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
class="!w-240px" class="!w-240px"
> >
<el-option <el-option
v-for="dict in getStrDictOptions(DICT_TYPE.MEMBER_POINT_BIZ_TYPE)" v-for="dict in getIntDictOptions(DICT_TYPE.MEMBER_POINT_BIZ_TYPE)"
:key="dict.value" :key="dict.value"
:label="dict.label" :label="dict.label"
:value="dict.value" :value="dict.value"
...@@ -41,16 +41,6 @@ ...@@ -41,16 +41,6 @@
class="!w-240px" class="!w-240px"
/> />
</el-form-item> </el-form-item>
<el-form-item label="积分状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable class="!w-240px">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.MEMBER_POINT_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="获得时间" prop="createDate"> <el-form-item label="获得时间" prop="createDate">
<el-date-picker <el-date-picker
v-model="queryParams.createDate" v-model="queryParams.createDate"
...@@ -78,48 +68,32 @@ ...@@ -78,48 +68,32 @@
<!-- 列表 --> <!-- 列表 -->
<ContentWrap> <ContentWrap>
<el-table v-loading="loading" :data="list"> <el-table v-loading="loading" :data="list">
<el-table-column label="编号" align="center" prop="id" /> <el-table-column label="编号" align="center" prop="id" width="180" />
<el-table-column label="用户" align="center" prop="nickname" />
<el-table-column label="积分标题" align="center" prop="title" />
<el-table-column label="积分描述" align="center" prop="description" />
<el-table-column <el-table-column
label="获得时间" label="获得时间"
align="center" align="center"
prop="createTime" prop="createTime"
:formatter="dateFormatter" :formatter="dateFormatter"
width="180"
/> />
<el-table-column label="积分" align="center" prop="point"> <el-table-column label="用户" align="center" prop="nickname" width="200" />
<el-table-column label="获得积分" align="center" prop="point" width="100">
<template #default="scope"> <template #default="scope">
<el-tag v-if="scope.row.point > 0" class="ml-2" type="success" effect="dark"> <el-tag v-if="scope.row.point > 0" class="ml-2" type="success" effect="dark">
{{ scope.row.point }} +{{ scope.row.point }}
</el-tag> </el-tag>
<el-tag v-else class="ml-2" type="danger" effect="dark"> {{ scope.row.point }} </el-tag> <el-tag v-else class="ml-2" type="danger" effect="dark"> {{ scope.row.point }} </el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="变动后的积分" align="center" prop="totalPoint" /> <el-table-column label="总积分" align="center" prop="totalPoint" width="100" />
<el-table-column label="标题" align="center" prop="title" />
<el-table-column label="描述" align="center" prop="description" />
<el-table-column label="业务编码" align="center" prop="bizId" /> <el-table-column label="业务编码" align="center" prop="bizId" />
<el-table-column label="业务类型" align="center" prop="bizType"> <el-table-column label="业务类型" align="center" prop="bizType">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.MEMBER_POINT_BIZ_TYPE" :value="scope.row.bizType" /> <dict-tag :type="DICT_TYPE.MEMBER_POINT_BIZ_TYPE" :value="scope.row.bizType" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="状态" align="center" prop="status">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MEMBER_POINT_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column
label="冻结时间"
align="center"
prop="freezingTime"
:formatter="dateFormatter"
/>
<el-table-column
label="解冻时间"
align="center"
prop="thawingTime"
:formatter="dateFormatter"
/>
</el-table> </el-table>
<!-- 分页 --> <!-- 分页 -->
<Pagination <Pagination
...@@ -135,9 +109,9 @@ ...@@ -135,9 +109,9 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { DICT_TYPE, getStrDictOptions, getIntDictOptions } from '@/utils/dict' import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime' import { dateFormatter } from '@/utils/formatTime'
import * as RecordApi from '@/api/point/record' import * as RecordApi from '@/api//member/point/record'
defineOptions({ name: 'PointRecord' }) defineOptions({ name: 'PointRecord' })
...@@ -149,9 +123,7 @@ const queryParams = reactive({ ...@@ -149,9 +123,7 @@ const queryParams = reactive({
pageSize: 10, pageSize: 10,
nickname: null, nickname: null,
bizType: null, bizType: null,
type: null,
title: null, title: null,
status: null,
createDate: [] createDate: []
}) })
const queryFormRef = ref() // 搜索的表单 const queryFormRef = ref() // 搜索的表单
......
...@@ -10,12 +10,23 @@ ...@@ -10,12 +10,23 @@
<el-form-item label="签到天数" prop="day"> <el-form-item label="签到天数" prop="day">
<el-input-number v-model="formData.day" :min="1" :max="7" :precision="0" /> <el-input-number v-model="formData.day" :min="1" :max="7" :precision="0" />
<el-text class="mx-1" style="margin-left: 10px" type="danger"> <el-text class="mx-1" style="margin-left: 10px" type="danger">
只允许设置1-7,默认签到7天为一个周期</el-text 只允许设置 1-7,默认签到 7 天为一个周期
> </el-text>
</el-form-item> </el-form-item>
<el-form-item label="签到分数" prop="point"> <el-form-item label="签到分数" prop="point">
<el-input-number v-model="formData.point" :precision="0" /> <el-input-number v-model="formData.point" :precision="0" />
</el-form-item> </el-form-item>
<el-form-item label="开启状态" prop="status">
<el-radio-group v-model="formData.status">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button> <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
...@@ -24,7 +35,9 @@ ...@@ -24,7 +35,9 @@
</Dialog> </Dialog>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import * as SignInConfigApi from '@/api/point/signInConfig' import * as SignInConfigApi from '@/api/member/signin/config'
import { CommonStatusEnum } from '@/utils/constants'
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
const { t } = useI18n() // 国际化 const { t } = useI18n() // 国际化
const message = useMessage() // 消息弹窗 const message = useMessage() // 消息弹窗
...@@ -92,7 +105,8 @@ const resetForm = () => { ...@@ -92,7 +105,8 @@ const resetForm = () => {
formData.value = { formData.value = {
id: undefined, id: undefined,
day: undefined, day: undefined,
point: undefined point: undefined,
status: CommonStatusEnum.ENABLE
} }
formRef.value?.resetFields() formRef.value?.resetFields()
} }
......
...@@ -21,17 +21,9 @@ ...@@ -21,17 +21,9 @@
:formatter="(_, __, cellValue) => ['第', cellValue, '天'].join(' ')" :formatter="(_, __, cellValue) => ['第', cellValue, '天'].join(' ')"
/> />
<el-table-column label="获得积分" align="center" prop="point" /> <el-table-column label="获得积分" align="center" prop="point" />
<el-table-column label="是否开启" align="center"> <el-table-column label="状态" align="center" prop="status">
<template #default="scope"> <template #default="scope">
<div> <dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
<el-switch
v-model="scope.row.enable"
@change="handleSwitchChange(scope.row, $event)"
inline-prompt
active-text="开启"
inactive-text="关闭"
/>
</div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center"> <el-table-column label="操作" align="center">
...@@ -60,11 +52,10 @@ ...@@ -60,11 +52,10 @@
<!-- 表单弹窗:添加/修改 --> <!-- 表单弹窗:添加/修改 -->
<SignInConfigForm ref="formRef" @success="getList" /> <SignInConfigForm ref="formRef" @success="getList" />
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import * as SignInConfigApi from '@/api/point/signInConfig' import * as SignInConfigApi from '@/api/member/signin/config'
import SignInConfigForm from './SignInConfigForm.vue' import SignInConfigForm from './SignInConfigForm.vue'
import { SignInConfigVO } from '@/api/point/signInConfig' import { DICT_TYPE } from '@/utils/dict'
defineOptions({ name: 'SignInConfig' }) defineOptions({ name: 'SignInConfig' })
...@@ -78,7 +69,7 @@ const list = ref([]) // 列表的数据 ...@@ -78,7 +69,7 @@ const list = ref([]) // 列表的数据
const getList = async () => { const getList = async () => {
loading.value = true loading.value = true
try { try {
const data = await SignInConfigApi.getSignInConfigPage() const data = await SignInConfigApi.getSignInConfigList()
console.log(data) console.log(data)
list.value = data list.value = data
} finally { } finally {
...@@ -105,14 +96,6 @@ const handleDelete = async (id: number) => { ...@@ -105,14 +96,6 @@ const handleDelete = async (id: number) => {
} catch {} } catch {}
} }
const handleSwitchChange = async (row, e) => {
console.log('开关状态变更,id:', row, '新状态:', e)
// 创建对象
const signInConfig: SignInConfigVO = { enable: e }
;({ id: signInConfig.id, day: signInConfig.day, point: signInConfig.point, enable: e } = row)
await SignInConfigApi.updateSignInConfig(signInConfig)
}
/** 初始化 **/ /** 初始化 **/
onMounted(() => { onMounted(() => {
getList() getList()
......
...@@ -40,15 +40,6 @@ ...@@ -40,15 +40,6 @@
<el-form-item> <el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button> <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button> <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['point:sign-in-record:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</ContentWrap> </ContentWrap>
...@@ -57,7 +48,6 @@ ...@@ -57,7 +48,6 @@
<ContentWrap> <ContentWrap>
<el-table v-loading="loading" :data="list"> <el-table v-loading="loading" :data="list">
<el-table-column label="编号" align="center" prop="id" /> <el-table-column label="编号" align="center" prop="id" />
<!-- TODO @xiaqing:展示用户昵称 -->
<el-table-column label="签到用户" align="center" prop="nickname" /> <el-table-column label="签到用户" align="center" prop="nickname" />
<el-table-column <el-table-column
label="签到天数" label="签到天数"
...@@ -65,7 +55,14 @@ ...@@ -65,7 +55,14 @@
prop="day" prop="day"
:formatter="(_, __, cellValue) => ['第', cellValue, '天'].join(' ')" :formatter="(_, __, cellValue) => ['第', cellValue, '天'].join(' ')"
/> />
<el-table-column label="获得积分" align="center" prop="point" /> <el-table-column label="获得积分" align="center" prop="point" width="100">
<template #default="scope">
<el-tag v-if="scope.row.point > 0" class="ml-2" type="success" effect="dark">
+{{ scope.row.point }}
</el-tag>
<el-tag v-else class="ml-2" type="danger" effect="dark"> {{ scope.row.point }} </el-tag>
</template>
</el-table-column>
<el-table-column <el-table-column
label="签到时间" label="签到时间"
align="center" align="center"
...@@ -81,15 +78,11 @@ ...@@ -81,15 +78,11 @@
@pagination="getList" @pagination="getList"
/> />
</ContentWrap> </ContentWrap>
<!-- 表单弹窗:添加/修改 -->
<SignInRecordForm ref="formRef" @success="getList" />
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { dateFormatter } from '@/utils/formatTime' import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download' import * as SignInRecordApi from '@/api/member/signin/record'
import * as SignInRecordApi from '@/api/point/signInRecord'
defineOptions({ name: 'SignInRecord' }) defineOptions({ name: 'SignInRecord' })
...@@ -132,21 +125,6 @@ const resetQuery = () => { ...@@ -132,21 +125,6 @@ const resetQuery = () => {
handleQuery() handleQuery()
} }
/** 导出按钮操作 */
const handleExport = async () => {
try {
// 导出的二次确认
await message.exportConfirm()
// 发起导出
exportLoading.value = true
const data = await SignInRecordApi.exportSignInRecord(queryParams)
download.excel(data, '用户签到积分.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/ /** 初始化 **/
onMounted(() => { onMounted(() => {
getList() getList()
......
<template>
<el-descriptions :column="2">
<!-- TODO @梦:要不 icon 也给加下? -->
<!-- TODO @梦:积分、成长值、等级,已经可以读取了,可以看下 -->
<el-descriptions-item>
<template #label>
<div class="cell-item"> 等级 </div>
</template>
{{ 0 }}
</el-descriptions-item>
<el-descriptions-item>
<template #label>
<div class="cell-item"> 成长值 </div>
</template>
{{ 0 }}
</el-descriptions-item>
<el-descriptions-item>
<template #label>
<div class="cell-item"> 当前积分 </div>
</template>
{{ 0 }}
</el-descriptions-item>
<el-descriptions-item>
<template #label>
<div class="cell-item"> 总积分 </div>
</template>
{{ 0 }}
</el-descriptions-item>
<el-descriptions-item>
<template #label>
<div class="cell-item"> 当前余额 </div>
</template>
{{ 0 }}
</el-descriptions-item>
<el-descriptions-item>
<template #label>
<div class="cell-item"> 支出金额 </div>
</template>
{{ 0 }}
</el-descriptions-item>
<el-descriptions-item>
<template #label>
<div class="cell-item"> 充值金额 </div>
</template>
{{ 0 }}
</el-descriptions-item>
</el-descriptions>
</template>
<script lang="ts" setup>
defineComponent({
name: 'AccountInfo'
})
</script>
<style scoped lang="scss">
.cell-item {
display: inline;
}
.cell-item::after {
content: ':';
}
</style>
<script lang="ts">
import { defineComponent } from 'vue'
export default defineComponent({
name: 'AddressList'
})
</script>
<!-- TODO @梦:可以读 address 表 -->
<template>
<div>收货地址列表</div>
</template>
<style scoped lang="scss"></style>
<script lang="ts">
import { defineComponent } from 'vue'
export default defineComponent({
name: 'BalanceList'
})
</script>
<!-- TODO @芋艿:未来实现,等周建的 -->
<template>
<div>余额列表</div>
</template>
<style scoped lang="scss"></style>
<script lang="ts" setup>
defineComponent({
name: 'CardTitle'
})
const { title } = defineProps({
title: {
type: String,
required: true
}
})
</script>
<template>
<span class="card-title">{{ title }}</span>
</template>
<style scoped lang="scss">
.card-title {
font-size: 14px;
font-weight: 600;
&::before {
content: '';
display: inline-block;
width: 3px;
height: 14px;
//background-color: #105cfb;
background: var(--el-color-primary);
position: relative;
left: -5px;
top: 8px;
border-radius: 5px;
transform: translateY(-50%);
}
}
</style>
<script lang="ts">
import { defineComponent } from 'vue'
export default defineComponent({
name: 'GrowthList'
})
</script>
<!-- TODO @梦:可以读取 member_experience_log 表 -->
<template>
<div>成长值列表</div>
</template>
<style scoped lang="scss"></style>
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="业务类型" prop="bizType">
<el-select
v-model="queryParams.bizType"
placeholder="请选择业务类型"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.MEMBER_POINT_BIZ_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="积分标题" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入积分标题"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="获得时间" prop="createDate">
<el-date-picker
v-model="queryParams.createDate"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery">
<Icon icon="ep:search" class="mr-5px" />
搜索
</el-button>
<el-button @click="resetQuery">
<Icon icon="ep:refresh" class="mr-5px" />
重置
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list">
<el-table-column label="编号" align="center" prop="id" width="180" />
<el-table-column
label="获得时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180"
/>
<el-table-column label="用户" align="center" prop="nickname" width="200" />
<el-table-column label="获得积分" align="center" prop="point" width="100">
<template #default="scope">
<el-tag v-if="scope.row.point > 0" class="ml-2" type="success" effect="dark">
+{{ scope.row.point }}
</el-tag>
<el-tag v-else class="ml-2" type="danger" effect="dark"> {{ scope.row.point }} </el-tag>
</template>
</el-table-column>
<el-table-column label="总积分" align="center" prop="totalPoint" width="100" />
<el-table-column label="标题" align="center" prop="title" />
<el-table-column label="描述" align="center" prop="description" />
<el-table-column label="业务编码" align="center" prop="bizId" />
<el-table-column label="业务类型" align="center" prop="bizType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MEMBER_POINT_BIZ_TYPE" :value="scope.row.bizType" />
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
</template>
<script lang="ts" setup>
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import * as RecordApi from '@/api//member/point/record'
defineOptions({ name: 'PointList' })
const loading = ref(true) // 列表的加载中
const total = ref(0) // 列表的总页数
const list = ref([]) // 列表的数据
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
bizType: undefined,
title: null,
createDate: [],
userId: null
})
const queryFormRef = ref() // 搜索的表单
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await RecordApi.getRecordPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
// TODO @梦:改成 userId 哈
const { memberId } = defineProps({
memberId: {
type: Number,
required: true
}
})
/** 初始化 **/
onMounted(() => {
queryParams.userId = memberId
getList()
})
</script>
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="签到用户" prop="nickname">
<el-input
v-model="queryParams.nickname"
placeholder="请输入签到用户"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="签到天数" prop="day">
<el-input
v-model="queryParams.day"
placeholder="请输入签到天数"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="签到时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list">
<el-table-column label="编号" align="center" prop="id" />
<el-table-column label="签到用户" align="center" prop="nickname" />
<el-table-column
label="签到天数"
align="center"
prop="day"
:formatter="(_, __, cellValue) => ['第', cellValue, '天'].join(' ')"
/>
<el-table-column label="获得积分" align="center" prop="point" width="100">
<template #default="scope">
<el-tag v-if="scope.row.point > 0" class="ml-2" type="success" effect="dark">
+{{ scope.row.point }}
</el-tag>
<el-tag v-else class="ml-2" type="danger" effect="dark"> {{ scope.row.point }} </el-tag>
</template>
</el-table-column>
<el-table-column
label="签到时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
/>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
</template>
<script lang="ts" setup>
import { dateFormatter } from '@/utils/formatTime'
import * as SignInRecordApi from '@/api/member/signin/record'
defineOptions({ name: 'SignList' })
const loading = ref(true) // 列表的加载中
const total = ref(0) // 列表的总页数
const list = ref([]) // 列表的数据
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
nickname: null,
day: null,
createTime: []
})
const queryFormRef = ref() // 搜索的表单
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await SignInRecordApi.getSignInRecordPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
// TODO @梦:改成 userId 哈
const { memberId } = defineProps({
memberId: {
type: Number,
required: true
}
})
/** 初始化 **/
onMounted(() => {
queryParams.userId = memberId
getList()
})
</script>
<template>
<div v-loading="loading">
<el-row :gutter="10" class="detail-info-warp">
<!-- 左上角:基本信息 -->
<el-col :span="14" class="detail-info-item">
<el-card shadow="never">
<template #header>
<div class="card-header">
<!-- TODO @梦:如果不要小蓝线,是不是直接用 el-card 自带的 title 即可? -->
<CardTitle title="基本信息" />
<el-button
v-if="user.id"
type="primary"
size="small"
text
@click="openForm('update', user.id)"
>
编辑
</el-button>
</div>
</template>
<el-row>
<el-col :span="4">
<ElAvatar shape="square" :size="140" :src="user.avatar || undefined" />
</el-col>
<el-col :span="20">
<el-descriptions :column="2">
<el-descriptions-item>
<template #label>
<div class="cell-item">
<Icon icon="ep:user" />
用户名
</div>
</template>
{{ user.name || '空' }}
</el-descriptions-item>
<el-descriptions-item>
<template #label>
<div class="cell-item">
<Icon icon="ep:user" />
昵称
</div>
</template>
{{ user.nickname }}
</el-descriptions-item>
<el-descriptions-item label="手机号">
<template #label>
<div class="cell-item">
<Icon icon="ep:phone" />
手机号
</div>
</template>
{{ user.mobile }}
</el-descriptions-item>
<el-descriptions-item>
<template #label>
<div class="cell-item">
<Icon icon="fa:mars-double" />
性别
</div>
</template>
<dict-tag :type="DICT_TYPE.SYSTEM_USER_SEX" :value="user.sex" />
</el-descriptions-item>
<el-descriptions-item>
<template #label>
<div class="cell-item">
<Icon icon="ep:location" />
所在地
</div>
</template>
<!-- TODO @梦:这里后端返回的时候,要返回 areaName -->
{{ user.areaId }}
</el-descriptions-item>
<el-descriptions-item>
<template #label>
<div class="cell-item">
<Icon icon="ep:position" />
注册 IP
</div>
</template>
{{ user.registerIp }}
</el-descriptions-item>
<el-descriptions-item>
<template #label>
<div class="cell-item">
<Icon icon="fa:birthday-cake" />
生日
</div>
</template>
{{ user.birthday ? formatDate(user.birthday) : '空' }}
</el-descriptions-item>
<el-descriptions-item>
<template #label>
<div class="cell-item">
<Icon icon="ep:calendar" />
注册时间
</div>
</template>
{{ user.createTime ? formatDate(user.createTime) : '空' }}
</el-descriptions-item>
<el-descriptions-item>
<template #label>
<div class="cell-item">
<Icon icon="ep:calendar" />
最后登录时间
</div>
</template>
{{ user.loginDate ? formatDate(user.loginDate) : '空' }}
</el-descriptions-item>
</el-descriptions>
</el-col>
</el-row>
</el-card>
</el-col>
<!-- 右上角:账户信息 -->
<el-col :span="10" class="detail-info-item">
<el-card shadow="never">
<template #header>
<CardTitle title="账户信息" />
</template>
<AccountInfo />
</el-card>
</el-col>
<!-- 下边:账户明细 -->
<!-- TODO 芋艿:【收货地址】【订单管理】【售后管理】【收藏记录】【优惠劵】 -->
<el-card header="账户明细" style="width: 100%; margin-top: 20px" shadow="never">
<template #header>
<CardTitle title="账户明细" />
</template>
<el-tabs v-model="activeName">
<el-tab-pane label="积分" name="point">
<PointList v-if="user.id" :member-id="user.id" />
</el-tab-pane>
<el-tab-pane label="签到" name="sign">
<SignList v-if="user.id" :member-id="user.id" />
</el-tab-pane>
<el-tab-pane label="成长值" name="third">成长值(WIP)</el-tab-pane>
<el-tab-pane label="余额" name="fourth">余额(WIP)</el-tab-pane>
</el-tabs>
</el-card>
</el-row>
</div>
<!-- 表单弹窗:添加/修改 -->
<UserForm ref="formRef" @success="getUserData(user.id)" />
</template>
<script setup lang="ts">
// TODO @梦:组件对应的 vue,都大写
import PointList from '@/views/member/user/components/point-list.vue'
import SignList from '@/views/member/user/components/sign-list.vue'
import CardTitle from '@/views/member/user/components/card-title.vue'
// TODO @梦:参考别的模块,UserApi 这样去引用
import { getUser, UserBaseInfoVO } from '@/api/member/user'
import { formatDate } from '@/utils/formatTime'
import { DICT_TYPE } from '@/utils/dict'
import UserForm from '@/views/member/user/UserForm.vue'
// TODO @梦:把用户信息,也抽成一个组件,类似 AccountInfo
import AccountInfo from '@/views/member/user/components/account-info.vue'
defineOptions({ name: 'MemberDetail' })
const activeName = ref('point') // 账户明细 选中的 tabs
const loading = ref(true) // 加载中
let user = ref<UserBaseInfoVO>({
areaId: undefined,
avatar: undefined,
birthday: undefined,
createTime: undefined,
id: undefined,
loginDate: undefined,
loginIp: '',
mark: '',
mobile: '',
name: '',
nickname: '',
password: null,
registerIp: undefined,
sex: 0,
status: 0
})
/** 获得用户 */
const getUserData = async (id: number) => {
loading.value = true
try {
user.value = await getUser(id)
} finally {
loading.value = false
}
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 初始化 */
const route = useRoute()
const router = useRouter()
// TODO @梦:改成 id 路径参数,而不是 query
// TODO @梦:会员列表,把【详情】按钮加上哈
const member_id = route.query.member_id as number
onMounted(() => {
if (!member_id) {
// TODO
ElMessage.warning('参数错误,会员编号不能为空!')
router.back()
return
}
getUserData(member_id)
})
</script>
<style scoped lang="css">
/** TODO 这 3 个 css 貌似没用? */
.detail-info-item:first-child {
padding-left: 0 !important;
}
/* first-child 不生效有没有大佬给看下q.q */
.detail-info-item:nth-child(2) {
padding-right: 0 !important;
}
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
}
.cell-item {
display: inline;
}
/** TODO 下面 css 貌似没啥用? */
.cell-item::after {
content: ':';
}
</style>
...@@ -84,10 +84,12 @@ ...@@ -84,10 +84,12 @@
:show-overflow-tooltip="false" :show-overflow-tooltip="false"
> >
<template #default="scope"> <template #default="scope">
<el-tag v-for="(tagName, index) in scope.row.tagNames" :key="index">{{ tagName }}</el-tag> <el-tag v-for="(tagName, index) in scope.row.tagNames" :key="index" class="mr-5px">
{{ tagName }}
</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="积分" align="center" width="100px" /> <el-table-column label="积分" align="center" prop="point" width="100px" />
<el-table-column label="状态" align="center" prop="status" width="100px"> <el-table-column label="状态" align="center" prop="status" width="100px">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" /> <dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
class="!w-240px" class="!w-240px"
> >
<el-option <el-option
v-for="dict in getStrDictOptions(DICT_TYPE.PAY_CHANNEL_CODE_TYPE)" v-for="dict in getStrDictOptions(DICT_TYPE.PAY_CHANNEL_CODE)"
:key="dict.value" :key="dict.value"
:label="dict.label" :label="dict.label"
:value="dict.value" :value="dict.value"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment