|
@@ -8,7 +8,7 @@
|
|
|
leftArrow
|
|
|
@click-left="handleClickLeft"
|
|
|
></wd-navbar>
|
|
|
- <view class="py20rpx">
|
|
|
+ <view class="py20rpx from">
|
|
|
<wd-form ref="form" :model="formData">
|
|
|
<view class="bg-white px32rpx py28rpx">
|
|
|
<customFormItem label="用户名称" required>
|
|
@@ -17,7 +17,8 @@
|
|
|
placeholder="请输入用户名称"
|
|
|
no-border
|
|
|
custom-class="inputClass"
|
|
|
- v-model:model-value="formData.username"
|
|
|
+ prop="realname"
|
|
|
+ v-model:model-value="formData.realname"
|
|
|
:rules="[{ required: true, message: '请输入用户名称' }]"
|
|
|
/>
|
|
|
</customFormItem>
|
|
@@ -28,6 +29,8 @@
|
|
|
placeholder="请选择归属部门"
|
|
|
no-border
|
|
|
custom-class="inputClass"
|
|
|
+ v-model:model-value="formData.deptName"
|
|
|
+ prop="deptName"
|
|
|
readonly
|
|
|
:rules="[{ required: true, message: '请选择归属部门' }]"
|
|
|
>
|
|
@@ -46,6 +49,8 @@
|
|
|
type="text"
|
|
|
placeholder="请输入登录账号"
|
|
|
no-border
|
|
|
+ v-model:model-value="formData.username"
|
|
|
+ prop="username"
|
|
|
custom-class="inputClass"
|
|
|
:rules="[{ required: true, message: '请输入登录账号' }]"
|
|
|
/>
|
|
@@ -55,24 +60,40 @@
|
|
|
show-password
|
|
|
placeholder="请输入登录密码"
|
|
|
no-border
|
|
|
+ prop="password"
|
|
|
+ v-model:model-value="formData.password"
|
|
|
:rules="[{ required: true, message: '请输入登录密码' }]"
|
|
|
custom-class="inputClass"
|
|
|
/>
|
|
|
</customFormItem>
|
|
|
- <customFormItem label="角色" required bg="#fff" v-if="rolelist">
|
|
|
- <wd-radio-group
|
|
|
- inline
|
|
|
- v-model:model-value="formData.roleId"
|
|
|
- shape="dot"
|
|
|
+ <customFormItem
|
|
|
+ label="角色"
|
|
|
+ required
|
|
|
+ bg="#fff"
|
|
|
+ v-if="rolelist"
|
|
|
+ class="customFormItem"
|
|
|
+ >
|
|
|
+ <wd-cell
|
|
|
+ vertical
|
|
|
:rules="[{ required: true, message: '请选择角色' }]"
|
|
|
+ prop="selectedroles"
|
|
|
>
|
|
|
- <wd-radio
|
|
|
- :value="item.id"
|
|
|
- v-for="item in rolelist.records"
|
|
|
- :key="item.id"
|
|
|
- >{{ item.roleName }}</wd-radio
|
|
|
+ <wd-radio-group
|
|
|
+ inline
|
|
|
+ v-model:model-value="formData.selectedroles"
|
|
|
+ shape="dot"
|
|
|
+ :rules="[{ required: true, message: '请选择角色' }]"
|
|
|
+ @change="handleChangeRole"
|
|
|
+ prop="selectedroles"
|
|
|
>
|
|
|
- </wd-radio-group>
|
|
|
+ <wd-radio
|
|
|
+ :value="item.id"
|
|
|
+ v-for="item in rolelist.records"
|
|
|
+ :key="item.id"
|
|
|
+ >{{ item.roleName }}</wd-radio
|
|
|
+ >
|
|
|
+ </wd-radio-group>
|
|
|
+ </wd-cell>
|
|
|
</customFormItem>
|
|
|
<customFormItem label="状态" required bg="#fff">
|
|
|
<wd-switch
|
|
@@ -83,70 +104,160 @@
|
|
|
</customFormItem>
|
|
|
</view>
|
|
|
<view class="bg-white mt3 px32rpx py28rpx">
|
|
|
- <customFormItem label="培训项目" required bg="#fff" v-if="categoryList">
|
|
|
- <wd-checkbox-group
|
|
|
- inline
|
|
|
- v-model:model-value="formData.trainingPrograms"
|
|
|
- :rules="[{ required: true, message: '请选择培训项目' }]"
|
|
|
+ <customFormItem
|
|
|
+ label="培训项目"
|
|
|
+ required
|
|
|
+ bg="#fff"
|
|
|
+ v-if="categoryList && isShowInstructor"
|
|
|
+ class="customFormItem"
|
|
|
+ >
|
|
|
+ <wd-cell
|
|
|
+ vertical
|
|
|
+ :rules="[
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: '请选择培训项目',
|
|
|
+ validator(value, rule) {
|
|
|
+ return value.length > 0;
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ]"
|
|
|
+ prop="trainingPrograms"
|
|
|
>
|
|
|
- <wd-checkbox
|
|
|
- v-model:model-value="item.id"
|
|
|
- true-value="sting"
|
|
|
- false-value="string"
|
|
|
- v-for="item in categoryList.records"
|
|
|
- :key="item.id"
|
|
|
- >{{ item.name }}</wd-checkbox
|
|
|
+ <wd-checkbox-group
|
|
|
+ inline
|
|
|
+ v-model:model-value="formData.trainingPrograms"
|
|
|
>
|
|
|
- </wd-checkbox-group>
|
|
|
+ <wd-checkbox
|
|
|
+ v-model:model-value="item.id"
|
|
|
+ true-value="sting"
|
|
|
+ false-value="string"
|
|
|
+ v-for="item in categoryList.records"
|
|
|
+ :key="item.id"
|
|
|
+ >{{ item.name }}</wd-checkbox
|
|
|
+ >
|
|
|
+ </wd-checkbox-group>
|
|
|
+ </wd-cell>
|
|
|
</customFormItem>
|
|
|
<customFormItem
|
|
|
label="无犯罪记录"
|
|
|
+ :required="isShowInstructor"
|
|
|
+ bg="#fff"
|
|
|
+ >
|
|
|
+ <wd-cell
|
|
|
+ vertical
|
|
|
+ :rules="[
|
|
|
+ {
|
|
|
+ required: isShowInstructor,
|
|
|
+ message: '请上传无犯罪记录',
|
|
|
+ validator(value, rule) {
|
|
|
+ return isShowInstructor ? value.length > 0 : true;
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ]"
|
|
|
+ prop="certificateInnocence"
|
|
|
+ >
|
|
|
+ <upload
|
|
|
+ tip="单张照片,不超过5MB"
|
|
|
+ :max-size="5242880"
|
|
|
+ :sourceType="['camera']"
|
|
|
+ :file-list="formData.certificateInnocence"
|
|
|
+ accept="image"
|
|
|
+ :limit="1"
|
|
|
+ ></upload>
|
|
|
+ </wd-cell>
|
|
|
+ </customFormItem>
|
|
|
+ <customFormItem
|
|
|
+ label="背景图"
|
|
|
required
|
|
|
bg="#fff"
|
|
|
- v-if="categoryList"
|
|
|
+ v-if="isShowInstructor"
|
|
|
>
|
|
|
- <upload
|
|
|
- tip="单张照片,不超过5MB"
|
|
|
- :max-size="5242880"
|
|
|
- :sourceType="['camera']"
|
|
|
- accept="image"
|
|
|
- :limit="1"
|
|
|
- ></upload>
|
|
|
+ <wd-cell
|
|
|
+ vertical
|
|
|
+ :rules="[
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: '请上传背景图',
|
|
|
+ validator(value, rule) {
|
|
|
+ return value.length > 0;
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ]"
|
|
|
+ >
|
|
|
+ <upload
|
|
|
+ tip="单张照片,不超过5MB"
|
|
|
+ :max-size="5242880"
|
|
|
+ :file-list="formData.backgroundImg"
|
|
|
+ :sourceType="['camera']"
|
|
|
+ accept="image"
|
|
|
+ :limit="1"
|
|
|
+ ></upload>
|
|
|
+ </wd-cell>
|
|
|
+ </customFormItem>
|
|
|
+ <customFormItem label="健康证" :required="isShowInstructor" bg="#fff">
|
|
|
+ <wd-cell
|
|
|
+ vertical
|
|
|
+ :rules="[
|
|
|
+ {
|
|
|
+ required: isShowInstructor,
|
|
|
+ message: '请上传健康证',
|
|
|
+ validator(value, rule) {
|
|
|
+ return isShowInstructor ? value.length > 0 : true;
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ]"
|
|
|
+ prop="healthy"
|
|
|
+ >
|
|
|
+ <upload
|
|
|
+ tip="单张照片,不超过5MB"
|
|
|
+ :max-size="5242880"
|
|
|
+ :sourceType="['camera']"
|
|
|
+ :file-list="formData.healthy"
|
|
|
+ accept="image"
|
|
|
+ :limit="1"
|
|
|
+ ></upload>
|
|
|
+ </wd-cell>
|
|
|
</customFormItem>
|
|
|
- <customFormItem label="教学理念" required>
|
|
|
+ <customFormItem label="教学理念" v-if="isShowInstructor">
|
|
|
<wd-input
|
|
|
type="text"
|
|
|
placeholder="请输入教学理念"
|
|
|
no-border
|
|
|
custom-class="inputClass"
|
|
|
v-model:model-value="formData.teachingPhilosophy"
|
|
|
+ prop="teachingPhilosophy"
|
|
|
:rules="[{ required: true, message: '请输入教学理念' }]"
|
|
|
/>
|
|
|
</customFormItem>
|
|
|
- <customFormItem label="擅长描述" required>
|
|
|
+ <customFormItem label="擅长描述" v-if="isShowInstructor">
|
|
|
<wd-input
|
|
|
type="text"
|
|
|
placeholder="请输入擅长描述"
|
|
|
no-border
|
|
|
custom-class="inputClass"
|
|
|
v-model:model-value="formData.excelMsg"
|
|
|
+ prop="excelMsg"
|
|
|
:rules="[{ required: true, message: '请输入擅长描述' }]"
|
|
|
/>
|
|
|
</customFormItem>
|
|
|
- <customFormItem label="荣誉证书" required bg="#fff">
|
|
|
+ <customFormItem label="荣誉证书" bg="#fff">
|
|
|
<upload
|
|
|
tip="最多支持2张图片,单张照片不超过5MB"
|
|
|
:max-size="5242880"
|
|
|
:sourceType="['camera']"
|
|
|
accept="image"
|
|
|
- :limit="2"
|
|
|
+ :file-list="formData.honor"
|
|
|
+ :limit="9"
|
|
|
></upload>
|
|
|
</customFormItem>
|
|
|
</view>
|
|
|
</wd-form>
|
|
|
</view>
|
|
|
<view class="h-180rpx"></view>
|
|
|
- <fixdbtn block size="large" @click="handleSubmit">确认</fixdbtn>
|
|
|
+ <fixdbtn block size="large" @click="handleSubmit" :loading="isloading"
|
|
|
+ >确认</fixdbtn
|
|
|
+ >
|
|
|
<view class="customPopup">
|
|
|
<wd-popup
|
|
|
v-model="treeFlage"
|
|
@@ -160,13 +271,13 @@
|
|
|
<view class="mt28rpx bg-white h-700rpx rounded-32rpx overflow-y-scroll">
|
|
|
<scroll-view scroll-y>
|
|
|
<tree
|
|
|
- :localdata="deptList"
|
|
|
- valueKey="id"
|
|
|
- textKey="departName"
|
|
|
- childrenKey="children"
|
|
|
+ :data="deptList"
|
|
|
+ valueField="id"
|
|
|
+ labelField="departName"
|
|
|
+ childrenField="children"
|
|
|
ref="treePicker"
|
|
|
- v-model="deptId"
|
|
|
- @select-change="handleChangeDept"
|
|
|
+ showCheckbox
|
|
|
+ expandChecked
|
|
|
></tree>
|
|
|
</scroll-view>
|
|
|
</view>
|
|
@@ -192,50 +303,164 @@ import { BASE_UPLOADURL } from "@/config";
|
|
|
import tree from "./components/tree/index.vue";
|
|
|
import upload from "./components/upload/index.vue";
|
|
|
import { type FormInstance } from "wot-design-uni/components/wd-form/types";
|
|
|
+import { createGlobalLoadingMiddleware } from "@/api/core/middleware";
|
|
|
const titleArr = ["新增员工", "编辑员工"];
|
|
|
const treePicker = ref();
|
|
|
const form = ref<FormInstance>();
|
|
|
-const formData = ref({
|
|
|
- roleId: "",
|
|
|
+const isShowInstructor = ref(false);
|
|
|
+const formData = reactive({
|
|
|
status: 1,
|
|
|
password: "",
|
|
|
trainingPrograms: [],
|
|
|
- certificateInnocence:
|
|
|
- "https://b0.bdstatic.com/920d3e4f7d5d8aeb8680137b987fa262.jpg",
|
|
|
+ certificateInnocence: [],
|
|
|
teachingPhilosophy: "",
|
|
|
excelMsg: "",
|
|
|
username: "",
|
|
|
+ selecteddeparts: [],
|
|
|
+ deptName: "",
|
|
|
+ selectedroles: "",
|
|
|
+ backgroundImg: [],
|
|
|
+ healthy: [],
|
|
|
+ honor: [],
|
|
|
+ realname: "",
|
|
|
});
|
|
|
-const deptId = ref([]);
|
|
|
const type = ref(0);
|
|
|
const treeFlage = ref(false);
|
|
|
+const id = ref("");
|
|
|
const { data: deptList } = useRequest(() => Apis.sys.findByDeptTree(), {});
|
|
|
const { data: rolelist } = useRequest(() => Apis.sys.rolelist(), {});
|
|
|
const { data: categoryList } = useRequest(() => Apis.app.appCategory(), {});
|
|
|
+const {
|
|
|
+ data,
|
|
|
+ send: handleAdd,
|
|
|
+ loading: isloading,
|
|
|
+} = useRequest((param) => Apis.sys.userAdd({ data: { ...param } }), {
|
|
|
+ immediate: false,
|
|
|
+ middleware: createGlobalLoadingMiddleware(),
|
|
|
+});
|
|
|
|
|
|
+const { send: queryById } = useRequest(
|
|
|
+ (id) => Apis.sys.queryById({ data: { id } }),
|
|
|
+ {
|
|
|
+ immediate: false,
|
|
|
+ middleware: createGlobalLoadingMiddleware(),
|
|
|
+ },
|
|
|
+);
|
|
|
onLoad((query: any) => {
|
|
|
type.value = query.type;
|
|
|
+ id.value = query.id;
|
|
|
+ if (type.value == 1) {
|
|
|
+ const res = queryById(query.id);
|
|
|
+ console.log(res, "场地");
|
|
|
+ }
|
|
|
});
|
|
|
function handleShow() {
|
|
|
// treePicker.value._show();
|
|
|
treeFlage.value = true;
|
|
|
- console.log(treePicker.value);
|
|
|
}
|
|
|
function handleClickLeft() {
|
|
|
uni.navigateBack();
|
|
|
}
|
|
|
-function handleSubmit() {
|
|
|
- console.log(deptId.value, "asd");
|
|
|
-
|
|
|
- form.value?.validate();
|
|
|
-}
|
|
|
-function handleChangeDept(e) {
|
|
|
- console.log(e);
|
|
|
+async function handleSubmit() {
|
|
|
+ const val = await form.value?.validate();
|
|
|
+ if (val?.valid) {
|
|
|
+ const obj = {
|
|
|
+ ...formData,
|
|
|
+ honor: transformImg("honor") || null,
|
|
|
+ backgroundImg: transformImg("backgroundImg") || null,
|
|
|
+ healthy: transformImg("healthy") || null,
|
|
|
+ trainingPrograms: transformImg("trainingPrograms") || null,
|
|
|
+ certificateInnocence: transformImg("certificateInnocence") || null,
|
|
|
+ selecteddeparts: formData.selecteddeparts.join(","),
|
|
|
+ };
|
|
|
+ console.log(obj, "提交表单");
|
|
|
+ type.value == 0 ? await handleAdd(obj) : await handleEdit(obj);
|
|
|
+ uni.navigateBack();
|
|
|
+ }
|
|
|
+ // console.log(val, "校验", formData);
|
|
|
}
|
|
|
+function handleEdit(a: any) {}
|
|
|
function handleSubmitDept() {
|
|
|
- console.log(treePicker.value);
|
|
|
+ const key = treePicker.value.getCheckedKeys();
|
|
|
+ if (!key) return uni.showToast({ title: "最少选择一个部门", icon: "none" });
|
|
|
+ formData.deptName = findNamesByKeys(key, deptList.value).join(",");
|
|
|
+ treeFlage.value = false;
|
|
|
+ formData.selecteddeparts = key;
|
|
|
+}
|
|
|
+function handleRect() {
|
|
|
+ const key = treePicker.value.getCheckedKeys();
|
|
|
+ formData.selecteddeparts = [];
|
|
|
+ treePicker.value.setCheckedKeys(key, false);
|
|
|
+ formData.deptName = "";
|
|
|
+}
|
|
|
+function handleChangeRole(e: { value: string }) {
|
|
|
+ rolelist.value.records.forEach((item: any) => {
|
|
|
+ if (item.roleCode == "instructor") {
|
|
|
+ if (item.id == e.value) {
|
|
|
+ isShowInstructor.value = true;
|
|
|
+ } else {
|
|
|
+ isShowInstructor.value = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+}
|
|
|
+function transformImg(key: keyof typeof formData) {
|
|
|
+ const list = (formData[key] as any[]).map((it) => it.url).join(",");
|
|
|
+ return list;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 通过key数组在树形结构中查找对应的name数组
|
|
|
+ * @param keys 要查找的节点id数组
|
|
|
+ * @param treeData 树形数据
|
|
|
+ * @param valueField 节点值字段名,默认为'id'
|
|
|
+ * @param labelField 节点名称字段名,默认为'departName'
|
|
|
+ * @param childrenField 子节点字段名,默认为'children'
|
|
|
+ * @returns 找到的节点名称数组
|
|
|
+ */
|
|
|
+function findNamesByKeys(
|
|
|
+ keys: any[],
|
|
|
+ treeData: any[],
|
|
|
+ valueField: string = "id",
|
|
|
+ labelField: string = "departName",
|
|
|
+ childrenField: string = "children",
|
|
|
+): string[] {
|
|
|
+ if (!keys || keys.length === 0) return [];
|
|
|
+
|
|
|
+ const result: string[] = [];
|
|
|
+
|
|
|
+ // 递归查找单个key的name
|
|
|
+ function findNameByKey(key: any, nodes: any[]): string | null {
|
|
|
+ if (!nodes || nodes.length === 0) return null;
|
|
|
+
|
|
|
+ for (const node of nodes) {
|
|
|
+ // 如果当前节点匹配,返回该节点的名称
|
|
|
+ if (node[valueField] === key) {
|
|
|
+ return node[labelField] || "";
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果有子节点,递归查找
|
|
|
+ if (node[childrenField] && node[childrenField].length > 0) {
|
|
|
+ const foundName = findNameByKey(key, node[childrenField]);
|
|
|
+ if (foundName) {
|
|
|
+ return foundName;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 遍历所有key查找对应的name
|
|
|
+ for (const key of keys) {
|
|
|
+ const name = findNameByKey(key, treeData);
|
|
|
+ if (name) {
|
|
|
+ result.push(name);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
}
|
|
|
-function handleRect() {}
|
|
|
</script>
|
|
|
|
|
|
<style scoped lang="scss">
|
|
@@ -245,6 +470,23 @@ function handleRect() {}
|
|
|
:deep(.wd-card.is-rectangle .wd-card__content::after) {
|
|
|
height: 0 !important;
|
|
|
}
|
|
|
+.from {
|
|
|
+ :deep(.wd-cell) {
|
|
|
+ padding-left: 0 !important;
|
|
|
+ .wd-cell__wrapper {
|
|
|
+ padding: 0 !important;
|
|
|
+ }
|
|
|
+ .wd-cell__left {
|
|
|
+ display: none;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .customFormItem {
|
|
|
+ :deep(.input) {
|
|
|
+ margin-top: 0 !important;
|
|
|
+ padding-top: 0 !important;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
</style>
|
|
|
<route lang="json">
|
|
|
{
|