This commit is contained in:
2025-10-31 15:27:11 +08:00
5 changed files with 1632 additions and 2 deletions

View File

@@ -0,0 +1,84 @@
import request from '@/utils/request'
// 查询宿舍学生关联列表
export function listStudent(query) {
return request({
url: '/dormitory/srs-dormitory-student/checkInInformation',
method: 'get',
params: query
})
}
// 新增宿舍学生关联
export function addStudent(data) {
return request({
url: '/dormitory/srs-dormitory-student/addCheckInInformation',
method: 'post',
data: data
})
}
// 获取校区
export function listAllCampus() {
return request({
url: '/dormitory/dms-dormitory/listAllCampus',
method: 'get'
})
}
// 根据校区id获取园区
export function listParkByCampus(id) {
return request({
url: '/dormitory/dms-dormitory/listParkByCampus/' + id,
method: 'get'
})
}
// 根据园区id获取楼栋
export function listBuildingByPark(id) {
return request({
url: '/dormitory/dms-dormitory/listBuildingByPark/' + id,
method: 'get'
})
}
// 根据楼栋id获取楼层
export function listFloorByBuilding(id) {
return request({
url: '/dormitory/dms-dormitory/listFloorByBuilding/' + id,
method: 'get'
})
}
// 根据楼层id获取宿舍号
export function listAllRoomByFloor(id) {
return request({
url: '/dormitory/dms-dormitory/listAllRoomByFloor/' + id,
method: 'get'
})
}
// 修改证件照
export function submitOwnInfo(data){
return request({
url:'/comprehensive/extraInfo/submitOwnInfo',
method:'POST',
data
})
}
// 查询年级列表
export function listGrade(query = null) {
return request({
url: '/cph/grade/list',
method: 'get',
params: query
})
}
// 查询学院名称
export function getDeptName() {
return request({
url: '/system/dept/name'
})
}

View File

