Commit 6efa7c60 by huangqy

排课相关所有

parent 63cbc6d3
......@@ -12,13 +12,17 @@
"axios": "^0.21.1",
"core-js": "^3.6.5",
"echarts": "^4.9.0",
"element-ui": "^2.15.7",
"element-ui": "^2.15.6",
"file-saver": "^2.0.5",
"nprogress": "^0.2.0",
"script-loader": "^0.7.2",
"swiper": "^6.3.5",
"timetables": "^1.1.0",
"vue": "^2.6.11",
"vue-awesome-swiper": "^3.1.3",
"vue-router": "^3.2.0",
"vuex": "^3.4.0"
"vuex": "^3.4.0",
"xlsx": "^0.11.16"
},
"devDependencies": {
"@vue/cli-plugin-babel": "~4.5.0",
......@@ -28,6 +32,8 @@
"generate-asset-webpack-plugin": "^0.3.0",
"less": "^3.0.4",
"less-loader": "^5.0.0",
"node-sass": "^6.0.1",
"sass-loader": "^10.0.1",
"vue-template-compiler": "^2.6.11"
}
}
......@@ -15,8 +15,8 @@
<!-- built files will be auto injected -->
<script>
window._CONFIG = {};
window._CONFIG['publicURL'] = 'http://192.168.3.130:10026';
window._CONFIG['domianURL'] = 'http://192.168.3.130:10026/LTK';
window._CONFIG['publicURL'] = 'http://192.168.3.123:10026';
window._CONFIG['domianURL'] = 'http://192.168.3.123:10026/JX';
window._CONFIG['screenFull'] = 'http://127.0.0.1:9602'
</script>
<style>
......
......@@ -57,7 +57,8 @@ import {
Collapse,
CollapseItem,
Descriptions,
DescriptionsItem
DescriptionsItem,
TimeSelect
} from 'element-ui'
// import element from 'element-ui'
Vue.use(Step)
......@@ -114,6 +115,7 @@ Vue.use(Collapse)
Vue.use(CollapseItem)
Vue.use(Descriptions)
Vue.use(DescriptionsItem)
Vue.use(TimeSelect)
Vue.use(Loading)
// 绑定方法到Vue全局为所有vue实例添加方法
// 弹出对话框
......
......@@ -26,6 +26,13 @@ import system from './modules/system'
import inventory from './modules/inventory'
// 温湿度管理
import wsd from './modules/wsd'
import clockIn from './modules/clockIn'
import student from './modules/student'
import report from './modules/report'
import vacation from './modules/vacation'
import arrangement from './modules/arrangement'
// ant样式
import 'ant-design-vue/dist/antd.css'
// 导入全局样式
......@@ -81,7 +88,12 @@ const routes = [
...system,
// 盘库管理
...inventory,
...wsd
...wsd,
...student,
...report,
...vacation,
...arrangement,
...clockIn
]
},
{
......
let prefix = window.__POWERED_BY_QIANKUN__ ? '/main/ltk' : '';
const arrangement = [
{
path: prefix +'/arrangement/pkgl',
name: '/arrangement/pkgl',
component: () => import(/* webpackChunkName: "index/statistics/stock" */ '@/arrangement/pkgl')
},
{
path: prefix +'/arrangement/course',
name: '/arrangement/course',
component: () => import(/* webpackChunkName: "index/statistics/stock" */ '@/arrangement/course')
},
{
path: prefix +'/arrangement/lesson',
name: '/arrangement/lesson',
component: () => import(/* webpackChunkName: "index/statistics/stock" */ '@/arrangement/lesson')
},
]
export default arrangement
\ No newline at end of file
let prefix = window.__POWERED_BY_QIANKUN__ ? '/main/ltk' : '';
const clockIn = [
{
path: prefix +'/clockIn/attendClass',
name: '/clockIn/attendClass',
component: () => import(/* webpackChunkName: "index/statistics/stock" */ '@/clockIn/attendClass')
},
{
path: prefix +'/clockIn/getClockInRecord',
name: '/clockIn/getClockInRecord',
component: () => import(/* webpackChunkName: "index/statistics/stock" */ '@/clockIn/getClockInRecord')
},
]
export default clockIn
\ No newline at end of file
let prefix = window.__POWERED_BY_QIANKUN__ ? '/main/ltk' : '';
const report = [
{
path: prefix +'/report/cqtj',
name: '/report/cqtj',
component: () => import(/* webpackChunkName: "index/statistics/stock" */ '@/report/cqtj')
},
{
path: prefix +'/report/kqtj',
name: '/report/kqtj',
component: () => import(/* webpackChunkName: "index/statistics/stock" */ '@/report/kqtj')
},
]
export default report
\ No newline at end of file
// 学员信息管理
let prefix = window.__POWERED_BY_QIANKUN__ ? '/main/ltk' : '';
const student = [
// 班级管理
{
path: prefix +'/student/bjgl',
name: '/student/bjgl',
component: () => import(/* webpackChunkName: "index/statistics/stock" */ '@/student/bjgl')
},
{
path: prefix +'/student/college',
name: '/student/college',
component: () => import(/* webpackChunkName: "index/statistics/stock" */ '@/student/college')
},
{
path: prefix +'/student/major',
name: '/student/major',
component: () => import(/* webpackChunkName: "index/statistics/stock" */ '@/student/major')
},
{
path: prefix +'/student/xygl',
name: '/student/xygl',
component: () => import(/* webpackChunkName: "index/statistics/stock" */ '@/student/xygl')
},
]
export default student
\ No newline at end of file
let prefix = window.__POWERED_BY_QIANKUN__ ? '/main/ltk' : '';
const vacation = [
{
path: prefix +'/vacation/jqgl',
name: '/vacation/jqgl',
component: () => import(/* webpackChunkName: "index/statistics/stock" */ '@/vacation/jqgl')
},
{
path: prefix +'/vacation/jiaqi',
name: '/vacation/jiaqi',
component: () => import(/* webpackChunkName: "index/statistics/stock" */ '@/vacation/jiaqi')
},
]
export default vacation
\ No newline at end of file
class MyTools {
/**
* 唯一的随机字符串,用来区分每条数据
* @returns {string}
*/
getUid(){
return Number(Math.random().toString().substr(2, 16) + Date.now()).toString(32);
}
/**
* 计算时间差
* @param beginTime:2022-01-13
* @param endTime:2022-01-13
* @returns {{hours: number, seconds: number, minutes: number, day: number}}
*/
dealTime(beginTime,endTime) {
var dateBegin = new Date(beginTime);
var dateEnd = new Date(endTime);
var dateDiff = dateEnd.getTime() - dateBegin.getTime(); //时间差的毫秒数
var day = Math.floor(dateDiff / (24 * 3600 * 1000)); //计算出相差天数
var leave1 = dateDiff % (24 * 3600 * 1000); //计算天数后剩余的毫秒数
var hours = Math.floor(leave1 / (3600 * 1000)); //计算出小时数
//计算相差分钟数
var leave2 = leave1 % (3600 * 1000); //计算小时数后剩余的毫秒数
var minutes = Math.floor(leave2 / (60 * 1000)); //计算相差分钟数
//计算相差秒数
var leave3 = leave2 % (60 * 1000); //计算分钟数后剩余的毫秒数
var seconds = Math.round(leave3 / 1000);
return {
day,
hours,
minutes,
seconds
}
}
/**
* 获取当天日期
*/
getCurDay(){
var datetime = new Date();
var year = datetime.getFullYear();
var month = datetime.getMonth() + 1 < 10 ? "0" + (datetime.getMonth() + 1) : datetime.getMonth() + 1;
var date = datetime.getDate() < 10 ? "0" + datetime.getDate() : datetime.getDate();
return `${year}-${month}-${date}`
}
/**
* 数组中,某个属性相同的数据放在一块,如把某个日期相同的相连一起
* @param list 传入的数组
* @param prop 那个属性相同的数据
* @returns {*[]}
*/
margePropData(list = [], prop) {
let arr = [], tempArr = {};
list.forEach(item => {
if (!tempArr[item[prop]]) {
tempArr[item[prop]] = [item]
} else {
tempArr[item[prop]].push(item)
}
})
for (const tempArrKey in tempArr) {
arr = [...arr, ...tempArr[tempArrKey]]
}
return arr
}
/**
* 合并行
* @param list
* @param prop
*/
mergeRows(list = [], prop) {
list.forEach(ele => {
ele.rowspan = 1
})
const len = list.length
for (let i = 0; i < len; i++) {
for (let j = i + 1; j < len; j++) {
if (list[i][prop] === list[j][prop]) {
list[i].rowspan++
list[j].rowspan--
}
}
// 这里跳过已经重复的数据
i = i + list[i].rowspan - 1
}
return list
}
/**
* 根据当前数据的位置,在数组中插入数据
* 如数组【1,2,4,5】想要在2后面插入3,
*1:首先获取到2的下标,
*2:然后获取要插入之前的数据,获取要插入之后的数据,中间就是插入的位置
*3:最后把这三个按顺序合并就得到在想要的位置插入数据
* @param list 想要插入的数组
* @param index 插入那个值的后面的下标
* @param target 插入的目标
*/
insertArrPositionOfIndex(list = [], index = 0, target = {}) {
//根据index 找出小于index的数据放在左边
const leftList = list.filter((t, i) => i <= index);
//根据index 找出大于index的数据放在右边
const rightList = list.filter((t, i) => i > index);
// 最终合并数据
return [...leftList, target, ...rightList]
}
/**
* 校验规则
*/
verifyRules(list=[],require=[]){
let message=null
for (const key of require) {
const isEmpty= list.every(it=>!it[key.prop])
if(isEmpty){
message=key.message
break ;
}
}
return message
}
/**
* 获取元素下标
* @param dir 为 1:得到正序遍历方法;为 -1: 得到逆序遍历方法。
* @returns {(function(*, *, *=): (number|number|number))|*}
*/
findArrIndex(dir=1) {
return function (array, cb, context) {
let length = array.length;
// 控制初始 index,0 或者 length-1
let index = dir >= 0 ? 0 : length - 1;
// 条件: 在数组范围内;
// 递增或递减:递加 1 或者 -1; 妙啊~
for( ; index >= 0 && index <= length - 1; index += dir ) {
if( cb.call(context, array[index], index) ) return index
}
return -1
}
}
}
export default new MyTools()
\ No newline at end of file
/* eslint-disable */
import { saveAs } from 'file-saver'
import XLSX from 'xlsx'
function generateArray(table) {
var out = [];
var rows = table.querySelectorAll('tr');
var ranges = [];
for (var R = 0; R < rows.length; ++R) {
var outRow = [];
var row = rows[R];
var columns = row.querySelectorAll('td');
for (var C = 0; C < columns.length; ++C) {
var cell = columns[C];
var colspan = cell.getAttribute('colspan');
var rowspan = cell.getAttribute('rowspan');
var cellValue = cell.innerText;
if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue;
//Skip ranges
ranges.forEach(function (range) {
if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) {
for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);
}
});
//Handle Row Span
if (rowspan || colspan) {
rowspan = rowspan || 1;
colspan = colspan || 1;
ranges.push({
s: {
r: R,
c: outRow.length
},
e: {
r: R + rowspan - 1,
c: outRow.length + colspan - 1
}
});
};
//Handle Value
outRow.push(cellValue !== "" ? cellValue : null);
//Handle Colspan
if (colspan)
for (var k = 0; k < colspan - 1; ++k) outRow.push(null);
}
out.push(outRow);
}
return [out, ranges];
};
function datenum(v, date1904) {
if (date1904) v += 1462;
var epoch = Date.parse(v);
return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
}
function sheet_from_array_of_arrays(data, opts) {
var ws = {};
var range = {
s: {
c: 10000000,
r: 10000000
},
e: {
c: 0,
r: 0
}
};
for (var R = 0; R != data.length; ++R) {
for (var C = 0; C != data[R].length; ++C) {
if (range.s.r > R) range.s.r = R;
if (range.s.c > C) range.s.c = C;
if (range.e.r < R) range.e.r = R;
if (range.e.c < C) range.e.c = C;
var cell = {
v: data[R][C]
};
if (cell.v == null) continue;
var cell_ref = XLSX.utils.encode_cell({
c: C,
r: R
});
if (typeof cell.v === 'number') cell.t = 'n';
else if (typeof cell.v === 'boolean') cell.t = 'b';
else if (cell.v instanceof Date) {
cell.t = 'n';
cell.z = XLSX.SSF._table[14];
cell.v = datenum(cell.v);
} else cell.t = 's';
ws[cell_ref] = cell;
}
}
if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
return ws;
}
function Workbook() {
if (!(this instanceof Workbook)) return new Workbook();
this.SheetNames = [];
this.Sheets = {};
}
function s2ab(s) {
var buf = new ArrayBuffer(s.length);
var view = new Uint8Array(buf);
for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
return buf;
}
export function export_table_to_excel(id) {
var theTable = document.getElementById(id);
var oo = generateArray(theTable);
var ranges = oo[1];
/* original data */
var data = oo[0];
var ws_name = "SheetJS";
var wb = new Workbook(),
ws = sheet_from_array_of_arrays(data);
/* add ranges to worksheet */
// ws['!cols'] = ['apple', 'banan'];
ws['!merges'] = ranges;
/* add worksheet to workbook */
wb.SheetNames.push(ws_name);
wb.Sheets[ws_name] = ws;
var wbout = XLSX.write(wb, {
bookType: 'xlsx',
bookSST: false,
type: 'binary'
});
saveAs(new Blob([s2ab(wbout)], {
type: "application/octet-stream"
}), "test.xlsx")
}
export function export_json_to_excel({
multiHeader = [],
header,
data,
filename,
merges = [],
autoWidth = true,
bookType = 'xlsx'
} = {}) {
/* original data */
filename = filename || 'excel-list'
data = [...data]
data.unshift(header);
for (let i = multiHeader.length - 1; i > -1; i--) {
data.unshift(multiHeader[i])
}
var ws_name = "SheetJS";
var wb = new Workbook(),
ws = sheet_from_array_of_arrays(data);
if (merges.length > 0) {
if (!ws['!merges']) ws['!merges'] = [];
merges.forEach(item => {
ws['!merges'].push(XLSX.utils.decode_range(item))
})
}
if (autoWidth) {
/*设置worksheet每列的最大宽度*/
const colWidth = data.map(row => row.map(val => {
/*先判断是否为null/undefined*/
if (val == null) {
return {
'wch': 10
};
}
/*再判断是否为中文*/
else if (val.toString().charCodeAt(0) > 255) {
return {
'wch': val.toString().length * 2
};
} else {
return {
'wch': val.toString().length
};
}
}))
/*以第一行为初始值*/
let result = colWidth[0];
for (let i = 1; i < colWidth.length; i++) {
for (let j = 0; j < colWidth[i].length; j++) {
if (result[j]['wch'] < colWidth[i][j]['wch']) {
result[j]['wch'] = colWidth[i][j]['wch'];
}
}
}
ws['!cols'] = result;
}
/* add worksheet to workbook */
wb.SheetNames.push(ws_name);
wb.Sheets[ws_name] = ws;
var wbout = XLSX.write(wb, {
bookType: bookType,
bookSST: false,
type: 'binary'
});
saveAs(new Blob([s2ab(wbout)], {
type: "application/octet-stream"
}), `${filename}.${bookType}`);
}
<template>
<div class="body" :style="'height:' + height + 'px'">
<div style="border: 2px solid #43A747;">
<!-- 主体区域 - 卡片视图 -->
<el-card :style="'height:' + (height - 60) + 'px;overflow-y: auto;position:relative;'">
<!-- 查询功能区域 -->
<el-form :inline="true" :model="searchData" size="medium" label-position="left" >
<el-row type="flex" justify="space-between" align="middle">
<el-col>
<el-form-item label="课时名称 :">
<el-input v-model="searchData.name" placeholder="请输入课时名称" />
</el-form-item>
<el-form-item>
<a-button type="primary" class="mgl15" ghost icon="search" @click="initData()">查询</a-button>
</el-form-item>
<el-form-item>
<a-button type="primary" ghost @click="resClick()" icon="reload">重置</a-button>
</el-form-item>
</el-col>
<el-form-item>
<a-button type="primary" ghost icon="plus" @click="addClick()">
新增
</a-button>
</el-form-item>
</el-row>
</el-form>
<el-table :data="data" style="width: 100%;overflow: auto;" size="medium" highlight-current-row>
<el-table-column type="index" width="60" label="序号" align="center" />
<el-table-column prop="courseCode" label="课程代码" align="center" />
<el-table-column prop="courseName" label="课程名称" align="center" />
<el-table-column label="操作" align="center" width="180">
<template slot-scope="scope">
<a-button type="primary" icon="edit" size="small" ghost @click="editClick(scope.row)">编辑</a-button>
<a-button type="danger" icon="delete" style="margin-left: 6px;" ghost size="small" @click="deleteClick(scope.row)">删除</a-button>
</template>
</el-table-column>
</el-table>
<el-pagination
style="text-align: center;position: absolute;bottom: 0;background: #fff;width: 100%"
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="searchData.pageNo"
:page-size="searchData.pageSize"
layout="total, prev, pager, next, jumper"
:total="total"
/>
<el-dialog
:append-to-body="true"
:title="title"
:visible.sync="dialogVisible"
@close="dialogClose()"
width="800px"
:close-on-click-modal="false"
>
<!-- 表单区域 -->
<el-form :model="formData" ref="fromRef" size="medium" style="border: 2px solid rgb(67, 167, 71);padding:20px;">
<el-card>
<el-form-item label="课程名称 :">
<el-input v-model="formData.courseName" placeholder="请输入课程名称" />
</el-form-item>
</el-card>
</el-form>
<span slot="footer" class="dialog-footer">
<a-button @click="dialogVisible = false" type="danger" ghost>取 消</a-button>
<a-button type="primary" @click="subFormData()" ghost style="margin-left: 6px;">提 交</a-button>
</span>
</el-dialog>
</el-card>
</div>
</div>
</template>
<script>
export default {
data () {
return {
height: document.documentElement.clientHeight - 176,
data: [],
dialogVisible: false,
title: '',
formData: {},
// 筛选数据
searchData: {
pageNo: 1,
pageSize: 10,
},
timeData: [],
classList: [],
studentList: [],
classStudentList: [],
pickerOptions: {
shortcuts: [{
text: '最近一日',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 1)
picker.$emit('pick', [start, end])
}
}, {
text: '最近一周',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
picker.$emit('pick', [start, end])
}
}, {
text: '最近一个月',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
picker.$emit('pick', [start, end])
}
}, {
text: '最近三个月',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
picker.$emit('pick', [start, end])
}
}]
},
// 总条数
total: 0,
}
},
created () {
this.initData()
},
mounted() {
const that = this
window.onresize = function temp() {
that.height = document.documentElement.clientHeight - 176
}
},
methods: {
async initData () {
const { data: res } = await this.$axios.post('/course/getPage', this.searchData)
if (res.code !== 99200) return this.$message(res.message)
this.total = res.data.totalRows - 0
this.data = res.data.records
},
resClick () {
this.searchData = {
pageNo: 1,
pageSize: 10
}
this.timeData = []
this.initData()
},
dateChange (date) {
this.searchData.startTime = date ? date[0] : ''
this.searchData.endTime = date ? date[1] : ''
},
addClick() {
this.title = '新增'
this.dialogVisible = true
},
editClick(row) {
this.title = '编辑'
const obj = JSON.parse(JSON.stringify(row))
this.dialogVisible = true
this.formData = obj
},
subFormData () {
this.$refs.fromRef.validate(async falg => {
if (!falg) return;
let url = '/course/save'
if (this.formData.id) {
url = '/course/update'
}
const { data: res } = await this.$axios.post(url, this.formData)
if (!res.data) return this.$message.error(res.message)
this.$message.success(res.message)
this.dialogVisible = false
this.initData()
})
},
dialogClose() {
this.formData = {}
this.$refs.fromRef.resetFields()
},
deleteClick (row) {
const url = '/course/remove'
const params = {
id: row.id
}
this.delete(url, params)
},
delete (url, params) {
this.$confirm('此操作将永久删除该数据, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const { data: res } = await this.$axios.delete(url, {params})
if (res.code === 99200) {
this.$message.success(res.message)
this.initData()
} else {
this.$message.error(res.message)
}
})
},
// 分页功能
// 每页显示条数发生改变时
handleSizeChange (val) {
this.searchData.pageSize = val
this.initData()
},
// 当前页数发生改变时
handleCurrentChange (val) {
this.searchData.pageNo = val
this.initData()
},
},
computed: {
}
}
</script>
<style scoped lang='less'>
</style>
<template>
<div class="body" :style="'height:' + height + 'px'">
<div style="border: 2px solid #43A747;">
<!-- 主体区域 - 卡片视图 -->
<el-card :style="'height:' + (height - 60) + 'px;overflow-y: auto;position:relative;'">
<!-- 查询功能区域 -->
<el-form :inline="true" :model="searchData" size="medium" label-position="left" >
<el-row type="flex" justify="space-between" align="middle">
<el-col>
<el-form-item label="课时名称 :">
<el-input v-model="searchData.name" placeholder="请输入课时名称" />
</el-form-item>
<!-- <el-form-item label="选择日期 :">
<el-date-picker
@change="dateChange"
v-model="timeData"
type="daterange"
align="right"
unlink-panels
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
format="yyyy 年 MM 月 dd 日"
value-format="yyyy-MM-dd HH:mm:ss"
:picker-options="pickerOptions">
</el-date-picker>
</el-form-item> -->
<el-form-item>
<a-button type="primary" class="mgl15" ghost icon="search" @click="initData()">查询</a-button>
</el-form-item>
<el-form-item>
<a-button type="primary" ghost @click="resClick()" icon="reload">重置</a-button>
</el-form-item>
</el-col>
<el-form-item>
<a-button type="primary" ghost icon="plus" @click="addClick()">
新增
</a-button>
</el-form-item>
</el-row>
</el-form>
<el-table :data="data" style="width: 100%;overflow: auto;" size="medium" highlight-current-row>
<el-table-column type="index" width="60" label="序号" align="center" />
<el-table-column prop="name" label="课时名称" align="center" />
<el-table-column prop="startTime" label="开始时间" align="center" />
<el-table-column prop="endTime" label="结束时间" align="center" />
<el-table-column label="操作" align="center" width="180">
<template slot-scope="scope">
<a-button type="primary" icon="edit" size="small" ghost @click="editClick(scope.row)">编辑</a-button>
<a-button type="danger" icon="delete" style="margin-left: 6px;" ghost size="small" @click="deleteClick(scope.row)">删除</a-button>
</template>
</el-table-column>
</el-table>
<el-pagination
style="text-align: center;position: absolute;bottom: 0;background: #fff;width: 100%"
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="searchData.pageNo"
:page-size="searchData.pageSize"
layout="total, prev, pager, next, jumper"
:total="total"
/>
<el-dialog
:append-to-body="true"
:title="title"
:visible.sync="dialogVisible"
@close="dialogClose()"
width="800px"
:close-on-click-modal="false"
>
<!-- 表单区域 -->
<el-form :model="formData" ref="fromRef" size="medium" style="border: 2px solid rgb(67, 167, 71);padding:20px;">
<el-card>
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-form-item label="课时名称 :">
<el-input v-model="formData.name" placeholder="请输入课时名称" />
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-form-item label="开始时间 :">
<el-time-select
v-model="formData.startTime"
style="width: 100%"
:picker-options="{
start: '08:00',
step: '00:15',
end: '18:30'
}"
placeholder="选择时间">
</el-time-select>
</el-form-item>
</el-col>
<el-col :span="11">
<el-form-item label="结束时间 :">
<el-time-select
v-model="formData.endTime"
style="width: 100%"
:picker-options="{
start: '09:30',
step: '00:15',
end: '18:30'
}"
placeholder="选择时间">
</el-time-select>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
<span slot="footer" class="dialog-footer">
<a-button @click="dialogVisible = false" type="danger" ghost>取 消</a-button>
<a-button type="primary" @click="subFormData()" ghost style="margin-left: 6px;">提 交</a-button>
</span>
</el-dialog>
</el-card>
</div>
</div>
</template>
<script>
export default {
data () {
return {
height: document.documentElement.clientHeight - 176,
data: [],
dialogVisible: false,
title: '',
formData: {
studentNo: ''
},
// 筛选数据
searchData: {
pageNo: 1,
pageSize: 10,
},
timeData: [],
classList: [],
studentList: [],
classStudentList: [],
pickerOptions: {
shortcuts: [{
text: '最近一日',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 1)
picker.$emit('pick', [start, end])
}
}, {
text: '最近一周',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
picker.$emit('pick', [start, end])
}
}, {
text: '最近一个月',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
picker.$emit('pick', [start, end])
}
}, {
text: '最近三个月',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
picker.$emit('pick', [start, end])
}
}]
},
// 总条数
total: 0,
}
},
created () {
this.initData()
},
mounted() {
const that = this
window.onresize = function temp() {
that.height = document.documentElement.clientHeight - 176
}
},
methods: {
async initData () {
const { data: res } = await this.$axios.post('/lesson/getPage', this.searchData)
if (res.code !== 99200) return this.$message(res.message)
this.total = res.data.totalRows - 0
this.data = res.data.records
},
resClick () {
this.searchData = {
pageNo: 1,
pageSize: 10
}
this.timeData = []
this.initData()
},
dateChange (date) {
this.searchData.startTime = date ? date[0] : ''
this.searchData.endTime = date ? date[1] : ''
},
addClick() {
this.title = '新增'
this.dialogVisible = true
},
editClick(row) {
this.title = '编辑'
const obj = JSON.parse(JSON.stringify(row))
this.dialogVisible = true
this.formData = obj
},
subFormData () {
this.$refs.fromRef.validate(async falg => {
if (!falg) return;
let url = '/lesson/save'
if (this.formData.id) {
url = '/lesson/update'
}
const { data: res } = await this.$axios.post(url, this.formData)
if (!res.data) return this.$message.error(res.message)
this.$message.success(res.message)
this.dialogVisible = false
this.initData()
})
},
dialogClose() {
this.formData = {}
this.$refs.fromRef.resetFields()
},
deleteClick (row) {
const url = '/lesson/remove'
const params = {
id: row.id
}
this.delete(url, params)
},
delete (url, params) {
this.$confirm('此操作将永久删除该数据, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const { data: res } = await this.$axios.delete(url, {params})
if (res.code === 99200) {
this.$message.success(res.message)
this.initData()
} else {
this.$message.error(res.message)
}
})
},
// 分页功能
// 每页显示条数发生改变时
handleSizeChange (val) {
this.searchData.pageSize = val
this.initData()
},
// 当前页数发生改变时
handleCurrentChange (val) {
this.searchData.pageNo = val
this.initData()
},
},
computed: {
}
}
</script>
<style scoped lang='less'>
</style>
<template>
<div class="body" :style="'height:' + height + 'px'">
<div style="border: 2px solid #43A747;">
<!-- 主体区域 - 卡片视图 -->
<el-card :style="'height:' + (height - 60) + 'px;overflow-y: auto;position:relative;'">
<!-- 查询功能区域 -->
<el-form :inline="true" :model="searchData" size="medium" label-position="left" >
<el-row type="flex" justify="space-between" align="middle">
<el-col>
<el-form-item label="班级编号 :">
<el-select
filterable
placeholder="请选择班级编号"
v-model="searchData.classCode"
@change="initData"
>
<el-option v-for="item in classList" :key="item.id" :label="item.className +'(' + item.classCode +')'" :value="item.classCode"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<a-button type="primary" class="mgl15" ghost icon="search" @click="initData()">查询</a-button>
</el-form-item>
<el-form-item>
<a-button type="primary" ghost @click="resClick()" icon="reload">重置</a-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-table :data="data" style="width: 100%;overflow: auto;" size="medium" highlight-current-row>
<el-table-column type="index" width="60" label="序号" align="center" />
<el-table-column prop="lessonName" label="第几节课" align="center" />
<el-table-column prop="courseName" label="课程名称" align="center" />
<el-table-column prop="classTime" label="上课时间" align="center" />
<el-table-column label="操作" align="center" width="280">
<template slot-scope="scope">
<a-button type="primary" icon="play-circle" size="small" ghost @click="startClick(scope.row)" v-if="scope.row.id && scope.row.upStatus === 2">开启打卡</a-button>
<a-button type="danger" icon="pause-circle" style="margin-left: 6px;" ghost size="small" @click="endClick(scope.row)" v-if="scope.row.id && scope.row.upStatus === 1">关闭打卡</a-button>
</template>
</el-table-column>
</el-table>
</el-card>
</div>
</div>
</template>
<script>
export default {
data () {
return {
height: document.documentElement.clientHeight - 176,
data: [],
dialogVisible: false,
title: '',
classList: [],
formData: {},
// 筛选数据
searchData: {
pageNo: 1,
pageSize: 10,
classCode: ''
},
// 总条数
total: 0,
}
},
created () {
this.initClass()
},
mounted() {
const that = this
window.onresize = function temp() {
that.height = document.documentElement.clientHeight - 176
}
},
methods: {
async initClass() {
const { data: res } = await this.$axios.post('/class/getPage', {pageNo: 1, pageSize: 999})
if (res.code !== 99200) return this.$message(res.message)
this.classList = res.data.records
if (this.classList.length > 0) {
this.searchData.classCode = this.classList[0].classCode
this.initData()
}
},
async initData () {
const { data: res } = await this.$axios.post('/data/getCourseByMonth', this.searchData)
if (res.code !== 99200) return this.$message(res.message)
this.data = res.data
},
parseTimes(time) {
if (time != '0001-01-01 00:00') {
var date = new Date(time)
var year = date.getFullYear()
/* 在日期格式中,月份是从0开始的,因此要加0
* 使用三元表达式在小于10的前面加0,以达到格式统一 如 09:11:05
* */
var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate()
// 拼接
return year + '-' + month + '-' + day
} else {
return ''
}
},
resClick () {
this.searchData = {
pageNo: 1,
pageSize: 10
}
this.initData()
},
async startClick(row) {
const { data: res } = await this.$axios.post('/clockIn/updateStatus', { classCode: row.classCode, classTime: row.classTime,id: row.id, upStatus: 1})
if (res.code !== 99200) return this.$message.error(res.message)
this.$message.success('开启打卡')
this.initData()
},
async endClick(row) {
const { data: res } = await this.$axios.post('/clockIn/updateStatus', { classCode: row.classCode, classTime: row.classTime,id: row.id, upStatus: 2})
if (res.code !== 99200) return this.$message.error(res.message)
this.$message.success('结束打卡')
this.initData()
},
},
computed: {
}
}
</script>
<style scoped lang='less'>
</style>
<template>
<div class="body" :style="'height:' + height + 'px'">
<div style="border: 2px solid #43A747;">
<!-- 主体区域 - 卡片视图 -->
<el-card :style="'height:' + (height - 60) + 'px;overflow-y: auto;position:relative;'">
<!-- 查询功能区域 -->
<el-form :inline="true" :model="searchData" size="medium" label-position="left" >
<el-row type="flex" justify="space-between" align="middle">
<el-col>
<el-form-item label="班级名称 :">
<el-select
filterable
clearable
placeholder="请选择班级名称"
v-model="searchData.classCode"
@change="initData"
>
<el-option v-for="item in classList" :key="item.id" :label="item.className +'(' + item.classCode +')'" :value="item.classCode"></el-option>
</el-select>
</el-form-item>
<el-form-item label="学员名称 :">
<el-select v-model="searchData.studentNo" filterable placeholder="请选择或输入学员名称" clearable>
<el-option
v-for="item in studentList"
:key="item.studentNo"
:label="item.studentName"
:value="item.studentNo">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="选择日期 :">
<el-date-picker
@change="dateChange"
v-model="timeData"
type="daterange"
align="right"
unlink-panels
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
format="yyyy 年 MM 月 dd 日"
value-format="yyyy-MM-dd HH:mm:ss"
:picker-options="pickerOptions">
</el-date-picker>
</el-form-item>
<el-form-item>
<a-button type="primary" class="mgl15" ghost icon="search" @click="initData()">查询</a-button>
</el-form-item>
<el-form-item>
<a-button type="primary" ghost @click="resClick()" icon="reload">重置</a-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-table :data="data" style="width: 100%;overflow: auto;" size="medium" highlight-current-row>
<el-table-column type="index" width="60" label="序号" align="center" />
<el-table-column prop="className" label="班级名称" align="center" />
<el-table-column prop="studentName" label="学生姓名" align="center" />
<el-table-column prop="courseName" label="课程名称" align="center" />
<el-table-column prop="lessonId" label="课时编号" align="center" />
<el-table-column prop="recordDate" label="考勤打卡日期" align="center" />
</el-table>
<el-pagination
style="text-align: center;position: absolute;bottom: 0;background: #fff;width: 100%"
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="searchData.pageNo"
:page-size="searchData.pageSize"
layout="total, prev, pager, next, jumper"
:total="total"
/>
</el-card>
</div>
</div>
</template>
<script>
export default {
data () {
return {
height: document.documentElement.clientHeight - 176,
data: [],
dialogVisible: false,
title: '',
formData: {},
// 筛选数据
searchData: {
pageNo: 1,
pageSize: 10,
},
// 总条数
total: 0,
timeData: [],
classList: [],
studentList: [],
pickerOptions: {
shortcuts: [{
text: '最近一日',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 1)
picker.$emit('pick', [start, end])
}
}, {
text: '最近一周',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
picker.$emit('pick', [start, end])
}
}, {
text: '最近一个月',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
picker.$emit('pick', [start, end])
}
}, {
text: '最近三个月',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
picker.$emit('pick', [start, end])
}
}]
},
}
},
created () {
this.initData()
this.initClass()
this.initStudent()
},
mounted() {
const that = this
window.onresize = function temp() {
that.height = document.documentElement.clientHeight - 176
}
},
methods: {
async initClass() {
const { data: res } = await this.$axios.post('/class/getPage', {pageNo: 1, pageSize: 999})
if (res.code !== 99200) return this.$message(res.message)
this.classList = res.data.records
},
async initStudent() {
const { data: res } = await this.$axios.post('/jxUser/getPage', {pageNo: 1, pageSize: 999 })
if (res.code !== 99200) return this.$message(res.message)
this.studentList = res.data.records
},
async initData () {
const { data: res } = await this.$axios.post('/clockIn/getClockInRecord', this.searchData)
if (res.code !== 99200) return this.$message(res.message)
this.total = res.data.totalRows - 0
this.data = res.data.records
},
resClick () {
this.searchData = {
pageNo: 1,
pageSize: 10
}
this.initData()
},
addClick() {
this.title = '新增'
this.initCollege()
this.dialogVisible = true
},
editClick(row) {
this.title = '编辑'
this.initCollege()
const obj = JSON.parse(JSON.stringify(row))
this.dialogVisible = true
this.formData = obj
},
dateChange (date) {
this.searchData.startTime = date ? date[0] : ''
this.searchData.endTime = date ? date[1] : ''
},
deleteClick (row) {
const url = '/major/remove'
const params = {
id: row.id
}
this.delete(url, params)
},
delete (url, params) {
this.$confirm('此操作将永久删除该数据, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const { data: res } = await this.$axios.delete(url, {params})
if (res.code === 99200) {
this.$message.success(res.message)
this.initData()
} else {
this.$message.error(res.message)
}
})
},
subFormData () {
this.$refs.fromRef.validate(async falg => {
if (!falg) return;
let url = '/major/save'
if (this.formData.id) {
url = '/major/update'
}
const { data: res } = await this.$axios.post(url, this.formData)
if (!res.data) return this.$message.error(res.message)
this.$message.success(res.message)
this.dialogVisible = false
this.initData()
})
},
dialogClose() {
this.formData = {}
this.$refs.fromRef.resetFields()
},
// 分页功能
// 每页显示条数发生改变时
handleSizeChange (val) {
this.searchData.pageSize = val
this.initData()
},
// 当前页数发生改变时
handleCurrentChange (val) {
this.searchData.pageNo = val
this.initData()
},
},
computed: {
}
}
</script>
<style scoped lang='less'>
</style>
......@@ -5,6 +5,7 @@
<div class="logo" @click="goHome()">
<img src="../assets/logo.png" alt="logo" />
<span>军需立体库作业管理信息系统</span>
<span style="font-size:16px;margin-left: 10px;margin-top: 3px;color: #F0E68C" @click="changeTilte">{{ subTitle }}</span>
</div>
<div class="time_box" @click="cut">
<bo-time></bo-time>
......@@ -23,7 +24,7 @@
<!-- 侧边图标栏 -->
<bo-big-aside @mouseenter.native="mouseIn()" :activeLine="activeLine" :asidList="navList" @click="activeClick" :active="activeOnePath" class="one_aside" />
<el-header class="swiper-header">
<el-row type="flex" v-if="!show">
<el-row type="flex" v-if="$route.path == '/index'">
<el-col :span="5" v-for="item in topSpanData" :key="item.id" >
<el-card class="top-card" style="background: rgb(32,119,40);opacity:0.8;">
<el-row type="flex">
......@@ -38,7 +39,7 @@
</el-card>
</el-col>
</el-row>
<swiper ref="mySwiper" :options="swiperOptions" style="background: rgb(32,119,40);opacity:0.8;" v-if="show">
<swiper ref="mySwiper" :options="swiperOptions" style="background: rgb(32,119,40);opacity:0.8;">
<swiper-slide v-for="item in menuList.children" :key="item.id">
<el-card :class="`${item.path === active ? 'active-top-card' : 'top-card'}`">
<div class="card_item" @click="saveNavState(item.path)">
......@@ -63,7 +64,7 @@
<!-- 侧边图标栏 -->
<bo-big-aside @mouseenter.native="mouseIn()" :activeLine="activeLine" :asidList="navList" @click="activeClick" :active="activeOnePath" class="one_aside" />
<el-header class="swiper-header">
<el-row type="flex" v-if="!show">
<el-row type="flex">
<el-col :span="5" v-for="item in topSpanData" :key="item.id" >
<el-card class="top-card" style="background: rgb(32,119,40);opacity:0.8;">
<el-row type="flex">
......@@ -78,7 +79,7 @@
</el-card>
</el-col>
</el-row>
<swiper ref="mySwiper" :options="swiperOptions" style="background: rgb(32,119,40);opacity:0.8;" v-if="show">
<swiper ref="mySwiper" :options="swiperOptions" style="background: rgb(32,119,40);opacity:0.8;">
<swiper-slide v-for="item in menuList.children" :key="item.id">
<el-card :class="`${item.path === active ? 'active-top-card' : 'top-card'}`">
<div class="card_item" @click="saveNavState(item.path)">
......@@ -119,8 +120,8 @@ export default {
// 标记
// flag: '',
// 定时器
subTitle: '主平台',
timer: null,
show: false,
flag: false,
topSpanData: [],
swiperOptions: {
......@@ -165,7 +166,37 @@ export default {
'edUserData'
]),
async changeTilte() {
const token = sessionStorage.getItem('token')
let appCode = sessionStorage.getItem('appCode')
if (appCode == '10004') {
const { data: menuRes } = await this.$axios.get(window._CONFIG['publicURL'] + '/sysMenu/getLeftMenus', { params: { token: token, appCode: '10003' }})
if (menuRes.code !== 99200) return this.$message.error(menuRes.message)
this.subTitle = '主平台'
window.sessionStorage.setItem('appCode', '10003')
window.sessionStorage.setItem('navList', JSON.stringify(menuRes.data[0].children))
const navList = JSON.parse(sessionStorage.getItem('navList'))
this.edNav(navList)
this.$router.push('/index')
this.edMenuList([])
}
if (appCode == '10003') {
const { data: menuRes } = await this.$axios.get(window._CONFIG['publicURL'] + '/sysMenu/getLeftMenus', { params: { token: token, appCode: '10004' }})
if (menuRes.code !== 99200) return this.$message.error(menuRes.message)
this.subTitle = '教学模拟'
window.sessionStorage.setItem('appCode', '10004')
window.sessionStorage.setItem('navList', JSON.stringify(menuRes.data[0].children))
const navList = JSON.parse(sessionStorage.getItem('navList'))
this.edNav(navList)
this.$router.push('/student/bjgl')
this.edActive(this.$route.path)
navList.forEach(item => {
if (item.path === '/student') {
return this.edMenuList(item)
}
})
}
},
async getTopData () {
const { data: res } = await this.$axios.get('/first/getBaseGoods')
if (res.code !== 99200) return this.$message.error(res.message)
......@@ -202,7 +233,6 @@ export default {
text: '本月出库',
}
]
// this.show = false
},
async getCut () {
......@@ -231,30 +261,50 @@ export default {
},
// 图标栏点击事件
activeClick (e) {
this.show = true
activeClick(e) {
const path = e ? e.path : this.activeOnePath
if (path === this.activeOnePath || !this.collapsed) {
this.edCollapsed()
}
this.edActiveOnePath(path)
if (e) {
this.edActive(e.children[0].path)
this.$router.push(e.children[0].path)
} else {
if (this.$route.path === '/index') {
this.show = false
} else {
this.show = true
}
this.edActive(this.$route.path)
}
// 路由跳转
this.edMenuList([])
this.navList.forEach(item => {
if (item.path === this.activeOnePath) return this.edMenuList(item)
if (item.path === this.activeOnePath) {
return this.edMenuList(item)
}
})
if (e === undefined || this.$route.path === e.path) return false
if (this.menuList.children) return
if (e === undefined || this.$route.path === e.path) {
return false
}
},
// activeClick (e) {
// this.show = true
// const path = e ? e.path : this.activeOnePath
// if (path === this.activeOnePath || !this.collapsed) {
// this.edCollapsed()
// }
// this.edActiveOnePath(path)
// if (e) {
// this.edActive(e.children[0].path)
// this.$router.push(e.children[0].path)
// } else {
// if (this.$route.path === '/index') {
// this.show = false
// } else {
// this.show = true
// }
// this.edActive(this.$route.path)
// }
// // 路由跳转
// this.navList.forEach(item => {
// if (item.path === this.activeOnePath) return this.edMenuList(item)
// })
// if (e === undefined || this.$route.path === e.path) return false
// },
// 自动折叠侧边导航
// 导航栏鼠标移入移出事件
......
......@@ -69,14 +69,17 @@ export default {
// 登录验证
if (!flag) return
const { data: res } = await this.$axios.post(window._CONFIG['publicURL'] + '/auth/login', this.loginForm)
// token
if (res.code != 99200) return this.$message.error(res.message);
window.sessionStorage.setItem('token', res.data.token)
// 用户信息
window.sessionStorage.setItem('userData', JSON.stringify(res.data.userInfo))
// 库房号
window.sessionStorage.setItem('storeList', JSON.stringify(res.data.storeList[0]))
const appList = res.data.appList
window.sessionStorage.setItem('appList', JSON.stringify(appList))
if (appList.length < 1) return this.$message.warning('没有权限!')
window.sessionStorage.setItem('appCode', appList[0])
// 菜单列表
this.getMenu(res.data.token, '10003')
const appCode = appList[0]
this.getMenu(res.data.token, appCode)
})
},
async getMenu(token, appCode) {
......
<template>
<div class="body" :style="'height:' + height + 'px'">
<div style="border: 2px solid #43A747;">
<!-- 主体区域 - 卡片视图 -->
<el-card :style="'height:' + (height - 60) + 'px;overflow-y: auto;position:relative;'">
<!-- 查询功能区域 -->
<el-form :inline="true" :model="searchData" size="medium" label-position="left" >
<el-row type="flex" justify="space-between" align="middle">
<el-col>
<el-form-item label="课程名称 :">
<el-input
clearable
placeholder="请输入课程名称"
v-model="searchData.courseName"
/>
</el-form-item>
<el-form-item>
<a-button type="primary" class="mgl15" ghost icon="search" @click="initData()">查询</a-button>
</el-form-item>
<el-form-item>
<a-button type="primary" ghost @click="resClick()" icon="reload">重置</a-button>
</el-form-item>
</el-col>
<el-form-item>
<a-button type="primary" ghost icon="download" @click="downloadClick()">
导出
</a-button>
</el-form-item>
</el-row>
</el-form>
<el-table :data="data" style="width: 100%;overflow: auto;" size="medium" highlight-current-row>
<el-table-column type="index" width="60" label="序号" align="center" />
<el-table-column prop="className" label="班级名称" align="center" />
<el-table-column prop="lessonName" label="课时" align="center" />
<el-table-column prop="courseCode" label="课程代码" align="center" />
<el-table-column prop="courseName" label="课程名称" align="center" />
<el-table-column prop="planCount" label="应到人数" align="center" />
<el-table-column prop="realCount" label="实到人数" align="center" />
<el-table-column prop="attendance" label="出勤率" align="center" />
</el-table>
<el-pagination
style="text-align: center;position: absolute;bottom: 0;background: #fff;width: 100%"
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="searchData.pageNo"
:page-size="searchData.pageSize"
layout="total, prev, pager, next, jumper"
:total="total"
/>
</el-card>
</div>
</div>
</template>
<script>
export default {
data () {
return {
height: document.documentElement.clientHeight - 176,
data: [],
dialogVisible: false,
title: '',
formData: {},
// 筛选数据
searchData: {
pageNo: 1,
pageSize: 10,
},
// 总条数
total: 0,
}
},
created () {
this.initData()
},
mounted() {
const that = this
window.onresize = function temp() {
that.height = document.documentElement.clientHeight - 176
}
},
methods: {
async initData () {
const { data: res } = await this.$axios.post('/data/getLessonPage', this.searchData)
if (res.code !== 99200) return this.$message(res.message)
this.total = res.data.totalRows - 0
this.data = res.data.records
},
resClick () {
this.searchData = {
pageNo: 1,
pageSize: 10
}
this.initData()
},
// 分页功能
// 每页显示条数发生改变时
handleSizeChange (val) {
this.searchData.pageSize = val
this.initData()
},
// 当前页数发生改变时
handleCurrentChange (val) {
this.searchData.pageNo = val
this.initData()
},
async downloadClick() {
var params = { pageNo: 1, pageSize: 9999 }
let list = []
let result = []
const { data: res } = await this.$axios.post('/data/getLessonPage', params)
if (res.code !== 99200) return this.$message(res.message)
list = res.data.records
import('../../utils/export2Excel').then(excel => {
const tHeader = ['班级名称', '课时', '课程代码', '课程名称', '应到人数', '实到人数', '出勤率']
const filterVal = ['className', 'lessonName', 'courseCode', 'courseName','planCount', 'realCount', 'attendance']
result = this.formatJson(filterVal, list)
excel.export_json_to_excel({
header: tHeader,
data: result,
filename: '课时出勤报表',
autoWidth: true,
bookType: 'xlsx'
})
})
},
formatJson(filterVal, jsonData) {
return jsonData.map(v => filterVal.map(j => {
return v[j]
}))
}
},
computed: {
}
}
</script>
<style scoped lang='less'>
</style>
<template>
<div class="body" :style="'height:' + height + 'px'">
<div style="border: 2px solid #43A747;">
<!-- 主体区域 - 卡片视图 -->
<el-card :style="'height:' + (height - 60) + 'px;overflow-y: auto;position:relative;'">
<!-- 查询功能区域 -->
<el-form :inline="true" :model="searchData" size="medium" label-position="left" >
<el-row type="flex" justify="space-between" align="middle">
<el-col>
<el-form-item label="学院名称 :">
<el-input
clearable
placeholder="请输入学院名称"
v-model="searchData.collegeName"
/>
</el-form-item>
<el-form-item>
<a-button type="primary" class="mgl15" ghost icon="search" @click="initData()">查询</a-button>
</el-form-item>
<el-form-item>
<a-button type="primary" ghost @click="resClick()" icon="reload">重置</a-button>
</el-form-item>
</el-col>
<el-form-item>
<a-button type="primary" ghost icon="plus" @click="addClick()">
新增
</a-button>
</el-form-item>
</el-row>
</el-form>
<el-table :data="data" style="width: 100%;overflow: auto;" size="medium" highlight-current-row>
<el-table-column type="index" width="60" label="序号" align="center" />
<el-table-column prop="collegeName" label="没做" align="center" />
<el-table-column prop="leaderName" label="没做" align="center" />
<el-table-column prop="remark" label="没做" align="center" />
<el-table-column label="操作" align="center" width="180">
<template slot-scope="scope">
<a-button type="primary" icon="edit" size="small" ghost @click="editClick(scope.row)">编辑</a-button>
<a-button type="danger" icon="delete" style="margin-left: 6px;" ghost size="small" @click="deleteClick(scope.row)">删除</a-button>
</template>
</el-table-column>
</el-table>
<el-pagination
style="text-align: center;position: absolute;bottom: 0;background: #fff;width: 100%"
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="searchData.pageNo"
:page-size="searchData.pageSize"
layout="total, prev, pager, next, jumper"
:total="total"
/>
</el-card>
</div>
</div>
</template>
<script>
export default {
data () {
return {
height: document.documentElement.clientHeight - 176,
data: [],
dialogVisible: false,
title: '',
formData: {},
// 筛选数据
searchData: {
pageNo: 1,
pageSize: 10,
},
// 总条数
total: 0,
}
},
created () {
this.initData()
},
mounted() {
const that = this
window.onresize = function temp() {
that.height = document.documentElement.clientHeight - 176
}
},
methods: {
async initData () {
// const { data: res } = await this.$axios.post('/data/getLessonPage', this.searchData)
// if (res.code !== 99200) return this.$message(res.message)
// this.total = res.data.totalRows - 0
// this.data = res.data.records
},
resClick () {
this.searchData = {
pageNo: 1,
pageSize: 10
}
this.initData()
},
addClick() {
this.title = '新增'
this.dialogVisible = true
},
editClick(row) {
this.title = '编辑'
const obj = JSON.parse(JSON.stringify(row))
this.dialogVisible = true
this.formData = obj
},
deleteClick (row) {
const url = '/college/remove'
const params = {
id: row.id
}
this.delete(url, params)
},
delete (url, params) {
this.$confirm('此操作将永久删除该数据, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const { data: res } = await this.$axios.delete(url, {params})
if (res.code === 99200) {
this.$message.success(res.message)
this.initData()
} else {
this.$message.error(res.message)
}
})
},
subFormData () {
this.$refs.fromRef.validate(async falg => {
if (!falg) return;
let url = '/college/save'
if (this.formData.id) {
url = '/college/update'
}
const { data: res } = await this.$axios.post(url, this.formData)
if (!res.data) return this.$message.error(res.message)
this.$message.success(res.message)
this.dialogVisible = false
this.initData()
})
},
dialogClose() {
this.formData = {}
this.$refs.fromRef.resetFields()
},
// 分页功能
// 每页显示条数发生改变时
handleSizeChange (val) {
this.searchData.pageSize = val
this.initData()
},
// 当前页数发生改变时
handleCurrentChange (val) {
this.searchData.pageNo = val
this.initData()
},
},
computed: {
}
}
</script>
<style scoped lang='less'>
</style>
<template>
<div class="body" :style="'height:' + height + 'px'">
<div style="border: 2px solid #43A747;">
<!-- 主体区域 - 卡片视图 -->
<el-card :style="'height:' + (height - 60) + 'px;overflow-y: auto;position:relative;'">
<!-- 查询功能区域 -->
<el-form :inline="true" :model="searchData" size="medium" label-position="left" >
<el-row type="flex" justify="space-between" align="middle">
<el-col>
<el-form-item label="班级编号 :">
<el-input
clearable
placeholder="请输入班级编号"
v-model="searchData.classCode"
/>
</el-form-item>
<el-form-item class="mgl15" label="班级名称 :" >
<el-input
clearable
placeholder="请输入班级名称"
v-model="searchData.className"
/>
</el-form-item>
<el-form-item>
<a-button type="primary" class="mgl15" ghost icon="search" @click="initData()">查询</a-button>
</el-form-item>
<el-form-item>
<a-button type="primary" ghost @click="resClick()" icon="reload">重置</a-button>
</el-form-item>
</el-col>
<el-form-item>
<a-button type="primary" ghost icon="plus" @click="addClick()">
新增
</a-button>
</el-form-item>
</el-row>
</el-form>
<el-table :data="data" style="width: 100%;overflow: auto;" size="medium" highlight-current-row>
<el-table-column type="index" width="60" label="序号" align="center" />
<el-table-column prop="classCode" label="班级编号" align="center" />
<el-table-column prop="className" label="班级名称" align="center" />
<el-table-column prop="majorName" label="专业名称" align="center" />
<el-table-column prop="collegeName" label="所属学院" align="center" />
<el-table-column label="操作" align="center" width="180">
<template slot-scope="scope">
<a-button type="primary" icon="edit" size="small" ghost @click="editClick(scope.row)">编辑</a-button>
<a-button type="danger" icon="delete" style="margin-left: 6px;" ghost size="small" @click="deleteClick(scope.row)">删除</a-button>
</template>
</el-table-column>
</el-table>
<el-pagination
style="text-align: center;position: absolute;bottom: 0;background: #fff;width: 100%"
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="searchData.pageNo"
:page-size="searchData.pageSize"
layout="total, prev, pager, next, jumper"
:total="total"
/>
<el-dialog
:append-to-body="true"
:title="title"
:visible.sync="dialogVisible"
@close="dialogClose()"
width="800px"
:close-on-click-modal="false"
>
<!-- 表单区域 -->
<el-form :model="formData" ref="fromRef" size="medium" style="border: 2px solid rgb(67, 167, 71);padding:20px;">
<el-card>
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-form-item label="班级名称 :">
<el-input
clearable
placeholder="请输入班级名称"
v-model="formData.className"
/>
</el-form-item>
</el-col>
<el-col :span="11">
<el-form-item label="专业名称 :">
<el-select
clearable
filterable
placeholder="请选择专业名称"
v-model="formData.majorCode"
style="width: 100%"
>
<el-option v-for="item in majorList" :key="item.id" :label="item.majorName" :value="item.majorCode"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
<span slot="footer" class="dialog-footer">
<a-button @click="dialogVisible = false" type="danger" ghost>取 消</a-button>
<a-button type="primary" @click="subFormData()" ghost style="margin-left: 6px;">提 交</a-button>
</span>
</el-dialog>
</el-card>
</div>
</div>
</template>
<script>
export default {
data () {
return {
height: document.documentElement.clientHeight - 176,
data: [],
dialogVisible: false,
title: '',
majorList: [],
formData: {},
// 筛选数据
searchData: {
pageNo: 1,
pageSize: 10,
},
// 总条数
total: 0,
}
},
created () {
this.initData()
},
mounted() {
const that = this
window.onresize = function temp() {
that.height = document.documentElement.clientHeight - 176
}
},
methods: {
async initData () {
const { data: res } = await this.$axios.post('/class/getPage', this.searchData)
if (res.code !== 99200) return this.$message(res.message)
this.total = res.data.totalRows - 0
this.data = res.data.records
},
resClick () {
this.searchData = {
pageNo: 1,
pageSize: 10
}
this.initData()
},
addClick() {
this.title = '新增'
this.initMajor()
this.dialogVisible = true
},
editClick(row) {
this.title = '编辑'
this.initMajor()
const obj = JSON.parse(JSON.stringify(row))
this.dialogVisible = true
this.formData = obj
},
async initMajor() {
const { data: res } = await this.$axios.post('/major/getPage', {pageNo:1, pageSize: 999})
if (res.code !== 99200) return this.$message(res.message)
this.majorList = res.data.records
},
deleteClick (row) {
const url = '/class/remove'
const params = {
id: row.id
}
this.delete(url, params)
},
delete (url, params) {
this.$confirm('此操作将永久删除该数据, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const { data: res } = await this.$axios.delete(url, {params})
if (res.code === 99200) {
this.$message.success(res.message)
this.initData()
} else {
this.$message.error(res.message)
}
})
},
subFormData () {
this.$refs.fromRef.validate(async falg => {
if (!falg) return;
let url = '/class/save'
if (this.formData.id) {
url = '/class/update'
}
const { data: res } = await this.$axios.post(url, this.formData)
if (!res.data) return this.$message.error(res.message)
this.$message.success(res.message)
this.dialogVisible = false
this.initData()
})
},
dialogClose() {
this.formData = {}
this.$refs.fromRef.resetFields()
},
// 分页功能
// 每页显示条数发生改变时
handleSizeChange (val) {
this.searchData.pageSize = val
this.initData()
},
// 当前页数发生改变时
handleCurrentChange (val) {
this.searchData.pageNo = val
this.initData()
},
},
computed: {
}
}
</script>
<style scoped lang='less'>
</style>
<template>
<div class="body" :style="'height:' + height + 'px'">
<div style="border: 2px solid #43A747;">
<!-- 主体区域 - 卡片视图 -->
<el-card :style="'height:' + (height - 60) + 'px;overflow-y: auto;position:relative;'">
<!-- 查询功能区域 -->
<el-form :inline="true" :model="searchData" size="medium" label-position="left" >
<el-row type="flex" justify="space-between" align="middle">
<el-col>
<el-form-item label="学院名称 :">
<el-input
clearable
placeholder="请输入学院名称"
v-model="searchData.collegeName"
/>
</el-form-item>
<el-form-item>
<a-button type="primary" class="mgl15" ghost icon="search" @click="initData()">查询</a-button>
</el-form-item>
<el-form-item>
<a-button type="primary" ghost @click="resClick()" icon="reload">重置</a-button>
</el-form-item>
</el-col>
<el-form-item>
<a-button type="primary" ghost icon="plus" @click="addClick()">
新增
</a-button>
</el-form-item>
</el-row>
</el-form>
<el-table :data="data" style="width: 100%;overflow: auto;" size="medium" highlight-current-row>
<el-table-column type="index" width="60" label="序号" align="center" />
<el-table-column prop="collegeName" label="学院名称" align="center" />
<el-table-column prop="leaderName" label="领导姓名" align="center" />
<el-table-column prop="remark" label="学院备注" align="center" />
<el-table-column label="操作" align="center" width="180">
<template slot-scope="scope">
<a-button type="primary" icon="edit" size="small" ghost @click="editClick(scope.row)">编辑</a-button>
<a-button type="danger" icon="delete" style="margin-left: 6px;" ghost size="small" @click="deleteClick(scope.row)">删除</a-button>
</template>
</el-table-column>
</el-table>
<el-pagination
style="text-align: center;position: absolute;bottom: 0;background: #fff;width: 100%"
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="searchData.pageNo"
:page-size="searchData.pageSize"
layout="total, prev, pager, next, jumper"
:total="total"
/>
<el-dialog
:append-to-body="true"
:title="title"
:visible.sync="dialogVisible"
@close="dialogClose()"
width="800px"
:close-on-click-modal="false"
>
<!-- 表单区域 -->
<el-form :model="formData" ref="fromRef" size="medium" style="border: 2px solid rgb(67, 167, 71);padding:20px;">
<el-card>
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-form-item label="学院名称 :">
<el-input
clearable
placeholder="请输入学院名称"
v-model="formData.collegeName"
/>
</el-form-item>
</el-col>
<el-col :span="11">
<el-form-item label="领导姓名 :">
<el-input
clearable
placeholder="请输入领导姓名"
v-model="formData.leaderName"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-form-item label="备注信息 :">
<el-input
type="textarea"
:autosize="{ minRows: 3}"
placeholder="请输入备注信息"
v-model="formData.remark">
</el-input>
</el-form-item>
</el-row>
</el-card>
</el-form>
<span slot="footer" class="dialog-footer">
<a-button @click="dialogVisible = false" type="danger" ghost>取 消</a-button>
<a-button type="primary" @click="subFormData()" ghost style="margin-left: 6px;">提 交</a-button>
</span>
</el-dialog>
</el-card>
</div>
</div>
</template>
<script>
export default {
data () {
return {
height: document.documentElement.clientHeight - 176,
data: [],
dialogVisible: false,
title: '',
formData: {},
// 筛选数据
searchData: {
pageNo: 1,
pageSize: 10,
},
// 总条数
total: 0,
}
},
created () {
this.initData()
},
mounted() {
const that = this
window.onresize = function temp() {
that.height = document.documentElement.clientHeight - 176
}
},
methods: {
async initData () {
const { data: res } = await this.$axios.post('/college/getPage', this.searchData)
if (res.code !== 99200) return this.$message(res.message)
this.total = res.data.totalRows - 0
this.data = res.data.records
},
resClick () {
this.searchData = {
pageNo: 1,
pageSize: 10
}
this.initData()
},
addClick() {
this.title = '新增'
this.dialogVisible = true
},
editClick(row) {
this.title = '编辑'
const obj = JSON.parse(JSON.stringify(row))
this.dialogVisible = true
this.formData = obj
},
deleteClick (row) {
const url = '/college/remove'
const params = {
id: row.id
}
this.delete(url, params)
},
delete (url, params) {
this.$confirm('此操作将永久删除该数据, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const { data: res } = await this.$axios.delete(url, {params})
if (res.code === 99200) {
this.$message.success(res.message)
this.initData()
} else {
this.$message.error(res.message)
}
})
},
subFormData () {
this.$refs.fromRef.validate(async falg => {
if (!falg) return;
let url = '/college/save'
if (this.formData.id) {
url = '/college/update'
}
const { data: res } = await this.$axios.post(url, this.formData)
if (!res.data) return this.$message.error(res.message)
this.$message.success(res.message)
this.dialogVisible = false
this.initData()
})
},
dialogClose() {
this.formData = {}
this.$refs.fromRef.resetFields()
},
// 分页功能
// 每页显示条数发生改变时
handleSizeChange (val) {
this.searchData.pageSize = val
this.initData()
},
// 当前页数发生改变时
handleCurrentChange (val) {
this.searchData.pageNo = val
this.initData()
},
},
computed: {
}
}
</script>
<style scoped lang='less'>
</style>
<template>
<div class="body" :style="'height:' + height + 'px'">
<div style="border: 2px solid #43A747;">
<!-- 主体区域 - 卡片视图 -->
<el-card :style="'height:' + (height - 60) + 'px;overflow-y: auto;position:relative;'">
<!-- 查询功能区域 -->
<el-form :inline="true" :model="searchData" size="medium" label-position="left" >
<el-row type="flex" justify="space-between" align="middle">
<el-col>
<el-form-item label="专业名称 :">
<el-input
clearable
placeholder="请输入专业名称"
v-model="searchData.majorName"
/>
</el-form-item>
<el-form-item>
<a-button type="primary" class="mgl15" ghost icon="search" @click="initData()">查询</a-button>
</el-form-item>
<el-form-item>
<a-button type="primary" ghost @click="resClick()" icon="reload">重置</a-button>
</el-form-item>
</el-col>
<el-form-item>
<a-button type="primary" ghost icon="plus" @click="addClick()">
新增
</a-button>
</el-form-item>
</el-row>
</el-form>
<el-table :data="data" style="width: 100%;overflow: auto;" size="medium" highlight-current-row>
<el-table-column type="index" width="60" label="序号" align="center" />
<el-table-column prop="majorCode" label="专业代码" align="center" />
<el-table-column prop="majorName" label="专业名称" align="center" />
<el-table-column prop="college" label="所属学院" align="center" />
<el-table-column label="操作" align="center" width="180">
<template slot-scope="scope">
<a-button type="primary" icon="edit" size="small" ghost @click="editClick(scope.row)">编辑</a-button>
<a-button type="danger" icon="delete" style="margin-left: 6px;" ghost size="small" @click="deleteClick(scope.row)">删除</a-button>
</template>
</el-table-column>
</el-table>
<el-pagination
style="text-align: center;position: absolute;bottom: 0;background: #fff;width: 100%"
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="searchData.pageNo"
:page-size="searchData.pageSize"
layout="total, prev, pager, next, jumper"
:total="total"
/>
<el-dialog
:append-to-body="true"
:title="title"
:visible.sync="dialogVisible"
@close="dialogClose()"
width="800px"
:close-on-click-modal="false"
>
<!-- 表单区域 -->
<el-form :model="formData" ref="fromRef" size="medium" style="border: 2px solid rgb(67, 167, 71);padding:20px;">
<el-card>
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-form-item label="专业名称 :">
<el-input
clearable
placeholder="请输入专业名称"
v-model="formData.majorName"
/>
</el-form-item>
</el-col>
<el-col :span="11">
<el-form-item label="所属学院 :">
<el-select
clearable
filterable
placeholder="请选择所属学院"
v-model="formData.college"
style="width: 100%"
>
<el-option v-for="item in collegeList" :key="item.id" :label="item.collegeName" :value="item.collegeName"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
<span slot="footer" class="dialog-footer">
<a-button @click="dialogVisible = false" type="danger" ghost>取 消</a-button>
<a-button type="primary" @click="subFormData()" ghost style="margin-left: 6px;">提 交</a-button>
</span>
</el-dialog>
</el-card>
</div>
</div>
</template>
<script>
export default {
data () {
return {
height: document.documentElement.clientHeight - 176,
data: [],
dialogVisible: false,
title: '',
collegeList: [],
formData: {},
// 筛选数据
searchData: {
pageNo: 1,
pageSize: 10,
},
// 总条数
total: 0,
}
},
created () {
this.initData()
},
mounted() {
const that = this
window.onresize = function temp() {
that.height = document.documentElement.clientHeight - 176
}
},
methods: {
async initData () {
const { data: res } = await this.$axios.post('/major/getPage', this.searchData)
if (res.code !== 99200) return this.$message(res.message)
this.total = res.data.totalRows - 0
this.data = res.data.records
},
resClick () {
this.searchData = {
pageNo: 1,
pageSize: 10
}
this.initData()
},
addClick() {
this.title = '新增'
this.initCollege()
this.dialogVisible = true
},
editClick(row) {
this.title = '编辑'
this.initCollege()
const obj = JSON.parse(JSON.stringify(row))
this.dialogVisible = true
this.formData = obj
},
async initCollege() {
const { data: res } = await this.$axios.post('/college/getPage', {pageNo:1, pageSize: 999})
if (res.code !== 99200) return this.$message(res.message)
this.collegeList = res.data.records
},
deleteClick (row) {
const url = '/major/remove'
const params = {
id: row.id
}
this.delete(url, params)
},
delete (url, params) {
this.$confirm('此操作将永久删除该数据, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const { data: res } = await this.$axios.delete(url, {params})
if (res.code === 99200) {
this.$message.success(res.message)
this.initData()
} else {
this.$message.error(res.message)
}
})
},
subFormData () {
this.$refs.fromRef.validate(async falg => {
if (!falg) return;
let url = '/major/save'
if (this.formData.id) {
url = '/major/update'
}
const { data: res } = await this.$axios.post(url, this.formData)
if (!res.data) return this.$message.error(res.message)
this.$message.success(res.message)
this.dialogVisible = false
this.initData()
})
},
dialogClose() {
this.formData = {}
this.$refs.fromRef.resetFields()
},
// 分页功能
// 每页显示条数发生改变时
handleSizeChange (val) {
this.searchData.pageSize = val
this.initData()
},
// 当前页数发生改变时
handleCurrentChange (val) {
this.searchData.pageNo = val
this.initData()
},
},
computed: {
}
}
</script>
<style scoped lang='less'>
</style>
<template>
<div class="body" :style="'height:' + height + 'px'">
<div style="border: 2px solid #43A747;">
<!-- 主体区域 - 卡片视图 -->
<el-card :style="'height:' + (height - 60) + 'px;overflow-y: auto;position:relative;'">
<!-- 查询功能区域 -->
<el-form :inline="true" :model="searchData" size="medium" label-position="left" >
<el-row type="flex" justify="space-between" align="middle">
<el-col>
<el-form-item label="班级编号 :">
<el-input
clearable
placeholder="请输入班级编号"
v-model="searchData.classCode"
/>
</el-form-item>
<el-form-item class="mgl15" label="班级名称 :" >
<el-input
clearable
placeholder="请输入班级名称"
v-model="searchData.className"
/>
</el-form-item>
<el-form-item>
<a-button type="primary" class="mgl15" ghost icon="search" @click="initData()">查询</a-button>
</el-form-item>
<el-form-item>
<a-button type="primary" ghost @click="resClick()" icon="reload">重置</a-button>
</el-form-item>
</el-col>
<el-form-item>
<a-button type="primary" ghost icon="plus" @click="addClick()">
新增
</a-button>
</el-form-item>
</el-row>
</el-form>
<el-table :data="data" style="width: 100%;overflow: auto;" size="medium" highlight-current-row>
<el-table-column type="index" width="60" label="序号" align="center" />
<el-table-column prop="studentNo" label="学号" align="center" />
<el-table-column prop="studentName" label="姓名" align="center" />
<el-table-column prop="sex" label="性别" align="center">
<template slot-scope="scope">
{{ scope.row.sex == '1' ? '男' : '女'}}
</template>
</el-table-column>
<el-table-column prop="majorName" label="专业名称" align="center" />
<el-table-column prop="collegeName" label="学院名称" align="center"/>
<el-table-column prop="classCode" label="所属班级编号" align="center" />
<el-table-column label="操作" align="center" width="180">
<template slot-scope="scope">
<a-button type="primary" icon="edit" size="small" ghost @click="editClick(scope.row)">编辑</a-button>
<a-button type="danger" icon="delete" style="margin-left: 6px;" ghost size="small" @click="deleteClick(scope.row)">删除</a-button>
</template>
</el-table-column>
</el-table>
<el-pagination
style="text-align: center;position: absolute;bottom: 0;background: #fff;width: 100%"
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="searchData.pageNo"
:page-size="searchData.pageSize"
layout="total, prev, pager, next, jumper"
:total="total"
/>
<el-dialog
:append-to-body="true"
:title="title"
:visible.sync="dialogVisible"
@close="dialogClose()"
width="800px"
:close-on-click-modal="false"
>
<!-- 表单区域 -->
<el-form :model="formData" ref="fromRef" size="medium" style="border: 2px solid rgb(67, 167, 71);padding:20px;">
<el-card>
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-form-item label="姓名 :">
<el-input
clearable
placeholder="请输入姓名"
v-model="formData.studentName"
/>
</el-form-item>
</el-col>
<el-col :span="11">
<el-form-item label="性别 :">
<el-select
clearable
placeholder="请选择性别"
v-model="formData.sex"
style="width: 100%"
>
<el-option label="男" value="1"></el-option>
<el-option label="女" value="2"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-form-item label="班级编号 :">
<el-select
clearable
filterable
placeholder="请选择班级编号"
v-model="formData.classCode"
style="width: 100%"
>
<el-option v-for="item in classList" :key="item.id" :label="item.className +'(' + item.classCode +')'" :value="item.classCode"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
<span slot="footer" class="dialog-footer">
<a-button @click="dialogVisible = false" type="danger" ghost>取 消</a-button>
<a-button type="primary" @click="subFormData()" ghost style="margin-left: 6px;">提 交</a-button>
</span>
</el-dialog>
</el-card>
</div>
</div>
</template>
<script>
export default {
data () {
return {
height: document.documentElement.clientHeight - 176,
data: [],
dialogVisible: false,
title: '',
formData: {},
classList: [],
// 筛选数据
searchData: {
pageNo: 1,
pageSize: 10,
},
// 总条数
total: 0,
}
},
created () {
this.initData()
},
mounted() {
const that = this
window.onresize = function temp() {
that.height = document.documentElement.clientHeight - 176
}
},
methods: {
async initData () {
const { data: res } = await this.$axios.post('/jxUser/getPage', this.searchData)
if (res.code !== 99200) return this.$message(res.message)
this.total = res.data.totalRows - 0
this.data = res.data.records
},
resClick () {
this.searchData = {
pageNo: 1,
pageSize: 10
}
this.initData()
},
addClick() {
this.title = '新增'
this.initClass()
this.dialogVisible = true
},
editClick(row) {
this.title = '编辑'
this.initClass()
const obj = JSON.parse(JSON.stringify(row))
this.dialogVisible = true
this.formData = obj
},
async initClass() {
const { data: res } = await this.$axios.post('/class/getPage', {pageNo:1, pageSize: 999})
if (res.code !== 99200) return this.$message(res.message)
this.classList = res.data.records
},
deleteClick (row) {
const url = '/jxUser/remove'
const params = {
id: row.id
}
this.delete(url, params)
},
delete (url, params) {
this.$confirm('此操作将永久删除该数据, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
console.log(params)
const { data: res } = await this.$axios.delete(url, {params})
if (res.code === 99200) {
this.$message.success(res.message)
this.initData()
} else {
this.$message.error(res.message)
}
})
},
subFormData () {
this.$refs.fromRef.validate(async falg => {
if (!falg) return;
let url = '/jxUser/save'
if (this.formData.id) {
url = '/jxUser/update'
}
const { data: res } = await this.$axios.post(url, this.formData)
if (!res.data) return this.$message.error(res.message)
this.$message.success(res.message)
this.dialogVisible = false
this.initData()
})
},
dialogClose() {
this.formData = {}
this.$refs.fromRef.resetFields()
},
// 分页功能
// 每页显示条数发生改变时
handleSizeChange (val) {
this.searchData.pageSize = val
this.initData()
},
// 当前页数发生改变时
handleCurrentChange (val) {
this.searchData.pageNo = val
this.initData()
},
},
computed: {
}
}
</script>
<style scoped lang='less'>
</style>
......@@ -205,7 +205,7 @@ export default {
methods: {
// 获取菜单列表
async getMenuData () {
const { data: res } = await this.$axios.get(window._CONFIG['publicURL'] + '/sysMenu/list', { params: { appCode: 10003 }})
const { data: res } = await this.$axios.get(window._CONFIG['publicURL'] + '/sysMenu/list')
if (res.code !== 99200) return this.$message.error(res.message)
this.menuData = res.data
},
......
<template>
<div class="body" :style="'height:' + height + 'px'">
<div style="border: 2px solid #43A747;">
<!-- 主体区域 - 卡片视图 -->
<el-card :style="'height:' + (height - 60) + 'px;overflow-y: auto;position:relative;'">
<!-- 查询功能区域 -->
<el-form :inline="true" :model="searchData" size="medium" label-position="left" >
<el-row type="flex" justify="space-between" align="middle">
<el-col>
<el-form-item label="假期名称 :">
<el-input v-model="searchData.vacationName" placeholder="请输入假期名称" />
</el-form-item>
<el-form-item label="选择日期 :">
<el-date-picker
@change="dateChange"
v-model="timeData"
type="daterange"
align="right"
unlink-panels
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
format="yyyy 年 MM 月 dd 日"
value-format="yyyy-MM-dd HH:mm:ss"
:picker-options="pickerOptions">
</el-date-picker>
</el-form-item>
<el-form-item>
<a-button type="primary" class="mgl15" ghost icon="search" @click="initData()">查询</a-button>
</el-form-item>
<el-form-item>
<a-button type="primary" ghost @click="resClick()" icon="reload">重置</a-button>
</el-form-item>
</el-col>
<el-form-item>
<a-button type="primary" ghost icon="plus" @click="addClick()">
新增
</a-button>
</el-form-item>
</el-row>
</el-form>
<el-table :data="data" style="width: 100%;overflow: auto;" size="medium" highlight-current-row>
<el-table-column type="index" width="60" label="序号" align="center" />
<el-table-column prop="vacationName" label="假期名称" align="center" />
<el-table-column prop="remark" label="假期描述" align="center" />
<el-table-column prop="startTime" label="假期开始时间" align="center" />
<el-table-column prop="endTime" label="假期结束时间" align="center" />
<el-table-column label="操作" align="center" width="180">
<template slot-scope="scope">
<a-button type="primary" icon="edit" size="small" ghost @click="editClick(scope.row)">编辑</a-button>
<a-button type="danger" icon="delete" style="margin-left: 6px;" ghost size="small" @click="deleteClick(scope.row)">删除</a-button>
</template>
</el-table-column>
</el-table>
<el-pagination
style="text-align: center;position: absolute;bottom: 0;background: #fff;width: 100%"
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="searchData.pageNo"
:page-size="searchData.pageSize"
layout="total, prev, pager, next, jumper"
:total="total"
/>
<el-dialog
:append-to-body="true"
:title="title"
:visible.sync="dialogVisible"
@close="dialogClose()"
width="800px"
:close-on-click-modal="false"
>
<!-- 表单区域 -->
<el-form :model="formData" ref="fromRef" size="medium" style="border: 2px solid rgb(67, 167, 71);padding:20px;">
<el-card>
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-form-item label="假期名称 :">
<el-input v-model="formData.vacationName" placeholder="请输入假期名称" />
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-form-item label="请假开始时间 :">
<el-date-picker
v-model="formData.startTime"
type="datetime"
placeholder="选择日期时间"
style="width: 100%"
default-time="08:00:00">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="11">
<el-form-item label="请假结束时间 :">
<el-date-picker
v-model="formData.endTime"
type="datetime"
placeholder="选择日期时间"
style="width: 100%"
default-time="18:00:00">
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-form-item label="备注信息 :">
<el-input
type="textarea"
:autosize="{ minRows: 3}"
placeholder="请输入备注信息"
v-model="formData.remark">
</el-input>
</el-form-item>
</el-row>
</el-card>
</el-form>
<span slot="footer" class="dialog-footer">
<a-button @click="dialogVisible = false" type="danger" ghost>取 消</a-button>
<a-button type="primary" @click="subFormData()" ghost style="margin-left: 6px;">提 交</a-button>
</span>
</el-dialog>
</el-card>
</div>
</div>
</template>
<script>
export default {
data () {
return {
height: document.documentElement.clientHeight - 176,
data: [],
dialogVisible: false,
title: '',
formData: {
studentNo: ''
},
// 筛选数据
searchData: {
pageNo: 1,
pageSize: 10,
},
timeData: [],
classList: [],
studentList: [],
classStudentList: [],
pickerOptions: {
shortcuts: [{
text: '最近一日',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 1)
picker.$emit('pick', [start, end])
}
}, {
text: '最近一周',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
picker.$emit('pick', [start, end])
}
}, {
text: '最近一个月',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
picker.$emit('pick', [start, end])
}
}, {
text: '最近三个月',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
picker.$emit('pick', [start, end])
}
}]
},
// 总条数
total: 0,
}
},
created () {
this.initData()
},
mounted() {
const that = this
window.onresize = function temp() {
that.height = document.documentElement.clientHeight - 176
}
},
methods: {
async initData () {
const { data: res } = await this.$axios.post('/jxVacation/getPage', this.searchData)
if (res.code !== 99200) return this.$message(res.message)
this.total = res.data.totalRows - 0
this.data = res.data.records
},
resClick () {
this.searchData = {
pageNo: 1,
pageSize: 10
}
this.timeData = []
this.initData()
},
dateChange (date) {
this.searchData.startTime = date ? date[0] : ''
this.searchData.endTime = date ? date[1] : ''
},
addClick() {
this.title = '新增'
this.dialogVisible = true
},
editClick(row) {
this.title = '编辑'
const obj = JSON.parse(JSON.stringify(row))
this.dialogVisible = true
this.formData = obj
},
subFormData () {
this.$refs.fromRef.validate(async falg => {
if (!falg) return;
let url = '/jxVacation/save'
if (this.formData.id) {
url = '/jxVacation/update'
}
const { data: res } = await this.$axios.post(url, this.formData)
if (!res.data) return this.$message.error(res.message)
this.$message.success(res.message)
this.dialogVisible = false
this.initData()
})
},
dialogClose() {
this.formData = {}
this.$refs.fromRef.resetFields()
},
deleteClick (row) {
const url = '/jxVacation/remove'
const params = {
id: row.id
}
this.delete(url, params)
},
delete (url, params) {
this.$confirm('此操作将永久删除该数据, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const { data: res } = await this.$axios.delete(url, {params})
if (res.code === 99200) {
this.$message.success(res.message)
this.initData()
} else {
this.$message.error(res.message)
}
})
},
// 分页功能
// 每页显示条数发生改变时
handleSizeChange (val) {
this.searchData.pageSize = val
this.initData()
},
// 当前页数发生改变时
handleCurrentChange (val) {
this.searchData.pageNo = val
this.initData()
},
},
computed: {
}
}
</script>
<style scoped lang='less'>
</style>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论