|
|
@@ -1,6 +1,6 @@
|
|
|
<!--
|
|
|
分类金刚区导航项编辑页
|
|
|
- 新增/编辑单个导航:名称、图标(默认图库 PNG 或上传)、关联分类/场景;保存回写列表页草稿后返回。
|
|
|
+ 新增/编辑单个导航:名称、图标(默认图库 PNG 或上传)、关联花束分类/场景/花材分类;保存回写列表页草稿后返回。
|
|
|
-->
|
|
|
<template>
|
|
|
<view class="page-container">
|
|
|
@@ -75,8 +75,8 @@
|
|
|
</view>
|
|
|
</view>
|
|
|
|
|
|
- <!-- 分类多选 -->
|
|
|
- <view v-if="form.type === 3" class="field-row">
|
|
|
+ <!-- 花束分类多选 -->
|
|
|
+ <view v-if="form.type === TYPE_CATEGORY" class="field-row">
|
|
|
<text class="field-label"><text class="required">*</text>关联内容</text>
|
|
|
<view
|
|
|
class="inline-select"
|
|
|
@@ -105,7 +105,7 @@
|
|
|
</view>
|
|
|
|
|
|
<!-- 场景多选 -->
|
|
|
- <view v-if="form.type === 4" class="field-row">
|
|
|
+ <view v-if="form.type === TYPE_USE_CASE" class="field-row">
|
|
|
<text class="field-label"><text class="required">*</text>关联内容</text>
|
|
|
<view
|
|
|
class="inline-select"
|
|
|
@@ -132,6 +132,35 @@
|
|
|
<view v-if="!useCaseData.length" class="panel-empty">暂无场景</view>
|
|
|
</view>
|
|
|
</view>
|
|
|
+
|
|
|
+ <!-- 花材分类单选:商城首页点击后定位到该分类下花材 -->
|
|
|
+ <view v-if="form.type === TYPE_ITEM_CLASS" class="field-row">
|
|
|
+ <text class="field-label"><text class="required">*</text>关联内容</text>
|
|
|
+ <view
|
|
|
+ class="inline-select"
|
|
|
+ :class="{ open: itemClassPanelShow }"
|
|
|
+ @click="toggleItemClassPanel"
|
|
|
+ >
|
|
|
+ <text class="inline-select-text" :class="{ placeholder: !itemClassSelectedName }">
|
|
|
+ {{ itemClassSelectedName || '请选择花材分类 (单选)' }}
|
|
|
+ </text>
|
|
|
+ <text class="inline-arrow">{{ itemClassPanelShow ? '▲' : '▼' }}</text>
|
|
|
+ </view>
|
|
|
+ <view v-if="itemClassPanelShow" class="checkbox-panel">
|
|
|
+ <view
|
|
|
+ v-for="cls in itemClassData"
|
|
|
+ :key="cls.id"
|
|
|
+ class="checkbox-item"
|
|
|
+ @click="selectItemClassId(cls.id)"
|
|
|
+ >
|
|
|
+ <view class="radio-box" :class="{ checked: isItemClassChecked(cls.id) }">
|
|
|
+ <text v-if="isItemClassChecked(cls.id)" class="check-mark">✓</text>
|
|
|
+ </view>
|
|
|
+ <text class="checkbox-name">{{ cls.name }}</text>
|
|
|
+ </view>
|
|
|
+ <view v-if="!itemClassData.length" class="panel-empty">暂无花材分类</view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
</view>
|
|
|
|
|
|
<view class="bottom-space"></view>
|
|
|
@@ -144,14 +173,19 @@
|
|
|
|
|
|
<script>
|
|
|
/**
|
|
|
- * 金刚区单项编辑:名称/图标/关联;默认图标库由后端接口返回
|
|
|
+ * 金刚区单项编辑:名称/图标/关联(花束分类多选、场景多选、花材分类单选);默认图标库由后端接口返回
|
|
|
*/
|
|
|
import { APIHOST } from '@/config'
|
|
|
import { getClass } from '@/api/category'
|
|
|
import { useCaseList } from '@/api/goods'
|
|
|
import { getNavGridPresetIcons } from '@/api/home-page-config'
|
|
|
+import { getAllItemClass } from '@/api/item-class'
|
|
|
|
|
|
const DRAFT_KEY = 'navGridDraft'
|
|
|
+/** 关联类型:与后端 HomePageModuleClass 常量一致 */
|
|
|
+const TYPE_CATEGORY = 3
|
|
|
+const TYPE_USE_CASE = 4
|
|
|
+const TYPE_ITEM_CLASS = 5
|
|
|
|
|
|
const EMPTY_FORM = () => ({
|
|
|
id: '',
|
|
|
@@ -159,7 +193,7 @@ const EMPTY_FORM = () => ({
|
|
|
icon: '',
|
|
|
iconType: 1,
|
|
|
enabled: 1,
|
|
|
- type: 3,
|
|
|
+ type: TYPE_CATEGORY,
|
|
|
value: ''
|
|
|
})
|
|
|
|
|
|
@@ -167,25 +201,31 @@ export default {
|
|
|
name: 'homePageNavGridEdit',
|
|
|
data() {
|
|
|
return {
|
|
|
+ TYPE_CATEGORY,
|
|
|
+ TYPE_USE_CASE,
|
|
|
+ TYPE_ITEM_CLASS,
|
|
|
editId: '',
|
|
|
form: EMPTY_FORM(),
|
|
|
iconTab: 'preset',
|
|
|
/** 默认图标库,init 时从 /home-page-config/get-nav-grid-preset-icons 拉取 */
|
|
|
presetIcons: [],
|
|
|
typeOptions: [
|
|
|
- { label: '分类', value: 3 },
|
|
|
- { label: '场景', value: 4 }
|
|
|
+ { label: '花束分类', value: TYPE_CATEGORY },
|
|
|
+ { label: '场景', value: TYPE_USE_CASE },
|
|
|
+ { label: '花材分类', value: TYPE_ITEM_CLASS }
|
|
|
],
|
|
|
categoryData: [],
|
|
|
useCaseData: [],
|
|
|
+ itemClassData: [],
|
|
|
categoryPanelShow: false,
|
|
|
useCasePanelShow: false,
|
|
|
+ itemClassPanelShow: false,
|
|
|
uploading: false
|
|
|
}
|
|
|
},
|
|
|
computed: {
|
|
|
categorySelectedNames() {
|
|
|
- if (this.form.type !== 3) return ''
|
|
|
+ if (this.form.type !== TYPE_CATEGORY) return ''
|
|
|
const ids = this.parseIds(this.form.value)
|
|
|
if (!ids.length) return ''
|
|
|
return ids
|
|
|
@@ -196,7 +236,7 @@ export default {
|
|
|
.join('、')
|
|
|
},
|
|
|
useCaseSelectedNames() {
|
|
|
- if (this.form.type !== 4) return ''
|
|
|
+ if (this.form.type !== TYPE_USE_CASE) return ''
|
|
|
const ids = this.parseIds(this.form.value)
|
|
|
if (!ids.length) return ''
|
|
|
return ids
|
|
|
@@ -205,17 +245,28 @@ export default {
|
|
|
return uc ? uc.useCaseName : id
|
|
|
})
|
|
|
.join('、')
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ * 花材分类单选展示名;接口返回字段为 name
|
|
|
+ */
|
|
|
+ itemClassSelectedName() {
|
|
|
+ if (this.form.type !== TYPE_ITEM_CLASS) return ''
|
|
|
+ const id = String(this.form.value || '')
|
|
|
+ if (!id) return ''
|
|
|
+ const cls = this.itemClassData.find((c) => String(c.id) === id)
|
|
|
+ return cls ? cls.name : id
|
|
|
}
|
|
|
},
|
|
|
methods: {
|
|
|
/**
|
|
|
- * 初始化:加载分类/场景/默认图标库,并从草稿恢复当前编辑项或新建空表单。
|
|
|
+ * 初始化:加载花束分类/场景/花材分类/默认图标库,并从草稿恢复当前编辑项或新建空表单。
|
|
|
*/
|
|
|
init() {
|
|
|
this.editId = (this.option && this.option.id) ? String(this.option.id) : ''
|
|
|
this.loadPresetIcons()
|
|
|
this.loadCategory()
|
|
|
this.loadUseCase()
|
|
|
+ this.loadItemClass()
|
|
|
this.loadFromDraft()
|
|
|
uni.setNavigationBarTitle({
|
|
|
title: this.editId ? '编辑导航项' : '新增导航项'
|
|
|
@@ -257,6 +308,9 @@ export default {
|
|
|
this.form = { ...EMPTY_FORM(), id: this.editId || '' }
|
|
|
}
|
|
|
},
|
|
|
+ /**
|
|
|
+ * 规范化编辑项;type 仅接受 3 分类 / 4 场景 / 5 花材分类,其余回退分类
|
|
|
+ */
|
|
|
normalizeForm(item) {
|
|
|
return {
|
|
|
id: String(item.id || ''),
|
|
|
@@ -264,10 +318,20 @@ export default {
|
|
|
icon: item.icon || '',
|
|
|
iconType: parseInt(item.iconType, 10) === 2 ? 2 : 1,
|
|
|
enabled: item.enabled == 1 ? 1 : 0,
|
|
|
- type: parseInt(item.type, 10) === 4 ? 4 : 3,
|
|
|
+ type: this.normalizeNavType(item.type),
|
|
|
value: item.value ? String(item.value) : ''
|
|
|
}
|
|
|
},
|
|
|
+ /**
|
|
|
+ * 把草稿/接口里的关联类型收敛到合法取值,避免旧数据把花材分类误当成花束分类
|
|
|
+ */
|
|
|
+ normalizeNavType(type) {
|
|
|
+ const t = parseInt(type, 10)
|
|
|
+ if (t === TYPE_USE_CASE || t === TYPE_ITEM_CLASS) {
|
|
|
+ return t
|
|
|
+ }
|
|
|
+ return TYPE_CATEGORY
|
|
|
+ },
|
|
|
loadCategory() {
|
|
|
getClass().then((res) => {
|
|
|
if (res.code == 1) {
|
|
|
@@ -282,6 +346,27 @@ export default {
|
|
|
}
|
|
|
})
|
|
|
},
|
|
|
+ /**
|
|
|
+ * 拉取全部花材分类(item-class/all),供关联类型=花材分类时单选
|
|
|
+ */
|
|
|
+ loadItemClass() {
|
|
|
+ getAllItemClass().then((res) => {
|
|
|
+ if (res.code != 1) {
|
|
|
+ this.itemClassData = []
|
|
|
+ return
|
|
|
+ }
|
|
|
+ const data = res.data
|
|
|
+ if (Array.isArray(data)) {
|
|
|
+ this.itemClassData = data
|
|
|
+ } else if (data && Array.isArray(data.list)) {
|
|
|
+ this.itemClassData = data.list
|
|
|
+ } else {
|
|
|
+ this.itemClassData = []
|
|
|
+ }
|
|
|
+ }).catch(() => {
|
|
|
+ this.itemClassData = []
|
|
|
+ })
|
|
|
+ },
|
|
|
parseIds(value) {
|
|
|
if (!value) return []
|
|
|
return String(value).split(',').filter(Boolean)
|
|
|
@@ -300,16 +385,27 @@ export default {
|
|
|
if (this.form.type === type) return
|
|
|
this.form.type = type
|
|
|
this.form.value = ''
|
|
|
- this.categoryPanelShow = type === 3
|
|
|
- this.useCasePanelShow = type === 4
|
|
|
+ this.categoryPanelShow = type === TYPE_CATEGORY
|
|
|
+ this.useCasePanelShow = type === TYPE_USE_CASE
|
|
|
+ this.itemClassPanelShow = type === TYPE_ITEM_CLASS
|
|
|
},
|
|
|
toggleCategoryPanel() {
|
|
|
this.categoryPanelShow = !this.categoryPanelShow
|
|
|
this.useCasePanelShow = false
|
|
|
+ this.itemClassPanelShow = false
|
|
|
},
|
|
|
toggleUseCasePanel() {
|
|
|
this.useCasePanelShow = !this.useCasePanelShow
|
|
|
this.categoryPanelShow = false
|
|
|
+ this.itemClassPanelShow = false
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ * 展开/收起花材分类单选面板
|
|
|
+ */
|
|
|
+ toggleItemClassPanel() {
|
|
|
+ this.itemClassPanelShow = !this.itemClassPanelShow
|
|
|
+ this.categoryPanelShow = false
|
|
|
+ this.useCasePanelShow = false
|
|
|
},
|
|
|
isCategoryChecked(id) {
|
|
|
return this.parseIds(this.form.value).indexOf(String(id)) > -1
|
|
|
@@ -317,6 +413,9 @@ export default {
|
|
|
isUseCaseChecked(id) {
|
|
|
return this.parseIds(this.form.value).indexOf(String(id)) > -1
|
|
|
},
|
|
|
+ isItemClassChecked(id) {
|
|
|
+ return String(this.form.value || '') === String(id)
|
|
|
+ },
|
|
|
toggleCategoryId(id) {
|
|
|
const key = String(id)
|
|
|
let ids = this.parseIds(this.form.value)
|
|
|
@@ -339,6 +438,13 @@ export default {
|
|
|
}
|
|
|
this.form.value = ids.join(',')
|
|
|
},
|
|
|
+ /**
|
|
|
+ * 花材分类单选:点已选项可取消,保存时仍会校验必填
|
|
|
+ */
|
|
|
+ selectItemClassId(id) {
|
|
|
+ const key = String(id)
|
|
|
+ this.form.value = this.form.value === key ? '' : key
|
|
|
+ },
|
|
|
chooseImage() {
|
|
|
if (this.uploading) return
|
|
|
uni.chooseImage({
|
|
|
@@ -519,6 +625,7 @@ export default {
|
|
|
background: #fff;
|
|
|
margin-right: 12upx;
|
|
|
border-radius: 8upx;
|
|
|
+ white-space: nowrap;
|
|
|
|
|
|
&:last-child {
|
|
|
margin-right: 0;
|
|
|
@@ -531,6 +638,10 @@ export default {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+.type-tab {
|
|
|
+ font-size: 24upx;
|
|
|
+}
|
|
|
+
|
|
|
.preset-grid {
|
|
|
@include disFlex(flex-start, flex-start);
|
|
|
flex-wrap: wrap;
|
|
|
@@ -688,6 +799,22 @@ export default {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/* 花材分类单选:圆形,与花束分类多选方框区分 */
|
|
|
+.radio-box {
|
|
|
+ width: 34upx;
|
|
|
+ height: 34upx;
|
|
|
+ border: 2upx solid #ccc;
|
|
|
+ border-radius: 50%;
|
|
|
+ margin-right: 12upx;
|
|
|
+ @include disFlex(center, center);
|
|
|
+ flex-shrink: 0;
|
|
|
+
|
|
|
+ &.checked {
|
|
|
+ background: #09C567;
|
|
|
+ border-color: #09C567;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
.check-mark {
|
|
|
color: #fff;
|
|
|
font-size: 22upx;
|