商品上架,下架,删除,审核

This commit is contained in:
itgaojian163 2025-06-11 17:02:30 +08:00
parent fcb63aea1d
commit 0f2dce9354
9 changed files with 668 additions and 89 deletions

View File

@ -118,7 +118,7 @@ swiper-item {
padding: var(--page-padding) var(--page-padding) 50rpx;
width: 100%;
box-sizing: border-box;
z-index: 1;
z-index: 2;
}
.bottom-btn-green {
@ -139,10 +139,20 @@ swiper-item {
.bottom-btn-blue {
background-color: var(--btn-blue-color);
color: var(--white-color);
font-size: 16px;
font-size: 32rpx;
height: 80rpx;
line-height: 80rpx;
border-radius: 5px;
border-radius: 5rpx;
text-align: center;
}
.bottom-btn-gray {
background-color: var(--gray-color-light);
color: var(--text-brown-color);
font-size: 32rpx;
height: 80rpx;
line-height: 80rpx;
border-radius: 5rpx;
text-align: center;
}

View File

@ -12,10 +12,13 @@ const apiPath = {
delGoods: "/api/goods/remove/{ids}", //删除商品 DELETE
updateGoods: "/api/goods/update/{goodsId}", //修改商品 PUT
doCheck: "/api/goods/sub-check/{goodsId}", //提交审核 PUT
onGoods: "/api/goods/publish/{goodsId}", //上架商品 PUT
offGoods: "/api/goods/no-publish/{goodsId}", //下架商品
onGoods: "/api/goods/{publish}/{goodsId}", //上架商品 PUT publish
offGoods: "/api/goods/{publish}/{goodsId}", //下架商品 no-publish
saleGoods: '/api/goods/{publish}/{goodsId}', //上架或下架商品
goodsDics: "/api/data/listbyparentid/{dId}", //商品数据字典
goodsDicDetail: '/api/data/get/{dId}', //字典详情
areaList: "/api/area/listbyparentid/{pId}", //省市区树结构
areaDetail: '/api/area/get/{areaId}', //地区详情
saveOrder: '/api/order/save/{goodsId}', //新增订单
confirmOrder: '/api/order/confirm-pay/{orderId}', //确定付款
cancelOrder: '/api/order/save-cancel/{orderId}', //取消订单
@ -52,7 +55,12 @@ class Shop {
dId: id
})
}
//字典详情
static doGetDicDetail(id) {
return this.requestHandler(apiPath.goodsDicDetail, "GET", null, {
dId: id
})
}
// 新增软件商品
static doSaveGoods(data) {
return this.requestHandler(apiPath.saveGoods, "POST", data)
@ -99,12 +107,25 @@ class Shop {
goodsId: id
})
}
//上架或下架商品
static doSaleGoods(status, id) {
return this.requestHandler(apiPath.saleGoods, "PUT", null, {
publish: status,
goodsId: id
})
}
//获取地区
static doGetAreaList(id) {
return this.requestHandler(apiPath.areaList, "GET", null, {
pId: id
})
}
//地区详情
static doGetAreaDetail(id) {
return this.requestHandler(apiPath.areaDetail, "GET", null, {
areaId: id
})
}
//新增订单
static doSaveOrder(id) {
return this.requestHandler(apiPath.saveOrder, "POST", null, {

View File

@ -131,23 +131,21 @@ Page({
showType: true
})
},
//选择软著分类
bindChangeRightType(e) {
const selectedIds = new Set(e.detail.value);
const rightTypeMap = new Map();
this.data.rightType.forEach(item => {
rightTypeMap.set(item.dataId, item);
});
const selRightType = [...selectedIds].map(id => {
const item = rightTypeMap.get(id);
if (item) {
item.checked = true;
const selectedIds = e.detail.value;
const selectedItems = [];
for (let i = 0; i < this.data.rightType.length; i++) {
const item = this.data.rightType[i];
item.checked = selectedIds.indexOf(item.dataId) !== -1;
if (item.checked) {
selectedItems.push(item);
}
return item;
}).filter(Boolean);
}
this.setData({
selRightType,
rightType: [...this.data.rightType]
});
rightType: this.data.rightType,
selRightType: selectedItems
})
},
clearRightType() {
this.data.rightType.forEach(item => {
@ -445,6 +443,7 @@ Page({
return true;
},
buildParams() {
const typeIds = this.data.selRightType.map(item => item.dataId).join(',');
const data = {
goodsLastTime: this.data.rightStopDate,
goodsLeader: this.data.orgName,
@ -457,7 +456,7 @@ Page({
goodsName: this.data.rightName,
goodsLocalPhoto: this.data.files[0].fileId,
goodsPrice: this.data.rightPrice,
goodsType: this.data.selRightType.dataId
goodsType: typeIds
}
return data
},

View File

@ -108,8 +108,8 @@
color: var(--text-color);
}
.select-item-item:nth-of-type(n+2) {
margin-left: 10rpx;
.select-item-item:nth-of-type(n+1) {
margin: 8rpx;
}
.desc {

View File

@ -1,66 +1,293 @@
// pages/shop/sellGoodsDetail/sellGoodsDetail.js
// pages/shop/publishCopyright/publishCopyright.js
import Shop from '../../../net/api/shop'
import {
sImgPrefix
} from '../../../net/mainUrl'
Page({
/**
* 页面的初始数据
*/
data: {
/**
* 页面的初始数据
*/
data: {
msgHint: '',
msgType: 'info',
msgShow: false,
showType: false,
goodsId: '',
goods: null,
typeNameList: [],
cardTypeName: '',
cityName: '',
leaderType: ''
},
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
wx.setNavigationBarTitle({
title: '详情',
})
wx.setNavigationBarColor({
frontColor: '#000000', // 必写项,字体颜色仅支持#ffffff和#000000
backgroundColor: '#FFFFFF', // 传递的颜色值,仅支持十六进制颜色
animation: { // 可选项
duration: 500,
timingFunc: 'easeIn'
}
})
const id = options.id
if (id && id != '') {
this.setData({
goodsId: id
})
this.doGetGoodsDetail()
} else {
this.setData({
msgHint: '数据有误,请稍后重试',
msgType: 'error',
msgShow: true
})
setTimeout(() => {
wx.navigateBack()
}, 1500);
}
},
//获取商品详情
doGetGoodsDetail() {
wx.showLoading({
title: '加载中...',
})
const _self = this
Shop.doGetGoodsDetail(this.data.goodsId)
.then(res => {
wx.hideLoading()
if (res && res != null) {
res.goodsLocalPhoto = sImgPrefix + res.goodsLocalPhoto
switch (res.goodsLeaderType) {
case '1':
res.goodsLeaderTypeName = '自然人'
break
case '2':
res.goodsLeaderTypeName = '法人'
break
case '3':
res.goodsLeaderTypeName = '非法人组织或其他'
break
}
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
_self.setData({
goods: res
})
console.log(_self.data.goods)
_self.getDic()
} else {
_self.setData({
msgHint: '网络错误,请稍后重试',
msgType: 'error',
msgShow: true
})
setTimeout(() => {
wx.navigateBack()
}, 1800);
}
})
.catch(err => {
wx.hideLoading()
_self.setData({
msgHint: err.msg ? err.msg : '网络错误,请稍后重试',
msgType: 'error',
msgShow: true
})
setTimeout(() => {
wx.navigateBack()
}, 1800);
})
},
//获取字典详情
getDic() {
wx.showLoading({
title: '加载中...',
})
const _self = this
//软著分类 goodsType
const sort = Shop.doGetGoodsDic('0b00884a-f7a2-425f-93e5-599fbaad4bde')
//证件类别 goodsLeaderIdcardType
const type = Shop.doGetDicDetail(_self.data.goods.goodsLeaderIdcardType)
//省市 goodsLeaderCity1 goodsLeaderCity2
const city1 = Shop.doGetAreaDetail(_self.data.goods.goodsLeaderCity1)
const city2 = Shop.doGetAreaDetail(_self.data.goods.goodsLeaderCity2)
const list = [sort, type, city1, city2]
Promise.all(list)
.then(res => {
wx.hideLoading()
if (res && res.length > 0) {
const tempList = []
res[0].forEach(item => {
if (_self.data.goods.goodsType.indexOf(item.dataId) != -1) {
tempList.push(item)
}
})
_self.setData({
typeNameList: tempList,
cardTypeName: res[1].dataName,
cityName: res[2].areaName + '/' + res[3].areaName
})
}
})
.catch(err => {
console.log(err)
wx.hideLoading()
})
},
doPreImg(e) {
wx.previewImage({
urls: [e.currentTarget.dataset.value],
})
},
backPageRefresh() {
let pages = getCurrentPages();
let beforePage = pages[pages.length - 2];
beforePage.setData({
needRefresh: true
})
wx.navigateBack()
},
//提交审核
doCheck() {
wx.showModal({
title: '提示',
content: '确定要将该软著商品提交审核吗?',
complete: (res) => {
if (res.confirm) {
this.goCheck()
}
}
})
},
//去审核
goCheck() {
wx.showLoading({
title: '提交中...',
})
const _self = this
Shop.doSubCheck(_self.data.goodsId)
.then(res => {
wx.hideLoading()
_self.setData({
msgHint: '提交成功',
msgType: 'success',
msgShow: true
})
_self.upPageNeedRefresh()
_self.doGetGoodsDetail()
})
.catch(err => {
wx.hideLoading()
_self.setData({
msgHint: err.msg ? err.msg : '网络错误,请稍后重试',
msgType: 'error',
msgShow: true
})
})
},
//去编辑
doEdit() {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
},
//删除
doDel() {
wx.showModal({
title: '警告',
content: '您确定要删除该软著商品吗?',
complete: (res) => {
if (res.confirm) {
this.goDel()
}
}
})
},
//删除
goDel() {
wx.showLoading({
title: '删除中...',
})
const _self = this
Shop.doDelGoods(_self.data.goodsId)
.then(res => {
wx.hideLoading()
_self.setData({
msgHint: '删除成功',
msgType: 'success',
msgShow: true
})
setTimeout(() => {
_self.backPageRefresh()
}, 1200);
})
.catch(err => {
wx.hideLoading()
_self.setData({
msgHint: err.msg ? err.msg : '网络错误,请稍后重试',
msgType: 'error',
msgShow: true
})
})
},
//上架或下架
doSale() {
var content
var status = 'publish'
if (this.data.goods.goodsStatus == '1') {
//下架
content = '您确定要下架该软著商品吗?'
status = 'no-publish'
} else if (this.data.goods.goodsStatus == '0') {
//上架
content = '您确定要上架该软著商品吗?'
status = 'publish'
}
wx.showModal({
title: '提示',
content: content,
complete: (res) => {
if (res.confirm) {
this.goSale(status)
}
}
})
},
//上下架
goSale(status) {
wx.showLoading({
title: '操作中...',
})
const _self = this
Shop.doSaleGoods(status, _self.data.goodsId)
.then(res => {
wx.hideLoading()
_self.setData({
msgHint: '操作成功',
msgType: 'success',
msgShow: true
})
_self.upPageNeedRefresh()
_self.doGetGoodsDetail()
})
.catch(err => {
wx.hideLoading()
_self.setData({
msgHint: err.msg ? err.msg : '网络错误,请稍后重试',
msgType: 'error',
msgShow: true
})
})
},
upPageNeedRefresh() {
let pages = getCurrentPages();
let beforePage = pages[pages.length - 2];
beforePage.setData({
needRefresh: true
})
}
})

View File

@ -1,3 +1,5 @@
{
"usingComponents": {}
"usingComponents": {
"mp-toptips": "weui-miniprogram/toptips/toptips"
}
}

View File

@ -1,2 +1,110 @@
<!--pages/shop/sellGoodsDetail/sellGoodsDetail.wxml-->
<text>pages/shop/sellGoodsDetail/sellGoodsDetail.wxml</text>
<view class="page-container" style="background-color: var(--divider-color);">
<view class="content-box" wx:if="{{goods != null}}">
<view class="upload-img-box">
<image bind:tap="doPreImg" data-value="{{goods.goodsLocalPhoto}}" src="{{goods.goodsLocalPhoto}}" mode="scaleToFill" style="width: 400rpx;height: 500rpx;"></image>
</view>
<view class="content-container">
<block wx:if="{{goods.goodsCheckStatus != ''}}">
<view class="info-title">审核信息</view>
<view class="section">
<view class="item">
<text class="label">状态</text>
<view class="select-content-item">
<view class="value v-select" style="color: var(--red-color);font-weight:bold;">{{tools.goodsStatus(goods.goodsCheckStatus,goods.goodsStatus)}}</view>
</view>
</view>
<view class="item" wx:if="{{goods.goodsCheckRemark != ''}}">
<text class="label">审核信息</text>
<view class="select-content-item">
<view class="value v-select">{{goods.goodsCheckRemark}}</view>
</view>
</view>
</view>
</block>
<view class="info-title">软著信息</view>
<!-- 第一部分 -->
<view class="section">
<view class="item">
<text class="label">软著名称</text>
<view class="select-content-item">
<view class="value v-select">{{goods.goodsName}}</view>
</view>
</view>
<view class="item">
<text class="label">软著分类</text>
<view class="select-content-no-h">
<view class="select-item-box" bind:tap="onShowRightType">
<block wx:for="{{typeNameList}}" wx:key="index">
<view class="select-item-item">
<text>{{item.dataName}}</text>
</view>
</block>
</view>
</view>
</view>
<view class="item">
<text class="label">售卖价格</text>
<view class="select-content-item">
<view class="value v-select">{{goods.goodsPrice}}</view>
</view>
</view>
<view class="item">
<view class="label">截止售卖日期</view>
<view class="select-content-item" style="align-items: center;">
<view class="select-time v-select">{{goods.goodsLastTime}}</view>
</view>
</view>
</view>
<view class="info-title">著作权人信息</view>
<!-- 第一部分 -->
<view class="section">
<view class="item">
<text class="label">类别</text>
<view class="select-content-item">
<view class="select-time v-select">{{goods.goodsLeaderTypeName}}</view>
</view>
</view>
<view class="item">
<text class="label">姓名或机构名称</text>
<view class="select-content-item">
<view class="value v-select">{{goods.goodsLeader}}</view>
</view>
</view>
<view class="item">
<text class="label">省市</text>
<view class="select-content-item">
<view class="select-time v-select">{{cityName}}</view>
</view>
</view>
<view class="item">
<text class="label">联系电话</text>
<view class="select-content-item">
<view class="value v-select">{{goods.goodsLeaderPhone}}</view>
</view>
</view>
<view class="item">
<text class="label">证件类型</text>
<view class="select-content-item">
<view class="select-time v-select">{{cardTypeName}}</view>
</view>
</view>
<view class="item">
<text class="label">证件号码</text>
<view class="select-content-item" style="border-bottom: none;">
<view class="value v-select">{{goods.goodsLeaderIdcard}}</view>
</view>
</view>
</view>
</view>
</view>
<view class="bottom-fixed-footer">
<view style="display: flex;flex-direction: row;width: 100%;">
<view class="bottom-btn-gray" style="flex: auto;" bind:tap="doDel" wx:if="{{goods.goodsCheckStatus != '1' && goods.goodsStatus != '1'}}">删除</view>
<view class="bottom-btn-gray ml-10" wx:if="{{goods.goodsStatus != '1'}}" style="flex: auto;" bind:tap="doEdit">编辑</view>
<view class="bottom-btn-blue ml-10" style="flex:auto;" wx:if="{{goods.goodsCheckStatus=='' || goods.goodsCheckStatus=='0'}}" bind:tap="doCheck">提交审核</view>
<view class="bottom-btn-blue ml-10" wx:if="{{goods.goodsCheckStatus=='2'}}" style="flex:auto;" bind:tap="doSale">{{goods.goodsStatus=='1'?'下架':'上架'}}</view>
</view>
</view>
</view>
<mp-toptips delay="2000" msg="{{msgHint}}" type="{{msgType}}" show="{{msgShow}}"></mp-toptips>
<wxs src="../../../utils/comm.wxs" module="tools"></wxs>

View File

@ -1 +1,213 @@
/* pages/shop/sellGoodsDetail/sellGoodsDetail.wxss */
/* pages/shop/publishCopyright/publishCopyright.wxss */
.content-box {
border-radius: 20rpx;
margin-top: -30rpx;
}
.upload-img-box {
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
padding: 20rpx;
}
.content-container {
margin: 0rpx -30rpx 80rpx -30rpx;
background-color: white;
display: flex;
flex-direction: column;
padding: 30rpx;
}
.info-title {
font-size: 36rpx;
font-weight: bold;
display: flex;
flex-direction: row;
align-items: center;
}
.info-title::before {
content: "";
width: 10rpx;
height: 36rpx;
margin-right: 5rpx;
border-left: 15rpx solid var(--blue-color);
vertical-align: middle;
}
.section {
margin-bottom: 15rpx;
margin-left: 10rpx;
}
.item {
display: flex;
flex-direction: column;
margin-bottom: 10rpx;
padding: 20rpx 10rpx;
font-size: 28rpx;
}
.label {
color: var(--text-color);
font-weight: bold;
}
.select-content {
margin-top: 15rpx;
display: flex;
height: 70rpx;
flex-direction: row;
border-radius: 5rpx;
background-color: var(--bg-gray-input-color);
padding: 0rpx 10rpx;
}
.select-content-no-h {
margin-top: 15rpx;
display: flex;
flex-direction: row;
align-items: center;
min-height: 70rpx;
flex-direction: row;
border-radius: 5rpx;
padding: 0rpx 15rpx 10rpx 10rpx;
border-bottom: 1rpx solid var(--divider-color);
}
.select-content-item {
margin-top: 15rpx;
display: flex;
flex-direction: row;
align-items: center;
height: 70rpx;
flex-direction: row;
border-radius: 5rpx;
padding: 0rpx 15rpx 10rpx 0rpx;
border-bottom: 1rpx solid var(--divider-color);
}
.select-item-box {
flex: 1;
display: flex;
flex-direction: row;
flex-wrap: wrap;
padding: 5rpx;
}
.select-item-item {
display: flex;
flex-direction: row;
align-items: center;
background-color: var(--divider-color);
padding: 5rpx 15rpx;
border-radius: 5rpx;
font-size: 24rpx;
color: var(--text-color);
}
.select-item-item:nth-of-type(n+1) {
margin: 10rpx;
}
.desc {
flex: 1;
color: #999;
text-align: left;
padding-left: 20rpx;
display: flex;
flex-direction: row;
justify-content: space-between;
padding-right: 10px;
align-items: center;
}
.select-time {
color: var(--text-color);
flex: 1;
font-size: 28rpx;
text-align: left;
}
.clear-icon {
width: 20px;
height: 20px;
margin-right: 20rpx;
}
.value {
flex: 1;
text-align: left;
font-size: 28rpx;
}
.value-hint {
color: var(--text-gray-hint-color);
}
.v-select {
color: var(--text-gray-desc-color);
}
.v-normal {
color: var(--text-gray-hint-color)
}
.custom-dialog {
background-color: var(--white-color);
}
.custom-tips {
margin-top: 80px;
}
/* 上传图片 */
.weui-uploader {
margin-top: 10rpx;
width: 100%;
}
.weui-uploader__bd {
display: flex;
flex-direction: row;
margin-bottom: 0;
}
.weui-uploader__hd {
display: none;
}
.weui-uploader__input-box {
width: 280rpx;
height: 380rpx;
border-radius: 5px;
background-color: transparent;
}
.weui-uploader__file {
width: 280rpx;
height: 380rpx;
border-radius: 5px;
}
.weui-uploader__img {
border-radius: 5px;
}
.weui-uploader__overview {
display: flex;
flex-direction: row;
justify-content: space-between;
width: 65vw;
}
.weui-uploader__input-box {
border: 1rpx solid var(--bg-bottom-color);
background-color: transparent;
}

View File

@ -1,7 +1,7 @@
var isEmpty = function (obj) {
if (obj == null) return true;
if (typeof obj !== 'object') return false;
return JSON.stringify(obj) === '{}';
return JSON.stringify(obj) == '{}';
};
// 充值1|支出2|提现3|系统扣款4|订单收入5|付款6)
var payTypeFontSize = function (type) {
@ -118,7 +118,7 @@ var goodsStatus = function (check, status) {
'': '未提交',
'0': '审核不通过',
'1': '审核中',
'2': status === '1' ? '已上架' : '审核通过(未上架)'
'2': status == '1' ? '已上架' : '审核通过(未上架)'
};
return statusMap[check] || '未知状态';
}