-- 添加学员

This commit is contained in:
yuping
2022-12-17 17:40:47 +08:00
parent 9090261a8f
commit c1983082a5
11 changed files with 1558 additions and 1603 deletions

2
.env
View File

@@ -3,6 +3,8 @@ VUE_APP_BASE_API=/manageApi
VUE_APP_PROXY_URL=http://111.231.196.214:30001/ VUE_APP_PROXY_URL=http://111.231.196.214:30001/
VUE_APP_LOGIN_URL=https://u-pre.boe.com/web VUE_APP_LOGIN_URL=https://u-pre.boe.com/web
VUE_APP_BOE_API_URL=https://u-pre.boe.com
VUE_APP_IFRAME_URL=https://u-pre.boe.com/pc/iframe VUE_APP_IFRAME_URL=https://u-pre.boe.com/pc/iframe
VUE_APP_IFRAME_STUDENT_URL=https://u-pre.boe.com/pc/loading VUE_APP_IFRAME_STUDENT_URL=https://u-pre.boe.com/pc/loading

View File

@@ -1,27 +1,27 @@
<template> <template>
<div id="container" v-if="!isLogin"> <div id="container" v-if="!isLogin">
<nav-top /> <nav-top/>
<div style="display: flex"> <div style="display: flex">
<nav-left /> <nav-left/>
<div style="flex: 1; display: flex; flex-direction: column; width: 0"> <div style="flex: 1; display: flex; flex-direction: column; width: 0">
<open-pages /> <open-pages/>
<bread-crumb /> <bread-crumb/>
<main> <main>
<a-config-provider :locale="zhCN"> <a-config-provider :locale="zhCN">
<router-view /> <router-view/>
</a-config-provider> </a-config-provider>
</main> </main>
</div> </div>
</div> </div>
</div> </div>
<div id="container" v-if="isLogin"> <div id="container" v-if="isLogin">
<router-view /> <router-view/>
</div> </div>
</template> </template>
<script> <script>
import { computed, defineComponent, ref } from "vue"; import {computed, defineComponent, ref} from "vue";
import { useRouter, useRoute } from "vue-router"; import {useRouter, useRoute} from "vue-router";
import { useStore } from "vuex"; import {useStore} from "vuex";
import NavLeft from "@/components/NavLeft"; import NavLeft from "@/components/NavLeft";
import NavTop from "@/components/NavTop"; import NavTop from "@/components/NavTop";
import OpenPages from "@/components/OpenPages"; import OpenPages from "@/components/OpenPages";
@@ -78,7 +78,7 @@ export default defineComponent({
return; return;
} }
const memberInitInfo = await api1 const memberInitInfo = await api1
.getMemberInfo({ keyWord: "", pageNo: 1, pageSize: 10 }) .getMemberInfo({keyWord: "", pageNo: 1, pageSize: 10})
.then((res) => res.data.data.rows); .then((res) => res.data.data.rows);
store.commit("SET_MEMBER_INFO", memberInitInfo); store.commit("SET_MEMBER_INFO", memberInitInfo);
localStorage.setItem("memberInitInfo", JSON.stringify(memberInitInfo)); localStorage.setItem("memberInitInfo", JSON.stringify(memberInitInfo));
@@ -94,13 +94,13 @@ export default defineComponent({
if (localStory) { if (localStory) {
list = localStorage.getItem(key); list = localStorage.getItem(key);
if (list) { if (list) {
store.commit("SET_DICT", { key, data: JSON.parse(list) }); store.commit("SET_DICT", {key, data: JSON.parse(list)});
return; return;
} }
} }
list = await getDictList(key); list = await getDictList(key);
localStory && localStorage.setItem(key, JSON.stringify(list)); localStory && localStorage.setItem(key, JSON.stringify(list));
store.commit("SET_DICT", { key, data: list }); store.commit("SET_DICT", {key, data: list});
} }
const getDictList = (param) => const getDictList = (param) =>
@@ -199,6 +199,34 @@ export default defineComponent({
box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.07); box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.07);
} }
.cus-btn {
width: 100%;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
margin-right: 16px;
border: 1px solid #4ea6ff;
border-radius: 8px;
background: #4ea6ff;
cursor: pointer;
color: #fff;
}
.white {
background: #fff;
color: #4ea6ff;
}
.cus-input {
height: 40px;
border-radius: 8px;
}
.cus-select{
height: 40px;
border-radius: 8px;
}
// @media screen and (max-width: 1366px) { // @media screen and (max-width: 1366px) {
// .cmMain { // .cmMain {
// width: 750px; // width: 750px;

View File

@@ -1,8 +1,4 @@
export const BASE = 'https://pre.boe.com'
export const BASE_DEV = 'https://u-pre.boe.com'
export const USER_LIST = '/userbasic/user/list post' export const USER_LIST = '/userbasic/user/list post'
export const ORG_LIST = '/userbasic/org/list post' export const ORG_LIST = '/userbasic/org/list post'
export const ORG_CHILD_LIST = '/userbasic/org/info post' export const ORG_CHILD_LIST = '/userbasic/org/info post'
export const AUDIENCE_LIST = '/userbasic/audience/list post' export const AUDIENCE_LIST = '/userbasic/audience/list post'

View File

