2025-08-27 21:02:29 +08:00

436 lines
12 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<BasicLayout>
<view class="page-container">
<view class="notice-box">
<text class="notice-text"
>特别提示家中家庭成员可多人关联可接收孩子在校情况学业情况等</text
>
</view>
<view
v-for="(student, index) in students"
:key="index"
class="form-section mb-15"
>
<view v-if="index > 0" class="remove-btn" @click="removeStudent(index)">
<u-icon name="minus-circle" color="#ff4d4f" size="18"></u-icon>
</view>
<view class="avatar-section">
<view class="avatar-uploader-container-rect">
<CustomUpload
@select="(event:any) => afterRead(event, index)"
@close="handleAvatarClose(index)"
:sourceType="['camera', 'album']"
:value="imagUrl(student.xstx)"
>
<view class="avatar-placeholder">
<view class="wh-full flex-col-center">
<svg
t="1729656215869"
class="icon"
viewBox="0 0 1024 1024"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
p-id="5302"
width="32"
height="32"
>
<path
d="M851.552 890.88 172.448 890.88c-74.592 0-135.296-60.672-135.296-135.296L37.152 370.752c0-74.624 60.672-135.328 135.296-135.328l132.16 0L302.912 195.904c0-34.624 28.192-62.816 62.816-62.816l302.016 0c29.408 0 53.312 23.904 53.312 53.312l0 49.024 130.464 0c74.592 0 135.296 60.672 135.296 135.328l0 384.832C986.816 830.208 926.144 890.88 851.552 890.88zM172.448 283.456c-48.128 0-87.296 39.168-87.296 87.328l0 384.832c0 48.128 39.168 87.296 87.296 87.296l679.104 0c48.128 0 87.296-39.168 87.296-87.296L938.848 370.752c0-48.16-39.168-87.328-87.296-87.328L716.8 283.424c-24.096 0-43.712-19.616-43.712-43.712L673.088 186.4c0-2.944-2.368-5.312-5.312-5.312l-302.016 0c-8.16 0-14.816 6.656-14.816 14.816L350.944 237.12c0 25.536-20.768 46.304-46.304 46.304L172.448 283.424zM512 755.84c-107.04 0-194.08-87.072-194.08-194.08S404.992 367.68 512 367.68s194.08 87.072 194.08 194.08S619.04 755.84 512 755.84zM512 415.68c-80.576 0-146.08 65.536-146.08 146.08S431.456 707.84 512 707.84s146.08-65.536 146.08-146.08S592.576 415.68 512 415.68zM816.8 438.016c-25.568 0-46.336-20.768-46.336-46.336s20.768-46.336 46.336-46.336 46.336 20.768 46.336 46.336S842.368 438.016 816.8 438.016zM816.8 390.016l-1.664 1.664c0 0.896 0.736 1.664 1.664 1.664L816.8 390.016z"
fill="#cdcdcd"
p-id="5303"
></path>
</svg>
</view>
</view>
</CustomUpload>
</view>
<text class="avatar-upload-note">上传学生人像用于校园进出</text>
</view>
<view class="student-info-form">
<u--form label-width="auto">
<u-form-item
label="姓名"
:prop="`students[${index}].xsxm`"
required
borderBottom
>
<u--input
v-model="student.xsxm"
placeholder="请输入学生姓名"
border="none"
inputAlign="right"
></u--input>
</u-form-item>
<!-- <u-form-item
label="与学生关系"
:prop="`students[${index}].jzxsgxId`"
required
borderBottom
>
<view @click="openDicPicker(student)" class="flex-row flex-1 justify-end">
<view v-if="!student.jzxsgxId" style="color: rgb(192, 196, 204);">请选择与学生关系</view>
<view v-else>{{ student.jzxsgxmc }}</view>
</view>
</u-form-item> -->
<u-form-item
label="身份证号"
:prop="`students[${index}].xssfzh`"
required
borderBottom
>
<u--input
v-model="student.xssfzh"
placeholder="请输入学生身份证号"
border="none"
inputAlign="right"
></u--input>
</u-form-item>
</u--form>
</view>
</view>
<view class="add-child-btn mb-15" @click="addMoreChildren">
<u-icon name="plus" color="#416AF2" size="20"></u-icon>
<text class="add-child-btn-text">新增多孩</text>
</view>
</view>
<template #bottom>
<view class="white-bg-color py-5">
<view class="flex-row items-center pb-10 pt-5">
<u-button text="提交" class="mx-15" type="primary" @click="submit" />
</view>
</view>
</template>
</BasicLayout>
</template>
<script lang="ts" setup>
import { hideLoading, showLoading, showToast } from "@/utils/uniapp";
import { ref } from "vue";
import { attachmentUpload } from "@/api/system/upload";
import CustomUpload from "/src/components/BasicUpload/CustomUpload.vue";
import { useForm } from "@/components/BasicForm/hooks/useForm";
import { glxsApi } from "@/api/base/server";
import { useUserStore } from "@/store/modules/user";
import { useDataStore } from "@/store/modules/data";
import {imagUrl} from "@/utils";
const { getGlobal, getAppCode } = useDataStore();
const { getUser, setUser, setCurXs } = useUserStore();
const dicOptions = ref<any>([[[]]]);
const dicPickerRef = ref();
const dicVal = ref<number[]>([]);
const students = ref([
{
xsxm: "",
xssfzh: "",
xstx: "",
jzxsgxId: "",
jzxsgxmc: ""
},
]);
const curXs = ref(students.value[0]);
const openDicPicker = (xs: any) => {
curXs.value = xs;
dicVal.value = [0];
for (let i = 0; i < dicOptions.value[0].length; i++) {
if (xs.jzxsgxId == dicOptions.value[0][i].dictionaryValue) {
dicVal.value = [i];
break;
}
}
dicPickerRef.value.open();
};
const dicChanged = (dicArr: any) => {
console.log(dicArr);
const dic = dicOptions.value[0][dicArr[0]];
curXs.value.jzxsgxId = dic.dictionaryValue;
curXs.value.jzxsgxmc = dic.dictionaryCode;
}
async function afterRead(event: any, index: number) {
if (!event.tempFilePaths || event.tempFilePaths.length === 0) {
showToast({ title: "图片选择失败", icon: "none" });
return;
}
const tempFilePath = event.tempFilePaths[0];
showLoading({ title: "上传中" });
try {
const res = await attachmentUpload(tempFilePath);
const result = res.result;
if (result && result.length > 0 && result[0].filePath) {
students.value[index].xstx = result[0].filePath;
console.log(`Student ${index} avatar uploaded:`, result[0].filePath);
showToast({ title: "上传成功" });
} else {
showToast({ title: "上传失败,请重试", icon: "none" });
console.error("Upload result format error:", result);
}
} catch (error) {
showToast({ title: "上传出错", icon: "none" });
console.error("Upload error:", error);
} finally {
hideLoading();
}
}
function handleAvatarClose(index: number) {
students.value[index].xstx = "";
}
function addMoreChildren() {
students.value.push({
xsxm: "",
xssfzh: "",
xstx: "",
jzxsgxId: "",
jzxsgxmc: ""
});
}
function removeStudent(index: number) {
if (students.value.length > 1) {
students.value.splice(index, 1);
} else {
showToast({ title: "至少需要一个子女信息", icon: "none" });
}
}
async function submit() {
for (const student of students.value) {
if (!student.xstx) {
showToast({ title: "请上传子女照片", icon: "none" });
return;
}
if (!student.xsxm) {
showToast({ title: "请输入子女姓名", icon: "none" });
return;
}
if (!student.xssfzh) {
showToast({ title: "请输入子女身份证号", icon: "none" });
return;
}
}
showLoading({ title: "提交中" });
try {
for (let i = 0; i < students.value.length; i++) {
students.value[i].jzxsgxId = getUser.jzxsgxId;
}
const res = await glxsApi({
xsList: students.value,
jzId: getUser.jzId,
openId: getGlobal.openId,
appCode: getAppCode,
});
hideLoading();
setUser(res.result);
for (let i = 0; i < res.result.xsList.length; i++) {
if (res.result.xsList[i].sfzh == students.value[0].xssfzh) {
setCurXs(res.result.xsList[i]);
break;
}
}
uni.reLaunch({
url: "/pages/base/home/index",
});
} catch (error) {
console.log(error);
}
}
onMounted(async () => {
console.log("glxs");
// const resDic = await dicApi({ pid: 1622287061 });
// dicOptions.value = [resDic.result];
// formSchema[1].componentProps.options = resDic.result;
// setSchema(formSchema);
});
</script>
<style lang="scss" scoped>
.page-container {
padding: 15px; /* Consistent padding */
}
.notice-box {
background-color: #fff1f0; /* Slightly lighter red */
padding: 12px 18px;
border-radius: 8px;
margin-bottom: 15px;
}
.notice-text {
color: #fa541c; /* Adjusted red color */
font-size: 13px;
}
.form-section {
background-color: #ffffff;
border-radius: 10px;
padding: 20px 20px 0 20px;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.06);
/* Added margin-bottom directly here for spacing between sections */
margin-bottom: 5px;
position: relative;
}
.avatar-section {
display: flex;
flex-direction: column;
align-items: center;
margin-bottom: 25px; /* Increased margin */
}
/* Keep avatar uploader styles relevant to CustomUpload */
/* Replace with rectangular styles */
.avatar-uploader-container-rect {
/* Assuming uni.rpx units based on class names like wi-180, he-240 */
width: 180rpx;
height: 240rpx;
margin: 0 auto 10px auto; /* mx-auto mb-10 */
border-radius: 6px; /* r-md approximation */
border: 1px solid #cccccc;
overflow: hidden;
display: flex;
justify-content: center;
align-items: center;
background-color: #fafafa;
}
/* Remove old circular styles */
/* .avatar-uploader-container { ... } */
.avatar-placeholder {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
cursor: pointer;
}
/* Keep inner placeholder for centering SVG */
.avatar-placeholder-inner {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.avatar-image {
width: 100%;
height: 100%;
object-fit: cover;
}
/* Remove old hint style */
/* .avatar-upload-hint { ... } */
.avatar-upload-note {
color: #999;
font-size: 13px;
}
.student-info-form {
margin-bottom: 20px; /* Restore original margin */
}
.form-title {
display: block;
font-size: 16px; /* Slightly larger title */
font-weight: 600; /* Bolder */
margin-bottom: 15px; /* Space below title */
}
/* Restore remove button style if needed, or adapt */
/* Updated remove button style */
.remove-btn {
position: absolute;
top: 10px; /* Closer to top edge */
right: 10px; /* Closer to right edge */
cursor: pointer;
z-index: 10;
/* Optional: add padding for easier clicking */
// padding: 5px;
}
.add-child-btn {
background-color: #ffffff;
border-radius: 10px;
padding: 15px; /* Increased padding */
display: flex;
justify-content: center;
align-items: center;
margin-top: 10px; /* Increased margin */
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.06);
cursor: pointer;
}
.add-child-btn-text {
color: #416af2;
margin-left: 8px;
font-size: 15px;
font-weight: 500;
}
/* Adjust uview form item styles */
::v-deep .u-form-item {
margin-bottom: 0; /* Remove default margin if any */
}
::v-deep .u-form-item__body {
padding: 15px 0 !important; /* Adjusted padding */
/* Align items vertically if label wraps */
// align-items: flex-start;
}
::v-deep .u-form-item__body__left {
/* Allow label to take necessary width, adjust as needed */
// flex: 0 0 80px;
}
::v-deep .u-form-item__body__left__text {
font-size: 15px;
color: #333;
line-height: 1.5; /* Improve line spacing if label wraps */
/* Ensure required asterisk is red and BEFORE the text */
display: flex; /* Use flex to control order */
align-items: center; /* Vertically center asterisk and text */
span {
color: #f56c6c;
/* Order asterisk first */
order: -1;
margin-right: 4px;
/* Adjust vertical alignment if needed */
// line-height: 1;
// display: inline-block;
// vertical-align: middle;
}
}
::v-deep .u-input {
text-align: right; /* Align input text to the right */
}
::v-deep .u-border-bottom {
/* Ensure border spans full width if needed, or adjust */
// left: 0 !important;
// right: 0 !important;
}
</style>