From 5066865682c9abc9bbe0d498aacb8a23308760ff Mon Sep 17 00:00:00 2001
From: zhangwei <1094660626@qq.com>
Date: Sun, 20 Jan 2019 15:36:26 +0800
Subject: [PATCH] data
---
src/App.vue | 8 +-
src/api/article.js | 22 +-
src/api/grade.js | 49 +++++
src/api/group.js | 50 +++++
src/api/login.js | 15 +-
src/api/user.js | 222 +++++++++++++++++++
src/assets/iconfont/iconfont.css | 88 ++++++++
src/assets/iconfont/iconfont.eot | Bin 0 -> 11300 bytes
src/assets/iconfont/iconfont.js | 1 +
src/assets/iconfont/iconfont.svg | 122 +++++++++++
src/assets/iconfont/iconfont.ttf | Bin 0 -> 11132 bytes
src/assets/iconfont/iconfont.woff | Bin 0 -> 7528 bytes
src/lang/en.js | 2 +
src/lang/index.js | 2 +-
src/lang/zh.js | 74 ++++++-
src/main.js | 6 +
src/mock/article.js | 1 +
src/mock/grade.js | 43 ++++
src/mock/index.js | 17 +-
src/mock/login.js | 61 +++---
src/permission.js | 8 +-
src/router/index.js | 351 ++++++++++++++----------------
src/router/modules/components.js | 8 +-
src/store/getters.js | 5 +-
src/store/modules/app.js | 2 +-
src/store/modules/permission.js | 4 +-
src/store/modules/user.js | 57 +++--
src/styles/index.scss | 44 ++++
src/styles/schedule.css | 145 ++++++++++++
src/styles/sidebar.scss | 1 +
src/styles/variables.scss | 2 +-
src/utils/index.js | 166 +++++++++++++-
src/utils/request.js | 81 ++++---
src/utils/validate.js | 10 +-
34 files changed, 1366 insertions(+), 301 deletions(-)
create mode 100644 src/api/grade.js
create mode 100644 src/api/group.js
create mode 100644 src/api/user.js
create mode 100644 src/assets/iconfont/iconfont.css
create mode 100644 src/assets/iconfont/iconfont.eot
create mode 100644 src/assets/iconfont/iconfont.js
create mode 100644 src/assets/iconfont/iconfont.svg
create mode 100644 src/assets/iconfont/iconfont.ttf
create mode 100644 src/assets/iconfont/iconfont.woff
create mode 100644 src/mock/grade.js
create mode 100644 src/styles/schedule.css
diff --git a/src/App.vue b/src/App.vue
index ab408f3e..641109a2 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -6,6 +6,12 @@
diff --git a/src/api/article.js b/src/api/article.js
index f54b8af6..e9dadba1 100644
--- a/src/api/article.js
+++ b/src/api/article.js
@@ -2,7 +2,7 @@ import request from '@/utils/request'
export function fetchList(query) {
return request({
- url: '/article/list',
+ url: '/ueditor/list',
method: 'get',
params: query
})
@@ -10,9 +10,8 @@ export function fetchList(query) {
export function fetchArticle(id) {
return request({
- url: '/article/detail',
- method: 'get',
- params: { id }
+ url: '/ueditor/detail/' + id,
+ method: 'get'
})
}
@@ -39,3 +38,18 @@ export function updateArticle(data) {
data
})
}
+
+export function saveArticle(data) {
+ return request({
+ url: '/ueditor/save',
+ method: 'post',
+ data
+ })
+}
+
+export function deleteArticle(id) {
+ return request({
+ url: '/ueditor/del/' + id,
+ method: 'get'
+ })
+}
diff --git a/src/api/grade.js b/src/api/grade.js
new file mode 100644
index 00000000..bd5040fe
--- /dev/null
+++ b/src/api/grade.js
@@ -0,0 +1,49 @@
+import request from '@/utils/request'
+
+// 获取组List信息
+export function fetchList(query) {
+ return request({
+ url: '/grade/list',
+ method: 'get',
+ params: query
+ })
+}
+
+export function getClassList(query) {
+ return request({
+ url: '/class/list',
+ method: 'get',
+ params: query
+ })
+}
+
+export function fetchStuList(listQuery) {
+ return request({
+ url: '/stu/' + listQuery.type,
+ method: 'get'
+ })
+}
+
+export function fetchPv(pv) {
+ return request({
+ url: '/article/pv',
+ method: 'get',
+ params: { pv }
+ })
+}
+
+export function createArticle(data) {
+ return request({
+ url: '/article/create',
+ method: 'post',
+ data
+ })
+}
+
+export function updateArticle(data) {
+ return request({
+ url: '/article/update',
+ method: 'post',
+ data
+ })
+}
diff --git a/src/api/group.js b/src/api/group.js
new file mode 100644
index 00000000..cc2f5189
--- /dev/null
+++ b/src/api/group.js
@@ -0,0 +1,50 @@
+import request from '@/utils/request'
+
+// 获取组List信息
+export function fetchGroupList(query) {
+ return request({
+ url: '/group/list',
+ method: 'get',
+ params: query
+ })
+}
+
+export function fetchMemberList(id) {
+ return request({
+ url: '/group/getMembers',
+ method: 'get',
+ params: { id }
+ })
+}
+
+export function fetchPv(pv) {
+ return request({
+ url: '/article/pv',
+ method: 'get',
+ params: { pv }
+ })
+}
+
+export function createArticle(data) {
+ return request({
+ url: '/article/create',
+ method: 'post',
+ data
+ })
+}
+
+export function updateArticle(data) {
+ return request({
+ url: '/group/addGroup',
+ method: 'post',
+ data
+ })
+}
+
+export function deleteGroup(id) {
+ return request({
+ url: '/group/delete',
+ method: 'get',
+ params: { id }
+ })
+}
diff --git a/src/api/login.js b/src/api/login.js
index a64935c3..cbdf25bd 100644
--- a/src/api/login.js
+++ b/src/api/login.js
@@ -1,21 +1,22 @@
import request from '@/utils/request'
-export function loginByUsername(username, password) {
+export function loginByUsername(username, password, fid) {
const data = {
username,
- password
+ password,
+ fid
}
return request({
- url: '/login/login',
- method: 'post',
- data
+ url: '/user/login',
+ method: 'get',
+ params: data
})
}
export function logout() {
return request({
- url: '/login/logout',
- method: 'post'
+ url: '/user/logout',
+ method: 'get'
})
}
diff --git a/src/api/user.js b/src/api/user.js
new file mode 100644
index 00000000..10f1c4a4
--- /dev/null
+++ b/src/api/user.js
@@ -0,0 +1,222 @@
+import request from '@/utils/request'
+
+export function fetchTeacherList(query) {
+ return request({
+ url: '/teacher/list',
+ method: 'get',
+ params: query
+ })
+}
+
+export function fetchStuList(query) {
+ return request({
+ url: '/student/list',
+ method: 'get',
+ params: query
+ })
+}
+
+export function fetchGroupList(query) {
+ return request({
+ url: '/group/list',
+ method: 'get',
+ params: query
+ })
+}
+
+export function updateTeacher(data) {
+ return request({
+ url: '/teacher/update',
+ method: 'post',
+ data
+ })
+}
+
+export function deleteTeacher(query) {
+ return request({
+ url: '/teacher/delete',
+ method: 'get',
+ params: query
+ })
+}
+
+export function fetchList(query) {
+ return request({
+ url: '/user/list',
+ method: 'get',
+ params: query
+ })
+}
+
+export function fetchArticle(id) {
+ return request({
+ url: '/article/detail',
+ method: 'get',
+ params: { id }
+ })
+}
+
+export function fetchPv(pv) {
+ return request({
+ url: '/article/pv',
+ method: 'get',
+ params: { pv }
+ })
+}
+
+export function createStudent(data) {
+ return request({
+ url: '/student/update',
+ method: 'post',
+ data
+ })
+}
+
+export function saveArticle(data) {
+ return request({
+ url: '/ueditor/save',
+ method: 'post',
+ data
+ })
+}
+
+export function fetchGradeList(query) {
+ return request({
+ url: '/grade/list',
+ method: 'get',
+ params: query
+ })
+}
+
+export function fetchClassList(query) {
+ return request({
+ url: '/class/list',
+ method: 'get',
+ params: query
+ })
+}
+
+export function updateStudent(data) {
+ return request({
+ url: '/student/update',
+ method: 'post',
+ data
+ })
+}
+
+export function updateGrade(data) {
+ return request({
+ url: '/grade/update',
+ method: 'post',
+ data
+ })
+}
+
+export function fetchUploadUserList(query) {
+ return request({
+ url: '/ueditor/getUploadUserList',
+ method: 'get',
+ params: query
+ })
+}
+
+export function downloadFile(url, name) {
+ var data = window.UEDITOR_HOME_URL + 'ueditor/download?url=' + url + '&name=' + name
+ window.location.href = data
+}
+
+export function downloadZip(articleId, name) {
+ var data = window.UEDITOR_HOME_URL + 'ueditor/downloadZip?articleId=' + articleId + '&name=' + name
+ window.location.href = data
+}
+
+export function deleteAttachment(query) {
+ return request({
+ url: '/ueditor/deleteAttachment',
+ method: 'get',
+ params: query
+ })
+}
+
+export function fetchCourseList(query) {
+ return request({
+ url: '/course/list',
+ method: 'get',
+ params: query
+ })
+}
+
+export function deleteStudent(data) {
+ return request({
+ url: '/student/del',
+ method: 'post',
+ data
+ })
+}
+
+// 删除年级
+export function deleteGrade(id) {
+ return request({
+ url: '/grade/del/' + id,
+ method: 'get'
+ })
+}
+
+export function fetchScheduleList(query) {
+ return request({
+ url: '/course/schedule',
+ method: 'get',
+ params: query
+ })
+}
+
+export function fetchCourseByClassId(classId) {
+ return request({
+ url: '/course/' + classId,
+ method: 'get'
+ })
+}
+
+export function updateSchedule(data) {
+ return request({
+ url: '/course/update',
+ method: 'post',
+ data
+ })
+}
+
+// 根据fid,获取xy_school学校表信息
+export function fetchSchool(query) {
+ return request({
+ url: '/system/school',
+ method: 'get',
+ params: query
+ })
+}
+
+// 更新学校消息
+export function updateSchool(data) {
+ return request({
+ url: '/system/update',
+ method: 'post',
+ data
+ })
+}
+
+// 获取微信模板列表
+export function fetchTemplateList(query) {
+ return request({
+ url: '/system/templateList',
+ method: 'get',
+ params: query
+ })
+}
+
+// 为班级添加课程
+export function addCourseClass(data) {
+ return request({
+ url: '/teacher/addCourseClass',
+ method: 'post',
+ data
+ })
+}
diff --git a/src/assets/iconfont/iconfont.css b/src/assets/iconfont/iconfont.css
new file mode 100644
index 00000000..5fc771f7
--- /dev/null
+++ b/src/assets/iconfont/iconfont.css
@@ -0,0 +1,88 @@
+
+@font-face {font-family: "iconfont";
+ src: url('iconfont.eot?t=1542515120946'); /* IE9*/
+ src: url('iconfont.eot?t=1542515120946#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'),
+ url('iconfont.ttf?t=1542515120946') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
+ url('iconfont.svg?t=1542515120946#iconfont') format('svg'); /* iOS 4.1- */
+}
+
+.iconfont {
+ font-family:"iconfont" !important;
+ font-size:19px;
+ font-style:normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.icon {
+ width: 1.2em; height: 1.2em;
+ vertical-align: -0.15em;
+ fill: currentColor;
+ overflow: hidden;
+}
+
+.icon-icon:before { content: "\e656"; }
+
+.icon-zan:before { content: "\e600"; }
+
+.icon-weixin:before { content: "\e73b"; }
+
+.icon-QQ:before { content: "\e73e"; }
+
+.icon-gerenxinxiyebanzhurenlaoshi:before { content: "\e65d"; }
+
+.icon-pingjiabaogao:before { content: "\e611"; }
+
+.icon-gonggao:before { content: "\e61b"; }
+
+.icon-gerenzhongxin_banzhulaoshi:before { content: "\e69e"; }
+
+.icon-gerenxinxi_laoshidianhua:before { content: "\e69f"; }
+
+.icon-fanhui:before { content: "\e624"; }
+
+.icon-shuoming:before { content: "\e628"; }
+
+.icon-jiantoushang:before { content: "\e62c"; }
+
+.icon-jiantoushang1:before { content: "\e62d"; }
+
+.icon-jiantouyou:before { content: "\e62e"; }
+
+.icon-jiantouxia:before { content: "\e62f"; }
+
+.icon-saoyisao:before { content: "\e630"; }
+
+.icon-wode:before { content: "\e631"; }
+
+.icon-shouye:before { content: "\e632"; }
+
+.icon-xiaoxi:before { content: "\e633"; }
+
+.icon-sousuo:before { content: "\e634"; }
+
+.icon-laoshiguanli:before { content: "\e69d"; }
+
+.icon-pingjia:before { content: "\e641"; }
+
+.icon-huanyihuan:before { content: "\e653"; }
+
+.icon-tongzhi:before { content: "\e7a1"; }
+
+.icon-zan1:before { content: "\e76c"; }
+
+.icon-nvlaoshi:before { content: "\e610"; }
+
+.icon-nanlaoshi:before { content: "\e612"; }
+
+.icon-daohangdizhi:before { content: "\e65e"; }
+
+.icon-gongzuobaogao:before { content: "\e635"; }
+
+.icon-jiarushujia:before { content: "\e60f"; }
+
+.icon-gonggao1:before { content: "\e670"; }
+
+.icon-baogaoxiazai:before { content: "\e705"; }
+
diff --git a/src/assets/iconfont/iconfont.eot b/src/assets/iconfont/iconfont.eot
new file mode 100644
index 0000000000000000000000000000000000000000..58c75a4e734fe7e9f72975310299b0801bd28637
GIT binary patch
literal 11300
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
H91{H>KjNT{
literal 0
HcmV?d00001
diff --git a/src/assets/iconfont/iconfont.js b/src/assets/iconfont/iconfont.js
new file mode 100644
index 00000000..f6448cef
--- /dev/null
+++ b/src/assets/iconfont/iconfont.js
@@ -0,0 +1 @@
+(function(window){var svgSprite='';var script=function(){var scripts=document.getElementsByTagName("script");return scripts[scripts.length-1]}();var shouldInjectCss=script.getAttribute("data-injectcss");var ready=function(fn){if(document.addEventListener){if(~["complete","loaded","interactive"].indexOf(document.readyState)){setTimeout(fn,0)}else{var loadFn=function(){document.removeEventListener("DOMContentLoaded",loadFn,false);fn()};document.addEventListener("DOMContentLoaded",loadFn,false)}}else if(document.attachEvent){IEContentLoaded(window,fn)}function IEContentLoaded(w,fn){var d=w.document,done=false,init=function(){if(!done){done=true;fn()}};var polling=function(){try{d.documentElement.doScroll("left")}catch(e){setTimeout(polling,50);return}init()};polling();d.onreadystatechange=function(){if(d.readyState=="complete"){d.onreadystatechange=null;init()}}}};var before=function(el,target){target.parentNode.insertBefore(el,target)};var prepend=function(el,target){if(target.firstChild){before(el,target.firstChild)}else{target.appendChild(el)}};function appendSvg(){var div,svg;div=document.createElement("div");div.innerHTML=svgSprite;svgSprite=null;svg=div.getElementsByTagName("svg")[0];if(svg){svg.setAttribute("aria-hidden","true");svg.style.position="absolute";svg.style.width=0;svg.style.height=0;svg.style.overflow="hidden";prepend(svg,document.body)}}if(shouldInjectCss&&!window.__iconfont__svg__cssinject__){window.__iconfont__svg__cssinject__=true;try{document.write("")}catch(e){console&&console.log(e)}}ready(appendSvg)})(window)
\ No newline at end of file
diff --git a/src/assets/iconfont/iconfont.svg b/src/assets/iconfont/iconfont.svg
new file mode 100644
index 00000000..90bf5463
--- /dev/null
+++ b/src/assets/iconfont/iconfont.svg
@@ -0,0 +1,122 @@
+
+
+
+
diff --git a/src/assets/iconfont/iconfont.ttf b/src/assets/iconfont/iconfont.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..b9251ea96a99923ceea4965f3b18bb676e480a05
GIT binary patch
literal 11132
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 h(App)
})
+window.UEDITOR_HOME_URL = process.env.BASE_API + '/'
diff --git a/src/mock/article.js b/src/mock/article.js
index 45923ddd..11a4bcbe 100644
--- a/src/mock/article.js
+++ b/src/mock/article.js
@@ -13,6 +13,7 @@ for (let i = 0; i < count; i++) {
timestamp: +Mock.Random.date('T'),
author: '@first',
reviewer: '@first',
+ fileList: [],
title: '@title(5, 10)',
content_short: '我是测试数据',
content: baseContent,
diff --git a/src/mock/grade.js b/src/mock/grade.js
new file mode 100644
index 00000000..9f870a99
--- /dev/null
+++ b/src/mock/grade.js
@@ -0,0 +1,43 @@
+import Mock from 'mockjs'
+
+const List = []
+const count = 3
+const Random = Mock.Random
+for (let i = 0; i < count; i++) {
+ List.push(Mock.mock({
+ id: '@id',
+ timestamp: +Mock.Random.date('T'),
+ name1: Random.ctitle(2, 4), // 班级名称
+ school: Random.ctitle(2, 4) + '小学', // 所在学校
+ name: Random.date('yyyy') + '级' + Random.integer(1, 20) + '班'// 年级+班级
+ }))
+}
+
+const stuList = []
+for (let i = 0; i < 40; i++) {
+ stuList.push(Mock.mock({
+ id: '@id',
+ timestamp: +Mock.Random.date('T'),
+ name: '@cname', // 名字
+ city: '@city',
+ address: '@province' + '@city' + '@county',
+ tel: /^1[385][1-9]\d{8}/,
+ school: Random.ctitle(2, 4) + '小学', // 所在学校
+ grade: Random.date('yyyy') + '级' + Random.integer(1, 20) + '班'// 年级+班级
+ }))
+}
+
+export default {
+ getClassList: () => {
+ return {
+ total: List.length,
+ result: List
+ }
+ },
+ fetchStuList: () => {
+ return {
+ total: stuList.length,
+ result: stuList
+ }
+ }
+}
diff --git a/src/mock/index.js b/src/mock/index.js
index 3e00e918..011bda21 100644
--- a/src/mock/index.js
+++ b/src/mock/index.js
@@ -1,15 +1,16 @@
import Mock from 'mockjs'
import loginAPI from './login'
import articleAPI from './article'
+import grade from './grade'
import remoteSearchAPI from './remoteSearch'
import transactionAPI from './transaction'
-// 修复在使用 MockJS 情况下,设置 withCredentials = true,且未被拦截的跨域请求丢失 Cookies 的问题
-// https://github.com/nuysoft/Mock/issues/300
+// * 修复 Mock 情况下,设置 withCredentials = true,且未被拦截的跨域请求丢失 Cookies 的问题。
+// 请求中丢失session,导致每次请求sessionId不同
Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send
Mock.XHR.prototype.send = function() {
if (this.custom.xhr) {
- this.custom.xhr.withCredentials = this.withCredentials || false
+ this.custom.xhr.withCredentials = this.withCredentials || true
}
this.proxy_send(...arguments)
}
@@ -19,9 +20,9 @@ Mock.XHR.prototype.send = function() {
// })
// 登录相关
-Mock.mock(/\/login\/login/, 'post', loginAPI.loginByUsername)
+// Mock.mock(/\/user\/login/, 'post', loginAPI.loginByUsername)
Mock.mock(/\/login\/logout/, 'post', loginAPI.logout)
-Mock.mock(/\/user\/info\.*/, 'get', loginAPI.getUserInfo)
+// Mock.mock(/\/user\/info\.*/, 'get', loginAPI.getUserInfo)
// 文章相关
Mock.mock(/\/article\/list/, 'get', articleAPI.getList)
@@ -36,4 +37,10 @@ Mock.mock(/\/search\/user/, 'get', remoteSearchAPI.searchUser)
// 账单相关
Mock.mock(/\/transaction\/list/, 'get', transactionAPI.getList)
+// 根据uid获取对应班级列表。学生有一个班级,老师有多个
+// Mock.mock(/\/class\/list/, 'get', grade.classList)
+// 根据uid获取班级信息
+// Mock.mock(/\/class\/\w*/, 'get', grade.getClassList)
+// 根据班级ID,获取学生信息
+Mock.mock(/\/stu\/\w*/, 'get', grade.fetchStuList)
export default Mock
diff --git a/src/mock/login.js b/src/mock/login.js
index b9694f09..e92fc246 100644
--- a/src/mock/login.js
+++ b/src/mock/login.js
@@ -1,34 +1,35 @@
-import { param2Obj } from '@/utils'
+// import { param2Obj } from '@/utils'
-const userMap = {
- admin: {
- roles: ['admin'],
- token: 'admin',
- introduction: '我是超级管理员',
- avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
- name: 'Super Admin'
- },
- editor: {
- roles: ['editor'],
- token: 'editor',
- introduction: '我是编辑',
- avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
- name: 'Normal Editor'
- }
-}
+// const userMap = {
+// admin: {
+// roles: ['admin'],
+// token: 'admin',
+// introduction: '我是超级管理员',
+// avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
+// name: 'Super Admin'
+// },
+// editor: {
+// roles: ['editor'],
+// token: 'editor',
+// introduction: '我是编辑',
+// avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
+// name: 'Normal Editor'
+// }
+// }
export default {
- loginByUsername: config => {
- const { username } = JSON.parse(config.body)
- return userMap[username]
- },
- getUserInfo: config => {
- const { token } = param2Obj(config.url)
- if (userMap[token]) {
- return userMap[token]
- } else {
- return false
- }
- },
- logout: () => 'success'
+ // loginByUsername: config => {
+ // debugger
+ // const { username } = JSON.parse(config.body)
+ // return userMap[username]
+ // },
+ // getUserInfo: config => {
+ // const { token } = param2Obj(config.url)
+ // if (userMap[token]) {
+ // return userMap[token]
+ // } else {
+ // return false
+ // }
+ // },
+ // logout: () => 'success'
}
diff --git a/src/permission.js b/src/permission.js
index e556cb00..14689b66 100644
--- a/src/permission.js
+++ b/src/permission.js
@@ -9,7 +9,9 @@ NProgress.configure({ showSpinner: false })// NProgress Configuration
// permission judge function
function hasPermission(roles, permissionRoles) {
- if (roles.indexOf('admin') >= 0) return true // admin permission passed directly
+ if (roles.includes(1) || roles.includes(0)) {
+ return true // admin permission passed directly
+ }
if (!permissionRoles) return true
return roles.some(role => permissionRoles.indexOf(role) >= 0)
}
@@ -26,7 +28,7 @@ router.beforeEach((to, from, next) => {
} else {
if (store.getters.roles.length === 0) { // 判断当前用户是否已拉取完user_info信息
store.dispatch('GetUserInfo').then(res => { // 拉取user_info
- const roles = res.data.roles // note: roles must be a array! such as: ['editor','develop']
+ const roles = res.data.result.roles // note: roles must be a array! such as: ['editor','develop']
store.dispatch('GenerateRoutes', { roles }).then(() => { // 根据roles权限生成可访问的路由表
router.addRoutes(store.getters.addRouters) // 动态添加可访问路由表
next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record
@@ -49,7 +51,7 @@ router.beforeEach((to, from, next) => {
}
} else {
/* has no token*/
- if (whiteList.indexOf(to.path) !== -1) { // 在免登录白名单,直接进入
+ if (whiteList.indexOf(to.path) !== -1 || (to.meta.title && to.meta.title === 'notice')) { // 在免登录白名单,直接进入
next()
} else {
next(`/login?redirect=${to.path}`) // 否则全部重定向到登录页
diff --git a/src/router/index.js b/src/router/index.js
index f42046ee..9b5c03d7 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -6,12 +6,6 @@ Vue.use(Router)
/* Layout */
import Layout from '@/views/layout/Layout'
-/* Router Modules */
-import componentsRouter from './modules/components'
-import chartsRouter from './modules/charts'
-import tableRouter from './modules/table'
-import nestedRouter from './modules/nested'
-
/** note: Submenu only appear when children.length>=1
* detail see https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html
**/
@@ -58,6 +52,12 @@ export const constantRouterMap = [
component: () => import('@/views/errorPage/404'),
hidden: true
},
+ {
+ path: '/notice/:id(\\d+)',
+ component: () => import('@/views/notice/show'),
+ hidden: true,
+ meta: { title: 'notice', icon: 'notice', noCache: true }
+ },
{
path: '/401',
component: () => import('@/views/errorPage/401'),
@@ -112,258 +112,227 @@ export default new Router({
export const asyncRouterMap = [
{
- path: '/permission',
+ path: '/notice',
component: Layout,
- redirect: '/permission/index',
- alwaysShow: true, // will always show the root menu
+ redirect: '/notice/list',
+ name: 'Notice',
meta: {
- title: 'permission',
- icon: 'lock',
- roles: ['admin', 'editor'] // you can set roles in root nav
- },
- children: [
- {
- path: 'page',
- component: () => import('@/views/permission/page'),
- name: 'PagePermission',
- meta: {
- title: 'pagePermission',
- roles: ['admin'] // or you can only set roles in sub nav
- }
- },
- {
- path: 'directive',
- component: () => import('@/views/permission/directive'),
- name: 'DirectivePermission',
- meta: {
- title: 'directivePermission'
- // if do not set roles, means: this page does not require permission
- }
- }
- ]
- },
-
- {
- path: '/icon',
- component: Layout,
- children: [
- {
- path: 'index',
- component: () => import('@/views/svg-icons/index'),
- name: 'Icons',
- meta: { title: 'icons', icon: 'icon', noCache: true }
- }
- ]
- },
-
- /** When your routing table is too long, you can split it into small modules**/
- componentsRouter,
- chartsRouter,
- nestedRouter,
- tableRouter,
-
- {
- path: '/example',
- component: Layout,
- redirect: '/example/list',
- name: 'Example',
- meta: {
- title: 'example',
+ title: 'notice',
icon: 'example'
},
children: [
{
path: 'create',
- component: () => import('@/views/example/create'),
- name: 'CreateArticle',
- meta: { title: 'createArticle', icon: 'edit' }
+ component: () => import('@/views/components-demo/uEditor'),
+ name: 'CreateNotice',
+ meta: { title: 'createNotice', icon: 'edit' }
},
{
path: 'edit/:id(\\d+)',
- component: () => import('@/views/example/edit'),
- name: 'EditArticle',
- meta: { title: 'editArticle', noCache: true },
+ component: () => import('@/views/components-demo/uEditor'),
+ name: 'EditNotice',
+ meta: { title: '公告编辑', noCache: true },
hidden: true
},
{
path: 'list',
- component: () => import('@/views/example/list'),
- name: 'ArticleList',
- meta: { title: 'articleList', icon: 'list' }
+ component: () => import('@/views/notice/list'),
+ name: 'NoticeList',
+ meta: { title: 'noticeList', icon: 'list' }
}
]
},
{
- path: '/tab',
+ path: '/laoshiguanli',
component: Layout,
children: [
{
path: 'index',
- component: () => import('@/views/tab/index'),
- name: 'Tab',
- meta: { title: 'tab', icon: 'tab' }
+ component: () => import('@/views/teacher/complexTable'),
+ name: 'laoshiguanli',
+ meta: { title: 'laoshiguanli', icon: 'laoshiguanli' }
}
]
},
-
{
- path: '/error',
+ path: '/nianjiguanli',
component: Layout,
- redirect: 'noredirect',
- name: 'ErrorPages',
+ children: [
+ {
+ path: 'index',
+ component: () => import('@/views/grade/complexTable'),
+ name: 'nianjiguanli',
+ meta: { title: 'nianjiguanli', icon: 'nianjiguanli' }
+ }
+ ]
+ },
+ {
+ path: '/xueshengguanli',
+ component: Layout,
+ children: [
+ {
+ path: 'index',
+ component: () => import('@/views/student/complexTable'),
+ name: 'xueshengguanli',
+ meta: { title: 'xueshengguanli', icon: 'xueshengguanli', noCache: true }
+ }
+ ]
+ },
+ {
+ path: '/myclass',
+ component: Layout,
+ children: [
+ {
+ path: 'index',
+ component: () => import('@/views/myclass/index'),
+ name: '执教班级',
+ meta: { title: '执教班级', icon: 'tab' }
+ }
+ ]
+ },
+ {
+ path: '/group',
+ component: Layout,
+ redirect: '/group/index',
+ children: [
+ {
+ path: 'index',
+ component: () => import('@/views/group/index'),
+ name: 'group',
+ meta: { title: 'group', icon: 'group' }
+ }
+ ]
+ },
+ {
+ path: '/leave',
+ component: Layout,
+ redirect: '/leave/list',
+ name: 'Leave',
meta: {
- title: 'errorPages',
- icon: '404'
+ title: '请假',
+ icon: 'qingjia'
},
children: [
{
- path: '401',
- component: () => import('@/views/errorPage/401'),
- name: 'Page401',
- meta: { title: 'page401', noCache: true }
+ path: 'create',
+ component: () => import('@/views/components-demo/uEditor'),
+ name: 'CreateLeave',
+ meta: { title: '创建请假', icon: 'edit' }
},
{
- path: '404',
- component: () => import('@/views/errorPage/404'),
- name: 'Page404',
- meta: { title: 'page404', noCache: true }
- }
- ]
- },
-
- {
- path: '/error-log',
- component: Layout,
- redirect: 'noredirect',
- children: [
+ path: 'edit/:id(\\d+)',
+ component: () => import('@/views/components-demo/uEditor'),
+ name: 'EditNotice',
+ meta: { title: '编辑请假', noCache: true },
+ hidden: true
+ },
{
- path: 'log',
- component: () => import('@/views/errorLog/index'),
- name: 'ErrorLog',
- meta: { title: 'errorLog', icon: 'bug' }
+ path: 'list',
+ component: () => import('@/views/leave/list'),
+ name: 'LeaveList',
+ meta: { title: '我的请假', icon: 'list' }
}
]
},
-
{
- path: '/excel',
+ path: '/form',
component: Layout,
- redirect: '/excel/export-excel',
- name: 'Excel',
+ redirect: '/form/list',
+ name: 'Form',
meta: {
- title: 'excel',
- icon: 'excel'
+ title: '表单',
+ icon: 'biaodan'
},
children: [
{
- path: 'export-excel',
- component: () => import('@/views/excel/exportExcel'),
- name: 'ExportExcel',
- meta: { title: 'exportExcel' }
+ path: 'create',
+ component: () => import('@/views/form/create'),
+ name: 'CreateForm',
+ meta: { title: '新建表单', icon: 'edit' }
},
{
- path: 'export-selected-excel',
- component: () => import('@/views/excel/selectExcel'),
- name: 'SelectExcel',
- meta: { title: 'selectExcel' }
+ path: 'edit/:id(\\d+)',
+ component: () => import('@/views/components-demo/uEditor'),
+ name: 'EditNotice',
+ meta: { title: '编辑请假', noCache: true },
+ hidden: true
},
{
- path: 'upload-excel',
- component: () => import('@/views/excel/uploadExcel'),
- name: 'UploadExcel',
- meta: { title: 'uploadExcel' }
+ path: 'list',
+ component: () => import('@/views/leave/list'),
+ name: 'LeaveList',
+ meta: { title: '我的请假', icon: 'list' }
}
]
},
-
{
- path: '/zip',
+ path: '/module',
component: Layout,
- redirect: '/zip/download',
- alwaysShow: true,
- meta: { title: 'zip', icon: 'zip' },
+ redirect: '/module/list',
+ name: 'Module',
+ meta: {
+ title: '模块管理',
+ icon: 'biaodan'
+ },
children: [
{
- path: 'download',
- component: () => import('@/views/zip/index'),
- name: 'ExportZip',
- meta: { title: 'exportZip' }
+ path: 'create',
+ component: () => import('@/views/form/create'),
+ name: 'CreateForm',
+ meta: { title: '新建模块', icon: 'edit' }
+ },
+ {
+ path: 'edit/:id(\\d+)',
+ component: () => import('@/views/components-demo/uEditor'),
+ name: 'EditNotice',
+ meta: { title: '编辑请假', noCache: true },
+ hidden: true
+ },
+ {
+ path: 'list',
+ component: () => import('@/views/module/complexTable'),
+ name: 'ModuleList',
+ meta: { title: '模块列表', icon: 'list' }
}
]
},
-
{
- path: '/pdf',
+ path: '/system',
component: Layout,
- redirect: '/pdf/index',
- meta: { title: 'PDF', icon: 'pdf' },
+ redirect: '/system/list',
+ name: 'System',
+ meta: {
+ title: '系统管理',
+ icon: 'biaodan'
+ },
children: [
{
- path: 'index',
- component: () => import('@/views/pdf/index'),
- name: 'PDF',
- meta: { title: 'PDF' }
- }
- ]
- },
- {
- path: '/pdf/download',
- component: () => import('@/views/pdf/download'),
- hidden: true
- },
-
- {
- path: '/theme',
- component: Layout,
- redirect: 'noredirect',
- children: [
+ path: 'school',
+ component: () => import('@/views/system/schoolForm'),
+ name: 'SchoolForm',
+ meta: { title: '系统管理', icon: 'edit' }
+ },
{
- path: 'index',
- component: () => import('@/views/theme/index'),
- name: 'Theme',
- meta: { title: 'theme', icon: 'theme' }
- }
- ]
- },
-
- {
- path: '/clipboard',
- component: Layout,
- redirect: 'noredirect',
- children: [
+ path: 'wechatTemplate',
+ component: () => import('@/views/system/wechatTemplate'),
+ name: 'WechatTemplate',
+ meta: { title: '微信消息模板', icon: 'edit' }
+ },
{
- path: 'index',
- component: () => import('@/views/clipboard/index'),
- name: 'ClipboardDemo',
- meta: { title: 'clipboardDemo', icon: 'clipboard' }
- }
- ]
- },
-
- {
- path: '/i18n',
- component: Layout,
- children: [
+ path: 'edit/:id(\\d+)',
+ component: () => import('@/views/components-demo/uEditor'),
+ name: 'EditNotice',
+ meta: { title: '编辑请假', noCache: true },
+ hidden: true
+ },
{
- path: 'index',
- component: () => import('@/views/i18n-demo/index'),
- name: 'I18n',
- meta: { title: 'i18n', icon: 'international' }
+ path: 'list',
+ component: () => import('@/views/module/complexTable'),
+ name: 'ModuleList',
+ meta: { title: '模块列表', icon: 'list' }
}
]
},
-
- {
- path: 'external-link',
- component: Layout,
- children: [
- {
- path: 'https://github.com/PanJiaChen/vue-element-admin',
- meta: { title: 'externalLink', icon: 'link' }
- }
- ]
- },
-
{ path: '*', redirect: '/404', hidden: true }
]
diff --git a/src/router/modules/components.js b/src/router/modules/components.js
index 5fd9bd29..61aebcd9 100644
--- a/src/router/modules/components.js
+++ b/src/router/modules/components.js
@@ -25,10 +25,10 @@ const componentsRouter = {
meta: { title: 'markdown' }
},
{
- path: 'json-editor',
- component: () => import('@/views/components-demo/jsonEditor'),
- name: 'JsonEditorDemo',
- meta: { title: 'jsonEditor' }
+ path: 'ueditor',
+ component: () => import('@/views/components-demo/uEditor'),
+ name: 'uEditorDemo',
+ meta: { title: 'UEditor' }
},
{
path: 'splitpane',
diff --git a/src/store/getters.js b/src/store/getters.js
index cf314f5c..65f3ce0a 100644
--- a/src/store/getters.js
+++ b/src/store/getters.js
@@ -8,12 +8,15 @@ const getters = {
token: state => state.user.token,
avatar: state => state.user.avatar,
name: state => state.user.name,
+ fid: state => state.user.fid,
+ uid: state => state.user.uid,
introduction: state => state.user.introduction,
status: state => state.user.status,
roles: state => state.user.roles,
setting: state => state.user.setting,
permission_routers: state => state.permission.routers,
addRouters: state => state.permission.addRouters,
- errorLogs: state => state.errorLog.logs
+ errorLogs: state => state.errorLog.logs,
+ user: state => state.user
}
export default getters
diff --git a/src/store/modules/app.js b/src/store/modules/app.js
index fba4b05c..359ced7e 100644
--- a/src/store/modules/app.js
+++ b/src/store/modules/app.js
@@ -7,7 +7,7 @@ const app = {
withoutAnimation: false
},
device: 'desktop',
- language: Cookies.get('language') || 'en',
+ language: Cookies.get('language') || 'zh',
size: Cookies.get('size') || 'medium'
},
mutations: {
diff --git a/src/store/modules/permission.js b/src/store/modules/permission.js
index 97de701e..c124e2a9 100644
--- a/src/store/modules/permission.js
+++ b/src/store/modules/permission.js
@@ -7,7 +7,7 @@ import { asyncRouterMap, constantRouterMap } from '@/router'
*/
function hasPermission(roles, route) {
if (route.meta && route.meta.roles) {
- return roles.some(role => route.meta.roles.includes(role))
+ return roles.some(role => route.meta.roles.indexOf(role) >= 0)
} else {
return true
}
@@ -50,7 +50,7 @@ const permission = {
return new Promise(resolve => {
const { roles } = data
let accessedRouters
- if (roles.includes('admin')) {
+ if (data.roles.includes(1) || data.roles.includes(0)) {
accessedRouters = asyncRouterMap
} else {
accessedRouters = filterAsyncRouter(asyncRouterMap, roles)
diff --git a/src/store/modules/user.js b/src/store/modules/user.js
index 38e81a36..a5784875 100644
--- a/src/store/modules/user.js
+++ b/src/store/modules/user.js
@@ -1,16 +1,19 @@
import { loginByUsername, logout, getUserInfo } from '@/api/login'
+import { Message } from 'element-ui'
import { getToken, setToken, removeToken } from '@/utils/auth'
const user = {
state: {
- user: '',
status: '',
code: '',
token: getToken(),
+ admin: false,
name: '',
+ fid: '',
+ uid: '',
+ roles: [],
avatar: '',
introduction: '',
- roles: [],
setting: {
articlePlatform: []
}
@@ -35,6 +38,16 @@ const user = {
SET_NAME: (state, name) => {
state.name = name
},
+ SET_FID: (state, fid) => {
+ state.fid = fid
+ },
+ SET_ADMIN: (state, admin) => {
+ state.admin = admin
+ },
+ SET_UID: (state, uid) => {
+ state.uid = uid
+ },
+ // 头像
SET_AVATAR: (state, avatar) => {
state.avatar = avatar
},
@@ -47,12 +60,27 @@ const user = {
// 用户名登录
LoginByUsername({ commit }, userInfo) {
const username = userInfo.username.trim()
+ userInfo.fid = 1
+ const fid = parseInt(userInfo.fid)
return new Promise((resolve, reject) => {
- loginByUsername(username, userInfo.password).then(response => {
- const data = response.data
- commit('SET_TOKEN', data.token)
- setToken(response.data.token)
- resolve()
+ loginByUsername(username, userInfo.password, fid).then(response => {
+ if (response.data.code === 200) {
+ const data = response.data.result
+ commit('SET_TOKEN', data.token)
+ commit('SET_FID', fid)
+ commit('SET_NAME', data.name)
+ commit('SET_ADMIN', data.roles.includes(1))
+ commit('SET_UID', data.uid)
+ setToken(data.token)
+ resolve()
+ } else {
+ Message({
+ message: response.data.message,
+ type: 'error',
+ duration: 4 * 1000
+ })
+ resolve()
+ }
}).catch(error => {
reject(error)
})
@@ -63,21 +91,18 @@ const user = {
GetUserInfo({ commit, state }) {
return new Promise((resolve, reject) => {
getUserInfo(state.token).then(response => {
- // 由于mockjs 不支持自定义状态码只能这样hack
- if (!response.data) {
- reject('Verification failed, please login again.')
+ var data = response.data.result
+ if (!data) { // 由于mockjs 不支持自定义状态码只能这样hack
+ reject('error')
}
- const data = response.data
if (data.roles && data.roles.length > 0) { // 验证返回的roles是否是一个非空数组
commit('SET_ROLES', data.roles)
} else {
- reject('getInfo: roles must be a non-null array!')
+ reject('getInfo: roles must be a non-null array !')
}
-
- commit('SET_NAME', data.name)
- commit('SET_AVATAR', data.avatar)
- commit('SET_INTRODUCTION', data.introduction)
+ commit('SET_AVATAR', 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif')
+ commit('SET_INTRODUCTION', '我是超级管理员')
resolve(response)
}).catch(error => {
reject(error)
diff --git a/src/styles/index.scss b/src/styles/index.scss
index 93f2157e..1f5d999d 100644
--- a/src/styles/index.scss
+++ b/src/styles/index.scss
@@ -199,3 +199,47 @@ code {
.multiselect--active {
z-index: 1000 !important;
}
+
+.el-table--medium td, .el-table--medium th {
+ padding: 3px 0;
+}
+
+// cell-style="padding:0"
+// 表格cell
+.el-table td{
+ padding: 0px 0;
+}
+
+// 输入框
+.el-input--medium .el-input__inner {
+ height: 30px;
+ line-height: 30px;
+}
+
+// 标准按钮
+.el-button--medium {
+ padding: 8px 10px;
+}
+
+
+#online li div span.file-title {
+ height: 18px;
+}
+
+.el-form-item {
+ margin-bottom: 14px;
+}
+
+.el-dialog__body {
+ padding: 10px 20px;
+ color: #606266;
+ font-size: 14px;
+}
+
+.el-table--enable-row-hover .el-table__body tr:hover>td{
+ background-color: #ecfffa;
+ }
+
+img {
+ max-width: 100%;
+}
\ No newline at end of file
diff --git a/src/styles/schedule.css b/src/styles/schedule.css
new file mode 100644
index 00000000..fe1f69af
--- /dev/null
+++ b/src/styles/schedule.css
@@ -0,0 +1,145 @@
+body{background-color: white;}
+.tr_btn {
+ width: 100%;
+ height: 35px;
+}
+
+.td_btn {
+ height: 35px;
+ line-height: 35px;
+ font-family: "微软雅黑";
+ font-weight: bold;
+}
+
+.tr_top {
+ width: 100%;
+ height: 25px;
+}
+
+.td_top_title {
+ width: 10%;
+ height: 25px;
+ line-height: 25px;
+ font-family: "微软雅黑";
+ font-size: 15px;;
+ font-weight: bold;
+ text-align: center;
+ float: left;
+ color:#007BFF;
+}
+
+.td_top_data {
+ width: 12%;
+ height: 25px;
+ line-height: 25px;
+ font-family: "楷体";
+ font-size: 15px;
+ font-weight: bold;
+ text-align: center;
+ float: left;
+}
+
+.td_top_data_change {
+ font-size: 17px;
+ font-family: "楷体";
+ color: white;
+ background-color: #9FCDFF;
+}
+
+.tr_week {
+ width: 100%;
+}
+
+
+.td_week_title {
+ width: 10%;
+ font-family: "微软雅黑";
+ font-weight: bold;
+ text-align: center;
+ float: left;
+}
+
+.td_week_title_content {
+ height: 40px;
+ margin-top: 2px;
+ background-color: #EBEBEB;
+ line-height: 40px;
+}
+
+
+.td_week_data {
+ width: 12%;
+ font-family: "微软雅黑";
+ font-weight: bold;
+ float: left;
+}
+
+.td_week_data_content:active {
+ color: black;
+ background-color: #9FCDFF;
+}
+
+.td_week_data_content:visited {
+ color: black;
+
+}
+
+.td_week_data_content {
+ height: 40px;
+ padding: 2px;
+ margin-top:2px;
+ margin-left: 2px;
+ text-align: center;
+ background-color: #f0f0f0;
+ border-radius: 5px;
+ position: relative;
+ max-height: 40px;
+ overflow: hidden;
+}
+
+.td_week_data_content::after {
+ /** content: "..."; */
+ position: absolute;
+ bottom: 0;
+
+
+ right: 0;
+ padding-left: 20px;
+ /*background: -webkit-linear-gradient(left, transparent, #fff 100%);
+ background: -o-linear-gradient(right, transparent, #fff 100%);
+ background: -moz-linear-gradient(right, transparent, #fff 100%);
+ background: linear-gradient(to right, transparent, #fff 100%);*/
+}
+
+
+.td_color{
+ background-color: white;
+ border-radius: 0;
+}
+
+.td_color::after {
+ content: "";
+ position: absolute;
+ bottom: 0;
+ right: 0;
+ background: -webkit-linear-gradient(left, transparent, #fff 100%);
+ background: -o-linear-gradient(right, transparent, #fff 100%);
+ background: -moz-linear-gradient(right, transparent, #fff 100%);
+ background: linear-gradient(to right, transparent, #fff 100%);
+}
+
+.td_color:active {
+ background-color: white;
+}
+
+.td_color:visited {
+ background-color:white;
+}
+
+.show{
+ width: 100%;
+ height: auto;
+ word-wrap:break-word;
+ word-break:break-all;
+ overflow: hidden;
+}
diff --git a/src/styles/sidebar.scss b/src/styles/sidebar.scss
index 723f9a12..e03acb77 100644
--- a/src/styles/sidebar.scss
+++ b/src/styles/sidebar.scss
@@ -6,6 +6,7 @@
transition: margin-left .28s;
margin-left: $sideBarWidth;
position: relative;
+ background-color: #FCFAF7;
}
// 侧边栏 Sidebar container
diff --git a/src/styles/variables.scss b/src/styles/variables.scss
index 09c3e9b0..2d4230de 100644
--- a/src/styles/variables.scss
+++ b/src/styles/variables.scss
@@ -12,4 +12,4 @@ $panGreen: #30B08F;
$menuBg:#304156;
$subMenuBg:#1f2d3d;
$menuHover:#001528;
-$sideBarWidth: 180px;
+$sideBarWidth: 200px;
diff --git a/src/utils/index.js b/src/utils/index.js
index 0445827b..963ef0ef 100644
--- a/src/utils/index.js
+++ b/src/utils/index.js
@@ -3,9 +3,12 @@
*/
export function parseTime(time, cFormat) {
- if (arguments.length === 0) {
+ if (arguments.length === 0 || time == null) {
return null
}
+ if (typeof time === 'string') {
+ return time
+ }
const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
let date
if (typeof time === 'object') {
@@ -164,6 +167,17 @@ export function objectMerge(target, source) {
return target
}
+export function scrollTo(element, to, duration) {
+ if (duration <= 0) return
+ const difference = to - element.scrollTop
+ const perTick = (difference / duration) * 10
+ setTimeout(() => {
+ element.scrollTop = element.scrollTop + perTick
+ if (element.scrollTop === to) return
+ scrollTo(element, to, duration - 10)
+ }, 10)
+}
+
export function toggleClass(element, className) {
if (!element || !className) {
return
@@ -289,3 +303,153 @@ export function uniqueArr(arr) {
export function isExternal(path) {
return /^(https?:|mailto:|tel:)/.test(path)
}
+
+// 获取d当前时间多少天后的日期和对应星期
+export function getDates(days) {
+ // todate默认参数是当前日期,可以传入对应时间
+ var dateArry = []
+ for (var i = 0; i < days; i++) {
+ var dateObj = dateLater(getCurrentMonthFirst(), i)
+ dateArry.push(dateObj)
+ }
+ return dateArry
+}
+/** * 传入时间后几天 * param:传入时间:dates:"2018-04-02",later:往后多少天 */
+export function dateLater(dates, later) {
+ var dateObj = {}
+ var show_day = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']
+ var date = new Date(dates)
+ date.setDate(date.getDate() + later)
+ var day = date.getDay()
+ dateObj.year = date.getFullYear()
+ dateObj.month = ((date.getMonth() + 1) < 10 ? ('0' + (date.getMonth() + 1)) : date.getMonth() + 1)
+ dateObj.day = (date.getDate() < 10 ? ('0' + date.getDate()) : date.getDate())
+ dateObj.week = show_day[day]
+ return dateObj
+}
+
+// 获取当前时间
+export function getCurrentMonthFirst() {
+ var date = new Date()
+ var todate = date.getFullYear() + '-' + ((date.getMonth() + 1) < 10 ? ('0' + (date.getMonth() + 1)) : date.getMonth() + 1) + '-' + (date.getDate() < 10 ? ('0' + date.getDate()) : date.getDate())
+
+ return todate
+}
+
+export function getDays() {
+ var data = new Date()
+ var setData = ''
+ var weeks = dateLater(data, 0).week
+ switch (weeks) {
+ case '周一':
+ setData = [
+ dateLater(data, 0).day,
+ dateLater(data, 1).day,
+ dateLater(data, 2).day,
+ dateLater(data, 3).day,
+ dateLater(data, 4).day,
+ dateLater(data, 5).day,
+ dateLater(data, 6).day
+ ]
+ break
+ case '周二':
+ setData = [
+ dateLater(data, -1).day,
+ dateLater(data, 0).day,
+ dateLater(data, 1).day,
+ dateLater(data, 2).day,
+ dateLater(data, 3).day,
+ dateLater(data, 4).day,
+ dateLater(data, 5).day
+ ]
+ break
+ case '周三':
+ setData = [
+ dateLater(data, -2).day,
+ dateLater(data, -1).day,
+ dateLater(data, 0).day,
+ dateLater(data, 1).day,
+ dateLater(data, 2).day,
+ dateLater(data, 3).day,
+ dateLater(data, 4).day
+ ]
+ break
+ case '周四':
+ setData = [
+ dateLater(data, -3).day,
+ dateLater(data, -2).day,
+ dateLater(data, -1).day,
+ dateLater(data, 0).day,
+ dateLater(data, 1).day,
+ dateLater(data, 2).day,
+ dateLater(data, 3).day
+ ]
+ break
+ case '周五':
+ setData = [
+ dateLater(data, -4).day,
+ dateLater(data, -3).day,
+ dateLater(data, -2).day,
+ dateLater(data, -1).day,
+ dateLater(data, 0).day,
+ dateLater(data, 1).day,
+ dateLater(data, 2).day
+ ]
+ break
+ case '周六':
+ setData = [
+ dateLater(data, -5).day,
+ dateLater(data, -4).day,
+ dateLater(data, -3).day,
+ dateLater(data, -2).day,
+ dateLater(data, -1).day,
+ dateLater(data, 0).day,
+ dateLater(data, 1).day
+ ]
+ break
+ case '周日':
+ setData = [
+ dateLater(data, -6).day,
+ dateLater(data, -5).day,
+ dateLater(data, -4).day,
+ dateLater(data, -3).day,
+ dateLater(data, -2).day,
+ dateLater(data, -1).day,
+ dateLater(data, 0).day
+ ]
+ break
+ default:
+ break
+ }
+ if (setData !== '') {
+ return setData
+ } else {
+ return ''
+ }
+}
+
+export function getYear() {
+ var Year = new Date().getFullYear()
+ var setData = [Year - 1, Year, Year - 2, Year - 3]
+ return setData
+}
+
+export function formatMonth() {
+ var date = new Date()
+ var month = date.getMonth() + 1
+ return month
+}
+
+export function formatDay(time) {
+ var date = new Date()
+ var day = date.getDate()
+ if (time === day) return true
+ return false
+}
+
+export function getWeeks(week) {
+ var data = new Date()
+ var weeks = dateLater(data, 0).week
+ if (weeks === week) return true
+ return false
+}
diff --git a/src/utils/request.js b/src/utils/request.js
index 50f9ecec..0552ad2a 100644
--- a/src/utils/request.js
+++ b/src/utils/request.js
@@ -2,11 +2,14 @@ import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'
+import { MessageBox } from 'element-ui'
// create an axios instance
const service = axios.create({
baseURL: process.env.BASE_API, // api 的 base_url
- timeout: 5000 // request timeout
+ timeout: 5000, // request timeout
+ // mock可能导致此属性生效。mock/index.js文件已修复
+ withCredentials: true // 是否允许发送Cookie 如果为true 则服务器的 Access-control-Allow-Credentials 必须为 true 来源为 XMLHttpRequest的withCredentials配置项
})
// request interceptor
@@ -16,6 +19,7 @@ service.interceptors.request.use(
if (store.getters.token) {
// 让每个请求携带token-- ['X-Token']为自定义key 请根据实际情况自行修改
config.headers['X-Token'] = getToken()
+ config.headers['UID'] = store.state.user.uid
}
return config
},
@@ -28,40 +32,59 @@ service.interceptors.request.use(
// response interceptor
service.interceptors.response.use(
- response => response,
+ // response => response,
/**
* 下面的注释为通过在response里,自定义code来标示请求状态
* 当code返回如下情况则说明权限有问题,登出并返回到登录页
* 如想通过 xmlhttprequest 来状态码标识 逻辑可写在下面error中
* 以下代码均为样例,请结合自生需求加以修改,若不需要,则可删除
*/
- // response => {
- // const res = response.data
- // if (res.code !== 20000) {
- // Message({
- // message: res.message,
- // type: 'error',
- // duration: 5 * 1000
- // })
- // // 50008:非法的token; 50012:其他客户端登录了; 50014:Token 过期了;
- // if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
- // // 请自行在引入 MessageBox
- // // import { Message, MessageBox } from 'element-ui'
- // MessageBox.confirm('你已被登出,可以取消继续留在该页面,或者重新登录', '确定登出', {
- // confirmButtonText: '重新登录',
- // cancelButtonText: '取消',
- // type: 'warning'
- // }).then(() => {
- // store.dispatch('FedLogOut').then(() => {
- // location.reload() // 为了重新实例化vue-router对象 避免bug
- // })
- // })
- // }
- // return Promise.reject('error')
- // } else {
- // return response.data
- // }
- // },
+ response => {
+ const res = response.data
+ if (!res.code) {
+ console.log('mock数据请求...' + response.data)
+ return response
+ } else if (res.code !== 200) {
+ // Message({
+ // message: res.message,
+ // type: 'error',
+ // duration: 5 * 1000
+ // })
+ // 退出登录
+ if (res.code === 50068) {
+ store.dispatch('FedLogOut').then(() => {
+ location.reload() // 为了重新实例化vue-router对象 避免bug
+ })
+ } else if (res.code === 50008 || res.code === 50012 || res.code === 50014) { // 50008:非法的token; 50012:其他客户端登录了; 50014:Token 过期了;
+ // 请自行在引入 MessageBox
+ // import { Message, MessageBox } from 'element-ui'
+ MessageBox.confirm('你已被登出,可以取消继续留在该页面,或者重新登录', '确定登出', {
+ confirmButtonText: '重新登录',
+ cancelButtonText: '取消',
+ type: 'warning'
+ }).then(() => {
+ store.dispatch('FedLogOut').then(() => {
+ location.reload() // 为了重新实例化vue-router对象 避免bug
+ })
+ })
+ } else if (res.code === 601) { // 主键冲突
+ Message({
+ message: res.message,
+ type: 'error',
+ duration: 5 * 1000
+ })
+ } else {
+ Message({
+ message: '其他异常: ' + res.message,
+ type: 'error',
+ duration: 5 * 1000
+ })
+ }
+ return Promise.reject()
+ } else {
+ return response
+ }
+ },
error => {
console.log('err' + error) // for debug
Message({
diff --git a/src/utils/validate.js b/src/utils/validate.js
index ada0e7e2..eb7f5efa 100644
--- a/src/utils/validate.js
+++ b/src/utils/validate.js
@@ -3,8 +3,9 @@
*/
export function isvalidUsername(str) {
- const valid_map = ['admin', 'editor']
- return valid_map.indexOf(str.trim()) >= 0
+ if (str === '') {
+ return '用户名不能为空!'
+ }
}
/* 合法uri*/
@@ -40,3 +41,8 @@ export function validateEmail(email) {
const re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
return re.test(email)
}
+
+export function isvalidStr(str) {
+ const valid_map = ['admin', 'editor']
+ return valid_map.indexOf(str.trim()) >= 0
+}