|
|
@@ -10,9 +10,11 @@
|
|
|
:expanded-keys="expandedKeys" :expand-action="false" :autoExpandParent="true" @select="onClassSelect"
|
|
|
@expand="onTreeExpand" class="custom-tree">
|
|
|
<template #title="node">
|
|
|
- <div class="tree-node-content">
|
|
|
- <span class="node-title" :class="{ 'disabled-class': node.isenable === 0 }">{{ node.classname }}{{
|
|
|
- node.remark ? '-' + node.remark : '' }}</span>
|
|
|
+ <div class="tree-node-content" :style="{ width: 240 - node.level * 21 + 'px' }">
|
|
|
+ <!-- 每少一级别,宽度减少21px -->
|
|
|
+ <span class="node-title" :class="{ 'disabled-class': node.isenable === 0 }">{{
|
|
|
+ node.classname }}{{
|
|
|
+ node.remark ? '-' + node.remark : '' }}</span>
|
|
|
<div class="node-operations">
|
|
|
<!-- 新建按钮:子分类新建数据,父分类新建下级 -->
|
|
|
<a-button type="link" size="small" @click="(e) => handleCreate(node, e)"
|
|
|
@@ -51,13 +53,18 @@
|
|
|
|
|
|
<!-- 右侧内容 -->
|
|
|
<div class="list-content">
|
|
|
- <listTemp ref="list" @handleData="handleData" keyRouteName="name" :param="param" tableName="productListTable" :searchType="searchType" :detailPage="{name:'productDetail',idname:'sa_fadid'}">
|
|
|
+ <listTemp ref="list" @handleData="handleData" keyRouteName="name" :param="param" tableName="productListTable"
|
|
|
+ :searchType="searchType" :detailPage="{ name: 'productDetail', idname: 'sa_fadid' }">
|
|
|
<template #operation>
|
|
|
- <Add ref="addRef" :selectedClass="selectedClassNode" @back="delRow" v-if="utils.hasPermission('insert')"></Add>
|
|
|
+ <Add ref="addRef" :selectedClass="selectedClassNode" @back="delRow" v-if="utils.hasPermission('insert')">
|
|
|
+ </Add>
|
|
|
</template>
|
|
|
- <template #tb_cell="{data}">
|
|
|
+ <template #tb_cell="{ data }">
|
|
|
<template v-if="data.column.dataIndex === 'attinfos'">
|
|
|
- <a-image v-if="data.record.attinfos && data.record.attinfos.filter(item => item.usetype == 'sa_fad').length" :src=" data.record.attinfos.filter(item => item.usetype == 'sa_fad')[0].fileType=='video' ? data.record.attinfos.filter(item => item.usetype == 'sa_fad')[0].subfiles[0].url:data.record.attinfos.filter(item => item.usetype == 'sa_fad')[0].cover" :preview="{src:data.record.attinfos.filter(item => item.usetype == 'sa_fad')[0].fileType=='video' ? data.record.attinfos.filter(item => item.usetype == 'sa_fad')[0].subfiles[0].url:data.record.attinfos.filter(item => item.usetype == 'sa_fad')[0].url}" style="width:100px;height: 100px;"></a-image>
|
|
|
+ <a-image v-if="data.record.attinfos && data.record.attinfos.filter(item => item.usetype == 'sa_fad').length"
|
|
|
+ :src="data.record.attinfos.filter(item => item.usetype == 'sa_fad')[0].fileType == 'video' ? data.record.attinfos.filter(item => item.usetype == 'sa_fad')[0].subfiles[0].url : data.record.attinfos.filter(item => item.usetype == 'sa_fad')[0].cover"
|
|
|
+ :preview="{ src: data.record.attinfos.filter(item => item.usetype == 'sa_fad')[0].fileType == 'video' ? data.record.attinfos.filter(item => item.usetype == 'sa_fad')[0].subfiles[0].url : data.record.attinfos.filter(item => item.usetype == 'sa_fad')[0].url }"
|
|
|
+ style="width:100px;height: 100px;"></a-image>
|
|
|
</template>
|
|
|
<template v-if="data.column.dataIndex === 'qrcode'">
|
|
|
<a-popover placement="left">
|
|
|
@@ -71,20 +78,23 @@
|
|
|
</a-popover>
|
|
|
</template>
|
|
|
<template v-if="data.column.dataIndex === 'isonsale'">
|
|
|
- <span :style="{color:utils.statusAndColor(data.record.isonsale?'上架':'下架')}">{{ data.record.isonsale?'上架':'下架' }}</span>
|
|
|
+ <span :style="{ color: utils.statusAndColor(data.record.isonsale ? '上架' : '下架') }">{{
|
|
|
+ data.record.isonsale ? '上架' : '下架' }}</span>
|
|
|
</template>
|
|
|
</template>
|
|
|
</listTemp>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <setClass ref="setClassRef" v-model:visible="showSetClass" @back="getClassList()"></setClass>
|
|
|
- <AddClass ref="addClassRef" :data="createData" @onSuccess="handleCreateSuccess" @back="handleCreateBack" />
|
|
|
- <EditClass ref="editClassRef" :data="editData" @onSuccess="handleEditSuccess" @back="handleEditBack" />
|
|
|
+ <setClass ref="setClassRef" v-model:visible="showSetClass" @back="getClassList()" :hideButton="true"></setClass>
|
|
|
+ <AddClass ref="addClassRef" :data="createData" @onSuccess="handleCreateSuccess" @back="handleCreateBack"
|
|
|
+ :hideButton="true" />
|
|
|
+ <EditClass ref="editClassRef" :data="editData" @onSuccess="handleEditSuccess" @back="handleEditBack"
|
|
|
+ :hideButton="true" />
|
|
|
</template>
|
|
|
<script setup>
|
|
|
import listTemp from '@/components/listTemplate/index.vue';
|
|
|
import setClass from './modules/setClass/index.vue'
|
|
|
-import { ref,onMounted, nextTick, provide, reactive } from 'vue'
|
|
|
+import { ref, onMounted, nextTick, provide, reactive } from 'vue'
|
|
|
import { useRouter } from "vue-router";
|
|
|
import Api from '@/api/api'
|
|
|
import utils from '@/utils/utils'
|
|
|
@@ -244,7 +254,7 @@ const handleEditBack = () => {
|
|
|
console.log('编辑分类对话框关闭')
|
|
|
}
|
|
|
|
|
|
-provide('listqueryidFun',() => list.value.listqueryid)
|
|
|
+provide('listqueryidFun', () => list.value.listqueryid)
|
|
|
|
|
|
// 树形字段映射
|
|
|
const treeFieldNames = {
|
|
|
@@ -259,7 +269,6 @@ const selectedClassNode = ref(null) // 当前选中的分类节点数据
|
|
|
const expandedKeys = ref([]) // 展开的节点keys
|
|
|
const isLoading = ref(false) // 请求加载状态标志
|
|
|
const debounceTimer = ref(null) // 防抖定时器
|
|
|
-const showSetClass = ref(false)
|
|
|
const setClassRef = ref()
|
|
|
|
|
|
// 分类操作对话框
|
|
|
@@ -270,7 +279,7 @@ const editData = ref(null)
|
|
|
|
|
|
// 打开设置分类弹窗
|
|
|
const openSetClass = () => {
|
|
|
- showSetClass.value = true
|
|
|
+ setClassRef.value.openDrawer()
|
|
|
}
|
|
|
|
|
|
// 选择分类节点
|
|
|
@@ -345,12 +354,12 @@ const getAllChildIds = (children, result) => {
|
|
|
}
|
|
|
|
|
|
let searchType = ref([
|
|
|
- {label:'状态',key:'isonsale',type:'select',dataSource:[{remarks:'全部',value:''},{remarks:'上架',value:'1'},{remarks:'下架',value:'0'}]},
|
|
|
- {label:'是否停产',key:'isstop',type:'select',dataSource:[{remarks:'全部',value:''},{remarks:'是',value:'1'},{remarks:'否',value:'0'}]},
|
|
|
- {label:'分类',key:'sa_fadclassids',multiple:true,type:'cascader',dataSource:[],optionParam:{label:'classname',value:'sa_fadclassid',children:'children'}},
|
|
|
- {label:'创建时间',key:'dateRange',type:'datepickerRange',objKeys:['begindate_create','enddate_create']},
|
|
|
- {label:'上架时间',key:'dateRange2',type:'datepickerRange',objKeys:['begindate_onsale','enddate_onsale']},
|
|
|
- {label:'搜索',key:'condition',type:'input'},
|
|
|
+ { label: '状态', key: 'isonsale', type: 'select', dataSource: [{ remarks: '全部', value: '' }, { remarks: '上架', value: '1' }, { remarks: '下架', value: '0' }] },
|
|
|
+ { label: '是否停产', key: 'isstop', type: 'select', dataSource: [{ remarks: '全部', value: '' }, { remarks: '是', value: '1' }, { remarks: '否', value: '0' }] },
|
|
|
+ { label: '分类', key: 'sa_fadclassids', multiple: true, type: 'cascader', dataSource: [], optionParam: { label: 'classname', value: 'sa_fadclassid', children: 'children' } },
|
|
|
+ { label: '创建时间', key: 'dateRange', type: 'datepickerRange', objKeys: ['begindate_create', 'enddate_create'] },
|
|
|
+ { label: '上架时间', key: 'dateRange2', type: 'datepickerRange', objKeys: ['begindate_onsale', 'enddate_onsale'] },
|
|
|
+ { label: '搜索', key: 'condition', type: 'input' },
|
|
|
])
|
|
|
let param = ref({
|
|
|
"id": "20240418141302",
|
|
|
@@ -368,10 +377,10 @@ let param = ref({
|
|
|
}
|
|
|
}
|
|
|
})
|
|
|
-const delRow = (id,init) => {
|
|
|
+const delRow = (id, init) => {
|
|
|
if (init) return list.value.tableData()
|
|
|
Api.requested({
|
|
|
- "id":20240418141102,
|
|
|
+ "id": 20240418141102,
|
|
|
"content": {
|
|
|
"sa_fadids": [id]
|
|
|
}
|
|
|
@@ -381,16 +390,16 @@ const delRow = (id,init) => {
|
|
|
const handleData = (data) => {
|
|
|
data.data.forEach(item => {
|
|
|
item.attinfos = item.attinfos.map(v => {
|
|
|
- v.cover = utils.getSpecifiedImage(v,'compressed')
|
|
|
+ v.cover = utils.getSpecifiedImage(v, 'compressed')
|
|
|
return v
|
|
|
})
|
|
|
})
|
|
|
- let initID = useAuthStore().nowAccount.userid+'99999'
|
|
|
+ let initID = useAuthStore().nowAccount.userid + '99999'
|
|
|
let deleteList = [];
|
|
|
data.data.forEach(v => (initID == v.sequence && v.name == '') ? deleteList.push(v.sa_fadid) : '')
|
|
|
if (deleteList.length != 0) {
|
|
|
Api.requested({
|
|
|
- "id":20240418141102,
|
|
|
+ "id": 20240418141102,
|
|
|
"content": {
|
|
|
"sa_fadids": deleteList
|
|
|
}
|
|
|
@@ -398,7 +407,7 @@ const handleData = (data) => {
|
|
|
if (res.msg == '成功') list.value.tableData()
|
|
|
})
|
|
|
}
|
|
|
- console.log(data,'数据');
|
|
|
+ console.log(data, '数据');
|
|
|
}
|
|
|
|
|
|
let classList = ref([])
|
|
|
@@ -406,10 +415,10 @@ const getClassList = async () => {
|
|
|
let res = await Api.requested({
|
|
|
"id": "20240418112002",
|
|
|
"content": {
|
|
|
- "parentid": 0,
|
|
|
- "where": {
|
|
|
- "isenable": "" // 获取所有分类,包括启用和未启用的
|
|
|
- }
|
|
|
+ "parentid": 0,
|
|
|
+ "where": {
|
|
|
+ "isenable": "" // 获取所有分类,包括启用和未启用的
|
|
|
+ }
|
|
|
}
|
|
|
})
|
|
|
classList.value = res.data
|
|
|
@@ -427,10 +436,10 @@ const getClassList = async () => {
|
|
|
expandedKeys.value = getAllKeys(res.data)
|
|
|
|
|
|
searchType.value[2].dataSource = classList.value
|
|
|
- console.log(classList.value,'分类');
|
|
|
+ console.log(classList.value, '分类');
|
|
|
}
|
|
|
|
|
|
-provide('classList',() => classList.value)
|
|
|
+provide('classList', () => classList.value)
|
|
|
|
|
|
// 树节点展开/收起事件处理
|
|
|
const onTreeExpand = (expandedKeysArray) => {
|
|
|
@@ -451,11 +460,11 @@ onMounted(() => {
|
|
|
}
|
|
|
|
|
|
.class-sidebar {
|
|
|
- width: 250px;
|
|
|
background: #fff;
|
|
|
padding: 10px;
|
|
|
border-radius: 4px;
|
|
|
flex-shrink: 0;
|
|
|
+ box-sizing: border-box;
|
|
|
}
|
|
|
|
|
|
.sidebar-header {
|
|
|
@@ -476,11 +485,6 @@ onMounted(() => {
|
|
|
color: #1890ff;
|
|
|
}
|
|
|
|
|
|
-.list-content {
|
|
|
- flex: 1;
|
|
|
- overflow: hidden;
|
|
|
-}
|
|
|
-
|
|
|
/* 树形组件选中样式 */
|
|
|
.custom-tree :deep(.ant-tree-node-selected) {
|
|
|
background-color: #e6f7ff !important;
|
|
|
@@ -494,8 +498,7 @@ onMounted(() => {
|
|
|
.tree-node-content {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
- justify-content: space-between;
|
|
|
- width: 100%;
|
|
|
+ justify-content: flex-end;
|
|
|
}
|
|
|
|
|
|
.node-title {
|
|
|
@@ -506,22 +509,12 @@ onMounted(() => {
|
|
|
white-space: nowrap;
|
|
|
}
|
|
|
|
|
|
+/* 操作按钮区域样式 */
|
|
|
.node-operations {
|
|
|
display: flex;
|
|
|
- gap: 4px;
|
|
|
-}
|
|
|
-
|
|
|
-/* 操作按钮样式 */
|
|
|
-.custom-tree :deep(.ant-tree-title) {
|
|
|
- display: block;
|
|
|
- width: 100%;
|
|
|
-}
|
|
|
-
|
|
|
-.custom-tree :deep(.ant-btn) {
|
|
|
- padding: 0 8px;
|
|
|
- font-size: 12px;
|
|
|
- height: auto;
|
|
|
- line-height: 1.5715;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: flex-end;
|
|
|
+ white-space: nowrap;
|
|
|
}
|
|
|
|
|
|
/* 下拉菜单样式 */
|