diff --git a/pages/champion/champion.vue b/pages/champion/champion.vue
index 2302f55..76094fd 100644
--- a/pages/champion/champion.vue
+++ b/pages/champion/champion.vue
@@ -17,51 +17,26 @@
-
-
-
- 摸底
-
-
- 陪练
-
-
- 实战
-
-
- 质检
-
-
- 素材
-
+
+
+ 陪练
-
-
-
-
-
- 摸底
- 这里是摸底相关的内容展示区域
+
+ 质检
-
+
+ 素材
+
+
{{ item.title || '未命名知识' }}
-
@@ -126,16 +101,16 @@
-
+
-
-
-
- 实战
- 这里是实战相关的内容展示区域
-
-
-
+
+
+
@@ -604,7 +575,7 @@
// #endif
data() {
return {
- activeTab: 'survey',
+ activeTab: 'practice',
// 素材相关数据
materialList: [],
materialLoading: false,
@@ -676,11 +647,9 @@
content: '',
remark: ''
},
- // 陪练上下文菜单
- practiceContextMenuVisible: false,
- practiceContextMenuIndex: -1,
- practiceContextMenuTop: 0,
- practiceContextMenuLeft: 0,
+ // 陪练操作菜单
+ selectedPracticeItem: null,
+ showPracticeActionMenu: false,
// 内容详情弹出框
showContentPopup: false,
contentPopupTitle: '',
@@ -1301,53 +1270,23 @@
this.practiceLoading = false;
}
},
- showPracticeContextMenu(item, index, event) {
- // 阻止事件冒泡
- if (event && event.stopPropagation) {
- event.stopPropagation();
- }
- // 获取系统信息以计算位置
- const systemInfo = uni.getSystemInfoSync();
- // 获取点击位置 - 优先使用触摸事件坐标
- let top = 100;
- let left = systemInfo.windowWidth - 180;
-
- if (event) {
- if (event.touches && event.touches.length > 0) {
- // 触摸事件
- top = event.touches[0].clientY;
- left = event.touches[0].clientX - 80;
- } else if (event.detail && typeof event.detail.x === 'number') {
- // tap事件坐标(单位:px,需要转换)
- top = event.detail.y;
- left = event.detail.x - 80;
- } else if (event.clientY !== undefined) {
- // 鼠标事件
- top = event.clientY;
- left = event.clientX - 80;
- }
+ onPracticeActionBtnClick(item) {
+ // 如果已经选中当前项,则关闭菜单
+ if (this.selectedPracticeItem && this.selectedPracticeItem.id === item.id && this.showPracticeActionMenu) {
+ this.closePracticeActionMenu();
+ return;
}
- // 确保菜单不超出屏幕
- if (left + 160 > systemInfo.windowWidth) {
- left = systemInfo.windowWidth - 180;
- }
- if (left < 0) {
- left = 10;
- }
-
- this.practiceContextMenuTop = top;
- this.practiceContextMenuLeft = left;
// 显示菜单
- this.practiceContextMenuIndex = index;
- this.practiceContextMenuVisible = true;
+ this.selectedPracticeItem = item;
+ this.showPracticeActionMenu = true;
},
- closePracticeContextMenu() {
- this.practiceContextMenuVisible = false;
- this.practiceContextMenuIndex = -1;
+ closePracticeActionMenu() {
+ this.showPracticeActionMenu = false;
+ this.selectedPracticeItem = null;
},
handleEditPractice(item) {
- this.closePracticeContextMenu();
+ this.closePracticeActionMenu();
// 填充编辑表单
this.editPracticeForm = {
id: item.id,
@@ -1433,7 +1372,7 @@
}
},
handleDeletePractice(item) {
- this.closePracticeContextMenu();
+ this.closePracticeActionMenu();
uni.showModal({
title: '提示',
content: '确认删除该陪练吗?',
@@ -1658,26 +1597,17 @@
}
/* 标签页 */
- .tabs-scroll {
- position: fixed;
+ .tabs {
+ display: flex;
+ background-color: #FFFFFF;
+ border-bottom: 1px solid #E0E0E0;
+ padding: 0 16rpx;
+ margin-top: 0;
+ position: absolute;
top: 88rpx; /* 导航栏高度 */
left: 0;
right: 0;
- width: 100%;
- background-color: #FFFFFF;
- border-bottom: 1px solid #E0E0E0;
- white-space: nowrap;
- margin-top: 0;
- z-index: 999;
- height: 72rpx; /* 设置固定高度,确保tabs可见 */
- box-sizing: border-box;
- }
-
- .tabs {
- display: inline-flex;
- padding: 0 16rpx;
- height: 100%; /* 确保tabs占满scroll-view的高度 */
- align-items: center; /* 垂直居中 */
+ z-index: 1;
}
.tab-item {
@@ -1728,6 +1658,10 @@
left: 0;
right: 0;
bottom: 96rpx; /* 底部导航栏高度 */
+ background-color: #F5F5F5;
+ padding: 24rpx 16rpx 0 16rpx; /* 顶部24rpx间距(与列表项间距一致),底部0 */
+ box-sizing: border-box;
+ overflow-y: auto;
}
.champion-card {
@@ -1761,13 +1695,15 @@
display: flex;
flex-wrap: nowrap;
align-items: center;
- gap: 2rpx;
- padding: 4rpx 4rpx;
- margin-bottom: 4rpx;
+ gap: 8rpx; /* 增加间距,避免元素被挤压 */
+ padding: 12rpx 8rpx; /* 增加内边距,给搜索框更多空间 */
+ margin-bottom: 24rpx; /* 与列表项间距保持一致(24rpx) */
background-color: #F8F8FA;
border-radius: 8rpx;
border: 1px solid #EFEFF2;
overflow-x: auto;
+ min-height: 64rpx; /* 设置最小高度,确保搜索区域不被挤压 */
+ box-sizing: border-box;
}
.toolbar-total {
@@ -1775,21 +1711,24 @@
color: #666;
white-space: nowrap;
flex-shrink: 0;
- margin-right: 2rpx;
+ margin-right: 8rpx; /* 增加右边距,与搜索框保持距离 */
line-height: 1.2;
+ padding: 0 4rpx; /* 增加左右内边距 */
}
.toolbar-input {
flex: 1;
- min-width: 100rpx;
- height: 48rpx;
- line-height: 48rpx;
+ min-width: 120rpx; /* 增加最小宽度,避免被挤压变形 */
+ max-width: 200rpx; /* 设置最大宽度,保持合理比例 */
+ height: 56rpx; /* 稍微增加高度,提升可用性 */
+ line-height: 56rpx;
background-color: #F5F6FA;
border-radius: 8rpx;
- padding: 0 8rpx;
+ padding: 0 12rpx; /* 增加左右内边距 */
font-size: 24rpx;
border: 1px solid transparent;
box-sizing: border-box;
+ flex-shrink: 1; /* 允许适当收缩,但保持最小宽度 */
}
.toolbar-actions {
@@ -1797,21 +1736,26 @@
align-items: center;
margin-left: auto;
flex-shrink: 0;
- gap: 2rpx;
+ gap: 8rpx; /* 增加按钮之间的间距 */
}
.toolbar-btn {
- padding: 0 6rpx;
- height: 48rpx;
- min-width: 48rpx;
+ padding: 0 12rpx; /* 增加左右内边距 */
+ height: 56rpx; /* 与输入框高度保持一致 */
+ min-width: 56rpx;
color: #2A68FF;
display: flex;
align-items: center;
justify-content: center;
- gap: 2rpx;
+ gap: 4rpx; /* 增加图标和文字之间的间距 */
font-size: 24rpx;
font-weight: 400;
line-height: 1;
+ box-sizing: border-box;
+ }
+
+ .toolbar-btn text {
+ color: #2A68FF;
}
.service-card {
@@ -1845,13 +1789,24 @@
}
.card-menu-trigger {
- width: 48rpx;
- height: 48rpx;
+ width: 60rpx;
+ height: 60rpx;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
flex-shrink: 0;
+ margin-left: auto;
+ margin-right: 0;
+ margin-top: 0;
+ margin-bottom: 0;
+ flex-grow: 0;
+ position: relative;
+ padding: 0;
+ }
+
+ .card-menu-trigger:active {
+ opacity: 0.7;
}
.context-menu {
@@ -1865,6 +1820,56 @@
max-width: 200rpx;
}
+ /* 陪练操作菜单样式 */
+ .practice-card-item {
+ position: relative;
+ }
+
+ .practice-action-menu {
+ position: absolute;
+ top: 60rpx;
+ right: 32rpx;
+ width: 160rpx;
+ background-color: #FFFFFF;
+ border-radius: 12rpx;
+ box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.15);
+ z-index: 100;
+ overflow: hidden;
+ margin-right: 0;
+ }
+
+ .practice-action-menu-item {
+ padding: 24rpx 32rpx;
+ font-size: 28rpx;
+ color: #333;
+ text-align: center;
+ background-color: #FFFFFF;
+ }
+
+ .practice-action-menu-item:active {
+ background-color: #F5F5F5;
+ }
+
+ .practice-action-menu-item--danger {
+ color: #FF5722;
+ }
+
+ .practice-action-menu-divider {
+ height: 1rpx;
+ background-color: #E0E0E0;
+ margin: 0 16rpx;
+ }
+
+ .practice-action-menu-mask {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background-color: transparent;
+ z-index: 99;
+ }
+
.context-menu-item {
padding: 24rpx 32rpx;
font-size: 28rpx;
diff --git a/pages/customer/customer.vue b/pages/customer/customer.vue
index 3df8218..e6d05bb 100644
--- a/pages/customer/customer.vue
+++ b/pages/customer/customer.vue
@@ -1632,33 +1632,36 @@
// 加载服务记录列表
async loadServiceList(params = {}) {
try {
+ // 构建查询参数对象(后端使用 @RequestParam,参数需要作为 URL 查询参数传递)
const queryParams = {
current: this.serviceListPage.current,
size: this.serviceListPage.size
};
// 添加查询参数:所属销售姓名和客户姓名
- if (params.salesName) {
- queryParams.salesName = params.salesName;
+ const trimmedSalesName = params.salesName?.trim();
+ const trimmedCustomerName = params.customerName?.trim();
+ if (trimmedSalesName) {
+ queryParams.salesName = trimmedSalesName;
}
- if (params.customerName) {
- queryParams.customerName = params.customerName;
+ if (trimmedCustomerName) {
+ queryParams.customerName = trimmedCustomerName;
}
- // 构建请求体(过滤空值),后端改为 POST
- const requestData = Object.keys(queryParams)
+ // 将参数转换为 URL 查询字符串(因为后端使用 @RequestParam)
+ const queryString = Object.keys(queryParams)
.filter(key => queryParams[key] !== null && queryParams[key] !== undefined && queryParams[key] !== '')
- .reduce((acc, key) => {
- acc[key] = queryParams[key];
- return acc;
- }, {});
+ .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(queryParams[key])}`)
+ .join('&');
- const url = getApiUrl('/api/audioManagement/list');
+ // 后端使用 @RequestParam,参数需要作为 URL 查询参数传递
+ const baseUrl = getApiUrl('/api/audioManagement/list');
+ const url = queryString ? `${baseUrl}?${queryString}` : baseUrl;
const res = await uni.request({
- url: url,
+ url,
method: 'POST',
- data: requestData,
+ data: {}, // POST 请求体为空,参数都在 URL 查询字符串中
header: {
'Content-Type': 'application/json'
},