This commit is contained in:
38
package.json
38
package.json
@@ -33,49 +33,51 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@unocss/eslint-config": "^0.55.7",
|
"@unocss/eslint-config": "^0.55.7",
|
||||||
"@vueuse/core": "^10.6.1",
|
"@vueuse/core": "^10.11.0",
|
||||||
"@wangeditor/editor": "^5.1.23",
|
"@wangeditor/editor": "^5.1.23",
|
||||||
"@wangeditor/editor-for-vue": "^5.1.12",
|
"@wangeditor/editor-for-vue": "^5.1.12",
|
||||||
"axios": "^1.6.2",
|
"axios": "^1.7.2",
|
||||||
"dayjs": "^1.11.10",
|
"dayjs": "^1.11.11",
|
||||||
"echarts": "^5.4.3",
|
"echarts": "^5.5.1",
|
||||||
|
"file-saver": "^2.0.5",
|
||||||
|
"jszip": "^3.10.1",
|
||||||
"lodash-es": "^4.17.21",
|
"lodash-es": "^4.17.21",
|
||||||
"md-editor-v3": "^4.9.0",
|
"md-editor-v3": "^4.17.3",
|
||||||
"mockjs": "^1.1.0",
|
"mockjs": "^1.1.0",
|
||||||
"pinia": "^2.1.7",
|
"pinia": "^2.1.7",
|
||||||
"vite": "^4.5.0",
|
"vite": "^4.5.3",
|
||||||
"vue": "3.3.4",
|
"vue": "3.3.4",
|
||||||
"vue-echarts": "^6.6.1",
|
"vue-echarts": "^6.7.3",
|
||||||
"vue-router": "^4.2.5",
|
"vue-router": "^4.4.0",
|
||||||
"xlsx": "^0.18.5"
|
"xlsx": "^0.18.5"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@commitlint/cli": "^17.8.1",
|
"@commitlint/cli": "^17.8.1",
|
||||||
"@commitlint/config-conventional": "^17.8.1",
|
"@commitlint/config-conventional": "^17.8.1",
|
||||||
"@iconify/json": "^2.2.150",
|
"@iconify/json": "^2.2.228",
|
||||||
"@iconify/vue": "^4.1.1",
|
"@iconify/vue": "^4.1.2",
|
||||||
"@unocss/preset-rem-to-px": "^0.55.7",
|
"@unocss/preset-rem-to-px": "^0.55.7",
|
||||||
"@vitejs/plugin-vue": "^4.5.1",
|
"@vitejs/plugin-vue": "^4.6.2",
|
||||||
"@vue/compiler-sfc": "^3.3.9",
|
"@vue/compiler-sfc": "^3.4.32",
|
||||||
"@zclzone/eslint-config": "^0.0.4",
|
"@zclzone/eslint-config": "^0.0.4",
|
||||||
"chalk": "^5.3.0",
|
"chalk": "^5.3.0",
|
||||||
"commitizen": "^4.3.0",
|
"commitizen": "^4.3.0",
|
||||||
"cz-conventional-changelog": "^3.3.0",
|
"cz-conventional-changelog": "^3.3.0",
|
||||||
"cz-customizable": "^7.0.0",
|
"cz-customizable": "^7.1.0",
|
||||||
"dotenv": "^16.3.1",
|
"dotenv": "^16.4.5",
|
||||||
"esno": "^0.17.0",
|
"esno": "^0.17.0",
|
||||||
"fs-extra": "^11.2.0",
|
"fs-extra": "^11.2.0",
|
||||||
"husky": "^8.0.3",
|
"husky": "^8.0.3",
|
||||||
"lint-staged": "^13.3.0",
|
"lint-staged": "^13.3.0",
|
||||||
"naive-ui": "^2.35.0",
|
"naive-ui": "^2.39.0",
|
||||||
"rollup-plugin-visualizer": "^5.9.3",
|
"rollup-plugin-visualizer": "^5.12.0",
|
||||||
"sass": "^1.69.5",
|
"sass": "^1.77.8",
|
||||||
"unocss": "0.55.0",
|
"unocss": "0.55.0",
|
||||||
"unplugin-auto-import": "^0.16.7",
|
"unplugin-auto-import": "^0.16.7",
|
||||||
"unplugin-icons": "^0.16.6",
|
"unplugin-icons": "^0.16.6",
|
||||||
"unplugin-vue-components": "^0.25.2",
|
"unplugin-vue-components": "^0.25.2",
|
||||||
"vite-plugin-compression": "^0.5.1",
|
"vite-plugin-compression": "^0.5.1",
|
||||||
"vite-plugin-html": "^3.2.0",
|
"vite-plugin-html": "^3.2.2",
|
||||||
"vite-plugin-mock": "^2.9.8",
|
"vite-plugin-mock": "^2.9.8",
|
||||||
"vite-plugin-svg-icons": "^2.0.1"
|
"vite-plugin-svg-icons": "^2.0.1"
|
||||||
},
|
},
|
||||||
|
|||||||
3383
pnpm-lock.yaml
generated
3383
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -3,4 +3,5 @@ import { request } from '@/utils'
|
|||||||
export default {
|
export default {
|
||||||
getHotlist: (data) => request.post('/goods', data),
|
getHotlist: (data) => request.post('/goods', data),
|
||||||
getHotStatus: (data) => request.post('/goods/process', data),
|
getHotStatus: (data) => request.post('/goods/process', data),
|
||||||
|
updateType: (data) => request.post('/goods/edit/activity', data),
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,48 @@
|
|||||||
<!-- eslint-disable vue/no-v-html -->
|
<!-- eslint-disable vue/no-v-html -->
|
||||||
<template>
|
<template>
|
||||||
<CommonPage show-footer :title="$route.title">
|
<CommonPage show-footer :title="$route.title">
|
||||||
|
<n-grid class="mb-10" x-gap="12">
|
||||||
|
<n-gi span="12" mt-10 flex items-center>
|
||||||
|
<span w-100>筛选条件:</span>
|
||||||
|
<n-input-group>
|
||||||
|
<n-select
|
||||||
|
v-model:value="queryParams.selectKey"
|
||||||
|
:style="{ width: '20%' }"
|
||||||
|
:options="selectOptions"
|
||||||
|
placeholder="请选择"
|
||||||
|
/>
|
||||||
|
<n-input v-model:value="queryParams.word" :style="{ width: '30%' }" />
|
||||||
|
</n-input-group>
|
||||||
|
</n-gi>
|
||||||
|
<n-gi span="24" mt-10 flex items-center>
|
||||||
|
<n-button type="primary" @click="getList">查询</n-button>
|
||||||
|
<n-button ml-10 @click="clear">重置</n-button>
|
||||||
|
</n-gi>
|
||||||
|
<n-gi span="24" mt-10 flex items-center>
|
||||||
|
<n-button strong secondary type="primary" @click="changeGoodsType(0)">
|
||||||
|
设为普通商品
|
||||||
|
</n-button>
|
||||||
|
<n-button strong secondary ml-10 type="warning" @click="changeGoodsType(1)">
|
||||||
|
设为活动商品
|
||||||
|
</n-button>
|
||||||
|
<n-button strong secondary ml-10 type="info" @click="changeGoodsType(2)">
|
||||||
|
设为兑换商品
|
||||||
|
</n-button>
|
||||||
|
<n-button strong secondary ml-10 type="error" @click="changeGoodsType(3)">
|
||||||
|
设为摇球机活动商品
|
||||||
|
</n-button>
|
||||||
|
</n-gi>
|
||||||
|
</n-grid>
|
||||||
|
|
||||||
<n-data-table
|
<n-data-table
|
||||||
:loading="loading"
|
:loading="loading"
|
||||||
:columns="columns"
|
:columns="columns"
|
||||||
:data="data"
|
:data="data"
|
||||||
:pagination="pagination"
|
:pagination="pagination"
|
||||||
:bordered="false"
|
:bordered="false"
|
||||||
|
:row-key="(row) => row.gid"
|
||||||
remote
|
remote
|
||||||
|
@update:checked-row-keys="handleCheck"
|
||||||
/>
|
/>
|
||||||
<!-- 拒绝 -->
|
<!-- 拒绝 -->
|
||||||
<n-modal v-model:show="isNoteModel">
|
<n-modal v-model:show="isNoteModel">
|
||||||
@@ -152,7 +187,7 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import api from './api'
|
import api from './api'
|
||||||
import { NButton, NImage, NSpace, NEllipsis } from 'naive-ui'
|
import { NButton, NImage, NSpace, NEllipsis, NTag } from 'naive-ui'
|
||||||
import { h, withDirectives, resolveDirective } from 'vue'
|
import { h, withDirectives, resolveDirective } from 'vue'
|
||||||
|
|
||||||
const vPerms = resolveDirective('perms')
|
const vPerms = resolveDirective('perms')
|
||||||
@@ -171,6 +206,33 @@ const notesVal = ref('')
|
|||||||
|
|
||||||
const formRef = ref(null)
|
const formRef = ref(null)
|
||||||
|
|
||||||
|
const selectOptions = ref([
|
||||||
|
{
|
||||||
|
label: '商品名称',
|
||||||
|
value: 0,
|
||||||
|
},
|
||||||
|
])
|
||||||
|
|
||||||
|
const queryParams = ref({
|
||||||
|
selectKey: 0,
|
||||||
|
word: '',
|
||||||
|
checkedRowKeysRef: [],
|
||||||
|
})
|
||||||
|
|
||||||
|
const handleCheck = (row) => {
|
||||||
|
queryParams.value.checkedRowKeysRef = row
|
||||||
|
}
|
||||||
|
|
||||||
|
const changeGoodsType = async (type) => {
|
||||||
|
if (queryParams.value.checkedRowKeysRef.length === 0) return $message.info('没有选中商品')
|
||||||
|
await api.updateType({
|
||||||
|
type: type,
|
||||||
|
gid: queryParams.value.checkedRowKeysRef,
|
||||||
|
})
|
||||||
|
getList()
|
||||||
|
queryParams.value.checkedRowKeysRef = []
|
||||||
|
}
|
||||||
|
|
||||||
const rules = {
|
const rules = {
|
||||||
pulse: {
|
pulse: {
|
||||||
required: true,
|
required: true,
|
||||||
@@ -202,6 +264,9 @@ const nowRow = ref({})
|
|||||||
const nowKey = ref(null)
|
const nowKey = ref(null)
|
||||||
|
|
||||||
const columns = ref([
|
const columns = ref([
|
||||||
|
{
|
||||||
|
type: 'selection',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: '商品名称',
|
title: '商品名称',
|
||||||
slot: 'name',
|
slot: 'name',
|
||||||
@@ -243,6 +308,40 @@ const columns = ref([
|
|||||||
)
|
)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: '商品类型',
|
||||||
|
slot: 'type',
|
||||||
|
align: 'center',
|
||||||
|
render(row) {
|
||||||
|
const obj = {
|
||||||
|
0: {
|
||||||
|
type: 'success',
|
||||||
|
text: '普通商品',
|
||||||
|
},
|
||||||
|
1: {
|
||||||
|
type: 'warning',
|
||||||
|
text: '活动商品',
|
||||||
|
},
|
||||||
|
2: {
|
||||||
|
type: 'info',
|
||||||
|
text: '兑换商品',
|
||||||
|
},
|
||||||
|
3: {
|
||||||
|
type: 'error',
|
||||||
|
text: '摇球机活动商品',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
return h(
|
||||||
|
NTag,
|
||||||
|
{
|
||||||
|
type: obj[row.type].type,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
default: () => obj[row.type].text,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: '商品价格(元)',
|
title: '商品价格(元)',
|
||||||
key: 'number',
|
key: 'number',
|
||||||
@@ -411,6 +510,7 @@ const getList = async () => {
|
|||||||
const res = await api.getHotlist({
|
const res = await api.getHotlist({
|
||||||
pageNum: pagination.value.page,
|
pageNum: pagination.value.page,
|
||||||
pageSize: pagination.value.pageSize,
|
pageSize: pagination.value.pageSize,
|
||||||
|
name: queryParams.value.word,
|
||||||
})
|
})
|
||||||
data.value = res.data.data || []
|
data.value = res.data.data || []
|
||||||
pagination.value.itemCount = res.data.total
|
pagination.value.itemCount = res.data.total
|
||||||
|
|||||||
@@ -85,6 +85,7 @@
|
|||||||
<n-button v-perms="['/admin/qrcode/edit']" mr-10 type="warning" @click="openModal(2)">
|
<n-button v-perms="['/admin/qrcode/edit']" mr-10 type="warning" @click="openModal(2)">
|
||||||
修改二维码
|
修改二维码
|
||||||
</n-button>
|
</n-button>
|
||||||
|
<n-button mr-10 type="info" @click="saveCode">下载二维码</n-button>
|
||||||
<!-- <n-button mr-10 type="primary" @click="openModal(1)">新增二维码</n-button> -->
|
<!-- <n-button mr-10 type="primary" @click="openModal(1)">新增二维码</n-button> -->
|
||||||
<!-- <n-button mr-10 type="warning" @click="openModal(3)">修改二维码</n-button> -->
|
<!-- <n-button mr-10 type="warning" @click="openModal(3)">修改二维码</n-button> -->
|
||||||
<n-button type="primary" @click="getList">搜索</n-button>
|
<n-button type="primary" @click="getList">搜索</n-button>
|
||||||
@@ -147,6 +148,8 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { NButton } from 'naive-ui'
|
import { NButton } from 'naive-ui'
|
||||||
|
import JSZip from 'jszip'
|
||||||
|
import { saveAs } from 'file-saver'
|
||||||
import api from '../api'
|
import api from '../api'
|
||||||
import { ref, resolveDirective, withDirectives } from 'vue'
|
import { ref, resolveDirective, withDirectives } from 'vue'
|
||||||
|
|
||||||
@@ -464,6 +467,27 @@ const handleValidateClick = (e) => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 下载二维码
|
||||||
|
const saveCode = async () => {
|
||||||
|
if (checkedRowKeysRef.value.length === 0) return $message.error('请选择二维码')
|
||||||
|
|
||||||
|
const zip = new JSZip()
|
||||||
|
|
||||||
|
data.value.forEach((item) => {
|
||||||
|
checkedRowKeysRef.value.forEach((id) => {
|
||||||
|
if (item.qid === id) {
|
||||||
|
const imageData = item.url.split(',')[1]
|
||||||
|
zip.file(`${item.qid}.png`, imageData, {
|
||||||
|
base64: true,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
const content = await zip.generateAsync({ type: 'blob' })
|
||||||
|
saveAs(content, '二维码.zip')
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped></style>
|
<style lang="scss" scoped></style>
|
||||||
|
|||||||
Reference in New Issue
Block a user