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 @@ + + + + + +Created by iconfont + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 +}