diff --git a/src/api/classes.js b/src/api/classes.js new file mode 100644 index 0000000..c524afb --- /dev/null +++ b/src/api/classes.js @@ -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 + }) +} + diff --git a/src/api/score.js b/src/api/score.js new file mode 100644 index 0000000..b39a1b4 --- /dev/null +++ b/src/api/score.js @@ -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 + }) +} + diff --git a/src/api/subject.js b/src/api/subject.js new file mode 100644 index 0000000..97cef6e --- /dev/null +++ b/src/api/subject.js @@ -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 + }) +} diff --git a/src/api/table.js b/src/api/table.js index 2752f52..8a0d368 100644 --- a/src/api/table.js +++ b/src/api/table.js @@ -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 + }) +} diff --git a/src/api/user.js b/src/api/user.js index 8ff4389..1b2f2d9 100644 --- a/src/api/user.js +++ b/src/api/user.js @@ -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' }) } diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue index 0ca5cf6..4eb7cc1 100644 --- a/src/layout/components/Navbar.vue +++ b/src/layout/components/Navbar.vue @@ -16,12 +16,6 @@ Home - - Github - - - Docs - Log Out diff --git a/src/layout/components/Sidebar/Logo.vue b/src/layout/components/Sidebar/Logo.vue index 040fab6..e1aec33 100644 --- a/src/layout/components/Sidebar/Logo.vue +++ b/src/layout/components/Sidebar/Logo.vue @@ -24,7 +24,7 @@ export default { }, data() { return { - title: 'Vue Admin Template', + title: '成绩管理系统', logo: 'https://wpimg.wallstcn.com/69a1c46c-eb1c-4b46-8bd4-e9e686ef5251.png' } } diff --git a/src/router/index.js b/src/router/index.js index 13459e9..4635882 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -51,114 +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'), - name: 'Menu2', - 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 } diff --git a/src/settings.js b/src/settings.js index ae3c494..74f267a 100644 --- a/src/settings.js +++ b/src/settings.js @@ -1,6 +1,6 @@ module.exports = { - title: 'Vue Admin Template', + title: '学生成绩管理系统', /** * @type {boolean} true | false diff --git a/src/store/modules/user.js b/src/store/modules/user.js index 2f6423f..a48ea75 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -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) { + 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() }) }, diff --git a/src/utils/get-page-title.js b/src/utils/get-page-title.js index a6de99d..4bc2631 100644 --- a/src/utils/get-page-title.js +++ b/src/utils/get-page-title.js @@ -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) { diff --git a/src/utils/request.js b/src/utils/request.js index 2fb95ac..610251b 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -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', diff --git a/src/utils/validate.js b/src/utils/validate.js index 8d962ad..8bfc4b4 100644 --- a/src/utils/validate.js +++ b/src/utils/validate.js @@ -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 -} diff --git a/src/views/class/index.vue b/src/views/class/index.vue new file mode 100644 index 0000000..6903efa --- /dev/null +++ b/src/views/class/index.vue @@ -0,0 +1,185 @@ + + + + + diff --git a/src/views/form/class.vue b/src/views/form/class.vue new file mode 100644 index 0000000..8f3b6a3 --- /dev/null +++ b/src/views/form/class.vue @@ -0,0 +1,126 @@ + + + + + + diff --git a/src/views/form/index.vue b/src/views/form/index.vue index f4d66d3..8f212ef 100644 --- a/src/views/form/index.vue +++ b/src/views/form/index.vue @@ -1,77 +1,111 @@ + + + diff --git a/src/views/form/subject.vue b/src/views/form/subject.vue new file mode 100644 index 0000000..039a22f --- /dev/null +++ b/src/views/form/subject.vue @@ -0,0 +1,104 @@ + + + + + + diff --git a/src/views/login/index.vue b/src/views/login/index.vue index 1db2464..af132af 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -3,7 +3,7 @@
-

Login Form

+

管理系统

@@ -12,10 +12,10 @@ @@ -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 @@ + + diff --git a/src/views/student/index.vue b/src/views/student/index.vue new file mode 100644 index 0000000..60af474 --- /dev/null +++ b/src/views/student/index.vue @@ -0,0 +1,186 @@ + + + + + diff --git a/src/views/subject/index.vue b/src/views/subject/index.vue new file mode 100644 index 0000000..4487f88 --- /dev/null +++ b/src/views/subject/index.vue @@ -0,0 +1,177 @@ + + + + + diff --git a/src/views/table/index.vue b/src/views/table/index.vue index a1ed847..8c50233 100644 --- a/src/views/table/index.vue +++ b/src/views/table/index.vue @@ -1,5 +1,29 @@