学生等修复

dev_2022-05-11
yujialong 3 years ago
parent 91033ece9d
commit 5637e7930a
  1. 2
      src/pages/setting/list/info.vue
  2. 468
      src/pages/student/list/index.vue
  3. 2
      src/store/modules/user.js
  4. 14
      vue.config.js

@ -211,7 +211,7 @@
width="30%">
<el-form ref="form" :model="form" label-width="60px">
<el-form-item label="手机号">
<el-input placeholder="请输入手机号" v-model="phone" maxlength="11"></el-input>
<el-input style="width: 404px;" placeholder="请输入手机号" v-model="phone" maxlength="11"></el-input>
</el-form-item>
<el-form-item label="验证码">
<div class="flex-between">

@ -1,250 +1,244 @@
<template>
<div>
<el-row :gutter="20">
<el-col :span="4">
<div class="page">
<div class="m-b-20">
<h6 class="p-title">学生</h6>
<el-radio-group v-model="studentType" @change="changeStudentType">
<div class="m-b-20">
<el-radio :label="1">所有学生</el-radio>
</div>
<div>
<el-radio :label="2">未加入班级的学生</el-radio>
</div>
</el-radio-group>
</div>
<el-divider></el-divider>
<div>
<div class="flex-between m-b-20">
<h6 class="p-title" style="margin-bottom: 0">学生组织架构</h6>
<el-button v-if="auth('学生组织架构添加')" type="text" @click="handleAdd">添加</el-button>
</div>
<div style="height: 504px; max-height: 504px; overflow: auto">
<org-tree
v-if="treeVisible"
default-expand-all
ref="orgTree"
node-key="id"
highlight-current
lazy
:load="loadNodeTree"
:expand-on-click-node="false"
@node-click="handleNodeClick"
:props="{children: 'children', label: 'organizationName', isLeaf: 'leaf'}"
>
<span class="custom-tree-node" slot-scope="{ node, data }">
<span style="display: inline-block; margin-right: 20px">{{ node.label }}</span>
<span>
<el-button
v-if="auth('学生组织架构编辑')"
type="text"
icon="el-icon-edit-outline"
@click="() => handleEdit(node, data)">
</el-button>
<el-button
v-if="auth('学生组织架构添加')&&node.level < 3"
type="text"
icon="el-icon-circle-plus-outline"
@click="() => handleAdd(node, data)">
</el-button>
</span>
</span>
</org-tree>
</div>
</div>
<div class="flex">
<div class="page" style="width: 17%">
<div class="m-b-20">
<h6 class="p-title">学生</h6>
<el-radio-group v-model="studentType" @change="changeStudentType">
<div class="m-b-20">
<el-radio :label="1">所有学生</el-radio>
</div>
<div>
<el-radio :label="2">未加入班级的学生</el-radio>
</div>
</el-radio-group>
</div>
<el-divider></el-divider>
<div>
<div class="flex-between m-b-20">
<h6 class="p-title" style="margin-bottom: 0">学生组织架构</h6>
<el-button v-if="auth('学生组织架构添加')" type="text" @click="handleAdd">添加</el-button>
</div>
<el-dialog
:title="orgTitle"
:visible.sync="orgVisible"
:close-on-click-modal="false"
width="50%"
@close="handleClose"
>
<el-form v-if="orgVisible" ref="orgForm" :model="orgForm" :rules="rules" label-width="100px">
<el-form-item :label="labelName" prop="organizationName">
<el-input v-model.trim="orgForm.organizationName" placeholder="请输入"></el-input>
</el-form-item>
<el-form-item label="上级部门">
<el-cascader
v-if="showCascader"
v-model="cascaderValue"
:props="cascaderProps"
@change="handleChangeCascader"
clearable
style="width: 100%"
>
</el-cascader>
<span v-else>{{ orgForm.parentName }}</span>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button v-if="isAddOrg" @click="handleClose"> </el-button>
<el-button v-if="!isAddOrg" type="danger" plain @click="handleDel">删除</el-button>
<el-button type="primary" @click="orgSubmit"> </el-button>
<div style="height: 504px; max-height: 504px; overflow: auto">
<org-tree
v-if="treeVisible"
default-expand-all
ref="orgTree"
node-key="id"
highlight-current
lazy
:load="loadNodeTree"
:expand-on-click-node="false"
@node-click="handleNodeClick"
:props="{children: 'children', label: 'organizationName', isLeaf: 'leaf'}"
>
<span class="custom-tree-node" slot-scope="{ node, data }">
<span style="display: inline-block; margin-right: 20px">{{ node.label }}</span>
<span>
<el-button
v-if="auth('学生组织架构编辑')"
type="text"
icon="el-icon-edit-outline"
@click="() => handleEdit(node, data)">
</el-button>
<el-button
v-if="auth('学生组织架构添加')&&node.level < 3"
type="text"
icon="el-icon-circle-plus-outline"
@click="() => handleAdd(node, data)">
</el-button>
</span>
</el-dialog>
</span>
</org-tree>
</div>
</div>
</div>
</el-col>
<el-col :span="20">
<div class="page">
<h6 class="p-title">筛选</h6>
<div class="tool">
<ul class="filter">
<li>
<el-input style="width: 250px;" placeholder="请输入学生姓名/学号" prefix-icon="el-icon-search" v-model="keyWord" clearable></el-input>
</li>
</ul>
<div>
<el-button type="info" v-if="auth('新增学生')" @click="addStudent">新增学生</el-button>
<el-button type="primary" v-if="auth('批量导入')" @click="batchImport">批量导入</el-button>
<el-button type="primary" v-if="auth('批量删除')" @click="delAllSelection">批量删除</el-button>
</div>
</div>
<el-dialog
:title="orgTitle"
:visible.sync="orgVisible"
:close-on-click-modal="false"
width="50%"
@close="handleClose"
>
<el-form v-if="orgVisible" ref="orgForm" :model="orgForm" :rules="rules" label-width="100px">
<el-form-item :label="labelName" prop="organizationName">
<el-input v-model.trim="orgForm.organizationName" placeholder="请输入"></el-input>
</el-form-item>
<el-form-item label="上级部门">
<el-cascader
v-if="showCascader"
v-model="cascaderValue"
:props="cascaderProps"
@change="handleChangeCascader"
clearable
style="width: 100%"
>
</el-cascader>
<span v-else>{{ orgForm.parentName }}</span>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button v-if="isAddOrg" @click="handleClose"> </el-button>
<el-button v-if="!isAddOrg" type="danger" plain @click="handleDel">删除</el-button>
<el-button type="primary" @click="orgSubmit"> </el-button>
</span>
</el-dialog>
<el-table :data="listData" class="table" ref="table" stripe header-align="center" @selection-change="handleSelectionChange" :row-key="getRowKeys">
<el-table-column type="selection" width="55" align="center" :reserve-selection="true"></el-table-column>
<el-table-column type="index" width="60" label="序号" align="center"></el-table-column>
<el-table-column prop="userName" label="学生姓名" align="center" min-width="100"></el-table-column>
<el-table-column prop="workNumber" label="学生学号" align="center" min-width="100"></el-table-column>
<el-table-column prop="className" label="班级" align="center" min-width="200" show-overflow-tooltip></el-table-column>
<el-table-column prop="countries" label="账号角色" align="center" width="100">
<template slot-scope="scope">学生</template>
</el-table-column>
<el-table-column prop="loginNumber" label="登录次数" align="center" width="100"></el-table-column>
<el-table-column prop="lastLoginTime" label="上次登录时间" align="center" width="120"></el-table-column>
<el-table-column label="操作" align="center" width="300">
<template slot-scope="scope">
<el-button v-if="isRemove && auth('移除')" type="text" @click="removeStudent(scope.row)">移除</el-button>
<el-button v-if="auth('查看')" type="text" @click="editStudent(scope.row,true)">查看</el-button>
<el-button v-if="auth('编辑')" type="text" @click="editStudent(scope.row,false)">编辑</el-button>
<el-button v-if="auth('重置密码')" type="text" @click="resetPassword(scope.row)">重置密码</el-button>
<el-button v-if="auth('删除')" type="text" @click="handleDelete(scope.row)">删除</el-button>
<el-switch
v-if="auth('禁用')"
v-model="scope.row.isEnable"
:active-value="1"
:inactive-value="0"
style="margin: 0 5px"
@change="switchOff(scope.row)"
></el-switch>
</template>
</el-table-column>
</el-table>
<div class="pagination">
<el-pagination background @current-change="currentChange" :current-page="page" layout="total, prev, pager, next" :total="total"></el-pagination>
</div>
</div>
<div class="page flex-1 m-l-20">
<h6 class="p-title">筛选</h6>
<div class="tool">
<ul class="filter">
<li>
<el-input style="width: 250px;" placeholder="请输入学生姓名/学号" prefix-icon="el-icon-search" v-model="keyWord" clearable></el-input>
</li>
</ul>
<div>
<el-button type="info" v-if="auth('新增学生')" @click="addStudent">新增学生</el-button>
<el-button type="primary" v-if="auth('批量导入')" @click="batchImport">批量导入</el-button>
<el-button type="primary" v-if="auth('批量删除')" @click="delAllSelection">批量删除</el-button>
</div>
</div>
<el-dialog
class="dialog"
width="60%"
:title="isDetail ? '查看学生' : (isAdd ? '新增学生' : '编辑学生')"
:visible.sync="studentVisible"
:close-on-click-modal="false"
@close="closeStudent"
>
<el-form ref="form" :model="form" :rules="rules" :disabled="isDetail" label-width="100px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item prop="workNumber" label="学生学号">
<el-input v-model="form.workNumber" placeholder="学生学号" @blur="workNumberChange"></el-input>
</el-form-item>
<el-form-item prop="userName" label="学生姓名">
<el-input v-model="form.userName" placeholder="请输入学生姓名"></el-input>
</el-form-item>
<el-form-item prop="roleId" label="账号角色">
学生
</el-form-item>
<el-table :data="listData" class="table" ref="table" stripe header-align="center" @selection-change="handleSelectionChange" :row-key="getRowKeys">
<el-table-column type="selection" width="55" align="center" :reserve-selection="true"></el-table-column>
<el-table-column type="index" width="60" label="序号" align="center"></el-table-column>
<el-table-column prop="userName" label="学生姓名" align="center" min-width="100"></el-table-column>
<el-table-column prop="workNumber" label="学生学号" align="center" min-width="100"></el-table-column>
<el-table-column prop="className" label="班级" align="center" min-width="200" show-overflow-tooltip></el-table-column>
<el-table-column prop="countries" label="账号角色" align="center" width="100">
<template slot-scope="scope">学生</template>
</el-table-column>
<el-table-column prop="loginNumber" label="登录次数" align="center" width="100"></el-table-column>
<el-table-column prop="lastLoginTime" label="上次登录时间" align="center" width="120"></el-table-column>
<el-table-column label="操作" align="center" width="300">
<template slot-scope="scope">
<el-button v-if="isRemove && auth('移除')" type="text" @click="removeStudent(scope.row)">移除</el-button>
<el-button v-if="auth('查看')" type="text" @click="editStudent(scope.row,true)">查看</el-button>
<el-button v-if="auth('编辑')" type="text" @click="editStudent(scope.row,false)">编辑</el-button>
<el-button v-if="auth('重置密码')" type="text" @click="resetPassword(scope.row)">重置密码</el-button>
<el-button v-if="auth('删除')" type="text" @click="handleDelete(scope.row)">删除</el-button>
<el-switch
v-if="auth('禁用')"
v-model="scope.row.isEnable"
:active-value="1"
:inactive-value="0"
style="margin: 0 5px"
@change="switchOff(scope.row)"
></el-switch>
</template>
</el-table-column>
</el-table>
<div class="pagination">
<el-pagination background @current-change="currentChange" :current-page="page" layout="total, prev, pager, next" :total="total"></el-pagination>
</div>
<el-form-item prop="phone" label="手机号">
<el-input v-model="form.phone" placeholder="可用于登录平台,以及找回密码" maxlength="11"></el-input>
</el-form-item>
<el-form-item prop="email" label="邮箱">
<el-input v-model="form.email" placeholder="可用于登录平台,以及找回密码"></el-input>
</el-form-item>
<el-form-item prop="uniqueIdentification" label="唯一标识">
<el-input disabled v-model="form.uniqueIdentification"></el-input>
</el-form-item>
</el-col>
<el-col :span="10">
<el-form-item prop="classId" label="所在班级">
<el-input
placeholder="输入关键字进行过滤"
v-model="filterText"
style="margin-bottom: 10px"
>
</el-input>
<div style="max-height: 245px; border: 1px solid #DCDFE6; border-radius: 4px; padding: 10px 10px 10px 0px; overflow: auto">
<org-tree
v-if="showTree && treeVisible"
ref="classTree"
show-checkbox
node-key="id"
highlight-current
default-expand-all
lazy
:load="loadClassTree"
:default-checked-keys="defaultCheckedKeys"
:filter-node-method="filterNode"
:props="{children: 'children', label: 'organizationName', isLeaf: 'leaf'}"
>
<span class="custom-tree-node" slot-scope="{ node, data }">
<span style="display: inline-block; margin-right: 20px">{{ node.label }}</span>
<span>
<el-button
v-if="auth('学生组织架构添加')&&node.level < 3"
type="text"
icon="el-icon-circle-plus-outline"
@click="() => handleAdd(node, data)">
</el-button>
</span>
</span>
</org-tree>
</div>
<p style="color: #C0C4CC;">提示需创建班级后才可以勾选</p>
</el-form-item>
</el-col>
</el-row>
</el-form>
<span slot="footer" class="dialog-footer" v-if="!isDetail">
<el-button type="primary" :disabled="disableds" @click="saveData(0)">保存</el-button>
<el-button v-if="isAdd" type="primary" :disabled="disableds" @click="saveData(1)">保存并继续添加</el-button>
<el-button size="small" @click="closeStudent">取消</el-button>
</span>
</el-dialog>
<el-dialog
class="dialog"
width="60%"
:title="isDetail ? '查看学生' : (isAdd ? '新增学生' : '编辑学生')"
:visible.sync="studentVisible"
:close-on-click-modal="false"
@close="closeStudent"
>
<el-form ref="form" :model="form" :rules="rules" :disabled="isDetail" label-width="100px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item prop="workNumber" label="学生学号">
<el-input v-model="form.workNumber" placeholder="学生学号" @blur="workNumberChange"></el-input>
</el-form-item>
<el-form-item prop="userName" label="学生姓名">
<el-input v-model="form.userName" placeholder="请输入学生姓名"></el-input>
</el-form-item>
<el-form-item prop="roleId" label="账号角色">
学生
</el-form-item>
<el-dialog title="批量导入" :visible.sync="importVisible" width="24%" :close-on-click-modal="false">
<div style="text-align: center">
<div style="margin-bottom: 10px;">
<el-button type="primary" @click="downLoad">模板下载<i class="el-icon-download el-icon--right"></i></el-button>
</div>
<el-upload
name="file"
accept=".xls,.xlsx"
:on-remove="handleRemove"
:on-error="uploadError"
:on-success="uploadSuccess"
:before-remove="beforeRemove"
:limit="1"
:on-exceed="handleExceed"
:action="this.api.importStudent"
:file-list="uploadList"
:headers="headers"
<el-form-item prop="phone" label="手机号">
<el-input v-model="form.phone" placeholder="可用于登录平台,以及找回密码" maxlength="11"></el-input>
</el-form-item>
<el-form-item prop="email" label="邮箱">
<el-input v-model="form.email" placeholder="可用于登录平台,以及找回密码"></el-input>
</el-form-item>
<el-form-item prop="uniqueIdentification" label="唯一标识">
<el-input disabled v-model="form.uniqueIdentification"></el-input>
</el-form-item>
</el-col>
<el-col :span="10">
<el-form-item prop="classId" label="所在班级">
<el-input
placeholder="输入关键字进行过滤"
v-model="filterText"
style="margin-bottom: 10px"
>
<el-button type="primary" class="ml20">上传文件<i class="el-icon-upload2 el-icon--right"></i></el-button>
</el-upload>
<el-link v-if="uploadFaild" type="primary" @click="showFaild">部分数据导入失败查看失败原因</el-link>
</div>
<span slot="footer" class="dialog-footer">
<el-button size="small" @click="importVisible = false"> </el-button>
<el-button size="small" type="primary" @click="uploadSure"> </el-button>
</span>
</el-dialog>
</el-input>
<div style="max-height: 245px; border: 1px solid #DCDFE6; border-radius: 4px; padding: 10px 10px 10px 0px; overflow: auto">
<org-tree
v-if="showTree && treeVisible"
ref="classTree"
show-checkbox
node-key="id"
highlight-current
default-expand-all
lazy
:load="loadClassTree"
:default-checked-keys="defaultCheckedKeys"
:filter-node-method="filterNode"
:props="{children: 'children', label: 'organizationName', isLeaf: 'leaf'}"
>
<span class="custom-tree-node" slot-scope="{ node, data }">
<span style="display: inline-block; margin-right: 20px">{{ node.label }}</span>
<span>
<el-button
v-if="auth('学生组织架构添加')&&node.level < 3"
type="text"
icon="el-icon-circle-plus-outline"
@click="() => handleAdd(node, data)">
</el-button>
</span>
</span>
</org-tree>
</div>
<p style="color: #C0C4CC;">提示需创建班级后才可以勾选</p>
</el-form-item>
</el-col>
</el-row>
</el-form>
<span slot="footer" class="dialog-footer" v-if="!isDetail">
<el-button type="primary" :disabled="disableds" @click="saveData(0)">保存</el-button>
<el-button v-if="isAdd" type="primary" :disabled="disableds" @click="saveData(1)">保存并继续添加</el-button>
<el-button size="small" @click="closeStudent">取消</el-button>
</span>
</el-dialog>
<el-dialog title="批量导入" :visible.sync="importVisible" width="24%" :close-on-click-modal="false">
<div style="text-align: center">
<div style="margin-bottom: 10px;">
<el-button type="primary" @click="downLoad">模板下载<i class="el-icon-download el-icon--right"></i></el-button>
</div>
</el-col>
</el-row>
<el-upload
name="file"
accept=".xls,.xlsx"
:on-remove="handleRemove"
:on-error="uploadError"
:on-success="uploadSuccess"
:before-remove="beforeRemove"
:limit="1"
:on-exceed="handleExceed"
:action="this.api.importStudent"
:file-list="uploadList"
:headers="headers"
>
<el-button type="primary" class="ml20">上传文件<i class="el-icon-upload2 el-icon--right"></i></el-button>
</el-upload>
<el-link v-if="uploadFaild" type="primary" @click="showFaild">部分数据导入失败查看失败原因</el-link>
</div>
<span slot="footer" class="dialog-footer">
<el-button size="small" @click="importVisible = false"> </el-button>
<el-button size="small" type="primary" @click="uploadSure"> </el-button>
</span>
</el-dialog>
</div>
</div>
</template>

@ -92,7 +92,7 @@ export default {
return new Promise((resolve, reject) => {
util.local.remove(Setting.storeKey);
util.local.remove(Setting.tokenKey);
if (state.fromClient) {
if (util.cookies.get('serverLogin')) {
util.cookies.remove('serverLogin')
location.href = Setting.isDev
? `http://192.168.31.125:8082/#/`

@ -1,12 +1,3 @@
// 引入等比适配插件
const px2rem = require("postcss-px2rem");
// 配置基本大小
const postcss = px2rem({
// 基准大小 baseSize,需要和rem.js中相同
remUnit: 16
});
const Setting = require('./src/setting.env')
// 使用等比适配插件
@ -14,11 +5,6 @@ module.exports = {
lintOnSave: true,
css: {
loaderOptions: {
postcss: {
plugins: [
postcss
]
},
sass: {
prependData: `@import "@/styles/var.scss";`
},

Loading…
Cancel
Save