first commit

This commit is contained in:
2026-01-08 14:58:16 +08:00
commit 556e5d64aa
9575 changed files with 1621095 additions and 0 deletions
@@ -0,0 +1,388 @@
let BENEFIT_GOODS_FORM = {
/*language=HTML*/
template: `
<div>
<el-dialog :title="formData.id ? '编辑商品' : '新增商品'"
:visible.sync="visibleDialog" :close-on-click-modal="false" width="60%">
<el-form :model="formData" ref="formRef" :rules="formRules"
label-width="0" class="benefitGoodsForm">
<el-descriptions border class="descriptions-form" :column="2">
<el-descriptions-item label="商品名称">
<el-form-item prop="name" label="">
<el-input maxlength="40" placeholder="商品名称" show-word-limit
v-model="formData.name"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="所需积分">
<el-form-item prop="money" label="">
<el-input-number :max="9999" :precision="2" placeholder="所需积分"
v-model="formData.money"
:min="1"
style="width: 100%"></el-input-number>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="发放形式">
<el-form-item prop="goodsProvideMode" label="">
<dict-select clearable code="BENEFIT_GOODS_PROVIDE_MODE"
placeholder="请选择发放形式"
v-model="formData.goodsProvideMode"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="排序">
<el-form-item prop="goodsSort" label="">
<el-input-number :max="9999" placeholder="排序"
v-model="formData.goodsSort"
:min="1"
style="width: 100%"></el-input-number>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="所属一级分类">
<el-form-item prop="goodsCategoryOneLevelId" label="">
<el-select v-model="formData.goodsCategoryOneLevelId"
placeholder="请选择所属一级分类" style="width: 100%"
@change="goodsCategoryOneLevelChange">
<el-option
v-for="item in goodsCategoryOneLevelOptions"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="所属二级分类">
<el-form-item prop="goodsCategoryTwoLevelId" label="">
<el-select v-model="formData.goodsCategoryTwoLevelId"
placeholder="请选择所属二级分类" style="width: 100%">
<el-option
v-for="item in goodsCategoryTwoLevelOptions"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="简短描述" span="2">
<el-form-item prop="simpleDesc" label="">
<el-input maxlength="80" placeholder="简短描述" show-word-limit
v-model="formData.simpleDesc"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="商品规格"
v-if="formData.goodsProvideMode==='GOODS_PROVIDE_MODE_POST'
||formData.goodsProvideMode==='GOODS_PROVIDE_MODE_SHOPPING'">
<el-button type="primary" size="mini"
@click="goodsSpecificationsVisibleDialog = true">
点击设置商品规格
</el-button>
</el-descriptions-item>
<el-descriptions-item label="门店地址"
v-if="formData.goodsProvideMode==='GOODS_PROVIDE_MODE_SHOP'">
<el-button type="primary" size="mini"
@click="goodsShopAddressVisibleDialog = true">
点击设置门店地址
</el-button>
</el-descriptions-item>
<el-descriptions-item label="邮寄发放配置"
v-if="formData.goodsProvideMode==='GOODS_PROVIDE_MODE_POST'">
<el-button type="primary" size="mini"
@click="postProvideConfigVisibleDialog=true">点击设置邮寄发放配置
</el-button>
</el-descriptions-item>
<el-descriptions-item
v-if="formData.goodsProvideMode==='GOODS_PROVIDE_MODE_SHOPPING'||
formData.goodsProvideMode==='GOODS_PROVIDE_MODE_SHOP'"></el-descriptions-item>
<el-descriptions-item label="说明描述" span="2">
<el-form-item prop="description" label="">
<text-editor v-model="formData.description"></text-editor>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="图片" span="2">
<el-form-item prop="imgUrl" label="">
<file-upload :upload_number="5" :value.sync="formData.imgUrl"
accept=".jpg,.jpeg,.png"
class="imgUrl"
upload_result_type="url"
complete_result upload_mode="drag"
upload_result_category="array"></file-upload>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="主页展示" span="2">
<el-form-item prop="isHomepage" label="">
<el-radio-group v-model="formData.isHomepage">
<el-radio-button label="true">是</el-radio-button>
<el-radio-button label="false">否</el-radio-button>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item v-if="formData.isHomepage" label="主页轮播图片" span="2">
<el-form-item prop="carouselImgUrl" label="">
<file-upload :upload_number="1" :value.sync="formData.carouselImgUrl"
accept=".jpg,.jpeg,.png"
class="imgUrl"
upload_result_type="url"
complete_result upload_mode="drag"
upload_result_category="array"></file-upload>
</el-form-item>
</el-descriptions-item>
</el-descriptions>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="visibleDialog = false">取 消</el-button>
<el-button type="primary" @click="submit">提 交</el-button>
</span>
</el-dialog>
<el-dialog title="配置商品规格"
:visible.sync="goodsSpecificationsVisibleDialog"
:close-on-click-modal="false"
width="50%">
<el-table :data="formData.benefitGoodsSpecificationsList">
<el-table-column
label="序号"
type="index"
width="80px"
></el-table-column>
<el-table-column label="规格名称">
<template slot-scope="{row}">
<el-input maxlength="50" placeholder="规格名称"
v-model="row.name"></el-input>
</template>
</el-table-column>
<el-table-column label="所需积分" width="150px">
<template slot-scope="{row}">
<el-input-number :max="9999" placeholder="所需积分"
v-model="row.points"
:min="1"
style="width: 100%"></el-input-number>
</template>
</el-table-column>
<el-table-column label="排序" width="150px">
<template slot-scope="{row}">
<el-input-number :max="9999" placeholder="排序"
v-model="row.specificationsSort"
:min="1"
style="width: 100%"></el-input-number>
</template>
</el-table-column>
<el-table-column label="图片">
<template slot-scope="{row}">
<file-upload :upload_number="5" :value.sync="row.imgUrl"
accept=".jpg,.jpeg,.png"
class="imgUrl"
upload_result_type="url"
complete_result upload_mode="file"
upload_result_category="array"></file-upload>
</template>
</el-table-column>
<el-table-column label="操作" width="100px">
<template slot="header" slot-scope="scope">
<el-button @click="pushBenefitGoodsSpecifications" icon="el-icon-plus"
size="mini" type="primary">
添加
</el-button>
</template>
<template slot-scope="{row,$index}">
<el-button
@click="formData.benefitGoodsSpecificationsList.splice($index, 1)"
size="mini"
type="danger">删除
</el-button>
</template>
</el-table-column>
</el-table>
<span slot="footer" class="dialog-footer">
<el-button type="primary"
@click="goodsSpecificationsVisibleDialog = false">确 定</el-button>
</span>
</el-dialog>
<el-dialog title="邮寄发放配置"
:visible.sync="postProvideConfigVisibleDialog"
:close-on-click-modal="false"
width="40%">
<el-form :model="postProvideConfigFormData"
label-width="110px">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item prop="choiceProvince" label="可邮寄省份">
<el-select v-model="postProvideConfigFormData.choiceProvince"
placeholder="请选择可邮寄省份" clearable filterable
@change="choiceProvinceChange" style="width: 100%">
<el-option
v-for="item in provinceOptions"
:key="item.label"
:label="item.label"
:value="item.label"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="choiceMunicipality" label="可邮寄市">
<el-select v-model="postProvideConfigFormData.choiceMunicipality"
placeholder="请选择可邮寄市" clearable filterable
style="width: 100%">
<el-option
v-for="item in municipalityOptions"
:key="item.label"
:label="item.label"
:value="item.label">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary"
@click="postProvideConfigVisibleDialog = false">确 定</el-button>
</span>
</el-dialog>
<el-dialog title="添加门店地址"
:visible.sync="goodsShopAddressVisibleDialog"
:close-on-click-modal="false"
width="50%">
<el-table :data="formData.shopAddressList">
<el-table-column
label="序号"
type="index"
width="80px"
></el-table-column>
<el-table-column label="门店地址">
<template slot-scope="{row}">
<el-input placeholder="门店地址" v-model="row.name"></el-input>
</template>
</el-table-column>
<el-table-column label="操作" width="100px">
<template slot="header" slot-scope="scope">
<el-button @click="formData.shopAddressList.push({name:''})"
icon="el-icon-plus"
size="mini" type="primary">
添加
</el-button>
</template>
<template slot-scope="{row,$index}">
<el-button
@click="formData.shopAddressList.splice($index, 1)"
size="mini"
type="danger">删除
</el-button>
</template>
</el-table-column>
</el-table>
<span slot="footer" class="dialog-footer">
<el-button type="primary"
@click="goodsShopAddressVisibleDialog = false">确 定</el-button>
</span>
</el-dialog>
</div>
`,
mixins: [initTableMixins],
data() {
return {
goodsCategoryOneLevelOptions: [],
goodsCategoryTwoLevelOptions: [],
viewData: {},
visibleDialog: false,
goodsSpecificationsVisibleDialog: false,
postProvideConfigVisibleDialog: false,
goodsShopAddressVisibleDialog: false,
provinceOptions: chengShiList,
municipalityOptions: [],
postProvideConfigFormData: { choiceProvince: "", choiceMunicipality: "" },
formRules: {
name: [{ required: true, message: "必填", trigger: "blur" }],
money: [{ required: true, message: "必填", trigger: "blur" }],
goodsCategoryOneLevelId: [{ required: true, message: "必填", trigger: "blur" }],
goodsCategoryTwoLevelId: [{ required: true, message: "必填", trigger: "blur" }],
goodsSort: [{ required: true, message: "必填", trigger: "blur" }],
goodsProvideMode: [{ required: true, message: "必填", trigger: "blur" }],
description: [{ required: true, message: "必填", trigger: "blur" }]
}
}
}, methods: {
choiceProvinceChange(val) {
this.$set(this.postProvideConfigFormData, "choiceMunicipality", "")
this.municipalityOptions = chengShiList.find(v => v.label === val)?.children
},
goodsCategoryOneLevelChange(val) {
this.$set(this.formData, "goodsCategoryTwoLevelId", "")
this.goodsCategoryTwoLevelOptions = this.goodsCategoryOneLevelOptions.find(v => v.id === val)?.children
},
pushBenefitGoodsSpecifications() {
this.formData.benefitGoodsSpecificationsList.push({
name: "",
specificationsSort: this.formData.benefitGoodsSpecificationsList.length + 1,
imgUrl: ""
})
},
async open() {
this.formData = {
status: 1,
benefitGoodsSpecificationsList: [],
shopAddressList: [],
postProvideConfig: { choiceProvince: "", choiceMunicipality: "" },
isHomepage:false
}
this.visibleDialog = true
await this.getGoodsCategoryTree()
},
async findOne(id) {
const res = await this.$axios.post("/platform/benefit/goods/findOne", { id })
if (res.code === 0) {
return res.data
}
},
async openEdit(id) {
const data = await this.findOne(id)
data.imgUrl = JSON.parse(data.imgUrl)
data.carouselImgUrl = JSON.parse(data.carouselImgUrl)
data.shopAddressList = JSON.parse(data.shopAddressList)
this.formData = data
this.postProvideConfigFormData = JSON.parse(this.formData.postProvideConfig)
this.visibleDialog = true
await this.getGoodsCategoryTree()
this.goodsCategoryTwoLevelOptions = this.goodsCategoryOneLevelOptions.find(v => v.id === this.formData.goodsCategoryOneLevelId)?.children
},
async getGoodsCategoryTree() {
const res = await this.$axios.post("/platform/benefit/goods/getGoodsCategoryTree")
this.goodsCategoryOneLevelOptions = res.data
this.goodsCategoryTwoLevelOptions = []
},
submit() {
this.$refs.formRef.validate(valid => {
if (valid) {
if (this.formData.goodsProvideMode=="GOODS_PROVIDE_MODE_SHOPPING"&&this.formData.benefitGoodsSpecificationsList.length==0){
this.$message.warning("发放形式为商城兑换的商品需要设置商品规格")
return
}
this.formData.postProvideConfig = this.postProvideConfigFormData
this.$axios.post("/platform/benefit/goods/submit", { data: JSON.stringify(this.formData) }).then(res => {
if (res.code === 0) {
this.$message.success("保存成功")
this.visibleDialog = false
this.$emit("query")
}
})
}
})
}
}
}
<!--#include("/platform/zhgh/welfare/include/chengSh.js"){}#-->
@@ -0,0 +1,127 @@
let BENEFIT_GOODS_INFO = {
/*language=HTML*/
template: `
<div>
<el-dialog title="查看商品"
:visible.sync="visibleDialog" :close-on-click-modal="false" width="70%">
<el-form label-width="110px">
<el-descriptions :column="3" border>
<el-descriptions-item label="商品名称">{{ viewData.name }}
</el-descriptions-item>
<el-descriptions-item label="所需积分">{{ viewData.money }}
</el-descriptions-item>
<el-descriptions-item label="发放形式">
<dict-tag :options="dict.type.BENEFIT_GOODS_PROVIDE_MODE"
:value="viewData.goodsProvideMode"></dict-tag>
</el-descriptions-item>
<el-descriptions-item label="所属一级分类">
{{ viewData.goodsCategoryOneLevelName }}
</el-descriptions-item>
<el-descriptions-item label="所属二级分类">
{{ viewData.goodsCategoryTwoLevelName }}
</el-descriptions-item>
<el-descriptions-item label="排序">{{ viewData.goodsSort }}
</el-descriptions-item>
<el-descriptions-item label="简短描述" span="3">{{ viewData.simpleDesc }}
</el-descriptions-item>
<el-descriptions-item label="商品规格" span="3">
<el-table :data="viewData.benefitGoodsSpecificationsList">
<el-table-column
label="序号"
type="index"
width="80px"
></el-table-column>
<el-table-column label="规格名称" prop="name">
</el-table-column>
<el-table-column label="图片">
<template v-slot="{row}">
<el-button @click="openImg(row.imgUrl)" size="mini"
type="primary" v-if="row.imgUrl">
点击查看图片
</el-button>
<span v-else>暂无</span>
</template>
</el-table-column>
</el-table>
</el-descriptions-item>
<el-descriptions-item label="邮寄发放配置" span="3"
v-if="viewData.goodsProvideMode==='BENEFIT_GOODS_PROVIDE_MODE_POST'">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item prop="choiceProvince" label="可邮寄省份">
{{
viewData.postProvideConfig.choiceProvince?viewData.postProvideConfig.choiceProvince:'暂无'
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="choiceProvince" label="可邮寄市">
{{
viewData.postProvideConfig.choiceMunicipality?viewData.postProvideConfig.choiceMunicipality:'暂无'
}}
</el-form-item>
</el-col>
</el-row>
</el-descriptions-item>
<el-descriptions-item label="说明描述" span="3">
<div class="text-left" v-html="viewData.description"></div>
</el-descriptions-item>
<el-descriptions-item label="图片" span="3">
<file-preview :files="viewData.imgUrl" complete_result></file-preview>
</el-descriptions-item>
<el-descriptions-item label="是否主页" span="3">
<span v-if="viewData.isHomepage">是</span>
<span v-else>否</span>
</el-descriptions-item>
<el-descriptions-item label="图片" span="3">
<file-preview :files="viewData.carouselImgUrl" complete_result></file-preview>
</el-descriptions-item>
</el-descriptions>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary"
@click="visibleDialog = false">关闭</el-button>
</span>
</el-dialog>
<el-dialog title="查看商品"
:visible.sync="imgVisibleDialog" :close-on-click-modal="false" width="50%">
<file-preview :files="imgUrlList" complete_result></file-preview>
<span slot="footer" class="dialog-footer">
<el-button type="primary"
@click="imgVisibleDialog = false">关闭</el-button>
</span>
</el-dialog>
</div>
`,
dicts: ["BENEFIT_GOODS_PROVIDE_MODE"],
data() {
return {
viewData: {},
imgUrlList: [],
visibleDialog: false,
imgVisibleDialog: false
}
},
methods: {
openImg(imgUrl) {
this.imgUrlList = imgUrl
this.imgVisibleDialog = true
},
async findOne(id) {
const res = await this.$axios.post("/platform/benefit/goods/findOne", { id })
if (res.code === 0) {
return res.data
}
},
async open(id) {
const data = await this.findOne(id)
data.imgUrl = JSON.parse(data.imgUrl)
this.viewData = data
this.postProvideConfigFormData = JSON.parse(this.viewData.postProvideConfig)
this.visibleDialog = true
}
}
}
@@ -0,0 +1,141 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="所属年份">
<el-date-picker
:clearable="false"
placeholder="所属年份"
style="width: 100%"
type="year"
@change="getWelfareList"
v-model="pageForm.year"
value-format="yyyy"
></el-date-picker>
</search-item>
<search-item label="福利项目">
<el-select :clearable="true" filterable placeholder="请选择福利项目" style="width: 100%" v-model="pageForm.benefitId">
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in projectSelectOptions"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool label="商品管理">
<el-button @click="openAdd()" icon="el-icon-plus" size="mini" type="primary">新增商品</el-button>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" ref="table" row-key="id" v-loading="tableLoading">
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
<el-table-column
:key="column.prop"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-slot="{row}" v-if="column.prop==='goodsProvideMode'">
<dict-tag :options="dict.type.BENEFIT_GOODS_PROVIDE_MODE" :value="row.goodsProvideMode"></dict-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="300px">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button @click="openEdit(row)" size="mini" type="primary">编辑</el-button>
<el-button @click="doDelete(row)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
</guava>
<benefit-goods-form ref="benefitGoodsForm" @query="pageData"></benefit-goods-form>
<benefit-goods-info ref="benefitGoodsInfo"></benefit-goods-info>
</div>
<script nonce="${cspNonce!}">
<!--#include("goodsForm.js"){}#-->
<!--#include("goodsInfo.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
dicts: ["BENEFIT_GOODS_PROVIDE_MODE"],
data() {
return {
projectSelectOptions: [],
pageForm: {
year: moment().format("YYYY")
},
tableColumns: [
{ prop: "name", label: "商品名称" },
{ prop: "simpleDesc", label: "简短描述" },
{ prop: "goodsCategoryOneLevelName", label: "所属一级分类" },
{ prop: "goodsCategoryTwoLevelName", label: "所属二级分类" },
{ prop: "money", label: "所需积分" },
{ prop: "goodsProvideMode", label: "发放形式" }
]
}
},
components: {
"benefit-goods-form": BENEFIT_GOODS_FORM,
"benefit-goods-info": BENEFIT_GOODS_INFO
},
methods: {
openView(row) {
this.$refs.benefitGoodsInfo.open(row.id)
},
openAdd() {
this.$refs.benefitGoodsForm.open()
},
openEdit(row) {
this.$refs.benefitGoodsForm.openEdit(row.id)
},
doDelete(row) {
this.$confirm("确定要删除【" + row.name + "】?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios
.post(loc() + "/delete", {
id: row.id
})
.then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
getWelfareList() {
this.$set(this.pageForm, "benefitId", "")
this.$axios.post("/platform/benefit/project/getBenefitList", { year: this.pageForm.year }).then((res) => {
this.projectSelectOptions = res.data
})
}
},
async created() {
this.getWelfareList()
await this.pageData()
}
})
</script>
<style>
.benefitGoodsForm .el-form-item {
margin-bottom: 5px !important;
}
</style>
<!--#
}
#-->