微信小程序发布试用版本
This commit is contained in:
@@ -1,7 +1,17 @@
|
||||
<template>
|
||||
<view class="tabbar">
|
||||
<!-- 调试信息:显示当前可见的tabs -->
|
||||
<view style="display: none;">
|
||||
DEBUG: visibleTabs length: {{ visibleTabs.length }},
|
||||
tabs: {{ visibleTabs.map(t => t.text).join(', ') }},
|
||||
furnitureTabs length: {{ furnitureTabs.length }},
|
||||
furnitureTabs: {{ furnitureTabs.map(t => t.text).join(', ') }},
|
||||
roles: {{ roles.join(', ') }}
|
||||
</view>
|
||||
|
||||
<!-- 强制显示所有家具角色的tab -->
|
||||
<view
|
||||
v-for="item in visibleTabs"
|
||||
v-for="item in furnitureTabs"
|
||||
:key="item.key"
|
||||
class="tabbar-item"
|
||||
:class="{ active: currentPath === item.pagePath }"
|
||||
@@ -14,6 +24,9 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
// 直接在全局作用域添加调试代码,确保能执行
|
||||
console.log('CUSTOM TABBAR FILE LOADED - THIS MUST SHOW');
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
@@ -21,27 +34,34 @@ export default {
|
||||
roles: [],
|
||||
currentPath: '',
|
||||
allTabs: [
|
||||
{
|
||||
key: 'reception',
|
||||
text: '接待',
|
||||
pagePath: '/pages/reception/reception',
|
||||
iconPath: '/static/tabbar/reception.png',
|
||||
selectedIconPath: '/static/tabbar/reception_active.png',
|
||||
},
|
||||
{
|
||||
key: 'customer',
|
||||
text: '客户',
|
||||
pagePath: '/pages/customer/customer',
|
||||
iconPath: '/static/tabbar/customer.png',
|
||||
selectedIconPath: '/static/tabbar/customer_active.png',
|
||||
},
|
||||
{
|
||||
key: 'team',
|
||||
text: '团队',
|
||||
pagePath: '/pages/team/team',
|
||||
iconPath: '/static/tabbar/team.png',
|
||||
selectedIconPath: '/static/tabbar/team_active.png',
|
||||
},
|
||||
{
|
||||
key: 'furniture_reception',
|
||||
text: '接待',
|
||||
pagePath: '/pages/furniture_reception/furniture_reception',
|
||||
iconPath: '/static/tabbar/reception.png',
|
||||
selectedIconPath: '/static/tabbar/reception_active.png',
|
||||
},
|
||||
{
|
||||
key: 'furniture_customer',
|
||||
text: '客户',
|
||||
pagePath: 'pages/furniture_customer/furniture_customer',
|
||||
iconPath: '/static/tabbar/customer.png',
|
||||
selectedIconPath: '/static/tabbar/customer_active.png',
|
||||
},
|
||||
{
|
||||
key: 'furniture_top_sales',
|
||||
text: '销冠',
|
||||
pagePath: 'pages/furniture_top_sales/furniture_top_sales',
|
||||
iconPath: '/static/tabbar/insight.png',
|
||||
selectedIconPath: '/static/tabbar/insight_active.png',
|
||||
},
|
||||
{
|
||||
key: 'ucenter',
|
||||
text: '我的',
|
||||
pagePath: 'pages/ucenter/ucenter',
|
||||
iconPath: '/static/tabbar/me.png',
|
||||
selectedIconPath: '/static/tabbar/me_active.png',
|
||||
},
|
||||
// 已从导航中移除,但保留代码
|
||||
// {
|
||||
// key: 'champion',
|
||||
@@ -67,10 +87,17 @@ export default {
|
||||
{
|
||||
key: 'meeting_summary',
|
||||
text: '总结和统计',
|
||||
pagePath: '/pages/meeting_summary/meeting_summary',
|
||||
pagePath: '/pages-subpackage/meeting_summary/meeting_summary',
|
||||
iconPath: '/static/tabbar/insight.png',
|
||||
selectedIconPath: '/static/tabbar/insight_active.png',
|
||||
},
|
||||
],
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
furnitureTabs() {
|
||||
// 强制返回所有家具角色的tab
|
||||
return [
|
||||
{
|
||||
key: 'furniture_reception',
|
||||
text: '接待',
|
||||
@@ -78,13 +105,6 @@ export default {
|
||||
iconPath: '/static/tabbar/reception.png',
|
||||
selectedIconPath: '/static/tabbar/reception_active.png',
|
||||
},
|
||||
{
|
||||
key: 'common_begin_reception',
|
||||
text: '开始接待',
|
||||
pagePath: '/pages/furniture_reception/common_begin_reception',
|
||||
iconPath: '/static/tabbar/reception.png',
|
||||
selectedIconPath: '/static/tabbar/reception_active.png',
|
||||
},
|
||||
{
|
||||
key: 'furniture_customer',
|
||||
text: '客户',
|
||||
@@ -99,11 +119,19 @@ export default {
|
||||
iconPath: '/static/tabbar/insight.png',
|
||||
selectedIconPath: '/static/tabbar/insight_active.png',
|
||||
},
|
||||
],
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
{
|
||||
key: 'ucenter',
|
||||
text: '我的',
|
||||
pagePath: '/pages/ucenter/ucenter',
|
||||
iconPath: '/static/tabbar/me.png',
|
||||
selectedIconPath: '/static/tabbar/me_active.png',
|
||||
}
|
||||
];
|
||||
},
|
||||
|
||||
visibleTabs() {
|
||||
console.log('=== CUSTOM TABBAR VISIBLE TABS CALCULATED ===');
|
||||
console.log('VISIBLE TABS CALC - THIS MUST SHOW IN H5');
|
||||
const allowedKeys = this.getAllowedKeys();
|
||||
console.log('[TabBar][visibleTabs] STEP1 - getAllowedKeys returned:', JSON.stringify(allowedKeys));
|
||||
|
||||
@@ -139,10 +167,18 @@ export default {
|
||||
},
|
||||
},
|
||||
created() {
|
||||
console.log('=== CUSTOM TABBAR COMPONENT CREATED ===');
|
||||
console.log('CUSTOM TABBAR CREATED - THIS MUST SHOW IN H5');
|
||||
this.refreshRole();
|
||||
this.updateActivePath();
|
||||
},
|
||||
mounted() {
|
||||
console.log('=== CUSTOM TABBAR COMPONENT MOUNTED ===');
|
||||
console.log('CUSTOM TABBAR MOUNTED - THIS MUST SHOW IN CONSOLE');
|
||||
|
||||
// 强制执行,不依赖条件编译
|
||||
this.forceH5TabBarSetup();
|
||||
|
||||
// 监听外部刷新事件(登录后、页面切换时可触发)
|
||||
uni.$on('tabbar:refresh', this.handleExternalRefresh);
|
||||
// 初始化时同步一次
|
||||
@@ -182,7 +218,8 @@ export default {
|
||||
console.log('[TabBar][role] storedRole:', storedRole, 'respRole:', respRole, 'normalized:', roles, 'hasEdu:', hasEdu, 'hasStudent:', hasStudent, 'finalRoleName:', this.roleName);
|
||||
// #ifdef H5
|
||||
// H5 平台自定义 tabBar 无法生效,仍使用原生 DOM;这里额外做一次 DOM 显隐
|
||||
this.toggleNativeTabs();
|
||||
console.log('[TabBar][H5] refreshRole completed, will call toggleNativeTabs');
|
||||
// 注意:不在refreshRole中直接调用,而是在setupH5TabBar中处理
|
||||
// #endif
|
||||
} catch (e) {
|
||||
console.warn('读取角色失败:', e);
|
||||
@@ -249,6 +286,9 @@ export default {
|
||||
},
|
||||
getAllowedKeys() {
|
||||
const roles = this.roles || [];
|
||||
console.log('=== CUSTOM TABBAR GET ALLOWED KEYS CALLED ===');
|
||||
console.log('GET ALLOWED KEYS - THIS MUST SHOW IN H5, roles:', roles);
|
||||
|
||||
const isTeacher = roles.includes('speaking_training_teacher');
|
||||
const isStudent = roles.includes('speaking_training_students');
|
||||
const isAdmin = roles.includes('admin');
|
||||
@@ -262,7 +302,15 @@ export default {
|
||||
|
||||
// 检查是否有任何角色名等于 "furniture" 字符串(精确匹配)
|
||||
const hasFurnitureRole = roles.includes('furniture');
|
||||
|
||||
|
||||
console.log('[TabBar][getAllowedKeys] role checks:', {
|
||||
isAdminFurniture,
|
||||
hasFurnitureRole,
|
||||
isAdmin,
|
||||
isMeetingAdmin,
|
||||
roles
|
||||
});
|
||||
|
||||
// admin_furniture 和 furniture 角色:显示 furniture_reception, furniture_customer, furniture_top_sales 和 ucenter(相同顺序)
|
||||
if (isAdminFurniture || hasFurnitureRole) {
|
||||
const furnitureTabs = ['furniture_reception', 'furniture_customer', 'furniture_top_sales', 'ucenter'];
|
||||
@@ -314,7 +362,7 @@ export default {
|
||||
toggleNativeTabs() {
|
||||
// H5 平台自定义 tabbar 不生效,直接根据角色显隐原生 tabbar 项
|
||||
// 当前位置顺序(根据 pages.json 中的 tabBar.list 顺序):接待、客户、团队、总结和统计、家具接待、开始接待、家具客户、家具销冠、我的
|
||||
const ORDER = ['reception', 'customer', 'team', 'meeting_summary', 'furniture_reception', 'common_begin_reception', 'furniture_customer', 'furniture_top_sales', 'ucenter'];
|
||||
const ORDER = ['furniture_reception', 'furniture_customer', 'furniture_top_sales', 'ucenter', 'reception', 'customer', 'team', 'meeting_summary', 'common_begin_reception'];
|
||||
const allowed = this.getAllowedKeys();
|
||||
// 限制重试次数,防止渲染时机未就绪
|
||||
this._h5TabRetries = (this._h5TabRetries || 0) + 1;
|
||||
@@ -340,6 +388,132 @@ export default {
|
||||
console.warn('[TabBar][H5 DOM] toggle tabs failed:', e);
|
||||
}
|
||||
},
|
||||
isInTabBar(pagePath) {
|
||||
// 检查页面路径是否在原生tabBar配置中
|
||||
const tabBarList = [
|
||||
'pages/furniture_reception/furniture_reception',
|
||||
'pages/furniture_customer/furniture_customer',
|
||||
'pages/furniture_top_sales/furniture_top_sales',
|
||||
'pages/ucenter/ucenter'
|
||||
];
|
||||
const normalizedPath = pagePath.startsWith('/') ? pagePath.substring(1) : pagePath;
|
||||
const result = tabBarList.includes(normalizedPath);
|
||||
console.log('[TabBar][isInTabBar]', { pagePath, normalizedPath, tabBarList, result });
|
||||
return result;
|
||||
},
|
||||
forceH5TabBarSetup() {
|
||||
console.log('=== FORCE H5 TABBAR SETUP CALLED ===');
|
||||
|
||||
// 立即执行toggleNativeTabs
|
||||
setTimeout(() => {
|
||||
console.log('FORCE: Executing toggleNativeTabs immediately');
|
||||
this.forceToggleNativeTabs();
|
||||
}, 100);
|
||||
|
||||
// 多次延迟执行
|
||||
[500, 1000, 2000, 3000, 5000].forEach((delay, index) => {
|
||||
setTimeout(() => {
|
||||
console.log(`FORCE: Delayed execution ${index + 1} after ${delay}ms`);
|
||||
this.forceToggleNativeTabs();
|
||||
}, delay);
|
||||
});
|
||||
},
|
||||
|
||||
forceToggleNativeTabs() {
|
||||
console.log('=== FORCE TOGGLE NATIVE TABS START ===');
|
||||
|
||||
try {
|
||||
// 获取允许的tab
|
||||
const allowed = this.getAllowedKeys();
|
||||
console.log('FORCE: Current roles:', this.roles);
|
||||
console.log('FORCE: Allowed keys:', allowed);
|
||||
|
||||
// 简化DOM查找 - 直接查找所有可能的tabBar元素
|
||||
const allElements = document.querySelectorAll('*');
|
||||
const tabElements = Array.from(allElements).filter(el =>
|
||||
el.textContent && (
|
||||
el.textContent.includes('接待') ||
|
||||
el.textContent.includes('客户') ||
|
||||
el.textContent.includes('销冠') ||
|
||||
el.textContent.includes('我的')
|
||||
)
|
||||
);
|
||||
|
||||
console.log('FORCE: Found tab elements with text:', tabElements.length);
|
||||
tabElements.forEach((el, idx) => {
|
||||
console.log(`FORCE: Element ${idx}:`, {
|
||||
tag: el.tagName,
|
||||
class: el.className,
|
||||
text: el.textContent,
|
||||
currentDisplay: el.style.display,
|
||||
computedDisplay: window.getComputedStyle(el).display
|
||||
});
|
||||
});
|
||||
|
||||
if (tabElements.length === 0) {
|
||||
console.warn('FORCE: No tab elements found! Looking for containers...');
|
||||
|
||||
// 查找可能的容器
|
||||
const containers = document.querySelectorAll('div, nav, section');
|
||||
const possibleContainers = Array.from(containers).filter(el =>
|
||||
el.children && el.children.length >= 4
|
||||
);
|
||||
|
||||
console.log('FORCE: Possible containers:', possibleContainers.length);
|
||||
possibleContainers.forEach((container, idx) => {
|
||||
console.log(`FORCE: Container ${idx}:`, {
|
||||
tag: container.tagName,
|
||||
class: container.className,
|
||||
children: container.children.length
|
||||
});
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// 按文本内容排序:接待、客户、销冠、我的
|
||||
const sortedElements = tabElements.sort((a, b) => {
|
||||
const order = ['接待', '客户', '销冠', '我的'];
|
||||
const aIndex = order.findIndex(text => a.textContent.includes(text));
|
||||
const bIndex = order.findIndex(text => b.textContent.includes(text));
|
||||
return aIndex - bIndex;
|
||||
});
|
||||
|
||||
console.log('FORCE: Processing sorted elements...');
|
||||
|
||||
// 处理每个元素
|
||||
sortedElements.forEach((element, index) => {
|
||||
const keyMap = ['furniture_reception', 'furniture_customer', 'furniture_top_sales', 'ucenter'];
|
||||
const key = keyMap[index];
|
||||
const shouldShow = allowed.includes(key);
|
||||
|
||||
console.log(`FORCE: Processing ${key} (${element.textContent}): shouldShow=${shouldShow}`);
|
||||
|
||||
if (shouldShow) {
|
||||
element.style.display = '';
|
||||
element.style.visibility = 'visible';
|
||||
// 确保父元素也可见
|
||||
let parent = element.parentElement;
|
||||
while (parent) {
|
||||
parent.style.display = '';
|
||||
parent.style.visibility = 'visible';
|
||||
parent = parent.parentElement;
|
||||
}
|
||||
console.log(`FORCE: SHOWED ${key}`);
|
||||
} else {
|
||||
element.style.display = 'none';
|
||||
element.style.visibility = 'hidden';
|
||||
console.log(`FORCE: HID ${key}`);
|
||||
}
|
||||
});
|
||||
|
||||
console.log('=== FORCE TOGGLE NATIVE TABS END ===');
|
||||
|
||||
} catch (e) {
|
||||
console.error('FORCE: Error in forceToggleNativeTabs:', e);
|
||||
}
|
||||
},
|
||||
|
||||
// #endif
|
||||
},
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user