This commit is contained in:
lihaoyuan 2026-01-13 08:04:46 +08:00
commit 3cfdedfd84
8 changed files with 330 additions and 42 deletions

35
package-lock.json generated
View File

@ -1,16 +1,16 @@
{ {
"name": "lancer-admin", "name": "xiaofa-admin",
"version": "2.0.12-dev", "version": "2.0.12-dev",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "lancer-admin", "name": "xiaofa-admin",
"version": "2.0.12-dev", "version": "2.0.12-dev",
"license": "Mozilla Public License Version 2.0",
"dependencies": { "dependencies": {
"@logicflow/core": "^1.0.2", "@logicflow/core": "^1.0.2",
"@logicflow/extension": "^1.0.2", "@logicflow/extension": "^1.0.2",
"@smallwei/avue": "^2.13.2",
"@vuemap/vue-amap": "^0.1.17", "@vuemap/vue-amap": "^0.1.17",
"axios": "^0.26.1", "axios": "^0.26.1",
"clipboard": "^2.0.10", "clipboard": "^2.0.10",
@ -2809,6 +2809,23 @@
"@sinonjs/commons": "^1.7.0" "@sinonjs/commons": "^1.7.0"
} }
}, },
"node_modules/@smallwei/avue": {
"version": "2.13.2",
"resolved": "https://repo.huaweicloud.com/repository/npm/@smallwei/avue/-/avue-2.13.2.tgz",
"integrity": "sha512-ctd8ul96xAdBXU6PJ2QkKlvZ89pVCha/aHM6rflLVD5HHU0N9KHvz0e2R52yyE87YuYpqiSO+OH7lckyVR+4kQ==",
"license": "MIT",
"dependencies": {
"countup.js": "^1.9.3",
"dayjs": "^1.10.4",
"lodash": "^4.17.21",
"nprogress": "^0.2.0",
"vue-cropper": "^0.5.8"
},
"peerDependencies": {
"element-ui": ">=2.15.3",
"vue": ">=2.5.17"
}
},
"node_modules/@soda/friendly-errors-webpack-plugin": { "node_modules/@soda/friendly-errors-webpack-plugin": {
"version": "1.8.1", "version": "1.8.1",
"resolved": "https://registry.npmmirror.com/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz", "resolved": "https://registry.npmmirror.com/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz",
@ -8127,6 +8144,12 @@
"node": ">=4" "node": ">=4"
} }
}, },
"node_modules/countup.js": {
"version": "1.9.3",
"resolved": "https://repo.huaweicloud.com/repository/npm/countup.js/-/countup.js-1.9.3.tgz",
"integrity": "sha512-UHf2P/mFKaESqdPq+UdBJm/1y8lYdlcDd0nTZHNC8cxWoJwZr1Eldm1PpWui446vDl5Pd8PtRYkr3q6K4+Qa5A==",
"license": "MIT"
},
"node_modules/cp-file": { "node_modules/cp-file": {
"version": "7.0.0", "version": "7.0.0",
"resolved": "https://registry.npmmirror.com/cp-file/-/cp-file-7.0.0.tgz", "resolved": "https://registry.npmmirror.com/cp-file/-/cp-file-7.0.0.tgz",
@ -28983,6 +29006,12 @@
"vue": "^2.1.8" "vue": "^2.1.8"
} }
}, },
"node_modules/vue-cropper": {
"version": "0.5.11",
"resolved": "https://repo.huaweicloud.com/repository/npm/vue-cropper/-/vue-cropper-0.5.11.tgz",
"integrity": "sha512-UeA3qL2BLCTGkOEAxEsxSNFO+qLYAn6YRHv4oS32cP9lMhF1vFmnAf/z+ZamtR0/Fh3sbZeZUCLVR2Ol2/dpTQ==",
"license": "ISC"
},
"node_modules/vue-eslint-parser": { "node_modules/vue-eslint-parser": {
"version": "8.3.0", "version": "8.3.0",
"resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz", "resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",

View File

@ -26,6 +26,7 @@
"dependencies": { "dependencies": {
"@logicflow/core": "^1.0.2", "@logicflow/core": "^1.0.2",
"@logicflow/extension": "^1.0.2", "@logicflow/extension": "^1.0.2",
"@smallwei/avue": "^2.13.2",
"@vuemap/vue-amap": "^0.1.17", "@vuemap/vue-amap": "^0.1.17",
"axios": "^0.26.1", "axios": "^0.26.1",
"clipboard": "^2.0.10", "clipboard": "^2.0.10",

View File

@ -27,6 +27,9 @@ import { sprintf, translateTitle as __ } from '@/utils/i18n'
*/ */
import { baseURL, pwa } from './config' import { baseURL, pwa } from './config'
import { isExternal } from 'vue-plugin-utils' import { isExternal } from 'vue-plugin-utils'
import Avue from '@smallwei/avue';
import '@smallwei/avue/lib/index.css';
Vue.use(Avue);
if (process.env.NODE_ENV === 'production' && !isExternal(baseURL)) { if (process.env.NODE_ENV === 'production' && !isExternal(baseURL)) {
/* /*
@ -48,4 +51,4 @@ new Vue({
router, router,
baiduMap, baiduMap,
render: (h) => h(App), render: (h) => h(App),
}) })

View File

@ -129,6 +129,12 @@
</el-col> </el-col>
<el-col :span="3"><span>{{ detail.order_points_fee }}</span></el-col> <el-col :span="3"><span>{{ detail.order_points_fee }}</span></el-col>
</el-row> </el-row>
<el-row>
<el-col :offset="18" :span="3">
<span>{{ __('打包费:¥') }}</span>
</el-col>
<el-col :span="3"><span>{{ detail.packing_fee }}</span></el-col>
</el-row>
<el-row> <el-row>
<el-col :offset="18" :span="3"> <el-col :offset="18" :span="3">
<span>{{ __('运费:¥') }}</span> <span>{{ __('运费:¥') }}</span>

View File

@ -41,22 +41,41 @@
<div class="container" style=""> <div class="container" style="">
<div class="centered"> <div class="centered">
<!-- 这里是你的内容 --> <!-- 这里是你的内容 -->
<div style="width: 700px;height: 300px;"> <div style="width: 700px;height: 300px; display: flex;">
<el-cascader <div>
v-model="categoryId" <div style="display: flex; width: 100%; ">
clearable <el-cascader
filterable v-model="category_id"
:options="list" clearable
:props="{ label: 'category_name', value: 'category_id', children:'sub' }" filterable
:placeholder="__('请选择需要发布商品的所属分类')" :options="list"
ref="cascader" :props="{ label: 'category_name', value: 'category_id', children:'sub',checkStrictly: true }"
:style="{ width: '490px' }" :placeholder="__('请选择需要发布商品的所属分类')"
@change="onCategoryChange" ref="cascader"
size="medium" :style="{ width: '490px' }"
/> style
<el-button size="medium" @visible-change="onCategoryChange"
type="primary" @focus="searchOnFocus"
:style="{ width: '200px' }" style="margin-left: 10px;" @click="submit">确认发布</el-button> @blur="searchOutFocus"
@click.native.prevent="searchOutFocus"
@focus.native.prevent="searchOutFocus"
size="medium"
/>
<el-button size="medium"
type="primary"
:style="{ width: '200px',height: '35px' }" style="margin-left: 10px;" @click="submit">确认发布
</el-button>
</div>
<div style="width: 100%; height: calc(100% - 45px); border-radius: 1;">
<avue-tree
ref = 'tree'
:data="list"
:expand-all="true"
:option="treeOption"
@node-click="treeNodeClick"
></avue-tree>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -84,23 +103,48 @@
list: [], list: [],
listLoading: true, listLoading: true,
layout: 'total, sizes, prev, pager, next, jumper', layout: 'total, sizes, prev, pager, next, jumper',
treeOption:{
addBtn: false,
editBtn: false,
delBtn:false,
filter:false,
props:{ label: 'category_name', value: 'category_id', children:'sub' }
},
} }
}, },
created() { created() {
this.fetchData() this.fetchData()
}, },
mounted() { mounted() {
// //
this.$nextTick(() => { this.$nextTick(() => {
// el-cascader const cascader = this.$refs.cascaderRef;
const inputEl = this.$refs.cascader.$el.querySelector('.el-input__inner'); if (cascader) {
// //
if (inputEl) { cascader.dropdownVisible = false;
inputEl.click(); // false
} cascader.showPopper = () => false;
}); }
});
}, },
methods: { methods: {
//
searchOutFocus(){
this.$refs.cascader.destroyPopper()
this.$refs.cascader.dropDownVisible = false
},
//
searchOnFocus(){
this.$refs.cascader.destroyPopper()
this.$refs.cascader.dropDownVisible = false
this.$refs.tree.filterValue = ''
this.$refs.cascader.inputValue = ''
},
//
treeNodeClick(row){
this.category_id = row.category_id
console.log(row.category_id)
},
showEdit(row) { showEdit(row) {
const sub = row.sub const sub = row.sub
if (sub && sub.length > 0) return false if (sub && sub.length > 0) return false
@ -115,16 +159,13 @@
const { data } = await categoryTree() const { data } = await categoryTree()
this.list = this.tree(data); this.list = this.tree(data);
this.listLoading = false this.listLoading = false
}, },
async onCategoryChange(row) { async onCategoryChange() {
if (row.length > 0) { this.$refs.cascader.destroyPopper()
this.category_id = row[row.length-1]; this.$refs.cascader.dropDownVisible = false
} else { this.$refs.tree.filterValue = this.$refs.cascader.inputValue
this.category_id = null;
}
}, },
tree(data) { tree(data) {
@ -162,9 +203,9 @@
}, },
submit() { submit() {
const category = this.findTree(this.list, this.category_id) const category = this.findTree(this.list, this.category_id)
console.log(this.category_id)
if (category != null) { if (this.category_id != null) {
this.handleEdit(category) this.handleEdit(this.category_id)
} else { } else {
this.$baseMessage("请选择商品分类", 'error') this.$baseMessage("请选择商品分类", 'error')
} }
@ -180,9 +221,8 @@
align-items: center; /* 垂直居中 */ align-items: center; /* 垂直居中 */
height: 80vh; /* 100%视窗高度 */ height: 80vh; /* 100%视窗高度 */
} }
.centered { .centered {
/* 可以添加其他样式 */ /* 可以添加其他样式 */
} }
</style> </style>

View File

@ -32,6 +32,14 @@
批量编辑 批量编辑
</el-button> </el-button>
</div> </div>
<el-button
type="primary"
icon="el-icon-plus"
@click.stop="handleAdd"
style="margin-bottom: 10px;"
>
新增图库
</el-button>
<div class="list"> <div class="list">
<el-table <el-table
ref="imgTable" ref="imgTable"
@ -148,6 +156,7 @@
</div> </div>
<batchEditBarcode ref="batchEditBarcodeRef" @success="handleEditSuccess" /> <batchEditBarcode ref="batchEditBarcodeRef" @success="handleEditSuccess" />
<img-edit ref="imgEditRef" @success="handleEditSuccess" /> <img-edit ref="imgEditRef" @success="handleEditSuccess" />
<img-add ref="imgAddRef" @callback_fun_add="handleEditSuccess" />
</div> </div>
</template> </template>
@ -155,11 +164,13 @@
import GoodsToolApi from '@/api/goodsTool' import GoodsToolApi from '@/api/goodsTool'
import batchEditBarcode from './batchEditBarcode.vue' import batchEditBarcode from './batchEditBarcode.vue'
import imgEdit from './imgEdit.vue' import imgEdit from './imgEdit.vue'
import imgAdd from './imgAdd.vue'
export default { export default {
components: { components: {
batchEditBarcode, batchEditBarcode,
imgEdit imgEdit,
imgAdd,
}, },
data() { data() {
return { return {
@ -315,6 +326,10 @@ export default {
handleEdit(row) { handleEdit(row) {
this.$refs.imgEditRef?.open(row); this.$refs.imgEditRef?.open(row);
}, },
handleAdd() {
this.$refs.imgAddRef.init();
},
}, },
} }
</script> </script>

View File

@ -0,0 +1,193 @@
<template>
<div>
<el-dialog :title="title" :visible.sync="dialogVisible" @open="openDialog" :modal-append-to-body="false"
:append-to-body="true" :close-on-click-modal="false" width="70%">
<avue-form ref="formref" style="max-height: 700px; overflow-y: auto; margin-bottom: 50px" :key="formkey"
:option="option" v-model="form" @submit="handleSubmit" @error="handleSubmitError"></avue-form>
<span class="avue-dialog__footer avue-dialog__footer--right" v-if="['add', 'edit'].includes(ntype)">
<el-button icon="el-icon-upload" type="primary" :loading="btnLoading"
@click="submitBtnSave">保存</el-button>
<el-button icon="el-icon-circle-close" @click="dialogVisible = false">取消</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { saveBatchBarcode } from "@/api/goodsTool";
export default {
data() {
return {
title: '新增',
dialogVisible: false,
ntype: 'add',
formkey: 1,
obj_detail: {},
btnLoading: false,
form: {},
option: {
column: [
{
label: '添加图库',
prop: 'imgs',
type: 'dynamic',
span: 24,
children: {
align: 'center',
headerAlign: 'center',
rowAdd: (done) => {
if (this.form.imgs.length >= 5) {
this.$message.error('批次每次最多五条');
return;
}
done();
},
column: [
{
label: '商品名称',
prop: "name",
rules: [
{
required: true,
message: '商品名称必须填写',
},
],
},
{
label: '条形码',
prop: "barcode",
tip: '如有条形码请记得添加',
},
{
label: '商品主图',
width: 200,
type: 'upload',
listType: 'picture-img',
propsHttp: {
res: 'data',
url: 'media_url',
},
action: 'https://mall.gpxscs.cn/api/admin/oss/upload',
tip: '只能上传jpg/png',
data: {
authorization: this.$store.state.user.token,
},
prop: 'thumb',
rules: [
{
required: true,
message: '商品主图必须有',
},
],
},
{
label: '商品附图',
type: 'upload',
width: 150,
listType: 'picture',
propsHttp: {
res: 'data',
url: 'media_url',
},
action: 'https://mall.gpxscs.cn/api/admin/oss/upload',
tip: '只能上传jpg/png',
data: {
authorization: this.$store.state.user.token,
},
prop: 'product_image_list',
},
{
label: '商品简称',
prop: "sname",
},
{
label: '商品标题',
prop: "title",
},
{
label: '一级分类',
prop: "category_1st",
},
{
label: '二级分类',
prop: "category_2nd",
},
],
},
}
],
labelPosition: 'right',
labelSuffix: '',
labelWidth: 140,
gutter: 0,
menuBtn: false,
detail: false,
submitBtn: false,
submitText: '提交',
emptyBtn: false,
emptyText: '清空',
menuPosition: 'center',
},
}
},
methods: {
init() {
this.form = {}
this.dialogVisible = true
this.formkey++
},
openDialog() {
this.title = '新增'
this.option.detail = false
},
submitBtnSave() {
this.btnLoading = true
this.$refs.formref.submit()
},
handleSubmitError() {
this.btnLoading = false
},
handleSubmit(form, done) {
done()
let putData = []
form.imgs.forEach((item) => {
let imageList = []
item.product_image_list.forEach((item) => {
let putObj = {
imageUrl: item,
}
imageList.push(putObj)
})
putData.push(
{
...item,
product_image_list: imageList,
}
)
})
this.saveSet(saveBatchBarcode, putData)
},
saveSet(Interface, params) {
Interface(params).then(
(res) => {
this.$emit('callback_fun_add')
console.log(res)
this.$message({
type: 'success',
message: res.msg,
})
this.dialogVisible = false
this.btnLoading = false
},
(error) => {
this.btnLoading = false
window.console.log(error)
}
)
},
},
}
</script>

View File

@ -23,6 +23,7 @@
label: 'category_name', label: 'category_name',
value: 'category_id', value: 'category_id',
children: 'sub', children: 'sub',
checkStrictly: true
}" }"
:style="{ width: '90%' }" :style="{ width: '90%' }"
@change="onCategoryChange" @change="onCategoryChange"