add ProductTab
This commit is contained in:
@@ -29,7 +29,7 @@
|
|||||||
import AppNavBar from "@/components/navbar/index.vue";
|
import AppNavBar from "@/components/navbar/index.vue";
|
||||||
import PageTransition from "@/components/PageTransition.vue";
|
import PageTransition from "@/components/PageTransition.vue";
|
||||||
import { useTabBarStore } from "@/store/tabBarStore";
|
import { useTabBarStore } from "@/store/tabBarStore";
|
||||||
import { permissionCodes } from "@/utils/permission";
|
import { gaoRoleCodes, permissionCodes } from "@/utils/permission";
|
||||||
import { useUserStore } from "timi-web-api";
|
import { useUserStore } from "timi-web-api";
|
||||||
|
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
@@ -53,6 +53,8 @@ type TabItem = {
|
|||||||
text: string;
|
text: string;
|
||||||
permission?: string | string[];
|
permission?: string | string[];
|
||||||
permissionMode?: "and" | "or";
|
permissionMode?: "and" | "or";
|
||||||
|
role?: string | string[];
|
||||||
|
roleMode?: "and" | "or";
|
||||||
};
|
};
|
||||||
|
|
||||||
const tabVal = ref(route.path);
|
const tabVal = ref(route.path);
|
||||||
@@ -63,10 +65,14 @@ const tabList: TabItem[] = [
|
|||||||
text: "客户",
|
text: "客户",
|
||||||
permission: [permissionCodes.customer.create, permissionCodes.eventRecord.create]
|
permission: [permissionCodes.customer.create, permissionCodes.eventRecord.create]
|
||||||
},
|
},
|
||||||
|
{ value: "/product", icon: "layers", text: "产品", role: gaoRoleCodes.storeManager },
|
||||||
{ value: "/store", icon: "shop-3", text: "门店", permission: permissionCodes.stat.read },
|
{ value: "/store", icon: "shop-3", text: "门店", permission: permissionCodes.stat.read },
|
||||||
{ value: "/management", icon: "setting-1", text: "管理" }
|
{ value: "/management", icon: "setting-1", text: "管理" }
|
||||||
];
|
];
|
||||||
const list = computed(() => tabList.filter(item => !item.permission || userStore.hasPermissions(item.permission, item.permissionMode)));
|
const list = computed(() => tabList.filter(item => (
|
||||||
|
(!item.permission || userStore.hasPermissions(item.permission, item.permissionMode))
|
||||||
|
&& (!item.role || userStore.hasRoles(item.role, item.roleMode))
|
||||||
|
)));
|
||||||
|
|
||||||
watch(() => route.path, (newPath: string) => {
|
watch(() => route.path, (newPath: string) => {
|
||||||
tabVal.value = resolveTabValue(newPath);
|
tabVal.value = resolveTabValue(newPath);
|
||||||
@@ -94,6 +100,10 @@ function resolveTabValue(path: string): string {
|
|||||||
return "/store";
|
return "/store";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (path.startsWith("/product")) {
|
||||||
|
return "/product";
|
||||||
|
}
|
||||||
|
|
||||||
if (path.startsWith("/management")) {
|
if (path.startsWith("/management")) {
|
||||||
return "/management";
|
return "/management";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,7 +71,7 @@
|
|||||||
class="line"
|
class="line"
|
||||||
theme="primary"
|
theme="primary"
|
||||||
variant="outline"
|
variant="outline"
|
||||||
v-text="getPaymentStatusText(item.paymentStatus)"
|
:content="getPaymentStatusText(item.paymentStatus)"
|
||||||
/>
|
/>
|
||||||
<div class="line" v-text="`成交价:${formatPackageAmount(item.saleAmount)}`" />
|
<div class="line" v-text="`成交价:${formatPackageAmount(item.saleAmount)}`" />
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -0,0 +1,106 @@
|
|||||||
|
<template>
|
||||||
|
<div class="product-tab">
|
||||||
|
<t-notice-bar
|
||||||
|
theme="error"
|
||||||
|
visible
|
||||||
|
content="产品库设计方案及实现未完成,套餐功能仍在测试中,可以试用反馈可改进问题,但不要实际落到业务使用。产品库实现后套餐模块会联动更新,会清除测试的套餐数据"
|
||||||
|
/>
|
||||||
|
<t-cell-group
|
||||||
|
v-for="(group, index) in visibleMenuGroupList"
|
||||||
|
:key="group.title"
|
||||||
|
:title="group.title"
|
||||||
|
theme="card"
|
||||||
|
v-entrance-transition="index * 70"
|
||||||
|
>
|
||||||
|
<t-cell
|
||||||
|
v-for="item in group.items"
|
||||||
|
:key="item.path"
|
||||||
|
class="item"
|
||||||
|
:title="item.title"
|
||||||
|
arrow
|
||||||
|
hover
|
||||||
|
@click="go(item.path)"
|
||||||
|
>
|
||||||
|
<template #leftIcon>
|
||||||
|
<t-icon :name="item.icon" size="1.75rem" />
|
||||||
|
</template>
|
||||||
|
</t-cell>
|
||||||
|
</t-cell-group>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { useUserStore } from "timi-web-api";
|
||||||
|
import { permissionCodes } from "@/utils/permission";
|
||||||
|
|
||||||
|
type MenuItem = {
|
||||||
|
icon: string;
|
||||||
|
path: string;
|
||||||
|
title: string;
|
||||||
|
visible: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
type MenuGroup = {
|
||||||
|
items: MenuItem[];
|
||||||
|
title: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
defineOptions({
|
||||||
|
name: "ProductTab"
|
||||||
|
});
|
||||||
|
|
||||||
|
const router = useRouter();
|
||||||
|
const userStore = useUserStore();
|
||||||
|
|
||||||
|
const menuGroupList = computed<MenuGroup[]>(() => [
|
||||||
|
{
|
||||||
|
title: "套餐",
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
icon: "layers",
|
||||||
|
path: "/management/package-configs",
|
||||||
|
title: "套餐配置",
|
||||||
|
visible: userStore.hasPermissions(permissionCodes.packageConfig.read)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: "order-list",
|
||||||
|
path: "/management/customer-packages",
|
||||||
|
title: "客户套餐",
|
||||||
|
visible: userStore.hasPermissions(permissionCodes.customerPackage.read)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: "upload",
|
||||||
|
path: "/management/package-deliveries",
|
||||||
|
title: "发放记录",
|
||||||
|
visible: userStore.hasPermissions(permissionCodes.packageDelivery.read)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: "money",
|
||||||
|
path: "/management/fund-records",
|
||||||
|
title: "资金流水",
|
||||||
|
visible: userStore.hasPermissions(permissionCodes.fundRecord.read)
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
|
||||||
|
const visibleMenuGroupList = computed<MenuGroup[]>(() => menuGroupList.value
|
||||||
|
.map(group => ({
|
||||||
|
...group,
|
||||||
|
items: group.items.filter(item => item.visible)
|
||||||
|
}))
|
||||||
|
.filter(group => group.items.length));
|
||||||
|
|
||||||
|
async function go(path: string): Promise<void> {
|
||||||
|
await router.push(path);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="less">
|
||||||
|
.product-tab {
|
||||||
|
gap: .5rem;
|
||||||
|
display: flex;
|
||||||
|
padding: calc(var(--app-nav-height)) 0 6rem;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -196,35 +196,6 @@ const menuGroupList = computed<MenuGroup[]>(() => [
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
|
||||||
title: "套餐",
|
|
||||||
items: [
|
|
||||||
{
|
|
||||||
icon: "layers",
|
|
||||||
path: "/management/package-configs",
|
|
||||||
title: "套餐配置",
|
|
||||||
visible: userStore.hasPermissions(permissionCodes.packageConfig.read)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
icon: "order-list",
|
|
||||||
path: "/management/customer-packages",
|
|
||||||
title: "客户套餐",
|
|
||||||
visible: userStore.hasPermissions(permissionCodes.customerPackage.read)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
icon: "upload",
|
|
||||||
path: "/management/package-deliveries",
|
|
||||||
title: "发放记录",
|
|
||||||
visible: userStore.hasPermissions(permissionCodes.packageDelivery.read)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
icon: "money",
|
|
||||||
path: "/management/fund-records",
|
|
||||||
title: "资金流水",
|
|
||||||
visible: userStore.hasPermissions(permissionCodes.fundRecord.read)
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
title: "系统",
|
title: "系统",
|
||||||
items: [
|
items: [
|
||||||
|
|||||||
@@ -93,8 +93,7 @@ const canManageStore = computed(() => userStore.hasRoles([
|
|||||||
gaoRoleCodes.storeManager
|
gaoRoleCodes.storeManager
|
||||||
], "or") && userStore.hasPermissions(permissionCodes.store.read));
|
], "or") && userStore.hasPermissions(permissionCodes.store.read));
|
||||||
const canManageStoreDiary = computed(() => userStore.hasRoles(gaoRoleCodes.storeManager)
|
const canManageStoreDiary = computed(() => userStore.hasRoles(gaoRoleCodes.storeManager)
|
||||||
&& !userStore.hasRoles(gaoRoleCodes.globalManager)
|
&& userStore.hasPermissions(permissionCodes.storeDiary.create));
|
||||||
&& userStore.hasPermissions(permissionCodes.storeDiary.read));
|
|
||||||
|
|
||||||
// ---------- 门店切换 ----------
|
// ---------- 门店切换 ----------
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -129,7 +129,7 @@ async function resolveStoreAccessRedirect(to: RouteLocationNormalized): Promise<
|
|||||||
const routeName = String(to.name || "");
|
const routeName = String(to.name || "");
|
||||||
const storeDiaryRouteNameList = ["StoreDiaryList", "StoreDiaryCreate", "StoreDiaryDetail", "StoreDiaryEdit"];
|
const storeDiaryRouteNameList = ["StoreDiaryList", "StoreDiaryCreate", "StoreDiaryDetail", "StoreDiaryEdit"];
|
||||||
if (storeDiaryRouteNameList.includes(routeName)) {
|
if (storeDiaryRouteNameList.includes(routeName)) {
|
||||||
if (!userStore.hasRoles(gaoRoleCodes.storeManager) || userStore.hasRoles(gaoRoleCodes.globalManager)) {
|
if (!userStore.hasRoles(gaoRoleCodes.storeManager)) {
|
||||||
return "/management";
|
return "/management";
|
||||||
}
|
}
|
||||||
const currentStoreStore = useCurrentStoreStore();
|
const currentStoreStore = useCurrentStoreStore();
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import type { RouteRecordRaw } from "vue-router";
|
import type { RouteRecordRaw } from "vue-router";
|
||||||
import HomeTab from "@/pages/tabs/HomeTab.vue";
|
import HomeTab from "@/pages/tabs/HomeTab.vue";
|
||||||
|
import ProductTab from "@/pages/tabs/ProductTab.vue";
|
||||||
import SettingTab from "@/pages/tabs/SettingTab.vue";
|
import SettingTab from "@/pages/tabs/SettingTab.vue";
|
||||||
import StoreTab from "@/pages/tabs/StoreTab.vue";
|
import StoreTab from "@/pages/tabs/StoreTab.vue";
|
||||||
|
|
||||||
@@ -32,6 +33,20 @@ const tabRoutes: RouteRecordRaw[] = [
|
|||||||
darkBodyBackground: "#10161f"
|
darkBodyBackground: "#10161f"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: "/product",
|
||||||
|
name: "ProductTab",
|
||||||
|
component: ProductTab,
|
||||||
|
meta: {
|
||||||
|
depth: 2,
|
||||||
|
navBarVisible: true,
|
||||||
|
navBarCanBack: false,
|
||||||
|
navBarTitle: "产品",
|
||||||
|
tabBarVisible: true,
|
||||||
|
bodyBackground: "#F5F5F8",
|
||||||
|
darkBodyBackground: "#10161f"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: "/management",
|
path: "/management",
|
||||||
name: "SettingTab",
|
name: "SettingTab",
|
||||||
|
|||||||
Reference in New Issue
Block a user