c5_labsci/fapp/ciyon_ap/pages/lab/useradd.vue
2026-01-30 02:43:16 +08:00

296 lines
9.4 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>
<view class="ciy-page">
<view class="ciy-title mk bg2">
<view class="title">新增实验室成员</view>
<button class="btn def sm" @click="goBack">返回</button>
</view>
<view class="main bg4 flex1 overflow-auto px4 py3">
<form class="ciy-form-group">
<view class="ciy-form">
<label class="imp char4">姓名</label>
<input
type="text"
v-model="form.name"
placeholder="请输入成员姓名"
class="ciy-edit px2 py1 bg1 rounded"
required
/>
</view>
<view class="ciy-form">
<label class="char4">头像</label>
<view class="flex flex-center">
<image
:src="form.icon || '/lab/lab.png'"
mode="aspectFill"
class="w-12 h-12 rounded-full mr3"
></image>
<button class="btn def sm" @click="chooseAvatar">选择图片</button>
</view>
</view>
<view class="ciy-form">
<label class="char4">头衔</label>
<picker
mode="selector"
:range="titleOptions"
:range-key="'label'"
class="px2 py1 bg1 rounded w-full"
@change="handlePickerChange($event, 'usertitle')"
>
<view class="txt-left px2 py1">{{getPickerCurrentLabel('usertitle') }}</view>
</picker>
</view>
<view class="ciy-form">
<label class="imp char4">状态</label>
<picker
mode="selector"
:range="statusOptions"
:range-key="'label'"
class="px2 py1 bg1 rounded w-full"
@change="handlePickerChange($event, 'role')"
required
>
<view class="txt-left px2 py1">{{ getPickerCurrentLabel('role') }}</view>
</picker>
</view>
<view class="ciy-form">
<label class="char4">学历</label>
<picker
mode="selector"
:range="educationOptions"
:range-key="'label'"
class="px2 py1 bg1 rounded w-full"
@change="handlePickerChange($event, 'education')"
>
<view class="txt-left px2 py1">{{ getPickerCurrentLabel('education') }}</view>
</picker>
</view>
<view class="ciy-form">
<label class="char4">编号</label>
<input
type="text"
v-model="form.sn"
placeholder="如 LAB-2024-001"
class="ciy-edit px2 py1 bg1 rounded"
/>
</view>
<view class="ciy-form">
<label class="char4">性别</label>
<picker
mode="selector"
:range="sexOptions"
:range-key="'label'"
class="px2 py1 bg1 rounded w-full"
@change="handlePickerChange($event, 'sex')"
>
<view class="txt-left px2 py1">{{ getPickerCurrentLabel('sex') }}</view>
</picker>
</view>
<view class="ciy-form">
<label class="char4">加入日期</label>
<picker
mode="date"
v-model="form.addtimesText"
start="2000-01-01"
end="2100-12-31"
class="px2 py1 bg1 rounded w-full"
@change="handleDateChange"
>
<view class="txt-left px2 py1">{{ form.addtimesText || '请选择日期' }}</view>
</picker>
</view>
<view class="ciy-form">
<label class="char4">手机号</label>
<input
type="number"
v-model="form.mobile"
placeholder="请输入11位手机号"
class="ciy-edit px2 py1 bg1 rounded"
maxlength="11"
/>
</view>
<view class="ciy-form">
<label class="char4">邮箱</label>
<input
type="email"
v-model="form.email"
placeholder="请输入邮箱地址"
class="ciy-edit px2 py1 bg1 rounded"
/>
</view>
<view class="ciy-form">
<label class="char4">初始密码</label>
<input
type="password"
v-model="form.password"
placeholder="默认1"
class="ciy-edit px2 py1 bg1 rounded"
:value="form.password || '1'"
/>
</view>
</form>
<view class="ciy-form-bottom mt4">
<button
class="btn man lgg long"
@click="submitForm"
:disabled="isSubmitting"
>
{{ isSubmitting ? '提交中...' : '提交成员信息' }}
</button>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
isSubmitting: false,
form: {
laborgid: 0,
stpstatus: 10,
userlevel:10,
dvotecnt:0,
name: '',
icon: '',
usertitle: 0,
role: 30,
education: 50,
sn: '',
sex: 90,
addtimesText: '',
addtimes: 0,
mobile: '',
email: '',
password: '1'
},
titleOptions: [
{ value: 0, label: '无头衔' },
{ value: 10, label: '主任' },
{ value: 20, label: '副主任' },
{ value: 30, label: '顾问' },
{ value: 40, label: '名誉主任' },
{ value: 50, label: '教授' },
{ value: 60, label: '副教授' },
{ value: 70, label: '讲师' },
{ value: 80, label: '研究员' }
],
statusOptions: [
{ value: 10, label: '负责人' },
{ value: 20, label: '科研秘书' },
{ value: 30, label: '在册成员' },
{ value: 40, label: '历史成员' },
{ value: 50, label: '外部成员' }
],
educationOptions: [
{ value: 50, label: '本科' },
{ value: 60, label: '硕士' },
{ value: 70, label: '博士' }
],
sexOptions: [
{ value: 10, label: '男' },
{ value: 20, label: '女' },
{ value: 90, label: '其他' }
],
statusMap: { 10: '负责人', 20: '科研秘书', 30: '在册成员', 40: '历史成员', 50: '外部成员' },
educationMap: { 50: '本科', 60: '硕士', 70: '博士' },
sexMap: { 10: '男', 20: '女', 90: '其他' },
titleMap: { 0: '无头衔', 10: '主任', 20: '副主任', 30: '顾问', 40: '名誉主任', 50: '教授', 60: '副教授', 70: '讲师', 80: '研究员' }
};
},
methods: {
goBack() {
uni.navigateBack({ delta: 1 });
},
chooseAvatar() {
uni.chooseImage({
count: 1,
sizeType: ['original', 'compressed'],
sourceType: ['album', 'camera'],
success: (res) => {
const tempFilePath = res.tempFilePaths[0];
this.form.icon = tempFilePath;
}
});
},
handlePickerChange(e, type) {
const selectedIndex = Number(e.detail.value);
const optionMap = {
usertitle: this.titleOptions,
role: this.statusOptions,
education: this.educationOptions,
sex: this.sexOptions
};
const optionList = optionMap[type];
if (!optionList || !optionList[selectedIndex]) return;
this.form[type] = optionList[selectedIndex].value;
},
getPickerCurrentLabel(type) {
const optionMap = {
usertitle: this.titleOptions,
role: this.statusOptions,
education: this.educationOptions,
sex: this.sexOptions
};
const optionList = optionMap[type];
const currentValue = this.form[type];
if (!optionList) return '请选择';
// 3. 查找匹配项
const currentOption = optionList.find(item => item.value === currentValue);
// 4. 返回显示文本
return currentOption ? currentOption.label : '请选择';
},
handleDateChange(e) {
const selectedDate = e.detail.value;
this.form.addtimesText = selectedDate;
this.form.addtimes = new Date(selectedDate).getTime();
},
async submitForm() {
if (!this.form.name) {
return uni.showToast({ title: '请输入成员姓名', icon: 'none' });
}
if (!this.form.addtimes) {
return uni.showToast({ title: '请选择加入日期', icon: 'none' });
}
if (this.form.mobile && !/^1[3-9]\d{9}$/.test(this.form.mobile)) {
return uni.showToast({ title: '请输入有效的11位手机号', icon: 'none' });
}
if (this.form.email && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(this.form.email)) {
return uni.showToast({ title: '请输入有效的邮箱地址', icon: 'none' });
}
const postData = this.form;
try {
var retjson = await this.callfunc({
func: 'adduser.add',
data: postData
});
if (retjson.code !== 1) {
return uni.showToast({ title: retjson.msg || '新增成员失败', icon: 'none' });
}
uni.showToast({ title: '新增成员成功', icon: 'success' });
setTimeout(() => {
this.goBack();
}, 1500);
console.log('提交的成员信息:', this.form);
} catch (err) {
uni.showToast({ title: '提交失败,请重试', icon: 'none' });
console.error('新增成员失败:', err);
}
}
}
};
</script>
<style scoped>
/* 补充样式:适配表单布局 */
.ciy-edit {
width: 100%;
height: 2rem;
border: 1px solid var(--bg6);
border-radius: 0.3rem;
}
.w-12 { width: 3rem; }
.h-12 { height: 3rem; }
</style>