From 5066865682c9abc9bbe0d498aacb8a23308760ff Mon Sep 17 00:00:00 2001 From: zhangwei <1094660626@qq.com> Date: Sun, 20 Jan 2019 15:36:26 +0800 Subject: [PATCH] data --- src/App.vue | 8 +- src/api/article.js | 22 +- src/api/grade.js | 49 +++++ src/api/group.js | 50 +++++ src/api/login.js | 15 +- src/api/user.js | 222 +++++++++++++++++++ src/assets/iconfont/iconfont.css | 88 ++++++++ src/assets/iconfont/iconfont.eot | Bin 0 -> 11300 bytes src/assets/iconfont/iconfont.js | 1 + src/assets/iconfont/iconfont.svg | 122 +++++++++++ src/assets/iconfont/iconfont.ttf | Bin 0 -> 11132 bytes src/assets/iconfont/iconfont.woff | Bin 0 -> 7528 bytes src/lang/en.js | 2 + src/lang/index.js | 2 +- src/lang/zh.js | 74 ++++++- src/main.js | 6 + src/mock/article.js | 1 + src/mock/grade.js | 43 ++++ src/mock/index.js | 17 +- src/mock/login.js | 61 +++--- src/permission.js | 8 +- src/router/index.js | 351 ++++++++++++++---------------- src/router/modules/components.js | 8 +- src/store/getters.js | 5 +- src/store/modules/app.js | 2 +- src/store/modules/permission.js | 4 +- src/store/modules/user.js | 57 +++-- src/styles/index.scss | 44 ++++ src/styles/schedule.css | 145 ++++++++++++ src/styles/sidebar.scss | 1 + src/styles/variables.scss | 2 +- src/utils/index.js | 166 +++++++++++++- src/utils/request.js | 81 ++++--- src/utils/validate.js | 10 +- 34 files changed, 1366 insertions(+), 301 deletions(-) create mode 100644 src/api/grade.js create mode 100644 src/api/group.js create mode 100644 src/api/user.js create mode 100644 src/assets/iconfont/iconfont.css create mode 100644 src/assets/iconfont/iconfont.eot create mode 100644 src/assets/iconfont/iconfont.js create mode 100644 src/assets/iconfont/iconfont.svg create mode 100644 src/assets/iconfont/iconfont.ttf create mode 100644 src/assets/iconfont/iconfont.woff create mode 100644 src/mock/grade.js create mode 100644 src/styles/schedule.css diff --git a/src/App.vue b/src/App.vue index ab408f3e..641109a2 100644 --- a/src/App.vue +++ b/src/App.vue @@ -6,6 +6,12 @@ diff --git a/src/api/article.js b/src/api/article.js index f54b8af6..e9dadba1 100644 --- a/src/api/article.js +++ b/src/api/article.js @@ -2,7 +2,7 @@ import request from '@/utils/request' export function fetchList(query) { return request({ - url: '/article/list', + url: '/ueditor/list', method: 'get', params: query }) @@ -10,9 +10,8 @@ export function fetchList(query) { export function fetchArticle(id) { return request({ - url: '/article/detail', - method: 'get', - params: { id } + url: '/ueditor/detail/' + id, + method: 'get' }) } @@ -39,3 +38,18 @@ export function updateArticle(data) { data }) } + +export function saveArticle(data) { + return request({ + url: '/ueditor/save', + method: 'post', + data + }) +} + +export function deleteArticle(id) { + return request({ + url: '/ueditor/del/' + id, + method: 'get' + }) +} diff --git a/src/api/grade.js b/src/api/grade.js new file mode 100644 index 00000000..bd5040fe --- /dev/null +++ b/src/api/grade.js @@ -0,0 +1,49 @@ +import request from '@/utils/request' + +// 获取组List信息 +export function fetchList(query) { + return request({ + url: '/grade/list', + method: 'get', + params: query + }) +} + +export function getClassList(query) { + return request({ + url: '/class/list', + method: 'get', + params: query + }) +} + +export function fetchStuList(listQuery) { + return request({ + url: '/stu/' + listQuery.type, + method: 'get' + }) +} + +export function fetchPv(pv) { + return request({ + url: '/article/pv', + method: 'get', + params: { pv } + }) +} + +export function createArticle(data) { + return request({ + url: '/article/create', + method: 'post', + data + }) +} + +export function updateArticle(data) { + return request({ + url: '/article/update', + method: 'post', + data + }) +} diff --git a/src/api/group.js b/src/api/group.js new file mode 100644 index 00000000..cc2f5189 --- /dev/null +++ b/src/api/group.js @@ -0,0 +1,50 @@ +import request from '@/utils/request' + +// 获取组List信息 +export function fetchGroupList(query) { + return request({ + url: '/group/list', + method: 'get', + params: query + }) +} + +export function fetchMemberList(id) { + return request({ + url: '/group/getMembers', + method: 'get', + params: { id } + }) +} + +export function fetchPv(pv) { + return request({ + url: '/article/pv', + method: 'get', + params: { pv } + }) +} + +export function createArticle(data) { + return request({ + url: '/article/create', + method: 'post', + data + }) +} + +export function updateArticle(data) { + return request({ + url: '/group/addGroup', + method: 'post', + data + }) +} + +export function deleteGroup(id) { + return request({ + url: '/group/delete', + method: 'get', + params: { id } + }) +} diff --git a/src/api/login.js b/src/api/login.js index a64935c3..cbdf25bd 100644 --- a/src/api/login.js +++ b/src/api/login.js @@ -1,21 +1,22 @@ import request from '@/utils/request' -export function loginByUsername(username, password) { +export function loginByUsername(username, password, fid) { const data = { username, - password + password, + fid } return request({ - url: '/login/login', - method: 'post', - data + url: '/user/login', + method: 'get', + params: data }) } export function logout() { return request({ - url: '/login/logout', - method: 'post' + url: '/user/logout', + method: 'get' }) } diff --git a/src/api/user.js b/src/api/user.js new file mode 100644 index 00000000..10f1c4a4 --- /dev/null +++ b/src/api/user.js @@ -0,0 +1,222 @@ +import request from '@/utils/request' + +export function fetchTeacherList(query) { + return request({ + url: '/teacher/list', + method: 'get', + params: query + }) +} + +export function fetchStuList(query) { + return request({ + url: '/student/list', + method: 'get', + params: query + }) +} + +export function fetchGroupList(query) { + return request({ + url: '/group/list', + method: 'get', + params: query + }) +} + +export function updateTeacher(data) { + return request({ + url: '/teacher/update', + method: 'post', + data + }) +} + +export function deleteTeacher(query) { + return request({ + url: '/teacher/delete', + method: 'get', + params: query + }) +} + +export function fetchList(query) { + return request({ + url: '/user/list', + method: 'get', + params: query + }) +} + +export function fetchArticle(id) { + return request({ + url: '/article/detail', + method: 'get', + params: { id } + }) +} + +export function fetchPv(pv) { + return request({ + url: '/article/pv', + method: 'get', + params: { pv } + }) +} + +export function createStudent(data) { + return request({ + url: '/student/update', + method: 'post', + data + }) +} + +export function saveArticle(data) { + return request({ + url: '/ueditor/save', + method: 'post', + data + }) +} + +export function fetchGradeList(query) { + return request({ + url: '/grade/list', + method: 'get', + params: query + }) +} + +export function fetchClassList(query) { + return request({ + url: '/class/list', + method: 'get', + params: query + }) +} + +export function updateStudent(data) { + return request({ + url: '/student/update', + method: 'post', + data + }) +} + +export function updateGrade(data) { + return request({ + url: '/grade/update', + method: 'post', + data + }) +} + +export function fetchUploadUserList(query) { + return request({ + url: '/ueditor/getUploadUserList', + method: 'get', + params: query + }) +} + +export function downloadFile(url, name) { + var data = window.UEDITOR_HOME_URL + 'ueditor/download?url=' + url + '&name=' + name + window.location.href = data +} + +export function downloadZip(articleId, name) { + var data = window.UEDITOR_HOME_URL + 'ueditor/downloadZip?articleId=' + articleId + '&name=' + name + window.location.href = data +} + +export function deleteAttachment(query) { + return request({ + url: '/ueditor/deleteAttachment', + method: 'get', + params: query + }) +} + +export function fetchCourseList(query) { + return request({ + url: '/course/list', + method: 'get', + params: query + }) +} + +export function deleteStudent(data) { + return request({ + url: '/student/del', + method: 'post', + data + }) +} + +// 删除年级 +export function deleteGrade(id) { + return request({ + url: '/grade/del/' + id, + method: 'get' + }) +} + +export function fetchScheduleList(query) { + return request({ + url: '/course/schedule', + method: 'get', + params: query + }) +} + +export function fetchCourseByClassId(classId) { + return request({ + url: '/course/' + classId, + method: 'get' + }) +} + +export function updateSchedule(data) { + return request({ + url: '/course/update', + method: 'post', + data + }) +} + +// 根据fid,获取xy_school学校表信息 +export function fetchSchool(query) { + return request({ + url: '/system/school', + method: 'get', + params: query + }) +} + +// 更新学校消息 +export function updateSchool(data) { + return request({ + url: '/system/update', + method: 'post', + data + }) +} + +// 获取微信模板列表 +export function fetchTemplateList(query) { + return request({ + url: '/system/templateList', + method: 'get', + params: query + }) +} + +// 为班级添加课程 +export function addCourseClass(data) { + return request({ + url: '/teacher/addCourseClass', + method: 'post', + data + }) +} diff --git a/src/assets/iconfont/iconfont.css b/src/assets/iconfont/iconfont.css new file mode 100644 index 00000000..5fc771f7 --- /dev/null +++ b/src/assets/iconfont/iconfont.css @@ -0,0 +1,88 @@ + +@font-face {font-family: "iconfont"; + src: url('iconfont.eot?t=1542515120946'); /* IE9*/ + src: url('iconfont.eot?t=1542515120946#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'), + url('iconfont.ttf?t=1542515120946') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ + url('iconfont.svg?t=1542515120946#iconfont') format('svg'); /* iOS 4.1- */ +} + +.iconfont { + font-family:"iconfont" !important; + font-size:19px; + font-style:normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon { + width: 1.2em; height: 1.2em; + vertical-align: -0.15em; + fill: currentColor; + overflow: hidden; +} + +.icon-icon:before { content: "\e656"; } + +.icon-zan:before { content: "\e600"; } + +.icon-weixin:before { content: "\e73b"; } + +.icon-QQ:before { content: "\e73e"; } + +.icon-gerenxinxiyebanzhurenlaoshi:before { content: "\e65d"; } + +.icon-pingjiabaogao:before { content: "\e611"; } + +.icon-gonggao:before { content: "\e61b"; } + +.icon-gerenzhongxin_banzhulaoshi:before { content: "\e69e"; } + +.icon-gerenxinxi_laoshidianhua:before { content: "\e69f"; } + +.icon-fanhui:before { content: "\e624"; } + +.icon-shuoming:before { content: "\e628"; } + +.icon-jiantoushang:before { content: "\e62c"; } + +.icon-jiantoushang1:before { content: "\e62d"; } + +.icon-jiantouyou:before { content: "\e62e"; } + +.icon-jiantouxia:before { content: "\e62f"; } + +.icon-saoyisao:before { content: "\e630"; } + +.icon-wode:before { content: "\e631"; } + +.icon-shouye:before { content: "\e632"; } + +.icon-xiaoxi:before { content: "\e633"; } + +.icon-sousuo:before { content: "\e634"; } + +.icon-laoshiguanli:before { content: "\e69d"; } + +.icon-pingjia:before { content: "\e641"; } + +.icon-huanyihuan:before { content: "\e653"; } + +.icon-tongzhi:before { content: "\e7a1"; } + +.icon-zan1:before { content: "\e76c"; } + +.icon-nvlaoshi:before { content: "\e610"; } + +.icon-nanlaoshi:before { content: "\e612"; } + +.icon-daohangdizhi:before { content: "\e65e"; } + +.icon-gongzuobaogao:before { content: "\e635"; } + +.icon-jiarushujia:before { content: "\e60f"; } + +.icon-gonggao1:before { content: "\e670"; } + +.icon-baogaoxiazai:before { content: "\e705"; } + diff --git a/src/assets/iconfont/iconfont.eot b/src/assets/iconfont/iconfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..58c75a4e734fe7e9f72975310299b0801bd28637 GIT binary patch literal 11300 zcmd^l37Z_nm0-MxJgTye%&e-+tggGdu2vt_ca?kYCtoO6c=V8t9dF+;Ff!X2n;LrZnmD(4X z)gUm-{(!B@h68@t^WDbBeCxAn1*1P3Ta;F-L?5D@y z`lNON(#Qn4ip-E{vfIh$upvk`kTJ4{93Ycqgv?@%Nw#3kEZL9P95+KcNttwD%jZ3h z)%>MCa)dC_asI~5%OAJD{Q*`k#@glUHnw;5U3cM0EZ>0TEmuvA?ESad?f;Im*@UC~ z>phc)cE3FJ)+s`yK0>mI@v)K7@Y?M&i2E+4$~acYZworY&tuAuPt6@X!dnRZ9J3>n zGgpn=e(Xy&A>tpgynJfp;9ls10JcZ5oS7b(8XMST-$+Pl8@_XD@67(WrEmWWuFay; zi1P#=J3Dgr2)Rtyi}*yqN`61*mvL&a_O0VTWml+u9}yp7;qRB0^7tqBvo{HZ-GgOM zom_5D82}RESWc}%6ok$?Ww%`+Dbh+{c-5Ls_@vvh+X9mldq%LXUcxrs3RnX~s@Gy! zkl_RoiHClLzJ|5O-8;NTx&WX3glDkrQ@{1QSB{dQd2;3(?)-7=HzPuQ_WV^}m~gfD zihUu@|ErHLXvZcI6X$o70{$8ra>oXKtmUI@#XGJh)(Z}=8W}(lY~RCeM81EUrIdsdcQ@I@aZg_28$m@GW2b1CqyobN$~( z-2VU>Aj?1gb0Q>31JW!;WE`=N`0*b=!BbJ7bmWdONe~0Y4sgzKJv zg+$@>{{Q{w=L>+m?*1~IhHm1LHLtn}SDMUgZo)Mu^Qbv^;u15Da>x_Xfy~Fn7wP zGXJ2Pke|r>*WJYR$^1iZLLMV$@Ohq)+sK)vZsJmRX24Bc^3F`U33(BFG+up^YRw?r=Bj)eV%{ymc8#QdzJ6_uJpYdNCj^RKCkwu z$23LzD)zwNP1sAchN~7OS(GGPAqaw;0!uEK-2+f91C*hs(q%>@tFh<;-G2d4^1Ye} zyEbnJwW%3Fv1VVRMk1+5J~UErp6{nUdVym7+2WLZMsF(SNdks2PR^O9cgv$xKgZKMaIDUL}^){RxlH z%49Q%Ri&2H!Q`U0^rNZXW)s4N_L#SMP}4lo8}ofdDR|7=Ub}DK-eqRSlm$3X&BRr; z!IC4#1~UN)8LOwfA)9Dq_O5hGa}vIuDO)X-bWg0K7@?gVJ-1Y|eXBC|kD}Q%@HM`l zle0%~M>~RZ_o8HQJrzgp%#n7ol59pAkhDk&=iB%!hBEe-S z$wD_I3#+w$exDBZR^ zj{?GZ!d)XDt_j!DAJ3La#gfCsoC|P%#l{7o!q*^(9F5#kEmo?%?s^z0hviL)l5+;a zr|6NQeyV9P%_AqHEv;S_WS+K`hNR@x;;JV2qCNqHMwNjM8;1rrQjM};4y)La&(7*r zS+kU^;VG)V0D$fl1g{Pd@Toc5HJ4vUc1wl-TSGWoEcI}qsdibFs& zzKVi`m(yrk1JuH5lo{+7uTrBVOD3Fnl7`@VI8hjyI0rm5r)c2}-_u~$%7e--YJ zM*h(k*lGG%nx-3qSzXDrM1-77nNKjh=3;eCAOx1eg2OSbH6-iQL#bfkqM8kwZpM1( zjXQVVNSz$+q2m`{JWk!*&%RtA$Jm$Q$&UwugZlGN#7mX9bj1{SbrlJ9aKf8c`-Yij zq-4+9Mf%D{Awq*jAOb!}r}cvAiFqR(%Kr>Nyq(4R!v3P}F$68<*F!SPuxzG;^g}&+ z_IdUc8%FIeBMnv3Pe>S54^L3PhjC#|OGcTNaYY*?6*yHQW_MR*5XG-jwU8FT!2#$g zu0DSJqvOYc9zXt@o?MC^sBF!6!BCCBlIPxfZi%1=Gy}xU*2LS;x@_I8he+u;y%2N945Dt|3JP*{)Rk89w$$d@1O_vWAaP#Tk<~nJ^2%^J8Cb! zm9>K-naDRNmc^1(T#+=jnAhlE^WmPtK9}BG|t6J*K zRWY{^otLV}5oJLBwyKq)T*5Koknr791#IrYm-F_V#BwDW(Gi2c#q9?+c;a{XzY%0W zh2W5=c8s!SL3y@U9F*C{!$KPf7hGTbdRgt4fo{Elidm`+1{lq@?x4ZPR1^}*8cU+= zGtD_x6zo^UZi&+TiB73m*c$S9QISJy0{nLx>x(H0!C_H=MWLyUa5x1_3125av;S+R zsg%8kfyy3W6w*Jw^&eSrhn5bkZT;4+hcYR%*T3D@CX}AMCN{JAhSJSnzSML1{b3_Y z<35k~>NL>Q^{5#Hv;+_i!00B}s_5}fN@??CsrkwdrdGNy6JYBmU{bk-HEoh_2VCSFefnDa ze?*3TrO0Zumt;S?87na<;y&g zFiJ~MQKoWWt-UGYk$fOV!_7&`F1gHNs-o#ppo;y5Z#WW)bbrzb_XEzp&Q7up)RYz} zkt#W#Y{d}Cb>t{Hj^+^P$c2&s*}Brm;vS@zfuZinmVq04)ocokFxrSEeE`r(G%d6Q zQK51j!;MD7Ddrfqb7Z$2Z68#-I^X`>?s6>GSnNl`x7v-B2I@B~J9Z=*!ng%SOf)Ic z?#jU~_%)chs{IW7bM2)_JRYG#kvKqnFmBjWMm%o7Jx08x_EM}7AlE>L@SdwZ5{yKG zbSM}Jt2^weSS}ZXdty06us5nu{txc8l}i5`#mnj{0r)?=D!YLDrr`JC79_ddom zXo4&3msu0a1NEY+t`$*+@lM~gQg){cL$76^M$ z``^VR^zt_Q)npMKwsiYd-2$+5TvDs{ZCS$g!7=cg*K9QL>hp*Ec%kazKGE4D^pET) z*J56fB4{t->Xe|^Q-w+y=#T7SD+=H9n3~64?vddIpC`?(v-=u`8tn5uy5WImJ*F34 z_NCD!boUw8w#$+>vc$3PoGk_Q4Bu)bq#e@9HRX{wNb257xJXK9?4rpl5pL(YxGAVM zq634Bz+D*lwLet35a7ZJ<_-BMo!PSGO95r)CWz*v0L`DV{@#4*Ls9(jDL40r{dk3< zQP_#v{DNxb0!lBagc=$`TdtFZJ)5`O8gA#M%^|ydj*-kw+w~uJ^3;dBeGx0-i{`n` z$8|&h>nC)Sd!B{H65mSsItLx|3%5w*Jy*Z8uf{|6E2``l!=nAP-lpp`02i5qE0@M# zi6-h^b5w_Y9zhoEdvyrtts$6<#UK^4?+vwvM0CJ8jsA)e*229NJT3CW613s$j_E&YW(di}KZQqOC=df^*-l)TpP-{-q>{rae+;F%3biHq!$18M# zd;NSK#Q`)^_~^T;&Mah*N?kcBt?ag+*Tr0$4i|~4SI5ruww$Qjue7XTFxm~1q1Hw$ z-YZIIP)~-$T&r&1a~_)dE>HY|{XLF9?07+!;FP#XE(jxVW`K+cA~@-_TMHx1R^_@s_Dm;0bb z>McjO6do~4Db3&zYj*O5*4udLHje)*4(-EUu(!h;K8&^a25`jqNWFV4T{P`Cuxq^P zbN)6v!qz%=|004h0zOBa0L}=R1OY6fM4-&~4AAZ@R-<0Y;nX=s7M)WeI139E2nVBoK1eHLxi4Kxz^6wGV>* zLAWPue*lB+yWapU@IXKVc!O?TX760KmBzhM$qU=nQgca#?UG-Yfh4$!O`Ijr-v-w~ zI25u!u)osQ4?s9Yp0S^F=>u!xUMb2S)-=_ARM!0{KYSkVvwK*E6fsJ&1Sx@I&RK?| zS9sV##sQ-t#5alFY7VE?%URKYY(I3mRO&Qbznx}oc?1oOQZN(>{#@DG-@jG)Ifrp? zW{=zwN`&lRP?O!iZ{Ph4#=qz6>OMg5SHjU})JFbb?Wtc0 zv-dG}->hK&CewsrGgaPyS92es}T| z&rjX;eL?vCT_<=BcPh+CdX_o4AKMo2h88eR-1YtQdduLCx7g#@OA&XIi zZ$N+HY98el9l_*lgMk`nL+1N;3HNgzxZz@qqvV{7T;NJ+UCIqNp5yMqSdi5wC;@Q&N$ic@dG*zI(m)kD@}s<$ zQ66TZKX%_Z#ycO&cLH?gYt?)Q-Hs>*x?h2lN)R6op2V&IYXXz_f{$OOL$camNdg<( zIcQ4|P%gcev1>2oolW1(*xl1g!0|U-T^T`*oJ1=MqhuFwbFxrTB8cC0@WQg(paWwBe{wN)gzJ!gK8<%GrW)YD0`yR>fcP!3Vt-)9a$X? z+n3VYHhRpHY3RS&{sH`;O_o>7x>SCMD@&`nnyS5#sy163f(=~c>{F-(wN%M;lHg)h?|dW(AAM))**-w?$I^a?mY7bJ(fxo}hzp1IMC6?DrF#Lf5En+aY~d&$XqJ^V z`CiZC0PnB|Sr#MNJl=X49`W&Aj2oI<988IGtUID0AFUhH3uns|V*nK%z_e0Gv|^BQ zS>fImI@_q`!Eu?~ZY;xb*Mh)YJU(5C_zb}RPra6wS{F5lSPle+A(;v)aCVxvJlh_pU3AB z1iv@HR3so3E}@jwzIEY+q26BjCp69NV^%6=z}?ZTx3Rf>MN7h`#Pnv5koBb-x>AW| zDJ7=Mn%hXIVyR>yt!0?LHo}%b7!a+eQ+89FOapLc?E7>ZP@?MMwUP|W3 z_2d@v5P6EciqQhpwHW2Aaz|%?;-1UU1(HoeDqwXHS)!!(lxZm!#CiH#9!BdNBRgGO#`t#6 z&lGx!1>EFuW6$ABJ9stXclQ)=Cq=T9x>2(?a@~$dxtPI)-j2h^4tMN@hUm5>OTSrrpWU}_-+lJ)$CA0#<>ayW ztAW6)@rK6620@IB4PQDu77+z3+Bch7(JLWODIr;gcvBpL`P20}MMq9^>vEf7`Cz?y z6?ikL!V-9NXl_S4K>LolA$$9hLMr18C*vMwG;8o^-{h873`1<0?6bFP%?9(tHC-(X z!K2P3ocY+>hYG6BMubyG5yT%ndh`^YUN{q2W^Z3n)O1}du7F3~8UFdEecU|Q_l{wj z#w%^od2803C$&MgJBx^s!uXFcVgraLq@32EZnsVb#MbvD{YOulq zzpqK8Lc&1Jq7-AI(3yzQwagy~aBOdJNB4$uL2ZmB<8f2=`@`_n#tojZeJ1;tJo_NBCmzu(aONwYE`Ie>j5^%cRYYmd+8u~YGmLKr#=bbSFMfSvYt z|7$?g{g`S0uKQ2mEr1ye*zfRa$YM@^py>)k!$$d{ctFL-wI3pdj#%y50ykd^^nyZX z?OCls!|NoXN6`_}j<~ld9=zi@_SuIqwtXe8v3q*O=Zj`NkG^qr&vz*9EMcIIofF34 zdoeBw>IIA;J#4?keH|FW{1m1H7GAS4Km+P)uYroEbsxU=#CwA9-V;s^S8|L*=;8V! zLH@Y??z!0bG`oHQAD?pUvsc(Emc*0RrDPeNuWd)l@gy|>9-f~A)3?)sP$-agbL^-#ohTL)^zKAq zD9l^J*cIMF`(|sC0PouPdDO0OJdD?2_l9cS@pE5fZ=>H>B|`+i+bY!g&7ndmSK$!_ zoPEUNYk<^o9N-piU1LlMk+2GnQ}Jk>la>=Xj0Lp8kicoE+u7Ah7Y5YHW=_z}gPQ?1 z52EjTVruFH`o(UUlQ}qa$$@~fVXgM~m%jA4wswOOIAH%R*2hDkd#1fHWzM6So)z2| z9`YJ096@r^O@rvfD?aQA`|~LnZW-J}dBf=X^|v(K_z+_c-Pmx;`t_r>%OCc$(+c&@ zc}(52;urj#Zw$#Ae*D2tWZrfobO`ebzOC`xgC!TH=;bEsFvI$M9TpJA@5&r}5qZ9+ z4og@+Scet#i_fpaK8$J2;>v@7UxlDfxUCKYe!=oz>M+HxTwbih4C{YVhXsV+s>32N z$p>{4 z&&};Uuf3hWh}V~|nwdfqVg*in48MGw!+exv$S!gS^Ur=Ksr*IFr@xx~EdFQ9pZ`VW zXR*%5F-$w(UVe5w`^mL<0MUh`oWpN7Gni)4ahpPDRsBoOG5mgW65$Nl>$F{s{al6E zWiswOwHJ>|+ws5f<>vx^+4&-LiZcrCL(UJ+KR)-D0SXKR5b*;G89d+x1&^Tp5I`po z9XgDch9C?PFu=t9Dhdq{gE%BGsKSr#GLR(#CmTCFGA&&A9H$`^QJ7_bBzkp_u~<;K7Lz&;F5_ zLlc+@*UgNMN&ClV4jdYjuwmxlgtQ+YJuu^U-?8Vw$n@ldTpz50ubVzJ!E<>I$9Q;r zLcke!dZw>+(Y@1%?#$0WIx@otFgk%q0Y1IM2WH&K`fyCMIJ^UR_tYoe>37?342MT1 H91{H>KjNT{ literal 0 HcmV?d00001 diff --git a/src/assets/iconfont/iconfont.js b/src/assets/iconfont/iconfont.js new file mode 100644 index 00000000..f6448cef --- /dev/null +++ b/src/assets/iconfont/iconfont.js @@ -0,0 +1 @@ +(function(window){var svgSprite='';var script=function(){var scripts=document.getElementsByTagName("script");return scripts[scripts.length-1]}();var shouldInjectCss=script.getAttribute("data-injectcss");var ready=function(fn){if(document.addEventListener){if(~["complete","loaded","interactive"].indexOf(document.readyState)){setTimeout(fn,0)}else{var loadFn=function(){document.removeEventListener("DOMContentLoaded",loadFn,false);fn()};document.addEventListener("DOMContentLoaded",loadFn,false)}}else if(document.attachEvent){IEContentLoaded(window,fn)}function IEContentLoaded(w,fn){var d=w.document,done=false,init=function(){if(!done){done=true;fn()}};var polling=function(){try{d.documentElement.doScroll("left")}catch(e){setTimeout(polling,50);return}init()};polling();d.onreadystatechange=function(){if(d.readyState=="complete"){d.onreadystatechange=null;init()}}}};var before=function(el,target){target.parentNode.insertBefore(el,target)};var prepend=function(el,target){if(target.firstChild){before(el,target.firstChild)}else{target.appendChild(el)}};function appendSvg(){var div,svg;div=document.createElement("div");div.innerHTML=svgSprite;svgSprite=null;svg=div.getElementsByTagName("svg")[0];if(svg){svg.setAttribute("aria-hidden","true");svg.style.position="absolute";svg.style.width=0;svg.style.height=0;svg.style.overflow="hidden";prepend(svg,document.body)}}if(shouldInjectCss&&!window.__iconfont__svg__cssinject__){window.__iconfont__svg__cssinject__=true;try{document.write("")}catch(e){console&&console.log(e)}}ready(appendSvg)})(window) \ No newline at end of file diff --git a/src/assets/iconfont/iconfont.svg b/src/assets/iconfont/iconfont.svg new file mode 100644 index 00000000..90bf5463 --- /dev/null +++ b/src/assets/iconfont/iconfont.svg @@ -0,0 +1,122 @@ + + + + + +Created by iconfont + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/iconfont/iconfont.ttf b/src/assets/iconfont/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b9251ea96a99923ceea4965f3b18bb676e480a05 GIT binary patch literal 11132 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 h(App) }) +window.UEDITOR_HOME_URL = process.env.BASE_API + '/' diff --git a/src/mock/article.js b/src/mock/article.js index 45923ddd..11a4bcbe 100644 --- a/src/mock/article.js +++ b/src/mock/article.js @@ -13,6 +13,7 @@ for (let i = 0; i < count; i++) { timestamp: +Mock.Random.date('T'), author: '@first', reviewer: '@first', + fileList: [], title: '@title(5, 10)', content_short: '我是测试数据', content: baseContent, diff --git a/src/mock/grade.js b/src/mock/grade.js new file mode 100644 index 00000000..9f870a99 --- /dev/null +++ b/src/mock/grade.js @@ -0,0 +1,43 @@ +import Mock from 'mockjs' + +const List = [] +const count = 3 +const Random = Mock.Random +for (let i = 0; i < count; i++) { + List.push(Mock.mock({ + id: '@id', + timestamp: +Mock.Random.date('T'), + name1: Random.ctitle(2, 4), // 班级名称 + school: Random.ctitle(2, 4) + '小学', // 所在学校 + name: Random.date('yyyy') + '级' + Random.integer(1, 20) + '班'// 年级+班级 + })) +} + +const stuList = [] +for (let i = 0; i < 40; i++) { + stuList.push(Mock.mock({ + id: '@id', + timestamp: +Mock.Random.date('T'), + name: '@cname', // 名字 + city: '@city', + address: '@province' + '@city' + '@county', + tel: /^1[385][1-9]\d{8}/, + school: Random.ctitle(2, 4) + '小学', // 所在学校 + grade: Random.date('yyyy') + '级' + Random.integer(1, 20) + '班'// 年级+班级 + })) +} + +export default { + getClassList: () => { + return { + total: List.length, + result: List + } + }, + fetchStuList: () => { + return { + total: stuList.length, + result: stuList + } + } +} diff --git a/src/mock/index.js b/src/mock/index.js index 3e00e918..011bda21 100644 --- a/src/mock/index.js +++ b/src/mock/index.js @@ -1,15 +1,16 @@ import Mock from 'mockjs' import loginAPI from './login' import articleAPI from './article' +import grade from './grade' import remoteSearchAPI from './remoteSearch' import transactionAPI from './transaction' -// 修复在使用 MockJS 情况下,设置 withCredentials = true,且未被拦截的跨域请求丢失 Cookies 的问题 -// https://github.com/nuysoft/Mock/issues/300 +// * 修复 Mock 情况下,设置 withCredentials = true,且未被拦截的跨域请求丢失 Cookies 的问题。 +// 请求中丢失session,导致每次请求sessionId不同 Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send Mock.XHR.prototype.send = function() { if (this.custom.xhr) { - this.custom.xhr.withCredentials = this.withCredentials || false + this.custom.xhr.withCredentials = this.withCredentials || true } this.proxy_send(...arguments) } @@ -19,9 +20,9 @@ Mock.XHR.prototype.send = function() { // }) // 登录相关 -Mock.mock(/\/login\/login/, 'post', loginAPI.loginByUsername) +// Mock.mock(/\/user\/login/, 'post', loginAPI.loginByUsername) Mock.mock(/\/login\/logout/, 'post', loginAPI.logout) -Mock.mock(/\/user\/info\.*/, 'get', loginAPI.getUserInfo) +// Mock.mock(/\/user\/info\.*/, 'get', loginAPI.getUserInfo) // 文章相关 Mock.mock(/\/article\/list/, 'get', articleAPI.getList) @@ -36,4 +37,10 @@ Mock.mock(/\/search\/user/, 'get', remoteSearchAPI.searchUser) // 账单相关 Mock.mock(/\/transaction\/list/, 'get', transactionAPI.getList) +// 根据uid获取对应班级列表。学生有一个班级,老师有多个 +// Mock.mock(/\/class\/list/, 'get', grade.classList) +// 根据uid获取班级信息 +// Mock.mock(/\/class\/\w*/, 'get', grade.getClassList) +// 根据班级ID,获取学生信息 +Mock.mock(/\/stu\/\w*/, 'get', grade.fetchStuList) export default Mock diff --git a/src/mock/login.js b/src/mock/login.js index b9694f09..e92fc246 100644 --- a/src/mock/login.js +++ b/src/mock/login.js @@ -1,34 +1,35 @@ -import { param2Obj } from '@/utils' +// import { param2Obj } from '@/utils' -const userMap = { - admin: { - roles: ['admin'], - token: 'admin', - introduction: '我是超级管理员', - avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif', - name: 'Super Admin' - }, - editor: { - roles: ['editor'], - token: 'editor', - introduction: '我是编辑', - avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif', - name: 'Normal Editor' - } -} +// const userMap = { +// admin: { +// roles: ['admin'], +// token: 'admin', +// introduction: '我是超级管理员', +// avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif', +// name: 'Super Admin' +// }, +// editor: { +// roles: ['editor'], +// token: 'editor', +// introduction: '我是编辑', +// avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif', +// name: 'Normal Editor' +// } +// } export default { - loginByUsername: config => { - const { username } = JSON.parse(config.body) - return userMap[username] - }, - getUserInfo: config => { - const { token } = param2Obj(config.url) - if (userMap[token]) { - return userMap[token] - } else { - return false - } - }, - logout: () => 'success' + // loginByUsername: config => { + // debugger + // const { username } = JSON.parse(config.body) + // return userMap[username] + // }, + // getUserInfo: config => { + // const { token } = param2Obj(config.url) + // if (userMap[token]) { + // return userMap[token] + // } else { + // return false + // } + // }, + // logout: () => 'success' } diff --git a/src/permission.js b/src/permission.js index e556cb00..14689b66 100644 --- a/src/permission.js +++ b/src/permission.js @@ -9,7 +9,9 @@ NProgress.configure({ showSpinner: false })// NProgress Configuration // permission judge function function hasPermission(roles, permissionRoles) { - if (roles.indexOf('admin') >= 0) return true // admin permission passed directly + if (roles.includes(1) || roles.includes(0)) { + return true // admin permission passed directly + } if (!permissionRoles) return true return roles.some(role => permissionRoles.indexOf(role) >= 0) } @@ -26,7 +28,7 @@ router.beforeEach((to, from, next) => { } else { if (store.getters.roles.length === 0) { // 判断当前用户是否已拉取完user_info信息 store.dispatch('GetUserInfo').then(res => { // 拉取user_info - const roles = res.data.roles // note: roles must be a array! such as: ['editor','develop'] + const roles = res.data.result.roles // note: roles must be a array! such as: ['editor','develop'] store.dispatch('GenerateRoutes', { roles }).then(() => { // 根据roles权限生成可访问的路由表 router.addRoutes(store.getters.addRouters) // 动态添加可访问路由表 next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record @@ -49,7 +51,7 @@ router.beforeEach((to, from, next) => { } } else { /* has no token*/ - if (whiteList.indexOf(to.path) !== -1) { // 在免登录白名单,直接进入 + if (whiteList.indexOf(to.path) !== -1 || (to.meta.title && to.meta.title === 'notice')) { // 在免登录白名单,直接进入 next() } else { next(`/login?redirect=${to.path}`) // 否则全部重定向到登录页 diff --git a/src/router/index.js b/src/router/index.js index f42046ee..9b5c03d7 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -6,12 +6,6 @@ Vue.use(Router) /* Layout */ import Layout from '@/views/layout/Layout' -/* Router Modules */ -import componentsRouter from './modules/components' -import chartsRouter from './modules/charts' -import tableRouter from './modules/table' -import nestedRouter from './modules/nested' - /** note: Submenu only appear when children.length>=1 * detail see https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html **/ @@ -58,6 +52,12 @@ export const constantRouterMap = [ component: () => import('@/views/errorPage/404'), hidden: true }, + { + path: '/notice/:id(\\d+)', + component: () => import('@/views/notice/show'), + hidden: true, + meta: { title: 'notice', icon: 'notice', noCache: true } + }, { path: '/401', component: () => import('@/views/errorPage/401'), @@ -112,258 +112,227 @@ export default new Router({ export const asyncRouterMap = [ { - path: '/permission', + path: '/notice', component: Layout, - redirect: '/permission/index', - alwaysShow: true, // will always show the root menu + redirect: '/notice/list', + name: 'Notice', meta: { - title: 'permission', - icon: 'lock', - roles: ['admin', 'editor'] // you can set roles in root nav - }, - children: [ - { - path: 'page', - component: () => import('@/views/permission/page'), - name: 'PagePermission', - meta: { - title: 'pagePermission', - roles: ['admin'] // or you can only set roles in sub nav - } - }, - { - path: 'directive', - component: () => import('@/views/permission/directive'), - name: 'DirectivePermission', - meta: { - title: 'directivePermission' - // if do not set roles, means: this page does not require permission - } - } - ] - }, - - { - path: '/icon', - component: Layout, - children: [ - { - path: 'index', - component: () => import('@/views/svg-icons/index'), - name: 'Icons', - meta: { title: 'icons', icon: 'icon', noCache: true } - } - ] - }, - - /** When your routing table is too long, you can split it into small modules**/ - componentsRouter, - chartsRouter, - nestedRouter, - tableRouter, - - { - path: '/example', - component: Layout, - redirect: '/example/list', - name: 'Example', - meta: { - title: 'example', + title: 'notice', icon: 'example' }, children: [ { path: 'create', - component: () => import('@/views/example/create'), - name: 'CreateArticle', - meta: { title: 'createArticle', icon: 'edit' } + component: () => import('@/views/components-demo/uEditor'), + name: 'CreateNotice', + meta: { title: 'createNotice', icon: 'edit' } }, { path: 'edit/:id(\\d+)', - component: () => import('@/views/example/edit'), - name: 'EditArticle', - meta: { title: 'editArticle', noCache: true }, + component: () => import('@/views/components-demo/uEditor'), + name: 'EditNotice', + meta: { title: '公告编辑', noCache: true }, hidden: true }, { path: 'list', - component: () => import('@/views/example/list'), - name: 'ArticleList', - meta: { title: 'articleList', icon: 'list' } + component: () => import('@/views/notice/list'), + name: 'NoticeList', + meta: { title: 'noticeList', icon: 'list' } } ] }, { - path: '/tab', + path: '/laoshiguanli', component: Layout, children: [ { path: 'index', - component: () => import('@/views/tab/index'), - name: 'Tab', - meta: { title: 'tab', icon: 'tab' } + component: () => import('@/views/teacher/complexTable'), + name: 'laoshiguanli', + meta: { title: 'laoshiguanli', icon: 'laoshiguanli' } } ] }, - { - path: '/error', + path: '/nianjiguanli', component: Layout, - redirect: 'noredirect', - name: 'ErrorPages', + children: [ + { + path: 'index', + component: () => import('@/views/grade/complexTable'), + name: 'nianjiguanli', + meta: { title: 'nianjiguanli', icon: 'nianjiguanli' } + } + ] + }, + { + path: '/xueshengguanli', + component: Layout, + children: [ + { + path: 'index', + component: () => import('@/views/student/complexTable'), + name: 'xueshengguanli', + meta: { title: 'xueshengguanli', icon: 'xueshengguanli', noCache: true } + } + ] + }, + { + path: '/myclass', + component: Layout, + children: [ + { + path: 'index', + component: () => import('@/views/myclass/index'), + name: '执教班级', + meta: { title: '执教班级', icon: 'tab' } + } + ] + }, + { + path: '/group', + component: Layout, + redirect: '/group/index', + children: [ + { + path: 'index', + component: () => import('@/views/group/index'), + name: 'group', + meta: { title: 'group', icon: 'group' } + } + ] + }, + { + path: '/leave', + component: Layout, + redirect: '/leave/list', + name: 'Leave', meta: { - title: 'errorPages', - icon: '404' + title: '请假', + icon: 'qingjia' }, children: [ { - path: '401', - component: () => import('@/views/errorPage/401'), - name: 'Page401', - meta: { title: 'page401', noCache: true } + path: 'create', + component: () => import('@/views/components-demo/uEditor'), + name: 'CreateLeave', + meta: { title: '创建请假', icon: 'edit' } }, { - path: '404', - component: () => import('@/views/errorPage/404'), - name: 'Page404', - meta: { title: 'page404', noCache: true } - } - ] - }, - - { - path: '/error-log', - component: Layout, - redirect: 'noredirect', - children: [ + path: 'edit/:id(\\d+)', + component: () => import('@/views/components-demo/uEditor'), + name: 'EditNotice', + meta: { title: '编辑请假', noCache: true }, + hidden: true + }, { - path: 'log', - component: () => import('@/views/errorLog/index'), - name: 'ErrorLog', - meta: { title: 'errorLog', icon: 'bug' } + path: 'list', + component: () => import('@/views/leave/list'), + name: 'LeaveList', + meta: { title: '我的请假', icon: 'list' } } ] }, - { - path: '/excel', + path: '/form', component: Layout, - redirect: '/excel/export-excel', - name: 'Excel', + redirect: '/form/list', + name: 'Form', meta: { - title: 'excel', - icon: 'excel' + title: '表单', + icon: 'biaodan' }, children: [ { - path: 'export-excel', - component: () => import('@/views/excel/exportExcel'), - name: 'ExportExcel', - meta: { title: 'exportExcel' } + path: 'create', + component: () => import('@/views/form/create'), + name: 'CreateForm', + meta: { title: '新建表单', icon: 'edit' } }, { - path: 'export-selected-excel', - component: () => import('@/views/excel/selectExcel'), - name: 'SelectExcel', - meta: { title: 'selectExcel' } + path: 'edit/:id(\\d+)', + component: () => import('@/views/components-demo/uEditor'), + name: 'EditNotice', + meta: { title: '编辑请假', noCache: true }, + hidden: true }, { - path: 'upload-excel', - component: () => import('@/views/excel/uploadExcel'), - name: 'UploadExcel', - meta: { title: 'uploadExcel' } + path: 'list', + component: () => import('@/views/leave/list'), + name: 'LeaveList', + meta: { title: '我的请假', icon: 'list' } } ] }, - { - path: '/zip', + path: '/module', component: Layout, - redirect: '/zip/download', - alwaysShow: true, - meta: { title: 'zip', icon: 'zip' }, + redirect: '/module/list', + name: 'Module', + meta: { + title: '模块管理', + icon: 'biaodan' + }, children: [ { - path: 'download', - component: () => import('@/views/zip/index'), - name: 'ExportZip', - meta: { title: 'exportZip' } + path: 'create', + component: () => import('@/views/form/create'), + name: 'CreateForm', + meta: { title: '新建模块', icon: 'edit' } + }, + { + path: 'edit/:id(\\d+)', + component: () => import('@/views/components-demo/uEditor'), + name: 'EditNotice', + meta: { title: '编辑请假', noCache: true }, + hidden: true + }, + { + path: 'list', + component: () => import('@/views/module/complexTable'), + name: 'ModuleList', + meta: { title: '模块列表', icon: 'list' } } ] }, - { - path: '/pdf', + path: '/system', component: Layout, - redirect: '/pdf/index', - meta: { title: 'PDF', icon: 'pdf' }, + redirect: '/system/list', + name: 'System', + meta: { + title: '系统管理', + icon: 'biaodan' + }, children: [ { - path: 'index', - component: () => import('@/views/pdf/index'), - name: 'PDF', - meta: { title: 'PDF' } - } - ] - }, - { - path: '/pdf/download', - component: () => import('@/views/pdf/download'), - hidden: true - }, - - { - path: '/theme', - component: Layout, - redirect: 'noredirect', - children: [ + path: 'school', + component: () => import('@/views/system/schoolForm'), + name: 'SchoolForm', + meta: { title: '系统管理', icon: 'edit' } + }, { - path: 'index', - component: () => import('@/views/theme/index'), - name: 'Theme', - meta: { title: 'theme', icon: 'theme' } - } - ] - }, - - { - path: '/clipboard', - component: Layout, - redirect: 'noredirect', - children: [ + path: 'wechatTemplate', + component: () => import('@/views/system/wechatTemplate'), + name: 'WechatTemplate', + meta: { title: '微信消息模板', icon: 'edit' } + }, { - path: 'index', - component: () => import('@/views/clipboard/index'), - name: 'ClipboardDemo', - meta: { title: 'clipboardDemo', icon: 'clipboard' } - } - ] - }, - - { - path: '/i18n', - component: Layout, - children: [ + path: 'edit/:id(\\d+)', + component: () => import('@/views/components-demo/uEditor'), + name: 'EditNotice', + meta: { title: '编辑请假', noCache: true }, + hidden: true + }, { - path: 'index', - component: () => import('@/views/i18n-demo/index'), - name: 'I18n', - meta: { title: 'i18n', icon: 'international' } + path: 'list', + component: () => import('@/views/module/complexTable'), + name: 'ModuleList', + meta: { title: '模块列表', icon: 'list' } } ] }, - - { - path: 'external-link', - component: Layout, - children: [ - { - path: 'https://github.com/PanJiaChen/vue-element-admin', - meta: { title: 'externalLink', icon: 'link' } - } - ] - }, - { path: '*', redirect: '/404', hidden: true } ] diff --git a/src/router/modules/components.js b/src/router/modules/components.js index 5fd9bd29..61aebcd9 100644 --- a/src/router/modules/components.js +++ b/src/router/modules/components.js @@ -25,10 +25,10 @@ const componentsRouter = { meta: { title: 'markdown' } }, { - path: 'json-editor', - component: () => import('@/views/components-demo/jsonEditor'), - name: 'JsonEditorDemo', - meta: { title: 'jsonEditor' } + path: 'ueditor', + component: () => import('@/views/components-demo/uEditor'), + name: 'uEditorDemo', + meta: { title: 'UEditor' } }, { path: 'splitpane', diff --git a/src/store/getters.js b/src/store/getters.js index cf314f5c..65f3ce0a 100644 --- a/src/store/getters.js +++ b/src/store/getters.js @@ -8,12 +8,15 @@ const getters = { token: state => state.user.token, avatar: state => state.user.avatar, name: state => state.user.name, + fid: state => state.user.fid, + uid: state => state.user.uid, introduction: state => state.user.introduction, status: state => state.user.status, roles: state => state.user.roles, setting: state => state.user.setting, permission_routers: state => state.permission.routers, addRouters: state => state.permission.addRouters, - errorLogs: state => state.errorLog.logs + errorLogs: state => state.errorLog.logs, + user: state => state.user } export default getters diff --git a/src/store/modules/app.js b/src/store/modules/app.js index fba4b05c..359ced7e 100644 --- a/src/store/modules/app.js +++ b/src/store/modules/app.js @@ -7,7 +7,7 @@ const app = { withoutAnimation: false }, device: 'desktop', - language: Cookies.get('language') || 'en', + language: Cookies.get('language') || 'zh', size: Cookies.get('size') || 'medium' }, mutations: { diff --git a/src/store/modules/permission.js b/src/store/modules/permission.js index 97de701e..c124e2a9 100644 --- a/src/store/modules/permission.js +++ b/src/store/modules/permission.js @@ -7,7 +7,7 @@ import { asyncRouterMap, constantRouterMap } from '@/router' */ function hasPermission(roles, route) { if (route.meta && route.meta.roles) { - return roles.some(role => route.meta.roles.includes(role)) + return roles.some(role => route.meta.roles.indexOf(role) >= 0) } else { return true } @@ -50,7 +50,7 @@ const permission = { return new Promise(resolve => { const { roles } = data let accessedRouters - if (roles.includes('admin')) { + if (data.roles.includes(1) || data.roles.includes(0)) { accessedRouters = asyncRouterMap } else { accessedRouters = filterAsyncRouter(asyncRouterMap, roles) diff --git a/src/store/modules/user.js b/src/store/modules/user.js index 38e81a36..a5784875 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -1,16 +1,19 @@ import { loginByUsername, logout, getUserInfo } from '@/api/login' +import { Message } from 'element-ui' import { getToken, setToken, removeToken } from '@/utils/auth' const user = { state: { - user: '', status: '', code: '', token: getToken(), + admin: false, name: '', + fid: '', + uid: '', + roles: [], avatar: '', introduction: '', - roles: [], setting: { articlePlatform: [] } @@ -35,6 +38,16 @@ const user = { SET_NAME: (state, name) => { state.name = name }, + SET_FID: (state, fid) => { + state.fid = fid + }, + SET_ADMIN: (state, admin) => { + state.admin = admin + }, + SET_UID: (state, uid) => { + state.uid = uid + }, + // 头像 SET_AVATAR: (state, avatar) => { state.avatar = avatar }, @@ -47,12 +60,27 @@ const user = { // 用户名登录 LoginByUsername({ commit }, userInfo) { const username = userInfo.username.trim() + userInfo.fid = 1 + const fid = parseInt(userInfo.fid) return new Promise((resolve, reject) => { - loginByUsername(username, userInfo.password).then(response => { - const data = response.data - commit('SET_TOKEN', data.token) - setToken(response.data.token) - resolve() + loginByUsername(username, userInfo.password, fid).then(response => { + if (response.data.code === 200) { + const data = response.data.result + commit('SET_TOKEN', data.token) + commit('SET_FID', fid) + commit('SET_NAME', data.name) + commit('SET_ADMIN', data.roles.includes(1)) + commit('SET_UID', data.uid) + setToken(data.token) + resolve() + } else { + Message({ + message: response.data.message, + type: 'error', + duration: 4 * 1000 + }) + resolve() + } }).catch(error => { reject(error) }) @@ -63,21 +91,18 @@ const user = { GetUserInfo({ commit, state }) { return new Promise((resolve, reject) => { getUserInfo(state.token).then(response => { - // 由于mockjs 不支持自定义状态码只能这样hack - if (!response.data) { - reject('Verification failed, please login again.') + var data = response.data.result + if (!data) { // 由于mockjs 不支持自定义状态码只能这样hack + reject('error') } - const data = response.data if (data.roles && data.roles.length > 0) { // 验证返回的roles是否是一个非空数组 commit('SET_ROLES', data.roles) } else { - reject('getInfo: roles must be a non-null array!') + reject('getInfo: roles must be a non-null array !') } - - commit('SET_NAME', data.name) - commit('SET_AVATAR', data.avatar) - commit('SET_INTRODUCTION', data.introduction) + commit('SET_AVATAR', 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif') + commit('SET_INTRODUCTION', '我是超级管理员') resolve(response) }).catch(error => { reject(error) diff --git a/src/styles/index.scss b/src/styles/index.scss index 93f2157e..1f5d999d 100644 --- a/src/styles/index.scss +++ b/src/styles/index.scss @@ -199,3 +199,47 @@ code { .multiselect--active { z-index: 1000 !important; } + +.el-table--medium td, .el-table--medium th { + padding: 3px 0; +} + +// cell-style="padding:0" +// 表格cell +.el-table td{ + padding: 0px 0; +} + +// 输入框 +.el-input--medium .el-input__inner { + height: 30px; + line-height: 30px; +} + +// 标准按钮 +.el-button--medium { + padding: 8px 10px; +} + + +#online li div span.file-title { + height: 18px; +} + +.el-form-item { + margin-bottom: 14px; +} + +.el-dialog__body { + padding: 10px 20px; + color: #606266; + font-size: 14px; +} + +.el-table--enable-row-hover .el-table__body tr:hover>td{ + background-color: #ecfffa; + } + +img { + max-width: 100%; +} \ No newline at end of file diff --git a/src/styles/schedule.css b/src/styles/schedule.css new file mode 100644 index 00000000..fe1f69af --- /dev/null +++ b/src/styles/schedule.css @@ -0,0 +1,145 @@ +body{background-color: white;} +.tr_btn { + width: 100%; + height: 35px; +} + +.td_btn { + height: 35px; + line-height: 35px; + font-family: "微软雅黑"; + font-weight: bold; +} + +.tr_top { + width: 100%; + height: 25px; +} + +.td_top_title { + width: 10%; + height: 25px; + line-height: 25px; + font-family: "微软雅黑"; + font-size: 15px;; + font-weight: bold; + text-align: center; + float: left; + color:#007BFF; +} + +.td_top_data { + width: 12%; + height: 25px; + line-height: 25px; + font-family: "楷体"; + font-size: 15px; + font-weight: bold; + text-align: center; + float: left; +} + +.td_top_data_change { + font-size: 17px; + font-family: "楷体"; + color: white; + background-color: #9FCDFF; +} + +.tr_week { + width: 100%; +} + + +.td_week_title { + width: 10%; + font-family: "微软雅黑"; + font-weight: bold; + text-align: center; + float: left; +} + +.td_week_title_content { + height: 40px; + margin-top: 2px; + background-color: #EBEBEB; + line-height: 40px; +} + + +.td_week_data { + width: 12%; + font-family: "微软雅黑"; + font-weight: bold; + float: left; +} + +.td_week_data_content:active { + color: black; + background-color: #9FCDFF; +} + +.td_week_data_content:visited { + color: black; + +} + +.td_week_data_content { + height: 40px; + padding: 2px; + margin-top:2px; + margin-left: 2px; + text-align: center; + background-color: #f0f0f0; + border-radius: 5px; + position: relative; + max-height: 40px; + overflow: hidden; +} + +.td_week_data_content::after { + /** content: "..."; */ + position: absolute; + bottom: 0; + + + right: 0; + padding-left: 20px; + /*background: -webkit-linear-gradient(left, transparent, #fff 100%); + background: -o-linear-gradient(right, transparent, #fff 100%); + background: -moz-linear-gradient(right, transparent, #fff 100%); + background: linear-gradient(to right, transparent, #fff 100%);*/ +} + + +.td_color{ + background-color: white; + border-radius: 0; +} + +.td_color::after { + content: ""; + position: absolute; + bottom: 0; + right: 0; + background: -webkit-linear-gradient(left, transparent, #fff 100%); + background: -o-linear-gradient(right, transparent, #fff 100%); + background: -moz-linear-gradient(right, transparent, #fff 100%); + background: linear-gradient(to right, transparent, #fff 100%); +} + +.td_color:active { + background-color: white; +} + +.td_color:visited { + background-color:white; +} + +.show{ + width: 100%; + height: auto; + word-wrap:break-word; + word-break:break-all; + overflow: hidden; +} diff --git a/src/styles/sidebar.scss b/src/styles/sidebar.scss index 723f9a12..e03acb77 100644 --- a/src/styles/sidebar.scss +++ b/src/styles/sidebar.scss @@ -6,6 +6,7 @@ transition: margin-left .28s; margin-left: $sideBarWidth; position: relative; + background-color: #FCFAF7; } // 侧边栏 Sidebar container diff --git a/src/styles/variables.scss b/src/styles/variables.scss index 09c3e9b0..2d4230de 100644 --- a/src/styles/variables.scss +++ b/src/styles/variables.scss @@ -12,4 +12,4 @@ $panGreen: #30B08F; $menuBg:#304156; $subMenuBg:#1f2d3d; $menuHover:#001528; -$sideBarWidth: 180px; +$sideBarWidth: 200px; diff --git a/src/utils/index.js b/src/utils/index.js index 0445827b..963ef0ef 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -3,9 +3,12 @@ */ export function parseTime(time, cFormat) { - if (arguments.length === 0) { + if (arguments.length === 0 || time == null) { return null } + if (typeof time === 'string') { + return time + } const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}' let date if (typeof time === 'object') { @@ -164,6 +167,17 @@ export function objectMerge(target, source) { return target } +export function scrollTo(element, to, duration) { + if (duration <= 0) return + const difference = to - element.scrollTop + const perTick = (difference / duration) * 10 + setTimeout(() => { + element.scrollTop = element.scrollTop + perTick + if (element.scrollTop === to) return + scrollTo(element, to, duration - 10) + }, 10) +} + export function toggleClass(element, className) { if (!element || !className) { return @@ -289,3 +303,153 @@ export function uniqueArr(arr) { export function isExternal(path) { return /^(https?:|mailto:|tel:)/.test(path) } + +// 获取d当前时间多少天后的日期和对应星期 +export function getDates(days) { + // todate默认参数是当前日期,可以传入对应时间 + var dateArry = [] + for (var i = 0; i < days; i++) { + var dateObj = dateLater(getCurrentMonthFirst(), i) + dateArry.push(dateObj) + } + return dateArry +} +/** * 传入时间后几天 * param:传入时间:dates:"2018-04-02",later:往后多少天 */ +export function dateLater(dates, later) { + var dateObj = {} + var show_day = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'] + var date = new Date(dates) + date.setDate(date.getDate() + later) + var day = date.getDay() + dateObj.year = date.getFullYear() + dateObj.month = ((date.getMonth() + 1) < 10 ? ('0' + (date.getMonth() + 1)) : date.getMonth() + 1) + dateObj.day = (date.getDate() < 10 ? ('0' + date.getDate()) : date.getDate()) + dateObj.week = show_day[day] + return dateObj +} + +// 获取当前时间 +export function getCurrentMonthFirst() { + var date = new Date() + var todate = date.getFullYear() + '-' + ((date.getMonth() + 1) < 10 ? ('0' + (date.getMonth() + 1)) : date.getMonth() + 1) + '-' + (date.getDate() < 10 ? ('0' + date.getDate()) : date.getDate()) + + return todate +} + +export function getDays() { + var data = new Date() + var setData = '' + var weeks = dateLater(data, 0).week + switch (weeks) { + case '周一': + setData = [ + dateLater(data, 0).day, + dateLater(data, 1).day, + dateLater(data, 2).day, + dateLater(data, 3).day, + dateLater(data, 4).day, + dateLater(data, 5).day, + dateLater(data, 6).day + ] + break + case '周二': + setData = [ + dateLater(data, -1).day, + dateLater(data, 0).day, + dateLater(data, 1).day, + dateLater(data, 2).day, + dateLater(data, 3).day, + dateLater(data, 4).day, + dateLater(data, 5).day + ] + break + case '周三': + setData = [ + dateLater(data, -2).day, + dateLater(data, -1).day, + dateLater(data, 0).day, + dateLater(data, 1).day, + dateLater(data, 2).day, + dateLater(data, 3).day, + dateLater(data, 4).day + ] + break + case '周四': + setData = [ + dateLater(data, -3).day, + dateLater(data, -2).day, + dateLater(data, -1).day, + dateLater(data, 0).day, + dateLater(data, 1).day, + dateLater(data, 2).day, + dateLater(data, 3).day + ] + break + case '周五': + setData = [ + dateLater(data, -4).day, + dateLater(data, -3).day, + dateLater(data, -2).day, + dateLater(data, -1).day, + dateLater(data, 0).day, + dateLater(data, 1).day, + dateLater(data, 2).day + ] + break + case '周六': + setData = [ + dateLater(data, -5).day, + dateLater(data, -4).day, + dateLater(data, -3).day, + dateLater(data, -2).day, + dateLater(data, -1).day, + dateLater(data, 0).day, + dateLater(data, 1).day + ] + break + case '周日': + setData = [ + dateLater(data, -6).day, + dateLater(data, -5).day, + dateLater(data, -4).day, + dateLater(data, -3).day, + dateLater(data, -2).day, + dateLater(data, -1).day, + dateLater(data, 0).day + ] + break + default: + break + } + if (setData !== '') { + return setData + } else { + return '' + } +} + +export function getYear() { + var Year = new Date().getFullYear() + var setData = [Year - 1, Year, Year - 2, Year - 3] + return setData +} + +export function formatMonth() { + var date = new Date() + var month = date.getMonth() + 1 + return month +} + +export function formatDay(time) { + var date = new Date() + var day = date.getDate() + if (time === day) return true + return false +} + +export function getWeeks(week) { + var data = new Date() + var weeks = dateLater(data, 0).week + if (weeks === week) return true + return false +} diff --git a/src/utils/request.js b/src/utils/request.js index 50f9ecec..0552ad2a 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -2,11 +2,14 @@ import axios from 'axios' import { Message } from 'element-ui' import store from '@/store' import { getToken } from '@/utils/auth' +import { MessageBox } from 'element-ui' // create an axios instance const service = axios.create({ baseURL: process.env.BASE_API, // api 的 base_url - timeout: 5000 // request timeout + timeout: 5000, // request timeout + // mock可能导致此属性生效。mock/index.js文件已修复 + withCredentials: true // 是否允许发送Cookie 如果为true 则服务器的 Access-control-Allow-Credentials 必须为 true 来源为 XMLHttpRequest的withCredentials配置项 }) // request interceptor @@ -16,6 +19,7 @@ service.interceptors.request.use( if (store.getters.token) { // 让每个请求携带token-- ['X-Token']为自定义key 请根据实际情况自行修改 config.headers['X-Token'] = getToken() + config.headers['UID'] = store.state.user.uid } return config }, @@ -28,40 +32,59 @@ service.interceptors.request.use( // response interceptor service.interceptors.response.use( - response => response, + // response => response, /** * 下面的注释为通过在response里,自定义code来标示请求状态 * 当code返回如下情况则说明权限有问题,登出并返回到登录页 * 如想通过 xmlhttprequest 来状态码标识 逻辑可写在下面error中 * 以下代码均为样例,请结合自生需求加以修改,若不需要,则可删除 */ - // response => { - // const res = response.data - // if (res.code !== 20000) { - // Message({ - // message: res.message, - // type: 'error', - // duration: 5 * 1000 - // }) - // // 50008:非法的token; 50012:其他客户端登录了; 50014:Token 过期了; - // if (res.code === 50008 || res.code === 50012 || res.code === 50014) { - // // 请自行在引入 MessageBox - // // import { Message, MessageBox } from 'element-ui' - // MessageBox.confirm('你已被登出,可以取消继续留在该页面,或者重新登录', '确定登出', { - // confirmButtonText: '重新登录', - // cancelButtonText: '取消', - // type: 'warning' - // }).then(() => { - // store.dispatch('FedLogOut').then(() => { - // location.reload() // 为了重新实例化vue-router对象 避免bug - // }) - // }) - // } - // return Promise.reject('error') - // } else { - // return response.data - // } - // }, + response => { + const res = response.data + if (!res.code) { + console.log('mock数据请求...' + response.data) + return response + } else if (res.code !== 200) { + // Message({ + // message: res.message, + // type: 'error', + // duration: 5 * 1000 + // }) + // 退出登录 + if (res.code === 50068) { + store.dispatch('FedLogOut').then(() => { + location.reload() // 为了重新实例化vue-router对象 避免bug + }) + } else if (res.code === 50008 || res.code === 50012 || res.code === 50014) { // 50008:非法的token; 50012:其他客户端登录了; 50014:Token 过期了; + // 请自行在引入 MessageBox + // import { Message, MessageBox } from 'element-ui' + MessageBox.confirm('你已被登出,可以取消继续留在该页面,或者重新登录', '确定登出', { + confirmButtonText: '重新登录', + cancelButtonText: '取消', + type: 'warning' + }).then(() => { + store.dispatch('FedLogOut').then(() => { + location.reload() // 为了重新实例化vue-router对象 避免bug + }) + }) + } else if (res.code === 601) { // 主键冲突 + Message({ + message: res.message, + type: 'error', + duration: 5 * 1000 + }) + } else { + Message({ + message: '其他异常: ' + res.message, + type: 'error', + duration: 5 * 1000 + }) + } + return Promise.reject() + } else { + return response + } + }, error => { console.log('err' + error) // for debug Message({ diff --git a/src/utils/validate.js b/src/utils/validate.js index ada0e7e2..eb7f5efa 100644 --- a/src/utils/validate.js +++ b/src/utils/validate.js @@ -3,8 +3,9 @@ */ export function isvalidUsername(str) { - const valid_map = ['admin', 'editor'] - return valid_map.indexOf(str.trim()) >= 0 + if (str === '') { + return '用户名不能为空!' + } } /* 合法uri*/ @@ -40,3 +41,8 @@ export function validateEmail(email) { const re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ return re.test(email) } + +export function isvalidStr(str) { + const valid_map = ['admin', 'editor'] + return valid_map.indexOf(str.trim()) >= 0 +}