57 Commits

Author SHA1 Message Date
Ryan Ran
af85493863 fix(buyer端升级node版本): 添加 .npmrc 和 .yarnrc 文件以支持引擎配置,更新 package.json 中的 NODE_OPTIONS 环境变量,替换多个组件中的 /deep/ 选择器为 ::v-deep,优化依赖管理,确保兼容性,兼容node16版本 2025-09-30 13:33:22 +08:00
Ryan Ran
ae85f0d612 fix(manager端升级node版本): 更新多个组件的样式,替换 /deep/ 选择器为 ::v-deep,替换 node-sass 为 sass,优化依赖管理和兼容性,兼容node16版本 2025-09-30 11:38:38 +08:00
Ryan Ran
16c4a78e29 fix(兼容性): 更新 seller 项目的 package.json 和 README.md,添加 NODE_OPTIONS 环境变量以支持 Node.js 版本 20 和 18 的运行,详细说明各版本的兼容性和安装要求,优化文档以提升用户体验。 2025-09-30 11:04:12 +08:00
Ryan Ran
8fb87aa64d feat(seller端升级node版本): 添加 .npmrc 和 .yarnrc 文件以支持引擎配置,更新 package.json 中的引擎要求并替换 node-sass 为 sass,优化依赖管理和兼容性,兼容node16版本 2025-09-29 18:26:52 +08:00
Ryan Ran
c5d675b6d2 fix(商品规格): 优化规格值处理逻辑,确保在规格值为空时移除对应行并更新表格数据,增强用户体验 2025-09-23 19:17:24 +08:00
Ryan Ran
f4d06b2d7b fix(商品审核): 更新审核功能,添加请求头以支持表单数据提交,提升接口兼容性 2025-09-23 14:14:43 +08:00
Ryan Ran
bb610a7cd8 fix(商品审核): 优化审核功能,使用FormData处理请求数据,提升代码可读性和维护性 2025-09-23 14:01:53 +08:00
misworga831
bb864e72b3 fix(商品规格): 优化规格值编辑逻辑,避免空值提交并清理错误提示 2025-09-15 21:45:47 +09:00
misworga831
c6c4797d87 fix(商品规格): 修复规格值过滤逻辑,确保移除空值并更新表格数据 2025-09-15 21:03:33 +09:00
misworga831
25fed42395 fix(商品规格): 添加内联错误提示,优化规格值验证逻辑 2025-09-15 16:04:48 +09:00
misworga831
66c4676493 fix(商品规格): 更新规格值提示信息,增加用户操作指导 2025-09-12 22:35:03 +09:00
misworga831
f8747b5d5d fix(商品操作): 优化模板和方法中的代码格式,提升可读性 2025-09-12 22:19:38 +09:00
misworga831
0eb58d4b8a fix(商品规格): 修复规格值编辑逻辑,避免对未定义索引的访问 2025-09-11 19:52:35 +09:00
pikachu1995@126.com
7b30ea343f feat(商品管理): 添加商品复制功能并优化批量操作
- 在商品操作页面添加复制商品功能,通过copyId参数区分复制操作
- 复制商品时自动清除原商品ID确保提交为新商品
- 优化批量操作按钮功能,包括上架、下架、删除和设置物流模板
- 移除未使用的批量规格更新功能
- 调整商品列表操作按钮布局,将复制功能加入操作列
2025-09-09 17:04:58 +08:00
pikachu1995@126.com
7db8484a7c feat(售后订单): 添加售后数量统计功能并显示在标签页
- 在manager和seller端添加获取售后数量统计的API接口
- 修改售后订单页面,显示各状态对应的数量统计
- 新增计算属性serviceStatusWithCount动态生成带数量的标签页
- 在初始化、搜索和状态切换时调用统计接口更新数据
2025-08-29 11:36:45 +08:00
pikachu1995@126.com
78b058009b feat(订单/商品): 添加数量统计功能并优化列表展示
- 在订单和商品管理页面添加数量统计功能
- 优化订单和商品列表的筛选和展示样式
- 统一API接口参数传递方式
- 移除重复代码和无用代码
2025-08-29 09:40:36 +08:00
pikachu1995@126.com
05abad3905 feat(会员管理): 新增会员ID搜索和头像显示功能
refactor(订单管理): 移除表格边框并优化分页选项

feat(售后订单): 添加关键字搜索字段并移除二维码功能

feat(商品管理): 新增批量操作和审核功能,优化商品列表展示

style: 移除多余的margin-top样式
2025-08-27 16:15:11 +08:00
pikachu1995@126.com
ad178b1806 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2025-08-27 10:12:05 +08:00
pikachu1995@126.com
075c20ae41 feat(订单列表): 新增搜索字段和支付方式筛选功能
- 添加关键字、商品名称、收货人和支付方式搜索字段
- 增加支付方式显示列和筛选功能
- 调整默认分页大小为20并增加100条选项
- 优化订单状态筛选逻辑
2025-08-27 10:11:40 +08:00
Ryan Ran
56420bd4d0 feat: 添加pageClientType属性以支持页面类型设置
在`renovation.vue`文件中,新增`pageClientType`属性并设置为'PC',以便于在页面数据中区分客户端类型,提升页面功能的灵活性。
2025-08-26 10:40:19 +08:00
pikachu1995@126.com
a18fc729c0 style(oss-manage): 调整表单元素宽度并优化布局结构
将日期选择器和输入框的宽度从200px统一调整为240px,提升表单元素的一致性
拆分操作区域到单独的Card组件中,改善页面布局结构
2025-08-21 16:41:46 +08:00
pikachu1995@126.com
099941a54e style: 统一输入框和选择器宽度为240px并优化卡片布局
- 将多处输入框和选择器的宽度从200px调整为240px
- 优化卡片布局结构,添加分割卡片提升可读性
- 移除部分冗余的刷新按钮和样式代码
- 调整日期选择器等表单元素的宽度为240px
2025-08-21 16:41:27 +08:00
Ryan Ran
3867d51d92 fix: 移除管理端会员列表,回收站username字段,优化成员列表组件的属性结构 2025-08-13 18:18:41 +08:00
Ryan Ran
f1be18b7e3 添加vue-virtual-scroller依赖并在消息视图中实现虚拟滚动功能,以优化对话列表的渲染性能。同时,为managerseller项目添加minimatch依赖项的解析版本以解决潜在的版本冲突。 2025-07-15 16:16:42 +08:00
Ryan Ran
ef46380f9e 添加minimatch依赖项的解析版本以解决潜在的版本冲突 2025-07-04 17:16:47 +08:00
chc
d711273cf0 商品发布参数项校验无法some问题 2025-03-12 10:28:59 +08:00
chc
5e7cf2d679 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2025-03-11 19:09:39 +08:00
chc
11319ba21f 分类参数必填校验 2025-03-11 19:09:05 +08:00
Chopper711
b4a706820e ### feat: 优化优惠折扣输入组件 (master)
- 将`Input`组件替换为`InputNumber`组件,以确保输入的优惠折扣
  在0.1到9.9之间,并支持一位小数。
- 在`full-discount-add.vue`和`full-discount-detail.vue`文件中,
  更新了`FormItem`组件的`优惠折扣`输入逻辑。
- 在`coupon-publish.vue`文件中,更新了描述文本以强调输入
  范围和格式。
- 在`coupon.vue`文件中,修复了优惠券类型判断逻辑,增加了
  "DISCOUNT"类型和未知类型的处理。
2025-02-21 17:34:58 +08:00
Chopper711
376a3223dc fix: 优化积分商品添加页面和对账单详情页面的功能 (master)
- 移除积分商品添加页面的冗余标题
- 将兑换时间选择器替换为活动时间范围选择器
- 简化验证规则,使用rangeTime替代单独的开始和结束时间
- 调整批量删除按钮和其他按钮的样式格式
- 在对账单详情页面添加删除消息提示框功能
2025-02-21 16:09:14 +08:00
Chopper711
a85ec69549 fix: 消息提示框以及消息点击查看后需要标记已读按钮优化 2025-02-20 15:48:19 +08:00
Chopper711
ebf4d6d3eb Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2025-02-20 14:57:21 +08:00
Chopper711
2ccd8265b9 fix: 消息提示框以及消息点击查看后需要标记已读按钮优化 2025-02-20 14:52:53 +08:00
chc
fb1671d062 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2025-02-17 13:41:42 +08:00
chc
95e37df2ec 电子面单物流选中错误问题 2025-02-17 13:41:05 +08:00
pikachu1995@126.com
cfde72f1ab Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2025-02-11 15:43:20 +08:00
pikachu1995@126.com
efc778acbc 微信支付配置,添加配置使用公钥还是证书 2025-02-11 15:43:09 +08:00
misworga831
37384ebadd fix: 优化商品编辑 2025-01-21 13:53:07 +08:00
misworga831
9a7aee7e97 fix: 优化商品编辑 2025-01-20 18:43:21 +08:00
chc
1a56534d28 提现设置增加校验 2025-01-20 18:12:41 +08:00
chc
79e7e5f087 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2025-01-17 17:42:58 +08:00
chc
aea03cf975 支付设置选中状态错误问题 2025-01-17 17:42:49 +08:00
pikachu1995@126.com
8ef6f944dc 微信支付配置,添加微信支付公钥 2025-01-08 16:14:14 +08:00
pikachu1995@126.com
e18d243961 优化微信支付配置,不读取密钥文件,改成读配置文件 2024-12-27 11:01:53 +08:00
chc
765b633cea Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2024-12-25 10:35:50 +08:00
chc
9c402a3878 1.查看物流信息
2.直播图片选择器修改
3.管理端隐藏会员详情
2024-12-25 10:35:40 +08:00
Chopper711
86426b087a feat: 使用InputNumber组件替换折扣输入框 (master)
在coupon-publish.vue中,将折扣输入框从Input组件更改为
InputNumber组件,以便更好地控制折扣值的输入范围。
2024-12-23 11:51:05 +08:00
chc
c5aaa2f3e2 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2024-12-02 18:05:51 +08:00
chc
cc59bb6094 售后实际退款金额显示错误问题 2024-12-02 18:05:43 +08:00
Ryan Ran
5662da1210 fix: 修改商家端分销商品列表点击链接商品不展示问题 2024-11-25 10:43:49 +08:00
Ryan Ran
863725d3ba 优化管理端活动楼层装修 2024-11-11 15:23:32 +08:00
Yer11214
b1acfbdd4b !40 修复了行政地区切换验证状态没更新的问题
Merge pull request !40 from 孟锴/feature/mengkai-master-branch
2024-10-14 07:34:03 +00:00
mengkai
001f9c3f30 修复了行政地区切换验证状态没更新的问题 2024-10-14 11:26:26 +08:00
Yer11214
8d4df4b66e Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2024-10-07 22:26:15 +08:00
Yer11214
604447508a fix: oss选择图片不展示报错bug 2024-10-07 22:26:13 +08:00
misworga831
6f30949620 fix: 移动端楼层装修促销活动移除优惠券.pc端楼层装修快捷导航外部链接无法填写问题 2024-09-23 21:18:27 +08:00
chc
10e8e82fe4 增加部分发货状态 2024-09-18 15:25:04 +08:00
168 changed files with 2648 additions and 1541 deletions

1
buyer/.npmrc Normal file
View File

@@ -0,0 +1 @@
engine-strict=false

1
buyer/.yarnrc Normal file
View File

@@ -0,0 +1 @@
--ignore-engines true

View File

@@ -3,9 +3,12 @@
"version": "1.0.0", "version": "1.0.0",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "vue-cli-service serve", "serve": "NODE_OPTIONS=--openssl-legacy-provider vue-cli-service serve",
"serve": "vue-cli-service serve", "build": "NODE_OPTIONS=--openssl-legacy-provider vue-cli-service build",
"build": "vue-cli-service build" "dev": "NODE_OPTIONS=--openssl-legacy-provider vue-cli-service serve"
},
"engines": {
"node": ">=14"
}, },
"dependencies": { "dependencies": {
"@amap/amap-jsapi-loader": "0.0.7", "@amap/amap-jsapi-loader": "0.0.7",
@@ -15,11 +18,10 @@
"less": "^2.7.0", "less": "^2.7.0",
"less-loader": "^5.0.0", "less-loader": "^5.0.0",
"mv-count-down": "^0.1.15", "mv-count-down": "^0.1.15",
"node-sass": "^4.14.1", "sass": "^1.63.6",
"postcss-loader": "^7.0.1", "postcss-loader": "^4.3.0",
"psl": "^1.8.0", "psl": "^1.8.0",
"qs": "^6.9.4", "qs": "^6.9.4",
"sass-loader": "^7.3.1",
"uuid": "^8.3.2", "uuid": "^8.3.2",
"view-design": "^4.3.2", "view-design": "^4.3.2",
"vue": "^2.6.11", "vue": "^2.6.11",
@@ -32,7 +34,7 @@
"devDependencies": { "devDependencies": {
"@vue/cli-service": "~4.5.0", "@vue/cli-service": "~4.5.0",
"compression-webpack-plugin": "^5.0.0", "compression-webpack-plugin": "^5.0.0",
"sass-loader": "^7.3.1", "sass-loader": "^10.4.1",
"uglifyjs-webpack-plugin": "^2.2.0", "uglifyjs-webpack-plugin": "^2.2.0",
"vue-template-compiler": "^2.6.11" "vue-template-compiler": "^2.6.11"
}, },
@@ -40,5 +42,10 @@
"> 1%", "> 1%",
"last 2 versions", "last 2 versions",
"not dead" "not dead"
] ],
"resolutions": {
"minimatch": "^3.1.2",
"node-sass": "npm:sass@^1.63.6",
"@achrinza/node-ipc": "9.2.2"
}
} }

View File

@@ -173,7 +173,7 @@ export default {
border-radius: 18.9px; border-radius: 18.9px;
/deep/ .ivu-input.ivu-input-large { ::v-deep .ivu-input.ivu-input-large {
border: 1.4px solid $theme_color; border: 1.4px solid $theme_color;
box-sizing: border-box; box-sizing: border-box;
border-radius: 19.6px; border-radius: 19.6px;
@@ -188,7 +188,7 @@ export default {
} }
} }
/deep/ .ivu-input-group-append { ::v-deep .ivu-input-group-append {
border-radius: 19.6px !important; border-radius: 19.6px !important;
cursor: pointer; cursor: pointer;
box-sizing: border-box; box-sizing: border-box;

View File

@@ -113,12 +113,12 @@ export default {
} }
} }
/deep/ .ivu-card, .ivu-card-head, ._Card { ::v-deep .ivu-card, .ivu-card-head, ._Card {
margin-bottom: 20px; margin-bottom: 20px;
@include white_background_color(); @include white_background_color();
} }
/deep/ .ivu-card-head { ::v-deep .ivu-card-head {
position: relative; position: relative;
padding: 0 14px; padding: 0 14px;
height: 50px; height: 50px;
@@ -140,7 +140,7 @@ export default {
cursor: pointer; cursor: pointer;
} }
/deep/ .ivu-card-body { ::v-deep .ivu-card-body {
padding: 0 !important; padding: 0 !important;
display: none; display: none;
} }

View File

@@ -147,11 +147,11 @@ export default {
justify-content: center; justify-content: center;
flex-direction: column; flex-direction: column;
} }
/deep/.popup .ivu-drawer-body{ ::v-deep.popup .ivu-drawer-body{
padding: 0!important; padding: 0!important;
background-color: #eee; background-color: #eee;
} }
/deep/.popup .ivu-drawer-wrap{ ::v-deep.popup .ivu-drawer-wrap{
z-index: 3001; z-index: 3001;
} }
</style> </style>

View File

