feat: 商品管理
This commit is contained in:
parent
5cf6e48e74
commit
03f8a53cb0
154
src/auto-import.d.ts
vendored
154
src/auto-import.d.ts
vendored
@ -6,77 +6,95 @@
|
|||||||
// biome-ignore lint: disable
|
// biome-ignore lint: disable
|
||||||
export {}
|
export {}
|
||||||
declare global {
|
declare global {
|
||||||
const EffectScope: typeof import('vue')['EffectScope']
|
const EffectScope: (typeof import('vue'))['EffectScope']
|
||||||
const api: typeof import('../../../../../../src/api/index')['api']
|
const api: (typeof import('src/api/index'))['api']
|
||||||
const computed: typeof import('vue')['computed']
|
const computed: (typeof import('vue'))['computed']
|
||||||
const createApp: typeof import('vue')['createApp']
|
const createApp: (typeof import('vue'))['createApp']
|
||||||
const customRef: typeof import('vue')['customRef']
|
const customRef: (typeof import('vue'))['customRef']
|
||||||
const defineAsyncComponent: typeof import('vue')['defineAsyncComponent']
|
const defineAsyncComponent: (typeof import('vue'))['defineAsyncComponent']
|
||||||
const defineComponent: typeof import('vue')['defineComponent']
|
const defineComponent: (typeof import('vue'))['defineComponent']
|
||||||
const effectScope: typeof import('vue')['effectScope']
|
const effectScope: (typeof import('vue'))['effectScope']
|
||||||
const getCurrentInstance: typeof import('vue')['getCurrentInstance']
|
const getCurrentInstance: (typeof import('vue'))['getCurrentInstance']
|
||||||
const getCurrentScope: typeof import('vue')['getCurrentScope']
|
const getCurrentScope: (typeof import('vue'))['getCurrentScope']
|
||||||
const getCurrentWatcher: typeof import('vue')['getCurrentWatcher']
|
const getCurrentWatcher: (typeof import('vue'))['getCurrentWatcher']
|
||||||
const h: typeof import('vue')['h']
|
const h: (typeof import('vue'))['h']
|
||||||
const handleInit: typeof import('../../../../../../src/utils/page/index')['handleInit']
|
const handleInit: (typeof import('src/utils/page/index'))['handleInit']
|
||||||
const handleMessageBox: typeof import('../../../../../../src/utils/page/index')['handleMessageBox']
|
const handleMessageBox: (typeof import('src/utils/page/index'))['handleMessageBox']
|
||||||
const inject: typeof import('vue')['inject']
|
const inject: (typeof import('vue'))['inject']
|
||||||
const isProxy: typeof import('vue')['isProxy']
|
const isProxy: (typeof import('vue'))['isProxy']
|
||||||
const isReactive: typeof import('vue')['isReactive']
|
const isReactive: (typeof import('vue'))['isReactive']
|
||||||
const isReadonly: typeof import('vue')['isReadonly']
|
const isReadonly: (typeof import('vue'))['isReadonly']
|
||||||
const isRef: typeof import('vue')['isRef']
|
const isRef: (typeof import('vue'))['isRef']
|
||||||
const isShallow: typeof import('vue')['isShallow']
|
const isShallow: (typeof import('vue'))['isShallow']
|
||||||
const markRaw: typeof import('vue')['markRaw']
|
const markRaw: (typeof import('vue'))['markRaw']
|
||||||
const nextTick: typeof import('vue')['nextTick']
|
const nextTick: (typeof import('vue'))['nextTick']
|
||||||
const onActivated: typeof import('vue')['onActivated']
|
const onActivated: (typeof import('vue'))['onActivated']
|
||||||
const onBeforeMount: typeof import('vue')['onBeforeMount']
|
const onBeforeMount: (typeof import('vue'))['onBeforeMount']
|
||||||
const onBeforeRouteLeave: typeof import('vue-router')['onBeforeRouteLeave']
|
const onBeforeRouteLeave: (typeof import('vue-router'))['onBeforeRouteLeave']
|
||||||
const onBeforeRouteUpdate: typeof import('vue-router')['onBeforeRouteUpdate']
|
const onBeforeRouteUpdate: (typeof import('vue-router'))['onBeforeRouteUpdate']
|
||||||
const onBeforeUnmount: typeof import('vue')['onBeforeUnmount']
|
const onBeforeUnmount: (typeof import('vue'))['onBeforeUnmount']
|
||||||
const onBeforeUpdate: typeof import('vue')['onBeforeUpdate']
|
const onBeforeUpdate: (typeof import('vue'))['onBeforeUpdate']
|
||||||
const onDeactivated: typeof import('vue')['onDeactivated']
|
const onDeactivated: (typeof import('vue'))['onDeactivated']
|
||||||
const onErrorCaptured: typeof import('vue')['onErrorCaptured']
|
const onErrorCaptured: (typeof import('vue'))['onErrorCaptured']
|
||||||
const onMounted: typeof import('vue')['onMounted']
|
const onMounted: (typeof import('vue'))['onMounted']
|
||||||
const onRenderTracked: typeof import('vue')['onRenderTracked']
|
const onRenderTracked: (typeof import('vue'))['onRenderTracked']
|
||||||
const onRenderTriggered: typeof import('vue')['onRenderTriggered']
|
const onRenderTriggered: (typeof import('vue'))['onRenderTriggered']
|
||||||
const onScopeDispose: typeof import('vue')['onScopeDispose']
|
const onScopeDispose: (typeof import('vue'))['onScopeDispose']
|
||||||
const onServerPrefetch: typeof import('vue')['onServerPrefetch']
|
const onServerPrefetch: (typeof import('vue'))['onServerPrefetch']
|
||||||
const onUnmounted: typeof import('vue')['onUnmounted']
|
const onUnmounted: (typeof import('vue'))['onUnmounted']
|
||||||
const onUpdated: typeof import('vue')['onUpdated']
|
const onUpdated: (typeof import('vue'))['onUpdated']
|
||||||
const onWatcherCleanup: typeof import('vue')['onWatcherCleanup']
|
const onWatcherCleanup: (typeof import('vue'))['onWatcherCleanup']
|
||||||
const pageConfig: typeof import('../../../../../../src/utils/page/config')['pageConfig']
|
const pageConfig: (typeof import('src/utils/page/config'))['pageConfig']
|
||||||
const provide: typeof import('vue')['provide']
|
const provide: (typeof import('vue'))['provide']
|
||||||
const reactive: typeof import('vue')['reactive']
|
const reactive: (typeof import('vue'))['reactive']
|
||||||
const readonly: typeof import('vue')['readonly']
|
const readonly: (typeof import('vue'))['readonly']
|
||||||
const ref: typeof import('vue')['ref']
|
const ref: (typeof import('vue'))['ref']
|
||||||
const resolveComponent: typeof import('vue')['resolveComponent']
|
const resolveComponent: (typeof import('vue'))['resolveComponent']
|
||||||
const shallowReactive: typeof import('vue')['shallowReactive']
|
const shallowReactive: (typeof import('vue'))['shallowReactive']
|
||||||
const shallowReadonly: typeof import('vue')['shallowReadonly']
|
const shallowReadonly: (typeof import('vue'))['shallowReadonly']
|
||||||
const shallowRef: typeof import('vue')['shallowRef']
|
const shallowRef: (typeof import('vue'))['shallowRef']
|
||||||
const toRaw: typeof import('vue')['toRaw']
|
const toRaw: (typeof import('vue'))['toRaw']
|
||||||
const toRef: typeof import('vue')['toRef']
|
const toRef: (typeof import('vue'))['toRef']
|
||||||
const toRefs: typeof import('vue')['toRefs']
|
const toRefs: (typeof import('vue'))['toRefs']
|
||||||
const toValue: typeof import('vue')['toValue']
|
const toValue: (typeof import('vue'))['toValue']
|
||||||
const triggerRef: typeof import('vue')['triggerRef']
|
const triggerRef: (typeof import('vue'))['triggerRef']
|
||||||
const unref: typeof import('vue')['unref']
|
const unref: (typeof import('vue'))['unref']
|
||||||
const useAttrs: typeof import('vue')['useAttrs']
|
const useAttrs: (typeof import('vue'))['useAttrs']
|
||||||
const useCssModule: typeof import('vue')['useCssModule']
|
const useCssModule: (typeof import('vue'))['useCssModule']
|
||||||
const useCssVars: typeof import('vue')['useCssVars']
|
const useCssVars: (typeof import('vue'))['useCssVars']
|
||||||
const useId: typeof import('vue')['useId']
|
const useId: (typeof import('vue'))['useId']
|
||||||
const useLink: typeof import('vue-router')['useLink']
|
const useLink: (typeof import('vue-router'))['useLink']
|
||||||
const useModel: typeof import('vue')['useModel']
|
const useModel: (typeof import('vue'))['useModel']
|
||||||
const useRoute: typeof import('vue-router')['useRoute']
|
const useRoute: (typeof import('vue-router'))['useRoute']
|
||||||
const useRouter: typeof import('vue-router')['useRouter']
|
const useRouter: (typeof import('vue-router'))['useRouter']
|
||||||
const useSlots: typeof import('vue')['useSlots']
|
const useSlots: (typeof import('vue'))['useSlots']
|
||||||
const useTemplateRef: typeof import('vue')['useTemplateRef']
|
const useTemplateRef: (typeof import('vue'))['useTemplateRef']
|
||||||
const watch: typeof import('vue')['watch']
|
const watch: (typeof import('vue'))['watch']
|
||||||
const watchEffect: typeof import('vue')['watchEffect']
|
const watchEffect: (typeof import('vue'))['watchEffect']
|
||||||
const watchPostEffect: typeof import('vue')['watchPostEffect']
|
const watchPostEffect: (typeof import('vue'))['watchPostEffect']
|
||||||
const watchSyncEffect: typeof import('vue')['watchSyncEffect']
|
const watchSyncEffect: (typeof import('vue'))['watchSyncEffect']
|
||||||
}
|
}
|
||||||
// for type re-export
|
// for type re-export
|
||||||
declare global {
|
declare global {
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
export type { Component, Slot, Slots, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, ShallowRef, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue'
|
export type {
|
||||||
|
Component,
|
||||||
|
Slot,
|
||||||
|
Slots,
|
||||||
|
ComponentPublicInstance,
|
||||||
|
ComputedRef,
|
||||||
|
DirectiveBinding,
|
||||||
|
ExtractDefaultPropTypes,
|
||||||
|
ExtractPropTypes,
|
||||||
|
ExtractPublicPropTypes,
|
||||||
|
InjectionKey,
|
||||||
|
PropType,
|
||||||
|
Ref,
|
||||||
|
ShallowRef,
|
||||||
|
MaybeRef,
|
||||||
|
MaybeRefOrGetter,
|
||||||
|
VNode,
|
||||||
|
WritableComputedRef
|
||||||
|
} from 'vue'
|
||||||
import('vue')
|
import('vue')
|
||||||
}
|
}
|
||||||
|
|||||||
@ -35,6 +35,14 @@
|
|||||||
<span class="text-xs text-[#666]">售价:</span
|
<span class="text-xs text-[#666]">售价:</span
|
||||||
><el-input v-model="item.promotionPrice" size="small" class="w-20 mr-2"></el-input>
|
><el-input v-model="item.promotionPrice" size="small" class="w-20 mr-2"></el-input>
|
||||||
</p>
|
</p>
|
||||||
|
<p>
|
||||||
|
<span class="text-xs text-[#666]">默认:</span>
|
||||||
|
<el-switch
|
||||||
|
v-model="item.isDefault"
|
||||||
|
size="small"
|
||||||
|
@change="handleIsDefaultChange(item, list)"
|
||||||
|
/>
|
||||||
|
</p>
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</div>
|
</div>
|
||||||
@ -71,6 +79,14 @@ const handleFileChange = async (file: any, fileList: any[], item: any) => {
|
|||||||
const handleExceed = () => {
|
const handleExceed = () => {
|
||||||
ElMessage.warning('只能选择一张图片')
|
ElMessage.warning('只能选择一张图片')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const handleIsDefaultChange = (item: any, list: any[]) => {
|
||||||
|
const isDefault = item.isDefault
|
||||||
|
list.forEach((child) => {
|
||||||
|
child.isDefault = false
|
||||||
|
})
|
||||||
|
item.isDefault = isDefault
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
|
|||||||
@ -24,6 +24,7 @@ export const handleGetDialogData = (
|
|||||||
result.title = data.title
|
result.title = data.title
|
||||||
result.feature1 = data.feature1
|
result.feature1 = data.feature1
|
||||||
result.feature2 = data.feature2
|
result.feature2 = data.feature2
|
||||||
|
result.htmlContent = data.vvProductDetailList.find((item: any) => item.type === 2)?.detail || ''
|
||||||
const files = [
|
const files = [
|
||||||
{
|
{
|
||||||
fileName: '主图',
|
fileName: '主图',
|
||||||
|
|||||||
@ -209,7 +209,7 @@
|
|||||||
</el-card>
|
</el-card>
|
||||||
<el-card>
|
<el-card>
|
||||||
<h4 class="font-bold mb-2">内容编辑:</h4>
|
<h4 class="font-bold mb-2">内容编辑:</h4>
|
||||||
<wan-editor v-model="htmlContent"></wan-editor>
|
<wan-editor v-model="$dialog.data.htmlContent"></wan-editor>
|
||||||
</el-card>
|
</el-card>
|
||||||
<el-button class="mt-2 !text-white" type="primary" @click="onSubmit()">提交</el-button>
|
<el-button class="mt-2 !text-white" type="primary" @click="onSubmit()">提交</el-button>
|
||||||
<FileExplorerDialog
|
<FileExplorerDialog
|
||||||
@ -270,7 +270,13 @@ const init = async () => {
|
|||||||
const data = initConfig().value!
|
const data = initConfig().value!
|
||||||
$dialog.value = data.$dialog
|
$dialog.value = data.$dialog
|
||||||
$dialog.value.config = data.dialog1
|
$dialog.value.config = data.dialog1
|
||||||
$dialog.value.data = { appCategoryId: '', adminCategoryId: '', isTest: 0, title: '' }
|
$dialog.value.data = {
|
||||||
|
htmlContent: '',
|
||||||
|
appCategoryId: '',
|
||||||
|
adminCategoryId: '',
|
||||||
|
isTest: 0,
|
||||||
|
title: ''
|
||||||
|
}
|
||||||
adminCategoryData.value = []
|
adminCategoryData.value = []
|
||||||
skuList.value = []
|
skuList.value = []
|
||||||
if (route.query.id) {
|
if (route.query.id) {
|
||||||
@ -318,8 +324,6 @@ const handleAfterChangeCategory = (data: any) => {
|
|||||||
skuList.value = generateSkuList(adminCategoryData.value)
|
skuList.value = generateSkuList(adminCategoryData.value)
|
||||||
}
|
}
|
||||||
|
|
||||||
const htmlContent = ref('自定义')
|
|
||||||
|
|
||||||
const onDeletePropertyValue = (index: number, id: number) =>
|
const onDeletePropertyValue = (index: number, id: number) =>
|
||||||
onClosePropertyValue(index, id, skuList)
|
onClosePropertyValue(index, id, skuList)
|
||||||
|
|
||||||
@ -337,17 +341,14 @@ const onSubmit = () => {
|
|||||||
$dialog.value.data,
|
$dialog.value.data,
|
||||||
fileList.value,
|
fileList.value,
|
||||||
adminCategoryData.value,
|
adminCategoryData.value,
|
||||||
htmlContent.value,
|
|
||||||
skuList.value
|
skuList.value
|
||||||
)
|
)
|
||||||
// if (msg) return ElMessage.error(msg)
|
// if (msg) return ElMessage.error(msg)
|
||||||
console.warn('----- my data is htmlContent: ', htmlContent.value)
|
|
||||||
const params = handleGetSubmitParams(
|
const params = handleGetSubmitParams(
|
||||||
route.query.type === 'add',
|
route.query.type === 'add',
|
||||||
$dialog.value.data,
|
$dialog.value.data,
|
||||||
fileList.value,
|
fileList.value,
|
||||||
adminCategoryData.value,
|
adminCategoryData.value,
|
||||||
htmlContent.value,
|
|
||||||
skuList.value,
|
skuList.value,
|
||||||
defaultCheckedNodes
|
defaultCheckedNodes
|
||||||
)
|
)
|
||||||
|
|||||||
@ -11,6 +11,9 @@ export const onEditPropertyTypeBtn = (index: number) => {
|
|||||||
export const handleEditPropertyTypeConfirm = async (item: any, skuList: any) => {
|
export const handleEditPropertyTypeConfirm = async (item: any, skuList: any) => {
|
||||||
const oldCategoryPropertyName = item.categoryPropertyName
|
const oldCategoryPropertyName = item.categoryPropertyName
|
||||||
item.categoryPropertyName = editPropertyTypeValue.value
|
item.categoryPropertyName = editPropertyTypeValue.value
|
||||||
|
item.vvPropertyValueList.forEach((item: any) => {
|
||||||
|
item.categoryPropertyName = editPropertyTypeValue.value
|
||||||
|
})
|
||||||
handleEditSkuListPropertyName(oldCategoryPropertyName, item.categoryPropertyName, skuList)
|
handleEditSkuListPropertyName(oldCategoryPropertyName, item.categoryPropertyName, skuList)
|
||||||
editPropertyTypeIndex.value = NaN
|
editPropertyTypeIndex.value = NaN
|
||||||
}
|
}
|
||||||
|
|||||||
@ -37,7 +37,6 @@ export const handleValidFormData = (
|
|||||||
$dialogData: any,
|
$dialogData: any,
|
||||||
fileList: PreviewItem[],
|
fileList: PreviewItem[],
|
||||||
adminCategoryData: CategoryDataMock,
|
adminCategoryData: CategoryDataMock,
|
||||||
htmlContent: string,
|
|
||||||
skuList: TSkuList[]
|
skuList: TSkuList[]
|
||||||
) => {
|
) => {
|
||||||
console.warn(
|
console.warn(
|
||||||
@ -58,6 +57,9 @@ export const handleValidFormData = (
|
|||||||
if (fileList.length === 0) {
|
if (fileList.length === 0) {
|
||||||
return '请上传主图'
|
return '请上传主图'
|
||||||
}
|
}
|
||||||
|
if (!$dialogData.htmlContent) {
|
||||||
|
return '请填写商品详情'
|
||||||
|
}
|
||||||
if (fileList.some((item) => item.fileType === 'mainImageUrl' && !item.resourceUrl)) {
|
if (fileList.some((item) => item.fileType === 'mainImageUrl' && !item.resourceUrl)) {
|
||||||
return '请上传主图'
|
return '请上传主图'
|
||||||
}
|
}
|
||||||
@ -93,9 +95,6 @@ export const handleValidFormData = (
|
|||||||
return msg
|
return msg
|
||||||
})
|
})
|
||||||
if (msg) return msg
|
if (msg) return msg
|
||||||
if (!htmlContent) {
|
|
||||||
return '请填写商品详情'
|
|
||||||
}
|
|
||||||
return ''
|
return ''
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -104,7 +103,6 @@ export const handleGetSubmitParams = (
|
|||||||
$dialogData: any,
|
$dialogData: any,
|
||||||
fileList: PreviewItem[],
|
fileList: PreviewItem[],
|
||||||
adminCategoryData: CategoryDataMock,
|
adminCategoryData: CategoryDataMock,
|
||||||
htmlContent: string,
|
|
||||||
skuList: TSkuList[],
|
skuList: TSkuList[],
|
||||||
defaultCheckedNodes: Ref<{ admin: number[]; app: number[] }>
|
defaultCheckedNodes: Ref<{ admin: number[]; app: number[] }>
|
||||||
) => {
|
) => {
|
||||||
@ -131,6 +129,13 @@ export const handleGetSubmitParams = (
|
|||||||
})
|
})
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
const vvProductDetailList = fileList
|
||||||
|
.filter((item) => item.fileType === 'subImageUrl')
|
||||||
|
.map((item) => ({
|
||||||
|
detail: item.resourceUrl,
|
||||||
|
type: 1
|
||||||
|
}))
|
||||||
|
vvProductDetailList.push({ detail: $dialogData.htmlContent, type: 2 })
|
||||||
return {
|
return {
|
||||||
...$dialogData,
|
...$dialogData,
|
||||||
mainImageUrl: fileList.find((item) => item.fileType === 'mainImageUrl')?.resourceUrl,
|
mainImageUrl: fileList.find((item) => item.fileType === 'mainImageUrl')?.resourceUrl,
|
||||||
@ -141,12 +146,7 @@ export const handleGetSubmitParams = (
|
|||||||
acc[`adminCategoryId${i + 1}`] = cur
|
acc[`adminCategoryId${i + 1}`] = cur
|
||||||
return acc
|
return acc
|
||||||
}, {}),
|
}, {}),
|
||||||
vvProductDetailList: fileList
|
vvProductDetailList,
|
||||||
.filter((item) => item.fileType === 'subImageUrl')
|
|
||||||
.map((item) => ({
|
|
||||||
detail: item.resourceUrl,
|
|
||||||
type: 1
|
|
||||||
})),
|
|
||||||
vvProductPropertyList,
|
vvProductPropertyList,
|
||||||
vvSkuList: skuList.map((item) => {
|
vvSkuList: skuList.map((item) => {
|
||||||
const result = {}
|
const result = {}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user