接龙调整

This commit is contained in:
hb 2025-07-09 22:22:34 +08:00
parent a2c8b4dd11
commit 995401b149
8 changed files with 377 additions and 195 deletions

View File

@ -21,6 +21,9 @@ export const kmFindAllApi = async () => {
export const findAllXxXqNjTree = async () => {
return await get("/api/nj/findAllXxXqNjTree");
};
export const findAllNjBjTree = async () => {
return await get("/api/nj/findAllNjBjTree");
};
export const jsConfirmJsDataApi = async (params: any) => {
return await post("/api/js/confirmJsData", params);
};
@ -71,14 +74,21 @@ export const jsdXkkcSaveApi = async (params: any) => {
export const jsdXkXsListApi = async (params: any) => {
return await get("/mobile/js/xkxs/list", params);
};
//根据年级ID和班级ID查询学生及家长信息
export const mobilejlstudentListApi = async (params: any) => {
return await get("/mobile/jl/studentList", params);
};
//根据年级ID、关联年级名称ID和学生ID查询家长接龙信息
export const mobilejllistApi = async (params: any) => {
const res = await get("/mobile/jl/list", params);
return res.result;
};
//根据jlId查询接龙列表数据
export const getByJlIdApi = async (params: any) => {
const res = await get("/mobile/jl/getByJlId", params);
return res.result;
};
// 提交点名信息
export const jsdXkdmListApi = async (params: any) => {
@ -105,6 +115,11 @@ export const xsQjSpApi = async (params: any) => {
return await post("/api/xsQj/sp", params);
};
// 获取所有班级
export const bjFindAllApi = async (params: any) => {
return await get("/api/bj/findAll", params);
};
// 获取学生列表
export const xsFindList = async (params: any) => {
return await get("/api/xs/findPage", params);
@ -131,4 +146,27 @@ export const resourcesAddNumByTypeApi = async (params: any) => {
// 接龙相关API
// 根据ID获取接龙详情
export const jlFindByIdApi = async (params: { id: string }) => {
return await get("/api/jl/findById", params);
};
// 保存接龙(新增/编辑)
export const jlSaveApi = async (params: any) => {
return await post("/api/jl/save", params);
};
// 根据接龙ID查询接龙执行情况学生列表
export const jlzxFindByJlParamsApi = async (params: { jlId: string }) => {
return await get("/api/jlzx/findByJlParams", params);
};
// 保存接龙消息推送
export const xxtsSaveByJlzxParamsApi = async (params: { jlId: string }) => {
return await post("/api/xxts/saveByJlzxParams", params);
};

View File

@ -15,23 +15,23 @@
<view class="tki-tree-item"
v-if="item.show"
:style="[{
paddingLeft: item.rank*15 + 'px',
zIndex: item.rank*-1 +50
}]"
paddingLeft: item.rank*15 + 'px',
zIndex: item.rank*-1 +50
}]"
:class="{
border: border === true,
show: item.show,
last: item.lastRank,
showchild: item.showChild,
open: item.open,
}">
border: border === true,
show: item.show,
last: item.lastRank,
showchild: item.showChild,
open: item.open,
}">
<view class="tki-tree-label" @tap.stop="_treeItemTap(item, index)">
<image class="tki-tree-icon"
:src="item.lastRank ? lastIcon : item.showChild ? currentIcon : defaultIcon"></image>
{{ item.name }}
</view>
<view class="tki-tree-check" @tap.stop="_treeItemSelect(item, index)"
v-if="selectParent?true:item.lastRank">
<!-- 多选时所有节点都显示多选框 -->
<view class="tki-tree-check" v-if="multiple" @tap.stop="_treeItemSelect(item, index)">
<view class="tki-tree-check-yes" v-if="item.checked" :class="{'radio':!multiple}"
:style="{'border-color':confirmColor}">
<view class="tki-tree-check-yes-b" :style="{'background-color':confirmColor}"></view>
@ -96,7 +96,7 @@ export default {
},
currentIcon: { // ic
type: String,
default: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFEAAABRCAYAAACqj0o2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MEQ0QTM0MzQ1Q0RBMTFFOUE0MjY4NzI1Njc1RjI1ODIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MEQ0QTM0MzU1Q0RBMTFFOUE0MjY4NzI1Njc1RjI1ODIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowRDRBMzQzMjVDREExMUU5QTQyNjg3MjU2NzVGMjU4MiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowRDRBMzQzMzVDREExMUU5QTQyNjg3MjU2NzVGMjU4MiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PidwepsAAAK0SURBVHja7JxbTsJAFIYHww7ciStgCeoGvGxAiOsgURegoL5720AXYLiIr0aJviq3Zx3PhIEnKG3ndtr+f3KixrSUj/ZjzjClIqUUiFm2gAAQAREQEUAEREAERAQQAREQAREBREAEREBEEqa67h9RFDWllDv0awWYlqlQHmu1WjMRRMoV1QFttA12y3xRtdNczq8EsE4/f8FumX2q77ROvNXk8UGMEKdUz6tYJHljaZAbuyUH+UR1to5BEohTuqwPCeS4pAA/qY6o/kyHOAMCeRK3owJnj+rH1jjxhqpVsstaebCz6TmnHWyXyY+xHjSBWBY/bvSgadtXBj9u9KCN3rnIfkzkQVsTEEX0Y2IP2oKo/HhMICcFAThUcwVZNGU6FdbX/XURzkbVF4+ybGhjPrFdgP66QdXNurGtSdk6Xdb9nAJ8oDo3OQlsQZzkdPw41ONBo6vI5scDefRjZg+6gpg3Pxp50CXEvPjR2IOuIXL3oxUPuobI3Y9WPOgDIlc/WvOgL4iL/vqFCcD7LH0xB4hj7cfQ/fWH9qCT+FhG0tN+DBk1PzjOM0SVllixcsBT1AvYc/kAPhc0hRg/3uvxoCgKRN9+dOrBUBB9+9GpB0NC9OVH5x4MDdG1H714kANEV3705kEOEBf9dcPi/lQnsuvLg1wgSu3Ha0v7Uh4MMgUXeuG71H407a+VBy9CPQkOdw+MtB+nGbd/D+FBbhBNxo9SjwcngJjNj0E9yBFiFj8G9SBXiGn8GNyDnCEm8SMLD3KHGOdHNh7kDjHOj2w8mAeIi/5arX+c6b/fxHz9oADEdGdjR/fXCw/OOB5oVfCOgnepz8IB14PMw03jCmTE+QBx5z0gAmKSqK9OUF+hcAeIhu/QYr4Qie8rjW83hhMBERARQAREQAREBBABERCLnH8BBgA+TQI7U4t53AAAAABJRU5ErkJggg=='
default: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFEAAABRCAYAAACqj0o2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MEQ0QTM0MzQ1Q0RBMTFFOUE0MjY4NzI1Njc1RjI1ODIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MEQ0QTM0MzU1Q0RBMTFFOUE0MjY4NzI1Njc1RjI1ODIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY9aW5zdGFuY2VJRD0ieG1wLmlpZDowRDRBMzQzMjVDREExMUU5QTQyNjg3MjU2NzVGMjU4MiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowRDRBMzQzMzVDREExMUU5QTQyNjg3MjU2NzVGMjU4MiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PidwepsAAAK0SURBVHja7JxbTsJAFIYHww7ciStgCeoGvGxAiOsgURegoL5720AXYLiIr0aJviq3Zx3PhIEnKG3ndtr+f3KixrSUj/ZjzjClIqUUiFm2gAAQAREQEUAEREAERAQQAREQAREBREAEREBEEqa67h9RFDWllDv0awWYlqlQHmu1WjMRRMoV1QFttA12y3xRtdNczq8EsE4/f8FumX2q77ROvNXk8UGMEKdUz6tYJHljaZAbuyUH+UR1to5BEohTuqwPCeS4pAA/qY6o/kyHOAMCeRK3owJnj+rH1jjxhqpVsstaebCz6TmnHWyXyY+xHjSBWBY/bvSgadtXBj9u9KCN3rnIfkzkQVsTEEX0Y2IP2oKo/HhMICcFAThUcwVZNGU6FdbX/XURzkbVF4+ybGhjPrFdgP66QdXNurGtSdk6Xdb9nAJ8oDo3OQlsQZzkdPw41ONBo6vI5scDefRjZg+6gpg3Pxp50CXEvPjR2IOuIXL3oxUPuobI3Y9WPOgDIlc/WvOgL4iL/vqFCcD7LH0xB4hj7cfQ/fWH9qCT+FhG0tN+DBk1PzjOM0SVllixcsBT1AvYc/kAPhc0hRg/3uvxoCgKRN9+dOrBUBB9+9GpB0NC9OVH5x4MDdG1H714kANEV3705kEOEBf9dcPi/lQnsuvLg1wgSu3Ha0v7Uh4MMgUXeuG71H407a+VBy9CPQkOdw+MtB+nGbd/D+FBbhBNxo9SjwcngJjNj0E9yBFiFj8G9SBXiGn8GNyDnCEm8SMLD3KHGOdHNh7kDjHOj2w8mAeIi/5arX+c6b/fxHz9oADEdGdjR/fXCw/OOB5oVfCOgnepz8IB14PMw03jCmTE+QBx5z0gAmKSqK9OUF+hcAeIhu/QYr4Qie8rjW83hhMBERARQAREQAREBBABERCLnH8BBgA+TQI7U4t53AAAAABJRU5ErkJggg=='
},
defaultIcon: { // ic
type: String,
@ -197,11 +197,35 @@ export default {
}
})
},
//
_isAllChildrenChecked(item) {
const children = this.treeList.filter(v => v.parentId[v.parentId.length - 1] === item.id && v.lastRank);
return children.length > 0 && children.every(child => child.checked);
},
//
_setAllChildrenChecked(item, checked) {
this.treeList.forEach(v => {
if (v.parentId[v.parentId.length - 1] === item.id && v.lastRank) {
v.checked = checked;
}
});
},
//
_updateParentChecked(item) {
if (!item.parentId.length) return;
const parentId = item.parentId[item.parentId.length - 1];
const parent = this.treeList.find(v => v.id === parentId);
if (parent) {
parent.checked = this._isAllChildrenChecked(parent);
this._updateParentChecked(parent); //
}
},
//
_treeItemTap(item, index) {
if (item.lastRank === true) {
//
this.treeList[index].checked = !this.treeList[index].checked
this._updateParentChecked(item);
this._fixMultiple(index)
return;
}
@ -253,8 +277,23 @@ export default {
// console.log(this.treeList)
},
_treeItemSelect(item, index) {
this.treeList[index].checked = !this.treeList[index].checked
this._fixMultiple(index)
if (this.multiple) {
if (!item.lastRank) {
// /
const allChecked = this._isAllChildrenChecked(item);
this._setAllChildrenChecked(item, !allChecked);
item.checked = !allChecked;
} else {
//
this.treeList[index].checked = !this.treeList[index].checked;
this._updateParentChecked(item);
}
this._fixMultiple(index);
} else {
//
this.treeList[index].checked = !this.treeList[index].checked;
this._fixMultiple(index);
}
},
//
_fixMultiple(index) {

View File

@ -132,7 +132,6 @@ const handleGetCode = async () => {
return;
}
console.log("获取验证码,手机号:", formData.phone);
const result = await sendCodeApi({
phone: formData.phone,
});
@ -199,7 +198,7 @@ const handleVerify = async () => {
if (findJsByPhoneResult.resultCode == 1 && findJsByPhoneResult.result) {
// jsData
setJs(findJsByPhoneResult.result);
console.log("教师信息已存储到jsData:", findJsByPhoneResult.result);
}
} catch (error) {
console.error("获取教师信息失败:", error);

View File

@ -120,7 +120,6 @@ onLoad(async (options) => {
try {
const stuRes = await jlzxFindByJlParamsApi({ jlId: noticeId.value });
studentList.value = stuRes?.rows || stuRes?.result || [];
console.log("学生列表数据:", studentList.value);
} catch (e) {
uni.showToast({ title: "加载学生状态失败", icon: "none" });
}

View File

@ -27,25 +27,27 @@
>范围: {{ data.njmc + data.bjmc }}</text
>
<view class="footer-actions">
<u-button
class="footer-btn"
type="primary"
size="mini"
<u-icon
name="list"
size="22"
color="#409EFF"
@click="goToFeedback(data.id)"
>接龙情况</u-button>
<u-button
class="footer-action-icon"
/>
<u-icon
v-if="data.jlStatus === 'A'"
class="footer-btn"
type="warning"
size="mini"
name="arrow-right"
size="22"
color="#FFA726"
@click="goToPush(data.id)"
>消息推送</u-button>
class="footer-action-icon"
/>
</view>
</view>
</view>
</template>
<template #bottom>
<view class="white-bg-color py-5">
<view class="flex-row items-center pb-10 pt-5">
<u-button
text="新增接龙"
@ -54,7 +56,6 @@
@click="goToPublish"
/>
</view>
</view>
</template>
</BasicListLayout>
<!-- 用uniqueList渲染 -->
@ -166,124 +167,229 @@ onShow(() => {
<style scoped lang="scss">
.jl-list-page {
position: relative; // FAB
min-height: 100vh; // FAB
position: relative;
min-height: 100vh;
background-color: #f5f7fa;
padding: 12px;
box-sizing: border-box;
}
.jl-card {
background-color: #ffffff;
border-radius: 8px;
padding: 15px;
border-radius: 12px;
padding: 16px;
margin-bottom: 12px;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05);
border-left: 4px solid #447ade; //
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);
border: 1px solid #f0f0f0;
transition: all 0.3s ease;
position: relative;
overflow: hidden;
&:active {
transform: translateY(1px);
box-shadow: 0 1px 6px rgba(0, 0, 0, 0.12);
}
&::before {
content: '';
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 4px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border-radius: 2px;
}
}
.card-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-bottom: 8px;
margin-bottom: 12px;
gap: 12px;
.jl-title {
font-size: 16px;
font-weight: bold;
color: #333;
font-weight: 600;
color: #2c3e50;
flex: 1;
margin-right: 10px;
//
line-height: 1.4;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
word-break: break-word;
}
.jl-status {
font-size: 12px;
padding: 2px 6px;
border-radius: 4px;
font-size: 11px;
padding: 4px 8px;
border-radius: 12px;
color: #fff;
white-space: nowrap;
flex-shrink: 0;
font-weight: 500;
letter-spacing: 0.5px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
&.status-published {
background-color: #BE193FFF; // -
background: linear-gradient(135deg, #ff6b6b 0%, #ee5a52 100%);
}
&.status-draft {
background-color: #ff9f0a; // -
background: linear-gradient(135deg, #ffa726 0%, #ff9800 100%);
}
&.status-ended {
background-color: #19be4d; // 绿-
background: linear-gradient(135deg, #66bb6a 0%, #4caf50 100%);
}
}
}
.card-body {
// ()
margin-bottom: 12px;
.cover-thumbnail {
width: 80px;
height: 60px;
border-radius: 4px;
margin-right: 10px;
float: left; //
border-radius: 8px;
margin-right: 12px;
float: left;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
object-fit: cover;
}
.jl-excerpt {
font-size: 14px;
color: #666;
line-height: 1.5;
// 3
color: #5a6c7d;
line-height: 1.6;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
word-break: break-word;
}
}
.card-footer {
display: flex;
flex-wrap: wrap;
gap: 5px 15px;
gap: 8px 16px;
align-items: center;
padding-top: 12px;
border-top: 1px solid #f0f0f0;
.footer-item {
white-space: nowrap;
font-size: 14px;
color: #666;
font-size: 13px;
color: #7f8c8d;
overflow: hidden;
text-overflow: ellipsis;
max-width: 180px;
display: flex;
align-items: center;
&::before {
content: '';
width: 4px;
height: 4px;
background-color: #bdc3c7;
border-radius: 50%;
margin-right: 6px;
flex-shrink: 0;
}
}
.footer-actions {
display: flex;
justify-content: flex-end;
align-items: center;
gap: 4px;
gap: 18px;
width: 100%;
flex-basis: 100%; /* 独占一行 */
margin-top: 6px;
flex-basis: 100%;
margin-top: 8px;
padding: 0;
background: none;
border: none;
}
.footer-btn {
min-width: 60px;
width: auto;
.footer-action-icon {
cursor: pointer;
transition: transform 0.1s;
background: none !important;
border: none !important;
padding: 0 !important;
margin: 0 !important;
}
.footer-action-icon:active {
transform: scale(0.92);
}
}
//
.white-bg-color {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border-radius: 16px;
margin: 16px 12px;
padding: 16px;
box-shadow: 0 4px 16px rgba(102, 126, 234, 0.3);
.flex-row {
justify-content: center;
}
.u-button {
background: rgba(255, 255, 255, 0.9);
color: #667eea;
border: none;
font-weight: 600;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
transition: all 0.3s ease;
&:active {
background: rgba(255, 255, 255, 1);
transform: translateY(1px);
}
}
}
//
@media (max-width: 375px) {
.jl-list-page {
padding: 8px;
}
.jl-card {
padding: 12px;
margin-bottom: 8px;
}
.card-header .jl-title {
font-size: 15px;
}
.card-footer .footer-item {
max-width: 150px;
font-size: 12px;
padding: 0 12px;
flex: none;
margin: 0;
}
}
// FAB - DragButton
.fab-button {
width: 50px;
height: 50px;
background-color: #4477ee;
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2);
//
.jl-card {
animation: fadeInUp 0.3s ease-out;
}
/* 空列表样式已由 BasicListLayout 组件处理,移除此样式 */
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
</style>

View File

@ -204,12 +204,16 @@
</view>
<scroll-view scroll-y class="student-modal-content">
<view class="all-student-tags">
<text
<view
v-for="(name, index) in formData.targetNames"
:key="name + index"
class="student-tag"
>{{ name }}</text
class="student-tag-container"
>
<text class="student-tag">{{ name }}</text>
<view class="delete-btn" @click="removeStudent(index)">
<uni-icons type="closeempty" size="12" color="#999"></uni-icons>
</view>
</view>
</view>
</scroll-view>
</view>
@ -224,8 +228,7 @@ import CustomUpload from "/src/components/BasicUpload/CustomUpload.vue";
import BasicTree from "@/components/BasicTree/Tree.vue";
import { attachmentUpload } from "@/api/system/upload";
import { imagUrl } from "@/utils";
import { findAllNjBjTree, mobilejlstudentListApi } from "@/api/base/server";
import { post, get } from "@/utils/request";
import { findAllNjBjTree, mobilejlstudentListApi, jlFindByIdApi, jlSaveApi } from "@/api/base/server";
import { useUserStore } from "@/store/modules/user";
interface Attachment {
@ -244,6 +247,7 @@ interface FormData {
targetClass: string;
targetNames: string[];
targetStudentIds: string[];
xsIdList: string[]; // ID
targetNjIds: string[]; // ID
targetNjmcIds: string[]; // ID
targetBjIds: string[]; // ID
@ -262,6 +266,7 @@ const formData = reactive<FormData>({
targetClass: "",
targetNames: [],
targetStudentIds: [],
xsIdList: [],
targetNjIds: [],
targetNjmcIds: [],
targetBjIds: [],
@ -307,11 +312,8 @@ const loadTreeData = async () => {
};
treeData.value = convertTreeData(res.result);
console.log("树形数据加载成功:", treeData.value);
console.log("原始树形数据结构:", JSON.stringify(res.result, null, 2));
}
} catch (error) {
console.error("加载树形数据失败:", error);
uni.showToast({ title: "加载班级数据失败", icon: "error" });
}
};
@ -319,32 +321,8 @@ const loadTreeData = async () => {
//
loadTreeData();
const fetchStudentsByClass = async (className: string): Promise<string[]> => {
console.log(`模拟获取班级 [${className}] 的学生列表...`);
isLoadingStudents.value = true;
await new Promise((resolve) => setTimeout(resolve, 400));
const mockStudents = [
"施延兴",
"安苒溪",
"罗浩晨",
"康萌",
"范文昊",
"丁贺祥",
"韦运昊",
"萧润丽",
"谢林",
"鲍泽远",
"杨俊",
];
isLoadingStudents.value = false;
return mockStudents;
};
onLoad((options) => {
console.log("页面加载参数:", options);
// ID
if (options.id) {
noticeId.value = options.id;
@ -354,16 +332,9 @@ onLoad((options) => {
//
onShow(() => {
console.log("页面显示,当前状态:", {
publishedJlId: publishedJlId.value,
formDataId: formData.id,
isPublishing: isPublishing.value
});
// ID
//
if (publishedJlId.value && !noticeId.value) {
console.log("检测到从推送清单页面返回,重置表单状态");
resetForm();
}
});
@ -380,6 +351,7 @@ const resetForm = () => {
targetClass: "",
targetNames: [],
targetStudentIds: [],
xsIdList: [],
targetNjIds: [],
targetNjmcIds: [],
targetBjIds: [],
@ -406,8 +378,6 @@ const resetForm = () => {
}
}
});
console.log("表单已重置,包括封面:", formData.coverImage);
};
// 使
@ -416,7 +386,7 @@ const loadJlData = async (jlId: string) => {
uni.showLoading({ title: "加载数据中..." });
//
const response = await get(`/api/jl/findById?id=${jlId}`);
const response = await jlFindByIdApi({ id: jlId });
if (response && response.resultCode === 1 && response.result) {
const jlData = response.result;
@ -461,7 +431,6 @@ const loadJlData = async (jlId: string) => {
}
} catch (error) {
uni.hideLoading();
console.error("加载接龙数据失败:", error);
uni.showToast({ title: "加载数据失败", icon: "error" });
}
};
@ -602,7 +571,6 @@ const getAttachmentIcon = (type: string): string => {
};
const previewAttachment = (attachment: Attachment) => {
console.log("预览附件:", attachment);
//
if (attachment.type === "image") {
const fullUrl = imagUrl(attachment.url);
@ -627,8 +595,6 @@ const showClassTree = () => {
//
const onTreeConfirm = async (selectedItems: any[]) => {
console.log("选择的班级:", selectedItems);
console.log("完整的 selectedItems 数据:", JSON.stringify(selectedItems, null, 2));
if (selectedItems.length > 0) {
//
@ -653,7 +619,6 @@ const onTreeConfirm = async (selectedItems: any[]) => {
// parents
if (item.parents && item.parents.length > 0) {
const parent = item.parents[0]; //
console.log("年级信息:", parent);
const njId = parent.key; // IDparents[0].key
const njmcId = parent.njmcId; // ID
@ -669,9 +634,6 @@ const onTreeConfirm = async (selectedItems: any[]) => {
bjIds.push(bjId);
gradeNames.push(gradeName);
console.log(
`选择班级: ${item.title}, 年级ID: ${njId}, 年级名称ID: ${njmcId}, 班级ID: ${bjId}, 年级名称: ${gradeName}`
);
} else {
console.warn("年级信息不完整,跳过该班级:", item);
}
@ -691,19 +653,6 @@ const onTreeConfirm = async (selectedItems: any[]) => {
return;
}
//
const uniqueGradeNames = [...new Set(gradeNames)];
if (uniqueGradeNames.length > 1) {
uni.hideLoading();
const gradeList = uniqueGradeNames.join("、");
uni.showToast({
title: `不能跨年级选择发布班级,已选择:${gradeList}`,
icon: "none",
duration: 4000
});
return; //
}
if (njIds.length > 0 && bjIds.length > 0) {
// ID
const uniqueNjIds = [...new Set(njIds)];
@ -737,6 +686,8 @@ const onTreeConfirm = async (selectedItems: any[]) => {
(student: any) =>
student.id || student.xsId || student.studentId || ""
);
// xsIdListID
formData.xsIdList = formData.targetStudentIds;
} else {
throw new Error("获取学生列表失败");
}
@ -751,15 +702,13 @@ const onTreeConfirm = async (selectedItems: any[]) => {
console.error("获取学生列表失败:", error);
uni.hideLoading();
uni.showToast({ title: "获取学生列表失败", icon: "error" });
// 使
formData.targetNames = await fetchStudentsByClass(formData.targetClass);
}
}
};
//
const onTreeCancel = () => {
console.log("取消选择班级");
};
//
@ -772,6 +721,16 @@ const closeStudentModal = () => {
showStudentModal.value = false;
};
//
const removeStudent = (index: number) => {
// ID
formData.targetNames.splice(index, 1);
formData.targetStudentIds.splice(index, 1);
// xsIdList
formData.xsIdList = [...formData.targetStudentIds];
uni.showToast({ title: "已移除学生", icon: "success" });
};
const handleSignatureChange = (e: any) => {
const index = e.detail.value;
formData.signatureRequired = index == 1;
@ -846,16 +805,6 @@ const buildJlDto = (status: string) => {
const user = userData.value;
const js = jsData.value;
console.log("=== 用户信息调试 ===");
console.log("userData.value:", user);
console.log("jsData.value:", js);
console.log("user?.id:", user?.id);
console.log("user?.loginName:", user?.loginName);
console.log("user?.name:", user?.name);
console.log("js?.id:", js?.id);
console.log("js?.jsxm:", js?.jsxm);
console.log("==================");
return {
id: formData.id || "", // ID
jlmc: formData.title.trim(), //
@ -865,9 +814,10 @@ const buildJlDto = (status: string) => {
jlkstime: formatDate(formData.startTime), // yyyy-MM-dd HH:mm:ss
jljstime: formatDate(formData.endTime), // yyyy-MM-dd HH:mm:ss
mdqz: formData.signatureRequired ? "1" : "0", // 10
njId: formData.targetNjIds.length > 0 ? formData.targetNjIds[0] : "", // ID
njmcId: formData.targetNjmcIds.length > 0 ? formData.targetNjmcIds[0] : "", // ID
bjId: formData.targetBjIds, // ID
njId: formData.targetNjIds.join(","), // ID
njmcId: formData.targetNjmcIds.join(","), // ID
bjId: formData.targetBjIds.join(","), // ID
xsIdList: formData.xsIdList.join(","), // ID
jlFbr: js?.id || "", // IDjsData
jsxm: js?.jsxm || user?.loginName || user?.name || "", // 使jsDatajsxm使userDataloginNamename
createdUserId: user?.id ? parseInt(user.id) : null,
@ -887,10 +837,8 @@ const saveDraft = async () => {
// 稿 JlDto
const jlDto = buildJlDto("B"); // B
console.log("保存草稿数据:", jlDto);
//
const response = await post("/api/jl/save", jlDto);
const response = await jlSaveApi(jlDto);
uni.hideLoading();
@ -940,7 +888,6 @@ const saveDraft = async () => {
const previewNotice = () => {
if (!validateForm()) return;
console.log("预览通知", formData);
uni.showToast({ title: "预览功能待实现", icon: "none" });
};
@ -962,7 +909,7 @@ const publishNotice = async () => {
// ID
if (formData.id) {
try {
const response = await get(`/api/jl/findById?id=${formData.id}`);
const response = await jlFindByIdApi({ id: formData.id });
if (response && response.resultCode === 1 && response.result) {
const jlData = response.result;
if (jlData.jlStatus === 'A') {
@ -977,15 +924,18 @@ const publishNotice = async () => {
try {
isPublishing.value = true;
uni.showLoading({ title: "发布中..." });
uni.showLoading({ title: "发布中,请稍候..." });
// JlDto
const jlDto = buildJlDto("A"); // A
console.log("发布接龙数据:", jlDto);
//
const response = await post("/api/jl/save", jlDto);
//
const response = await Promise.race([
jlSaveApi(jlDto),
new Promise((_, reject) =>
setTimeout(() => reject(new Error("请求超时")), 300000) // 5
)
]);
uni.hideLoading();
@ -993,8 +943,6 @@ const publishNotice = async () => {
// ID使ID使ID
const jlId = response.result || response.data || jlDto.id;
console.log("发布成功接龙ID:", jlId, "完整响应:", response);
if (!jlId) {
console.error("发布成功但未获取到接龙ID");
uni.showToast({
@ -1032,12 +980,34 @@ const publishNotice = async () => {
uni.hideLoading();
console.error("发布接龙失败:", error);
//
//
if (error instanceof Error) {
uni.showToast({
title: error.message,
icon: "none"
});
if (error.message === "请求超时") {
uni.showToast({
title: "发布超时,请检查网络连接或稍后重试",
icon: "none",
duration: 3000
});
} else {
uni.showToast({
title: error.message,
icon: "none"
});
}
} else if (error && typeof error === 'object' && 'errMsg' in error) {
// uni-app
if (error.errMsg && error.errMsg.includes('timeout')) {
uni.showToast({
title: "请求超时,请检查网络连接或稍后重试",
icon: "none",
duration: 3000
});
} else {
uni.showToast({
title: error.errMsg || "发布失败,请重试",
icon: "error"
});
}
} else {
uni.showToast({
title: "发布失败,请重试",
@ -1531,14 +1501,42 @@ const publishNotice = async () => {
gap: 8px 10px;
}
.student-tag {
font-size: 13px;
padding: 6px 12px;
border-radius: 4px;
text-align: center;
.student-tag-container {
display: flex;
align-items: center;
background-color: #f4f4f5;
color: #909399;
border-radius: 4px;
padding: 6px 12px;
gap: 8px;
min-width: 60px;
box-sizing: border-box;
position: relative;
}
.student-tag {
font-size: 13px;
color: #909399;
flex: 1;
text-align: center;
}
.delete-btn {
cursor: pointer;
padding: 2px;
border-radius: 50%;
background-color: #e0e0e0;
display: flex;
align-items: center;
justify-content: center;
width: 16px;
height: 16px;
flex-shrink: 0;
&:active {
background-color: #ffcdd2;
.uni-icons {
color: #f44336 !important;
}
}
}
</style>

View File

@ -78,14 +78,11 @@ const studentList = ref<StudentInfo[]>([]);
const isPushing = ref(false);
onLoad((options) => {
console.log("推送清单页面参数:", options);
if (options.jlId && options.jlId !== 'null' && options.jlId !== 'undefined') {
jlId.value = options.jlId;
console.log("获取到接龙ID:", jlId.value);
loadStudentList();
} else {
console.error("缺少接龙ID参数或ID无效:", options.jlId);
uni.showToast({ title: "缺少接龙ID参数", icon: "error" });
setTimeout(() => {
uni.navigateBack();
@ -102,27 +99,16 @@ const loadStudentList = async () => {
uni.hideLoading();
console.log("接口返回数据:", response);
//
if (response && (response.rows || response.result)) {
// rows
const students = response.rows || response.result || [];
studentList.value = students;
console.log("学生列表加载成功,共", students.length, "名学生:", studentList.value);
} else {
console.warn("接口返回数据格式异常:", response);
// 使 response
if (Array.isArray(response)) {
studentList.value = response;
console.log("直接使用 response 作为学生列表,共", response.length, "名学生");
} else {
throw new Error("获取学生信息失败:数据格式异常");
}
throw new Error("获取学生信息失败:数据格式异常");
}
} catch (error) {
uni.hideLoading();
console.error("加载学生列表失败:", error);
uni.showToast({
title: error instanceof Error ? error.message : "加载学生信息失败",
icon: "error"
@ -167,7 +153,6 @@ const handleConfirmPush = async () => {
} catch (error) {
uni.hideLoading();
isPushing.value = false;
console.error("推送失败:", error);
uni.showToast({
title: error instanceof Error ? error.message : "推送失败,请重试",
icon: "error"

View File

@ -84,6 +84,7 @@ export function get<T = any>(
method: "GET",
dataType: "json",
responseType: "text",
timeout: 30000, // 设置30秒超时
},
options
)
@ -105,6 +106,14 @@ export function get<T = any>(
}
}
}
}).catch((error) => {
// 处理超时错误
if (error.errMsg && error.errMsg.includes('timeout')) {
showToast("请求超时,请检查网络连接或稍后重试");
} else {
showToast(error.message || "请求失败");
}
reject(error);
});
});
}
@ -124,6 +133,7 @@ export function post<T = any>(
method: "POST",
dataType: "json",
responseType: "text",
timeout: 300000, // 设置5分钟超时
},
options
)
@ -145,6 +155,14 @@ export function post<T = any>(
}
}
}
}).catch((error) => {
// 处理超时错误
if (error.errMsg && error.errMsg.includes('timeout')) {
showToast("请求超时,请检查网络连接或稍后重试");
} else {
showToast(error.message || "请求失败");
}
reject(error);
});
});
}