@@ -209,8 +209,7 @@
"navigationBarBackgroundColor": "#1890FF",
"navigationBarTextStyle": "white"
}
},
{
}, {
"path": "pages/record/record",
"style": {
"navigationBarTitleText": "住宿记录",
@@ -218,6 +217,22 @@
"navigationBarBackgroundColor": "#1890FF",
"navigationBarTextStyle": "white"
}
}, {
"path": "pages/dormitory/studentDormInfo/index",
"style": {
"navigationBarTitleText": "学生入住信息收集",
"enablePullDownRefresh": false,
"navigationBarBackgroundColor": "#1890FF",
"navigationBarTextStyle": "white"
}
}, {
"path": "pages/dormitory/studentDormInfo/informationCollection",
"style": {
"navigationBarTitleText": "信息收集",
"enablePullDownRefresh": false,
"navigationBarBackgroundColor": "#1890FF",
"navigationBarTextStyle": "white"
}
}, {
"path": "pages/addapply/addapply",
"style": {

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,510 @@
<template>
<view class="form-container">
<view class="form-title">2025-2026学年学生宿舍入住收集表</view>
<view class="form-desc">涉及住宿费核算请同学们按照实际入住情况填写</view>
<!-- 1. 校区 -->
<view class="form-item">
<view class="item-label">
<text class="required">*</text>校区
</view>
<picker @change="handleCampusChange" :range="campusOptions" :range-key="'name'">
<view class="picker-input">{{ form.campusName || '请选择校区' }}</view>
</picker>
</view>
<!-- 2. 园区 -->
<view class="form-item" v-if="form.campusName">
<view class="item-label">
<text class="required">*</text>园区
</view>
<picker @change="handleParkChange" :range="parkOptions" :range-key="'name'">
<view class="picker-input">{{ form.parkName || '请选择园区' }}</view>
</picker>
</view>
<!-- 3. 楼栋 -->
<view class="form-item" v-if="form.parkName">
<view class="item-label">
<text class="required">*</text>楼栋
</view>
<picker @change="handleBuildingChange" :range="buildingOptions" :range-key="'name'">
<view class="picker-input">{{ form.buildingName || '请选择楼栋' }}</view>
</picker>
</view>
<!-- 4. 下拉框 -->
<view class="form-item" v-if="form.buildingName">
<view class="item-label">
<text class="required">*</text>
</view>
<picker @change="handleFloorChange" :range="floorOptions" :range-key="'floor'">
<view class="picker-input">{{ form.floorName || '请选择楼层' }}</view>
</picker>
</view>
<!-- 5. 宿舍 -->
<view class="form-item" v-if="form.floorName">
<view class="item-label">
<text class="required">*</text>宿舍
</view>
<picker @change="handleDormChange" :range="dormOptions" :range-key="'displayText'">
<view class="picker-input">{{ form.roomNo || '请选择宿舍' }}</view>
</picker>
</view>
<!-- 6. 学生学号 -->
<view class="form-item">
<view class="item-label">
<text class="required">*</text>学生学号
</view>
<input class="input" v-model="form.stuNo" placeholder="请输入学生学号" />
</view>
<!-- 7. 是否为宿舍长 -->
<view class="form-item">
<view class="item-label">
<text class="required">*</text>是否为宿舍长
</view>
<picker @change="handleDormHeadChange" :range="dormHeadOptions">
<view class="picker-input">{{ form.isDormHead || '请选择' }}</view>
</picker>
</view>
<!-- 8. 入住时间 -->
<view class="form-item">
<view class="item-label">
<text class="required">*</text>入住时间
</view>
<picker mode="date" @change="handleCheckinTimeChange">
<view class="picker-input">{{ form.checkinTime || '请选择入住时间' }}</view>
</picker>
</view>
<!-- 9. 本人证件照 -->
<view class="form-item">
<view class="item-label">
<text class="required">*</text>本人证件照
</view>
<view class="item-desc">请上传本人证件照以便宿管阿姨能认识大家谢谢</view>
<view class="upload-btn" @click="handleUpload">
<text class="upload-icon">+</text>
<text>上传图片</text>
</view>
<view class="upload-tip">当前设置最多上传1张图片单个图片10MB以内</view>
<view class="upload-preview" v-if="form.photoData">
<image :src="form.photoData" mode="aspectFill" />
</view>
</view>
<!-- 提交按钮 -->
<button class="submit-btn" @click="handleSubmit">提交</button>
</view>
</template>
<script>
import {
listAllCampus,
listParkByCampus,
listBuildingByPark,
listFloorByBuilding,
listAllRoomByFloor,
addStudent,
submitOwnInfo as submitExtraInfo
} from "@/api/dms/studentDormInfo/index.js"
import {
getUserProfile
} from '@/api/system/user'
import {
previewImg
} from "@/utils/uploadImg.js"
import {
checkPic
} from "@/utils/checkPic.js"
import uploadFile from "@/plugins/upload.js";
export default {
data() {
return {
user: [],
form: {
campusName: '',
parkName: '',
buildingName: '',
floorName: '',
roomNo: '',
stuNo: '',
isDormitoryHead: '',
isDormHead: '',
checkinTime: '',
photo: '',
teacherName: '',
className: '',
deptName: '',
stuName: '',
displayText: '',
isInStudentsleep: '是',
photoData: ''
},
// 校区选项
campusOptions: [],
// 园区选项(按校区联动)
parkOptions: [],
// 楼栋选项(按园区联动)
buildingOptions: [],
// 楼层选项(下拉框)
floorOptions: [],
// 宿舍号选项(下拉框)
dormOptions: [],
// 宿舍长选项
dormHeadOptions: ['否', '是'],
// 当前选中项的id
selectedCampus: null, // 选中的校区({id, name}
selectedPark: null, // 选中的园区
selectedBuilding: null, // 选中的楼栋
selectedFloor: null, // 选中的楼层
selectedDorm: null, //选中的宿舍
};
},
onLoad() {
this.getUserProfile()
this.listAllCampus()
},
methods: {
// 获取用户信息
async getUserProfile() {
try {
const res = await getUserProfile()
this.user = res
this.form.stuNo = this.user.data.userName
console.log('当前用户信息:', res)
} catch (err) {
console.error('获取用户信息失败:', err)
}
},
// 获取校区数据
async listAllCampus() {
let res = await listAllCampus()
if (res.code == 200) {
this.campusOptions = [...res.data]
}
},
// 根据校区id获取园区
async listParkByCampus(id) {
let res = await listParkByCampus(id)
if (res.code == 200) {
this.parkOptions = [...res.data]
}
},
// 根据园区id获取楼栋
async listBuildingByPark(id) {
let res = await listBuildingByPark(id)
if (res.code == 200) {
this.buildingOptions = [...res.data]
}
},
// 根据楼栋id获取楼层
async listFloorByBuilding(id) {
let res = await listFloorByBuilding(id)
if (res.code == 200) {
this.floorOptions = [...res.data]
}
},
// 根据楼层id获取宿舍号
async listAllRoomByFloor(id) {
let res = await listAllRoomByFloor(id)
if (res.code == 200) {
this.dormOptions = [...res.data]
// 遍历数据,为每个对象添加 displayText 属性
this.dormOptions = res.data.map(v => ({
...v, // 保留原对象所有属性
// 新增拼接后的显示文本属性
displayText: `${v.roomNo} -- ${v.gender} -- 床位 ${v.bedNum} -- 已住 ${v.occupancy}`,
isFull: v.occupancy >= v.bedNum // 新增:判断是否满人
}));
}
},
// 校区选择变化
handleCampusChange(e) {
this.form.campusName = this.campusOptions[e.detail.value].name;
this.form.parkName = ''; // 重置园区
this.form.buildingName = ''; // 重置楼栋
this.form.floorName = ''; // 重置楼层
this.form.roomNo = ''; // 重置宿舍
// 获取选中的校区id
this.selectedCampus = this.campusOptions[e.detail.value].id;
// 获取对应校区下面的园区
this.listParkByCampus(this.selectedCampus)
},
// 园区选择变化
handleParkChange(e) {
this.form.parkName = this.parkOptions[e.detail.value].name;
this.form.buildingName = ''; // 重置楼栋
this.form.floorName = ''; // 重置楼层
this.form.roomNo = ''; // 重置宿舍
// 获取选中的园区的id
this.selectedPark = this.parkOptions[e.detail.value].id;
// 获取对应园区下面的楼栋
this.listBuildingByPark(this.selectedPark)
},
// 楼栋选择变化
handleBuildingChange(e) {
this.form.buildingName = this.buildingOptions[e.detail.value].name;
this.form.floorName = ''; // 重置楼层
this.form.roomNo = ''; // 重置宿舍
// 获取选中的楼栋的id
this.selectedBuilding = this.buildingOptions[e.detail.value].id;
// 获取选中的楼栋下面的楼层
this.listFloorByBuilding(this.selectedBuilding)
},
// 楼层选择变化(下拉框)
handleFloorChange(e) {
this.form.floorName = this.floorOptions[e.detail.value].floor;
this.form.roomNo = ''; // 重置宿舍
// 获取选中的楼层的id
this.selectedFloor = this.floorOptions[e.detail.value].id;
// 获取选中的楼层下面的宿舍号
this.listAllRoomByFloor(this.selectedFloor)
},
// 宿舍号选择变化(行拉框)
handleDormChange(e) {
const index = e.detail.value;
const selectedDorm = this.dormOptions[index]; // 获取选中的宿舍对象
// 判断是否满人
if (selectedDorm.isFull) {
// 满人时提示并重置选择
uni.showToast({
title: `宿舍 ${selectedDorm.roomNo} 已住满,无法选择`,
icon: 'none',
duration: 2000
});
// 重置宿舍选择(如果之前有选中值则保留,否则为空)
if (!this.form.roomNo) {
this.form.roomNo = '';
}
return;
}
// 未满人时正常选中
this.form.roomNo = selectedDorm.roomNo; // 显示拼接文本
this.selectedDorm = selectedDorm.id; // 存储宿舍ID用于提交
},
// 宿舍长选择变化
handleDormHeadChange(e) {
this.form.isDormitoryHead = this.dormHeadOptions[e.detail.value] == '是' ? 1 : 0;
this.form.isDormHead = this.dormHeadOptions[e.detail.value]
},
// 入住时间选择变化
handleCheckinTimeChange(e) {
this.form.checkinTime = e.detail.value;
},
// 证件照上传
handleUpload() {
uni.chooseImage({
count: 3,
success: async (img) => {
let bool = await checkPic(img.tempFiles[0]);
if (bool) {
uploadFile('/common/upload', img.tempFilePaths[0]).then((res) => {
// if (this.form.photo !== "") {
// this.form.photo = this.form.photo + "," + JSON.parse(res)
// .fileName;
// } else {
// this.form.photo = JSON.parse(res).fileName;
// }
this.form.photoData = img.tempFilePaths[0];
this.form.photo = JSON.parse(res).fileName;
})
}
}
})
},
// 提交表单
async handleSubmit() {
console.log(this.form);
// 验证必填项
if (
!this.form.campusName || // 校区名称字符串空则false
!this.form.parkName || // 园区名称字符串空则false
!this.form.buildingName || // 楼栋名称字符串空则false
(!this.form.floorName && this.form.floorName !== 0) || // 楼层数值排除0的误判
(!this.form.roomNo && this.form.roomNo !== 0) || // 宿舍号数值排除0的误判
!this.form.isDormHead || // 是否宿舍长(值为"是"/"否"
!this.form.checkinTime || // 入住时间日期字符串空则false
!this.form.photo // 证件照blob路径空则false若必填需加
) {
uni.showToast({
title: '带*号的为必填项,请填写完整',
icon: 'none',
duration: 2000
});
return;
}
this.form.dormitoryId = this.selectedDorm;
// 模拟提交
uni.showLoading({
title: '提交中...'
});
// 添加入住信息
let res = await addStudent(this.form);
if (res.code == 200) {
uni.hideLoading();
uni.showToast({
title: '提交成功',
icon: 'success'
});
// 上次图片头像
let data = submitExtraInfo({
userId: this.user.data.userId,
whitePhoto: this.form.photo
})
// if (data.code == 200) {
// console.log(data);
// }
setTimeout(() => {
// 重置表单
this.form = {
campusName: '',
parkName: '',
buildingName: '',
floorName: '',
roomNo: '',
stuNo: '',
isDormitoryHead: '',
checkinTime: '',
photo: ''
};
uni.redirectTo({
url: `/pages/dormitory/studentDormInfo/index`
})
}, 1000);
}
}
}
};
</script>
<style scoped lang="scss">
.form-container {
padding: 30rpx;
background-color: #fff;
min-height: 100vh;
}
.form-title {
font-size: 36rpx;
font-weight: bold;
text-align: center;
margin-bottom: 20rpx;
}
.form-desc {
font-size: 24rpx;
color: #666;
text-align: center;
margin-bottom: 40rpx;
}
.form-item {
margin-bottom: 40rpx;
}
.item-label {
font-size: 28rpx;
font-weight: 500;
color: #333;
margin-bottom: 16rpx;
display: flex;
align-items: center;
}
// 红色*号样式
.required {
color: #ff4d4f;
margin-right: 6rpx;
font-weight: bold;
}
.item-desc {
font-size: 24rpx;
color: #999;
margin-bottom: 20rpx;
}
// 下拉框样式
.picker-input {
width: 100%;
height: 80rpx;
border: 1px solid #eee;
border-radius: 8rpx;
display: flex;
align-items: center;
padding: 0 20rpx;
box-sizing: border-box;
font-size: 28rpx;
background-color: #f9f9f9;
}
// 输入框样式
.input {
width: 100%;
height: 80rpx;
border: 1px solid #eee;
border-radius: 8rpx;
padding: 0 20rpx;
box-sizing: border-box;
font-size: 28rpx;
}
// 图片上传样式
.upload-btn {
width: 200rpx;
height: 80rpx;
border: 1px dashed #ccc;
border-radius: 8rpx;
display: flex;
align-items: center;
justify-content: center;
gap: 10rpx;
font-size: 28rpx;
color: #666;
margin-bottom: 20rpx;
}
.upload-icon {
font-size: 40rpx;
font-weight: bold;
}
.upload-tip {
font-size: 22rpx;
color: #999;
margin-bottom: 20rpx;
}
.upload-preview {
width: 200rpx;
height: 200rpx;
border-radius: 8rpx;
overflow: hidden;
}
.upload-preview image {
width: 100%;
height: 100%;
}
// 提交按钮样式
.submit-btn {
width: 100%;
height: 90rpx;
background-color: #1890ff;
color: #fff;
font-size: 32rpx;
border-radius: 45rpx;
margin-top: 60rpx;
}
</style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB