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 00000000..58c75a4e
Binary files /dev/null and b/src/assets/iconfont/iconfont.eot differ
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 00000000..b9251ea9
Binary files /dev/null and b/src/assets/iconfont/iconfont.ttf differ
diff --git a/src/assets/iconfont/iconfont.woff b/src/assets/iconfont/iconfont.woff
new file mode 100644
index 00000000..3f291217
Binary files /dev/null and b/src/assets/iconfont/iconfont.woff differ
diff --git a/src/lang/en.js b/src/lang/en.js
index 2af355b1..4cc502fb 100644
--- a/src/lang/en.js
+++ b/src/lang/en.js
@@ -1,6 +1,8 @@
export default {
route: {
dashboard: 'Dashboard',
+ UEditor: 'UEditor',
+ group: 'group',
introduction: 'Introduction',
documentation: 'Documentation',
guide: 'Guide',
diff --git a/src/lang/index.js b/src/lang/index.js
index 7c9c8af6..93dadcaf 100644
--- a/src/lang/index.js
+++ b/src/lang/index.js
@@ -28,7 +28,7 @@ const messages = {
const i18n = new VueI18n({
// set locale
// options: en | zh | es
- locale: Cookies.get('language') || 'en',
+ locale: Cookies.get('language') || 'zh',
// set locale messages
messages
})
diff --git a/src/lang/zh.js b/src/lang/zh.js
index 4371713f..4b96c4c7 100644
--- a/src/lang/zh.js
+++ b/src/lang/zh.js
@@ -1,6 +1,8 @@
export default {
route: {
dashboard: '首页',
+ UEditor: '编辑',
+ group: '小组',
introduction: '简述',
documentation: '文档',
guide: '引导页',
@@ -29,6 +31,9 @@ export default {
lineChart: '折线图',
mixChart: '混合图表',
example: '综合实例',
+ notice: '公告',
+ createNotice: '创建公告',
+ noticeList: '公告列表',
nested: '路由嵌套',
menu1: '菜单1',
'menu1-1': '菜单1-1',
@@ -53,6 +58,7 @@ export default {
page401: '401',
page404: '404',
errorLog: '错误日志',
+ myExample: '我的例子',
excel: 'Excel',
exportExcel: 'Export Excel',
selectExcel: 'Export Selected',
@@ -62,7 +68,10 @@ export default {
theme: '换肤',
clipboardDemo: 'Clipboard',
i18n: '国际化',
- externalLink: '外链'
+ externalLink: '外链',
+ laoshiguanli: '教师管理',
+ nianjiguanli: '年级管理',
+ xueshengguanli: '学生管理'
},
navbar: {
logOut: '退出登录',
@@ -129,6 +138,38 @@ export default {
cancel: '取 消',
confirm: '确 定'
},
+ student: {
+ name: '姓名',
+ sex: '性别',
+ birth: '出生日期',
+ number: '身份证号',
+ address: '地址',
+ enrollment_time: '入学时间',
+ dynamicTips1: '固定表头, 按照表头顺序排序',
+ dynamicTips2: '不固定表头, 按照点击顺序排序',
+ dragTips1: '默认顺序',
+ dragTips2: '拖拽后顺序',
+ title: '标题',
+ importance: '重要性',
+ type: '类型',
+ remark: '点评',
+ search: '搜索',
+ add: '添加',
+ export: '导出',
+ reviewer: '审核人',
+ id: '序号',
+ date: '时间',
+ author: '作者',
+ readings: '阅读数',
+ status: '状态',
+ actions: '操作',
+ edit: '编辑',
+ publish: '发布',
+ draft: '草稿',
+ delete: '删除',
+ cancel: '取 消',
+ confirm: '确 定'
+ },
errorLog: {
tips: '请点击右上角bug小图标',
description: '现在的管理后台基本都是spa的形式了,它增强了用户体验,但同时也会增加页面出问题的可能性,可能一个小小的疏忽就导致整个页面的死锁。好在 Vue 官网提供了一个方法来捕获处理异常,你可以在其中进行错误处理或者异常上报。',
@@ -156,5 +197,34 @@ export default {
close: '关闭',
closeOthers: '关闭其它',
closeAll: '关闭所有'
- }
+ },
+ group: {
+ name: '组 名',
+ add: '新 建 组',
+ member: '成 员',
+ delete: '删 除 组',
+ system: '系 统 组', // 系统自动生成的组。比如:老师按角色分为(语文组,数学组,小学组等); 学生分为(班级); 学生家长(班级)
+ comment: '组 描 述',
+ github: '项 目 地 址',
+ screenfull: '全 屏',
+ theme: '换 肤',
+ size: '布 局 大 小'
+ },
+ date: '日 期',
+ id: '序 号',
+ name: '姓 名',
+ createDate: '创 建 时 间',
+ comment: '描 述',
+ createUser: '创 建 者',
+ edit: '编辑',
+ create: '创建',
+ publish: '发 布',
+ draft: '草 稿',
+ delete: '删 除',
+ save: '保存',
+ cancel: '取 消',
+ confirm: '确 定',
+ detail: '详 情',
+ action: '操作',
+ export: '导出Excel'
}
diff --git a/src/main.js b/src/main.js
index 1ce709c9..41191623 100644
--- a/src/main.js
+++ b/src/main.js
@@ -9,12 +9,17 @@ import 'element-ui/lib/theme-chalk/index.css'
import '@/styles/index.scss' // global css
+import '@/styles/schedule.css' // global css
import App from './App'
import router from './router'
import store from './store'
import i18n from './lang' // Internationalization
import './icons' // icon
+// 引入图片库样式
+import './assets/iconfont/iconfont.css'
+// 使用svg,需引入该js
+import './assets/iconfont/iconfont.js'
import './errorLog' // error log
import './permission' // permission control
import './mock' // simulation data
@@ -40,3 +45,4 @@ new Vue({
i18n,
render: h => 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
+}