@@ -131,6 +131,8 @@ export const addStudentCourse = (obj) => http.post("/admin/offcourse/addStudent"
// 获取组织结构树 // 获取组织结构树
export const orgtree = () => http.get("/org/tree"); export const orgtree = () => http.get("/org/tree");
export const saveStu = obj => http.post("/admin/student/addStudent", obj); export const saveStu = obj => http.post("/admin/student/addStudent", obj);
export const getStuPage = obj => http.get("/admin/student/getStudent", {params: obj});
export const delStudentList = obj => http.post("/admin/student/delStudent", obj);
export const validateName = obj => http.post("/admin/validate/validateName", obj); export const validateName = obj => http.post("/admin/validate/validateName", obj);
//获取积分列表 //获取积分列表

View File

@@ -122,7 +122,7 @@ export function useRequest(_url, params = {}, init = true) {
export async function request(_url, params) { export async function request(_url, params) {
const s = _url.split(' ') const s = _url.split(' ')
let url = s[0] let url = s[0]
const method = s[1] || 'get' const method = s[1]?.toLowerCase() || 'get'
if (method === 'get') { if (method === 'get') {
let paramsArray = []; let paramsArray = [];
//拼接参数 //拼接参数

View File

@@ -1,187 +1,195 @@
<template> <template>
<a-drawer <div>
:visible="visiableState" <a-drawer
class="drawerStyle ProjCheckship" :visible="visiable"
placement="right" class="drawerStyle ProjCheckship"
width="45%" placement="right"
> width="45%"
<div class="drawerMain" id="ProjCheckship"> >
<div class="header"> <div class="drawerMain" id="ProjCheckship">
<div class="headerTitle"> <div class="header">
{{ {1: '查看权', 2: '管理权', 3: '添加学员'}[type] || '' }} <div class="headerTitle">
{{ {1: '添加学员', 2: '添加学员', 3: '添加学员'}[type] || '' }}
</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
</div> </div>
<img <div style="width:100%;display: grid;grid-template-columns: 750px auto;">
style="width: 29px; height: 29px; cursor: pointer" <div class="tabs">
src="../../assets/images/basicinfo/close.png" <a-tabs v-model:activeKey="activeKey">
@click="closeDrawer" <a-tab-pane :key="1" tab="快速选人">
/> <div :style="{ height: screenHeight - 235 + 'px' }">
</div> <div class="tab1">
<div style="width:100%;display: grid;grid-template-columns: 750px auto;"> <a-form-item label="姓名">
<div class="tabs"> <a-input
<a-tabs v-model:activeKey="activeKey"> v-model:value="nameSearch.keyword"
<a-tab-pane :key="1" tab="快速选人"> style="width: 270px; height: 40px; border-radius: 8px"
<div :style="{ height: screenHeight - 235 + 'px' }"> placeholder="请输入姓名"
<div class="tab1"> />
<a-form-item label="姓名"> <a-button type="primary" @click="onSearchStu" style="margin-left: 20px;border-radius: 4px">
<a-input <template #icon>
v-model:value="nameSearch.keyword" <SearchOutlined/>
style="width: 270px; height: 40px; border-radius: 8px" </template>
placeholder="请输入姓名" 搜索
/> </a-button>
<a-button type="primary" @click="onSearchStu" style="margin-left: 20px;border-radius: 4px"> <a-button @click="resetStu" style="margin-left: 20px;border-radius: 4px">重置</a-button>
<template #icon> </a-form-item>
<SearchOutlined/> </div>
</template> <div class="chooseLeft" style="display: grid;grid-template-columns: 250px auto">
搜索 <div :style="{ height: screenHeight - 235 + 'px' ,overflowY:'auto'}">
</a-button> <a-tree
<a-button @click="resetStu" style="margin-left: 20px;border-radius: 4px">重置</a-button> allow-clear
</a-form-item> tree-default-expand-all
:tree-data="treeData"
:fieldNames="{
children: 'treeChildList',
key: 'id',
title: 'name',
value: 'name',
}"
@select="stuStuOrgSelect"
>
</a-tree>
</div>
<div class="tableBox tabb">
<a-table
:columns="stuColumns"
:data-source="stuData"
:pagination="stuPagination"
:loading="stuLoading"
row-key="id"
:row-selection="stuRowSelection"
/>
</div>
</div>
</div> </div>
<div class="chooseLeft" style="display: grid;grid-template-columns: 250px auto"> </a-tab-pane>
<div :style="{ height: screenHeight - 235 + 'px' ,overflowY:'auto'}"> <a-tab-pane :key="2" tab="添加组织">
<div
:style="{ height: screenHeight - 235 + 'px' }"
>
<div class="tab2">
<a-form-item label="组织:">
<a-input
v-model:value="searchOrgName.keyword"
style="width: 230px; height: 40px; border-radius: 8px"
placeholder="请输入组织"
/>
<a-button type="primary" @click="searchOrg" style="margin-left: 20px;border-radius: 4px">
<template #icon>
<SearchOutlined/>
</template>
搜索
</a-button>
<a-button @click="resetOrg" style="margin-left: 20px;border-radius: 4px">重置</a-button>
</a-form-item>
</div>
<div class="boeTree">
<a-tree <a-tree
allow-clear :tree-data="searchOrgName.keyword ? orgData : treeData"
tree-default-expand-all @select="onOrgSelectChange"
:tree-data="treeData"
:fieldNames="{ :fieldNames="{
children: 'treeChildList', children: 'treeChildList',
key: 'id', key: 'id',
title: 'name', title: 'name',
value: 'name', value: 'name',
}" }"
@select="stuStuOrgSelect" row-key="id"
:row-selection="orgRowSelection"
multiple
> >
</a-tree> </a-tree>
</div> </div>
</div>
</a-tab-pane>
<a-tab-pane :key="3" tab="受众关联">
<div
:style="{ height: screenHeight - 235 + 'px' }"
>
<div>
<a-form-item label="受众名称:">
<a-input
v-model:value="audienceName.keyword"
style="width: 260px; height: 40px; border-radius: 8px"
placeholder="请输入受众名称"
/>
<a-button type="primary" @click="searchAudi" style="margin-left: 20px;border-radius: 4px">
<template #icon>
<SearchOutlined/>
</template>
搜索
</a-button>
<a-button @click="resetAudienceInfo" style="margin-left: 20px;border-radius: 4px">重置</a-button>
</a-form-item>
</div>
<div class="tableBox tabb"> <div class="tableBox tabb">
<a-table <a-table
:columns="stuColumns" style="border: 1px solid #f2f6fe"
:data-source="stuData"
:pagination="stuPagination"
:loading="stuLoading"
row-key="id" row-key="id"
:row-selection="stuRowSelection" :columns="audiColums"
:data-source="audiData"
:loading="audiLoading"
:pagination="auditPagination"
:row-selection="auditRowSelection"
/> />
</div> </div>
</div> </div>
</div> </a-tab-pane>
</a-tab-pane> </a-tabs>
<a-tab-pane :key="2" tab="添加组织">
<div
:style="{ height: screenHeight - 235 + 'px' }"
>
<div class="tab2">
<a-form-item label="组织:">
<a-input
v-model:value="searchOrgName.keyword"
style="width: 230px; height: 40px; border-radius: 8px"
placeholder="请输入组织"
/>
<a-button type="primary" @click="searchOrg" style="margin-left: 20px;border-radius: 4px">
<template #icon>
<SearchOutlined/>
</template>
搜索
</a-button>
<a-button @click="resetOrg" style="margin-left: 20px;border-radius: 4px">重置</a-button>
</a-form-item>
</div>
<div class="boeTree">
<a-tree
:tree-data="searchOrgName.keyword ? orgData : treeData"
@select="onOrgSelectChange"
:fieldNames="{
children: 'treeChildList',
key: 'id',
title: 'name',
value: 'name',
}"
row-key="id"
:row-selection="orgRowSelection"
multiple
>
</a-tree>
<!-- <div>-->
<!-- <a-table-->
<!-- :columns="stuColumns"-->
<!-- :data-source="stuData"-->
<!-- :pagination="stuPagination"-->
<!-- :loading="orgLoading"-->
<!-- row-key="id"-->
<!-- :row-selection="stuRowSelection"-->
<!-- />-->
<!-- </div>-->
</div>
</div>
</a-tab-pane>
<a-tab-pane :key="3" tab="受众关联">
<div
:style="{ height: screenHeight - 235 + 'px' }"
>
<div>
<a-form-item label="受众名称:">
<a-input
v-model:value="audienceName.keyword"
style="width: 260px; height: 40px; border-radius: 8px"
placeholder="请输入受众名称"
/>
<a-button type="primary" @click="searchAudi" style="margin-left: 20px;border-radius: 4px">
<template #icon>
<SearchOutlined/>
</template>
搜索
</a-button>
<a-button @click="resetAudienceInfo" style="margin-left: 20px;border-radius: 4px">重置</a-button>
</a-form-item>
</div>
<div class="tableBox tabb">
<a-table
style="border: 1px solid #f2f6fe"
row-key="id"
:columns="audiColums"
:data-source="audiData"
:loading="audiLoading"
:pagination="auditPagination"
:row-selection="auditRowSelection"
/>
</div>
</div>
</a-tab-pane>
</a-tabs>
</div>
<div style="padding:100px 0 0 20px;display: grid;grid-template-rows: auto auto auto;">
<div>
<div style="margin-top: 20px">快速选人</div>
<a-tag :closable="true" color="#4ea6ff" @close="stuDel(i)" v-for="(item,i) in selectsData.studentList"
:key="i" style="margin-top:20px">
{{ item.realName }}
</a-tag>
</div> </div>
<div> <div style="padding:100px 0 0 20px;display: grid;grid-template-rows: auto auto auto;">
<div style="margin-top: 20px">组织添加</div> <div>
<a-tag :closable="true" color="#4ea6ff" @close="orgDel(i)" v-for="(item,i) in selectsData.deptList" :key="i" <div style="margin-top: 20px">快速选人</div>
style="margin-top:20px"> <a-tag :closable="true" color="#4ea6ff" @close="stuDel(i)" v-for="(item,i) in selectsData.studentList"
{{ item.name }} :key="i" style="margin-top:20px">
</a-tag> {{ item.realName }}
</div> </a-tag>
<div> </div>
<div style="margin-top: 20px">受众添加</div> <div>
<a-tag :closable="true" color="#4ea6ff" @close="AuditDel(i)" v-for="(item,i) in selectsData.groupList" <div style="margin-top: 20px">组织添加</div>
:key="i" style="margin-top:20px"> <a-tag :closable="true" color="#4ea6ff" @close="orgDel(i)" v-for="(item,i) in selectsData.deptList"
{{ item.audienceName }} :key="i"
</a-tag> style="margin-top:20px">
{{ item.name }}
</a-tag>
</div>
<div>
<div style="margin-top: 20px">受众添加</div>
<a-tag :closable="true" color="#4ea6ff" @close="AuditDel(i)" v-for="(item,i) in selectsData.groupList"
:key="i" style="margin-top:20px">
{{ item.audienceName }}
</a-tag>
</div>
</div> </div>
</div> </div>
<div class="btnn">
<button class="btn1" @click="closeDrawer">取消</button>
<button class="btn2" @click="submitAuth">确定</button>
</div>
</div> </div>
<div class="btnn"> </a-drawer>
<button class="btn1" @click="closeDrawer">取消</button> <div @click="openDrawer">
<button class="btn2" @click="submitAuth">确定</button> <slot></slot>
</div>
</div> </div>
</a-drawer> </div>
<a-modal v-model:visible="stageVisible" width="1000px" title="选择阶段" @ok="handleStageOk">
<div>
{{ type === 1 ? '选择阶段' : '选择关卡' }}
<a-select style="width: 150px" :placeholder="type===1?'选择阶段':'选择关卡'" v-model:value="selectsData.stageId"
className="cus-select">
<a-select-option v-for="(item,i) in stageIds" :key="i" :value="item.id">{{
item.name || '默认'
}}
</a-select-option>
</a-select>
</div>
</a-modal>
</template> </template>
<script setup> <script setup>
import {computed, defineEmits, defineProps, onMounted, ref} from "vue"; import {computed, defineEmits, defineProps, ref, watch} from "vue";
import {useStore} from "vuex"; import {useStore} from "vuex";
import {useBoeApi, useBoeApiPage} from "@/api/request"; import {useBoeApi, useBoeApiPage} from "@/api/request";
import {AUDIENCE_LIST, ORG_LIST, USER_LIST} from "@/api/ThirdApi"; import {AUDIENCE_LIST, ORG_LIST, USER_LIST} from "@/api/ThirdApi";
@@ -191,16 +199,17 @@ const store = useStore();
const emit = defineEmits({}) const emit = defineEmits({})
const props = defineProps({ const props = defineProps({
type: Number, type: Number,
visiable: { id: String,
type: Boolean, stage: {
default: false type: Array,
}, default: () => []
}
}) })
const visiable = ref(false)
const visiableState = computed(() => props.visiable)
const activeKey = ref(1) const activeKey = ref(1)
const stageVisible = ref(false)
const selectsData = ref({ const selectsData = ref({
stageId: '',
studentList: [], studentList: [],
deptList: [], deptList: [],
groupList: [] groupList: []
@@ -222,6 +231,8 @@ const searchOrgName = ref({
pageSize: 10 pageSize: 10
}) })
const stageIds = computed(() => props.stage)
const { const {
data: stuData, data: stuData,
fetch: searchStu, fetch: searchStu,
@@ -250,7 +261,7 @@ const {
total: audiTotal total: audiTotal
} = useBoeApiPage(AUDIENCE_LIST, audienceName.value, { } = useBoeApiPage(AUDIENCE_LIST, audienceName.value, {
init: true, init: true,
result: res => res.result.audienceList, result: res => res.result.audienceList.map(e => ({...e, id: e.id + ''})),
totalPage: res => res.result.totalPage, totalPage: res => res.result.totalPage,
total: res => res.result.totalElement total: res => res.result.totalElement
}) })
@@ -367,11 +378,11 @@ const auditRowSelection = computed(() => ({
preserveSelectedRowKeys: true, preserveSelectedRowKeys: true,
})) }))
onMounted(() => {
});
const closeDrawer = () => { const closeDrawer = () => {
visiable.value = false
};
const openDrawer = () => {
visiable.value = true
}; };
//获取组织树 //获取组织树
const treeData = computed(() => { const treeData = computed(() => {
@@ -397,6 +408,7 @@ function AuditDel(i) {
auditSelectKeys.value = auditSelectKeys.value.filter(e => e !== selectsData.value.groupList[i].id) auditSelectKeys.value = auditSelectKeys.value.filter(e => e !== selectsData.value.groupList[i].id)
selectsData.value.groupList.splice(i, 1) selectsData.value.groupList.splice(i, 1)
} }
// //
// function orgSelect(key, obj) { // function orgSelect(key, obj) {
// console.log(obj) // console.log(obj)
@@ -432,8 +444,6 @@ const changePagination = (page) => {
}; };
const auditChangePagination = (page) => { const auditChangePagination = (page) => {
console.log(1111111111)
console.log(page)
audienceName.value.page = page; audienceName.value.page = page;
searchAudi() searchAudi()
}; };
@@ -468,14 +478,50 @@ const resetAudienceInfo = () => {
// }; // };
//确定添加授权 //确定添加授权
const submitAuth = () => { const submitAuth = () => {
emit('update:visiable', false) if (props.type !== 3) {
saveStu(selectsData.value) stageVisible.value = true
} else {
handleStageOk()
}
}; };
function handleStageOk() {
stageVisible.value = false
visiable.value = false
emit('finash', false)
saveStu({
targetId: props.id,
type: props.type,
deptIds: selectsData.value.deptList?.map(e => e.id),
stageId: selectsData.value.stageId,
groupIds: selectsData.value.groupList?.map(e => e.id),
studentList: selectsData.value.studentList
}).then(() => {
emit('finash', true)
})
}
watch(visiable, () => {
stuSelectKeys.value = []
orgSelectKeys.value = []
auditSelectKeys.value = []
selectsData.value = {
stageId: '',
studentList: [],
deptList: [],
groupList: []
}
})
</script> </script>
<style> <style>
.ant-btn-primary { .ant-btn-primary {
background-color: #4ea6ff !important; background-color: #4ea6ff !important;
} }
.cus-select {
height: 40px;
border-radius: 8px;
}
</style> </style>

View File

@@ -0,0 +1,213 @@
<template>
<div>
<a-row type="flex" gutter="12" style="padding-left: 20px">
<a-col>
<a-form-item title="姓名:" @click="getStuList">
<a-input class="cus-input" v-model:value="tableParam.studentName" placeholder="请输入姓名"/>
</a-form-item>
</a-col>
<a-col>
<a-button class="cus-btn" style="width: 100px">
<template #icon>
<img style="margin-right: 10px" src="../../assets/images/courseManage/search0.png"/></template>
搜索
</a-button>
</a-col>
<a-col :span="2">
<a-button class="cus-btn white" style="width: 100px" @click="reset">重置</a-button>
</a-col>
</a-row>
<a-row type="flex" gutter="12" style="padding-left: 20px">
<a-col :span="1.5">
<CommonStudent :type="type" :id="id" @finash="submitCall" :stage="stage">
<a-button class="cus-btn">
<template #icon><img style="margin-right: 10px" src="../../assets/images/courseManage/add0.png"/></template>
添加学员
</a-button>
</CommonStudent>
</a-col>
<a-col :span="1.5">
<a-button class="cus-btn white" @click="bathDel">
<template #icon><img style="margin-right: 10px" src="../../assets/images/projectadd/delete.png"/></template>
批量删除
</a-button>
</a-col>
</a-row>
<div style="margin-top: 20px">
<a-table
:columns="tablecolumns"
:data-source="tableData.list"
:pagination="stuPagination"
:loading="tableData.loading"
row-key="id"
:row-selection="stuRowSelection"
>
<template #action="{record}">
<a-row gutter="12">
<a-col>
<slot name="extension" v-bind:data="{record}"></slot>
</a-col>
<a-col>
<a-select style="width: 80px" value="更多">
<a-select-option value="删除" label="删除">
<div @click="del(record.id)">删除</div>
</a-select-option>
</a-select>
</a-col>
</a-row>
</template>
</a-table>
</div>
</div>
</template>
<script setup>
import {computed, defineProps, onMounted, ref, watch} from "vue";
import {delStudentList, getStuPage} from "@/api/index1";
import CommonStudent from '@/components/student/CommonStudent'
const props = defineProps({
type: Number,
id: String,
columns: {
type: Array,
default: () => []
},
stage: {
type: Array,
default: () => []
}
})
const tablecolumns = ref([
{
title: "姓名",
dataIndex: "studentName",
key: "studentName",
width: "20%",
align: "left",
className: "h",
},
{
title: "工号",
dataIndex: "studentUserNo",
key: "studentUserNo",
width: "10%",
align: "center",
className: "h",
ellipsis: true,
},
{
title: "部门",
dataIndex: "studentDepartName",
key: "studentDepartName",
width: "10%",
align: "center",
className: "h",
ellipsis: true,
},
{
title: "加入方式",
dataIndex: "source",
key: "source",
width: "10%",
align: "center",
customRender: ({record: {source}}) => ({1: '快速添加', 2: '组织', 3: '受众'}[source])
},
...props.columns,
{
title: "操作",
dataIndex: "operation",
key: "operation",
width: "25%",
align: "center",
slots: {customRender: 'action'}
},
]);
const tableParam = ref({
studentName: "",
pageNo: 1,
pageSize: 10,
type: props.type,
pid: props.id,
})
const stuSelectKeys = ref([])
const tableData = ref({
list: [],
total: 0,
loading: false
})
const stuRowSelection = computed(() => ({
columnWidth: 20,
selectedRowKeys: stuSelectKeys.value,
onChange: onStuSelectChange,
preserveSelectedRowKeys: true,
}))
onMounted(() => {
getStuList()
})
function onStuSelectChange(e) {
stuSelectKeys.value = e
}
const stuPagination = computed(() => ({
total: tableData.value.total,
showSizeChanger: false,
current: tableParam.value.pageNo,
pageSize: tableParam.value.pageSize,
onChange: changePagination
}))
function changePagination(page) {
tableParam.value.pageNo = page;
getStuList()
}
function getStuList() {
tableData.value.loading = true
getStuPage(tableParam.value).then(res => {
tableData.value.total = res.data.data.total;
tableData.value.list = res.data.data.records;
tableData.value.loading = false;
})
}
function reset() {
}
function bathDel() {
stuSelectKeys.value && stuSelectKeys.value.length && delStudentList({
ids: stuSelectKeys.value,
}).then(() => {
getStuList()
})
}
function del(id) {
id && delStudentList({
ids: [id],
}).then(() => {
getStuList()
})
}
function submitCall(flag) {
tableData.value.loading = true
flag && getStuList()
}
</script>
<style>
.studentopea1 {
font-size: 14px;
font-weight: 400;
color: #387df7;
line-height: 22px;
padding-right: 8px;
border-right: 1px solid #e9e9e9;
cursor: pointer;
}
</style>

View File

@@ -2276,236 +2276,168 @@
<span>{{ currentPlanItem.teacher }}</span> <span>{{ currentPlanItem.teacher }}</span>
</div> </div>
<div class="stmm_i5"> <div class="stmm_i5">
<div class="i5_left"> <TableStudent :type="3" :id="offcourseId" :columns="stuColumns">
<!-- <a-input <!-- <template #extension = "data">-->
v-model:value="xygl_inputV1" <!-- <div style="display: flex">-->
style=" <!-- <button @click="handlJoinStu(data)">成绩录入</button>-->
width: 270px; <!-- </div>-->
height: 40px; <!-- </template>-->
border-radius: 8px; </TableStudent>
margin-right: 14px;
"
placeholder="请输入姓名"
/> -->
<a-input
v-model:value="xygl_inputV1"
placeholder="请输入姓名"
style="
width: 400px;
height: 40px;
border-radius: 8px;
margin-right: 14px;
"
/>
<div class="btn btn1" @click="handleSearchStu">
<div class="search"></div>
<div class="btnText">搜索</div>
</div>
<div class="btnn btn2" @click="handleRestStu">
<div class="search"></div>
<div class="btnText">重置</div>
</div>
</div>
<div class="btns">
<div class="btn btn3" @click="showStuAdd(currentPlanItem)">
<div class="search"></div>
<div class="btnText">添加学员</div>
</div>
<!-- 2022-11-30注释 后面放开 -->
<!-- <div class="stmm_btn btn4" @click="hideShow">
<div class="btn4_sub">
<span style="color: #4ea6ff; margin-right: 4px">
批量操作
</span>
<div
class="b_zk"
:style="{ display: hideshow ? 'block' : 'none' }"
></div>
<div
class="b_sq"
:style="{ display: hideshow ? 'none' : 'block' }"
></div>
</div>
<div
class="btn4_sup"
:style="{ display: hideshow ? 'none' : 'block' }"
>
<div class="btnsbox">
<div class="btn4_tit" @click="handleAllJion">
<span style="color: #4ea6ff">批量录入成绩</span>
</div>
<div class="btn4_op1" @click="handleAllover">
<span>批量结业</span>
</div>
<div class="btn4_op2" @click="handleAllSuc">
<span>批量通过</span>
</div>
<div class="btn4_op3" @click="handleAllReject">
<span>批量拒绝</span>
</div>
</div>
</div>
</div>
<div class="stmm_btn btn5" @click="handleExportStu">
<div class="export"></div>
<div class="btnText">导出</div>
</div> -->
</div>
</div> </div>
<div class="tableBox" style="margin-top: 20px"> <div class="tableBox" style="margin-top: 20px">
<a-table <!-- <a-table-->
:columns="columns7" <!-- :columns="columns7"-->
:data-source="tableData7" <!-- :data-source="tableData7"-->
:loading="tableDataTotal3 === -1 ? true : false" <!-- :loading="tableDataTotal3 === -1 ? true : false"-->
:scroll="{ x: 800 }" <!-- :scroll="{ x: 800 }"-->
expandRowByClick="true" <!-- expandRowByClick="true"-->
@expand="expandTable" <!-- @expand="expandTable"-->
:pagination="false" <!-- :pagination="false"-->
:row-selection="{ <!-- :row-selection="{-->
selectedRowKeys: selectedRowKeys7, <!-- selectedRowKeys: selectedRowKeys7,-->
onChange: onSelectChange7, <!-- onChange: onSelectChange7,-->
}" <!-- }"-->
> <!-- >-->
<template #bodyCell="{ record, column }"> <!-- <template #bodyCell="{ record, column }">-->
<!-- 操作1 --> <!-- &lt;!&ndash; 操作1 &ndash;&gt;-->
<template <!-- <template-->
v-if=" <!-- v-if="-->
(String(record.applyStatus) === '0' || <!-- (String(record.applyStatus) === '0' ||-->
record.status === '待审核') && <!-- record.status === '待审核') &&-->
column.key === 'overstatus' <!-- column.key === 'overstatus'-->
" <!-- "-->
> <!-- >-->
<span class="table-operation">-</span> <!-- <span class="table-operation">-</span>-->
</template> <!-- </template>-->
<template <!-- <template-->
v-if=" <!-- v-if="-->
(String(record.applyStatus) === '-1' || <!-- (String(record.applyStatus) === '-1' ||-->
record.status === '已拒绝') && <!-- record.status === '已拒绝') &&-->
column.key === 'overstatus' <!-- column.key === 'overstatus'-->
" <!-- "-->
> <!-- >-->
<span class="table-operation">-</span> <!-- <span class="table-operation">-</span>-->
</template> <!-- </template>-->
<template <!-- <template-->
v-if=" <!-- v-if="-->
(String(record.applyStatus) === '1' || <!-- (String(record.applyStatus) === '1' ||-->
record.status === '已通过') && <!-- record.status === '已通过') &&-->
column.key === 'overstatus' <!-- column.key === 'overstatus'-->
" <!-- "-->
> <!-- >-->
<span class="table-operation"> <!-- <span class="table-operation">-->
<a <!-- <a-->
@click=" <!-- @click="-->
() => { <!-- () => {-->
handlJoinStu(record); <!-- handlJoinStu(record);-->
} <!-- }-->
" <!-- "-->
> <!-- >-->
成绩录入 <!-- 成绩录入-->
</a> <!-- </a>-->
<a <!-- <a-->
@click=" <!-- @click="-->
() => { <!-- () => {-->
handleOverStu(record); <!-- handleOverStu(record);-->
} <!-- }-->
" <!-- "-->
> <!-- >-->
结业 <!-- 结业-->
</a> <!-- </a>-->
</span> <!-- </span>-->
</template> <!-- </template>-->
<!-- 操作2 --> <!-- &lt;!&ndash; 操作2 &ndash;&gt;-->
<template <!-- <template-->
v-if=" <!-- v-if="-->
(String(record.applyStatus) === '0' || <!-- (String(record.applyStatus) === '0' ||-->
record.status === '待审核') && <!-- record.status === '待审核') &&-->
column.key === 'operation' <!-- column.key === 'operation'-->
" <!-- "-->
> <!-- >-->
<span class="table-operation"> <!-- <span class="table-operation">-->
<a <!-- <a-->
@click=" <!-- @click="-->
() => { <!-- () => {-->
handleSucessStu(record); <!-- handleSucessStu(record);-->
} <!-- }-->
" <!-- "-->
> <!-- >-->
通过 <!-- 通过-->
</a> <!-- </a>-->
<a <!-- <a-->
@click=" <!-- @click="-->
() => { <!-- () => {-->
handleRejectStu(record); <!-- handleRejectStu(record);-->
} <!-- }-->
" <!-- "-->
> <!-- >-->
拒绝 <!-- 拒绝-->
</a> <!-- </a>-->
<a <!-- <a-->
@click=" <!-- @click="-->
() => { <!-- () => {-->
handleDeleteStu(record); <!-- handleDeleteStu(record);-->
} <!-- }-->
" <!-- "-->
> <!-- >-->
删除 <!-- 删除-->
</a> <!-- </a>-->
</span> <!-- </span>-->
</template> <!-- </template>-->
<template <!-- <template-->
v-if=" <!-- v-if="-->
(String(record.applyStatus) === '1' || <!-- (String(record.applyStatus) === '1' ||-->
record.status === '已通过') && <!-- record.status === '已通过') &&-->
column.key === 'operation' <!-- column.key === 'operation'-->
" <!-- "-->
> <!-- >-->
<span class="table-operation"> <!-- <span class="table-operation">-->
<a <!-- <a-->
@click=" <!-- @click="-->
() => { <!-- () => {-->
handleDeleteStu(record); <!-- handleDeleteStu(record);-->
} <!-- }-->
" <!-- "-->
> <!-- >-->
删除 <!-- 删除-->
</a> <!-- </a>-->
</span> <!-- </span>-->
</template> <!-- </template>-->
<template <!-- <template-->
v-if=" <!-- v-if="-->
(String(record.applyStatus) === '-1' || <!-- (String(record.applyStatus) === '-1' ||-->
record.status === '已拒绝') && <!-- record.status === '已拒绝') &&-->
column.key === 'operation' <!-- column.key === 'operation'-->
" <!-- "-->
> <!-- >-->
<span class="table-operation"> <!-- <span class="table-operation">-->
<a <!-- <a-->
@click=" <!-- @click="-->
() => { <!-- () => {-->
handleDeleteStu(record); <!-- handleDeleteStu(record);-->
} <!-- }-->
" <!-- "-->
> <!-- >-->
删除 <!-- 删除-->
</a> <!-- </a>-->
</span> <!-- </span>-->
</template> <!-- </template>-->
</template> <!-- </template>-->
</a-table> <!-- </a-table>-->
<div class="tableBox" style="margin-top: 50px"> <!-- <div class="tableBox" style="margin-top: 50px">-->
<div class="pa"> <!-- <div class="pa">-->
<a-pagination <!-- <a-pagination-->
:showSizeChanger="false" <!-- :showSizeChanger="false"-->
showQuickJumper="true" <!-- showQuickJumper="true"-->
hideOnSinglePage="true" <!-- hideOnSinglePage="true"-->
:pageSize="pageSize3" <!-- :pageSize="pageSize3"-->
:current="currentPage3" <!-- :current="currentPage3"-->
:total="tableDataTotal3" <!-- :total="tableDataTotal3"-->
class="pagination" <!-- class="pagination"-->
@change="handelChangePage3" <!-- @change="handelChangePage3"-->
/> <!-- />-->
</div> <!-- </div>-->
</div> <!-- </div>-->
</div> </div>
</div> </div>
</div> </div>
@@ -2604,11 +2536,11 @@
</div> </div>
</div> </div>
<div class="qrm_btnbox"> <div class="qrm_btnbox">
<div class="qrm_btn btn1"> <div class="qrm_btn btn1" @click="rg_exit">
<div class="btnText" @click="rg_exit">取消</div> <div class="btnText">取消</div>
</div> </div>
<div class="qrm_btn btn2"> <div class="qrm_btn btn2" @click="handleJoin">
<div class="btnText" @click="handleJoin">确定</div> <div class="btnText">确定</div>
</div> </div>
</div> </div>
</div> </div>
@@ -2930,6 +2862,7 @@ import { queryWorkDetailById } from "@/api/indexWork";
import { queryExaminationDetailById } from "@/api/indexExam"; import { queryExaminationDetailById } from "@/api/indexExam";
import AddHomework from "../../components/drawers/AddHomework.vue"; import AddHomework from "../../components/drawers/AddHomework.vue";
import AddTest from "../../components/drawers/AddTest.vue"; import AddTest from "../../components/drawers/AddTest.vue";
import TableStudent from "@/components/student/TableStudent";
//列表表格 //列表表格
const columns1 = [ const columns1 = [
// { // {
@@ -3448,6 +3381,7 @@ export default defineComponent({
AddHomework, AddHomework,
AddTest, AddTest,
NameInput, NameInput,
TableStudent,
// VNodes: (_, {attrs}) => { // VNodes: (_, {attrs}) => {
// return attrs.vnodes; // return attrs.vnodes;
// }, // },
@@ -3458,6 +3392,72 @@ export default defineComponent({
const CourseModalRef = ref(null); const CourseModalRef = ref(null);
const state = reactive({ const state = reactive({
stuColumns:[
{
title: "报名状态",
width: '10%',
dataIndex: "status",
key: "5",
align: "center",
customRender: ({ record }) => {
switch (String(record.source)) {
case "0":
return "待审核";
case "1":
return "审核通过";
case "2":
return "审核拒绝";
}
},
},
{
title: "加入方式",
width: '10%',
dataIndex: "join",
key: "6",
align: "center",
customRender: ({ record }) => {
switch (String(record.source)) {
case "1":
return "手动加入";
case "2":
return "报名加入";
}
},
},
{
title: "签到状态",
width: '10%',
dataIndex: "signstatus",
key: "7",
align: "center",
customRender: ({ record }) => {
switch (String(record.signStatus)) {
case "0":
return "未签到";
case "1":
return "已签到";
case "2":
return "请假";
}
},
},
{
title: "评估状态",
width: '10%',
dataIndex: "evastatus",
key: "8",
align: "center",
customRender: ({ record }) => {
switch (String(record.evalStatus)) {
case "0":
return "未评估";
case "1":
return "已评估";
}
},
},
],
shipType: 1, shipType: 1,
addLoading: false, addLoading: false,
currentPlanItem: {}, currentPlanItem: {},
@@ -8640,6 +8640,30 @@ export default defineComponent({
margin-bottom: 20px; margin-bottom: 20px;
} }
.cus-btn {
width: 100%;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
margin-right: 16px;
border: 1px solid #4ea6ff;
border-radius: 8px;
background: #4ea6ff;
cursor: pointer;
color: #fff;
}
.white {
background: #fff;
color: #4ea6ff;
}
.cus-input {
height: 40px;
border-radius: 8px;
}
// .tableSelect { // .tableSelect {
// position: relative; // position: relative;
// .hoverList { // .hoverList {

View File

@@ -505,127 +505,7 @@
</div> </div>
</a-tab-pane> </a-tab-pane>
<a-tab-pane key="3" tab="学员管理" force-render> <a-tab-pane key="3" tab="学员管理" force-render>
<div class="split"></div> <TableStudent :type="3" :id="routerId"></TableStudent>
<div class="xwid">
<div class="pad"></div>
<div class="xin" style="overflow-x: auto">
<div class="xhead">
<a-input
v-model:value="gatenamee"
style="width: 270px; height: 40px; border-radius: 8px"
placeholder="请输入姓名"
/>
<div class="btns" @click="searchLevel">
<div class="btn btn1">
<div class="search"></div>
<a-button
class="btnText"
style="
border: none;
background: none;
transform: translateY(-20%);
"
>搜索
</a-button>
</div>
<div class="btn btn2" @click="resetLevel">
<div class="search"></div>
<a-button
style="
border: none;
background: none;
transform: translateY(-20%);
width: 100%;
"
class="btnText"
>重置</a-button
>
</div>
</div>
</div>
<div class="xheadb">
<button class="addx" @click="showAddStu">添加学员</button>
<!-- 2022-11-30注释 后面放开 -->
<!-- <button class="addd" @click="showImpStu">导入学员</button> -->
<div class="select">
<a-button
style="
border: 1px solid rgba(64, 158, 255, 1);
background: none;
width: 130px;
height: 40px;
font-size: 14px;
font-weight: 400;
color: rgba(64, 158, 255, 1);
margin-left: 5px;
border-radius: 8px;
cursor: pointer;
"
class="btnText"
@click="deleteStu()"
>批量删除</a-button
>
<!-- <a-select
style="width: 130px"
value="更多操作"
@change="handleStuChange"
:options="projectNameList"
>
</a-select> -->
</div>
</div>
<!-- 2022-12-11注释 后面放开 -->
<!--
<div class="talk">
<img class="im" src="../../assets/images/leveladd/gan.png" />
<div class="xu">
<span class="yi">已选择</span>
<div style="width: 5px; display: inline-block"></div>
<span class="th">{{ selectedRowKeys.length }}</span>
<div style="width: 5px; display: inline-block"></div>
<span class="yi"></span>
<span class="zon">列表选项总数</span>
<span class="th">{{ stuTotal }}</span>
<span class="yi"> </span>
</div>
<div class="clear" @click="clearChooseStu">清空</div>
</div>-->
<div class="tableBox" style="margin-top: 30px">
<a-table
style="border: 1px solid #f2f6fe"
:columns="tableDataFunc()"
:scroll="{ x: 1400 }"
:data-source="tableData"
:loading="tableDataTotal === -1 ? true : false"
expandRowByClick="true"
@expand="expandTable"
:pagination="false"
:row-selection="{
columnWidth: 30,
selectedRowKeys: selectedRowKeys,
onChange: onSelectChange,
}"
/>
<div class="pa">
<a-pagination
v-if="tableDataTotal > 10"
:showSizeChanger="false"
showQuickJumper="true"
hideOnSinglePage="true"
:pageSize="pageSize"
:current="currentPage"
:total="tableDataTotal"
@change="pageChange"
class="pagination"
style="display: block"
/>
</div>
</div>
</div>
<div class="pad"></div>
</div>
</a-tab-pane> </a-tab-pane>
<!--1211注释 待开放 <!--1211注释 待开放
<a-tab-pane key="4" tab="设置"> <a-tab-pane key="4" tab="设置">
@@ -1232,6 +1112,7 @@ import * as api from "../../api/index1";
import { editRoutered } from "../../api/indexLearningPath"; import { editRoutered } from "../../api/indexLearningPath";
import { codeUrl } from "../../api/method"; import { codeUrl } from "../../api/method";
import TwoDimensionalCode from "../../components/TwoDimensionalCode.vue"; import TwoDimensionalCode from "../../components/TwoDimensionalCode.vue";
import TableStudent from "@/components/student/TableStudent";
// import * as student from "@/api/student"; // import * as student from "@/api/student";
export default { export default {
name: "LevelAdd", name: "LevelAdd",
@@ -1248,6 +1129,7 @@ export default {
WorkManage, WorkManage,
SeeStu, SeeStu,
TwoDimensionalCode, TwoDimensionalCode,
TableStudent,
}, },
setup() { setup() {
const router = useRouter(); const router = useRouter();

File diff suppressed because it is too large Load Diff

View File

@@ -22,6 +22,9 @@ module.exports = defineConfig({
pathRewrite: { pathRewrite: {
"^/manageApi": "", "^/manageApi": "",
}, },
},"/userbasic": {
target: process.env.VUE_APP_BOE_API_URL,
changeOrigin: true, //表示是否改变原域名
}, },
}, },
}, },