parent
fe73766095
commit
dd278c0c50
13 changed files with 1703 additions and 155 deletions
@ -0,0 +1,76 @@ |
|||||||
|
<template> |
||||||
|
<el-dialog :modelValue="modelValue" @update:modelValue="(newValue: boolean) => $emit('update:modelValue', newValue)" |
||||||
|
title="用户信息" width="800" draggable overflow> |
||||||
|
<div class="table-box"> |
||||||
|
<el-table ref="multipleTableRef" border :data="tableData" class="table"> |
||||||
|
<el-table-column label="选择" width="55"> |
||||||
|
<template #default="scope"> |
||||||
|
<el-radio v-model="selectedRow" :value="scope.row" /> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column label="序号"> |
||||||
|
<template #default="scope"> |
||||||
|
{{ scope.$index + 1 }} |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column property="realname" label="真实姓名" sortable /> |
||||||
|
<el-table-column property="work_no" label="学号" sortable /> |
||||||
|
</el-table> |
||||||
|
<div class="pagin-box"> |
||||||
|
<el-pagination class="pagination" style="width: 100%;" v-model:current-page="params.pageNo" |
||||||
|
v-model:page-size="params.pageSize" :page-sizes="[10, 20, 30, 40]" |
||||||
|
layout="slo, total,slot, sizes, prev, pager, next, jumper" :total="total" @change="getList" /> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<template #footer> |
||||||
|
<div class="dialog-footer"> |
||||||
|
<el-button @click="$emit('update:modelValue', false)">关闭</el-button> |
||||||
|
<el-button type="primary" |
||||||
|
@click="() => { $emit('update:modelValue', false); $emit('selected', selectedRow); }">确认</el-button> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
</el-dialog> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script lang="ts" setup> |
||||||
|
import { computed, reactive, ref, watch } from 'vue'; |
||||||
|
import { getMembersList } from '@/api/person'; |
||||||
|
import { useRoute } from 'vue-router'; |
||||||
|
|
||||||
|
const props = defineProps(['modelValue']); |
||||||
|
const $emit = defineEmits(['update:modelValue', 'selected']); |
||||||
|
const route = useRoute(); |
||||||
|
|
||||||
|
watch(() => props.modelValue, () => getList()); |
||||||
|
|
||||||
|
// 数据 |
||||||
|
const tableData = reactive<any[]>([]); |
||||||
|
const selectedRow = ref(); |
||||||
|
|
||||||
|
// 分页 |
||||||
|
const total = ref(0); |
||||||
|
|
||||||
|
const params = reactive<any>({ |
||||||
|
pageNo: 1, |
||||||
|
pageSize: 10, |
||||||
|
onlRepUrlParamStr: `annualCompid=${route.query.objName}`, |
||||||
|
entryFormat: '团队', |
||||||
|
id: route.query.id, |
||||||
|
}) |
||||||
|
|
||||||
|
|
||||||
|
const getList = async () => { |
||||||
|
if (!props.modelValue) return |
||||||
|
const res: any = await getMembersList(params); |
||||||
|
tableData.length = 0; |
||||||
|
tableData.push(...res.result.records); |
||||||
|
total.value = res.result.total; |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss" scoped> |
||||||
|
.form-box { |
||||||
|
padding: 0 60px; |
||||||
|
} |
||||||
|
</style> |
@ -0,0 +1,78 @@ |
|||||||
|
<template> |
||||||
|
<el-dialog title="编辑" width="800" draggable> |
||||||
|
<div class="form-box"> |
||||||
|
<el-form ref="ruleFormRef" style="max-width: 600px" :model="ruleForm" status-icon :rules="rules" |
||||||
|
label-width="auto" class="demo-ruleForm"> |
||||||
|
<el-form-item label="年度比赛项目" prop="pass"> |
||||||
|
<el-input v-model="ruleForm.pass" type="text" autocomplete="off" /> |
||||||
|
</el-form-item> |
||||||
|
<el-form-item label="参赛形式" prop="checkPass"> |
||||||
|
<el-input v-model="ruleForm.checkPass" type="text" autocomplete="off" /> |
||||||
|
</el-form-item> |
||||||
|
<el-form-item label="队伍名称" prop="age"> |
||||||
|
<el-input v-model.number="ruleForm.age" /> |
||||||
|
</el-form-item> |
||||||
|
</el-form> |
||||||
|
</div> |
||||||
|
|
||||||
|
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="onCutTab"> |
||||||
|
<el-tab-pane label="团队成员表" name="members"> |
||||||
|
<info-list ref="memRef"></info-list> |
||||||
|
</el-tab-pane> |
||||||
|
<el-tab-pane label="指导老师表" name="adviser"> |
||||||
|
<info-list></info-list> |
||||||
|
</el-tab-pane> |
||||||
|
</el-tabs> |
||||||
|
|
||||||
|
<div> |
||||||
|
<el-button>关闭</el-button> |
||||||
|
<el-button type="primary" @click="submit">确认</el-button> |
||||||
|
</div> |
||||||
|
</el-dialog> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script lang="ts" setup> |
||||||
|
import { reactive, ref } from 'vue'; |
||||||
|
import type { TabsPaneContext, FormInstance, FormRules } from 'element-plus'; |
||||||
|
import { useRoute } from 'vue-router'; |
||||||
|
import infoList from './infoList.vue'; |
||||||
|
|
||||||
|
const route = useRoute(); |
||||||
|
defineProps(['data']); |
||||||
|
|
||||||
|
|
||||||
|
const activeName = ref('members'); |
||||||
|
|
||||||
|
const onCutTab = (tab: TabsPaneContext) => { |
||||||
|
console.log(tab.props.name,) |
||||||
|
} |
||||||
|
|
||||||
|
// form表单 |
||||||
|
const ruleFormRef = ref<FormInstance>(); |
||||||
|
|
||||||
|
const ruleForm = reactive({ |
||||||
|
pass: route.query.objName, |
||||||
|
checkPass: '团队赛', |
||||||
|
age: '', |
||||||
|
}) |
||||||
|
|
||||||
|
const rules = reactive<FormRules<typeof ruleForm>>({}); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const memRef = ref<any>(null); |
||||||
|
|
||||||
|
const submit = () => { |
||||||
|
memRef.value.submit() |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss" scoped> |
||||||
|
.el-tabs--top { |
||||||
|
flex-direction: column; |
||||||
|
} |
||||||
|
|
||||||
|
.form-box { |
||||||
|
padding: 0 60px; |
||||||
|
} |
||||||
|
</style> |
@ -0,0 +1,153 @@ |
|||||||
|
<template> |
||||||
|
<el-button type="primary" icon="Plus" @click="add">新增</el-button> |
||||||
|
<div class="table-box"> |
||||||
|
<el-table ref="multipleTableRef" border :data="tableData" class="table" height="276px"> |
||||||
|
<el-table-column type="selection" width="55" /> |
||||||
|
<el-table-column property="#" label="#" /> |
||||||
|
<el-table-column> |
||||||
|
<template #header> |
||||||
|
<el-icon> |
||||||
|
<Edit /> |
||||||
|
</el-icon> |
||||||
|
<span style="margin-left: 10px;">用户</span> |
||||||
|
</template> |
||||||
|
<template #default="scope"> |
||||||
|
<el-input @click="openDialog(scope.row)" v-model="scope.row['用户']" placeholder="请选择" |
||||||
|
:prefix-icon="ClusterOutlined" /> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column> |
||||||
|
<template #header> |
||||||
|
<el-icon> |
||||||
|
<Edit /> |
||||||
|
</el-icon> |
||||||
|
<span style="margin-left: 10px;">是否队长</span> |
||||||
|
</template> |
||||||
|
<template #default="scope"> |
||||||
|
<el-cascader v-model="scope.row['是否队长']" :options="options" /> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column> |
||||||
|
<template #header> |
||||||
|
<el-icon> |
||||||
|
<Edit /> |
||||||
|
</el-icon> |
||||||
|
<span style="margin-left: 10px;">队员序号</span> |
||||||
|
</template> |
||||||
|
<template #default="scope"> |
||||||
|
<el-input v-model="scope.row['队员序号']" /> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
</el-table> |
||||||
|
</div> |
||||||
|
|
||||||
|
<!-- <div> |
||||||
|
<el-button>关闭</el-button> |
||||||
|
<el-button type="primary" @click="submit">确认</el-button> |
||||||
|
</div> --> |
||||||
|
|
||||||
|
<dalog v-model="visible" @selected="handleSelected" /> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script lang="ts" setup> |
||||||
|
import { reactive, ref } from 'vue'; |
||||||
|
import dalog from './dalog.vue'; |
||||||
|
import { ClusterOutlined } from '@ant-design/icons-vue'; |
||||||
|
import { ElMessage } from 'element-plus'; |
||||||
|
const options = [ |
||||||
|
{ |
||||||
|
value: true, |
||||||
|
label: '是', |
||||||
|
}, |
||||||
|
{ |
||||||
|
value: false, |
||||||
|
label: '否', |
||||||
|
}, |
||||||
|
] |
||||||
|
|
||||||
|
// 数据 |
||||||
|
const tableData = reactive<any[]>([]) |
||||||
|
|
||||||
|
const add = () => { |
||||||
|
const length = tableData.push({ |
||||||
|
'#': tableData.length + 1, |
||||||
|
'用户': '', |
||||||
|
'是否队长': '', |
||||||
|
'队员序号': '', |
||||||
|
row: undefined, |
||||||
|
}); |
||||||
|
openDialog(tableData[length - 1]); |
||||||
|
} |
||||||
|
|
||||||
|
// 当下打开dialog的数据源,在打开dialog时赋值 |
||||||
|
const target = ref<any>(); |
||||||
|
const openDialog = (row: any) => { |
||||||
|
visible.value = true; |
||||||
|
target.value = row; |
||||||
|
} |
||||||
|
|
||||||
|
const visible = ref(false); |
||||||
|
|
||||||
|
// 像数据源中添加数据 |
||||||
|
const handleSelected = (row: any) => { |
||||||
|
if (tableData.some(o => o?.row?.id === row.id)) { |
||||||
|
ElMessage({ |
||||||
|
message: '用户不能多选!', |
||||||
|
type: 'error' |
||||||
|
}) |
||||||
|
return |
||||||
|
} |
||||||
|
target.value['用户'] = row.realname; |
||||||
|
target.value.row = row; |
||||||
|
} |
||||||
|
|
||||||
|
// 提交 |
||||||
|
|
||||||
|
const submit = () => { |
||||||
|
console.log(tableData); |
||||||
|
} |
||||||
|
|
||||||
|
defineExpose({submit}) |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss" scoped> |
||||||
|
.form-box { |
||||||
|
padding: 0 60px; |
||||||
|
} |
||||||
|
|
||||||
|
.table-box { |
||||||
|
.table { |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
.pagin-box { |
||||||
|
width: 100%; |
||||||
|
height: 64px; |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
|
||||||
|
.pagination { |
||||||
|
padding: 0 24px; |
||||||
|
|
||||||
|
:deep() { |
||||||
|
.el-pagination__total { |
||||||
|
margin-right: auto; |
||||||
|
} |
||||||
|
|
||||||
|
li.number.is-active { |
||||||
|
background-color: #42D9AC; |
||||||
|
color: rgba(255, 255, 255, 0.9); |
||||||
|
font-family: Microsoft YaHei UI, Microsoft YaHei UI; |
||||||
|
} |
||||||
|
|
||||||
|
span.el-pagination__jump { |
||||||
|
background-color: #F3F3F3; |
||||||
|
padding: 2px 8px; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
</style> |
@ -0,0 +1,585 @@ |
|||||||
|
<template> |
||||||
|
<!-- 报名信息确认页面 团队 --> |
||||||
|
<div class="fill"></div> |
||||||
|
<div class="banner"> |
||||||
|
<div class="box"> |
||||||
|
<div class="title-box"> |
||||||
|
<div class="title">报名信息确认</div> |
||||||
|
<div class="text"> |
||||||
|
请仔细核对报名信息,报名成功后无法修改。请仔细核对报名信息,报名成功后无法修改。 |
||||||
|
请仔细核对报名信息,报名成功后无法修改。请仔细核对报名信息,报名成功后无法修改。 |
||||||
|
请仔细核对报名信息,报名成功后无法修改。请仔细核对报名信息,报名成功后无法修改。 |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="img-box"> |
||||||
|
<img src="../../assets/images/applyImg.png" alt=""> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="registration-layout"> |
||||||
|
<div class="top"> |
||||||
|
<!-- 比赛信息 --> |
||||||
|
<el-card class="com"> |
||||||
|
<div class="title">比赛信息</div> |
||||||
|
<div class="content"> |
||||||
|
<div class="card-annual"> |
||||||
|
<div class="annual">2023年度</div> |
||||||
|
<div class="title-box"> |
||||||
|
<div class="text">河南省大学生创新创业大赛</div> |
||||||
|
<img src="../../assets/images/编组.png" alt=""> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="right"> |
||||||
|
<div class="info-box"> |
||||||
|
<div class="name">比赛年度</div> |
||||||
|
<div class="title">2024年度</div> |
||||||
|
<div class="name">比赛名称</div> |
||||||
|
<div class="title">河南省大学生创新创业大赛</div> |
||||||
|
<div class="date-box"> |
||||||
|
<div class="label">开始报名时间:</div> |
||||||
|
<div class="date">2323.6.1 18:00</div> |
||||||
|
</div> |
||||||
|
<div class="date-box"> |
||||||
|
<div class="label">开始截至时间:</div> |
||||||
|
<div class="date">2323.6.1 18:00</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</el-card> |
||||||
|
<!-- 项目信息 --> |
||||||
|
<el-card class="com"> |
||||||
|
<div class="title">项目信息</div> |
||||||
|
<div class="content track"> |
||||||
|
<div class="card-annual"> |
||||||
|
<p>红色之旅赛道</p> |
||||||
|
</div> |
||||||
|
<div class="right"> |
||||||
|
<div class="info-box"> |
||||||
|
<div class="name">项目名称</div> |
||||||
|
<div class="title">红色之旅赛道</div> |
||||||
|
<div class="name">要求人数</div> |
||||||
|
<div class="title">1人</div> |
||||||
|
<div class="date-box"> |
||||||
|
<div class="label">开始报名时间:</div> |
||||||
|
<div class="date">2323.6.1 18:00</div> |
||||||
|
</div> |
||||||
|
<div class="date-box"> |
||||||
|
<div class="label">开始截至时间:</div> |
||||||
|
<div class="date">2323.6.1 18:00</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</el-card> |
||||||
|
</div> |
||||||
|
<el-card class="center"> |
||||||
|
<div class="personage-info"> |
||||||
|
<div class="head"> |
||||||
|
<div class="title">个人信息</div> |
||||||
|
<div class="icon"> |
||||||
|
<img src="../../assets/images/ellipsis.png" alt=""> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="info-box"> |
||||||
|
<div class="label">姓名</div> |
||||||
|
<div class="text">{{ info.realname }}</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="info-box"> |
||||||
|
<div class="label">姓别</div> |
||||||
|
<div class="text">{{ pasSex(info.sex) }}</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="info-box"> |
||||||
|
<div class="label">学号</div> |
||||||
|
<div class="text">{{ info.workNo }}</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="info-box"> |
||||||
|
<div class="label">手机号</div> |
||||||
|
<div class="text">{{ info.phone }}</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="info-box"> |
||||||
|
<div class="label">邮箱</div> |
||||||
|
<div class="text">{{ info.email }}</div> |
||||||
|
</div> |
||||||
|
<!-- <div class="info-box"> |
||||||
|
<div class="label">院系</div> |
||||||
|
<div class="text">国际教育学院</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="info-box"> |
||||||
|
<div class="label">专业</div> |
||||||
|
<div class="text">软件工程</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="info-box"> |
||||||
|
<div class="label">指导老师</div> |
||||||
|
<div class="text">令狐冲</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="info-box"> |
||||||
|
<div class="label">所属团队</div> |
||||||
|
<div class="text">王不留行的团队</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="info-box remark"> |
||||||
|
<div class="label">其它备注</div> |
||||||
|
<div class="text">无</div> |
||||||
|
</div> --> |
||||||
|
</div> |
||||||
|
</el-card> |
||||||
|
<el-card class="list" :body-style="{ padding: 0 }"> |
||||||
|
<div class="head"> |
||||||
|
<div class="left"> |
||||||
|
<el-button class="btn" type="primary" @click="cliAddBtn">添加队员</el-button> |
||||||
|
<div class="text">已选2位</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="right"> |
||||||
|
<el-input v-model="input" style="width: 280px" placeholder="请输入学号进行搜索" suffix-icon="Search" /> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="table-box"> |
||||||
|
<el-table ref="multipleTableRef" border :data="tableData" class="table" height="276px"> |
||||||
|
<el-table-column type="selection" width="55" /> |
||||||
|
<el-table-column property="stuNum" label="学号" sortable /> |
||||||
|
<el-table-column property="name" label="姓名" sortable /> |
||||||
|
<el-table-column property="department" label="院系" sortable /> |
||||||
|
<el-table-column property="phone" label="手机号" sortable /> |
||||||
|
</el-table> |
||||||
|
<div class="pagin-box"> |
||||||
|
<el-pagination class="pagination" style="width: 100%;" v-model:current-page="pagInfo.currentPage" |
||||||
|
v-model:page-size="pagInfo.pageSize" :page-sizes="[10, 20, 30, 40]" |
||||||
|
layout="slo, total,slot, sizes, prev, pager, next, jumper" :total="pagInfo.total" |
||||||
|
@change="handleChange" /> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</el-card> |
||||||
|
<div class="bottom"> |
||||||
|
<el-button class="btn">取消报名</el-button> |
||||||
|
<el-button class="btn cyan">确认报名</el-button> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<edit v-model="isOpen" /> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script lang="ts" setup> |
||||||
|
import { reactive, ref, toRefs } from 'vue'; |
||||||
|
import { useRoute } from 'vue-router'; |
||||||
|
import userStore from '@/store/module/user'; |
||||||
|
import edit from './components/edit.vue'; |
||||||
|
const user = userStore(); |
||||||
|
const route = useRoute(); |
||||||
|
|
||||||
|
// 用户信息 |
||||||
|
const { userInfo: info } = toRefs(user); |
||||||
|
|
||||||
|
// 解析性别 |
||||||
|
function pasSex(num: number) { |
||||||
|
if (num == 1) return '男' |
||||||
|
else if (num == 2) return '女' |
||||||
|
else return '保密' |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 数据 |
||||||
|
const input = ref(''); |
||||||
|
const tableData = reactive([]) |
||||||
|
|
||||||
|
// 分页 |
||||||
|
const pagInfo = reactive({ |
||||||
|
currentPage: 1, |
||||||
|
pageSize: 10, |
||||||
|
total: 400 |
||||||
|
}) |
||||||
|
function handleChange(currentPage: number, pageSize: number) { |
||||||
|
console.log(currentPage, pageSize); |
||||||
|
} |
||||||
|
|
||||||
|
// 添加成员 |
||||||
|
const isOpen = ref(true); |
||||||
|
function cliAddBtn() { |
||||||
|
isOpen.value = true |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss" scoped> |
||||||
|
.fill { |
||||||
|
padding-top: 80px; |
||||||
|
} |
||||||
|
|
||||||
|
.banner { |
||||||
|
width: 100%; |
||||||
|
height: 289; |
||||||
|
background: linear-gradient(90deg, #FFFFFF 0%, #F0F8FF 100%); |
||||||
|
padding: 21px 0 37px 225px; |
||||||
|
|
||||||
|
.box { |
||||||
|
width: 1515px; |
||||||
|
height: 231px; |
||||||
|
display: flex; |
||||||
|
gap: 104px; |
||||||
|
justify-content: space-between; |
||||||
|
align-items: center; |
||||||
|
|
||||||
|
.title-box { |
||||||
|
width: 1151px; |
||||||
|
|
||||||
|
.title { |
||||||
|
height: 59px; |
||||||
|
font-family: Open Sans, Open Sans; |
||||||
|
font-weight: bold; |
||||||
|
font-size: 42px; |
||||||
|
color: #333333; |
||||||
|
line-height: 59px; |
||||||
|
} |
||||||
|
|
||||||
|
.text { |
||||||
|
margin-top: 20px; |
||||||
|
font-family: Open Sans, Open Sans; |
||||||
|
font-weight: 400; |
||||||
|
font-size: 20px; |
||||||
|
color: #666666; |
||||||
|
line-height: 23px; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.img-box { |
||||||
|
img { |
||||||
|
object-fit: cover; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
img { |
||||||
|
width: 100%; |
||||||
|
height: 100%; |
||||||
|
object-fit: cover; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.registration-layout { |
||||||
|
margin-top: 20px; |
||||||
|
margin: 0 auto; |
||||||
|
width: 1397px; |
||||||
|
|
||||||
|
&>* { |
||||||
|
background: #FFFFFF; |
||||||
|
} |
||||||
|
|
||||||
|
.top { |
||||||
|
display: flex; |
||||||
|
justify-content: space-between; |
||||||
|
margin: 25px 0; |
||||||
|
height: 300px; |
||||||
|
|
||||||
|
.com { |
||||||
|
width: 685px; |
||||||
|
height: 300px; |
||||||
|
border-radius: 6px 6px 6px 6px; |
||||||
|
padding-top: 22px; |
||||||
|
padding-left: 32px; |
||||||
|
|
||||||
|
.title { |
||||||
|
height: 28px; |
||||||
|
font-family: Microsoft YaHei UI, Microsoft YaHei UI; |
||||||
|
font-weight: bold; |
||||||
|
font-size: 20px; |
||||||
|
color: rgba(0, 0, 0, 0.9); |
||||||
|
line-height: 28px; |
||||||
|
margin-bottom: 18px; |
||||||
|
} |
||||||
|
|
||||||
|
margin-right: 22px; |
||||||
|
|
||||||
|
.content { |
||||||
|
display: flex; |
||||||
|
gap: 22px; |
||||||
|
|
||||||
|
.card-annual { |
||||||
|
padding: 28px 0 0 28px; |
||||||
|
width: 340px; |
||||||
|
height: 182px; |
||||||
|
background: linear-gradient(90deg, #21ACA5 0%, #42D9AC99 100%); |
||||||
|
border-radius: 8px; |
||||||
|
overflow: hidden; |
||||||
|
|
||||||
|
.annual { |
||||||
|
height: 19px; |
||||||
|
font-family: Inter, Inter; |
||||||
|
font-weight: bold; |
||||||
|
font-size: 16px; |
||||||
|
color: rgba(255, 255, 255, 0.8); |
||||||
|
line-height: 19px; |
||||||
|
} |
||||||
|
|
||||||
|
.title-box { |
||||||
|
margin-top: 13px; |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
gap: 28px; |
||||||
|
|
||||||
|
.text { |
||||||
|
width: 202px; |
||||||
|
font-family: Inter, Inter; |
||||||
|
font-weight: normal; |
||||||
|
font-size: 32px; |
||||||
|
color: #FFFFFF; |
||||||
|
line-height: 39px; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.right { |
||||||
|
.info-box { |
||||||
|
.name { |
||||||
|
height: 20px; |
||||||
|
font-family: Microsoft YaHei UI, Microsoft YaHei UI; |
||||||
|
font-weight: 400; |
||||||
|
font-size: 14px; |
||||||
|
color: #ACACAC; |
||||||
|
line-height: 20px; |
||||||
|
margin-bottom: 8px; |
||||||
|
} |
||||||
|
|
||||||
|
.title { |
||||||
|
height: 20px; |
||||||
|
font-family: Microsoft YaHei UI, Microsoft YaHei UI; |
||||||
|
font-weight: bold; |
||||||
|
font-size: 20px; |
||||||
|
color: #333333; |
||||||
|
line-height: 20px; |
||||||
|
margin-bottom: 12px; |
||||||
|
} |
||||||
|
|
||||||
|
.date-box { |
||||||
|
margin-bottom: 12px; |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
|
||||||
|
.label { |
||||||
|
height: 20px; |
||||||
|
font-family: Microsoft YaHei UI, Microsoft YaHei UI; |
||||||
|
font-weight: 400; |
||||||
|
font-size: 14px; |
||||||
|
color: #ACACAC; |
||||||
|
line-height: 20px; |
||||||
|
} |
||||||
|
|
||||||
|
.date { |
||||||
|
font-family: Microsoft YaHei UI, Microsoft YaHei UI; |
||||||
|
font-weight: bold; |
||||||
|
font-size: 18px; |
||||||
|
color: #333333; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.track { |
||||||
|
.card-annual { |
||||||
|
background: url(../../assets/images/item.png) no-repeat; |
||||||
|
background-size: cover; |
||||||
|
display: flex; |
||||||
|
justify-content: center; |
||||||
|
align-items: center; |
||||||
|
padding: 0; |
||||||
|
|
||||||
|
p { |
||||||
|
font-family: Microsoft YaHei UI, Microsoft YaHei UI; |
||||||
|
font-weight: bold; |
||||||
|
font-size: 40px; |
||||||
|
color: #76DAE5; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.center { |
||||||
|
// height: 388px; |
||||||
|
border-radius: 6px 6px 6px 6px; |
||||||
|
margin-bottom: 25px; |
||||||
|
|
||||||
|
.personage-info { |
||||||
|
margin: 30px; |
||||||
|
// width: 780px; |
||||||
|
display: flex; |
||||||
|
flex-wrap: wrap; |
||||||
|
justify-content: space-between; |
||||||
|
row-gap: 32px; |
||||||
|
|
||||||
|
.head { |
||||||
|
width: 100%; |
||||||
|
display: flex; |
||||||
|
justify-content: space-between; |
||||||
|
align-items: center; |
||||||
|
|
||||||
|
.title { |
||||||
|
height: 28px; |
||||||
|
font-family: Microsoft YaHei UI, Microsoft YaHei UI; |
||||||
|
font-weight: bold; |
||||||
|
font-size: 20px; |
||||||
|
color: rgba(0, 0, 0, 0.9); |
||||||
|
line-height: 28px; |
||||||
|
} |
||||||
|
|
||||||
|
.icon { |
||||||
|
padding: 5px; |
||||||
|
cursor: pointer; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.info-box { |
||||||
|
&.remark { |
||||||
|
width: 377.333px; |
||||||
|
} |
||||||
|
|
||||||
|
width: 176px; |
||||||
|
height: 60px; |
||||||
|
display: flex; |
||||||
|
flex-direction: column; |
||||||
|
justify-content: space-between; |
||||||
|
|
||||||
|
.label { |
||||||
|
height: 22px; |
||||||
|
font-family: Microsoft YaHei UI, Microsoft YaHei UI; |
||||||
|
font-weight: 400; |
||||||
|
font-size: 14px; |
||||||
|
color: rgba(0, 0, 0, 0.4); |
||||||
|
line-height: 22px; |
||||||
|
} |
||||||
|
|
||||||
|
.text { |
||||||
|
height: 22px; |
||||||
|
font-family: Microsoft YaHei UI, Microsoft YaHei UI; |
||||||
|
font-weight: 400; |
||||||
|
font-size: 14px; |
||||||
|
color: rgba(0, 0, 0, 0.9); |
||||||
|
line-height: 22px; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.list { |
||||||
|
.head { |
||||||
|
padding: 32px; |
||||||
|
height: 96px; |
||||||
|
background: #FFFFFF; |
||||||
|
box-shadow: 0px 2px 3px 0px rgba(0, 0, 0, 0.1); |
||||||
|
border-radius: 6px 6px 0px 0px; |
||||||
|
display: flex; |
||||||
|
justify-content: space-between; |
||||||
|
align-items: center; |
||||||
|
|
||||||
|
&>* { |
||||||
|
height: 32px; |
||||||
|
} |
||||||
|
|
||||||
|
.left { |
||||||
|
display: flex; |
||||||
|
gap: 12px; |
||||||
|
align-items: center; |
||||||
|
|
||||||
|
.btn { |
||||||
|
height: 32px; |
||||||
|
width: 88px; |
||||||
|
background: #42D9AC; |
||||||
|
border-radius: 3px 3px 3px 3px; |
||||||
|
border: none; |
||||||
|
} |
||||||
|
|
||||||
|
.text { |
||||||
|
font-family: Microsoft YaHei UI, Microsoft YaHei UI; |
||||||
|
font-weight: 400; |
||||||
|
font-size: 14px; |
||||||
|
color: rgba(0, 0, 0, 0.4); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
.table-box { |
||||||
|
.table { |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
.pagin-box { |
||||||
|
width: 100%; |
||||||
|
height: 64px; |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
|
||||||
|
.pagination { |
||||||
|
padding: 0 24px; |
||||||
|
|
||||||
|
:deep() { |
||||||
|
.el-pagination__total { |
||||||
|
margin-right: auto; |
||||||
|
} |
||||||
|
|
||||||
|
li.number.is-active { |
||||||
|
background-color: #42D9AC; |
||||||
|
color: rgba(255, 255, 255, 0.9); |
||||||
|
font-family: Microsoft YaHei UI, Microsoft YaHei UI; |
||||||
|
} |
||||||
|
|
||||||
|
span.el-pagination__jump { |
||||||
|
background-color: #F3F3F3; |
||||||
|
padding: 2px 8px; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.bottom { |
||||||
|
margin: 46px 0; |
||||||
|
height: 70px; |
||||||
|
display: flex; |
||||||
|
gap: 106px; |
||||||
|
justify-content: center; |
||||||
|
align-items: center; |
||||||
|
|
||||||
|
.btn { |
||||||
|
--color1: #FFF4CE; |
||||||
|
--color2: #FF6B6B; |
||||||
|
width: 387px; |
||||||
|
height: 69px; |
||||||
|
border-radius: 69px; |
||||||
|
border: none; |
||||||
|
font-family: Microsoft YaHei UI, Microsoft YaHei UI; |
||||||
|
font-weight: bold; |
||||||
|
font-size: 24px; |
||||||
|
color: #FFFFFF; |
||||||
|
background: linear-gradient(to right, var(--color1), var(--color2)); |
||||||
|
box-shadow: 7px 7px 22px -10px rgba(0, 0, 0, 0.22); |
||||||
|
transition: all 0.2s; |
||||||
|
|
||||||
|
&:hover { |
||||||
|
transform: scale(1.1); |
||||||
|
} |
||||||
|
|
||||||
|
&.cyan { |
||||||
|
--color1: #00D0D0; |
||||||
|
--color2: #42D9AC; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
</style> |
@ -0,0 +1,119 @@ |
|||||||
|
<template> |
||||||
|
<el-dialog :modelValue="modelValue" @update:modelValue="(newValue: boolean) => $emit('update:modelValue', newValue)" |
||||||
|
title="用户信息" width="800" draggable overflow> |
||||||
|
<div class="table-box"> |
||||||
|
<el-table ref="multipleTableRef" border :data="tableData" @row-click="(row: any) => selectedRow = row" |
||||||
|
append-to-body |
||||||
|
class="table" v-loading="loading"> |
||||||
|
<el-table-column label="选择" width="55"> |
||||||
|
<template #default="scope"> |
||||||
|
<el-radio v-model="selectedRow" :value="scope.row" /> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column label="序号"> |
||||||
|
<template #default="scope"> |
||||||
|
{{ scope.$index + 1 }} |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column property="realname" label="真实姓名" sortable /> |
||||||
|
<el-table-column property="work_no" label="学号" sortable /> |
||||||
|
</el-table> |
||||||
|
</div> |
||||||
|
|
||||||
|
<template #footer> |
||||||
|
<div class="pagin-box"> |
||||||
|
<el-pagination class="pagination" style="width: 100%;" v-model:current-page="params.pageNo" |
||||||
|
v-model:page-size="params.pageSize" :page-sizes="[10, 20, 30, 40]" |
||||||
|
layout="slo, total,slot, sizes, prev, pager, next, jumper" :total="total" @change="getList" /> |
||||||
|
</div> |
||||||
|
<div class="dialog-footer"> |
||||||
|
<el-button @click="$emit('update:modelValue', false)">关闭</el-button> |
||||||
|
<el-button type="primary" |
||||||
|
@click="() => { $emit('update:modelValue', false); $emit('selected', selectedRow); }">确认</el-button> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
</el-dialog> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script lang="ts" setup> |
||||||
|
import { reactive, ref, watch } from 'vue'; |
||||||
|
import { getMembersList } from '@/api/person'; |
||||||
|
import { useRoute } from 'vue-router'; |
||||||
|
import { ElMessage } from 'element-plus'; |
||||||
|
|
||||||
|
const props = defineProps(['modelValue', 'type']); |
||||||
|
const $emit = defineEmits(['update:modelValue', 'selected']); |
||||||
|
const route = useRoute(); |
||||||
|
|
||||||
|
watch(() => props.modelValue, () => getList()); |
||||||
|
|
||||||
|
// 数据 |
||||||
|
const tableData = reactive<any[]>([]); |
||||||
|
const selectedRow = ref(); |
||||||
|
|
||||||
|
// 分页 |
||||||
|
const total = ref(0); |
||||||
|
|
||||||
|
const params = reactive<any>({ |
||||||
|
pageNo: 1, |
||||||
|
pageSize: 10, |
||||||
|
onlRepUrlParamStr: `annualCompid=${route.query.objName}`, |
||||||
|
entryFormat: '团队', |
||||||
|
id: route.query.id, |
||||||
|
}) |
||||||
|
|
||||||
|
|
||||||
|
const loading = ref(false); |
||||||
|
const getList = async () => { |
||||||
|
if (!props.modelValue) return |
||||||
|
loading.value = true; |
||||||
|
try { |
||||||
|
const res: any = await getMembersList(params); |
||||||
|
tableData.length = 0; |
||||||
|
tableData.push(...res.result.records); |
||||||
|
total.value = res.result.total; |
||||||
|
} catch (error: any) { |
||||||
|
ElMessage({ |
||||||
|
message: error.message, |
||||||
|
type: 'error' |
||||||
|
}) |
||||||
|
} finally { |
||||||
|
loading.value = false; |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss" scoped> |
||||||
|
.form-box { |
||||||
|
padding: 0 60px; |
||||||
|
} |
||||||
|
|
||||||
|
.pagin-box { |
||||||
|
width: 100%; |
||||||
|
height: 64px; |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
|
||||||
|
.pagination { |
||||||
|
padding: 0 24px; |
||||||
|
|
||||||
|
:deep() { |
||||||
|
.el-pagination__total { |
||||||
|
margin-right: auto; |
||||||
|
} |
||||||
|
|
||||||
|
li.number.is-active { |
||||||
|
background-color: #42D9AC; |
||||||
|
color: rgba(255, 255, 255, 0.9); |
||||||
|
font-family: Microsoft YaHei UI, Microsoft YaHei UI; |
||||||
|
} |
||||||
|
|
||||||
|
span.el-pagination__jump { |
||||||
|
background-color: #F3F3F3; |
||||||
|
padding: 2px 8px; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
</style> |
@ -0,0 +1,163 @@ |
|||||||
|
<template> |
||||||
|
<div> |
||||||
|
<el-button type="primary" icon="Plus" @click="add" class="btn">新增</el-button> |
||||||
|
<el-button type="primary" icon="Plus" @click="del" class="btn" v-show="isSele">删除</el-button> |
||||||
|
<div class="table-box"> |
||||||
|
<el-table ref="multipleTableRef" @select="(selection: any[]) => isSele = !!selection.length" border |
||||||
|
:data="tableData" class="table" height="276px"> |
||||||
|
<el-table-column type="selection" width="55" /> |
||||||
|
<el-table-column label="#" width="55"> |
||||||
|
<template #default="{ $index }"> |
||||||
|
{{ $index + 1 }} |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column> |
||||||
|
<template #header> |
||||||
|
<el-icon> |
||||||
|
<Edit /> |
||||||
|
</el-icon> |
||||||
|
<span style="margin-left: 10px;">用户</span> |
||||||
|
</template> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-input @click="openDialog(row)" v-model="row.realname" placeholder="请选择" |
||||||
|
:prefix-icon="ClusterOutlined" /> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column> |
||||||
|
<template #header> |
||||||
|
<el-icon> |
||||||
|
<Edit /> |
||||||
|
</el-icon> |
||||||
|
<span style="margin-left: 10px;">是否队长</span> |
||||||
|
</template> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-cascader :modelValue="row.captain" @update:modelValue="(arr: any[]) => row.captain = arr[0]" |
||||||
|
:options="options" /> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column> |
||||||
|
<template #header> |
||||||
|
<el-icon> |
||||||
|
<Edit /> |
||||||
|
</el-icon> |
||||||
|
<span style="margin-left: 10px;">队员序号</span> |
||||||
|
</template> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-input v-model="row.teamSeq" /> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
</el-table> |
||||||
|
</div> |
||||||
|
<stu-dialog v-model="visible" @selected="handleSelected" /> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script lang="ts" setup> |
||||||
|
import { reactive, ref } from 'vue'; |
||||||
|
import stuDialog from './stuDialog.vue'; |
||||||
|
import { ClusterOutlined } from '@ant-design/icons-vue'; |
||||||
|
import { ElMessage } from 'element-plus'; |
||||||
|
const options = [ |
||||||
|
{ |
||||||
|
value: '1', |
||||||
|
label: '是', |
||||||
|
}, |
||||||
|
{ |
||||||
|
value: '0', |
||||||
|
label: '否', |
||||||
|
}, |
||||||
|
] |
||||||
|
|
||||||
|
// 数据 |
||||||
|
const tableData = reactive<any[]>([]) |
||||||
|
|
||||||
|
const add = () => { |
||||||
|
const length = tableData.push({ |
||||||
|
realname: '', // 用户 |
||||||
|
captain: '', // 是否队长 |
||||||
|
teamSeq: '', // 队员序号 |
||||||
|
userId: '', // id |
||||||
|
}); |
||||||
|
openDialog(tableData[length - 1]); |
||||||
|
} |
||||||
|
|
||||||
|
// 当下打开dialog的数据源,在打开dialog时赋值 |
||||||
|
const target = ref<any>(); |
||||||
|
const openDialog = (row: any) => { |
||||||
|
visible.value = true; |
||||||
|
target.value = row; |
||||||
|
} |
||||||
|
|
||||||
|
const visible = ref(false); |
||||||
|
|
||||||
|
// 像数据源中添加数据 |
||||||
|
const handleSelected = (row: any = {}) => { |
||||||
|
if (tableData.some(o => o.userId === row.id)) { |
||||||
|
ElMessage({ |
||||||
|
message: '用户不能多选!', |
||||||
|
type: 'error' |
||||||
|
}) |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
target.value.realname = row.realname; |
||||||
|
target.value.userId = row.id; |
||||||
|
} |
||||||
|
|
||||||
|
// 提交 |
||||||
|
defineExpose({ submit: () => tableData }) |
||||||
|
|
||||||
|
// 删除逻辑 |
||||||
|
const multipleTableRef = ref<any>(null); |
||||||
|
const isSele = ref(false); |
||||||
|
const del = () => { |
||||||
|
const rows = multipleTableRef.value.getSelectionRows() |
||||||
|
rows.forEach((row: any) => { |
||||||
|
const index = tableData.indexOf(row); |
||||||
|
if (index === -1) return; |
||||||
|
tableData.splice(index, 1); |
||||||
|
}) |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss" scoped> |
||||||
|
.btn { |
||||||
|
margin-bottom: 20px; |
||||||
|
} |
||||||
|
|
||||||
|
.table-box { |
||||||
|
.table { |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
.pagin-box { |
||||||
|
width: 100%; |
||||||
|
height: 64px; |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
|
||||||
|
.pagination { |
||||||
|
padding: 0 24px; |
||||||
|
|
||||||
|
:deep() { |
||||||
|
.el-pagination__total { |
||||||
|
margin-right: auto; |
||||||
|
} |
||||||
|
|
||||||
|
li.number.is-active { |
||||||
|
background-color: #42D9AC; |
||||||
|
color: rgba(255, 255, 255, 0.9); |
||||||
|
font-family: Microsoft YaHei UI, Microsoft YaHei UI; |
||||||
|
} |
||||||
|
|
||||||
|
span.el-pagination__jump { |
||||||
|
background-color: #F3F3F3; |
||||||
|
padding: 2px 8px; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
</style> |
@ -0,0 +1,122 @@ |
|||||||
|
<template> |
||||||
|
<el-dialog :modelValue="modelValue" @update:modelValue="(newValue: boolean) => $emit('update:modelValue', newValue)" |
||||||
|
append-to-body |
||||||
|
title="用户信息" width="1000" draggable overflow> |
||||||
|
<div class="table-box"> |
||||||
|
<el-table ref="multipleTableRef" border :data="tableData" @row-click="(row: any) => selectedRow = row" |
||||||
|
class="table" v-loading="loading"> |
||||||
|
<el-table-column label="选择" width="55"> |
||||||
|
<template #default="scope"> |
||||||
|
<el-radio v-model="selectedRow" :value="scope.row" /> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column label="序号"> |
||||||
|
<template #default="scope"> |
||||||
|
{{ scope.$index + 1 }} |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column property="realname" label="名字" sortable /> |
||||||
|
<el-table-column property="exp_title" label="学历" sortable /> |
||||||
|
<el-table-column property="exp_zc" label="职称" sortable /> |
||||||
|
<el-table-column property="teamajor" label="专业" sortable /> |
||||||
|
<el-table-column property="exp_yjfx" label="研究方向" sortable /> |
||||||
|
<el-table-column property="phone" label="电话" sortable /> |
||||||
|
</el-table> |
||||||
|
<div class="pagin-box"> |
||||||
|
<el-pagination class="pagination" style="width: 100%;" v-model:current-page="params.pageNo" |
||||||
|
v-model:page-size="params.pageSize" :page-sizes="[10, 20, 30, 40]" |
||||||
|
layout="slo, total,slot, sizes, prev, pager, next, jumper" :total="total" @change="getList" /> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<template #footer> |
||||||
|
<div class="dialog-footer"> |
||||||
|
<el-button @click="$emit('update:modelValue', false)">关闭</el-button> |
||||||
|
<el-button type="primary" |
||||||
|
@click="() => { $emit('update:modelValue', false); $emit('selected', selectedRow); }">确认</el-button> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
</el-dialog> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script lang="ts" setup> |
||||||
|
import { reactive, ref, watch } from 'vue'; |
||||||
|
import { getAdviserList } from '@/api/person'; |
||||||
|
import { useRoute } from 'vue-router'; |
||||||
|
import { ElMessage } from 'element-plus'; |
||||||
|
|
||||||
|
const props = defineProps(['modelValue', 'type']); |
||||||
|
const $emit = defineEmits(['update:modelValue', 'selected']); |
||||||
|
const route = useRoute(); |
||||||
|
|
||||||
|
watch(() => props.modelValue, () => getList()); |
||||||
|
|
||||||
|
// 数据 |
||||||
|
const tableData = reactive<any[]>([]); |
||||||
|
const selectedRow = ref(); |
||||||
|
|
||||||
|
// 分页 |
||||||
|
const total = ref(0); |
||||||
|
|
||||||
|
const params = reactive<any>({ |
||||||
|
pageNo: 1, |
||||||
|
pageSize: 10, |
||||||
|
onlRepUrlParamStr: `annualCompid=${route.query.objName}`, |
||||||
|
entryFormat: '团队', |
||||||
|
id: route.query.id, |
||||||
|
}) |
||||||
|
|
||||||
|
const loading = ref(false); |
||||||
|
const getList = async () => { |
||||||
|
if (!props.modelValue) return |
||||||
|
loading.value = true; |
||||||
|
try { |
||||||
|
const res: any = await getAdviserList(params); |
||||||
|
tableData.length = 0; |
||||||
|
tableData.push(...res.result.records); |
||||||
|
total.value = res.result.total; |
||||||
|
} catch (error: any) { |
||||||
|
ElMessage({ |
||||||
|
message: error.message, |
||||||
|
type: 'error' |
||||||
|
}) |
||||||
|
} finally { |
||||||
|
loading.value = false; |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss" scoped> |
||||||
|
.form-box { |
||||||
|
padding: 0 60px; |
||||||
|
} |
||||||
|
|
||||||
|
.pagin-box { |
||||||
|
width: 100%; |
||||||
|
height: 64px; |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
|
||||||
|
.pagination { |
||||||
|
padding: 0 24px; |
||||||
|
|
||||||
|
:deep() { |
||||||
|
.el-pagination__total { |
||||||
|
margin-right: auto; |
||||||
|
} |
||||||
|
|
||||||
|
li.number.is-active { |
||||||
|
background-color: #42D9AC; |
||||||
|
color: rgba(255, 255, 255, 0.9); |
||||||
|
font-family: Microsoft YaHei UI, Microsoft YaHei UI; |
||||||
|
} |
||||||
|
|
||||||
|
span.el-pagination__jump { |
||||||
|
background-color: #F3F3F3; |
||||||
|
padding: 2px 8px; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
</style> |
@ -0,0 +1,217 @@ |
|||||||
|
<template> |
||||||
|
<div> |
||||||
|
<el-button type="primary" icon="Plus" @click="add" class="btn">新增</el-button> |
||||||
|
<el-button type="primary" icon="Plus" @click="del" class="btn" v-show="isSele">删除</el-button> |
||||||
|
<div class="table-box"> |
||||||
|
<el-table ref="multipleTableRef" border :data="tableData" |
||||||
|
@select="(selection: any[]) => isSele = !!selection.length" height="276px"> |
||||||
|
<el-table-column type="selection" width="55" /> |
||||||
|
<el-table-column label="#" width="55"> |
||||||
|
<template #default="{ $index }"> |
||||||
|
{{ $index + 1 }} |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column> |
||||||
|
<template #header> |
||||||
|
<el-icon> |
||||||
|
<Edit /> |
||||||
|
</el-icon> |
||||||
|
<span style="margin-left: 10px;">指导老师类型</span> |
||||||
|
</template> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-cascader :modelValue="row.teacherType" |
||||||
|
@update:modelValue="(arr: any[]) => row.teacherType = arr[0]" :options="options" /> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column> |
||||||
|
<template #header> |
||||||
|
<el-icon> |
||||||
|
<Edit /> |
||||||
|
</el-icon> |
||||||
|
<span style="margin-left: 10px;">指导老师姓名</span> |
||||||
|
</template> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-input @click="openDialog(row)" v-model="row.teacherName" placeholder="请选择" |
||||||
|
:prefix-icon="ClusterOutlined" /> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column> |
||||||
|
<template #header> |
||||||
|
<el-icon> |
||||||
|
<Edit /> |
||||||
|
</el-icon> |
||||||
|
<span style="margin-left: 10px;">学历</span> |
||||||
|
</template> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-input v-model="row.teacherXl" placeholder="请输入学历" /> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column> |
||||||
|
<template #header> |
||||||
|
<el-icon> |
||||||
|
<Edit /> |
||||||
|
</el-icon> |
||||||
|
<span style="margin-left: 10px;">职称</span> |
||||||
|
</template> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-input v-model="row.teacherZc" placeholder="请输入职称" /> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column> |
||||||
|
<template #header> |
||||||
|
<el-icon> |
||||||
|
<Edit /> |
||||||
|
</el-icon> |
||||||
|
<span style="margin-left: 10px;">专业</span> |
||||||
|
</template> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-input v-model="row.teacherZy" placeholder="请输入专业" /> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column> |
||||||
|
<template #header> |
||||||
|
<el-icon> |
||||||
|
<Edit /> |
||||||
|
</el-icon> |
||||||
|
<span style="margin-left: 10px;">研究方向</span> |
||||||
|
</template> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-input v-model="row.teacherYjfx" placeholder="请输入研究方向" /> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column> |
||||||
|
<template #header> |
||||||
|
<el-icon> |
||||||
|
<Edit /> |
||||||
|
</el-icon> |
||||||
|
<span style="margin-left: 10px;">手机号</span> |
||||||
|
</template> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-input v-model="row.teacherPhone" placeholder="请输入手机号" /> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
</el-table> |
||||||
|
</div> |
||||||
|
<tea-dialog v-model="visible" @selected="handleSelected" /> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script lang="ts" setup> |
||||||
|
import { reactive, ref } from 'vue'; |
||||||
|
import teaDialog from './teaDialog.vue'; |
||||||
|
import { ClusterOutlined } from '@ant-design/icons-vue'; |
||||||
|
import { ElMessage } from 'element-plus'; |
||||||
|
const options = [ |
||||||
|
{ |
||||||
|
value: '1', |
||||||
|
label: '指导老师', |
||||||
|
}, |
||||||
|
{ |
||||||
|
value: '2', |
||||||
|
label: '领队老师', |
||||||
|
}, |
||||||
|
] |
||||||
|
|
||||||
|
// 数据 |
||||||
|
const tableData = reactive<any[]>([]) |
||||||
|
|
||||||
|
const add = () => { |
||||||
|
const length = tableData.push({ |
||||||
|
teacherName: '', |
||||||
|
teacherPhone: '', |
||||||
|
teacherType: '', |
||||||
|
teacherXl: '', |
||||||
|
teacherYjfx: '', |
||||||
|
teacherZc: '', |
||||||
|
teacherZy: '', |
||||||
|
teacherid: '', |
||||||
|
}); |
||||||
|
openDialog(tableData[length - 1]); |
||||||
|
} |
||||||
|
|
||||||
|
// 当下打开dialog的数据源,在打开dialog时赋值 |
||||||
|
const target = ref<any>(); |
||||||
|
const openDialog = (row: any) => { |
||||||
|
visible.value = true; |
||||||
|
target.value = row; |
||||||
|
} |
||||||
|
|
||||||
|
const visible = ref(false); |
||||||
|
|
||||||
|
// 像数据源中添加数据 |
||||||
|
const handleSelected = (row: any = {}) => { |
||||||
|
if (tableData.some(o => o.id === row.id)) { |
||||||
|
ElMessage({ |
||||||
|
message: '用户不能多选!', |
||||||
|
type: 'error' |
||||||
|
}) |
||||||
|
return |
||||||
|
} |
||||||
|
target.value.teacherName = row.realname; |
||||||
|
target.value.teacherXl = row.exp_title; |
||||||
|
target.value.teacherZc = row.exp_zc; |
||||||
|
target.value.teacherZy = row.teamajor; |
||||||
|
target.value.teacherYjfx = row.exp_yjfx; |
||||||
|
target.value.teacherPhone = row.phone; |
||||||
|
target.value.teacherid = row.user_id; |
||||||
|
} |
||||||
|
|
||||||
|
// 提交 |
||||||
|
|
||||||
|
const submit = () => tableData; |
||||||
|
defineExpose({ submit }) |
||||||
|
|
||||||
|
// 删除逻辑 |
||||||
|
const multipleTableRef = ref<any>(null); |
||||||
|
const isSele = ref(false); |
||||||
|
const del = () => { |
||||||
|
const rows = multipleTableRef.value.getSelectionRows() |
||||||
|
rows.forEach((row: any) => { |
||||||
|
const index = tableData.indexOf(row); |
||||||
|
if (index === -1) return; |
||||||
|
tableData.splice(index, 1); |
||||||
|
}) |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss" scoped> |
||||||
|
.btn { |
||||||
|
margin-bottom: 20px; |
||||||
|
} |
||||||
|
|
||||||
|
.table-box { |
||||||
|
.table { |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
.pagin-box { |
||||||
|
width: 100%; |
||||||
|
height: 64px; |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
|
||||||
|
.pagination { |
||||||
|
padding: 0 24px; |
||||||
|
|
||||||
|
:deep() { |
||||||
|
.el-pagination__total { |
||||||
|
margin-right: auto; |
||||||
|
} |
||||||
|
|
||||||
|
li.number.is-active { |
||||||
|
background-color: #42D9AC; |
||||||
|
color: rgba(255, 255, 255, 0.9); |
||||||
|
font-family: Microsoft YaHei UI, Microsoft YaHei UI; |
||||||
|
} |
||||||
|
|
||||||
|
span.el-pagination__jump { |
||||||
|
background-color: #F3F3F3; |
||||||
|
padding: 2px 8px; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
</style> |
Loading…
Reference in new issue