Compare commits

...

10 Commits

Author SHA1 Message Date
ray.ma
4df8142a7a init 2025-01-17 19:11:06 +08:00
花裤衩
4c18a3f47b docs: update readme 2021-11-19 15:21:54 +08:00
花裤衩
714ded1155 docs: remove gitads 2020-08-30 22:59:10 +08:00
花裤衩
785f19f551
Update README.md 2020-07-26 10:07:01 +08:00
花裤衩
75ba8cf038 docs: update ads url 2020-07-13 10:42:23 +08:00
花裤衩
abcd5d810d docs: add gitads 2020-07-05 10:57:28 +08:00
花裤衩
8c4e38fb1f
Update README.md 2020-06-30 21:30:58 +08:00
花裤衩
fe326aa2b0
Update README.md 2020-06-30 21:20:43 +08:00
morrxy
c9cb7db3ce
perf[getInfo]:stop run after reject (#599) 2020-06-26 18:40:32 +08:00
morrxy
cd8d52bfbd
fix: add route name(#598) 2020-06-25 13:51:25 +08:00
25 changed files with 1693 additions and 205 deletions

View File

@ -8,6 +8,15 @@
目前版本为 `v4.0+` 基于 `vue-cli` 进行构建,若你想使用旧版本,可以切换分支到[tag/3.11.0](https://github.com/PanJiaChen/vue-admin-template/tree/tag/3.11.0),它不依赖 `vue-cli`
<p align="center">
<b>SPONSORED BY</b>
</p>
<p align="center">
<a href="https://finclip.com?from=vue_element" title="FinClip" target="_blank">
<img height="200px" src="https://gitee.com/panjiachen/gitee-cdn/raw/master/vue%E8%B5%9E%E5%8A%A9.png" title="FinClip">
</a>
</p>
## Extra
如果你想要根据用户角色来动态生成侧边栏和 router你可以使用该分支[permission-control](https://github.com/PanJiaChen/vue-admin-template/tree/permission-control)

View File

@ -9,8 +9,16 @@ English | [简体中文](./README-zh.md)
**The current version is `v4.0+` build on `vue-cli`. If you want to use the old version , you can switch branch to [tag/3.11.0](https://github.com/PanJiaChen/vue-admin-template/tree/tag/3.11.0), it does not rely on `vue-cli`**
## Build Setup
<p align="center">
<b>SPONSORED BY</b>
</p>
<p align="center">
<a href="https://finclip.com?from=vue_element" title="FinClip" target="_blank">
<img height="200px" src="https://gitee.com/panjiachen/gitee-cdn/raw/master/vue%E8%B5%9E%E5%8A%A9.png" title="FinClip">
</a>
</p>
## Build Setup
```bash
# clone the project

34
src/api/classes.js Normal file
View File

@ -0,0 +1,34 @@
import request from '@/utils/request'
export function addClass(data) {
return request({
url: '/api/class/add',
method: 'post',
data
})
}
export function updateClass(data) {
return request({
url: '/api/class/update',
method: 'post',
data
})
}
export function deleteClass(data) {
return request({
url: '/api/class/delete',
method: 'post',
data
})
}
export function classInfo(params) {
return request({
url: '/api/class/info',
method: 'get',
params
})
}

42
src/api/score.js Normal file
View File

@ -0,0 +1,42 @@
import request from '@/utils/request'
export function scoreList(params) {
return request({
url: '/api/score/list',
method: 'get',
params
})
}
export function scoreInfo(params) {
return request({
url: '/api/score/info',
method: 'get',
params
})
}
export function scoreAdd(data) {
return request({
url: '/api/score/add',
method: 'post',
data
})
}
export function scoreUpdate(data) {
return request({
url: '/api/score/update',
method: 'post',
data
})
}
export function scoreDelete(data) {
return request({
url: '/api/score/delete',
method: 'post',
data
})
}

41
src/api/subject.js Normal file
View File

@ -0,0 +1,41 @@
import request from '@/utils/request'
export function subjectList(params) {
return request({
url: '/api/subject/list',
method: 'get',
params
})
}
export function subjectCreate(data) {
return request({
url: '/api/subject/add',
method: 'post',
data
})
}
export function subjectUpdate(data) {
return request({
url: '/api/subject/update',
method: 'post',
data
})
}
export function subjectDelete(data) {
return request({
url: '/api/subject/delete',
method: 'post',
data
})
}
export function subjectInfo(params) {
return request({
url: '/api/subject/info',
method: 'get',
params
})
}

View File

@ -1,9 +1,28 @@
import request from '@/utils/request'
// 学生列表
export function getList(params) {
return request({
url: '/vue-admin-template/table/list',
url: '/api/account/list',
method: 'get',
params
})
}
// 班级列表
export function getClassList(params) {
return request({
url: '/api/class/list',
method: 'get',
params
})
}
// 新增班级
export function addClass(data) {
return request({
url: '/api/class/add',
method: 'post',
data
})
}

View File

@ -2,7 +2,7 @@ import request from '@/utils/request'
export function login(data) {
return request({
url: '/vue-admin-template/user/login',
url: '/api/account/login',
method: 'post',
data
})
@ -10,15 +10,46 @@ export function login(data) {
export function getInfo(token) {
return request({
url: '/vue-admin-template/user/info',
method: 'get',
params: { token }
url: '/api/account/info',
method: 'get'
})
}
export function logout() {
export function createUser(data) {
return request({
url: '/vue-admin-template/user/logout',
method: 'post'
url: '/api/account/student/add',
method: 'post',
data
})
}
export function deleteUser(params) {
return request({
url: '/api/account/delete',
method: 'get',
params
})
}
export function userDetail(params) {
return request({
url: '/api/account/detail',
method: 'get',
params
})
}
export function updateUser(data) {
return request({
url: '/api/account/update',
method: 'post',
data
})
}
export function getTeachers() {
return request({
url: '/api/account/teacher-list',
method: 'get'
})
}

View File

@ -16,12 +16,6 @@
Home
</el-dropdown-item>
</router-link>
<a target="_blank" href="https://github.com/PanJiaChen/vue-admin-template/">
<el-dropdown-item>Github</el-dropdown-item>
</a>
<a target="_blank" href="https://panjiachen.github.io/vue-element-admin-site/#/">
<el-dropdown-item>Docs</el-dropdown-item>
</a>
<el-dropdown-item divided @click.native="logout">
<span style="display:block;">Log Out</span>
</el-dropdown-item>

View File

@ -24,7 +24,7 @@ export default {
},
data() {
return {
title: 'Vue Admin Template',
title: '成绩管理系统',
logo: 'https://wpimg.wallstcn.com/69a1c46c-eb1c-4b46-8bd4-e9e686ef5251.png'
}
}

View File

@ -51,113 +51,155 @@ export const constantRoutes = [
path: 'dashboard',
name: 'Dashboard',
component: () => import('@/views/dashboard/index'),
meta: { title: 'Dashboard', icon: 'dashboard' }
meta: { title: '主页', icon: 'dashboard' }
}]
},
{
path: '/example',
path: '/teacher',
component: Layout,
redirect: '/example/table',
redirect: '/teacher/table',
name: 'Example',
meta: { title: 'Example', icon: 'el-icon-s-help' },
meta: { title: '教师', icon: 'el-icon-s-help' },
children: [
{
path: 'table',
name: 'Table',
component: () => import('@/views/table/index'),
meta: { title: 'Table', icon: 'table' }
component: () => import('@/views/student/index'),
meta: { title: '学生管理', icon: 'table' }
},
{
path: 'tree',
name: 'Tree',
component: () => import('@/views/tree/index'),
meta: { title: 'Tree', icon: 'tree' }
path: 'class',
name: 'Class',
component: () => import('@/views/class/index'),
meta: { title: '班级管理', icon: 'table' }
},
{
path: 'subject',
name: 'Subject',
component: () => import('@/views/subject/index'),
meta: { title: '科目管理', icon: 'table' }
},
{
path: 'score',
name: 'Score',
component: () => import('@/views/score/index'),
meta: { title: '成绩管理', icon: 'table' }
}
// {
// path: 'tree',
// name: 'Tree',
// component: () => import('@/views/tree/index'),
// meta: { title: 'Tree', icon: 'tree' }
// }
]
},
{
path: '/form',
component: Layout,
hidden: true,
children: [
{
path: 'index',
name: 'Form',
component: () => import('@/views/form/index'),
meta: { title: 'Form', icon: 'form' }
}
]
},
{
path: '/nested',
component: Layout,
redirect: '/nested/menu1',
name: 'Nested',
meta: {
title: 'Nested',
icon: 'nested'
},
children: [
{
path: 'menu1',
component: () => import('@/views/nested/menu1/index'), // Parent router-view
name: 'Menu1',
meta: { title: 'Menu1' },
children: [
{
path: 'menu1-1',
component: () => import('@/views/nested/menu1/menu1-1'),
name: 'Menu1-1',
meta: { title: 'Menu1-1' }
},
{
path: 'menu1-2',
component: () => import('@/views/nested/menu1/menu1-2'),
name: 'Menu1-2',
meta: { title: 'Menu1-2' },
children: [
{
path: 'menu1-2-1',
component: () => import('@/views/nested/menu1/menu1-2/menu1-2-1'),
name: 'Menu1-2-1',
meta: { title: 'Menu1-2-1' }
},
{
path: 'menu1-2-2',
component: () => import('@/views/nested/menu1/menu1-2/menu1-2-2'),
name: 'Menu1-2-2',
meta: { title: 'Menu1-2-2' }
}
]
},
{
path: 'menu1-3',
component: () => import('@/views/nested/menu1/menu1-3'),
name: 'Menu1-3',
meta: { title: 'Menu1-3' }
}
]
props: route => ({ id: route.query.id }),
meta: { title: '学生编辑', icon: 'form' }
},
{
path: 'menu2',
component: () => import('@/views/nested/menu2/index'),
meta: { title: 'menu2' }
path: 'class',
name: 'class-form',
component: () => import('@/views/form/class'),
props: route => ({ id: route.query.id }),
meta: { title: '班级编辑', icon: 'form' }
},
{
path: 'subject',
name: 'subject-form',
component: () => import('@/views/form/subject'),
props: route => ({ id: route.query.id }),
meta: { title: '科目编辑', icon: 'form' }
},
{
path: 'score',
name: 'score-form',
component: () => import('@/views/form/score'),
props: route => ({ id: route.query.id }),
meta: { title: '成绩编辑', icon: 'form' }
}
]
},
{
path: 'external-link',
component: Layout,
children: [
{
path: 'https://panjiachen.github.io/vue-element-admin-site/#/',
meta: { title: 'External Link', icon: 'link' }
}
]
},
// {
// path: '/nested',
// component: Layout,
// redirect: '/nested/menu1',
// name: 'Nested',
// meta: {
// title: 'Nested',
// icon: 'nested'
// },
// children: [
// {
// path: 'menu1',
// component: () => import('@/views/nested/menu1/index'), // Parent router-view
// name: 'Menu1',
// meta: { title: 'Menu1' },
// children: [
// {
// path: 'menu1-1',
// component: () => import('@/views/nested/menu1/menu1-1'),
// name: 'Menu1-1',
// meta: { title: 'Menu1-1' }
// },
// {
// path: 'menu1-2',
// component: () => import('@/views/nested/menu1/menu1-2'),
// name: 'Menu1-2',
// meta: { title: 'Menu1-2' },
// children: [
// {
// path: 'menu1-2-1',
// component: () => import('@/views/nested/menu1/menu1-2/menu1-2-1'),
// name: 'Menu1-2-1',
// meta: { title: 'Menu1-2-1' }
// },
// {
// path: 'menu1-2-2',
// component: () => import('@/views/nested/menu1/menu1-2/menu1-2-2'),
// name: 'Menu1-2-2',
// meta: { title: 'Menu1-2-2' }
// }
// ]
// },
// {
// path: 'menu1-3',
// component: () => import('@/views/nested/menu1/menu1-3'),
// name: 'Menu1-3',
// meta: { title: 'Menu1-3' }
// }
// ]
// },
// {
// path: 'menu2',
// component: () => import('@/views/nested/menu2/index'),
// name: 'Menu2',
// meta: { title: 'menu2' }
// }
// ]
// },
// {
// path: 'external-link',
// component: Layout,
// children: [
// {
// path: 'https://panjiachen.github.io/vue-element-admin-site/#/',
// meta: { title: 'External Link', icon: 'link' }
// }
// ]
// },
// 404 page must be placed at the end !!!
{ path: '*', redirect: '/404', hidden: true }

View File

@ -1,6 +1,6 @@
module.exports = {
title: 'Vue Admin Template',
title: '学生成绩管理系统',
/**
* @type {boolean} true | false

View File

@ -1,4 +1,4 @@
import { login, logout, getInfo } from '@/api/user'
import { login, getInfo, createUser } from '@/api/user'
import { getToken, setToken, removeToken } from '@/utils/auth'
import { resetRouter } from '@/router'
@ -24,18 +24,45 @@ const mutations = {
},
SET_AVATAR: (state, avatar) => {
state.avatar = avatar
},
SET_UID: (state, uid) => {
state.uid = uid
}
}
const actions = {
// user login
login({ commit }, userInfo) {
const { username, password } = userInfo
const { accountId, password } = userInfo
return new Promise((resolve, reject) => {
login({ username: username.trim(), password: password }).then(response => {
const { data } = response
commit('SET_TOKEN', data.token)
setToken(data.token)
login({ accountId: parseInt(accountId, 10), password: password }).then(response => {
const { result } = response
commit('SET_TOKEN', result.token)
commit('SET_NAME', result.username)
commit('SET_AVATAR', result.headImg)
setToken(result.token)
resolve()
}).catch(error => {
reject(error)
})
})
},
createUser({ commit }, form) {
return new Promise((resolve, reject) => {
const birthday = new Date(form.birthday)
const formateBirthday = `${birthday.getFullYear()}-${String(birthday.getMonth() + 1).padStart(2, '0')}-${String(birthday.getDate()).padStart(2, '0')}`
const data = {
username: form.username,
gender: parseInt(form.gender, 10),
birthday: formateBirthday,
phone: form.phone,
college: form.college,
classId: parseInt(form.classId, 10)
}
createUser(data).then(response => {
// const { result } = response
resolve()
}).catch(error => {
reject(error)
@ -46,18 +73,18 @@ const actions = {
// get user info
getInfo({ commit, state }) {
return new Promise((resolve, reject) => {
getInfo(state.token).then(response => {
const { data } = response
getInfo().then(response => {
const { result } = response
if (!data) {
reject('Verification failed, please Login again.')
if (!result) {
return reject('Verification failed, please Login again.')
}
const { name, avatar } = data
const { username, userId } = result
commit('SET_NAME', name)
commit('SET_AVATAR', avatar)
resolve(data)
commit('SET_NAME', username)
commit('SET_UID', userId)
resolve(result)
}).catch(error => {
reject(error)
})
@ -66,15 +93,11 @@ const actions = {
// user logout
logout({ commit, state }) {
return new Promise((resolve, reject) => {
logout(state.token).then(() => {
removeToken() // must remove token first
resetRouter()
commit('RESET_STATE')
resolve()
}).catch(error => {
reject(error)
})
return new Promise(resolve => {
removeToken() // must remove token first
resetRouter()
commit('RESET_STATE')
resolve()
})
},

View File

@ -1,6 +1,6 @@
import defaultSettings from '@/settings'
const title = defaultSettings.title || 'Vue Admin Template'
const title = defaultSettings.title || '成绩管理系统'
export default function getPageTitle(pageTitle) {
if (pageTitle) {

View File

@ -5,7 +5,7 @@ import { getToken } from '@/utils/auth'
// create an axios instance
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
baseURL: 'http://xiaobaitao.com:8080/', // url = base url + request url
// withCredentials: true, // send cookies when cross-domain requests
timeout: 5000 // request timeout
})
@ -19,7 +19,7 @@ service.interceptors.request.use(
// let each request carry token
// ['X-Token'] is a custom headers key
// please modify it according to the actual situation
config.headers['X-Token'] = getToken()
config.headers['token'] = getToken()
}
return config
},
@ -46,7 +46,7 @@ service.interceptors.response.use(
const res = response.data
// if the custom code is not 20000, it is judged as an error.
if (res.code !== 20000) {
if (res.ret_code !== 0) {
Message({
message: res.message || 'Error',
type: 'error',
@ -54,7 +54,7 @@ service.interceptors.response.use(
})
// 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
if (res.code === 1002) {
// to re-login
MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', 'Confirm logout', {
confirmButtonText: 'Re-Login',

View File

@ -9,12 +9,3 @@
export function isExternal(path) {
return /^(https?:|mailto:|tel:)/.test(path)
}
/**
* @param {string} str
* @returns {Boolean}
*/
export function validUsername(str) {
const valid_map = ['admin', 'editor']
return valid_map.indexOf(str.trim()) >= 0
}

185
src/views/class/index.vue Normal file
View File

@ -0,0 +1,185 @@
<template>
<div class="app-container">
<el-form label-width="120px">
<el-row class="filter-row" type="flex" justify="start">
<el-col :span="6">
<el-form-item label="班级id">
<el-input v-model="filter.id" placeholder="请输入班级id" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="班级名称">
<el-input v-model="filter.name" placeholder="请输入班级名称" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="专业">
<el-input v-model="filter.major" placeholder="请输入专业名称" />
</el-form-item>
</el-col>
<el-col :span="4" offset="0">
<el-form-item>
<el-button type="primary" @click="onFilter">筛选</el-button>
</el-form-item>
</el-col>
<el-col :span="4" offset="0">
<el-form-item>
<el-button type="primary" @click="handleAdd">新增</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-table
v-loading="listLoading"
:data="list"
element-loading-text="Loading"
border
fit
highlight-current-row
style="width: 100%"
>
<el-table-column align="center" label="班级id">
<template slot-scope="scope">
{{ scope.row.id }}
</template>
</el-table-column>
<el-table-column label="入学年份">
<template slot-scope="scope">
{{ scope.row.year }}
</template>
</el-table-column>
<el-table-column label="班级名称" align="center">
<template slot-scope="scope">
<span>{{ scope.row.name }}</span>
</template>
</el-table-column>
<el-table-column label="专业" align="center">
<template slot-scope="scope">
<span>{{ scope.row.major }}</span>
</template>
</el-table-column>
<el-table-column label="导员账户id" align="center">
<template slot-scope="scope">
<span>{{ scope.row.counselorAccountId }}</span>
</template>
</el-table-column>
<el-table-column label="学生人数" align="center">
<template slot-scope="scope">
<span>{{ scope.row.studentCount }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-button type="text" @click="handleEdit(scope.row)">修改</el-button>
<el-button type="text" @click="handleDelete(scope.row.id)">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
import { getClassList } from '@/api/table'
import { deleteClass } from '@/api/classes'
export default {
filters: {
statusFilter(status) {
const statusMap = {
published: 'success',
draft: 'gray',
deleted: 'danger'
}
return statusMap[status]
}
},
data() {
return {
list: null,
listLoading: true,
filter: {
id: '',
name: '',
major: ''
}
}
},
created() {
this.fetchData()
},
methods: {
fetchData() {
this.listLoading = true
getClassList().then(response => {
this.list = response.result
this.listLoading = false
}).catch(() => {
this.listLoading = false
})
},
handleAdd() {
this.$router.push('/form/class')
},
handleEdit(classData) {
this.$router.push({
path: '/form/class',
query: { id: classData.id }
})
},
onFilter() {
this.listLoading = true
getClassList(this.filter).then(response => {
this.list = response.result
this.listLoading = false
}).catch(() => {
this.listLoading = false
})
},
handleDelete(id) {
this.$confirm('确认删除该班级吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
const data = {
id: id
}
deleteClass(data).then(() => {
this.$message({
type: 'success',
message: '删除成功!'
})
this.fetchData()
}).catch(() => {
this.$message({
type: 'error',
message: '删除失败, 请重试!'
})
})
}).catch(() => {
this.$message({
type: 'info',
message: '已取消删除'
})
})
}
}
}
</script>
<style scoped>
.app-container {
padding: 20px;
}
.button-container {
display: flex;
justify-content: flex-end; /* 使按钮靠右 */
margin-bottom: 10px; /* 按钮与表格之间的间距 */
}
.filter-row {
margin-bottom: 20px; /* 增加行间距 */
}
.el-form-item {
margin-bottom: 0; /* 移除表单项的底部间距 */
}
</style>

126
src/views/form/class.vue Normal file
View File

@ -0,0 +1,126 @@
<template>
<div class="app-container">
<el-form ref="form" :model="form" label-width="120px">
<el-form-item label="入学年份">
<el-input v-model="form.year" style="width: 200px;" />
</el-form-item>
<el-form-item label="班级名称">
<el-input v-model="form.name" style="width: 200px;" />
</el-form-item>
<el-form-item label="专业">
<el-select v-model="form.major" placeholder="选择专业">
<el-option label="软件工程" value="SoftwareEngineering" />
<el-option label="网络工程" value="NetworkEngineering" />
<el-option label="信息安全" value="InformationSecurity" />
<el-option label="人工智能" value="ArtificialIntelligence" />
</el-select>
</el-form-item>
<el-form-item label="导员">
<el-select v-model="form.counselorAccountId" placeholder="选择导员">
<el-option
v-for="counselor in counselors"
:key="counselor.userId"
:label="counselor.username + counselor.userId"
:value="counselor.userId"
/>
</el-select>
</el-form-item>
<el-form-item label="学生数量">
<el-input v-model="form.studentCount" style="width: 200px;" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">提交</el-button>
<el-button @click="onCancel">取消</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
import { getTeachers } from '@/api/user'
import { addClass, updateClass, classInfo } from '@/api/classes'
export default {
props: {
id: {
type: String,
required: false,
default: ''
}
},
data() {
return {
form: {
id: '',
year: '',
name: '',
major: '',
counselorAccountId: '',
studentCount: ''
},
counselors: []
}
},
created() {
//
getTeachers().then(response => {
this.counselors = response.result
})
if (this.id) {
const params = {
id: this.id
}
this.loading = true
classInfo(params).then(response => {
const { result } = response
this.form = {
id: result.id,
year: result.year,
name: result.name,
major: result.major,
counselorAccountId: result.counselorAccountId,
studentCount: result.studentCount
}
this.loading = false
}).catch(() => {
this.loading = false
})
console.log('id is {}', this.id)
}
},
methods: {
onSubmit() {
this.loading = true
if (this.form.id) {
updateClass(this.form).then(() => {
this.$message({
type: 'info',
message: '更新成功'
})
this.$router.push('/teacher/class')
})
} else {
addClass(this.form).then(() => {
this.$router.push('/teacher/class')
this.loading = false
}).catch(() => {
this.loading = false
})
this.$router.push('/teacher/class')
}
},
onCancel() {
this.$router.push('/teacher/class')
}
}
}
</script>
<style scoped>
.line{
text-align: center;
}
</style>

View File

@ -1,77 +1,111 @@
<template>
<div class="app-container">
<el-form ref="form" :model="form" label-width="120px">
<el-form-item label="Activity name">
<el-input v-model="form.name" />
<el-form-item label="学生姓名">
<el-input v-model="form.username" style="width: 200px;" />
</el-form-item>
<el-form-item label="Activity zone">
<el-select v-model="form.region" placeholder="please select your zone">
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
<el-form-item label="性别">
<el-select v-model="form.gender" placeholder="选择性别">
<el-option label="男" value="1" />
<el-option label="女" value="2" />
</el-select>
</el-form-item>
<el-form-item label="Activity time">
<el-form-item label="出生日期">
<el-col :span="11">
<el-date-picker v-model="form.date1" type="date" placeholder="Pick a date" style="width: 100%;" />
</el-col>
<el-col :span="2" class="line">-</el-col>
<el-col :span="11">
<el-time-picker v-model="form.date2" type="fixed-time" placeholder="Pick a time" style="width: 100%;" />
<el-date-picker v-model="form.birthday" type="date" placeholder="选择日期" style="width: 200px;" />
</el-col>
</el-form-item>
<el-form-item label="Instant delivery">
<el-switch v-model="form.delivery" />
<el-form-item label="联系方式">
<el-input v-model="form.phone" style="width: 200px;" />
</el-form-item>
<el-form-item label="Activity type">
<el-checkbox-group v-model="form.type">
<el-checkbox label="Online activities" name="type" />
<el-checkbox label="Promotion activities" name="type" />
<el-checkbox label="Offline activities" name="type" />
<el-checkbox label="Simple brand exposure" name="type" />
</el-checkbox-group>
<el-form-item label="学院">
<el-select v-model="form.college" placeholder="选择学院">
<el-option label="电控" value="electronic" />
<el-option label="机械" value="mechanical" />
<el-option label="计算机" value="computer" />
</el-select>
</el-form-item>
<el-form-item label="Resources">
<el-radio-group v-model="form.resource">
<el-radio label="Sponsor" />
<el-radio label="Venue" />
</el-radio-group>
</el-form-item>
<el-form-item label="Activity form">
<el-input v-model="form.desc" type="textarea" />
<el-form-item label="班级">
<el-input v-model="form.classId" style="width: 200px;" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">Create</el-button>
<el-button @click="onCancel">Cancel</el-button>
<el-button type="primary" @click="onSubmit">提交</el-button>
<el-button @click="onCancel">取消</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
import { userDetail, updateUser } from '@/api/user'
export default {
props: {
id: {
type: String,
required: false,
default: ''
}
},
data() {
return {
form: {
name: '',
region: '',
date1: '',
date2: '',
delivery: false,
type: [],
resource: '',
desc: ''
userId: '',
username: '',
gender: '',
birthday: '',
phone: '',
college: '',
classId: ''
}
}
},
created() {
if (this.id) {
const params = {
id: this.id
}
this.loading = true
userDetail(params).then(response => {
const { result } = response
this.form = {
userId: result.userId,
username: result.username,
gender: result.gender,
birthday: new Date(result.birthday),
phone: result.phone,
college: result.college,
classId: result.classId
}
this.loading = false
}).catch(() => {
this.loading = false
})
console.log('id is {}', this.id)
}
},
methods: {
onSubmit() {
this.$message('submit!')
this.loading = true
if (this.form.userId) {
updateUser(this.form).then(() => {
this.$message({
type: 'info',
message: '更新成功'
})
})
} else {
this.$store.dispatch('user/createUser', this.form).then(() => {
this.$router.push('/teacher/table')
this.loading = false
}).catch(() => {
this.loading = false
})
}
},
onCancel() {
this.$message({
message: 'cancel!',
type: 'warning'
})
this.$router.push('/teacher/table')
}
}
}

179
src/views/form/score.vue Normal file
View File

@ -0,0 +1,179 @@
<template>
<div class="app-container">
<el-form ref="form" :model="form" label-width="120px">
<el-form-item label="学生姓名" placeholder="选择学生">
<el-select v-model="form.studentName" @change="updateStudentId">
<el-option
v-for="student in studentList"
:key="student.userId"
:label="student.username"
:value="student.username"
/>
</el-select>
</el-form-item>
<el-form-item label="学生账户">
<el-input v-model="form.studentId" style="width: 200px;" disabled />
</el-form-item>
<el-form-item label="班级名称" placeholder="选择班级">
<el-select v-model="form.className" @change="updateClassId">
<el-option
v-for="classData in classList"
:key="classData.id"
:label="classData.name"
:value="classData.name"
/>
</el-select>
</el-form-item>
<el-form-item label="班级id">
<el-input v-model="form.classId" style="width: 200px;" disabled />
</el-form-item>
<el-form-item label="科目名称">
<el-select v-model="form.subjectName" @change="updateSubjectId">
<el-option
v-for="subject in subjectList"
:key="subject.id"
:label="subject.name"
:value="subject.name"
/>
</el-select>
</el-form-item>
<el-form-item label="科目id">
<el-input v-model="form.subjectId" style="width: 200px;" disabled />
</el-form-item>
<el-form-item label="学年">
<el-select v-model="form.year" style="width: 200px;">
<el-option
v-for="year in years"
:key="year"
:label="year"
:value="year"
/>
</el-select>
</el-form-item>
<el-form-item label="学期">
<el-radio-group v-model="form.term">
<el-radio label="1"></el-radio>
<el-radio label="2"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="分数">
<el-input v-model="form.score" style="width: 200px;" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">提交</el-button>
<el-button @click="onCancel">取消</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
import { scoreInfo, scoreAdd, scoreUpdate } from '@/api/score'
import { getList, getClassList } from '@/api/table'
import { subjectList } from '@/api/subject'
export default {
props: {
id: {
type: String,
required: false,
default: ''
}
},
data() {
return {
form: {
id: '',
studentId: '',
studentName: '',
className: '',
classId: '',
subjectId: '',
subjectName: '',
year: '',
term: '',
score: ''
},
studentList: [],
classList: [],
subjectList: [],
years: [2021, 2022, 2023, 2024, 2025, 2026]
}
},
created() {
if (this.id) {
Promise.all([getList(), getClassList(), subjectList()])
.then(([studentRes, classRes, subjectRes]) => {
this.studentList = studentRes.result
this.classList = classRes.result
this.subjectList = subjectRes.result
const params = {
id: this.id
}
this.loading = true
scoreInfo(params).then(response => {
const { result } = response
this.form = result
const classData = this.classList.find(classData => classData.id === Number(this.form.classId))
if (classData) {
this.form.className = classData.name
}
this.form.term = String(this.form.term)
this.loading = false
}).catch(() => {
this.loading = false
})
})
}
},
methods: {
onSubmit() {
this.loading = true
if (this.form.id) {
scoreUpdate(this.form).then(() => {
this.$message({
type: 'info',
message: '更新成功'
})
this.$router.push('/teacher/score')
})
} else {
scoreAdd(this.form).then(() => {
this.$router.push('/teacher/score')
this.loading = false
}).catch(() => {
this.loading = false
})
}
},
onCancel() {
this.$router.push('/teacher/score')
},
updateStudentId() {
const selectedStudent = this.studentList.find(student => student.username === this.form.studentName)
if (selectedStudent) {
this.form.studentId = Number(selectedStudent.userId)
}
},
updateClassId() {
const classData = this.classList.find(classData => classData.name === this.form.className)
if (classData) {
this.form.classId = Number(classData.id)
}
},
updateSubjectId() {
const subject = this.subjectList.find(subject => subject.name === this.form.subjectName)
if (subject) {
this.form.subjectId = Number(subject.id)
}
}
}
}
</script>
<style scoped>
.line{
text-align: center;
}
</style>

104
src/views/form/subject.vue Normal file
View File

@ -0,0 +1,104 @@
<template>
<div class="app-container">
<el-form ref="form" :model="form" label-width="120px">
<el-form-item label="科目名称">
<el-input v-model="form.name" style="width: 200px;" />
</el-form-item>
<el-form-item label="科目类型">
<el-select v-model="form.type" placeholder="选择类型">
<el-option label="必修" value="1" />
<el-option label="选修" value="2" />
</el-select>
</el-form-item>
<el-form-item label="学分">
<el-input v-model="form.credit" style="width: 200px;" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">提交</el-button>
<el-button @click="onCancel">取消</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
import { subjectInfo, subjectCreate, subjectUpdate } from '@/api/subject'
export default {
props: {
id: {
type: String,
required: false,
default: ''
}
},
data() {
return {
form: {
id: '',
name: '',
type: '',
credit: ''
}
}
},
created() {
if (this.id) {
const params = {
id: this.id
}
this.loading = true
subjectInfo(params).then(response => {
const { result } = response
const typeMapping = {
1: '必修',
2: '选修'
}
this.form = {
id: result.id,
name: result.name,
type: result.type,
credit: result.credit
}
this.form.type = typeMapping[result.type] || ''
this.loading = false
}).catch(() => {
this.loading = false
})
console.log('id is {}', this.id)
}
},
methods: {
onSubmit() {
this.loading = true
if (this.form.id) {
subjectUpdate(this.form).then(() => {
this.$message({
type: 'info',
message: '更新成功'
})
this.$router.push('/teacher/subject')
})
} else {
subjectCreate(this.form).then(() => {
this.$router.push('/teacher/subject')
this.loading = false
}).catch(() => {
this.loading = false
})
}
},
onCancel() {
this.$router.push('/teacher/subject')
}
}
}
</script>
<style scoped>
.line{
text-align: center;
}
</style>

View File

@ -3,7 +3,7 @@
<el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form" auto-complete="on" label-position="left">
<div class="title-container">
<h3 class="title">Login Form</h3>
<h3 class="title">管理系统</h3>
</div>
<el-form-item prop="username">
@ -12,10 +12,10 @@
</span>
<el-input
ref="username"
v-model="loginForm.username"
placeholder="Username"
name="username"
type="text"
v-model="loginForm.accountId"
placeholder="校园账户id"
name="账户ID"
type="number"
tabindex="1"
auto-complete="on"
/>
@ -30,7 +30,7 @@
ref="password"
v-model="loginForm.password"
:type="passwordType"
placeholder="Password"
placeholder="密码"
name="password"
tabindex="2"
auto-complete="on"
@ -53,20 +53,16 @@
</template>
<script>
import { validUsername } from '@/utils/validate'
// import { validUsername } from '@/utils/validate'
export default {
name: 'Login',
data() {
const validateUsername = (rule, value, callback) => {
if (!validUsername(value)) {
callback(new Error('Please enter the correct user name'))
} else {
callback()
}
callback()
}
const validatePassword = (rule, value, callback) => {
if (value.length < 6) {
if (value.length < 5) {
callback(new Error('The password can not be less than 6 digits'))
} else {
callback()
@ -74,8 +70,8 @@ export default {
}
return {
loginForm: {
username: 'admin',
password: '111111'
accountId: '1000',
password: 'admin'
},
loginRules: {
username: [{ required: true, trigger: 'blur', validator: validateUsername }],

206
src/views/score/index.vue Normal file
View File

@ -0,0 +1,206 @@
<template>
<div class="app-container">
<el-form label-width="120px">
<el-row class="filter-row" type="flex" justify="start">
<el-col :span="4">
<el-form-item label="学生账户">
<el-input v-model="filter.accountId" placeholder="请输入账户id" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="科目id">
<el-input v-model="filter.subjectId" placeholder="请输入科目id" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="班级id">
<el-input v-model="filter.classId" placeholder="请输入班级id" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="年份">
<el-input v-model="filter.year" placeholder="请输入年份" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="学期">
<el-input v-model="filter.term" placeholder="请输入学期" />
</el-form-item>
</el-col>
</el-row>
<el-row class="button-row" type="flex" justify="start">
<el-col :span="4">
<el-form-item>
<el-button type="primary" @click="onFilter">成绩查询</el-button>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item>
<el-button type="success" @click="handleAdd">成绩录入</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-table
v-loading="listLoading"
:data="list"
element-loading-text="Loading"
border
fit
highlight-current-row
style="width: 100%"
>
<el-table-column align="center" label="学生账户">
<template slot-scope="scope">
{{ scope.row.studentId }}
</template>
</el-table-column>
<el-table-column label="学生姓名">
<template slot-scope="scope">
{{ scope.row.studentName }}
</template>
</el-table-column>
<el-table-column label="班级id" align="center">
<template slot-scope="scope">
<span>{{ scope.row.classId }}</span>
</template>
</el-table-column>
<el-table-column label="科目" align="center">
<template slot-scope="scope">
<span>{{ scope.row.subjectName }}</span>
</template>
</el-table-column>
<el-table-column label="学年" align="center">
<template slot-scope="scope">
<span>{{ scope.row.year }}</span>
</template>
</el-table-column>
<el-table-column label="学期" align="center">
<template slot-scope="scope">
<span>{{ scope.row.term }}</span>
</template>
</el-table-column>
<el-table-column label="分数" align="center">
<template slot-scope="scope">
<span>{{ scope.row.score }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-button type="text" @click="handleEdit(scope.row)">修改</el-button>
<el-button type="text" @click="handleDelete(scope.row.id)">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
import { scoreList, scoreDelete } from '@/api/score'
export default {
filters: {
statusFilter(status) {
const statusMap = {
published: 'success',
draft: 'gray',
deleted: 'danger'
}
return statusMap[status]
}
},
data() {
return {
list: null,
listLoading: true,
filter: {
accountId: '',
subjectId: '',
classId: '',
year: '',
term: ''
}
}
},
created() {
this.fetchData()
},
methods: {
fetchData() {
this.listLoading = true
scoreList().then(response => {
this.list = response.result
this.listLoading = false
}).catch(() => {
this.listLoading = false
})
},
handleAdd() {
this.$router.push('/form/score')
},
handleEdit(classData) {
const idStr = String(classData.id)
this.$router.push({
path: '/form/score',
query: { id: idStr }
})
},
onFilter() {
this.listLoading = true
scoreList(this.filter).then(response => {
this.list = response.result
this.listLoading = false
}).catch(() => {
this.listLoading = false
})
},
handleDelete(id) {
this.$confirm('确认删除该班级吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
const data = {
id: id
}
scoreDelete(data).then(() => {
this.$message({
type: 'success',
message: '删除成功!'
})
this.fetchData()
}).catch(() => {
this.$message({
type: 'error',
message: '删除失败, 请重试!'
})
})
}).catch(() => {
this.$message({
type: 'info',
message: '已取消删除'
})
})
}
}
}
</script>
<style scoped>
.app-container {
padding: 20px;
}
.filter-row {
margin-bottom: 20px; /* 增加行间距 */
}
.el-form-item {
margin-bottom: 0; /* 移除表单项的底部间距 */
}
.button-row {
margin-top: 10px; /* 增加按钮与筛选区域的间距 */
margin-bottom: 10px;
}
.el-button {
margin-right: 10px; /* 增加按钮之间的间距 */
}
</style>

186
src/views/student/index.vue Normal file
View File

@ -0,0 +1,186 @@
<template>
<div class="app-container">
<el-form label-width="120px">
<el-row class="filter-row" type="flex" justify="start">
<el-col :span="8">
<el-form-item label="按 UID 筛选">
<el-input v-model="filter.uid" placeholder="请输入 UID" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="按班级筛选">
<el-input v-model="filter.classId" placeholder="请输入班级" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item>
<el-button type="primary" @click="onFilter">筛选</el-button>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item>
<el-button type="primary" @click="handleAdd">新增</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-table
v-loading="listLoading"
:data="list"
element-loading-text="Loading"
border
fit
highlight-current-row
style="width: 100%"
>
<el-table-column align="center" label="校园账户id">
<template slot-scope="scope">
{{ scope.row.userId }}
</template>
</el-table-column>
<el-table-column label="姓名" align="center">
<template slot-scope="scope">
{{ scope.row.username }}
</template>
</el-table-column>
<el-table-column label="班级" align="center">
<template slot-scope="scope">
<span>{{ scope.row.classId }}</span>
</template>
</el-table-column>
<el-table-column label="性别" align="center">
<template slot-scope="scope">
<span>{{ scope.row.gender }}</span>
</template>
</el-table-column>
<el-table-column label="出生日期" align="center">
<template slot-scope="scope">
<span>{{ scope.row.birthday }}</span>
</template>
</el-table-column>
<el-table-column label="联系方式" align="center">
<template slot-scope="scope">
<span>{{ scope.row.phone }}</span>
</template>
</el-table-column>
<el-table-column label="学院" align="center">
<template slot-scope="scope">
<span>{{ scope.row.college }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-button type="text" @click="handleEdit(scope.row.userId)">修改</el-button>
<el-button type="text" @click="handleDelete(scope.row.userId)">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
import { getList } from '@/api/table'
import { deleteUser } from '@/api/user'
export default {
filters: {
statusFilter(status) {
const statusMap = {
published: 'success',
draft: 'gray',
deleted: 'danger'
}
return statusMap[status]
}
},
data() {
return {
list: null,
listLoading: true,
filter: {
uid: '',
classId: ''
}
}
},
created() {
this.fetchData()
},
methods: {
fetchData() {
this.listLoading = true
getList().then(response => {
this.list = response.result
this.listLoading = false
}).catch(() => {
this.listLoading = false
})
},
handleAdd() {
this.$router.push('/form/index')
},
onFilter() {
this.listLoading = true
getList(this.filter).then(response => {
this.list = response.result
this.listLoading = false
}).catch(() => {
this.listLoading = false
})
},
handleEdit(userId) {
this.$router.push({
path: '/form/index',
query: { id: userId }
})
},
handleDelete(userId) {
this.$confirm('确认删除该账户吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
console.log(userId)
const param = {
id: parseInt(userId, 10)
}
console.log(param)
deleteUser(param).then(() => {
this.$message({
type: 'success',
message: '删除成功!'
})
this.fetchData()//
}).catch(() => {
this.$message({
type: 'error',
message: '删除失败, 请重试!'
})
})
}).catch(() => {
this.$message({
type: 'info',
message: '已取消删除'
})
})
}
}
}
</script>
<style scoped>
.app-container {
padding: 20px;
}
.button-container {
display: flex;
justify-content: flex-end; /* 使按钮靠右 */
margin-bottom: 10px; /* 按钮与表格之间的间距 */
}
.filter-row {
margin-bottom: 20px; /* 增加行间距 */
}
.el-form-item {
margin-bottom: 0; /* 移除表单项的底部间距 */
}
</style>

177
src/views/subject/index.vue Normal file
View File

@ -0,0 +1,177 @@
<template>
<div class="app-container">
<el-form label-width="120px">
<el-row class="filter-row" type="flex" justify="start">
<el-col :span="6">
<el-form-item label="科目id">
<el-input v-model="filter.id" placeholder="请输入科目id" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="科目名称">
<el-input v-model="filter.name" placeholder="请输入科目名称" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="类型">
<el-select v-model="filter.type" placeholder="选择类型" clearable>
<el-option label="必修" value="1" />
<el-option label="选修" value="2" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="4" offset="0">
<el-form-item>
<el-button type="primary" @click="onFilter">筛选</el-button>
</el-form-item>
</el-col>
<el-col :span="4" offset="0">
<el-form-item>
<el-button type="primary" @click="handleAdd">新增</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-table
v-loading="listLoading"
:data="list"
element-loading-text="Loading"
border
fit
highlight-current-row
style="width: 100%"
>
<el-table-column align="center" label="科目id">
<template slot-scope="scope">
{{ scope.row.id }}
</template>
</el-table-column>
<el-table-column label="科目名称">
<template slot-scope="scope">
{{ scope.row.name }}
</template>
</el-table-column>
<el-table-column label="科目类型" align="center">
<template slot-scope="scope">
<span>{{ scope.row.type == '1'? '必修' :'选修' }}</span>
</template>
</el-table-column>
<el-table-column label="学分" align="center">
<template slot-scope="scope">
<span>{{ scope.row.credit }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-button type="text" @click="handleEdit(scope.row)">修改</el-button>
<el-button type="text" @click="handleDelete(scope.row.id)">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
import { subjectList, subjectDelete } from '@/api/subject'
export default {
filters: {
statusFilter(status) {
const statusMap = {
published: 'success',
draft: 'gray',
deleted: 'danger'
}
return statusMap[status]
}
},
data() {
return {
list: null,
listLoading: true,
filter: {
id: '',
name: '',
type: ''
}
}
},
created() {
this.fetchData()
},
methods: {
fetchData() {
this.listLoading = true
subjectList().then(response => {
this.list = response.result
this.listLoading = false
}).catch(() => {
this.listLoading = false
})
},
handleAdd() {
this.$router.push('/form/subject')
},
handleEdit(classData) {
this.$router.push({
path: '/form/subject',
query: { id: classData.id }
})
},
onFilter() {
this.listLoading = true
subjectList(this.filter).then(response => {
this.list = response.result
this.listLoading = false
}).catch(() => {
this.listLoading = false
})
},
handleDelete(id) {
this.$confirm('确认删除该班级吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
const data = {
id: id
}
subjectDelete(data).then(() => {
this.$message({
type: 'success',
message: '删除成功!'
})
this.fetchData()
}).catch(() => {
this.$message({
type: 'error',
message: '删除失败, 请重试!'
})
})
}).catch(() => {
this.$message({
type: 'info',
message: '已取消删除'
})
})
}
}
}
</script>
<style scoped>
.app-container {
padding: 20px;
}
.button-container {
display: flex;
justify-content: flex-end; /* 使按钮靠右 */
margin-bottom: 10px; /* 按钮与表格之间的间距 */
}
.filter-row {
margin-bottom: 20px; /* 增加行间距 */
}
.el-form-item {
margin-bottom: 0; /* 移除表单项的底部间距 */
}
</style>

View File

@ -1,5 +1,29 @@
<template>
<div class="app-container">
<el-form label-width="120px">
<el-row class="filter-row" type="flex" justify="start">
<el-col :span="8">
<el-form-item label="按 UID 筛选">
<el-input v-model="filter.uid" placeholder="请输入 UID" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="按班级筛选">
<el-input v-model="filter.classId" placeholder="请输入班级" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item>
<el-button type="primary" @click="onFilter">筛选</el-button>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item>
<el-button type="primary" @click="handleAdd">新增</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-table
v-loading="listLoading"
:data="list"
@ -7,36 +31,41 @@
border
fit
highlight-current-row
style="width: 100%"
>
<el-table-column align="center" label="ID" width="95">
<el-table-column align="center" label="校园账户id">
<template slot-scope="scope">
{{ scope.$index }}
{{ scope.row.userId }}
</template>
</el-table-column>
<el-table-column label="Title">
<el-table-column label="姓名">
<template slot-scope="scope">
{{ scope.row.title }}
{{ scope.row.username }}
</template>
</el-table-column>
<el-table-column label="Author" width="110" align="center">
<el-table-column label="班级" align="center">
<template slot-scope="scope">
<span>{{ scope.row.author }}</span>
<span>{{ scope.row.classId }}</span>
</template>
</el-table-column>
<el-table-column label="Pageviews" width="110" align="center">
<el-table-column label="性别" align="center">
<template slot-scope="scope">
{{ scope.row.pageviews }}
<span>{{ scope.row.gender }}</span>
</template>
</el-table-column>
<el-table-column class-name="status-col" label="Status" width="110" align="center">
<el-table-column label="出生日期" align="center">
<template slot-scope="scope">
<el-tag :type="scope.row.status | statusFilter">{{ scope.row.status }}</el-tag>
<span>{{ scope.row.birthday }}</span>
</template>
</el-table-column>
<el-table-column align="center" prop="created_at" label="Display_time" width="200">
<el-table-column label="联系方式" align="center">
<template slot-scope="scope">
<i class="el-icon-time" />
<span>{{ scope.row.display_time }}</span>
<span>{{ scope.row.phone }}</span>
</template>
</el-table-column>
<el-table-column label="学院" align="center">
<template slot-scope="scope">
<span>{{ scope.row.college }}</span>
</template>
</el-table-column>
</el-table>
@ -60,7 +89,11 @@ export default {
data() {
return {
list: null,
listLoading: true
listLoading: true,
filter: {
uid: '',
classId: ''
}
}
},
created() {
@ -70,10 +103,38 @@ export default {
fetchData() {
this.listLoading = true
getList().then(response => {
this.list = response.data.items
this.list = response.result
this.listLoading = false
}).catch(() => {
this.listLoading = false
})
},
handleAdd() {
this.$router.push('/form/index')
},
onFilter() {
this.listLoading = true
getList(this.filter).then(response => {
this.list = response.result
this.listLoading = false
}).catch(() => {
this.listLoading = false
})
}
}
}
</script>
<style scoped>
.app-container {
padding: 20px;
}
.button-container {
display: flex;
justify-content: flex-end; /* 使按钮靠右 */
margin-bottom: 10px; /* 按钮与表格之间的间距 */
}
.filter-row {
margin-bottom: 20px; /* 为筛选功能与表格之间添加间距 */
}
</style>