@@ -326,7 +326,7 @@ export default {
.item-intro-img { .item-intro-img {
width: 100%; width: 100%;
min-height: 300px; min-height: 300px;
/deep/ img{ ::v-deep img{
margin:0 auto; margin:0 auto;
} }
} }
@@ -472,7 +472,7 @@ export default {
.ivu-tabs-ink-bar { .ivu-tabs-ink-bar {
background-color: $theme_color !important; background-color: $theme_color !important;
} }
/deep/.ivu-tabs-bar{ ::v-deep.ivu-tabs-bar{
border: none; border: none;
} }
.item-tabs > .ivu-tabs > .ivu-tabs-bar .ivu-tabs-tab{ .item-tabs > .ivu-tabs > .ivu-tabs-bar .ivu-tabs-tab{

View File

@@ -84,10 +84,10 @@ export default {
border-top: 1.4px solid #e2e2e2; border-top: 1.4px solid #e2e2e2;
} }
&:hover { &:hover {
/deep/ .goods-name { ::v-deep .goods-name {
color: $theme_color; color: $theme_color;
} }
/deep/ .goods-desc { ::v-deep .goods-desc {
color: $theme_color; color: $theme_color;
} }
} }

View File

@@ -17,6 +17,10 @@ export const orderStatusList = [
name: '待发货', name: '待发货',
status: 'UNDELIVERED' status: 'UNDELIVERED'
}, },
{
name: '部分发货',
status: 'PARTS_DELIVERED'
},
{ {
name: '已发货', name: '已发货',
status: 'DELIVERED' status: 'DELIVERED'

View File

@@ -54,7 +54,7 @@ export default {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
/deep/ .ivu-col-span-2, .ivu-col-span-4 { ::v-deep .ivu-col-span-2, .ivu-col-span-4 {
text-align: center; text-align: center;
color: $theme_color; color: $theme_color;
} }
@@ -71,7 +71,7 @@ export default {
border-bottom: 1px solid $border_color; border-bottom: 1px solid $border_color;
padding: 16px 0; padding: 16px 0;
/deep/ .ivu-col { ::v-deep .ivu-col {
padding: 8px 0; padding: 8px 0;
} }

View File

@@ -584,7 +584,7 @@ export default {
margin-left: 25px; margin-left: 25px;
margin-top: 5px margin-top: 5px
} }
/deep/ .ivu-alert-message { ::v-deep .ivu-alert-message {
p { p {
margin: 4px 0; margin: 4px 0;
} }

View File

@@ -604,22 +604,21 @@ table {
.layui-layer-wrap > .div-express-log { .layui-layer-wrap > .div-express-log {
max-height: 300px; max-height: 300px;
} }
/deep/ .layui-layer-wrap > .div-express-log::-webkit-scrollbar{ ::v-deep .layui-layer-wrap > .div-express-log::-webkit-scrollbar{
width: 1px; width: 1px;
height: 5px; height: 5px;
} }
/deep/ .layui-layer-wrap > .div-express-log::-webkit-scrollbar-thumb{ ::v-deep .layui-layer-wrap > .div-express-log::-webkit-scrollbar-thumb{
border-radius: 1em; border-radius: 1em;
background-color: rgba(50,50,50,.3); background-color: rgba(50,50,50,.3);
} }
/deep/ .layui-layer-wrap > .div-express-log::-webkit-scrollbar-track{ ::v-deep .layui-layer-wrap > .div-express-log::-webkit-scrollbar-track{
border-radius: 1em; border-radius: 1em;
background-color: rgba(50,50,50,.1); background-color: rgba(50,50,50,.1);
} }
.div-express-log { .div-express-log {
max-height: 300px;
border: solid 1px #e7e7e7; border: solid 1px #e7e7e7;
background: #fafafa; background: #fafafa;
overflow-y: auto; overflow-y: auto;

View File

@@ -70,7 +70,7 @@ module.exports = {
loaderOptions: { loaderOptions: {
sass: { sass: {
data: `@import "@/assets/styles/global.scss";` //全局加载scss additionalData: `@import "@/assets/styles/global.scss";` //全局加载scss
}, },
// 向 CSS 相关的 loader 传递选项 // 向 CSS 相关的 loader 传递选项
less: { less: {

View File

@@ -24,6 +24,7 @@
"vue-cropper": "^0.5.5", "vue-cropper": "^0.5.5",
"vue-prism-editor": "^0.5.1", "vue-prism-editor": "^0.5.1",
"vue-router": "^3.4.9", "vue-router": "^3.4.9",
"vue-virtual-scroller": "^1.1.2",
"vuex": "^3.5.1" "vuex": "^3.5.1"
}, },
"devDependencies": { "devDependencies": {

View File

@@ -33,6 +33,11 @@ Object.keys(filters).forEach((key) => {
Vue.filter(key, filters[key]); Vue.filter(key, filters[key]);
}); });
import VueVirtualScroller from 'vue-virtual-scroller'
import 'vue-virtual-scroller/dist/vue-virtual-scroller.css'
Vue.component('RecycleScroller', VueVirtualScroller.RecycleScroller)
// 引入自定义全局css // 引入自定义全局css
import '@/assets/css/global.less' import '@/assets/css/global.less'

View File

@@ -65,9 +65,14 @@
> --> > -->
</p> </p>
<!-- 对话列表 --> <!-- 对话列表 -->
<template v-if="loadStatus === 1"> <RecycleScroller
<div v-for="(item, index) in userTalkItem" :key="item.id" class="talk-item pointer" :item-size="64"
:class="{ active: activeIndex == index }" @click="clickTab(item.userId, item, index)"> :items="userTalkItem"
:prerender="10"
v-slot="{ item, index }"
>
<div v-bind:key="item.id" class="talk-item pointer" :class="{ active: activeIndex == index }" @click="clickTab(item.userId, item, index)">
<div class="avatar-box"> <div class="avatar-box">
<face :text="item.face" v-if="item.face"></face> <face :text="item.face" v-if="item.face"></face>
<face-null :text="item.name" v-else></face-null> <face-null :text="item.name" v-else></face-null>
@@ -79,9 +84,7 @@
<div class="title"> <div class="title">
<div class="card-name"> <div class="card-name">
<p class="nickname"> <p class="nickname">
{{ {{ item.remark_name ? item.remark_name : item.name }}
item.remark_name ? item.remark_name : item.name
}}
</p> </p>
<div v-show="item.unread" class="larkc-tag"> <div v-show="item.unread" class="larkc-tag">
{{ item.unread }}条未读 {{ item.unread }}条未读
@@ -89,11 +92,9 @@
<div v-show="item.is_top" class="larkc-tag top"> <div v-show="item.is_top" class="larkc-tag top">
TOP TOP
</div> </div>
<div v-show="item.is_robot" class="larkc-tag top"> <div v-show="item.is_robot" class="larkc-tag top">
BOT BOT
</div> </div>
<div v-show="item.talk_type == 2" class="larkc-tag group"> <div v-show="item.talk_type == 2" class="larkc-tag group">
群组 群组
</div> </div>
@@ -111,9 +112,7 @@
<span v-if="item.lastMessageType === 'ORDER'">[订单链接]</span> <span v-if="item.lastMessageType === 'ORDER'">[订单链接]</span>
</div> </div>
<div class="content"> <div class="content">
<template v-if=" <template v-if="index_name != item.index_name && item.draft_text">
index_name != item.index_name && item.draft_text
">
<span class="draft-color">[草稿]</span> <span class="draft-color">[草稿]</span>
<span>{{ item.draft_text }}</span> <span>{{ item.draft_text }}</span>
</template> </template>
@@ -124,13 +123,12 @@
</span> </span>
<span v-else>[群消息]</span> <span v-else>[群消息]</span>
</template> </template>
<span>{{ item.msg_text }}</span> <span>{{ item.msg_text }}</span>
</template> </template>
</div> </div>
</div> </div>
</div> </div>
</template> </RecycleScroller>
</el-main> </el-main>
</el-scrollbar> </el-scrollbar>
</el-container> </el-container>
@@ -151,6 +149,8 @@
</div> </div>
</template> </template>
<script> <script>
import { RecycleScroller } from 'vue-virtual-scroller'
import 'vue-virtual-scroller/dist/vue-virtual-scroller.css'
import { mapGetters, mapState } from "vuex"; import { mapGetters, mapState } from "vuex";
import MainLayout from "@/views/layout/MainLayout"; import MainLayout from "@/views/layout/MainLayout";
import WelcomeModule from "@/components/layout/WelcomeModule"; import WelcomeModule from "@/components/layout/WelcomeModule";
@@ -179,6 +179,7 @@ export default {
UserSearch, UserSearch,
OtherLink, OtherLink,
WelcomeModule, WelcomeModule,
RecycleScroller
}, },
data () { data () {
return { return {

1
manager/.npmrc Normal file
View File

@@ -0,0 +1 @@
engine-strict=false

1
manager/.yarnrc Normal file
View File

@@ -0,0 +1 @@
--ignore-engines true

View File

@@ -1,29 +1,90 @@
# LILISHOP-UI # LILISHOP-UI
## Project setup # LiliShop UI Manager 的 Node.js 版本兼容性
```
npm install
```
### Compiles and hot-reloads for development 本文档概述了 LiliShop UI seller 项目的 Node.js 版本兼容性。
```
npm run serve
```
### Compiles and minifies for production ## 摘要
```
npm run build
```
### Run your tests | Node.js 版本 | npm 版本 | 兼容性 | 备注 |
``` |-----------------|-------------|--------------|-------|
npm run test | v20.13.1 (当前 LTS) | 10.8.0 | ✅ 需要解决方案 | 安装需要 `--legacy-peer-deps` 参数,运行需要 `NODE_OPTIONS=--openssl-legacy-provider` |
``` | v18.20.8 (LTS) | 10.8.2 | ✅ 需要解决方案 | 安装需要 `--legacy-peer-deps` 参数,运行需要 `NODE_OPTIONS=--openssl-legacy-provider` |
| v16.20.2 (LTS) | 8.19.4 | ✅ 有轻微警告 | 安装需要 `--legacy-peer-deps` 参数,整体运行良好 |
| v14.x (最低版本) | - | ❌ 不兼容 | 无法在 ARM64 架构上安装 (M系列 Mac) |
## 详细发现
### Node.js v20.13.1 (当前 LTS)
- **安装**: 使用 `--legacy-peer-deps` 参数可以正常安装
- **开发服务器**: 需要设置 `NODE_OPTIONS=--openssl-legacy-provider` 环境变量
- **构建**: 需要设置 `NODE_OPTIONS=--openssl-legacy-provider` 环境变量
- **问题**:
- vue-awesome-swiper 和 swiper 之间的依赖冲突
- 由于 Node.js v20 移除了旧版加密算法导致的 OpenSSL 相关错误
- 部分包报告不支持的引擎警告
- **验证**: 已成功构建并验证 dist/index.html 可以正常运行
### Node.js v18.20.8 (LTS)
- **安装**: 使用 `--legacy-peer-deps` 参数可以正常安装
- **开发服务器**: 需要设置 `NODE_OPTIONS=--openssl-legacy-provider` 环境变量
- **构建**: 需要设置 `NODE_OPTIONS=--openssl-legacy-provider` 环境变量
- **问题**:
- 部分包报告不支持的引擎警告 (v-click-outside-x, @achrinza/node-ipc)
- **验证**: 已成功构建并验证 dist/index.html 可以正常运行
### Node.js v16.20.2 (LTS)
- **安装**: 使用 `--legacy-peer-deps` 参数可以正常安装
- **开发服务器**: 无需额外参数即可运行
- **构建**: 可以正常构建
- **问题**:
- v-click-outside-x 包有轻微警告 (需要 npm 6.4.1)
### Node.js v14.x
- **安装**: 在 ARM64 架构 (M系列 Mac) 上无法安装
- **开发服务器**: 未测试
- **构建**: 可以正常构建
- **问题**:
- Node.js v14 没有 ARM64 架构的二进制文件
## 建议
1. **最佳版本**: Node.js v16.20.2 配合 npm 8.19.4
- 与项目依赖最兼容
- 需要的解决方案最少
- 性能稳定
2. **安装命令**:
```bash
npm install --legacy-peer-deps
```
3. **开发命令**:
```bash
# 对于 Node.js v16
npm run dev
# 对于 Node.js v18 或 v20
NODE_OPTIONS=--openssl-legacy-provider npm run dev
或者 npm run dev
```
4. **生产构建命令**:
```bash
# 对于 Node.js v16
npm run build
# 对于 Node.js v18 或 v20
NODE_OPTIONS=--openssl-legacy-provider npm run build
或者 npm run dev
```
## 未来考虑
1. 更新依赖以兼容较新的 Node.js 版本
2. 解决对等依赖冲突
3. 更新 package.json 以指定推荐的 Node.js 版本范围
### Lints and fixes files
```
npm run lint
```
### Customize configuration ### Customize configuration
详情点击 [https://cli.vuejs.org/zn/config/](https://cli.vuejs.org/zn/config/). 详情点击 [https://cli.vuejs.org/zn/config/](https://cli.vuejs.org/zn/config/).

View File

@@ -5,9 +5,12 @@
"description": "lilishop-ui", "description": "lilishop-ui",
"author": "lili-platform", "author": "lili-platform",
"scripts": { "scripts": {
"serve": "vue-cli-service serve", "serve": "NODE_OPTIONS=--openssl-legacy-provider vue-cli-service serve",
"build": "vue-cli-service build", "build": "NODE_OPTIONS=--openssl-legacy-provider vue-cli-service build",
"dev": "vue-cli-service serve" "dev": "NODE_OPTIONS=--openssl-legacy-provider vue-cli-service serve"
},
"engines": {
"node": ">=14"
}, },
"dependencies": { "dependencies": {
"@amap/amap-jsapi-loader": "0.0.7", "@amap/amap-jsapi-loader": "0.0.7",
@@ -16,8 +19,9 @@
"core-js": "^3.6.5", "core-js": "^3.6.5",
"dplayer": "^1.26.0", "dplayer": "^1.26.0",
"js-cookie": "^2.2.1", "js-cookie": "^2.2.1",
"node-sass": "^4.14.1", "price-color": "1.0.2",
"sass-loader": "^8.0.2", "sass": "^1.63.6",
"sass-loader": "^10.4.1",
"sockjs-client": "^1.4.0", "sockjs-client": "^1.4.0",
"swiper": "^6.3.5", "swiper": "^6.3.5",
"uuid": "^8.3.2", "uuid": "^8.3.2",
@@ -31,8 +35,7 @@
"vue-router": "^3.1.3", "vue-router": "^3.1.3",
"vuedraggable": "^2.23.2", "vuedraggable": "^2.23.2",
"vuex": "^3.4.0", "vuex": "^3.4.0",
"xss": "^1.0.7", "xss": "^1.0.7"
"price-color":"1.0.2"
}, },
"devDependencies": { "devDependencies": {
"@vue/cli-plugin-babel": "^4.4.4", "@vue/cli-plugin-babel": "^4.4.4",
@@ -48,5 +51,10 @@
"uglifyjs-webpack-plugin": "^2.2.0", "uglifyjs-webpack-plugin": "^2.2.0",
"vue-cli-plugin-style-resources-loader": "^0.1.4", "vue-cli-plugin-style-resources-loader": "^0.1.4",
"vue-template-compiler": "^2.6.10" "vue-template-compiler": "^2.6.10"
},
"resolutions": {
"minimatch": "^3.1.2",
"node-sass": "npm:sass@^1.63.6",
"@achrinza/node-ipc": "9.2.2"
} }
} }

View File

@@ -101,20 +101,23 @@ export const getGoodsCategory = (parent_id) => {
} }
// 上架商品 // 上架商品
export const upGoods = (id, params) => { export const upGoods = (params) => {
return putRequest(`/goods/goods/${id}/up`, params) return putRequest(`/goods/goods/up`, params)
} }
// 下架商品
export const lowGoods = (id, params) => { // 下架商品
return putRequest(`/goods/goods/${id}/under`, params) export const lowGoods = (params) => {
} return putRequest(`/goods/goods/under`, params)
}
// 获取商品sku分页列表 // 获取商品sku分页列表
export const getGoodsSkuData = (params) => { export const getGoodsSkuData = (params) => {
return getRequest('/goods/goods/sku/list', params) return getRequest('/goods/goods/sku/list', params)
} }
// 获取商品数量
export const getGoodsNumerData = (params) => {
return getRequest('/goods/goods/goodsNumber', params)
}
// 获取商品分页列表 // 获取商品分页列表
export const getGoodsListData = (params) => { export const getGoodsListData = (params) => {
return getRequest('/goods/goods/list', params) return getRequest('/goods/goods/list', params)
@@ -124,8 +127,12 @@ export const getAuthGoodsListData = (params) => {
return getRequest('/goods/goods/auth/list', params) return getRequest('/goods/goods/auth/list', params)
} }
// 审核商品 // 审核商品
export const authGoods = (id, params) => { export const authGoods = (params) => {
return putRequest(`/goods/goods/${id}/auth`, params) return putRequest(`/goods/goods/auth`, params,{
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
})
} }
//查询分类绑定参数信息 //查询分类绑定参数信息

View File

@@ -160,3 +160,13 @@ export const refundLog = (params) => {
export const storeAddress = (sn) => { export const storeAddress = (sn) => {
return getRequest(`/order/afterSale/getStoreAfterSaleAddress/${sn}`) return getRequest(`/order/afterSale/getStoreAfterSaleAddress/${sn}`)
} }
// 获取订单数量统计
export const getOrderNum = (params) => {
return getRequest(`/order/order/orderNum`, params)
}
// 获取售后数量统计
export const getAfterSaleNumVO = (params) => {
return getRequest(`/order/afterSale/afterSaleNumVO`, params)
}

View File

@@ -57,13 +57,14 @@
</Modal> </Modal>
<Modal width="1000" v-model="showOssManager" @on-ok="confirmUrls"> <Modal width="1000" v-model="showOssManager" @on-ok="confirmUrls">
<OssManage ref="ossManage" :isComponent="true" :initialize="showOssManager" @selected="handleCallback" /> <OssManage ref="ossManage" :isComponent="true" :initialize="showOssManager" @selected="(list)=>{ selectedImage = list}" @callback="handleCallback" />
</Modal> </Modal>
</div> </div>
</template> </template>
<script> <script>
import vuedraggable from "vuedraggable"; import vuedraggable from "vuedraggable";
import { uploadFile } from "@/libs/axios"; import {uploadFile} from "@/libs/axios";
// import OssManage from "@/views/sys/oss-manage/ossManage";
import OssManage from "@/views/sys/oss-manage/ossManage.vue"; import OssManage from "@/views/sys/oss-manage/ossManage.vue";
export default { export default {
@@ -88,11 +89,8 @@ export default {
}; };
}, },
methods: { methods: {
confirmUrl(){
},
handleClickUploadImage(){ handleClickUploadImage(){
this.show = true this.show = true;
}, },
// 回调给父级 // 回调给父级
callback() { callback() {
@@ -122,21 +120,22 @@ export default {
handleSuccessGoodsPicture(res, file) { handleSuccessGoodsPicture(res, file) {
if (file.response) { if (file.response) {
file.url = file.response.result; file.url = file.response.result;
this.images.push(file); this.images.push(file);
} }
}, },
confirmUrls(){ confirmUrls(){
this.selectedImage.length ? this.selectedImage.forEach(element => { // this.selectedImage.length ? this.selectedImage.forEach(element => {
this.images.push({ url: element.url }) // this.images.push({ url: element.url })
}):'' // }):''
this.showOssManager = false this.showOssManager = false
}, },
handleCallback(val){ handleCallback(val){
this.selectedImage = val this.$Message.success("导入成功")
this.images.push({url:val.url})
}, },
// 从资源库中导入图片 // 从资源库中导入图片
importOSS(){ importOSS(){
this.showOssManager = true this.showOssManager = true;
this.$refs.ossManage.selectImage = true; this.$refs.ossManage.selectImage = true;
} }
} }

View File

@@ -57,11 +57,11 @@ export default {
}; };
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
/deep/ .ivu-modal { ::v-deep .ivu-modal {
overflow: hidden; overflow: hidden;
height: 650px !important; height: 650px !important;
} }
/deep/ .ivu-modal-body { ::v-deep .ivu-modal-body {
width: 100%; width: 100%;
height: 500px; height: 500px;
overflow: hidden; overflow: hidden;

View File

@@ -86,11 +86,11 @@ export default {
}; };
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
/deep/ .ivu-modal { ::v-deep .ivu-modal {
overflow: hidden; overflow: hidden;
height: 650px !important; height: 650px !important;
} }
/deep/ .ivu-modal-body { ::v-deep .ivu-modal-body {
width: 100%; width: 100%;
height: 500px; height: 500px;
overflow: hidden; overflow: hidden;

View File

@@ -65,11 +65,13 @@ export default {
} }
return cur; return cur;
}, []); }, []);
this.wap.forEach((items,indexs) => { if (this.$route.path !== '/floorList/main') {
if(items.title == '活动'){ this.wap.forEach((items, indexs) => {
this.wap.splice(indexs,1) if (items.title == '活动') {
} this.wap.splice(indexs, 1)
}) }
})
}
}else{ }else{
this.wap.push( { this.wap.push( {
title: "活动", title: "活动",
@@ -120,11 +122,11 @@ export default {
width: 100%; width: 100%;
} }
/deep/ .ivu-modal { ::v-deep .ivu-modal {
overflow: hidden; overflow: hidden;
height: 650px !important; height: 650px !important;
} }
/deep/ .ivu-modal-body { ::v-deep .ivu-modal-body {
width: 100%; width: 100%;
height: 500px; height: 500px;
overflow: hidden; overflow: hidden;

View File

@@ -42,12 +42,12 @@
} }
} }
/deep/ .ivu-scroll-container { ::v-deep .ivu-scroll-container {
width: 100% !important; width: 100% !important;
height: 400px !important; height: 400px !important;
} }
/deep/ .ivu-scroll-content { ::v-deep .ivu-scroll-content {
/* */ /* */
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
@@ -81,7 +81,7 @@
align-items: center; align-items: center;
margin: 10px; margin: 10px;
/deep/ img { ::v-deep img {
width: 60px; width: 60px;
height: 60px; height: 60px;
text-align: center; text-align: center;

View File

@@ -73,13 +73,6 @@ export default {
pageSize: 10, pageSize: 10,
}, },
pintuanColumns: [ pintuanColumns: [
// 表头
{
title: "活动标题",
key: "title",
tooltip: true,
width: 250,
},
{ {
title: "商品名称", title: "商品名称",
key: "goodsName", key: "goodsName",
@@ -339,15 +332,15 @@ export default {
this.sortGoods("SECKILL"); this.sortGoods("SECKILL");
}, },
}; };
case "COUPON": // case "COUPON":
return { // return {
title: "优惠券", // title: "优惠券",
methodsed: () => { // methodsed: () => {
this.showPromotionList = []; // this.showPromotionList = [];
this.activeColumns = this.pintuanColumns; // this.activeColumns = this.pintuanColumns;
this.sortGoods("COUPON"); // this.sortGoods("COUPON");
}, // },
}; // };
case "POINTS_GOODS": case "POINTS_GOODS":
return { return {
title: "积分商品", title: "积分商品",
@@ -383,7 +376,10 @@ export default {
getPromotion(res) { getPromotion(res) {
if (res.result) { if (res.result) {
this.promotionList = res.result; this.promotionList = res.result;
// 去除优惠券
delete this.promotionList.COUPON;
Object.keys(res.result)[0] && this.typeOption(Object.keys(res.result)[0]).methodsed(); Object.keys(res.result)[0] && this.typeOption(Object.keys(res.result)[0]).methodsed();
this.promotions = Object.keys(res.result)[0];
} }
// if (Object.keys(res.result).length) { // if (Object.keys(res.result).length) {
@@ -424,7 +420,7 @@ img {
overflow: auto; overflow: auto;
width: 100%; width: 100%;
} }
/deep/ .ivu-table-wrapper { ::v-deep .ivu-table-wrapper {
width: 100%; width: 100%;
} }
.list { .list {

View File

@@ -157,7 +157,7 @@ export default {
text-align: center; text-align: center;
transition: 0.35s; transition: 0.35s;
cursor: pointer; cursor: pointer;
/deep/ p { ::v-deep p {
margin: 10px 0; margin: 10px 0;
} }
border: 1px solid #ededed; border: 1px solid #ededed;

View File

@@ -33,7 +33,7 @@ export default {
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
/deep/ .ivu-card-body { ::v-deep .ivu-card-body {
height: 414px; height: 414px;
overflow: auto; overflow: auto;
} }
@@ -69,11 +69,11 @@ export default {
height: 416px; height: 416px;
overflow: hidden; overflow: hidden;
} }
/deep/ .ivu-table { ::v-deep .ivu-table {
height: 300px !important; height: 300px !important;
overflow: auto; overflow: auto;
} }
/deep/ .ivu-card-body { ::v-deep .ivu-card-body {
padding: 0; padding: 0;
height: auto; height: auto;
} }

View File

@@ -137,7 +137,7 @@ img {
overflow: auto; overflow: auto;
width: 100%; width: 100%;
} }
/deep/ .ivu-table-wrapper { ::v-deep .ivu-table-wrapper {
width: 100%; width: 100%;
} }
.list { .list {

View File

@@ -19,10 +19,9 @@
width: 100% !important; width: 100% !important;
display: flex; display: flex;
align-items: center; align-items: center;
background-color: #f0f0f0; // background-color: #f0f0f0;
border-radius: 0.4em; border-radius: 0.4em;
padding: 10px;
margin: 0;
flex-wrap: wrap; flex-wrap: wrap;
> .ivu-form-item { > .ivu-form-item {
margin: 8px 10px !important; margin: 8px 10px !important;
@@ -42,3 +41,8 @@
-webkit-line-clamp: 4; -webkit-line-clamp: 4;
overflow: hidden; overflow: hidden;
} }
// 为Card组件之间增加间距
.ivu-card + .ivu-card {
margin-top: 10px;
}

View File

@@ -15,13 +15,13 @@
v-model="searchForm.memberName" v-model="searchForm.memberName"
placeholder="请输入会员名称" placeholder="请输入会员名称"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="状态"> <Form-item label="状态">
<Select <Select
v-model="searchForm.distributionStatus" v-model="searchForm.distributionStatus"
style="width: 200px" style="width: 240px"
> >
<Option <Option
v-for="item in distributionStatusList" v-for="item in distributionStatusList"
@@ -42,6 +42,8 @@
> >
</Form> </Form>
</Row> </Row>
</Card>
<Card>
<Table <Table
:loading="loading" :loading="loading"
border border

View File

@@ -15,7 +15,7 @@
v-model="searchForm.memberName" v-model="searchForm.memberName"
placeholder="请输入会员名称" placeholder="请输入会员名称"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Button <Button
@@ -26,6 +26,8 @@
> >
</Form> </Form>
</Row> </Row>
</Card>
<Card>
<Table <Table
class="mt_10" class="mt_10"
:loading="loading" :loading="loading"

View File

@@ -5,15 +5,15 @@
<Form-item label="会员名称" class="flex" prop="memberName"> <Form-item label="会员名称" class="flex" prop="memberName">
<Input <Input
type="text" placeholder="请输入会员名称" v-model="searchForm.memberName" clearable type="text" placeholder="请输入会员名称" v-model="searchForm.memberName" clearable
style="width: 200px"></Input> style="width: 240px"></Input>
</Form-item> </Form-item>
<Form-item label="编号" class="flex"> <Form-item label="编号" class="flex">
<Input <Input
type="text" placeholder="请输入编号" v-model="searchForm.sn" clearable type="text" placeholder="请输入编号" v-model="searchForm.sn" clearable
style="width: 200px"></Input> style="width: 240px"></Input>
</Form-item> </Form-item>
<Form-item label="状态" <Form-item label="状态"
style="width: 200px"> style="width: 240px">
<Select v-model="searchForm.distributionCashStatus" clearable style="width: 150px"> <Select v-model="searchForm.distributionCashStatus" clearable style="width: 150px">
<Option v-for="item in cashStatusList" :value="item.value" :key="item.value">{{ item.label }}</Option> <Option v-for="item in cashStatusList" :value="item.value" :key="item.value">{{ item.label }}</Option>
</Select> </Select>
@@ -22,6 +22,8 @@
<Button @click="handleSearch" type="primary">搜索</Button> <Button @click="handleSearch" type="primary">搜索</Button>
</Form-item> </Form-item>
</Form> </Form>
</Card>
<Card>
<Table :loading="loading" border :columns="columns" :data="data" ref="table" class="mt_10"></Table> <Table :loading="loading" border :columns="columns" :data="data" ref="table" class="mt_10"></Table>
<Row type="flex" justify="end" class="page padding-row"> <Row type="flex" justify="end" class="page padding-row">
<Page :current="searchForm.pageNumber" :total="total" :page-size="searchForm.pageSize" @on-change="changePage" @on-page-size-change="changePageSize" :page-size-opts="[10,20,50]" size="small" show-total show-elevator show-sizer></Page> <Page :current="searchForm.pageNumber" :total="total" :page-size="searchForm.pageSize" @on-change="changePage" @on-page-size-change="changePageSize" :page-size-opts="[10,20,50]" size="small" show-total show-elevator show-sizer></Page>

View File

@@ -4,10 +4,12 @@
<Form @keydown.enter.native.prevent="handleSearch" ref="searchForm" :model="searchForm" inline :label-width="70" <Form @keydown.enter.native.prevent="handleSearch" ref="searchForm" :model="searchForm" inline :label-width="70"
class="search-form"> class="search-form">
<Form-item label="商品名称" prop="goodsName"> <Form-item label="商品名称" prop="goodsName">
<Input type="text" v-model="searchForm.goodsName" placeholder="请输入商品名称" clearable style="width: 200px" /> <Input type="text" v-model="searchForm.goodsName" placeholder="请输入商品名称" clearable style="width: 240px" />
</Form-item> </Form-item>
<Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button> <Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button>
</Form> </Form>
</Card>
<Card>
<Row class="operation" style="margin:10px 0;"> <Row class="operation" style="margin:10px 0;">
<Button @click="delAll" type="primary">批量下架</Button> <Button @click="delAll" type="primary">批量下架</Button>
</Row> </Row>

View File

@@ -8,7 +8,7 @@
v-model="searchForm.orderSn" v-model="searchForm.orderSn"
placeholder="请输入订单编号" placeholder="请输入订单编号"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="分销商" prop="distributionName"> <Form-item label="分销商" prop="distributionName">
@@ -17,21 +17,23 @@
v-model="searchForm.distributionName" v-model="searchForm.distributionName"
placeholder="请输入分销商名称" placeholder="请输入分销商名称"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="店铺名称"> <Form-item label="店铺名称">
<Select v-model="searchForm.storeId" placeholder="请选择" @on-query-change="searchChange" filterable <Select v-model="searchForm.storeId" placeholder="请选择" @on-query-change="searchChange" filterable
clearable style="width: 150px"> clearable style="width: 240px">
<Option v-for="item in shopList" :value="item.id" :key="item.id">{{ item.storeName }}</Option> <Option v-for="item in shopList" :value="item.id" :key="item.id">{{ item.storeName }}</Option>
</Select> </Select>
</Form-item> </Form-item>
<Form-item label="订单时间"> <Form-item label="订单时间">
<DatePicker type="daterange" v-model="timeRange" format="yyyy-MM-dd" placeholder="选择时间" <DatePicker type="daterange" v-model="timeRange" format="yyyy-MM-dd" placeholder="选择时间"
style="width: 210px"></DatePicker> style="width: 240px"></DatePicker>
</Form-item> </Form-item>
<Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button> <Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button>
</Form> </Form>
</Card>
<Card>
<Table :loading="loading" border :columns="columns" :data="data" ref="table" class="mt_10"> <Table :loading="loading" border :columns="columns" :data="data" ref="table" class="mt_10">
<template slot-scope="{row}" slot="goodsMsg"> <template slot-scope="{row}" slot="goodsMsg">
<div class="goods-msg"> <div class="goods-msg">

View File

@@ -3,7 +3,6 @@
<Card> <Card>
<Row class="operation"> <Row class="operation">
<Button @click="add" type="primary">添加</Button> <Button @click="add" type="primary">添加</Button>
<Button @click="refresh">刷新</Button>
<Button @click="delAll">批量删除</Button> <Button @click="delAll">批量删除</Button>
</Row> </Row>
<Table <Table
@@ -285,15 +284,7 @@ export default {
}, },
}); });
}, },
// 刷新
refresh() {
this.loading = true;
setTimeout(() => {
this.getDataList();
this.loading = false;
this.$Message.success("刷新成功");
}, 500);
},
// 全部删除 // 全部删除
delAll() { delAll() {
if (this.selectCount <= 0) { if (this.selectCount <= 0) {

View File

@@ -15,7 +15,7 @@
v-model="searchForm.goodsName" v-model="searchForm.goodsName"
placeholder="请输入商品名称" placeholder="请输入商品名称"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="商品编号" prop="id"> <Form-item label="商品编号" prop="id">
@@ -24,7 +24,7 @@
v-model="searchForm.id" v-model="searchForm.id"
placeholder="请输入商品编号" placeholder="请输入商品编号"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="店铺名称" prop="id"> <Form-item label="店铺名称" prop="id">
@@ -33,26 +33,15 @@
v-model="searchForm.storeName" v-model="searchForm.storeName"
placeholder="请输入店铺名称" placeholder="请输入店铺名称"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="状态" prop="status">
<Select
v-model="searchForm.marketEnable"
placeholder="请选择"
clearable
style="width: 200px"
>
<Option value="UPPER">上架</Option>
<Option value="DOWN">下架</Option>
</Select>
</Form-item>
<Form-item label="销售模式" prop="status"> <Form-item label="销售模式" prop="status">
<Select <Select
v-model="searchForm.salesModel" v-model="searchForm.salesModel"
placeholder="请选择" placeholder="请选择"
clearable clearable
style="width: 200px" style="width: 240px"
> >
<Option value="RETAIL">零售</Option> <Option value="RETAIL">零售</Option>
<Option value="WHOLESALE">批发</Option> <Option value="WHOLESALE">批发</Option>
@@ -63,7 +52,7 @@
v-model="searchForm.goodsType" v-model="searchForm.goodsType"
placeholder="请选择" placeholder="请选择"
clearable clearable
style="width: 200px" style="width: 240px"
> >
<Option value="PHYSICAL_GOODS">实物商品</Option> <Option value="PHYSICAL_GOODS">实物商品</Option>
<Option value="VIRTUAL_GOODS">虚拟商品</Option> <Option value="VIRTUAL_GOODS">虚拟商品</Option>
@@ -77,46 +66,69 @@
>搜索</Button >搜索</Button
> >
</Form> </Form>
</Card>
<Card>
<div class="goods-tab">
<Tabs v-model="currentStatus" @on-click="goodsStatusClick">
<TabPane v-for="(item,index) in goodsStatusWithCount" :key="index" :label="item.title" :name="item.value">
</TabPane>
</Tabs>
</div>
<!-- 批量操作按钮 -->
<div class="batch-operations" style="margin: 10px 0;">
<Button
type="success"
:disabled="selectedRows.length === 0"
@click="batchUpper"
style="margin-right: 10px;"
>
批量上架
</Button>
<Button
type="warning"
:disabled="selectedRows.length === 0"
@click="batchLower"
style="margin-right: 10px;"
>
批量下架
</Button>
<Button
v-if="currentStatus === 'TOBEAUDITED'"
type="primary"
:disabled="selectedRows.length === 0"
@click="batchAudit"
>
批量审核
</Button>
</div>
<Table <Table
:loading="loading" :loading="loading"
border
:columns="columns" :columns="columns"
:data="data" :data="data"
ref="table" ref="table"
class="mt_10" class="mt_10"
@on-select="onSelect"
@on-select-all="onSelectAll"
@on-selection-change="onSelectionChange"
> >
<!-- 商品图片格式化 -->
<template slot="imageSlot" slot-scope="{ row }">
<div style="margin-top: 5px;">
<img
:src="row.original"
style="height: 50px; width: 50px; object-fit: cover;"
/>
</div>
</template>
<!-- 商品栏目格式化 --> <!-- 商品栏目格式化 -->
<template slot="goodsSlot" slot-scope="{ row }"> <template slot="goodsSlot" slot-scope="{ row }">
<div style="margin: 5px 0px; height: 80px; display: flex"> <div style="margin: 5px 0px; padding: 10px 0px;">
<div style=""> <div class="div-zoom">
<img <a @click="linkTo(row.id, row.skuId)">{{ row.goodsName }}</a>
:src="row.original"
style="height: 60px; margin-top: 1px; width: 60px"
/>
</div>
<div style="margin-left: 13px">
<div class="div-zoom">
<a @click="linkTo(row.id, row.skuId)">{{ row.goodsName }}</a>
</div>
<Poptip trigger="hover" title="扫码在手机中查看" transfer>
<div slot="content">
<vue-qr
:text="wapLinkTo(row.id, row.skuId)"
:margin="0"
colorDark="#000"
colorLight="#fff"
:size="150"
></vue-qr>
</div>
<img
src="../../../assets/qrcode.svg"
class="hover-pointer"
width="20"
height="20"
alt=""
/>
</Poptip>
</div> </div>
</div> </div>
</template> </template>
@@ -128,7 +140,7 @@
:page-size="searchForm.pageSize" :page-size="searchForm.pageSize"
@on-change="changePage" @on-change="changePage"
@on-page-size-change="changePageSize" @on-page-size-change="changePageSize"
:page-size-opts="[10, 20, 50]" :page-size-opts="[20, 50, 100]"
size="small" size="small"
show-total show-total
show-elevator show-elevator
@@ -154,11 +166,61 @@
> >
</div> </div>
</Modal> </Modal>
<Modal
title="商品审核"
v-model="auditModalVisible"
:mask-closable="false"
:width="500"
>
<Form ref="auditForm" :model="goodsAuditForm" :label-width="100">
<FormItem label="审核结果" prop="auth_flag">
<RadioGroup v-model="goodsAuditForm.auth_flag">
<Radio :label="1">审核通过</Radio>
<Radio :label="2">审核拒绝</Radio>
</RadioGroup>
</FormItem>
<!-- <FormItem label="审核备注" prop="reason" v-if="goodsAuditForm.auth_flag === 2">
<Input v-model="goodsAuditForm.reason" type="textarea" :rows="3" placeholder="请输入拒绝原因" />
</FormItem> -->
</Form>
<div slot="footer">
<Button type="text" @click="auditModalVisible = false">取消</Button>
<Button type="primary" @click="confirmAudit">提交审核</Button>
</div>
</Modal>
<!-- 批量审核弹框 -->
<Modal
title="批量商品审核"
v-model="batchAuditModalVisible"
:mask-closable="false"
:width="500"
>
<Form ref="batchAuditForm" :model="batchAuditForm" :label-width="100">
<FormItem label="审核结果" prop="auth_flag">
<RadioGroup v-model="batchAuditForm.auth_flag">
<Radio :label="1">审核通过</Radio>
<Radio :label="2">审核拒绝</Radio>
</RadioGroup>
</FormItem>
<FormItem label="审核备注" prop="reason" v-if="batchAuditForm.auth_flag === 2">
<Input v-model="batchAuditForm.reason" type="textarea" :rows="3" placeholder="请输入拒绝原因" />
</FormItem>
<FormItem label="选中商品">
<div style="max-height: 200px; overflow-y: auto;">
<Tag v-for="item in selectedRows" :key="item.id" style="margin: 2px;">{{item.goodsName}}</Tag>
</div>
</FormItem>
</Form>
<div slot="footer">
<Button type="text" @click="batchAuditModalVisible = false">取消</Button>
<Button type="primary" @click="submitBatchAudit">提交审核</Button>
</div>
</Modal>
</div> </div>
</template> </template>
<script> <script>
import { getGoodsListData, upGoods, lowGoods } from "@/api/goods"; import { getGoodsListData,getGoodsNumerData, upGoods, lowGoods, authGoods } from "@/api/goods";
import vueQr from "vue-qr"; import vueQr from "vue-qr";
export default { export default {
components: { components: {
@@ -173,7 +235,7 @@ export default {
searchForm: { searchForm: {
// 搜索框初始化对象 // 搜索框初始化对象
pageNumber: 1, // 当前页数 pageNumber: 1, // 当前页数
pageSize: 10, // 页面大小 pageSize: 20, // 页面大小
sort: "create_time", // 默认排序字段 sort: "create_time", // 默认排序字段
order: "desc", // 默认排序方式 order: "desc", // 默认排序方式
}, },
@@ -181,28 +243,61 @@ export default {
// 下架原因 // 下架原因
reason: "", reason: "",
}, },
goodsAuditForm: {
// 商品审核表单
auth_flag: 1,
},
auditModalVisible: false, // 审核弹框显示状态
currentAuditGoods: null, // 当前审核的商品
submitLoading: false, // 添加或编辑提交状态 submitLoading: false, // 添加或编辑提交状态
columns: [ columns: [
{
type: 'selection',
width: 60,
align: 'center'
},
{
title: "商品ID",
key: "id",
width: 180,
tooltip: true,
},
{
title: "商品图片",
key: "original",
width: 180,
slot: "imageSlot",
},
{ {
title: "商品名称", title: "商品名称",
key: "goodsName", key: "goodsName",
minWidth: 180, minWidth: 180,
slot: "goodsSlot", slot: "goodsSlot",
}, },
{
title: "商品编号",
key: "id",
minWidth: 150,
tooltip: true,
},
{ {
title: "价格", title: "价格",
key: "price", key: "price",
width: 130, width: 100,
render: (h, params) => { render: (h, params) => {
return h("priceColorScheme", {props:{value:params.row.price,color:this.$mainColor}} ); return h("priceColorScheme", {props:{value:params.row.price,color:this.$mainColor}} );
}, },
}, },
{
title: "销量",
key: "buyCount",
width: 100,
render: (h, params) => {
return h("span", params.row.buyCount || 0);
},
},
{
title: "库存",
key: "quantity",
width: 100,
render: (h, params) => {
return h("span", params.row.quantity || 0);
},
},
{ {
title: "销售模式", title: "销售模式",
key: "salesModel", key: "salesModel",
@@ -220,7 +315,7 @@ export default {
{ {
title: "商品类型", title: "商品类型",
key: "goodsType", key: "goodsType",
width: 130, width: 120,
render: (h, params) => { render: (h, params) => {
if (params.row.goodsType === "PHYSICAL_GOODS") { if (params.row.goodsType === "PHYSICAL_GOODS") {
return h("Tag", { props: { color: "green" } }, "实物商品"); return h("Tag", { props: { color: "green" } }, "实物商品");
@@ -234,7 +329,7 @@ export default {
{ {
title: "状态", title: "状态",
key: "marketEnable", key: "marketEnable",
width: 100, width: 120,
render: (h, params) => { render: (h, params) => {
if (params.row.marketEnable == "DOWN") { if (params.row.marketEnable == "DOWN") {
return h("Tag", { props: { color: "volcano" } }, "下架"); return h("Tag", { props: { color: "volcano" } }, "下架");
@@ -246,7 +341,7 @@ export default {
{ {
title: "审核状态", title: "审核状态",
key: "authFlag", key: "authFlag",
width: 130, width: 180,
render: (h, params) => { render: (h, params) => {
if (params.row.authFlag == "TOBEAUDITED") { if (params.row.authFlag == "TOBEAUDITED") {
return h("Tag", { props: { color: "volcano" } }, "待审核"); return h("Tag", { props: { color: "volcano" } }, "待审核");
@@ -260,7 +355,7 @@ export default {
{ {
title: "店铺名称", title: "店铺名称",
key: "storeName", key: "storeName",
minWidth: 100, width: 180, // 使用minWidth替代width
tooltip: true, tooltip: true,
}, },
{ {
@@ -268,19 +363,61 @@ export default {
key: "action", key: "action",
align: "center", align: "center",
fixed: "right", fixed: "right",
width: 150, width: 200,
render: (h, params) => { render: (h, params) => {
if (params.row.marketEnable == "DOWN") { // 如果是待审核状态,显示审核按钮
if (params.row.authFlag === "TOBEAUDITED") {
return h("div", [ return h("div", [
h( h(
"Button", "a",
{ {
props: {
type: "info",
size: "small",
},
style: { style: {
marginRight: "5px", color: "#2d8cf0",
cursor: "pointer",
textDecoration: "none"
},
on: {
click: () => {
this.openAuditModal(params.row);
},
},
},
"审核"
),
h("span", {
style: {
margin: "0 8px",
color: "#dcdee2"
}
}, "|"),
h(
"a",
{
style: {
color: "#2d8cf0",
cursor: "pointer",
textDecoration: "none"
},
on: {
click: () => {
this.showDetail(params.row);
},
},
},
"查看"
),
]);
}
// 原有的上架/下架逻辑
else if (params.row.marketEnable == "DOWN") {
return h("div", [
h(
"a",
{
style: {
color: "#2d8cf0",
cursor: "pointer",
textDecoration: "none"
}, },
on: { on: {
click: () => { click: () => {
@@ -290,11 +427,19 @@ export default {
}, },
"上架" "上架"
), ),
h("span", {
style: {
margin: "0 8px",
color: "#dcdee2"
}
}, "|"),
h( h(
"Button", "a",
{ {
props: { style: {
size: "small", color: "#2d8cf0",
cursor: "pointer",
textDecoration: "none"
}, },
on: { on: {
click: () => { click: () => {
@@ -308,14 +453,12 @@ export default {
} else { } else {
return h("div", [ return h("div", [
h( h(
"Button", "a",
{ {
props: {
type: "error",
size: "small",
},
style: { style: {
marginRight: "5px", color: "#2d8cf0",
cursor: "pointer",
textDecoration: "none"
}, },
on: { on: {
click: () => { click: () => {
@@ -325,11 +468,19 @@ export default {
}, },
"下架" "下架"
), ),
h("span", {
style: {
margin: "0 8px",
color: "#dcdee2"
}
}, "|"),
h( h(
"Button", "a",
{ {
props: { style: {
size: "small", color: "#2d8cf0",
cursor: "pointer",
textDecoration: "none"
}, },
on: { on: {
click: () => { click: () => {
@@ -346,12 +497,37 @@ export default {
], ],
data: [], // 表单数据 data: [], // 表单数据
total: 0, // 表单数据总数 total: 0, // 表单数据总数
currentStatus: '',
goodsNumerData: {},
goodsAuditForm: {
// 商品编辑表单
auth_flag: 1,
},
selectedRows: [], // 选中的行数据
selectAll: false, // 全选状态
batchAuditModalVisible: false, // 批量审核弹框显示状态
batchAuditForm: {
auth_flag: 1,
reason: ''
},
}; };
}, },
computed: {
goodsStatusWithCount() {
return [
{title: '全部', value: ''},
{title: `出售中${this.goodsNumerData.upperGoodsNum ? '(' + this.goodsNumerData.upperGoodsNum + ')' : ''}`, value: 'UPPER'},
{title: `仓库中${this.goodsNumerData.downGoodsNum ? '(' + this.goodsNumerData.downGoodsNum + ')' : ''}`, value: 'DOWN'},
{title: `待审核${this.goodsNumerData.auditGoodsNum ? '(' + this.goodsNumerData.auditGoodsNum + ')' : ''}`, value: 'TOBEAUDITED'},
{title: `审核未通过${this.goodsNumerData.refuseGoodsNum ? '(' + this.goodsNumerData.refuseGoodsNum + ')' : ''}`, value: 'REFUSE'}
];
}
},
methods: { methods: {
// 初始化数据 // 初始化数据
init() { init() {
this.getDataList(); this.getDataList();
this.getNumberData();
}, },
// 分页 改变页码 // 分页 改变页码
changePage(v) { changePage(v) {
@@ -366,8 +542,9 @@ export default {
// 搜索 // 搜索
handleSearch() { handleSearch() {
this.searchForm.pageNumber = 1; this.searchForm.pageNumber = 1;
this.searchForm.pageSize = 10; this.searchForm.pageSize = 20;
this.getDataList(); this.getDataList();
this.getNumberData();
}, },
// 获取数据 // 获取数据
getDataList() { getDataList() {
@@ -380,6 +557,15 @@ export default {
} }
}); });
}, },
getNumberData() {
// 创建一个不包含goodsStatus字段的搜索参数
const { goodsStatus, ...searchParams } = this.searchForm;
getGoodsNumerData(searchParams).then((res) => {
if (res.success) {
this.goodsNumerData = res.result;
}
})
},
// 编辑 // 编辑
edit(v) { edit(v) {
this.id = v.id; this.id = v.id;
@@ -392,27 +578,36 @@ export default {
}, },
// 下架 // 下架
lower() { lower() {
lowGoods(this.id, this.underForm).then((res) => { let params = {
goodsId: this.id,
reason:this.underForm.reason
};
lowGoods(params).then((res) => {
this.$Modal.remove(); this.$Modal.remove();
if (res.success) { if (res.success) {
this.$Message.success("操作成功"); this.$Message.success("操作成功");
this.modalVisible = false; this.modalVisible = false;
this.getDataList(); this.getDataList();
this.getNumberData(); // 添加这行
} }
}); });
}, },
// 商家 // 上架
upper(v) { upper(v) {
this.$Modal.confirm({ this.$Modal.confirm({
title: "确认上架", title: "确认上架",
content: "您确认要上架 " + v.goodsName + " ?", content: "您确认要上架 " + v.goodsName + " ?",
loading: true, loading: true,
onOk: () => { onOk: () => {
upGoods(v.id).then((res) => { let params = {
goodsId: v.id
};
upGoods(params).then((res) => {
this.$Modal.remove(); this.$Modal.remove();
if (res.success) { if (res.success) {
this.$Message.success("上架成功"); this.$Message.success("上架成功");
this.getDataList(); this.getDataList();
this.getNumberData(); // 添加这行
} }
}); });
}, },
@@ -427,9 +622,251 @@ export default {
query: { id: id }, query: { id: id },
}) })
}, },
// 商品状态筛选
goodsStatusClick(item) {
// 根据选择的状态设置搜索条件
if (item === 0) {
// 全部:清除状态筛选
delete this.searchForm.goodsStatus;
} else {
// 其他状态正常赋值
this.searchForm.goodsStatus = item;
}
this.currentStatus = item;
// tab切换时清除选中内容
this.selectedRows = [];
if (this.$refs.table) {
this.$refs.table.selectAll(false);
}
this.getDataList();
},
examine(v, authFlag) {
// 审核商品
let examine = "通过";
this.goodsAuditForm.authFlag = "PASS";
if (authFlag != 1) {
examine = "拒绝";
this.goodsAuditForm.authFlag = "REFUSE";
}
this.$Modal.confirm({
title: "确认审核",
content: "您确认要审核" + examine + " " + v.goodsName + " ?",
loading: true,
onOk: () => {
this.goodsAuditForm.goodsIds=v.id;
let formData = new FormData();
formData.append('goodsIds', v.id);
formData.append('authFlag', this.goodsAuditForm.authFlag);
authGoods(formData).then((res) => {
this.$Modal.remove();
if (res.success) {
this.$Message.success("审核成功");
this.getDataList();
this.getNumberData();
}
});
},
});
},
// 打开审核弹框
openAuditModal(goods) {
this.currentAuditGoods = goods;
this.goodsAuditForm.auth_flag = 1;
this.goodsAuditForm.reason = '';
this.auditModalVisible = true;
},
// 确认审核(二次确认)
confirmAudit() {
const auditText = this.goodsAuditForm.auth_flag === 1 ? '通过' : '拒绝';
this.$Modal.confirm({
title: '确认审核',
content: `您确认要审核${auditText} "${this.currentAuditGoods.goodsName}" 吗?`,
loading: true,
onOk: () => {
this.submitAudit();
},
});
},
// 提交审核
submitAudit() {
let formData = new FormData();
formData.append('goodsIds', this.currentAuditGoods.id);
formData.append('authFlag', this.goodsAuditForm.auth_flag === 1 ? 'PASS' : 'REFUSE');
authGoods(formData).then((res) => {
this.$Modal.remove();
if (res.success) {
this.$Message.success('审核成功');
this.auditModalVisible = false;
this.getDataList();
this.getNumberData();
}
});
},
// 选择框事件处理
onSelect(selection, row) {
// 单行选择时触发
},
onSelectAll(selection) {
// 全选时触发
},
onSelectionChange(selection) {
this.selectedRows = selection;
},
// 批量上架
batchUpper() {
if (this.selectedRows.length === 0) {
this.$Message.warning('请先选择要上架的商品');
return;
}
const goodsNames = this.selectedRows.map(item => item.goodsName).join('、');
this.$Modal.confirm({
title: '确认批量上架',
content: `您确认要上架以下商品吗?\n${goodsNames}`,
loading: true,
onOk: () => {
// 提取所有选中商品的ID
const goodsIds = this.selectedRows.map(item => item.id);
const params = {
goodsId: goodsIds // 传递ID数组
};
upGoods(params).then((res) => {
this.$Modal.remove();
if (res.success) {
this.$Message.success('批量上架成功');
this.selectedRows = [];
this.selectAll = false;
this.getDataList();
this.getNumberData();
}
}).catch(() => {
this.$Modal.remove();
});
}
});
},
// 批量下架
batchLower() {
if (this.selectedRows.length === 0) {
this.$Message.warning('请先选择要下架的商品');
return;
}
const goodsNames = this.selectedRows.map(item => item.goodsName).join('、');
this.$Modal.confirm({
title: '确认批量下架',
content: `您确认要下架以下商品吗?\n${goodsNames}`,
loading: true,
onOk: () => {
// 提取所有选中商品的ID
const goodsIds = this.selectedRows.map(item => item.id);
const params = {
goodsId: goodsIds, // 传递ID数组
reason: '批量下架操作' // 可以设置默认下架原因
};
lowGoods(params).then((res) => {
this.$Modal.remove();
if (res.success) {
this.$Message.success('批量下架成功');
this.selectedRows = [];
this.selectAll = false;
this.getDataList();
this.getNumberData();
}
}).catch(() => {
this.$Modal.remove();
});
}
});
},
// 批量审核
batchAudit() {
if (this.selectedRows.length === 0) {
this.$Message.warning('请先选择要审核的商品');
return;
}
// 重置批量审核表单
this.batchAuditForm = {
auth_flag: 1,
reason: ''
};
this.batchAuditModalVisible = true;
},
// 提交批量审核
submitBatchAudit() {
if (this.selectedRows.length === 0) {
this.$Message.warning('请先选择要审核的商品');
return;
}
// 如果是拒绝审核,必须填写原因
if (this.batchAuditForm.auth_flag === 2 && !this.batchAuditForm.reason.trim()) {
this.$Message.warning('审核拒绝时必须填写拒绝原因');
return;
}
const actionText = this.batchAuditForm.auth_flag === 1 ? '通过' : '拒绝';
const goodsNames = this.selectedRows.map(item => item.goodsName).join('、');
this.$Modal.confirm({
title: `确认批量审核${actionText}`,
content: `您确认要${actionText}以下商品的审核吗?\n${goodsNames}`,
loading: true,
onOk: () => {
// 提取所有选中商品的ID
const goodsIds = this.selectedRows.map(item => item.id);
let formData = new FormData();
formData.append('goodsId', goodsIds);
formData.append('authFlag', this.batchAuditForm.auth_flag === 1 ? 'PASS' : 'REFUSE');
formData.append('reason', this.batchAuditForm.reason || '');
// 修正直接调用authGoods不传递'batch'参数
authGoods(formData).then((res) => {
this.$Modal.remove();
if (res.success) {
this.$Message.success(`批量审核${actionText}成功`);
this.selectedRows = [];
this.selectAll = false;
this.batchAuditModalVisible = false;
this.getDataList();
this.getNumberData();
}
}).catch(() => {
this.$Modal.remove();
});
}
});
}
}, },
mounted() { mounted() {
this.init(); this.init();
}, },
}; };
</script> </script>
<style lang="scss" scoped>
// Tab组件样式
.goods-tab {
::v-deep .ivu-tabs-tab {
font-size: 14px;
}
}
</style>

View File

@@ -15,7 +15,7 @@
v-model="searchForm.goodsName" v-model="searchForm.goodsName"
placeholder="请输入商品名称" placeholder="请输入商品名称"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="商品编号" prop="id"> <Form-item label="商品编号" prop="id">
@@ -24,13 +24,15 @@
v-model="searchForm.id" v-model="searchForm.id"
placeholder="请输入商品编号" placeholder="请输入商品编号"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Button @click="handleSearch" class="search-btn" type="primary" icon="ios-search" <Button @click="handleSearch" class="search-btn" type="primary" icon="ios-search"
>搜索</Button >搜索</Button
> >
</Form> </Form>
</Card>
<Card>
<Table <Table
:loading="loading" :loading="loading"
border border
@@ -274,7 +276,11 @@ export default {
content: "您确认要审核" + examine + " " + v.goodsName + " ?", content: "您确认要审核" + examine + " " + v.goodsName + " ?",
loading: true, loading: true,
onOk: () => { onOk: () => {
authGoods(v.id, this.goodsAuditForm).then((res) => { let formData = new FormData();
formData.append('goodsIds', v.id);
formData.append('authFlag', this.goodsAuditForm.authFlag);
authGoods(formData).then((res) => {
this.$Modal.remove(); this.$Modal.remove();
if (res.success) { if (res.success) {
this.$Message.success("审核成功"); this.$Message.success("审核成功");

View File

@@ -4,13 +4,14 @@
<Form ref="searchForm" @submit.native.prevent @keydown.enter.native="handleSearch" :model="searchForm" inline :label-width="70" <Form ref="searchForm" @submit.native.prevent @keydown.enter.native="handleSearch" :model="searchForm" inline :label-width="70"
class="search-form"> class="search-form">
<Form-item label="品牌名称"> <Form-item label="品牌名称">
<Input type="text" v-model="searchForm.name" placeholder="请输入品牌名称" clearable style="width: 200px"/> <Input type="text" v-model="searchForm.name" placeholder="请输入品牌名称" clearable style="width: 240px"/>
</Form-item> </Form-item>
<Button @click="handleSearch" type="primary">搜索</Button> <Button @click="handleSearch" type="primary">搜索</Button>
</Form> </Form>
</Card>
<Card>
<Row class="operation padding-row"> <Row class="operation padding-row">
<Button @click="add" type="primary">添加</Button> <Button @click="add" type="primary">添加</Button>
<Button @click="refresh">刷新</Button>
</Row> </Row>
<Table :loading="loading" border :columns="columns" :data="data" ref="table"></Table> <Table :loading="loading" border :columns="columns" :data="data" ref="table"></Table>
<Row type="flex" justify="end" class="mt_10"> <Row type="flex" justify="end" class="mt_10">
@@ -315,15 +316,7 @@ export default {
delete this.form.id; delete this.form.id;
this.modalVisible = true; this.modalVisible = true;
}, },
// 刷新
refresh() {
this.loading = true;
setTimeout(() => {
this.getDataList();
this.loading = false;
this.$Message.success("刷新成功");
}, 500);
},
// 编辑 // 编辑
edit(v) { edit(v) {
this.modalType = 1; this.modalType = 1;

View File

@@ -543,7 +543,7 @@ export default {
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
/deep/ .ivu-table-wrapper { ::v-deep .ivu-table-wrapper {
overflow: auto; overflow: auto;
} }
.table { .table {

View File

@@ -4,10 +4,12 @@
<Form @submit.native.prevent @keydown.enter.native="handleSearch" ref="searchForm" :model="searchForm" inline :label-width="70" <Form @submit.native.prevent @keydown.enter.native="handleSearch" ref="searchForm" :model="searchForm" inline :label-width="70"
class="search-form"> class="search-form">
<Form-item label="规格名称" prop="specName"> <Form-item label="规格名称" prop="specName">
<Input type="text" v-model="searchForm.specName" placeholder="请输入规格名称" clearable style="width: 200px" /> <Input type="text" v-model="searchForm.specName" placeholder="请输入规格名称" clearable style="width: 240px" />
</Form-item> </Form-item>
<Button @click="handleSearch" type="primary" class="search-btn">搜索</Button> <Button @click="handleSearch" type="primary" class="search-btn">搜索</Button>
</Form> </Form>
</Card>
<Card>
<Row class="operation padding-row"> <Row class="operation padding-row">
<Button @click="add" type="primary">添加</Button> <Button @click="add" type="primary">添加</Button>
<Button @click="delAll">批量删除</Button> <Button @click="delAll">批量删除</Button>

View File

@@ -4,11 +4,13 @@
<Row> <Row>
<Form ref="searchForm" :model="searchForm" @keydown.enter.native="handleSearch" @submit.native.prevent inline :label-width="70" class="search-form"> <Form ref="searchForm" :model="searchForm" @keydown.enter.native="handleSearch" @submit.native.prevent inline :label-width="70" class="search-form">
<Form-item label="会员名称" prop="memberName"> <Form-item label="会员名称" prop="memberName">
<Input type="text" v-model="searchForm.memberName" placeholder="请输入会员名称" clearable style="width: 200px"/> <Input type="text" v-model="searchForm.memberName" placeholder="请输入会员名称" clearable style="width: 240px"/>
</Form-item> </Form-item>
<Button @click="handleSearch" type="primary" class="search-btn" icon="ios-search">搜索</Button> <Button @click="handleSearch" type="primary" class="search-btn" icon="ios-search">搜索</Button>
</Form> </Form>
</Row> </Row>
</Card>
<Card>
<Table :loading="loading" border :columns="columns" :data="data" ref="table" class="mt_10"> <Table :loading="loading" border :columns="columns" :data="data" ref="table" class="mt_10">
<!-- 页面展示 --> <!-- 页面展示 -->
<template slot="shopDisableSlot" slot-scope="scope"> <template slot="shopDisableSlot" slot-scope="scope">

View File

@@ -10,7 +10,7 @@ h4 {
margin: 20px 0; margin: 20px 0;
font-size: 18px; font-size: 18px;
} }
/deep/ .ivu-icon { ::v-deep .ivu-icon {
margin-left: 40px; margin-left: 40px;
margin-right: 40px; margin-right: 40px;
} }

View File

@@ -66,16 +66,16 @@ export default {
}; };
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
/deep/ .ivu-select-dropdown { ::v-deep .ivu-select-dropdown {
text-align: left; text-align: left;
} }
.message-con { .message-con {
margin-right: 10px; margin-right: 10px;
} }
/deep/ .ivu-dropdown-item{ ::v-deep .ivu-dropdown-item{
padding: 7px 20px !important; padding: 7px 20px !important;
} }
/deep/ .ivu-badge-count{ ::v-deep .ivu-badge-count{
right: -10px !important; right: -10px !important;
} }
</style> </style>

View File

@@ -90,7 +90,7 @@ export default {
.ivu-menu-dark.ivu-menu-vertical .ivu-menu-item-active:not(.ivu-menu-submenu), .ivu-menu-dark.ivu-menu-vertical .ivu-menu-submenu-title-active:not(.ivu-menu-submenu){ .ivu-menu-dark.ivu-menu-vertical .ivu-menu-item-active:not(.ivu-menu-submenu), .ivu-menu-dark.ivu-menu-vertical .ivu-menu-submenu-title-active:not(.ivu-menu-submenu){
color: $theme_color; color: $theme_color;
} }
/deep/.ivu-menu-vertical .ivu-menu-item-group-title { ::v-deep.ivu-menu-vertical .ivu-menu-item-group-title {
height: 40px; height: 40px;
line-height: 40px; line-height: 40px;
padding-left: 20px; padding-left: 20px;

View File

@@ -14,7 +14,7 @@
v-model="searchForm.memberName" v-model="searchForm.memberName"
placeholder="请输入会员名称" placeholder="请输入会员名称"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="充值单号" prop="rechargeSn"> <Form-item label="充值单号" prop="rechargeSn">
@@ -23,7 +23,7 @@
v-model="searchForm.rechargeSn" v-model="searchForm.rechargeSn"
placeholder="请输入充值单号" placeholder="请输入充值单号"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="支付时间"> <Form-item label="支付时间">
@@ -34,11 +34,13 @@
clearable clearable
@on-change="selectDateRange" @on-change="selectDateRange"
placeholder="选择起始时间" placeholder="选择起始时间"
style="width: 200px" style="width: 240px"
></DatePicker> ></DatePicker>
</Form-item> </Form-item>
<Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button> <Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button>
</Form> </Form>
</Card>
<Card>
<Table <Table
:loading="loading" :loading="loading"
border border

View File

@@ -5,15 +5,17 @@
<Row @keydown.enter.native="handleSearch"> <Row @keydown.enter.native="handleSearch">
<Form ref="searchForm" :model="searchForm" inline :label-width="70" class="search-form"> <Form ref="searchForm" :model="searchForm" inline :label-width="70" class="search-form">
<Form-item label="会员名称" prop="memberName"> <Form-item label="会员名称" prop="memberName">
<Input type="text" v-model="searchForm.memberName" placeholder="请输入会员名称" clearable style="width: 200px" /> <Input type="text" v-model="searchForm.memberName" placeholder="请输入会员名称" clearable style="width: 240px" />
</Form-item> </Form-item>
<Form-item label="支付时间"> <Form-item label="支付时间">
<DatePicker v-model="selectDate" type="datetimerange" format="yyyy-MM-dd HH:mm:ss" clearable @on-change="selectDateRange" placeholder="选择起始时间" style="width: 200px"></DatePicker> <DatePicker v-model="selectDate" type="datetimerange" format="yyyy-MM-dd HH:mm:ss" clearable @on-change="selectDateRange" placeholder="选择起始时间" style="width: 240px"></DatePicker>
</Form-item> </Form-item>
<Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button> <Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button>
</Form> </Form>
</Row> </Row>
<Table class="mt_10" :loading="loading" border :columns="columns" :data="data" ref="table"></Table> </Card>
<Card>
<Table class="mt_10" :loading="loading" border :columns="columns" :data="data" ref="table"></Table>
<Row type="flex" justify="end" class="mt_10"> <Row type="flex" justify="end" class="mt_10">
<Page :current="searchForm.pageNumber" :total="total" :page-size="searchForm.pageSize" @on-change="changePage" @on-page-size-change="changePageSize" :page-size-opts="[10, 20, 50]" <Page :current="searchForm.pageNumber" :total="total" :page-size="searchForm.pageSize" @on-change="changePage" @on-page-size-change="changePageSize" :page-size-opts="[10, 20, 50]"
size="small" show-total show-elevator show-sizer></Page> size="small" show-total show-elevator show-sizer></Page>

View File

@@ -4,10 +4,10 @@
<Row @keydown.enter.native="handleSearch"> <Row @keydown.enter.native="handleSearch">
<Form ref="searchForm" :model="searchForm" inline :label-width="70" class="search-form"> <Form ref="searchForm" :model="searchForm" inline :label-width="70" class="search-form">
<Form-item label="会员名称" prop="memberName"> <Form-item label="会员名称" prop="memberName">
<Input type="text" v-model="searchForm.memberName" placeholder="请输入会员名称" clearable style="width: 200px" /> <Input type="text" v-model="searchForm.memberName" placeholder="请输入会员名称" clearable style="width: 240px" />
</Form-item> </Form-item>
<Form-item label="审核状态" prop="applyStatus"> <Form-item label="审核状态" prop="applyStatus">
<Select v-model="searchForm.applyStatus" clearable style="width: 200px"> <Select v-model="searchForm.applyStatus" clearable style="width: 240px">
<Option value="APPLY">申请中</Option> <Option value="APPLY">申请中</Option>
<Option value="VIA_AUDITING">审核通过</Option> <Option value="VIA_AUDITING">审核通过</Option>
<Option value="FAIL_AUDITING">审核拒绝</Option> <Option value="FAIL_AUDITING">审核拒绝</Option>
@@ -16,7 +16,7 @@
</Select> </Select>
</Form-item> </Form-item>
<Form-item label="申请时间"> <Form-item label="申请时间">
<DatePicker v-model="selectDate" type="datetimerange" format="yyyy-MM-dd HH:mm:ss" clearable @on-change="selectDateRange" placeholder="选择起始时间" style="width: 200px"></DatePicker> <DatePicker v-model="selectDate" type="datetimerange" format="yyyy-MM-dd HH:mm:ss" clearable @on-change="selectDateRange" placeholder="选择起始时间" style="width: 240px"></DatePicker>
</Form-item> </Form-item>
<Form-item style="margin-left: -35px" class="br"> <Form-item style="margin-left: -35px" class="br">
<Button @click="handleSearch" type="primary" icon="ios-search">搜索 <Button @click="handleSearch" type="primary" icon="ios-search">搜索
@@ -24,6 +24,8 @@
</Form-item> </Form-item>
</Form> </Form>
</Row> </Row>
</Card>
<Card>
<Table class="mt_10" :loading="loading" border :columns="columns" :data="data" ref="table" sortable="custom" @on-sort-change="changeSort" @on-selection-change="changeSelect"></Table> <Table class="mt_10" :loading="loading" border :columns="columns" :data="data" ref="table" sortable="custom" @on-sort-change="changeSort" @on-selection-change="changeSelect"></Table>
<Row type="flex" justify="end" class="mt_10"> <Row type="flex" justify="end" class="mt_10">
<Page :current="searchForm.pageNumber" :total="total" :page-size="searchForm.pageSize" @on-change="changePage" @on-page-size-change="changePageSize" :page-size-opts="[10, 20, 50]" size="small" <Page :current="searchForm.pageNumber" :total="total" :page-size="searchForm.pageSize" @on-change="changePage" @on-page-size-change="changePageSize" :page-size-opts="[10, 20, 50]" size="small"

View File

@@ -3,28 +3,34 @@
<Card> <Card>
<Row @keydown.enter.native="handleSearch"> <Row @keydown.enter.native="handleSearch">
<Form ref="searchForm" :model="searchForm" inline :label-width="70" class="search-form"> <Form ref="searchForm" :model="searchForm" inline :label-width="70" class="search-form">
<Form-item label="会员ID" prop="id">
<Input type="text" v-model="searchForm.id" placeholder="请输入会员ID" clearable style="width: 240px" />
</Form-item>
<Form-item label="会员名称" prop="username"> <Form-item label="会员名称" prop="username">
<Input type="text" v-model="searchForm.username" placeholder="请输入会员名称" clearable style="width: 200px" /> <Input type="text" v-model="searchForm.username" placeholder="请输入会员名称" clearable style="width: 240px" />
</Form-item> </Form-item>
<Form-item label="会员昵称" prop="nickName"> <Form-item label="会员昵称" prop="nickName">
<Input type="text" v-model="searchForm.nickName" placeholder="请输入会员昵称" clearable style="width: 200px" /> <Input type="text" v-model="searchForm.nickName" placeholder="请输入会员昵称" clearable style="width: 240px" />
</Form-item> </Form-item>
<Form-item label="联系方式" prop="mobile"> <Form-item label="联系方式" prop="mobile">
<Input type="text" v-model="searchForm.mobile" placeholder="请输入会员联系方式" clearable style="width: 200px" /> <Input type="text" v-model="searchForm.mobile" placeholder="请输入会员联系方式" clearable style="width: 240px" />
</Form-item> </Form-item>
<Button @click="handleSearch" class="search-btn" type="primary" icon="ios-search">搜索</Button> <Button @click="handleSearch" class="search-btn" type="primary" icon="ios-search">搜索</Button>
</Form> </Form>
</Row> </Row>
</Card>
<Card>
<Row class="operation padding-row" v-if="!selectedMember"> <Row class="operation padding-row" v-if="!selectedMember">
<Button @click="addMember" type="primary">添加会员</Button> <Button @click="addMember" type="primary">添加会员</Button>
</Row> </Row>
<Table :loading="loading" border :columns="columns" class="mt_10" :data="data" ref="table"></Table> <Table :loading="loading" :columns="columns" class="mt_10" :data="data" ref="table"></Table>
<Row type="flex" justify="end" class="mt_10"> <Row type="flex" justify="end" class="mt_10">
<Page :current="searchForm.pageNumber" :total="total" :page-size="searchForm.pageSize" @on-change="changePage" <Page :current="searchForm.pageNumber" :total="total" :page-size="searchForm.pageSize" @on-change="changePage"
@on-page-size-change="changePageSize" :page-size-opts="[10, 20, 50]" size="small" show-total show-elevator @on-page-size-change="changePageSize" :page-size-opts="[20, 50, 100]" size="small" show-total show-elevator
show-sizer></Page> show-sizer></Page>
</Row> </Row>
</Card> </Card>
@@ -129,8 +135,9 @@ export default {
searchForm: { searchForm: {
// 请求参数 // 请求参数
pageNumber: 1, pageNumber: 1,
pageSize: 10, pageSize: 20,
order: "desc", order: "desc",
id: "",
username: "", username: "",
mobile: "", mobile: "",
disabled: "OPEN", disabled: "OPEN",
@@ -151,19 +158,47 @@ export default {
}, },
ruleValidate: {}, //修改验证 ruleValidate: {}, //修改验证
columns: [ columns: [
{
title: "会员ID",
key: "id",
minWidth: 120, // 减少宽度
tooltip: true,
},
{
title: "头像",
key: "face",
minWidth: 80,
align: "center",
render: (h, params) => {
return h("img", {
attrs: {
src: params.row.face || require('@/assets/default.png'),
alt: "头像"
},
style: {
width: "30px",
height: "30px",
borderRadius: "50%",
objectFit: "cover"
}
});
}
},
{ {
title: "会员名称", title: "会员名称",
key: "username", key: "username",
tooltip: true, tooltip: true,
minWidth: 150, // 减少宽度
}, },
{ {
title: "会员昵称", title: "会员昵称",
key: "nickName", key: "nickName",
tooltip: true, tooltip: true,
minWidth: 150, // 减少宽度
}, },
{ {
title: "联系方式", title: "联系方式",
width: 130, minWidth: 130,
key: "mobile", key: "mobile",
render: (h, params) => { render: (h, params) => {
if (params.row.mobile == null) { if (params.row.mobile == null) {
@@ -176,13 +211,18 @@ export default {
{ {
title: "注册时间", title: "注册时间",
key: "createTime", key: "createTime",
width: 180, minWidth: 160, // 减少宽度
},
{
title: "最后登录时间",
key: "lastLoginDate",
minWidth: 160, // 减少宽度
}, },
{ {
title: "积分数量", title: "积分数量",
align: "left", align: "left",
width: 100, minWidth: 120, // 增加宽度
render: (h, params) => { render: (h, params) => {
return h( return h(
"div", "div",
@@ -195,7 +235,7 @@ export default {
title: "操作", title: "操作",
key: "action", key: "action",
align: "center", align: "center",
width: 200, minWidth: 160,
fixed: "right", fixed: "right",
render: (h, params) => { render: (h, params) => {
return h( return h(
@@ -373,7 +413,7 @@ export default {
// 搜索 // 搜索
handleSearch() { handleSearch() {
this.searchForm.pageNumber = 1; this.searchForm.pageNumber = 1;
this.searchForm.pageSize = 10; this.searchForm.pageSize = 20;
this.getData(); this.getData();
}, },
//查看详情修改 //查看详情修改
@@ -482,7 +522,7 @@ export default {
regionId, regionId,
region, region,
nickName, nickName,
username,
sex, sex,
birthday, birthday,
face, face,
@@ -506,10 +546,10 @@ export default {
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
/deep/ .ivu-table-wrapper { ::v-deep .ivu-table-wrapper {
width: 100%; width: 100%;
} }
/deep/ .ivu-card { ::v-deep .ivu-card {
width: 100%; width: 100%;
} }
.face { .face {
@@ -517,4 +557,5 @@ export default {
height: 60px; height: 60px;
border-radius: 50%; border-radius: 50%;
} }
</style> </style>

View File

@@ -192,9 +192,6 @@
</div> </div>
</TabPane> </TabPane>
<TabPane label="TA收货地址" name="address"> <TabPane label="TA收货地址" name="address">
<Row class="operation padding-row">
<Button @click="addMemberAddress" type="primary">新增</Button>
</Row>
<Table <Table
:loading="loading" :loading="loading"
border border
@@ -398,7 +395,6 @@
], ],
consigneeAddressPath: [{required: true, message: "收货人地址不能为空"}], consigneeAddressPath: [{required: true, message: "收货人地址不能为空"}],
detail: [{required: true, message: "收货人详细地址不能为空"}], detail: [{required: true, message: "收货人详细地址不能为空"}],
alias: [{required: true, message: "收货人地址别名不能为空"}],
},//会员地址操作表单校验 },//会员地址操作表单校验
//历史积分表格 //历史积分表格
pointsColumns: [ pointsColumns: [
@@ -669,58 +665,6 @@
} }
}, },
{
title: "操作",
key: "action",
align: "center",
width: 120,
fixed: "right",
render: (h, params) => {
return h("div", {
style: {
display: "flex",
justifyContent: "center"
}
}, [
h(
"Button",
{
props: {
type: "error",
size: "small",
},
style: {
marginRight: "5px",
},
on: {
click: () => {
this.memberAddressRemove(params.row);
},
},
},
"删除"
),
h(
"Button",
{
props: {
type: "info",
size: "small",
},
style: {
marginRight: "5px",
},
on: {
click: () => {
this.editAddress(params.row);
},
},
},
"编辑"
),
]);
},
},
], ],
addressData: [],//历史积分数据 addressData: [],//历史积分数据
@@ -954,25 +898,6 @@
}); });
this.loading = false; this.loading = false;
}, },
//新增TA的收货地址
addMemberAddress() {
this.addressModalTitle = "新增会员地址";
this.addressModalVisible = true
this.addressForm = {
id: "",
isDefault: 0,
}
},
//修改TA的收货地址
editAddress(v) {
this.addressModalTitle = "修改会员地址";
this.addressForm = JSON.parse(JSON.stringify(v));
this.addressForm.isDefault = v.isDefault?1:0;
// this.$set(this, "addressForm", v);
delete this.addressForm.updateTime;
this.addressModalVisible = true
},
//新增或者修改表单提交 //新增或者修改表单提交
addressSubmit() { addressSubmit() {
this.addressForm.memberId = this.id this.addressForm.memberId = this.id

View File

@@ -16,7 +16,7 @@
v-model="searchForm.username" v-model="searchForm.username"
placeholder="请输入会员名称" placeholder="请输入会员名称"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
@@ -26,7 +26,7 @@
v-model="searchForm.mobile" v-model="searchForm.mobile"
placeholder="请输入会员联系方式" placeholder="请输入会员联系方式"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Button <Button
@@ -38,6 +38,8 @@
> >
</Form> </Form>
</Row> </Row>
</Card>
<Card>
<Table <Table
:loading="loading" :loading="loading"
border border
@@ -435,7 +437,7 @@ export default {
regionId:regionId, regionId:regionId,
region: region, region: region,
nickName, nickName,
username,
sex, sex,
birthday, birthday,
face: face || "", face: face || "",

View File

@@ -1,12 +1,12 @@
<template> <template>
<div class="search"> <div class="search">
<Card style="padding:0 10px 10px 0"> <Card >
<Form <Form
@keydown.enter.native="handleSearch" @keydown.enter.native="handleSearch"
ref="searchForm" ref="searchForm"
:model="searchForm" :model="searchForm"
inline inline
style="margin-top:10px"
:label-width="70" :label-width="70"
@submit.native.prevent @submit.native.prevent
class="search-form" class="search-form"
@@ -17,11 +17,13 @@
v-model="searchForm.memberName" v-model="searchForm.memberName"
placeholder="请输入会员名称" placeholder="请输入会员名称"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Button @click="handleSearch" class="search-btn" type="primary" icon="ios-search">搜索</Button > <Button @click="handleSearch" class="search-btn" type="primary" icon="ios-search">搜索</Button >
</Form> </Form>
</Card>
<Card>
<Table <Table
:loading="loading" :loading="loading"
border border

View File

@@ -9,13 +9,23 @@
:label-width="70" :label-width="70"
class="search-form" class="search-form"
> >
<Form-item label="关键字" prop="keywords" style="display: block; width: 100%;">
<Input
type="text"
v-model="searchForm.keywords"
placeholder="请输入商品名称、订单编号搜索"
clearable
style="width: 240px"
/>
</Form-item>
<br>
<Form-item label="订单编号" prop="orderSn"> <Form-item label="订单编号" prop="orderSn">
<Input <Input
type="text" type="text"
v-model="searchForm.orderSn" v-model="searchForm.orderSn"
placeholder="请输入订单编号" placeholder="请输入订单编号"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="售后单号" prop="sn"> <Form-item label="售后单号" prop="sn">
@@ -24,7 +34,7 @@
v-model="searchForm.sn" v-model="searchForm.sn"
placeholder="请输入售后单号" placeholder="请输入售后单号"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="申请时间"> <Form-item label="申请时间">
@@ -35,7 +45,7 @@
clearable clearable
@on-change="selectDateRange" @on-change="selectDateRange"
placeholder="选择起始时间" placeholder="选择起始时间"
style="width: 200px" style="width: 240px"
></DatePicker> ></DatePicker>
</Form-item> </Form-item>
<Form-item label="商家名称" prop="storeName"> <Form-item label="商家名称" prop="storeName">
@@ -44,7 +54,7 @@
v-model="searchForm.storeName" v-model="searchForm.storeName"
placeholder="请输入商家名称" placeholder="请输入商家名称"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="会员名称" prop="memberName"> <Form-item label="会员名称" prop="memberName">
@@ -53,7 +63,7 @@
v-model="searchForm.memberName" v-model="searchForm.memberName"
placeholder="请输入会员名称" placeholder="请输入会员名称"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="售后类型"> <Form-item label="售后类型">
@@ -61,7 +71,7 @@
v-model="searchForm.serviceType" v-model="searchForm.serviceType"
placeholder="全部" placeholder="全部"
clearable clearable
style="width: 200px" style="width: 240px"
> >
<Option value="RETURN_MONEY">退款</Option> <Option value="RETURN_MONEY">退款</Option>
<Option value="RETURN_GOODS">退货</Option> <Option value="RETURN_GOODS">退货</Option>
@@ -76,16 +86,17 @@
> >
</Form> </Form>
</Row> </Row>
</Card>
<Card>
<div class="order-tab"> <div class="order-tab">
<div v-for="(item,index) in serviceStatus" :key="index" :class="{'current': currentStatus === item.value}" @click="serviceStatusClick(item)"> <Tabs v-model="currentStatus" @on-click="serviceStatusClick">
{{item.title}} <TabPane v-for="item in serviceStatusWithCount" :key="item.value" :label="item.title" :name="item.value">
</div> </TabPane>
</Tabs>
</div> </div>
<Table <Table
:loading="loading" :loading="loading"
border
:columns="columns" :columns="columns"
:data="data" :data="data"
ref="table" ref="table"
@@ -102,24 +113,9 @@
<div class="div-zoom"> <div class="div-zoom">
<a @click="linkTo(row.goodsId, row.skuId)">{{ row.goodsName }}</a> <a @click="linkTo(row.goodsId, row.skuId)">{{ row.goodsName }}</a>
</div> </div>
<Poptip trigger="hover" title="扫码在手机中查看" transfer> <div style="color: #999; font-size: 12px; margin-top: 5px;">
<div slot="content"> 商品ID: {{ row.goodsId }}
<vue-qr </div>
:text="wapLinkTo(row.goodsId, row.skuId)"
:margin="0"
colorDark="#000"
colorLight="#fff"
:size="150"
></vue-qr>
</div>
<img
src="../../../assets/qrcode.svg"
class="hover-pointer"
width="20"
height="20"
alt=""
/>
</Poptip>
</div> </div>
</div> </div>
</template> </template>
@@ -131,7 +127,7 @@
:page-size="searchForm.pageSize" :page-size="searchForm.pageSize"
@on-change="changePage" @on-change="changePage"
@on-page-size-change="changePageSize" @on-page-size-change="changePageSize"
:page-size-opts="[10, 20, 50]" :page-size-opts="[20, 50, 100]"
size="small" size="small"
show-total show-total
show-elevator show-elevator
@@ -156,7 +152,7 @@ export default {
searchForm: { searchForm: {
// 搜索框初始化对象 // 搜索框初始化对象
pageNumber: 1, // 当前页数 pageNumber: 1, // 当前页数
pageSize: 10, // 页面大小 pageSize: 20, // 页面大小
sort: "createTime", // 默认排序字段 sort: "createTime", // 默认排序字段
order: "desc", // 默认排序方式 order: "desc", // 默认排序方式
startDate: "", // 起始时间 startDate: "", // 起始时间
@@ -166,6 +162,7 @@ export default {
serviceStatus: "", serviceStatus: "",
storeName: "", storeName: "",
sn: "", sn: "",
keywords: "", // 新增关键字搜索字段
}, },
selectDate: null, // 选择时间段 selectDate: null, // 选择时间段
form: { form: {
@@ -189,6 +186,13 @@ export default {
minWidth: 120, minWidth: 120,
tooltip: true, tooltip: true,
}, },
// 移除这个独立的商品ID列
// {
// title: "商品ID",
// key: "goodsId",
// minWidth: 120,
// tooltip: true,
// },
{ {
title: "商品", title: "商品",
key: "goodsName", key: "goodsName",
@@ -196,15 +200,21 @@ export default {
tooltip: true, tooltip: true,
slot: "goodsSlot", slot: "goodsSlot",
}, },
{
title: "会员ID",
key: "memberId",
minWidth: 120,
tooltip: true,
},
{ {
title: "会员名称", title: "会员名称",
key: "memberName", key: "memberName",
width: 140, width: 140,
}, },
{ {
title: "商家名称", title: "店铺名称",
key: "storeName", key: "storeName",
minWidth: 100, width: 100,
tooltip: true, tooltip: true,
}, },
{ {
@@ -233,7 +243,7 @@ export default {
{ {
title: "售后状态", title: "售后状态",
key: "serviceStatus", key: "serviceStatus",
width: 150, width: 180,
render: (h, params) => { render: (h, params) => {
if (params.row.serviceStatus == "APPLY") { if (params.row.serviceStatus == "APPLY") {
return h("div", [h("tag", { props: { color: "blue" } }, "申请中")]); return h("div", [h("tag", { props: { color: "blue" } }, "申请中")]);
@@ -306,13 +316,15 @@ export default {
{title: '卖家终止售后', value: 'SELLER_TERMINATION'}, {title: '卖家终止售后', value: 'SELLER_TERMINATION'},
{title: '买家取消售后', value: 'BUYER_CANCEL'} {title: '买家取消售后', value: 'BUYER_CANCEL'}
], ],
currentStatus: '' currentStatus: '',
afterSaleNumData: {} // 售后数量统计数据
}; };
}, },
methods: { methods: {
// 初始化数据 // 初始化数据
init() { init() {
this.getDataList(); this.getDataList();
this.getAfterSaleNumData();
}, },
// 分页 改变页码 // 分页 改变页码
changePage(v) { changePage(v) {
@@ -328,8 +340,9 @@ export default {
// 搜索 // 搜索
handleSearch() { handleSearch() {
this.searchForm.pageNumber = 1; this.searchForm.pageNumber = 1;
this.searchForm.pageSize = 10; this.searchForm.pageSize = 20;
this.getDataList(); this.getDataList();
this.getAfterSaleNumData();
}, },
// 开始结束时间分别赋值 // 开始结束时间分别赋值
selectDateRange(v) { selectDateRange(v) {
@@ -348,9 +361,19 @@ export default {
this.total = res.result.total; this.total = res.result.total;
} }
}); });
// 获取售后状态数量
this.total = this.data.length; this.total = this.data.length;
this.loading = false; this.loading = false;
}, },
// 获取售后数量统计
getAfterSaleNumData() {
const { serviceStatus, ...searchParams } = this.searchForm;
API_Order.getAfterSaleNumVO(searchParams).then((res) => {
if (res.success) {
this.afterSaleNumData = res.result;
}
});
},
// 跳转售后详情 // 跳转售后详情
detail(v) { detail(v) {
let sn = v.sn; let sn = v.sn;
@@ -361,37 +384,44 @@ export default {
}, },
// 售后筛选 // 售后筛选
serviceStatusClick(item) { serviceStatusClick(item) {
this.currentStatus = item.value; this.currentStatus = item;
this.searchForm.serviceStatus = item.value; // 如果是全部空字符串则删除serviceStatus字段
if (item === 0) {
delete this.searchForm.serviceStatus;
} else {
this.searchForm.serviceStatus = item;
}
this.getDataList(); this.getDataList();
this.getAfterSaleNumData();
}, },
}, },
mounted() { mounted() {
this.init(); this.init();
}, },
}; computed: {
</script> // 带数量的售后状态
serviceStatusWithCount() {
<style lang="scss" scoped> return [
{title: '全部', value: ''},
.order-tab { {title: `申请售后${this.afterSaleNumData.applyNum ? '(' + this.afterSaleNumData.applyNum + ')' : ''}`, value: 'APPLY'},
{title: `通过售后${this.afterSaleNumData.passNum ? '(' + this.afterSaleNumData.passNum + ')' : ''}`, value: 'PASS'},
width: 950px; {title: `拒绝售后${this.afterSaleNumData.refuseNum ? '(' + this.afterSaleNumData.refuseNum + ')' : ''}`, value: 'REFUSE'},
height: 36px; {title: `待收货${this.afterSaleNumData.buyerReturnNum ? '(' + this.afterSaleNumData.buyerReturnNum + ')' : ''}`, value: 'BUYER_RETURN'},
display: flex; {title: `确认收货${this.afterSaleNumData.sellerConfirmNum ? '(' + this.afterSaleNumData.sellerConfirmNum + ')' : ''}`, value: 'SELLER_CONFIRM'},
align-items: center; {title: `完成售后${this.afterSaleNumData.completeNum ? '(' + this.afterSaleNumData.completeNum + ')' : ''}`, value: 'COMPLETE'},
justify-content: space-between; {title: `卖家终止售后${this.afterSaleNumData.sellerTerminationNum ? '(' + this.afterSaleNumData.sellerTerminationNum + ')' : ''}`, value: 'SELLER_TERMINATION'},
background-color: #f0f0f0; {title: `买家取消售后${this.afterSaleNumData.buyerCancelNum ? '(' + this.afterSaleNumData.buyerCancelNum + ')' : ''}`, value: 'BUYER_CANCEL'},
padding: 0 10px; {title: `等待平台退款${this.afterSaleNumData.waitRefundNum ? '(' + this.afterSaleNumData.waitRefundNum + ')' : ''}`, value: 'WAIT_REFUND'}
margin: 10px 20px 10px 0; ];
div { }
text-align: center; }
padding: 4px 12px;
border-radius: 4px;
cursor: pointer;
} }
.current { </script>
background-color: #ffffff; <style lang="scss" scoped>
// Tab组件样式
.order-tab {
::v-deep .ivu-tabs-tab {
font-size: 14px;
} }
} }
</style> </style>

View File

@@ -39,7 +39,7 @@
<dl v-if="afterSaleInfo.actualRefundPrice"> <dl v-if="afterSaleInfo.actualRefundPrice">
<dt>实际退款金额</dt> <dt>实际退款金额</dt>
<dd> <dd>
<priceColorScheme :value="afterSaleInfo.applyRefundPrice" :color="$mainColor"></priceColorScheme> <priceColorScheme :value="afterSaleInfo.actualRefundPrice" :color="$mainColor"></priceColorScheme>
</dd> </dd>
</dl> </dl>
<dl v-if="afterSaleInfo.refundPoint"> <dl v-if="afterSaleInfo.refundPoint">

View File

@@ -9,7 +9,7 @@
v-model="searchForm.orderSn" v-model="searchForm.orderSn"
placeholder="请输入订单编号" placeholder="请输入订单编号"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="会员名称" prop="memberName"> <Form-item label="会员名称" prop="memberName">
@@ -18,11 +18,11 @@
v-model="searchForm.memberName" v-model="searchForm.memberName"
placeholder="请输入会员名称" placeholder="请输入会员名称"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="状态" prop="status"> <Form-item label="状态" prop="status">
<Select v-model="searchForm.status" placeholder="请选择" clearable style="width: 200px"> <Select v-model="searchForm.status" placeholder="请选择" clearable style="width: 240px">
<Option value="NEW">新投诉</Option> <Option value="NEW">新投诉</Option>
<Option value="CANCEL">已撤销</Option> <Option value="CANCEL">已撤销</Option>
<Option value="WAIT_APPEAL">待申诉</Option> <Option value="WAIT_APPEAL">待申诉</Option>
@@ -34,6 +34,8 @@
<Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button> <Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button>
</Form> </Form>
</Row> </Row>
</Card>
<Card>
<Table <Table
:loading="loading" :loading="loading"
border border

View File

@@ -2,32 +2,31 @@
<div class="search"> <div class="search">
<Card> <Card>
<Row @keydown.enter.native="handleSearch"> <Row @keydown.enter.native="handleSearch">
<Form ref="searchForm" :model="searchForm" inline :label-width="100" class="search-form"> <Form ref="searchForm" :model="searchForm" inline :label-width="70" class="search-form">
<Form-item label="订单号" prop="sn"> <Form-item label="订单号" prop="sn">
<Input type="text" v-model="searchForm.sn" placeholder="订单/交易号" clearable style="width: 200px" /> <Input type="text" v-model="searchForm.sn" placeholder="订单/交易号" clearable style="width: 240px" />
</Form-item> </Form-item>
<Form-item label="付款状态" prop="orderStatus"> <Form-item label="付款状态" prop="orderStatus">
<Select v-model="searchForm.payStatus" placeholder="请选择" clearable style="width: 200px"> <Select v-model="searchForm.payStatus" placeholder="请选择" clearable style="width: 240px">
<Option value="UNPAID">未付款</Option> <Option value="UNPAID">未付款</Option>
<Option value="PAID">已付款</Option> <Option value="PAID">已付款</Option>
</Select> </Select>
</Form-item> </Form-item>
<Form-item label="支付方式" prop="orderStatus"> <Form-item label="支付方式" prop="orderStatus">
<Select v-model="searchForm.paymentMethod" placeholder="请选择" clearable style="width: 200px"> <Select v-model="searchForm.paymentMethod" placeholder="请选择" clearable style="width: 240px">
<Option value="">全部</Option> <Option value="">全部</Option>
<Option value="WECHAT">微信</Option> <Option value="WECHAT">微信</Option>
<Option value="ALIPAY">支付宝</Option> <Option value="ALIPAY">支付宝</Option>
<Option value="WALLET">余额</Option> <Option value="WALLET">余额</Option>
<Option value="BANK_TRANSFER">银行转账</Option> <Option value="BANK_TRANSFER">银行转账</Option>
</Select> </Select>
</Form-item> </Form-item>
<Form-item label="订单创建时间">
<DatePicker v-model="times" type="datetimerange" format="yyyy-MM-dd HH:mm" clearable @on-change="changeDate" placeholder="选择支付时间" style="width: 200px"></DatePicker>
</Form-item>
<Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button> <Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button>
</Form> </Form>
</Row> </Row>
</Card>
<Card>
<Table :loading="loading" border :columns="columns" :data="data" ref="table" class="mt_10"></Table> <Table :loading="loading" border :columns="columns" :data="data" ref="table" class="mt_10"></Table>
<Row type="flex" justify="end" class="mt_10"> <Row type="flex" justify="end" class="mt_10">
<Page :current="searchForm.pageNumber" :total="total" :page-size="searchForm.pageSize" @on-change="changePage" @on-page-size-change="changePageSize" :page-size-opts="[10, 20, 50]" size="small" <Page :current="searchForm.pageNumber" :total="total" :page-size="searchForm.pageSize" @on-change="changePage" @on-page-size-change="changePageSize" :page-size-opts="[10, 20, 50]" size="small"

View File

@@ -15,7 +15,7 @@
v-model="searchForm.orderSn" v-model="searchForm.orderSn"
placeholder="订单/交易号" placeholder="订单/交易号"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="退款状态"> <Form-item label="退款状态">
@@ -23,7 +23,7 @@
v-model="searchForm.isRefund" v-model="searchForm.isRefund"
placeholder="请选择" placeholder="请选择"
clearable clearable
style="width: 200px" style="width: 240px"
> >
<Option value="false">未退款</Option> <Option value="false">未退款</Option>
<Option value="true">已退款</Option> <Option value="true">已退款</Option>
@@ -37,7 +37,7 @@
clearable clearable
@on-change="selectDateRange" @on-change="selectDateRange"
placeholder="选择起始时间" placeholder="选择起始时间"
style="width: 200px" style="width: 240px"
></DatePicker> ></DatePicker>
</Form-item> </Form-item>
<Button <Button
@@ -49,6 +49,8 @@
> >
</Form> </Form>
</Row> </Row>
</Card>
<Card>
<Table <Table
:loading="loading" :loading="loading"
border border

View File

@@ -4,34 +4,26 @@
<Row @keydown.enter.native="handleSearch"> <Row @keydown.enter.native="handleSearch">
<Form ref="searchForm" :model="searchForm" inline :label-width="70" class="search-form"> <Form ref="searchForm" :model="searchForm" inline :label-width="70" class="search-form">
<Form-item label="订单号" prop="orderSn"> <Form-item label="订单号" prop="orderSn">
<Input type="text" v-model="searchForm.orderSn" placeholder="请输入订单号" clearable style="width: 200px" /> <Input type="text" v-model="searchForm.orderSn" placeholder="请输入订单号" clearable style="width: 240px" />
</Form-item> </Form-item>
<Form-item label="会员名称" prop="buyerName"> <Form-item label="会员名称" prop="buyerName">
<Input type="text" v-model="searchForm.buyerName" placeholder="请输入会员名称" clearable style="width: 200px" /> <Input type="text" v-model="searchForm.buyerName" placeholder="请输入会员名称" clearable style="width: 240px" />
</Form-item> </Form-item>
<!-- <Form-item label="订单状态" prop="orderStatus">-->
<!-- <Select v-model="searchForm.orderStatus" placeholder="请选择" clearable style="width: 200px">-->
<!-- <Option value="NEW">新订单</Option>-->
<!-- <Option value="CONFIRM">已确认</Option>-->
<!-- <Option value="TAKE">待核验</Option>-->
<!-- <Option value="COMPLETE">已完成</Option>-->
<!-- <Option value="WAIT_PINTUAN">待成团</Option>-->
<!-- <Option value="CANCELLED">已关闭</Option>-->
<!-- </Select>-->
<!-- </Form-item>-->
<Form-item label="下单时间"> <Form-item label="下单时间">
<DatePicker v-model="selectDate" type="datetimerange" format="yyyy-MM-dd" clearable <DatePicker v-model="selectDate" type="datetimerange" format="yyyy-MM-dd" clearable
@on-change="selectDateRange" placeholder="选择起始时间" style="width: 200px"></DatePicker> @on-change="selectDateRange" placeholder="选择起始时间" style="width: 240px"></DatePicker>
</Form-item> </Form-item>
<Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button> <Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button>
</Form> </Form>
</Row> </Row>
</Card>
<Card>
<div class="order-tab"> <div class="order-tab">
<div v-for="(item,index) in orderStatus" :key="index" :class="{'current': currentStatus === item.value}" @click="orderStatusClick(item)"> <Tabs v-model="currentStatus" @on-click="orderStatusClick">
{{item.title}} <TabPane v-for="(item,index) in orderStatus" :key="index" :label="item.title" :name="item.value">
</div> </TabPane>
</Tabs>
</div> </div>
<Table :loading="loading" border :columns="columns" :data="data" ref="table" class="mt_10" sortable="custom" <Table :loading="loading" border :columns="columns" :data="data" ref="table" class="mt_10" sortable="custom"
@@ -275,8 +267,8 @@ export default {
}, },
// 订单筛选 // 订单筛选
orderStatusClick(item) { orderStatusClick(item) {
this.currentStatus = item.value; this.currentStatus = item; // 使用参数 item
this.searchForm.orderStatus = item.value; this.searchForm.orderStatus = item; // 使用参数 item
this.getDataList(); this.getDataList();
}, },
}, },
@@ -288,23 +280,11 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
// Tab组件样式
.order-tab { .order-tab {
margin: 10px 20px 10px 0; margin-top: 20px;
width: 950px; ::v-deep .ivu-tabs-tab {
height: 36px; font-size: 14px;
display: flex;
align-items: center;
justify-content: space-between;
background-color: #f0f0f0;
padding: 0 10px;
div {
text-align: center;
padding: 4px 12px;
border-radius: 4px;
cursor: pointer;
}
.current {
background-color: #ffffff;
} }
} }
</style> </style>

View File

@@ -9,13 +9,22 @@
:label-width="70" :label-width="70"
class="search-form" class="search-form"
> >
<Form-item label="关键字" prop="keywords" style="display: block; width: 100%;">
<Input
type="text"
v-model="searchForm.keywords"
placeholder="请输入商品名称/收货人/收货人手机号/店铺名称"
clearable
style="width: 500px"
/>
</Form-item>
<Form-item label="订单号" prop="orderSn"> <Form-item label="订单号" prop="orderSn">
<Input <Input
type="text" type="text"
v-model="searchForm.orderSn" v-model="searchForm.orderSn"
placeholder="请输入订单号" placeholder="请输入订单号"
clearable clearable
style="width: 160px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="会员名称" prop="buyerName"> <Form-item label="会员名称" prop="buyerName">
@@ -24,16 +33,33 @@
v-model="searchForm.buyerName" v-model="searchForm.buyerName"
placeholder="请输入会员名称" placeholder="请输入会员名称"
clearable clearable
style="width: 160px" style="width: 240px"
/>
</Form-item>
<Form-item label="商品名称" prop="goodsName">
<Input
type="text"
v-model="searchForm.goodsName"
placeholder="请输入商品名称"
clearable
style="width: 240px"
/>
</Form-item>
<Form-item label="收货人" prop="shipName">
<Input
type="text"
v-model="searchForm.shipName"
placeholder="请输入收货人姓名"
clearable
style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="订单类型" prop="orderType"> <Form-item label="订单类型" prop="orderType">
<Select <Select
v-model="searchForm.orderPromotionType" v-model="searchForm.orderPromotionType"
placeholder="请选择" placeholder="请选择"
clearable clearable
style="width: 160px" style="width: 240px"
> >
<Option value="NORMAL">普通订单</Option> <Option value="NORMAL">普通订单</Option>
<Option value="PINTUAN">拼团订单</Option> <Option value="PINTUAN">拼团订单</Option>
@@ -42,6 +68,19 @@
<Option value="KANJIA">砍价订单</Option> <Option value="KANJIA">砍价订单</Option>
</Select> </Select>
</Form-item> </Form-item>
<Form-item label="支付方式" prop="paymentMethod">
<Select
v-model="searchForm.paymentMethod"
placeholder="请选择支付方式"
clearable
style="width: 240px"
>
<Option value="WECHAT">微信支付</Option>
<Option value="ALIPAY">支付宝</Option>
<Option value="WALLET">余额支付</Option>
<Option value="BANK_TRANSFER">线下转账</Option>
</Select>
</Form-item>
<Form-item label="下单时间"> <Form-item label="下单时间">
<DatePicker <DatePicker
v-model="selectDate" v-model="selectDate"
@@ -50,26 +89,9 @@
clearable clearable
@on-change="selectDateRange" @on-change="selectDateRange"
placeholder="选择起始时间" placeholder="选择起始时间"
style="width: 160px" style="width: 240px"
></DatePicker> ></DatePicker>
</Form-item> </Form-item>
<!-- <Form-item label="订单状态" prop="orderStatus">-->
<!-- <Select-->
<!-- v-model="searchForm.orderStatus"-->
<!-- placeholder="请选择"-->
<!-- clearable-->
<!-- style="width: 160px"-->
<!-- >-->
<!-- <Option value="UNPAID">未付款</Option>-->
<!-- <Option value="PAID">已付款</Option>-->
<!-- <Option value="UNDELIVERED">待发货</Option>-->
<!-- <Option value="DELIVERED">已发货</Option>-->
<!-- <Option value="COMPLETED">已完成</Option>-->
<!-- <Option value="TAKE">待核验</Option>-->
<!-- <Option value="CANCELLED">已关闭</Option>-->
<!-- <Option value="STAY_PICKED_UP">待自提</Option>-->
<!-- </Select>-->
<!-- </Form-item>-->
<Button <Button
@click="handleSearch" @click="handleSearch"
type="primary" type="primary"
@@ -78,19 +100,19 @@
>搜索</Button >搜索</Button
> >
</Form> </Form>
</Card>
<Card>
<div class="order-tab">
<Tabs v-model="currentStatus" @on-click="orderStatusClick">
<TabPane v-for="(item,index) in orderStatusWithCount" :key="index" :label="item.title" :name="item.value">
</TabPane>
</Tabs>
</div>
<div> <div>
<Button @click="exportOrder" type="info" class="export">导出订单</Button> <Button @click="exportOrder" type="info" class="export">导出订单</Button>
</div> </div>
<div class="order-tab">
<div v-for="(item,index) in orderStatus" :key="index" :class="{'current': currentStatus === item.value}" @click="orderStatusClick(item)">
{{item.title}}
</div>
</div>
<Table <Table
:loading="loading" :loading="loading"
border
:columns="columns" :columns="columns"
:data="data" :data="data"
ref="table" ref="table"
@@ -104,7 +126,7 @@
:page-size="searchForm.pageSize" :page-size="searchForm.pageSize"
@on-change="changePage" @on-change="changePage"
@on-page-size-change="changePageSize" @on-page-size-change="changePageSize"
:page-size-opts="[10, 20, 50]" :page-size-opts="[20, 50, 100]"
size="small" size="small"
show-total show-total
show-elevator show-elevator
@@ -163,15 +185,19 @@ export default {
searchForm: { searchForm: {
// 搜索框初始化对象 // 搜索框初始化对象
pageNumber: 1, // 当前页数 pageNumber: 1, // 当前页数
pageSize: 10, // 页面大小 pageSize: 20, // 页面大小
sort: "createTime", // 默认排序字段 sort: "createTime", // 默认排序字段
order: "desc", // 默认排序方式 order: "desc", // 默认排序方式
startDate: "", // 起始时间 startDate: "", // 起始时间
endDate: "", // 终止时间 endDate: "", // 终止时间
orderType: "", orderType: "",
orderSn: "", orderSn: "",
keywords: "", // 新增关键字搜索字段
buyerName: "", buyerName: "",
goodsName: "", // 新增商品名称筛选字段
shipName: "", // 新增收货人筛选字段
orderStatus: "", orderStatus: "",
paymentMethod: "", // 新增支付方式筛选字段
}, },
selectDate: null, selectDate: null,
columns: [ columns: [
@@ -181,7 +207,6 @@ export default {
minWidth: 240, minWidth: 240,
tooltip: true, tooltip: true,
}, },
{ {
title: "订单来源", title: "订单来源",
key: "clientType", key: "clientType",
@@ -235,6 +260,19 @@ export default {
tooltip: true, tooltip: true,
}, },
{
title: "会员ID",
key: "memberId",
minWidth: 120,
tooltip: true,
},
{
title: "店铺名称",
key: "storeName",
minWidth: 150,
tooltip: true,
},
{ {
title: "订单金额", title: "订单金额",
key: "flowPrice", key: "flowPrice",
@@ -245,7 +283,24 @@ export default {
}, },
}, },
{
title: "支付方式",
key: "paymentMethod",
width: 120,
render: (h, params) => {
if (params.row.paymentMethod == "WECHAT") {
return h("div", {}, "微信支付");
} else if (params.row.paymentMethod == "ALIPAY") {
return h("div", {}, "支付宝");
} else if (params.row.paymentMethod == "WALLET") {
return h("div", {}, "余额支付");
} else if (params.row.paymentMethod == "BANK_TRANSFER") {
return h("div", {}, "线下转账");
} else {
return h("div", {}, params.row.paymentMethod || "-");
}
},
},
{ {
title: "订单状态", title: "订单状态",
key: "orderStatus", key: "orderStatus",
@@ -267,6 +322,10 @@ export default {
return h("div", [ return h("div", [
h("tag", { props: { color: "geekblue" } }, "待自提"), h("tag", { props: { color: "geekblue" } }, "待自提"),
]); ]);
} else if (params.row.orderStatus == "PARTS_DELIVERED") {
return h("div", [
h("tag", { props: { color: "cyan" } }, "部分发货"),
]);
} else if (params.row.orderStatus == "DELIVERED") { } else if (params.row.orderStatus == "DELIVERED") {
return h("div", [ return h("div", [
h("tag", { props: { color: "cyan" } }, "已发货"), h("tag", { props: { color: "cyan" } }, "已发货"),
@@ -315,25 +374,44 @@ export default {
], ],
data: [], // 表单数据 data: [], // 表单数据
total: 0, // 表单数据总数 total: 0, // 表单数据总数
orderNumData: {}, // 新增:订单数量统计数据
orderStatus: [ orderStatus: [
{title: '全部', value: ''}, {title: '全部', value: ''},
{title: '未付款', value: 'UNPAID'}, {title: '未付款', value: 'UNPAID'},
{title: '已付款', value: 'PAID'}, {title: '已付款', value: 'PAID'},
{title: '待发货', value: 'UNDELIVERED'}, {title: '待发货', value: 'UNDELIVERED'},
{title: '部分发货', value: 'PARTS_DELIVERED'},
{title: '已发货', value: 'DELIVERED'}, {title: '已发货', value: 'DELIVERED'},
{title: '待核验', value: 'TAKE'}, {title: '待核验', value: 'TAKE'},
{title: '待自提', value: 'STAY_PICKED_UP'}, {title: '待自提', value: 'STAY_PICKED_UP'},
{title: '已完成', value: 'COMPLETED'}, {title: '已完成', value: 'COMPLETED'},
{title: '已关闭', value: 'CANCELLED'}, {title: '已关闭', value: 'CANCELLED'},
], ],
currentStatus: '' currentStatus: ''
}; };
}, },
computed: {
// 新增:带数量的订单状态选项
orderStatusWithCount() {
return [
{title: '全部', value: ''},
{title: `未付款${this.orderNumData.waitPayNum ? '(' + this.orderNumData.waitPayNum + ')' : ''}`, value: 'UNPAID'},
{title: `已付款${this.orderNumData.waitDeliveryNum ? '(' + this.orderNumData.waitDeliveryNum + ')' : ''}`, value: 'PAID'},
{title: `待发货${this.orderNumData.waitShipNum ? '(' + this.orderNumData.waitShipNum + ')' : ''}`, value: 'UNDELIVERED'},
{title: `部分发货${this.orderNumData.partsDeliveredNumNum ? '(' + this.orderNumData.partsDeliveredNumNum + ')' : ''}`, value: 'PARTS_DELIVERED'},
{title: `待收货${this.orderNumData.deliveredNum ? '(' + this.orderNumData.deliveredNum + ')' : ''}`, value: 'DELIVERED'},
{title: `待核验${this.orderNumData.waitCheckNum ? '(' + this.orderNumData.waitCheckNum + ')' : ''}`, value: 'TAKE'},
{title: `待自提${this.orderNumData.waitSelfPickNum ? '(' + this.orderNumData.waitSelfPickNum + ')' : ''}`, value: 'STAY_PICKED_UP'},
{title: `已完成${this.orderNumData.finishNum ? '(' + this.orderNumData.finishNum + ')' : ''}`, value: 'COMPLETED'},
{title: `已关闭${this.orderNumData.closeNum ? '(' + this.orderNumData.closeNum + ')' : ''}`, value: 'CANCELLED'},
];
}
},
methods: { methods: {
// 初始化数据 // 初始化数据
init() { init() {
this.getDataList(); this.getDataList();
this.getOrderNumData(); // 新增:获取订单数量统计
}, },
// 分页 改变页码 // 分页 改变页码
changePage(v) { changePage(v) {
@@ -349,8 +427,9 @@ export default {
// 搜索 // 搜索
handleSearch() { handleSearch() {
this.searchForm.pageNumber = 1; this.searchForm.pageNumber = 1;
this.searchForm.pageSize = 10; this.searchForm.pageSize = 20;
this.getDataList(); this.getDataList();
this.getOrderNumData(); // 新增:搜索时也更新数量统计
}, },
// 起止时间从新赋值 // 起止时间从新赋值
selectDateRange(v) { selectDateRange(v) {
@@ -414,11 +493,29 @@ export default {
}, },
// 订单筛选 // 订单筛选
orderStatusClick(item) { orderStatusClick(name) {
this.currentStatus = item.value; if (name === 0) {
this.searchForm.orderStatus = item.value; // 点击"全部"时设置为空字符串在getDataList中会被过滤掉
this.searchForm.orderStatus = '';
} else {
// 其他状态正常赋值
this.searchForm.orderStatus = name;
}
this.currentStatus = name;
this.getDataList(); this.getDataList();
}, },
getOrderNumData() {
// 创建一个不包含orderStatus字段的搜索参数
const { orderStatus, ...searchParams } = this.searchForm;
API_Order.getOrderNum(searchParams).then((res) => {
if (res.success) {
this.orderNumData = res.result;
}
}).catch((err) => {
console.error('获取订单数量统计失败:', err);
});
},
}, },
mounted() { mounted() {
this.init(); this.init();
@@ -432,23 +529,11 @@ export default {
.export-excel-wrapper { .export-excel-wrapper {
display: inline; display: inline;
} }
// Tab组件样式
.order-tab { .order-tab {
width: 950px; ::v-deep .ivu-tabs-tab {
height: 36px; font-size: 14px;
display: flex;
align-items: center;
justify-content: space-between;
background-color: #f0f0f0;
padding: 0 10px;
margin-bottom: 10px;
div {
text-align: center;
padding: 4px 12px;
border-radius: 4px;
cursor: pointer;
}
.current {
background-color: #ffffff;
} }
} }
</style> </style>

View File

@@ -134,7 +134,7 @@
<td> <td>
<Input <Input
v-model="item.url" v-model="item.url"
disabled :disabled="!item.title || item.title !== '外部链接'"
/> />
</td> </td>
<!-- <td><Input v-model="item.sort"/></td> --> <!-- <td><Input v-model="item.sort"/></td> -->
@@ -201,15 +201,16 @@ export default {
bgColor: "#de000d", bgColor: "#de000d",
size: "1200*80", size: "1200*80",
}, },
currentIndex: 0,
navList: { navList: {
// 分类nav数据 // 分类nav数据
type: "navBar", type: "navBar",
list: [ list: [
{ name: "秒杀", url: "" }, { name: "秒杀", url: "", title: "" },
{ name: "闪购", url: "" }, { name: "闪购", url: "", title: "" },
{ name: "优惠券", url: "" }, { name: "优惠券", url: "", title: "" },
{ name: "拍卖", url: "" }, { name: "拍卖", url: "", title: "" },
{ name: "服装城", url: "" }, { name: "服装城", url: "", title: "" },
], ],
}, },
}; };
@@ -228,21 +229,19 @@ export default {
// 调起选择链接弹窗 // 调起选择链接弹窗
if (item) this.selectedNav = item; if (item) this.selectedNav = item;
this.$refs.liliDialog.open("link"); this.$refs.liliDialog.open("link");
console.log(item); this.currentIndex = index;
}, },
// 已选链接 // 已选链接
selectedLink(val) { selectedLink(val) {
if (this.showModalNav) { if (this.showModalNav) {
this.selectedNav.url = this.$options.filters.formatLinkType(val); this.selectedNav.url = this.$options.filters.formatLinkType(val);
this.selectedNav.type = this.selectedNav.type = val.___type === "other" && val.url === "" ? "link" : "other";
val.___type === "other" && val.url === "" ? "link" : "other";
} else { } else {
this.topAdvert.url = this.$options.filters.formatLinkType(val); this.topAdvert.url = this.$options.filters.formatLinkType(val);
this.topAdvert.type = this.topAdvert.type = val.___type === "other" && val.url === "" ? "link" : "other";
val.___type === "other" && val.url === "" ? "link" : "other";
} }
this.navList.list[this.currentIndex].title = val.title;
}, },
handleDelNav(index) { handleDelNav(index) {
// 删除导航 // 删除导航
@@ -250,7 +249,9 @@ export default {
}, },
handleAddNav() { handleAddNav() {
// 添加导航 // 添加导航
this.navList.list.push({ name: "", url: "" }); this.navList.list.push({ name: "", url: "", title: "" });this.$nextTick(() => {
this.selectedNav.title = val.title;
});
}, },
// 拖动结束回调 // 拖动结束回调
handleMoveEnd({ newIndex, oldIndex }) { handleMoveEnd({ newIndex, oldIndex }) {
@@ -370,7 +371,7 @@ export default {
.search { .search {
width: 460px; width: 460px;
margin: 0 auto; margin: 0 auto;
/deep/ .ivu-input.ivu-input-large { ::v-deep .ivu-input.ivu-input-large {
border: 2px solid $theme_color; border: 2px solid $theme_color;
font-size: 12px; font-size: 12px;
height: 34px; height: 34px;
@@ -378,7 +379,7 @@ export default {
box-shadow: none; box-shadow: none;
} }
} }
/deep/ .ivu-input-group-append { ::v-deep .ivu-input-group-append {
border: 1px solid $theme_color; border: 1px solid $theme_color;
border-left: none; border-left: none;
height: 30px; height: 30px;

View File

@@ -104,6 +104,7 @@ export default {
pageData: JSON.stringify(modelForm), pageData: JSON.stringify(modelForm),
// 如果是专题页面永远关闭 // 如果是专题页面永远关闭
pageShow: this.$route.query.pageType === 'SPECIAL' ? 'CLOSE' : pageShow, pageShow: this.$route.query.pageType === 'SPECIAL' ? 'CLOSE' : pageShow,
pageClientType: 'PC',
}; };
API_floor.updateHome(this.$route.query.id, data).then((res) => { API_floor.updateHome(this.$route.query.id, data).then((res) => {
this.submitLoading = false this.submitLoading = false

View File

@@ -1,4 +1,4 @@
/deep/ .ivu-modal-mask, ::v-deep .ivu-modal-mask,
.ivu-modal-wrap { .ivu-modal-wrap {
z-index: 800; z-index: 800;
} }

View File

@@ -84,7 +84,7 @@
text-align: center; text-align: center;
font-weight: bold; font-weight: bold;
line-height: 2; line-height: 2;
/deep/ img { ::v-deep img {
margin: 0 auto; margin: 0 auto;
} }
} }

View File

@@ -128,7 +128,7 @@ export default {
} }
} }
/deep/ .ivu-input { ::v-deep .ivu-input {
width: 70px !important; width: 70px !important;
} }
@@ -138,7 +138,7 @@ export default {
} }
.label-btns { .label-btns {
/deep/ .ivu-btn { ::v-deep .ivu-btn {
margin-right: 10px; margin-right: 10px;
} }
} }

View File

@@ -1,4 +1,4 @@
/deep/ .ivu-input{ ::v-deep .ivu-input{
width: 200px !important; width: 200px !important;
} }
@@ -16,7 +16,7 @@
margin-right: 10px; margin-right: 10px;
} }
/deep/ .ivu-form-item-content { ::v-deep .ivu-form-item-content {
margin-left: 0 !important; margin-left: 0 !important;
display: flex; display: flex;
} }

View File

@@ -116,7 +116,7 @@ export default {
width:500px; width:500px;
justify-content:space-between; justify-content:space-between;
} }
/deep/ .ivu-input { ::v-deep .ivu-input {
width: 100px !important; width: 100px !important;
} }
.ivu-input-wrapper { .ivu-input-wrapper {

View File

@@ -188,7 +188,7 @@ export default {
} }
} }
/deep/ .upload-list { ::v-deep .upload-list {
img { img {
width: 100%; width: 100%;
height: 100%; height: 100%;

View File

@@ -36,15 +36,17 @@
prop="couponDiscount" prop="couponDiscount"
v-if="form.couponType == 'DISCOUNT'" v-if="form.couponType == 'DISCOUNT'"
> >
<Input <InputNumber
:disabled="disabled" :disabled="disabled"
type="number"
v-model="form.couponDiscount"
placeholder="折扣" placeholder="折扣"
clearable :max="9.9"
style="width: 260px" :min="0.1"
/> :step="0.1"
<span class="describe">请输入0-10之间数字可以输入一位小数</span> precision="1"
v-model="form.couponDiscount"
style="width: 260px">
</InputNumber>
<span class="describe">请输入0-10的数字,可有一位小数</span>
</FormItem> </FormItem>
<FormItem label="面额" prop="price" v-if="form.couponType == 'PRICE'"> <FormItem label="面额" prop="price" v-if="form.couponType == 'PRICE'">
<Input <Input

View File

@@ -1,7 +1,9 @@
<template> <template>
<div class="search"> <div class="search">
<Button style="margin-bottom: 10px" @click="back()">返回</Button>
<Card> <Card>
<Button style="margin-bottom: 10px" @click="back()">返回</Button>
<Form <Form
ref="searchForm" ref="searchForm"
:model="searchForm" :model="searchForm"
@@ -15,7 +17,7 @@
v-model="searchForm.couponName" v-model="searchForm.couponName"
placeholder="请输入优惠券名称" placeholder="请输入优惠券名称"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="会员名称" prop="memberName"> <Form-item label="会员名称" prop="memberName">
@@ -24,7 +26,7 @@
v-model="searchForm.memberName" v-model="searchForm.memberName"
placeholder="请输入会员名称" placeholder="请输入会员名称"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="获取方式" prop="getType"> <Form-item label="获取方式" prop="getType">
@@ -32,7 +34,7 @@
v-model="searchForm.getType" v-model="searchForm.getType"
placeholder="请选择" placeholder="请选择"
clearable clearable
style="width: 200px" style="width: 240px"
> >
<Option value="FREE">免费获取</Option> <Option value="FREE">免费获取</Option>
<Option value="ACTIVITY">活动获取</Option> <Option value="ACTIVITY">活动获取</Option>
@@ -43,7 +45,7 @@
v-model="searchForm.memberCouponStatus" v-model="searchForm.memberCouponStatus"
placeholder="请选择" placeholder="请选择"
clearable clearable
style="width: 200px" style="width: 240px"
> >
<Option value="NEW">已领取</Option> <Option value="NEW">已领取</Option>
<Option value="USED">已使用</Option> <Option value="USED">已使用</Option>
@@ -57,7 +59,7 @@
type="daterange" type="daterange"
clearable clearable
placeholder="选择起始时间" placeholder="选择起始时间"
style="width: 200px" style="width: 240px"
></DatePicker> ></DatePicker>
</Form-item> </Form-item>
<Button <Button
@@ -68,6 +70,8 @@
>搜索</Button >搜索</Button
> >
</Form> </Form>
</Card>
<Card>
<Table <Table
v-if="refreshTable" v-if="refreshTable"
:loading="loading" :loading="loading"

View File

@@ -14,7 +14,7 @@
v-model="searchForm.couponName" v-model="searchForm.couponName"
placeholder="请输入优惠券名称" placeholder="请输入优惠券名称"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="获取方式" prop="getType"> <Form-item label="获取方式" prop="getType">
@@ -22,7 +22,7 @@
v-model="searchForm.getType" v-model="searchForm.getType"
placeholder="请选择" placeholder="请选择"
clearable clearable
style="width: 200px" style="width: 240px"
> >
<Option value="FREE">免费获取</Option> <Option value="FREE">免费获取</Option>
<Option value="ACTIVITY">活动获取</Option> <Option value="ACTIVITY">活动获取</Option>
@@ -33,7 +33,7 @@
v-model="searchForm.promotionStatus" v-model="searchForm.promotionStatus"
placeholder="请选择" placeholder="请选择"
clearable clearable
style="width: 200px" style="width: 240px"
> >
<Option value="NEW">未开始</Option> <Option value="NEW">未开始</Option>
<Option value="START">已开始/上架</Option> <Option value="START">已开始/上架</Option>
@@ -47,7 +47,7 @@
type="daterange" type="daterange"
clearable clearable
placeholder="选择起始时间" placeholder="选择起始时间"
style="width: 200px" style="width: 240px"
></DatePicker> ></DatePicker>
</Form-item> </Form-item>
<Button <Button
@@ -58,6 +58,8 @@
>搜索</Button >搜索</Button
> >
</Form> </Form>
</Card>
<Card>
<Row class="operation padding-row" v-if="getType !== 'ACTIVITY'"> <Row class="operation padding-row" v-if="getType !== 'ACTIVITY'">
<Button @click="add" type="primary">添加优惠券</Button> <Button @click="add" type="primary">添加优惠券</Button>
<Button @click="delAll">批量关闭</Button> <Button @click="delAll">批量关闭</Button>

View File

@@ -81,14 +81,14 @@
label="优惠折扣" label="优惠折扣"
prop="fullRate" prop="fullRate"
> >
<Input <InputNumber
type="text"
v-model="form.fullRate"
placeholder="优惠折扣" placeholder="优惠折扣"
disabled :max="9.9"
clearable :min="0.1"
style="width: 260px" :step="0.1"
/> precision="1"
v-model="form.fullRate"
style="width: 260px"/>
<span class="describe">优惠折扣为0-10之间数字可有一位小数</span> <span class="describe">优惠折扣为0-10之间数字可有一位小数</span>
</FormItem> </FormItem>
<FormItem label="额外赠送"> <FormItem label="额外赠送">

View File

@@ -15,7 +15,7 @@
v-model="searchForm.promotionName" v-model="searchForm.promotionName"
placeholder="请输入活动名称" placeholder="请输入活动名称"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="活动状态" prop="promotionStatus"> <Form-item label="活动状态" prop="promotionStatus">
@@ -23,7 +23,7 @@
v-model="searchForm.promotionStatus" v-model="searchForm.promotionStatus"
placeholder="请选择" placeholder="请选择"
clearable clearable
style="width: 200px" style="width: 240px"
> >
<Option value="NEW">未开始</Option> <Option value="NEW">未开始</Option>
<Option value="START">已开始/上架</Option> <Option value="START">已开始/上架</Option>
@@ -37,7 +37,7 @@
type="daterange" type="daterange"
clearable clearable
placeholder="选择起始时间" placeholder="选择起始时间"
style="width: 200px" style="width: 240px"
> >
</DatePicker> </DatePicker>
</Form-item> </Form-item>
@@ -50,6 +50,8 @@
> >
</Form> </Form>
</Row> </Row>
</Card>
<Card>
<Table <Table
:loading="loading" :loading="loading"
border border

View File

@@ -15,7 +15,7 @@
v-model="searchForm.goodsName" v-model="searchForm.goodsName"
placeholder="请输入商品名称" placeholder="请输入商品名称"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="活动状态" prop="promotionStatus"> <Form-item label="活动状态" prop="promotionStatus">
@@ -23,7 +23,7 @@
v-model="searchForm.promotionStatus" v-model="searchForm.promotionStatus"
placeholder="请选择" placeholder="请选择"
clearable clearable
style="width: 200px" style="width: 240px"
> >
<Option value="NEW">未开始</Option> <Option value="NEW">未开始</Option>
<Option value="START">已开始/上架</Option> <Option value="START">已开始/上架</Option>
@@ -37,7 +37,7 @@
type="daterange" type="daterange"
clearable clearable
placeholder="选择起始时间" placeholder="选择起始时间"
style="width: 200px" style="width: 240px"
> >
</DatePicker> </DatePicker>
</Form-item> </Form-item>
@@ -50,6 +50,8 @@
> >
</Form> </Form>
</Row> </Row>
</Card>
<Card>
<Row class="operation padding-row"> <Row class="operation padding-row">
<Button @click="add" type="primary">添加砍价</Button> <Button @click="add" type="primary">添加砍价</Button>
</Row> </Row>

View File

@@ -236,7 +236,7 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
.action { .action {
display: flex; display: flex;
/deep/ .ivu-btn { ::v-deep .ivu-btn {
margin: 0 5px !important; margin: 0 5px !important;
} }
} }

View File

@@ -14,7 +14,7 @@
v-model="searchForm.promotionName" v-model="searchForm.promotionName"
placeholder="请输入活动名称" placeholder="请输入活动名称"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="活动状态" prop="promotionStatus"> <Form-item label="活动状态" prop="promotionStatus">
@@ -22,7 +22,7 @@
v-model="searchForm.promotionStatus" v-model="searchForm.promotionStatus"
placeholder="请选择" placeholder="请选择"
clearable clearable
style="width: 200px" style="width: 240px"
> >
<Option value="NEW">未开始</Option> <Option value="NEW">未开始</Option>
<Option value="START">已开始/上架</Option> <Option value="START">已开始/上架</Option>
@@ -36,11 +36,13 @@
type="daterange" type="daterange"
clearable clearable
placeholder="选择起始时间" placeholder="选择起始时间"
style="width: 200px" style="width: 240px"
></DatePicker> ></DatePicker>
</Form-item> </Form-item>
<Button @click="handleSearch" type="primary" class="search-btn">搜索</Button> <Button @click="handleSearch" type="primary" class="search-btn">搜索</Button>
</Form> </Form>
</Card>
<Card>
<Table <Table
:loading="loading" :loading="loading"
border border

View File

@@ -3,7 +3,6 @@
<Card> <Card>
<Form ref="form" :model="form" :rules="formRule"> <Form ref="form" :model="form" :rules="formRule">
<div class="base-info-item"> <div class="base-info-item">
<h4>添加积分商品</h4>
<div class="form-item-view"> <div class="form-item-view">
<FormItem astyle="width: 100%"> <FormItem astyle="width: 100%">
<div style="display: flex; margin-bottom: 10px"> <div style="display: flex; margin-bottom: 10px">
@@ -13,7 +12,8 @@
ghost ghost
style="margin-left: 10px" style="margin-left: 10px"
@click="delSelectGoods" @click="delSelectGoods"
>批量删除</Button >批量删除
</Button
> >
</div> </div>
<Table <Table
@@ -50,7 +50,8 @@
v-for="item in categoryList" v-for="item in categoryList"
:value="item.id" :value="item.id"
:key="item.id" :key="item.id"
>{{ item.name }}</Option >{{ item.name }}
</Option
> >
</Select> </Select>
</template> </template>
@@ -71,33 +72,16 @@
</Table> </Table>
</FormItem> </FormItem>
<FormItem label="兑换时间" prop="time"> <FormItem label="活动时间" prop="rangeTime">
<DatePicker <DatePicker type="datetimerange" v-model="form.rangeTime" format="yyyy-MM-dd HH:mm:ss"
type="datetime" placeholder="请选择" :options="options" style="width: 260px">
v-model="form.startTime"
format="yyyy-MM-dd HH:mm:ss"
placeholder="请选择"
:options="options"
clearable
style="width: 200px"
>
</DatePicker>
-
<DatePicker
type="datetime"
v-model="form.endTime"
format="yyyy-MM-dd HH:mm:ss"
:options="options"
placeholder="请选择"
clearable
style="width: 200px"
>
</DatePicker> </DatePicker>
</FormItem> </FormItem>
<div> <div>
<Button type="text" @click="closeCurrentPage">返回</Button> <Button type="text" @click="closeCurrentPage">返回</Button>
<Button type="primary" :loading="submitLoading" @click="handleSubmit" <Button type="primary" :loading="submitLoading" @click="handleSubmit"
>提交</Button >提交
</Button
> >
</div> </div>
</div> </div>
@@ -109,31 +93,19 @@
</template> </template>
<script> <script>
import { addPointsGoods, getPointsGoodsCategoryList } from "@/api/promotion"; import {addPointsGoods, getPointsGoodsCategoryList} from "@/api/promotion";
import { regular } from "@/utils"; import {regular} from "@/utils";
import skuSelect from "@/components/lili-dialog"; import skuSelect from "@/components/lili-dialog";
export default { export default {
name: "addPoinsGoods", name: "addPoinsGoods",
components: { components: {
skuSelect, skuSelect,
}, },
data() { data() {
const isLtEndDate = (rule, value, callback) => {
if (new Date(value).getTime() > new Date(this.form.endTime).getTime()) {
callback(new Error());
} else {
callback();
}
};
const isGtStartDate = (rule, value, callback) => {
if (new Date(value).getTime() < new Date(this.form.startTime).getTime()) {
callback(new Error());
} else {
callback();
}
};
return { return {
form: { form: {
rangeTime: ["",""],
promotionGoodsList: [], // 活动商品列表 promotionGoodsList: [], // 活动商品列表
}, },
showTable: true, showTable: true,
@@ -142,50 +114,7 @@ export default {
submitLoading: false, // 添加或编辑提交状态 submitLoading: false, // 添加或编辑提交状态
selectedGoods: [], // 已选商品列表,便于删除 selectedGoods: [], // 已选商品列表,便于删除
formRule: { formRule: {
startTime: [ rangeTime: [{required: true, message: "请选择活动时间"}],
{
required: true,
type: "date",
message: "请选择开始时间",
},
{
trigger: "change",
message: "开始时间要小于结束时间",
validator: isLtEndDate,
},
],
endTime: [
{
required: true,
type: "date",
message: "请选择结束时间",
},
{
trigger: "change",
message: "结束时间要大于开始时间",
validator: isGtStartDate,
},
],
discount: [
{ required: true, message: "请输入折扣" },
{
pattern: regular.discount,
message: "请输入0-10的数字,可有一位小数",
},
],
sellerCommission: [
{ required: true, message: "请输入店铺承担比例" },
{ pattern: regular.rate, message: "请输入0-100的正整数" },
],
publishNum: [
{ required: true, message: "请输入发放数量" },
{ pattern: regular.Integer, message: "请输入正整数" },
],
couponLimitNum: [
{ required: true, message: "请输入领取限制" },
{ pattern: regular.Integer, message: "请输入正整数" },
],
description: [{ required: true, message: "请输入范围描述" }],
}, },
columns: [ columns: [
{ {
@@ -219,7 +148,7 @@ export default {
key: "price", key: "price",
minWidth: 40, minWidth: 40,
render: (h, params) => { render: (h, params) => {
return h("priceColorScheme", {props:{value:params.row.price,color:this.$mainColor}} ); return h("priceColorScheme", {props: {value: params.row.price, color: this.$mainColor}});
}, },
}, },
{ {
@@ -293,14 +222,16 @@ export default {
}, },
/** 保存积分商品 */ /** 保存积分商品 */
handleSubmit() { handleSubmit() {
this.form.startTime=this.form.rangeTime[0]
this.form.endTime=this.form.rangeTime[1]
this.$refs.form.validate((valid) => { this.$refs.form.validate((valid) => {
if (valid) { if (valid) {
let params = this.promotionGoodsList; let params = this.promotionGoodsList;
const start = this.$options.filters.unixToDate(this.form.startTime / 1000); const start = this.$options.filters.unixToDate(this.form.startTime / 1000);
const end = this.$options.filters.unixToDate(this.form.endTime / 1000); const end = this.$options.filters.unixToDate(this.form.endTime / 1000);
if (!params || params.length == 0) { if (!params || params.length === 0) {
this.$Modal.warning({ title: "提示", content: "请选择指定商品" }); this.$Modal.warning({title: "提示", content: "请选择指定商品"});
return; return;
} }
@@ -373,7 +304,7 @@ export default {
let list = []; let list = [];
item.forEach((e) => { item.forEach((e) => {
const obj = { const obj = {
settlementPrice: e.settlementPrice || 0, settlementPrice: e.settlementPrice || e.price,
pointsGoodsCategoryId: e.pointsGoodsCategoryId || 0, pointsGoodsCategoryId: e.pointsGoodsCategoryId || 0,
pointsGoodsCategoryName: e.pointsGoodsCategoryName || "", pointsGoodsCategoryName: e.pointsGoodsCategoryName || "",
activeStock: e.activeStock || 1, activeStock: e.activeStock || 1,
@@ -407,11 +338,13 @@ h4 {
line-height: 40px; line-height: 40px;
text-align: left; text-align: left;
} }
.describe { .describe {
font-size: 12px; font-size: 12px;
margin-left: 10px; margin-left: 10px;
color: #999; color: #999;
} }
.wrapper { .wrapper {
min-height: 800px; min-height: 800px;
} }

View File

@@ -287,7 +287,7 @@ div.base-info-item {
} }
/*teatarea*/ /*teatarea*/
/deep/ .el-textarea { ::v-deep .el-textarea {
width: 150%; width: 150%;
} }
@@ -315,11 +315,11 @@ div.base-info-item {
/*图片上传组件第一张图设置封面*/ /*图片上传组件第一张图设置封面*/
.goods-images { .goods-images {
/deep/ li.el-upload-list__item:first-child { ::v-deep li.el-upload-list__item:first-child {
position: relative; position: relative;
} }
/deep/ li.el-upload-list__item:first-child:after { ::v-deep li.el-upload-list__item:first-child:after {
content: "封"; content: "封";
color: #fff; color: #fff;
font-weight: bold; font-weight: bold;

View File

@@ -15,7 +15,7 @@
v-model="searchForm.goodsName" v-model="searchForm.goodsName"
placeholder="请输入商品名称" placeholder="请输入商品名称"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="积分区间"> <Form-item label="积分区间">
@@ -24,7 +24,7 @@
v-model="searchForm.pointsS" v-model="searchForm.pointsS"
placeholder="请输入开始区间" placeholder="请输入开始区间"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
- -
<Input <Input
@@ -32,11 +32,11 @@
v-model="searchForm.pointsE" v-model="searchForm.pointsE"
placeholder="请输入结束区间" placeholder="请输入结束区间"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="状态"> <Form-item label="状态">
<Select v-model="searchForm.promotionStatus" style="width: 200px"> <Select v-model="searchForm.promotionStatus" style="width: 240px">
<Option v-for="item in statusList" :value="item.value" :key="item.value">{{ <Option v-for="item in statusList" :value="item.value" :key="item.value">{{
item.label item.label
}}</Option> }}</Option>
@@ -48,7 +48,7 @@
v-model="searchForm.skuId" v-model="searchForm.skuId"
placeholder="请输入SKU编码" placeholder="请输入SKU编码"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Button <Button
@@ -60,6 +60,8 @@
> >
</Form> </Form>
</Row> </Row>
</Card>
<Card>
<Row class="operation padding-row"> <Row class="operation padding-row">
<Button @click="addPointsGoods" type="primary">添加积分商品</Button> <Button @click="addPointsGoods" type="primary">添加积分商品</Button>
</Row> </Row>

View File

@@ -15,7 +15,7 @@
v-model="searchForm.promotionName" v-model="searchForm.promotionName"
placeholder="请输入活动名称" placeholder="请输入活动名称"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="活动状态" prop="promotionStatus"> <Form-item label="活动状态" prop="promotionStatus">
@@ -23,7 +23,7 @@
v-model="searchForm.promotionStatus" v-model="searchForm.promotionStatus"
placeholder="请选择" placeholder="请选择"
clearable clearable
style="width: 200px" style="width: 240px"
> >
<Option value="NEW">未开始</Option> <Option value="NEW">未开始</Option>
<Option value="START">已开始/上架</Option> <Option value="START">已开始/上架</Option>
@@ -37,7 +37,7 @@
type="daterange" type="daterange"
clearable clearable
placeholder="选择起始时间" placeholder="选择起始时间"
style="width: 200px" style="width: 240px"
> >
</DatePicker> </DatePicker>
</Form-item> </Form-item>
@@ -51,6 +51,8 @@
> >
</Form> </Form>
</Row> </Row>
</Card>
<Card>
<Tabs value="list" class="mt_10" @on-click="clickTabPane"> <Tabs value="list" class="mt_10" @on-click="clickTabPane">
<TabPane label="秒杀活动列表" name="list"> <TabPane label="秒杀活动列表" name="list">
<Table <Table

View File

@@ -237,8 +237,10 @@ export default {
}, },
// 树结构点击事件 // 树结构点击事件
changeTree(array, val) { changeTree(array, val) {
val.cityCode == "null" ? (val.cityCode = "") : val.cityCode; const cloneVal = JSON.parse(JSON.stringify(val))
this.$set(this, "formValidate", val); cloneVal.cityCode == "null" ? (cloneVal.cityCode = "") : cloneVal.cityCode;
this.$set(this, "formValidate", cloneVal);
this.$refs.formValidate.resetFields()
}, },
// 异步加载数据 // 异步加载数据
loadData(item, callback) { loadData(item, callback) {

View File

@@ -3,15 +3,17 @@
<Card> <Card>
<Form ref="searchForm" :model="searchForm" inline :label-width="70" class="search-form"> <Form ref="searchForm" :model="searchForm" inline :label-width="70" class="search-form">
<Form-item label="账单编号" prop="sn"> <Form-item label="账单编号" prop="sn">
<Input type="text" v-model="searchForm.sn" placeholder="请输入账单编号" clearable style="width: 200px" /> <Input type="text" v-model="searchForm.sn" placeholder="请输入账单编号" clearable style="width: 240px" />
</Form-item> </Form-item>
<Form-item label="出帐时间" prop="createTime"> <Form-item label="出帐时间" prop="createTime">
<DatePicker v-model="selectDate" type="daterange" format="yyyy-MM-dd HH:mm:ss" clearable @on-change="selectDateRange" placeholder="选择起始时间" style="width: 200px"> <DatePicker v-model="selectDate" type="daterange" format="yyyy-MM-dd HH:mm:ss" clearable @on-change="selectDateRange" placeholder="选择起始时间" style="width: 240px">
</DatePicker> </DatePicker>
</Form-item> </Form-item>
<Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button> <Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button>
</Form> </Form>
</Card>
<Card>
<Table :loading="loading" border :columns="columns" :data="data" ref="table" class="mt_10" @on-selection-change="changeSelect"> <Table :loading="loading" border :columns="columns" :data="data" ref="table" class="mt_10" @on-selection-change="changeSelect">
</Table> </Table>
<Row type="flex" justify="end" class="mt_10"> <Row type="flex" justify="end" class="mt_10">
@@ -211,7 +213,7 @@ export default {
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
/deep/ .ivu-col { ::v-deep .ivu-col {
min-height: 100vh; min-height: 100vh;
} }
</style> </style>

View File

@@ -508,6 +508,7 @@ export default {
loading: true, loading: true,
onOk: () => { onOk: () => {
API_Shop.pay(this.id).then((res) => { API_Shop.pay(this.id).then((res) => {
this.$Modal.remove();
if (res.success) { if (res.success) {
this.$Message.success(res.message); this.$Message.success(res.message);
this.init(); this.init();

View File

@@ -3,14 +3,14 @@
<Card> <Card>
<Form ref="searchForm" :model="searchForm" inline :label-width="70" class="search-form"> <Form ref="searchForm" :model="searchForm" inline :label-width="70" class="search-form">
<Form-item label="账单编号" prop="sn"> <Form-item label="账单编号" prop="sn">
<Input type="text" v-model="searchForm.sn" placeholder="请输入账单编号" clearable style="width: 200px" /> <Input type="text" v-model="searchForm.sn" placeholder="请输入账单编号" clearable style="width: 240px" />
</Form-item> </Form-item>
<Form-item label="出帐时间" prop="createTime"> <Form-item label="出帐时间" prop="createTime">
<DatePicker v-model="selectDate" type="daterange" format="yyyy-MM-dd HH:mm:ss" clearable @on-change="selectDateRange" placeholder="选择起始时间" style="width: 200px"> <DatePicker v-model="selectDate" type="daterange" format="yyyy-MM-dd HH:mm:ss" clearable @on-change="selectDateRange" placeholder="选择起始时间" style="width: 240px">
</DatePicker> </DatePicker>
</Form-item> </Form-item>
<Form-item label="筛选状态"> <Form-item label="筛选状态">
<Select v-model="searchForm.billStatus" clearable style="width:160px"> <Select v-model="searchForm.billStatus" clearable style="width:240px">
<Option value="OUT">已出账</Option> <Option value="OUT">已出账</Option>
<Option value="CHECK">已对账</Option> <Option value="CHECK">已对账</Option>
<!-- <Option value="EXAMINE">已审核</Option> --> <!-- <Option value="EXAMINE">已审核</Option> -->
@@ -19,6 +19,8 @@
</Form-item> </Form-item>
<Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button> <Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button>
</Form> </Form>
</Card>
<Card>
<Row class="operation padding-row"> <Row class="operation padding-row">
</Row> </Row>

View File

@@ -8,7 +8,7 @@
v-model="searchForm.memberName" v-model="searchForm.memberName"
placeholder="请输入会员名称" placeholder="请输入会员名称"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="店铺名称" prop="storeName"> <Form-item label="店铺名称" prop="storeName">
@@ -17,14 +17,16 @@
v-model="searchForm.storeName" v-model="searchForm.storeName"
placeholder="请输入店铺名称" placeholder="请输入店铺名称"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="创建时间" prop="createTime"> <Form-item label="创建时间" prop="createTime">
<DatePicker v-model="selectDate" type="datetimerange" format="yyyy-MM-dd HH:mm:ss" clearable @on-change="selectDateRange" placeholder="选择起始时间" style="width: 200px"></DatePicker> <DatePicker v-model="selectDate" type="datetimerange" format="yyyy-MM-dd HH:mm:ss" clearable @on-change="selectDateRange" placeholder="选择起始时间" style="width: 240px"></DatePicker>
</Form-item> </Form-item>
<Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button> <Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button>
</Form> </Form>
</Card>
<Card>
<Table :loading="loading" border :columns="columns" :data="data" ref="table" class="mt_10"></Table> <Table :loading="loading" border :columns="columns" :data="data" ref="table" class="mt_10"></Table>
<Row type="flex" justify="end" class="mt_10"> <Row type="flex" justify="end" class="mt_10">
<Page :current="searchForm.pageNumber" :total="total" :page-size="searchForm.pageSize" @on-change="changePage" @on-page-size-change="changePageSize" :page-size-opts="[10, 20, 50]" <Page :current="searchForm.pageNumber" :total="total" :page-size="searchForm.pageSize" @on-change="changePage" @on-page-size-change="changePageSize" :page-size-opts="[10, 20, 50]"

View File

@@ -8,7 +8,7 @@
v-model="searchForm.memberName" v-model="searchForm.memberName"
placeholder="请输入会员名称" placeholder="请输入会员名称"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="店铺名称" prop="storeName"> <Form-item label="店铺名称" prop="storeName">
@@ -17,11 +17,11 @@
v-model="searchForm.storeName" v-model="searchForm.storeName"
placeholder="请输入店铺名称" placeholder="请输入店铺名称"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="店铺状态"> <Form-item label="店铺状态">
<Select v-model="searchForm.storeDisable" clearable style="width: 200px"> <Select v-model="searchForm.storeDisable" clearable style="width: 240px">
<Option value="OPEN">开启中</Option> <Option value="OPEN">开启中</Option>
<Option value="CLOSED">已关闭</Option> <Option value="CLOSED">已关闭</Option>
<!-- <Option value="APPLY">申请中</Option> --> <!-- <Option value="APPLY">申请中</Option> -->
@@ -30,10 +30,12 @@
</Select> </Select>
</Form-item> </Form-item>
<Form-item label="创建时间" prop="createTime"> <Form-item label="创建时间" prop="createTime">
<DatePicker v-model="selectDate" type="datetimerange" format="yyyy-MM-dd HH:mm:ss" clearable @on-change="selectDateRange" placeholder="选择起始时间" style="width: 200px"></DatePicker> <DatePicker v-model="selectDate" type="datetimerange" format="yyyy-MM-dd HH:mm:ss" clearable @on-change="selectDateRange" placeholder="选择起始时间" style="width: 240px"></DatePicker>
</Form-item> </Form-item>
<Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button> <Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button>
</Form> </Form>
</Card>
<Card>
<Row class="operation padding-row"> <Row class="operation padding-row">
<Button @click="add" type="primary">添加</Button> <Button @click="add" type="primary">添加</Button>
</Row> </Row>

View File

@@ -862,7 +862,7 @@ export default {
z-index: 9; z-index: 9;
} }
/deep/ .ivu-tabs-bar { ::v-deep .ivu-tabs-bar {
margin: 0; margin: 0;
} }

View File

@@ -782,7 +782,7 @@ export default {
z-index: 2; z-index: 2;
} }
} }
/deep/ .box { ::v-deep .box {
color: #fff; color: #fff;
position: absolute; position: absolute;

View File

@@ -3,14 +3,15 @@
<Card> <Card>
<Form ref="searchForm" :model="searchForm" inline :label-width="70" class="search-form" @keydown.enter.native="handleSearch"> <Form ref="searchForm" :model="searchForm" inline :label-width="70" class="search-form" @keydown.enter.native="handleSearch">
<Form-item label="系统类型" prop="orderSn"> <Form-item label="系统类型" prop="orderSn">
<Select v-model="searchForm.type" placeholder="请选择系统类型" clearable style="width: 200px"> <Select v-model="searchForm.type" placeholder="请选择系统类型" clearable style="width: 240px">
<Option value="IOS">苹果</Option> <Option value="IOS">苹果</Option>
<Option value="ANDROID">安卓</Option> <Option value="ANDROID">安卓</Option>
</Select> </Select>
</Form-item> </Form-item>
<Button @click="handleSearch" type="primary" icon="ios-search">搜索</Button> <Button @click="handleSearch" type="primary" icon="ios-search">搜索</Button>
</Form> </Form>
</Card>
<Card>
<Button class="mt_10 mb_10" @click="addAppVersion" type="primary">添加</Button> <Button class="mt_10 mb_10" @click="addAppVersion" type="primary">添加</Button>
<Table :loading="loading" border :columns="columns" :data="data" ref="table" sortable="custom" ></Table> <Table :loading="loading" border :columns="columns" :data="data" ref="table" sortable="custom" ></Table>

View File

@@ -14,7 +14,7 @@
v-model="searchForm.searchKey" v-model="searchForm.searchKey"
placeholder="请输入搜索日志内容" placeholder="请输入搜索日志内容"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="操作人" prop="operatorName"> <Form-item label="操作人" prop="operatorName">
@@ -23,7 +23,7 @@
v-model="searchForm.operatorName" v-model="searchForm.operatorName"
placeholder="请输入操作人" placeholder="请输入操作人"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Form-item label="创建时间"> <Form-item label="创建时间">
@@ -34,15 +34,16 @@
clearable clearable
@on-change="selectDateRange" @on-change="selectDateRange"
placeholder="选择起始时间" placeholder="选择起始时间"
style="width: 200px" style="width: 240px"
></DatePicker> ></DatePicker>
</Form-item> </Form-item>
<Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn" <Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn"
>搜索</Button >搜索</Button
> >
</Form> </Form>
</Card>
<Card>
<Row class="operation padding-row"> <Row class="operation padding-row">
<Button @click="getLogList" icon="md-refresh">刷新</Button>
<Button type="dashed" @click="openTip = !openTip">{{ <Button type="dashed" @click="openTip = !openTip">{{
openTip ? "关闭提示" : "开启提示" openTip ? "关闭提示" : "开启提示"
}}</Button> }}</Button>

View File

@@ -48,7 +48,7 @@
clearable clearable
format="yyyy-MM-dd" format="yyyy-MM-dd"
placeholder="选择起始时间" placeholder="选择起始时间"
style="width: 200px" style="width: 240px"
type="daterange" type="daterange"
@on-change="selectDateRange" @on-change="selectDateRange"
></DatePicker> ></DatePicker>
@@ -59,7 +59,7 @@
v-model="searchForm.ownerName" v-model="searchForm.ownerName"
placeholder="图片拥有者名称" placeholder="图片拥有者名称"
clearable clearable
style="width: 200px" style="width: 240px"
/> />
</Form-item> </Form-item>
<Button <Button
@@ -71,7 +71,7 @@
</Button> </Button>
</Form> </Form>
</Row> </Row>
</div></Card><Card><div>
<Row class="oss-manage-box"> <Row class="oss-manage-box">
<Col :span="isComponent?5:4"> <Col :span="isComponent?5:4">
<div class="file-list"> <div class="file-list">

View File

@@ -123,7 +123,7 @@ export default {
margin-right: 10px; margin-right: 10px;
display: flex; display: flex;
margin-bottom: 20px; margin-bottom: 20px;
/deep/ .ivu-card-body { ::v-deep .ivu-card-body {
padding: 0 16px !important; padding: 0 16px !important;
} }
} }

View File

@@ -133,7 +133,7 @@ export default {
margin-right: 20px; margin-right: 20px;
display: flex; display: flex;
margin-bottom: 20px; margin-bottom: 20px;
/deep/ .ivu-card-body { ::v-deep .ivu-card-body {
padding: 0 16px !important; padding: 0 16px !important;
} }
} }
@@ -151,7 +151,7 @@ export default {
padding-bottom: 10px; padding-bottom: 10px;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
/deep/ .ivu-btn { ::v-deep .ivu-btn {
width: 100px; width: 100px;
} }
} }

View File

@@ -132,7 +132,7 @@ export default {
margin-right: 20px; margin-right: 20px;
display: flex; display: flex;
margin-bottom: 20px; margin-bottom: 20px;
/deep/ .ivu-card-body { ::v-deep .ivu-card-body {
padding: 0 16px !important; padding: 0 16px !important;
} }
} }
@@ -150,7 +150,7 @@ export default {
padding-bottom: 10px; padding-bottom: 10px;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
/deep/ .ivu-btn { ::v-deep .ivu-btn {
width: 100px; width: 100px;
} }
} }

View File

@@ -90,12 +90,12 @@ export default {
display: flex; display: flex;
} }
.w200 { .w200 {
/deep/ .ivu-input { ::v-deep .ivu-input {
width: 250px !important; width: 250px !important;
margin: 0 10px; margin: 0 10px;
} }
} }
/deep/ .ivu-input { ::v-deep .ivu-input {
width: 450px !important; width: 450px !important;
margin: 0 10px; margin: 0 10px;
} }

View File

@@ -73,6 +73,7 @@ export default {
WALLET: "余额支付", WALLET: "余额支付",
}, },
supportForm: "", // 支持的支付方式 supportForm: "", // 支持的支付方式
checkSupport: {},
}; };
}, },
props: ["res", "type"], props: ["res", "type"],
@@ -96,7 +97,7 @@ export default {
this.setupSetting(); this.setupSetting();
}, },
onCancel: () => { onCancel: () => {
val.splice(val.length - 1, 1); this.formValidate = JSON.parse(JSON.stringify(this.checkSupport));
}, },
}); });
}, },
@@ -105,6 +106,7 @@ export default {
setSetting(this.type, { paymentSupportItems: this.formValidate }).then( setSetting(this.type, { paymentSupportItems: this.formValidate }).then(
(res) => { (res) => {
if (res.success) { if (res.success) {
this.checkSupport = JSON.parse(JSON.stringify(this.formValidate));
this.$Message.success("保存成功!"); this.$Message.success("保存成功!");
this.$Modal.remove(); this.$Modal.remove();
} else { } else {
@@ -117,12 +119,13 @@ export default {
// 实例化数据 // 实例化数据
async init() { async init() {
this.formValidate = JSON.parse(this.res).paymentSupportItems; this.formValidate = JSON.parse(this.res).paymentSupportItems;
this.checkSupport = JSON.parse(JSON.stringify(this.formValidate));
console.log(this.formValidate); console.log(this.formValidate);
await getPaymentSupportForm().then((res) => { await getPaymentSupportForm().then((res) => {
// res.result.payments = ["H5", "PC"]; // res.result.payments = ["H5", "PC"];
this.supportForm = res.result; this.supportForm = res.result;
}); });
}, },
}, },
@@ -148,7 +151,7 @@ export default {
margin-right: 20px; margin-right: 20px;
display: flex; display: flex;
margin-bottom: 20px; margin-bottom: 20px;
/deep/ .ivu-card-body { ::v-deep .ivu-card-body {
padding: 0 16px !important; padding: 0 16px !important;
} }
} }

View File

@@ -28,18 +28,26 @@
<FormItem label="APIv3密钥" prop="apiKey3"> <FormItem label="APIv3密钥" prop="apiKey3">
<Input maxlength="300" v-model="formValidate.apiKey3" /> <Input maxlength="300" v-model="formValidate.apiKey3" />
</FormItem> </FormItem>
<FormItem label="apiclient_cert_p12" class="label-item" prop="apiclient_cert_p12">
<Input maxlength="300" v-model="formValidate.apiclient_cert_p12" />
</FormItem>
<FormItem label="apiclient_cert_pem" prop="apiclient_cert_pem">
<Input maxlength="300" v-model="formValidate.apiclient_cert_pem" />
</FormItem>
<FormItem label="apiclient_key" prop="apiclient_key">
<Input maxlength="300" v-model="formValidate.apiclient_key" />
</FormItem>
<FormItem label="API证书-证书序列号" prop="serialNumber"> <FormItem label="API证书-证书序列号" prop="serialNumber">
<Input maxlength="300" v-model="formValidate.serialNumber" /> <Input maxlength="300" v-model="formValidate.serialNumber" />
</FormItem> </FormItem>
<FormItem class="form-item-view-el" label="apiclient_key" prop="apiclient_key">
<Input v-model="formValidate.apiclientKey" :rows="6" maxlength="2500" show-word-limit type="textarea" placeholder="Enter something..." />
</FormItem>
<FormItem label="加签方式" prop="publicType">
<RadioGroup type="button" button-style="solid" v-model="formValidate.publicType" @change="handlePublicTypeChange">
<Radio label="CERT">平台证书</Radio>
<Radio label="KEY">微信支付公钥</Radio>
</RadioGroup>
<span class="desc">商户接收APIv3的请求应答回调时验签使用以下两种方式只能使用一种</span>
</FormItem>
<!-- 当加签方式选择KEY时展示 -->
<FormItem v-if="formValidate.publicType === 'KEY'" label="公钥证书ID" prop="publicId">
<Input maxlength="300" v-model="formValidate.publicId" />
</FormItem>
<FormItem v-if="formValidate.publicType === 'KEY'" class="form-item-view-el" label="公钥证书" prop="publicKey">
<Input v-model="formValidate.publicKey" :rows="6" maxlength="2500" show-word-limit type="textarea" placeholder="Enter something..." />
</FormItem>
<FormItem label="支付回调域名" prop="callbackUrl"> <FormItem label="支付回调域名" prop="callbackUrl">
<Input maxlength="300" v-model="formValidate.callbackUrl" /> <Input maxlength="300" v-model="formValidate.callbackUrl" />
</FormItem> </FormItem>
@@ -97,7 +105,7 @@ export default {
]; ];
} }
}); });
}, }
}, },
}; };
</script> </script>
@@ -110,13 +118,13 @@ export default {
} }
.w200 { .w200 {
/deep/ .ivu-input { ::v-deep .ivu-input {
width: 250px !important; width: 250px !important;
margin: 0 10px; margin: 0 10px;
} }
} }
/deep/ .ivu-input { ::v-deep .ivu-input {
width: 450px !important; width: 450px !important;
margin: 0 10px; margin: 0 10px;
} }

View File

@@ -188,7 +188,7 @@ export default {
.label-item { .label-item {
display: flex; display: flex;
} }
/deep/ .ivu-input { ::v-deep .ivu-input {
width: 100px !important; width: 100px !important;
} }
</style> </style>

View File

@@ -74,7 +74,7 @@ export default {
display: flex; display: flex;
} }
/deep/ .ivu-input { ::v-deep .ivu-input {
width: 300px !important; width: 300px !important;
margin: 0 10px; margin: 0 10px;
} }

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