diff --git a/package-lock.json b/package-lock.json index 99caccc62d24546044e1ebdc9e07a23de27f6b9b..c9402018437b912a4218be7232ad50431da217bc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "core-js": "^3.8.3", "element-ui": "^2.15.13", + "v-fit-columns": "^0.2.0", "vue": "^2.6.14", "vue-router": "^3.5.1" }, @@ -11536,6 +11537,11 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/v-fit-columns": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/v-fit-columns/-/v-fit-columns-0.2.0.tgz", + "integrity": "sha512-xR0jIFmTyJeg4VZgEx7z8BIijZnHQegtbwAhG3L3TmyAoq/TXk7H6vzFLNxAVzOj9pSpO/0B2mf7jmuO2nE4Ag==" + }, "node_modules/v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", @@ -21728,6 +21734,11 @@ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true }, + "v-fit-columns": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/v-fit-columns/-/v-fit-columns-0.2.0.tgz", + "integrity": "sha512-xR0jIFmTyJeg4VZgEx7z8BIijZnHQegtbwAhG3L3TmyAoq/TXk7H6vzFLNxAVzOj9pSpO/0B2mf7jmuO2nE4Ag==" + }, "v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", diff --git a/src/App.vue b/src/App.vue index 333c741ab234886ad0d9f354bf08d0645e064eee..9226f08d28590cd2aa4313cab07442bd6b06c287 100644 --- a/src/App.vue +++ b/src/App.vue @@ -5,6 +5,7 @@ diff --git a/src/layout/BreadCrumb.vue b/src/layout/BreadCrumb.vue new file mode 100644 index 0000000000000000000000000000000000000000..f3e5b5942fe7347d2506b35c87ec946eeae22c7e --- /dev/null +++ b/src/layout/BreadCrumb.vue @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/src/layout/Footer.vue b/src/layout/Footer.vue new file mode 100644 index 0000000000000000000000000000000000000000..cd7c1351d4a9d9aa65bc9649f69a378970e579aa --- /dev/null +++ b/src/layout/Footer.vue @@ -0,0 +1,17 @@ + + + + + \ No newline at end of file diff --git a/src/layout/Header.vue b/src/layout/Header.vue new file mode 100644 index 0000000000000000000000000000000000000000..6821503466f9d156c50e5144d4cb469b6d133407 --- /dev/null +++ b/src/layout/Header.vue @@ -0,0 +1,33 @@ + + + + + \ No newline at end of file diff --git a/src/layout/Menu.vue b/src/layout/Menu.vue new file mode 100644 index 0000000000000000000000000000000000000000..2d2fd8ef174816629667c541223c66d2f73eae6a --- /dev/null +++ b/src/layout/Menu.vue @@ -0,0 +1,58 @@ + + + + + \ No newline at end of file diff --git a/src/layout/index.vue b/src/layout/index.vue index 60a7b97ef43a7670ccff0766c625e80e2d210065..5e1685893dbe879300f24ec69165df9a20dd7a08 100644 --- a/src/layout/index.vue +++ b/src/layout/index.vue @@ -1,97 +1,40 @@ - +import Menu from '@/layout/Menu' +import Header from '@/layout/Header' +import Footer from '@/layout/Footer' +import BreadCrumb from '@/layout/BreadCrumb' - \ No newline at end of file diff --git a/src/router/index.js b/src/router/index.js index 5e70d104ed1173b5bd7cc1688c4b358aab714ca8..9f1a632ebe35639ffead156cd36c0204e40b3c07 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -1,115 +1,104 @@ -import Vue from "vue"; -import VueRouter from "vue-router"; -import Layout from '@/layout' +import Vue from "vue" +import Router from "vue-router" -Vue.use(VueRouter); +Vue.use(Router); const routes = [ { - path: '', - component: Layout, + path: '/', + redirect: '/student', + hidden: true + }, + { + path: '/student', + name: '学生页面', icon: 'el-icon-edit', + component: () => import('@/layout'), + redirect: '/student/report', children: [ { - path: '/', - component: () => - import(/* webpackChunkName: "home" */ "@/views/HomeView.vue"), - name: 'home' - }, - { - path: "/about", - name: "about", - // route level code-splitting - // this generates a separate chunk (about.[hash].js) for this route - // which is lazy-loaded when the route is visited. - component: () => - import(/* webpackChunkName: "about" */ "@/views/AboutView.vue"), - }, - // yudingyi - { - path: "/science_admin", - name: "science_admin", - component: () => - import(/* webpackChunkName: "sciAdmin" */ "@/views/ScienceAdminView.vue"), - }, - { - path: "/student_manage", - name: "student_manage", - component: () => - import(/* webpackChunkName: "stuManage" */ "@/views/StudentManage.vue"), - }, - // wanglingyu + path: '/student/report', + name: '在线填报', + component: () => import('@/views/ReportView') + } + ] + }, + { + path: '/judge', + name: '评委页面', icon: 'el-icon-paperclip', + component: () => import('@/layout'), + redirect: '/judge/gpa-eval', + children: [ { - path: "/gpa", - name: "gpa", - component: () => - import(/* webpackChunkName: "gpa" */ "@/views/GpaView.vue"), + path: '/judge/gpa-eval', + name: '学生成绩审核', + component: () => import('@/views/evals/GpaEvalView') }, { - path: "/gpa-eval", - name: "gpa-eval", - component: () => - import(/* webpackChunkName: "gpa-eval" */ "@/views/GpaEvalView.vue"), + path: '/judge/summary-eval', + name: '个人学年总结评审', + component: () => import('@/views/evals/SummaryEvalView') }, { - path: "/stu-import", - name: "stu-import", - component: () => - import(/* webpackChunkName: "stu-import" */ "@/views/ImportStuView.vue"), + path: '/judge/volunteer-eval', + name: '志愿服务评审', + component: () => import('@/views/evals/VolunteerEvalView') }, - // wuqile { - path: "/competition_admin", - name: "competition", - component: () => - import(/* webpackChunkName: "competition_admin" */ "@/views/competition_admin.vue"), + path: '/judge/research-eval', + name: '科研情况评审', + component: () => import('@/views/evals/ResearchEvalView') }, { - path: "/student_service", - name: "student_service", - component: () => - import(/* webpackChunkName: "student_service" */ "@/views/student_service.vue"), + path: '/judge/service-eval', + name: '学生服务岗位评审', + component: () => import('@/views/evals/ServiceEvalView') }, - // wangdy { - path: "/summary", - name: "summary", - component: () => - import(/* webpackChunkName: "summary" */ "@/views/SummaryView.vue"), + path: '/judge/competition-eval', + name: '竞赛得奖评审', + component: () => import('@/views/evals/CompetitionEvalView') }, { - path: "/personalSum", - name: "personalSum", - component: () => - import(/* webpackChunkName: "personalSum" */ "@/views/PersonalSumView.vue"), - }, - // mxh + path: '/judge/practice-eval', + name: '社会实践评审', + component: () => import('@/views/evals/PracticeEvalView') + } + ] + }, + { + path: '/admin', + name: '学工页面', icon: 'el-icon-s-check', + component: () => import('@/layout'), + redirect: '/admin/import', + children: [ { - path: "/social_practice", - name: "social_practice", - component: () => - import(/* webpackChunkName: "social_practice" */ "@/views/social_practice.vue"), + path: '/admin/import', + name: '导入学生名单', + component: () => import('@/views/admins/ImportListView') }, { - path: "/Volunteer_service", - name: "Volunteer_service", - component: () => - import(/* webpackChunkName: "Volunteer_service" */ "@/views/Volunteer_service.vue"), + path: '/admin/collect', + name: '成绩汇总', + component: () => import('@/views/admins/CollectResultView') }, - // 学生在线填报 { - path: "/report", - name: "report", - component: () => - import(/* webpackChunkName: "report" */ "@/views/ReportView.vue"), - }, + path: '/admin/output', + name: '成绩导出', + component: () => import('@/views/admins/OutputView') + } ] }, + { + path: '*', + name: '404', + component: res => require(['@/views/NotFoundView'], res), // 异步加载 + hidden: true + } ]; -const router = new VueRouter({ +const router = new Router({ mode: "history", - base: process.env.BASE_URL, - routes, + routes }); export default router; diff --git a/src/utils/service.js b/src/utils/service.js new file mode 100644 index 0000000000000000000000000000000000000000..8b36ae66f58ea8b9f5db93e9ad67076d08bdc35b --- /dev/null +++ b/src/utils/service.js @@ -0,0 +1,31 @@ +import axios from 'axios' +import { getToken } from '@/utils/token' +import { Message } from 'element-ui' + +const service = axios.create({ + baseURL: '/api', // baseURL 会自动加在每次请求的最前面,然后被 vue.config.js 解析 + timeout: 3000 +}) + +// 请求拦截器 +service.interceptors.request.use(config => { + // 发送请求的前置操作(如添加 token) + config.headers['token'] = getToken('token') + return config +}, error => { + return Promise.reject(error) +}) + +// 响应拦截器 +service.interceptors.response.use(res => { + // 收到响应的后置操作 + let { status, message } = res.data + if (status !== 200) { + Message({ message: message || 'error', type: 'warning' }) + } + return res +}, error => { + return Promise.reject(error) +}) + +export default service \ No newline at end of file diff --git a/src/utils/token.js b/src/utils/token.js new file mode 100644 index 0000000000000000000000000000000000000000..16b5d52fea6527e74453c0bae0252dc85b5f3ea0 --- /dev/null +++ b/src/utils/token.js @@ -0,0 +1,11 @@ +export function setToken(tokenKey, token) { + return localStorage.setItem(tokenKey, token); +} + +export function getToken(tokenKey) { + return localStorage.getItem(tokenKey); +} + +export function removeToken(tokenKey) { + return localStorage.removeItem(tokenKey); +} diff --git a/src/utils/validate.js b/src/utils/validate.js new file mode 100644 index 0000000000000000000000000000000000000000..48e573b7f0bec1ea335bd59214fdfde16df2472b --- /dev/null +++ b/src/utils/validate.js @@ -0,0 +1,22 @@ +// 用户名匹配 +export function nameRule(rule, value, callback) { + let reg = /^[a-zA-Z0-9]{4,10}$/ + if (value === '') { + callback(new Error('请输入用户名')) + } else if (!reg.test(value)) { + callback(new Error('请输入4-10位用户名')) + } else { + callback() + } +} +// 密码正则匹配 +export function pwdRule(rule, value, callback) { + let reg = /^[^\s]{6,12}$/ + if (value === '') { + callback(new Error('请输入密码')) + } else if (!reg.test(value)) { + callback(new Error('请输入6-12位密码')) + } else { + callback() + } +} diff --git a/src/views/AboutView.vue b/src/views/AboutView.vue deleted file mode 100644 index 3fa28070de24f2055171ca2e20543881cb7fdf1c..0000000000000000000000000000000000000000 --- a/src/views/AboutView.vue +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue deleted file mode 100644 index 318e3977411ca1d35805a0851336d011900fa8f5..0000000000000000000000000000000000000000 --- a/src/views/HomeView.vue +++ /dev/null @@ -1,18 +0,0 @@ - - - diff --git a/src/views/NotFoundView.vue b/src/views/NotFoundView.vue new file mode 100644 index 0000000000000000000000000000000000000000..6c690133ab98a5b1b975cc306bdcfb29b976e508 --- /dev/null +++ b/src/views/NotFoundView.vue @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/src/views/ReportView.vue b/src/views/ReportView.vue index 4afc634ff237562db2258522d04744dce9d810ec..a14b1ae2c842a6523ee3492e7db852e12945348f 100644 --- a/src/views/ReportView.vue +++ b/src/views/ReportView.vue @@ -1,3 +1,4 @@ +