mirror of
https://gitee.com/niucloud-team/javashop.git
synced 2026-04-25 03:08:09 +00:00
Niucloud JAVA版框架1.1.0更新内容
新增
* 增加小程序展示线上版本号
* 发布小程序添加自定义版本号
* 添加后台取消小程序绑定微信公众平台授权
* 管理端核销功能
* 用户端导入微信地址功能
优化
* 装修页面时可自定义底部导航
* 小程序添加版权信息展示
* 应用菜单结构优化:取消独立营销菜单,统一在应用菜单下按分类
* 分页列表增加缓存,记录当前页信息,操作完成后,返回当前页
* 开启标签栏时对标签页面进行缓存
* 统一框架装修自定义使用底部导航数据结构
修复
* 删除表单报错
* admin首页点击未安装、已安装应用,页面跳转空白
* 修复插件云安装错误时同时显示安装失败和安装完成
商城1.0.5更新内容
新增
* 用户端添加订单开具发票功能
* 管理后台添加补开发票功能
优化
* 商品列表增加相关活动的关联展示
* 限时折扣、积分商城增加批量操作
* 积分商品,若有规格未参与积分活动,则无法购买
* 复制商品,提示语优化
修复
* 满减送活动赠品设置多件,只展示1件
* 满减送赠品未扣除库存问题
* 商品列表批量设置分类后商品分类查询不到商品的问题
* 商品标签状态已经关闭添加商品时依旧可以选择
* 商家地址库联系方式搜索无效
* 商品分类拖动排序无效
* 参与满减活动再使用优惠券,订单0元申请退款时,退款金额出现负数
* 积分商城规格值设置不参与积分兑换提交订单未拦截
* 虚拟商品核销码设置的永久有效,核销时提示商品已过期
* 订单满减送退款售后点击详情报错
* 按会员标签发放优惠券异常一直未发放
* 微信支付申请退款售后点击转账跳转404
* 订单列表输入会员编号、账号点击搜索筛选不出来内容
* 多商品组商品来源选择分组,只有一个商品分类时多商品组商品展示不正确
* 商品组件排序方式选择为价格时报错
* 图文导航选择积分商品报错
156 lines
5.4 KiB
Vue
156 lines
5.4 KiB
Vue
<template>
|
|
<el-container class="w-[200px] h-screen layout-aside flex flex-col">
|
|
<el-header class="logo-wrap flex items-center justify-center h-[64px]">
|
|
<div class="logo flex items-center m-auto h-[64px]" v-if="!systemStore.menuIsCollapse">
|
|
<el-image style="width: 40px; height: 40px" :src="img(logoUrl)" fit="contain">
|
|
<template #error>
|
|
<div class="flex justify-center items-center w-full h-[40px]"><img class="max-w-[40px]" src="@/app/assets/images/icon-addon-one.png" alt="" object-fit="contain"></div>
|
|
</template>
|
|
</el-image>
|
|
</div>
|
|
<div class="logo flex items-center justify-center h-[64px]" v-else>
|
|
<i class="text-3xl iconfont iconyunkongjian"></i>
|
|
</div>
|
|
</el-header>
|
|
<el-main class="menu-wrap">
|
|
<el-scrollbar>
|
|
<el-menu :default-active="route.name" :router="true" class="aside-menu h-full" :unique-opened="true" :collapse="systemStore.menuIsCollapse" >
|
|
<menu-item v-for="(route, index) in menuData" :routes="route" :key="index" />
|
|
</el-menu>
|
|
<div class="h-[48px]"></div>
|
|
</el-scrollbar>
|
|
</el-main>
|
|
</el-container>
|
|
</template>
|
|
|
|
<script lang="ts" setup>
|
|
import { ref, computed, onMounted } from 'vue'
|
|
import { useRoute } from 'vue-router'
|
|
import useSystemStore from '@/stores/modules/system'
|
|
import useUserStore from '@/stores/modules/user'
|
|
import menuItem from './menu-item.vue'
|
|
import { img } from '@/utils/common'
|
|
import { findFirstValidRoute ,formatRouters} from '@/router/routers'
|
|
import { getShowApp,getShowSpecialMenu} from '@/app/api/site'
|
|
|
|
import storage from '@/utils/storage'
|
|
|
|
const systemStore = useSystemStore()
|
|
const userStore = useUserStore()
|
|
const route = useRoute()
|
|
const siteInfo = userStore.siteInfo
|
|
const routers = userStore.routers
|
|
const addonIndexRoute = userStore.addonIndexRoute
|
|
const menuData = ref<Record<string, any>[]>([])
|
|
const addonRouters: Record<string, any> = {}
|
|
const logoUrl = computed(() => {
|
|
return userStore.siteInfo.logo ? userStore.siteInfo.logo : systemStore.website.logo
|
|
})
|
|
|
|
const appList = ref<Record<string, any>[]>([])
|
|
|
|
const getAppList = async () => {
|
|
const res = await getShowApp()
|
|
appList.value = res.data
|
|
|
|
storage.set({ key: 'defaultAppList', data: appList.value })
|
|
}
|
|
const specialList = ref<Record<string, any>[]>([])
|
|
const getShowSpecialMenuList = async () => {
|
|
const res = await getShowSpecialMenu()
|
|
// specialList.value = formatRouters(res.data.list)
|
|
specialList.value = res.data.list
|
|
|
|
storage.set({ key: 'specialAppList', data: specialList.value })
|
|
}
|
|
|
|
|
|
onMounted(() => {
|
|
getAppList()
|
|
getShowSpecialMenuList()
|
|
})
|
|
|
|
routers.forEach(item => {
|
|
item.original_name = item.name
|
|
if (item.meta.addon == '') {
|
|
if (item.meta.attr == '' && item.name != 'sign' && item.name != 'verify') {
|
|
if (item.children && item.children.length) {
|
|
item.name = findFirstValidRoute(item.children)
|
|
}
|
|
menuData.value.push(item)
|
|
}
|
|
} else if (item.meta.addon != '' && siteInfo?.apps.length == 1 && siteInfo?.apps[0].key == item.meta.addon && item.meta.show) {
|
|
if (item.children) {
|
|
item.children.forEach((citem: Record<string, any>) => {
|
|
citem.original_name = citem.name
|
|
if (citem.children && citem.children.length) {
|
|
citem.name = findFirstValidRoute(citem.children)
|
|
}
|
|
})
|
|
menuData.value.unshift(...item.children)
|
|
} else {
|
|
menuData.value.unshift(item)
|
|
}
|
|
} else {
|
|
addonRouters[item.meta.addon] = item
|
|
}
|
|
|
|
// console.log('menuData', menuData.value)
|
|
// 排序, 功能正确,改了排序后需要把菜单排序的默认值重新调整一下【多应用一级菜单,单应用二级菜单】
|
|
// menuData.value.sort((a, b) => {
|
|
// if (a.meta.sort && b.meta.sort) {
|
|
// return b.meta.sort - a.meta.sort
|
|
// } else if (a.meta.sort) {
|
|
// return -1
|
|
// } else if (b.meta.sort) {
|
|
// return 1
|
|
// } else {
|
|
// return 0
|
|
// }
|
|
// })
|
|
})
|
|
|
|
// 多应用时将应用插入菜单
|
|
if (siteInfo?.apps.length > 1) {
|
|
const routers:Record<string, any>[] = []
|
|
siteInfo?.apps.forEach((item: Record<string, any>) => {
|
|
if (addonRouters[item.key]) {
|
|
addonRouters[item.key].name = addonIndexRoute[item.key]
|
|
routers.push(addonRouters[item.key])
|
|
}
|
|
})
|
|
menuData.value.unshift(...routers)
|
|
|
|
// 排序, 功能正确,改了排序后需要把菜单排序的默认值重新调整一下【多应用一级菜单,单应用二级菜单】
|
|
// menuData.value.sort((a, b) => {
|
|
// if (a.meta.sort && b.meta.sort) {
|
|
// return b.meta.sort - a.meta.sort
|
|
// } else if (a.meta.sort) {
|
|
// return -1
|
|
// } else if (b.meta.sort) {
|
|
// return 1
|
|
// } else {
|
|
// return 0
|
|
// }
|
|
// })
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss">
|
|
.menu-wrap {
|
|
padding: 0!important;
|
|
|
|
.el-menu {
|
|
border-right: 0!important;
|
|
|
|
.el-menu-item, .el-sub-menu__title {
|
|
--el-menu-item-height: 40px;
|
|
}
|
|
|
|
.el-sub-menu .el-menu-item {
|
|
--el-menu-sub-item-height: 40px;
|
|
}
|
|
}
|
|
}
|
|
</style>
|