├── vue-element-admin ├── .eslintignore ├── babel.config.js ├── tests │ └── unit │ │ ├── .eslintrc.js │ │ ├── components │ │ ├── SvgIcon.spec.js │ │ └── Hamburger.spec.js │ │ └── utils │ │ ├── parseTime.spec.js │ │ ├── formatTime.spec.js │ │ └── validate.spec.js ├── public │ ├── favicon.ico │ ├── static │ │ └── tinymce4.7.5 │ │ │ ├── skins │ │ │ └── lightgray │ │ │ │ ├── img │ │ │ │ ├── anchor.gif │ │ │ │ ├── loader.gif │ │ │ │ ├── object.gif │ │ │ │ └── trans.gif │ │ │ │ └── fonts │ │ │ │ ├── tinymce.eot │ │ │ │ ├── tinymce.ttf │ │ │ │ ├── tinymce.woff │ │ │ │ ├── tinymce-mobile.woff │ │ │ │ ├── tinymce-small.eot │ │ │ │ ├── tinymce-small.ttf │ │ │ │ └── tinymce-small.woff │ │ │ └── plugins │ │ │ └── emoticons │ │ │ └── img │ │ │ ├── smiley-cry.gif │ │ │ ├── smiley-cool.gif │ │ │ ├── smiley-frown.gif │ │ │ ├── smiley-kiss.gif │ │ │ ├── smiley-smile.gif │ │ │ ├── smiley-wink.gif │ │ │ ├── smiley-yell.gif │ │ │ ├── smiley-innocent.gif │ │ │ ├── smiley-laughing.gif │ │ │ ├── smiley-sealed.gif │ │ │ ├── smiley-embarassed.gif │ │ │ ├── smiley-surprised.gif │ │ │ ├── smiley-tongue-out.gif │ │ │ ├── smiley-undecided.gif │ │ │ ├── smiley-foot-in-mouth.gif │ │ │ └── smiley-money-mouth.gif │ └── index.html ├── .env.production ├── .travis.yml ├── src │ ├── assets │ │ ├── 401_images │ │ │ └── 401.gif │ │ ├── 404_images │ │ │ ├── 404.png │ │ │ └── 404_cloud.png │ │ ├── login_wraper.8ab0d297.jpg │ │ └── custom-theme │ │ │ └── fonts │ │ │ ├── element-icons.ttf │ │ │ └── element-icons.woff │ ├── views │ │ ├── nested │ │ │ ├── menu2 │ │ │ │ └── index.vue │ │ │ └── menu1 │ │ │ │ ├── menu1-3 │ │ │ │ └── index.vue │ │ │ │ ├── index.vue │ │ │ │ ├── menu1-2 │ │ │ │ ├── menu1-2-1 │ │ │ │ │ └── index.vue │ │ │ │ ├── menu1-2-2 │ │ │ │ │ └── index.vue │ │ │ │ └── index.vue │ │ │ │ └── menu1-1 │ │ │ │ └── index.vue │ │ ├── errorLog │ │ │ ├── errorTestB.vue │ │ │ ├── errorTestA.vue │ │ │ └── index.vue │ │ ├── example │ │ │ ├── components │ │ │ │ ├── Dropdown │ │ │ │ │ ├── index.js │ │ │ │ │ ├── SourceUrl.vue │ │ │ │ │ ├── Comment.vue │ │ │ │ │ └── Platform.vue │ │ │ │ └── Warning.vue │ │ │ ├── edit.vue │ │ │ └── create.vue │ │ ├── svg-icons │ │ │ ├── requireIcons.js │ │ │ └── element-icon.json │ │ ├── redirect │ │ │ └── index.vue │ │ ├── pdf │ │ │ └── index.vue │ │ ├── login │ │ │ └── authRedirect.vue │ │ ├── charts │ │ │ ├── line.vue │ │ │ ├── mixChart.vue │ │ │ └── keyboard.vue │ │ ├── permission │ │ │ ├── page.vue │ │ │ └── components │ │ │ │ └── SwitchRoles.vue │ │ ├── table │ │ │ └── dynamicTable │ │ │ │ ├── index.vue │ │ │ │ ├── unfixedThead.vue │ │ │ │ └── fixedThead.vue │ │ ├── excel │ │ │ ├── components │ │ │ │ ├── FilenameOption.vue │ │ │ │ ├── AutoWidthOption.vue │ │ │ │ └── BookTypeOption.vue │ │ │ └── uploadExcel.vue │ │ ├── dashboard │ │ │ ├── index.vue │ │ │ └── admin │ │ │ │ └── components │ │ │ │ ├── TransactionTable.vue │ │ │ │ └── TodoList │ │ │ │ └── Todo.vue │ │ ├── guide │ │ │ ├── index.vue │ │ │ └── defineSteps.js │ │ ├── components-demo │ │ │ ├── dropzone.vue │ │ │ ├── dndList.vue │ │ │ ├── dragSelect.vue │ │ │ ├── tinymce.vue │ │ │ ├── jsonEditor.vue │ │ │ ├── dragKanban.vue │ │ │ ├── avatarUpload.vue │ │ │ └── splitpane.vue │ │ ├── qiniu │ │ │ └── upload.vue │ │ ├── tab │ │ │ └── index.vue │ │ ├── clipboard │ │ │ └── index.vue │ │ ├── headImage │ │ │ └── index.vue │ │ ├── i18n-demo │ │ │ └── local.js │ │ └── documentation │ │ │ └── index.vue │ ├── App.vue │ ├── api │ │ ├── qiniu.js │ │ ├── showUser.js │ │ ├── remoteSearch.js │ │ ├── user.js │ │ ├── readPapers.js │ │ ├── role.js │ │ ├── article.js │ │ ├── examination.js │ │ ├── classes.js │ │ └── addQuestion.js │ ├── icons │ │ ├── svg │ │ │ ├── chart.svg │ │ │ ├── size.svg │ │ │ ├── link.svg │ │ │ ├── guide.svg │ │ │ ├── component.svg │ │ │ ├── money.svg │ │ │ ├── email.svg │ │ │ ├── drag.svg │ │ │ ├── guide 2.svg │ │ │ ├── documentation.svg │ │ │ ├── fullscreen.svg │ │ │ ├── user.svg │ │ │ ├── lock.svg │ │ │ ├── excel.svg │ │ │ ├── example.svg │ │ │ ├── star.svg │ │ │ ├── table.svg │ │ │ ├── search.svg │ │ │ ├── password.svg │ │ │ ├── tab.svg │ │ │ ├── message.svg │ │ │ ├── theme.svg │ │ │ ├── peoples.svg │ │ │ ├── edit.svg │ │ │ ├── nested.svg │ │ │ ├── project.svg │ │ │ ├── tree-table.svg │ │ │ ├── eye.svg │ │ │ ├── clipboard.svg │ │ │ ├── list.svg │ │ │ ├── icon.svg │ │ │ ├── sliders.svg │ │ │ ├── international.svg │ │ │ ├── wechat.svg │ │ │ ├── people.svg │ │ │ ├── language.svg │ │ │ ├── eye-open.svg │ │ │ ├── 404.svg │ │ │ ├── zip.svg │ │ │ ├── bug.svg │ │ │ ├── pdf.svg │ │ │ ├── exit-fullscreen.svg │ │ │ └── tree.svg │ │ ├── index.js │ │ └── svgo.yml │ ├── components │ │ ├── ImageCropper │ │ │ └── utils │ │ │ │ ├── mimes.js │ │ │ │ ├── data2blob.js │ │ │ │ └── effectRipple.js │ │ ├── Tinymce │ │ │ ├── toolbar.js │ │ │ └── plugins.js │ │ ├── MarkdownEditor │ │ │ └── defaultOptions.js │ │ ├── SvgIcon │ │ │ └── index.vue │ │ ├── Charts │ │ │ └── mixins │ │ │ │ └── resize.js │ │ ├── LangSelect │ │ │ └── index.vue │ │ ├── Screenfull │ │ │ └── index.vue │ │ ├── Hamburger │ │ │ └── index.vue │ │ ├── SizeSelect │ │ │ └── index.vue │ │ ├── DragSelect │ │ │ └── index.vue │ │ ├── JsonEditor │ │ │ └── index.vue │ │ └── GithubCorner │ │ │ └── index.vue │ ├── layout │ │ ├── components │ │ │ ├── index.js │ │ │ ├── Sidebar │ │ │ │ ├── Item.vue │ │ │ │ ├── Link.vue │ │ │ │ ├── FixiOSBug.js │ │ │ │ └── index.vue │ │ │ └── AppMain.vue │ │ └── mixin │ │ │ └── ResizeHandler.js │ ├── directive │ │ ├── waves │ │ │ ├── index.js │ │ │ └── waves.css │ │ ├── el-dragDialog │ │ │ └── index.js │ │ ├── clipboard │ │ │ ├── index.js │ │ │ └── clipboard.js │ │ ├── permission │ │ │ ├── index.js │ │ │ └── permission.js │ │ └── el-table │ │ │ ├── index.js │ │ │ └── adaptive.js │ ├── utils │ │ ├── auth.js │ │ ├── i18n.js │ │ ├── permission.js │ │ ├── clipboard.js │ │ ├── errorLog.js │ │ ├── openWindow.js │ │ └── scrollTo.js │ ├── store │ │ ├── modules │ │ │ ├── errorLog.js │ │ │ ├── settings.js │ │ │ ├── readPapers.js │ │ │ ├── permission.js │ │ │ ├── classes.js │ │ │ ├── app.js │ │ │ └── examination.js │ │ ├── getters.js │ │ └── index.js │ ├── router │ │ └── modules │ │ │ ├── headImage.js │ │ │ ├── charts.js │ │ │ ├── user.js │ │ │ ├── classes.js │ │ │ ├── table.js │ │ │ ├── readPapers.js │ │ │ ├── examination.js │ │ │ ├── exam.js │ │ │ └── nested.js │ ├── vendor │ │ └── Export2Zip.js │ ├── styles │ │ ├── variables.scss │ │ ├── transition.scss │ │ ├── element-variables.scss │ │ ├── element-ui.scss │ │ ├── mixin.scss │ │ └── btn.scss │ ├── settings.js │ ├── lang │ │ └── index.js │ ├── filters │ │ └── index.js │ └── main.js ├── .env.staging ├── .github │ └── ISSUE_TEMPLATE │ │ ├── feature_request.md │ │ ├── question.md │ │ └── bug_report.md ├── plop-templates │ ├── utils.js │ ├── view │ │ ├── index.hbs │ │ └── prompt.js │ └── component │ │ ├── index.hbs │ │ └── prompt.js ├── .postcssrc.js ├── plopfile.js ├── .editorconfig ├── .gitignore ├── .env.development ├── jest.config.js ├── build │ └── index.js ├── LICENSE └── mock │ ├── remoteSearch.js │ ├── user.js │ └── mock-server.js ├── README.md └── .gitignore /vue-element-admin/.eslintignore: -------------------------------------------------------------------------------- 1 | build/*.js 2 | src/assets 3 | public 4 | dist 5 | -------------------------------------------------------------------------------- /vue-element-admin/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/app' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /vue-element-admin/tests/unit/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | jest: true 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /vue-element-admin/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/public/favicon.ico -------------------------------------------------------------------------------- /vue-element-admin/.env.production: -------------------------------------------------------------------------------- 1 | # just a flag 2 | ENV = 'production' 3 | 4 | # base api 5 | VUE_APP_BASE_API = '/prod-api' 6 | 7 | -------------------------------------------------------------------------------- /vue-element-admin/.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: stable 3 | script: npm run test 4 | notifications: 5 | email: false 6 | -------------------------------------------------------------------------------- /vue-element-admin/src/assets/401_images/401.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/src/assets/401_images/401.gif -------------------------------------------------------------------------------- /vue-element-admin/src/assets/404_images/404.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/src/assets/404_images/404.png -------------------------------------------------------------------------------- /vue-element-admin/.env.staging: -------------------------------------------------------------------------------- 1 | NODE_ENV = production 2 | 3 | # just a flag 4 | ENV = 'staging' 5 | 6 | # base api 7 | VUE_APP_BASE_API = '/stage-api' 8 | 9 | -------------------------------------------------------------------------------- /vue-element-admin/src/assets/404_images/404_cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/src/assets/404_images/404_cloud.png -------------------------------------------------------------------------------- /vue-element-admin/src/assets/login_wraper.8ab0d297.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/src/assets/login_wraper.8ab0d297.jpg -------------------------------------------------------------------------------- /vue-element-admin/src/views/nested/menu2/index.vue: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /vue-element-admin/src/assets/custom-theme/fonts/element-icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/src/assets/custom-theme/fonts/element-icons.ttf -------------------------------------------------------------------------------- /vue-element-admin/src/assets/custom-theme/fonts/element-icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/src/assets/custom-theme/fonts/element-icons.woff -------------------------------------------------------------------------------- /vue-element-admin/.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature Request(新功能建议) 3 | about: Suggest an idea for this project 4 | --- 5 | 6 | ## Feature request(新功能建议) 7 | 8 | -------------------------------------------------------------------------------- /vue-element-admin/public/static/tinymce4.7.5/skins/lightgray/img/anchor.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/public/static/tinymce4.7.5/skins/lightgray/img/anchor.gif -------------------------------------------------------------------------------- /vue-element-admin/public/static/tinymce4.7.5/skins/lightgray/img/loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/public/static/tinymce4.7.5/skins/lightgray/img/loader.gif -------------------------------------------------------------------------------- /vue-element-admin/public/static/tinymce4.7.5/skins/lightgray/img/object.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/public/static/tinymce4.7.5/skins/lightgray/img/object.gif -------------------------------------------------------------------------------- /vue-element-admin/public/static/tinymce4.7.5/skins/lightgray/img/trans.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/public/static/tinymce4.7.5/skins/lightgray/img/trans.gif -------------------------------------------------------------------------------- /vue-element-admin/src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /vue-element-admin/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.eot -------------------------------------------------------------------------------- /vue-element-admin/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.ttf -------------------------------------------------------------------------------- /vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-cry.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-cry.gif -------------------------------------------------------------------------------- /vue-element-admin/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.woff -------------------------------------------------------------------------------- /vue-element-admin/src/views/nested/menu1/menu1-3/index.vue: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-cool.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-cool.gif -------------------------------------------------------------------------------- /vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-frown.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-frown.gif -------------------------------------------------------------------------------- /vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-kiss.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-kiss.gif -------------------------------------------------------------------------------- /vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-smile.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-smile.gif -------------------------------------------------------------------------------- /vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-wink.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-wink.gif -------------------------------------------------------------------------------- /vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-yell.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-yell.gif -------------------------------------------------------------------------------- /vue-element-admin/src/api/qiniu.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function getToken() { 4 | return request({ 5 | url: '/qiniu/upload/token', // 假地址 自行替换 6 | method: 'get' 7 | }) 8 | } 9 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/chart.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-innocent.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-innocent.gif -------------------------------------------------------------------------------- /vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-laughing.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-laughing.gif -------------------------------------------------------------------------------- /vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-sealed.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-sealed.gif -------------------------------------------------------------------------------- /vue-element-admin/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-mobile.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-mobile.woff -------------------------------------------------------------------------------- /vue-element-admin/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.eot -------------------------------------------------------------------------------- /vue-element-admin/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.ttf -------------------------------------------------------------------------------- /vue-element-admin/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/public/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.woff -------------------------------------------------------------------------------- /vue-element-admin/src/components/ImageCropper/utils/mimes.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'jpg': 'image/jpeg', 3 | 'png': 'image/png', 4 | 'gif': 'image/gif', 5 | 'svg': 'image/svg+xml', 6 | 'psd': 'image/photoshop' 7 | } 8 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/nested/menu1/index.vue: -------------------------------------------------------------------------------- 1 | 8 | -------------------------------------------------------------------------------- /vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-embarassed.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-embarassed.gif -------------------------------------------------------------------------------- /vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-surprised.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-surprised.gif -------------------------------------------------------------------------------- /vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-tongue-out.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-tongue-out.gif -------------------------------------------------------------------------------- /vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-undecided.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-undecided.gif -------------------------------------------------------------------------------- /vue-element-admin/src/views/nested/menu1/menu1-2/menu1-2-1/index.vue: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/nested/menu1/menu1-2/menu1-2-2/index.vue: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-foot-in-mouth.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-foot-in-mouth.gif -------------------------------------------------------------------------------- /vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-money-mouth.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raneenana/tasksystem/HEAD/vue-element-admin/public/static/tinymce4.7.5/plugins/emoticons/img/smiley-money-mouth.gif -------------------------------------------------------------------------------- /vue-element-admin/src/views/errorLog/errorTestB.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | -------------------------------------------------------------------------------- /vue-element-admin/plop-templates/utils.js: -------------------------------------------------------------------------------- 1 | exports.notEmpty = name => { 2 | return v => { 3 | if (!v || v.trim === '') { 4 | return `${name} is required` 5 | } else { 6 | return true 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/example/components/Dropdown/index.js: -------------------------------------------------------------------------------- 1 | export { default as CommentDropdown } from './Comment' 2 | export { default as PlatformDropdown } from './Platform' 3 | export { default as SourceUrlDropdown } from './SourceUrl' 4 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/size.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/nested/menu1/menu1-1/index.vue: -------------------------------------------------------------------------------- 1 | 8 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/nested/menu1/menu1-2/index.vue: -------------------------------------------------------------------------------- 1 | 8 | -------------------------------------------------------------------------------- /vue-element-admin/.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | "plugins": { 5 | // to edit target browsers: use "browserslist" field in package.json 6 | "autoprefixer": {} 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/errorLog/errorTestA.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # tasksystem 2 | 后台管理:根据登陆者的权限id不同进行判断用户可以查看的页面 3 | 4 | #### 1,下载安装依赖 5 | ``` 6 | npm install 7 | cnpm install 8 | ``` 9 | #### 2,运行项目 10 | ``` 11 | npm run dev 12 | ``` 13 | #### 3,打包项目,上线运行 14 | ``` 15 | npm run build:prod 16 | ``` 17 | #### 4,运用框架 18 | vue框架与element-ui -------------------------------------------------------------------------------- /vue-element-admin/src/views/example/edit.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 13 | 14 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/example/create.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 13 | 14 | -------------------------------------------------------------------------------- /vue-element-admin/plopfile.js: -------------------------------------------------------------------------------- 1 | const viewGenerator = require('./plop-templates/view/prompt') 2 | const componentGenerator = require('./plop-templates/component/prompt') 3 | 4 | module.exports = function(plop) { 5 | plop.setGenerator('view', viewGenerator) 6 | plop.setGenerator('component', componentGenerator) 7 | } 8 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/link.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/layout/components/index.js: -------------------------------------------------------------------------------- 1 | export { default as AppMain } from './AppMain' 2 | export { default as Navbar } from './Navbar' 3 | export { default as Settings } from './Settings' 4 | export { default as Sidebar } from './Sidebar/index.vue' 5 | export { default as TagsView } from './TagsView/index.vue' 6 | -------------------------------------------------------------------------------- /vue-element-admin/src/api/showUser.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function showUser() { 4 | return request({ 5 | url: '/user/user', 6 | method: 'get' 7 | }) 8 | } 9 | export function identity() { 10 | return request({ 11 | url: '/user/identity', 12 | method: 'get' 13 | }) 14 | } 15 | -------------------------------------------------------------------------------- /vue-element-admin/src/directive/waves/index.js: -------------------------------------------------------------------------------- 1 | import waves from './waves' 2 | 3 | const install = function(Vue) { 4 | Vue.directive('waves', waves) 5 | } 6 | 7 | if (window.Vue) { 8 | window.waves = waves 9 | Vue.use(install); // eslint-disable-line 10 | } 11 | 12 | waves.install = install 13 | export default waves 14 | -------------------------------------------------------------------------------- /vue-element-admin/.editorconfig: -------------------------------------------------------------------------------- 1 | # https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | end_of_line = lf 9 | insert_final_newline = true 10 | trim_trailing_whitespace = true 11 | 12 | [*.md] 13 | insert_final_newline = false 14 | trim_trailing_whitespace = false 15 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/svg-icons/requireIcons.js: -------------------------------------------------------------------------------- 1 | const req = require.context('../../icons/svg', false, /\.svg$/) 2 | const requireAll = requireContext => requireContext.keys() 3 | 4 | const re = /\.\/(.*)\.svg/ 5 | 6 | const icons = requireAll(req).map(i => { 7 | return i.match(re)[1] 8 | }) 9 | 10 | export default icons 11 | -------------------------------------------------------------------------------- /vue-element-admin/src/directive/el-dragDialog/index.js: -------------------------------------------------------------------------------- 1 | import drag from './drag' 2 | 3 | const install = function(Vue) { 4 | Vue.directive('el-drag-dialog', drag) 5 | } 6 | 7 | if (window.Vue) { 8 | window['el-drag-dialog'] = drag 9 | Vue.use(install); // eslint-disable-line 10 | } 11 | 12 | drag.install = install 13 | export default drag 14 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import SvgIcon from '@/components/SvgIcon'// svg组件 3 | 4 | // register globally 5 | Vue.component('svg-icon', SvgIcon) 6 | 7 | const req = require.context('./svg', false, /\.svg$/) 8 | const requireAll = requireContext => requireContext.keys().map(requireContext) 9 | requireAll(req) 10 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/guide.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/redirect/index.vue: -------------------------------------------------------------------------------- 1 | 13 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/component.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/directive/clipboard/index.js: -------------------------------------------------------------------------------- 1 | import Clipboard from './clipboard' 2 | 3 | const install = function(Vue) { 4 | Vue.directive('Clipboard', Clipboard) 5 | } 6 | 7 | if (window.Vue) { 8 | window.clipboard = Clipboard 9 | Vue.use(install); // eslint-disable-line 10 | } 11 | 12 | Clipboard.install = install 13 | export default Clipboard 14 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/money.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/pdf/index.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | -------------------------------------------------------------------------------- /vue-element-admin/src/directive/permission/index.js: -------------------------------------------------------------------------------- 1 | import permission from './permission' 2 | 3 | const install = function(Vue) { 4 | Vue.directive('permission', permission) 5 | } 6 | 7 | if (window.Vue) { 8 | window['permission'] = permission 9 | Vue.use(install); // eslint-disable-line 10 | } 11 | 12 | permission.install = install 13 | export default permission 14 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/email.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/drag.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svgo.yml: -------------------------------------------------------------------------------- 1 | # replace default config 2 | 3 | # multipass: true 4 | # full: true 5 | 6 | plugins: 7 | 8 | # - name 9 | # 10 | # or: 11 | # - name: false 12 | # - name: true 13 | # 14 | # or: 15 | # - name: 16 | # param1: 1 17 | # param2: 2 18 | 19 | - removeAttrs: 20 | attrs: 21 | - 'fill' 22 | - 'fill-rule' 23 | -------------------------------------------------------------------------------- /vue-element-admin/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | dist/ 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | **/*.log 8 | 9 | tests/**/coverage/ 10 | tests/e2e/reports 11 | selenium-debug.log 12 | 13 | # Editor directories and files 14 | .idea 15 | .vscode 16 | *.suo 17 | *.ntvs* 18 | *.njsproj 19 | *.sln 20 | *.local 21 | 22 | package-lock.json 23 | yarn.lock 24 | -------------------------------------------------------------------------------- /vue-element-admin/src/utils/auth.js: -------------------------------------------------------------------------------- 1 | import Cookies from 'js-cookie' 2 | 3 | const TokenKey = 'authorization' 4 | 5 | export function getToken() { 6 | return Cookies.get(TokenKey) 7 | } 8 | 9 | export function setToken(token) { 10 | return Cookies.set(TokenKey, token, { expires: 7 }) 11 | } 12 | 13 | export function removeToken() { 14 | return Cookies.remove(TokenKey) 15 | } 16 | -------------------------------------------------------------------------------- /vue-element-admin/src/directive/el-table/index.js: -------------------------------------------------------------------------------- 1 | 2 | import adaptive from './adaptive' 3 | 4 | const install = function(Vue) { 5 | Vue.directive('el-height-adaptive-table', adaptive) 6 | } 7 | 8 | if (window.Vue) { 9 | window['el-height-adaptive-table'] = adaptive 10 | Vue.use(install); // eslint-disable-line 11 | } 12 | 13 | adaptive.install = install 14 | export default adaptive 15 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/guide 2.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/api/remoteSearch.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function searchUser(name) { 4 | return request({ 5 | url: '/search/user', 6 | method: 'get', 7 | params: { name } 8 | }) 9 | } 10 | 11 | export function transactionList(query) { 12 | return request({ 13 | url: '/transaction/list', 14 | method: 'get', 15 | params: query 16 | }) 17 | } 18 | -------------------------------------------------------------------------------- /vue-element-admin/src/store/modules/errorLog.js: -------------------------------------------------------------------------------- 1 | const state = { 2 | logs: [] 3 | } 4 | 5 | const mutations = { 6 | ADD_ERROR_LOG: (state, log) => { 7 | state.logs.push(log) 8 | } 9 | } 10 | 11 | const actions = { 12 | addErrorLog({ commit }, log) { 13 | commit('ADD_ERROR_LOG', log) 14 | } 15 | } 16 | 17 | export default { 18 | namespaced: true, 19 | state, 20 | mutations, 21 | actions 22 | } 23 | -------------------------------------------------------------------------------- /vue-element-admin/src/utils/i18n.js: -------------------------------------------------------------------------------- 1 | // translate router.meta.title, be used in breadcrumb sidebar tagsview 2 | export function generateTitle(title) { 3 | const hasKey = this.$te('route.' + title) 4 | 5 | if (hasKey) { 6 | // $t :this method from vue-i18n, inject in @/lang/index.js 7 | const translatedTitle = this.$t('route.' + title) 8 | 9 | return translatedTitle 10 | } 11 | return title 12 | } 13 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/login/authRedirect.vue: -------------------------------------------------------------------------------- 1 | 16 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/documentation.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/fullscreen.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/plop-templates/view/index.hbs: -------------------------------------------------------------------------------- 1 | {{#if template}} 2 | 5 | {{/if}} 6 | 7 | {{#if script}} 8 | 20 | {{/if}} 21 | 22 | {{#if style}} 23 | 26 | {{/if}} 27 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/user.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/plop-templates/component/index.hbs: -------------------------------------------------------------------------------- 1 | {{#if template}} 2 | 5 | {{/if}} 6 | 7 | {{#if script}} 8 | 20 | {{/if}} 21 | 22 | {{#if style}} 23 | 26 | {{/if}} 27 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/lock.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/example/components/Warning.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/excel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/charts/line.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | 16 | 23 | 24 | -------------------------------------------------------------------------------- /vue-element-admin/.github/ISSUE_TEMPLATE/question.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Question(提问) 3 | about: Asking questions about use 4 | --- 5 | 6 | ## Question(提问) 7 | 8 | 15 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/charts/mixChart.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | 16 | 23 | 24 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/charts/keyboard.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | 16 | 23 | 24 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/permission/page.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 20 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/example.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/components/Tinymce/toolbar.js: -------------------------------------------------------------------------------- 1 | // Here is a list of the toolbar 2 | // Detail list see https://www.tinymce.com/docs/advanced/editor-control-identifiers/#toolbarcontrols 3 | 4 | const toolbar = ['searchreplace bold italic underline strikethrough alignleft aligncenter alignright outdent indent blockquote undo redo removeformat subscript superscript code codesample', 'hr bullist numlist link image charmap preview anchor pagebreak insertdatetime media table emoticons forecolor backcolor fullscreen'] 5 | 6 | export default toolbar 7 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/star.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/table.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/search.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/.env.development: -------------------------------------------------------------------------------- 1 | # just a flag 2 | ENV = 'development' 3 | 4 | # base api 5 | VUE_APP_BASE_API = '/dev-api' 6 | 7 | # vue-cli uses the VUE_CLI_BABEL_TRANSPILE_MODULES environment variable, 8 | # to control whether the babel-plugin-dynamic-import-node plugin is enabled. 9 | # It only does one thing by converting all import() to require(). 10 | # This configuration can significantly increase the speed of hot updates, 11 | # when you have a large number of pages. 12 | # Detail: https://github.com/vuejs/vue-cli/blob/dev/packages/@vue/babel-preset-app/index.js 13 | 14 | VUE_CLI_BABEL_TRANSPILE_MODULES = true 15 | -------------------------------------------------------------------------------- /vue-element-admin/src/components/Tinymce/plugins.js: -------------------------------------------------------------------------------- 1 | // Any plugins you want to use has to be imported 2 | // Detail plugins list see https://www.tinymce.com/docs/plugins/ 3 | // Custom builds see https://www.tinymce.com/download/custom-builds/ 4 | 5 | const plugins = ['advlist anchor autolink autosave code codesample colorpicker colorpicker contextmenu directionality emoticons fullscreen hr image imagetools insertdatetime link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace spellchecker tabfocus table template textcolor textpattern visualblocks visualchars wordcount'] 6 | 7 | export default plugins 8 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/table/dynamicTable/index.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 24 | 25 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/password.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/components/ImageCropper/utils/data2blob.js: -------------------------------------------------------------------------------- 1 | /** 2 | * database64文件格式转换为2进制 3 | * 4 | * @param {[String]} data dataURL 的格式为 “data:image/png;base64,****”,逗号之前都是一些说明性的文字,我们只需要逗号之后的就行了 5 | * @param {[String]} mime [description] 6 | * @return {[blob]} [description] 7 | */ 8 | export default function(data, mime) { 9 | data = data.split(',')[1] 10 | data = window.atob(data) 11 | var ia = new Uint8Array(data.length) 12 | for (var i = 0; i < data.length; i++) { 13 | ia[i] = data.charCodeAt(i) 14 | } 15 | // canvas.toDataURL 返回的默认格式就是 image/png 16 | return new Blob([ia], { 17 | type: mime 18 | }) 19 | } 20 | -------------------------------------------------------------------------------- /vue-element-admin/src/layout/components/Sidebar/Item.vue: -------------------------------------------------------------------------------- 1 | 30 | -------------------------------------------------------------------------------- /vue-element-admin/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | <%= webpackConfig.name %> 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /vue-element-admin/src/router/modules/headImage.js: -------------------------------------------------------------------------------- 1 | /** When your routing table is too long, you can split it into small modules**/ 2 | 3 | import Layout from '@/layout' 4 | 5 | const headImageRouter = { 6 | path: '/headImage', 7 | component: Layout, 8 | redirect: 'noredirect', 9 | name: 'headImage', 10 | hidden: true, 11 | meta: { 12 | title: 'headImage', 13 | icon: 'table' 14 | }, 15 | children: [ 16 | { 17 | path: 'index', 18 | component: () => import('@/views/headImage'), 19 | name: 'headImages', 20 | meta: { title: 'headImage', noCache: true } 21 | } 22 | ] 23 | } 24 | 25 | export default headImageRouter 26 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/tab.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/message.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/theme.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/directive/permission/permission.js: -------------------------------------------------------------------------------- 1 | 2 | import store from '@/store' 3 | 4 | export default { 5 | inserted(el, binding, vnode) { 6 | const { value } = binding 7 | const roles = store.getters && store.getters.roles 8 | 9 | if (value && value instanceof Array && value.length > 0) { 10 | const permissionRoles = value 11 | 12 | const hasPermission = roles.some(role => { 13 | return permissionRoles.includes(role) 14 | }) 15 | 16 | if (!hasPermission) { 17 | el.parentNode && el.parentNode.removeChild(el) 18 | } 19 | } else { 20 | throw new Error(`need roles! Like v-permission="['admin','editor']"`) 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /vue-element-admin/src/api/user.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function login(data) { 4 | return request({ 5 | url: '/user/login', 6 | method: 'post', 7 | data 8 | }) 9 | } 10 | 11 | export function getInfo() { 12 | return request({ 13 | url: '/user/userInfo', 14 | method: 'get' 15 | }) 16 | } 17 | 18 | export function getViewAuthority(data) { 19 | return request.get('/user/new', { params: { user_id: data }}) 20 | } 21 | export function newitem(data) { 22 | return request.get('/user/new', { params: { user_id: data.user_id }}) 23 | } 24 | 25 | export function logout() { 26 | return request({ 27 | url: '/user/logout', 28 | method: 'post' 29 | }) 30 | } 31 | -------------------------------------------------------------------------------- /vue-element-admin/src/api/readPapers.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 获取已经分配教室的班级,得到待批班级的信息 4 | export function classInfo() { 5 | return request({ 6 | url: '/manger/grade', 7 | method: 'get' 8 | }) 9 | } 10 | // 获取学生试卷列表 11 | export function getStudent(params) { 12 | return request({ 13 | url: '/exam/student', 14 | method: 'get', 15 | params 16 | }) 17 | } 18 | // 获取学生试卷 19 | export function getExam(data) { 20 | return request({ 21 | url: '/exam/student/' + data.id, 22 | method: 'get' 23 | }) 24 | } 25 | // 批阅试卷 26 | export function getScroll(data) { 27 | return request({ 28 | url: '/exam/student/' + data.id, 29 | method: 'put', 30 | data: data 31 | }) 32 | } 33 | -------------------------------------------------------------------------------- /vue-element-admin/src/vendor/Export2Zip.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | require('script-loader!file-saver'); 3 | import JSZip from 'jszip' 4 | 5 | export function export_txt_to_zip(th, jsonData, txtName, zipName) { 6 | const zip = new JSZip() 7 | const txt_name = txtName || 'file' 8 | const zip_name = zipName || 'file' 9 | const data = jsonData 10 | let txtData = `${th}\r\n` 11 | data.forEach((row) => { 12 | let tempStr = '' 13 | tempStr = row.toString() 14 | txtData += `${tempStr}\r\n` 15 | }) 16 | zip.file(`${txt_name}.txt`, txtData) 17 | zip.generateAsync({ 18 | type: "blob" 19 | }).then((blob) => { 20 | saveAs(blob, `${zip_name}.zip`) 21 | }, (err) => { 22 | alert('导出失败') 23 | }) 24 | } 25 | -------------------------------------------------------------------------------- /vue-element-admin/src/utils/permission.js: -------------------------------------------------------------------------------- 1 | import store from '@/store' 2 | 3 | /** 4 | * @param {Array} value 5 | * @returns {Boolean} 6 | * @example see @/views/permission/directive.vue 7 | */ 8 | export default function checkPermission(value) { 9 | if (value && value instanceof Array && value.length > 0) { 10 | const roles = store.getters && store.getters.roles 11 | const permissionRoles = value 12 | 13 | const hasPermission = roles.some(role => { 14 | return permissionRoles.includes(role) 15 | }) 16 | if (!hasPermission) { 17 | return false 18 | } 19 | return true 20 | } else { 21 | console.error(`need roles! Like v-permission="['admin','editor']"`) 22 | return false 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /vue-element-admin/src/components/MarkdownEditor/defaultOptions.js: -------------------------------------------------------------------------------- 1 | // doc: https://nhnent.github.io/tui.editor/api/latest/ToastUIEditor.html#ToastUIEditor 2 | export default { 3 | minHeight: '200px', 4 | previewStyle: 'vertical', 5 | useCommandShortcut: true, 6 | useDefaultHTMLSanitizer: true, 7 | usageStatistics: false, 8 | hideModeSwitch: false, 9 | toolbarItems: [ 10 | 'heading', 11 | 'bold', 12 | 'italic', 13 | 'strike', 14 | 'divider', 15 | 'hr', 16 | 'quote', 17 | 'divider', 18 | 'ul', 19 | 'ol', 20 | 'task', 21 | 'indent', 22 | 'outdent', 23 | 'divider', 24 | 'table', 25 | 'image', 26 | 'link', 27 | 'divider', 28 | 'code', 29 | 'codeblock' 30 | ] 31 | } 32 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/peoples.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/api/role.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function getRoutes() { 4 | return request({ 5 | url: '/routes', 6 | method: 'get' 7 | }) 8 | } 9 | 10 | export function getRoles() { 11 | return request({ 12 | url: '/roles', 13 | method: 'get' 14 | }) 15 | } 16 | 17 | export function addRole(data) { 18 | return request({ 19 | url: '/role', 20 | method: 'post', 21 | data 22 | }) 23 | } 24 | 25 | export function updateRole(id, data) { 26 | return request({ 27 | url: `/role/${id}`, 28 | method: 'put', 29 | data 30 | }) 31 | } 32 | 33 | export function deleteRole(id) { 34 | return request({ 35 | url: `/role/${id}`, 36 | method: 'delete' 37 | }) 38 | } 39 | -------------------------------------------------------------------------------- /vue-element-admin/src/store/modules/settings.js: -------------------------------------------------------------------------------- 1 | import defaultSettings from '@/settings' 2 | const { showSettings, tagsView, fixedHeader, sidebarLogo, theme } = defaultSettings 3 | 4 | const state = { 5 | theme: theme, 6 | showSettings: showSettings, 7 | tagsView: tagsView, 8 | fixedHeader: fixedHeader, 9 | sidebarLogo: sidebarLogo 10 | } 11 | 12 | const mutations = { 13 | CHANGE_SETTING: (state, { key, value }) => { 14 | if (state.hasOwnProperty(key)) { 15 | state[key] = value 16 | } 17 | } 18 | } 19 | 20 | const actions = { 21 | changeSetting({ commit }, data) { 22 | commit('CHANGE_SETTING', data) 23 | } 24 | } 25 | 26 | export default { 27 | namespaced: true, 28 | state, 29 | mutations, 30 | actions 31 | } 32 | 33 | -------------------------------------------------------------------------------- /vue-element-admin/tests/unit/components/SvgIcon.spec.js: -------------------------------------------------------------------------------- 1 | import { shallowMount } from '@vue/test-utils' 2 | import SvgIcon from '@/components/SvgIcon/index.vue' 3 | describe('SvgIcon.vue', () => { 4 | it('iconClass', () => { 5 | const wrapper = shallowMount(SvgIcon, { 6 | propsData: { 7 | iconClass: 'test' 8 | } 9 | }) 10 | expect(wrapper.find('use').attributes().href).toBe('#icon-test') 11 | }) 12 | it('className', () => { 13 | const wrapper = shallowMount(SvgIcon, { 14 | propsData: { 15 | iconClass: 'test' 16 | } 17 | }) 18 | expect(wrapper.classes().length).toBe(1) 19 | wrapper.setProps({ className: 'test' }) 20 | expect(wrapper.classes().includes('test')).toBe(true) 21 | }) 22 | }) 23 | -------------------------------------------------------------------------------- /vue-element-admin/tests/unit/components/Hamburger.spec.js: -------------------------------------------------------------------------------- 1 | import { shallowMount } from '@vue/test-utils' 2 | import Hamburger from '@/components/Hamburger/index.vue' 3 | describe('Hamburger.vue', () => { 4 | it('toggle click', () => { 5 | const wrapper = shallowMount(Hamburger) 6 | const mockFn = jest.fn() 7 | wrapper.vm.$on('toggleClick', mockFn) 8 | wrapper.find('.hamburger').trigger('click') 9 | expect(mockFn).toBeCalled() 10 | }) 11 | it('prop isActive', () => { 12 | const wrapper = shallowMount(Hamburger) 13 | wrapper.setProps({ isActive: true }) 14 | expect(wrapper.contains('.is-active')).toBe(true) 15 | wrapper.setProps({ isActive: false }) 16 | expect(wrapper.contains('.is-active')).toBe(false) 17 | }) 18 | }) 19 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/excel/components/FilenameOption.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 29 | -------------------------------------------------------------------------------- /vue-element-admin/src/layout/components/Sidebar/Link.vue: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 37 | -------------------------------------------------------------------------------- /vue-element-admin/src/store/getters.js: -------------------------------------------------------------------------------- 1 | const getters = { 2 | sidebar: state => state.app.sidebar, 3 | language: state => state.app.language, 4 | size: state => state.app.size, 5 | device: state => state.app.device, 6 | visitedViews: state => state.tagsView.visitedViews, 7 | cachedViews: state => state.tagsView.cachedViews, 8 | token: state => state.user.token, 9 | avatar: state => state.user.avatar, 10 | name: state => state.user.name, 11 | introduction: state => state.user.introduction, 12 | roles: state => state.user.roles, 13 | permission_routes: state => state.permission.routes, 14 | addRoutes: state => state.permission.addRoutes, 15 | errorLogs: state => state.errorLog.logs, 16 | userInfo: state => state.user.userInfo 17 | } 18 | export default getters 19 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/dashboard/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 32 | -------------------------------------------------------------------------------- /vue-element-admin/src/layout/components/Sidebar/FixiOSBug.js: -------------------------------------------------------------------------------- 1 | export default { 2 | computed: { 3 | device() { 4 | return this.$store.state.app.device 5 | } 6 | }, 7 | mounted() { 8 | // In order to fix the click on menu on the ios device will trigger the mouseleave bug 9 | // https://github.com/PanJiaChen/vue-element-admin/issues/1135 10 | this.fixBugIniOS() 11 | }, 12 | methods: { 13 | fixBugIniOS() { 14 | const $subMenu = this.$refs.subMenu 15 | if ($subMenu) { 16 | const handleMouseleave = $subMenu.handleMouseleave 17 | $subMenu.handleMouseleave = (e) => { 18 | if (this.device === 'mobile') { 19 | return 20 | } 21 | handleMouseleave(e) 22 | } 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/excel/components/AutoWidthOption.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 35 | -------------------------------------------------------------------------------- /vue-element-admin/src/router/modules/charts.js: -------------------------------------------------------------------------------- 1 | /** When your routing table is too long, you can split it into small modules**/ 2 | 3 | import Layout from '@/layout' 4 | 5 | const chartsRouter = { 6 | path: '/charts', 7 | component: Layout, 8 | redirect: 'noredirect', 9 | name: 'Charts', 10 | meta: { 11 | title: 'charts', 12 | icon: 'chart' 13 | }, 14 | children: [ 15 | { 16 | path: 'line', 17 | component: () => import('@/views/charts/line'), 18 | name: 'LineChart', 19 | meta: { title: 'lineChart', noCache: true } 20 | }, 21 | { 22 | path: 'mixchart', 23 | component: () => import('@/views/charts/mixChart'), 24 | name: 'MixChart', 25 | meta: { title: 'mixChart', noCache: true } 26 | } 27 | ] 28 | } 29 | 30 | export default chartsRouter 31 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/svg-icons/element-icon.json: -------------------------------------------------------------------------------- 1 | ["info","error","success","warning","question","back","arrow-left","arrow-down","arrow-right","arrow-up","caret-left","caret-bottom","caret-top","caret-right","d-arrow-left","d-arrow-right","minus","plus","remove","circle-plus","remove-outline","circle-plus-outline","close","check","circle-close","circle-check","circle-close-outline","circle-check-outline","zoom-out","zoom-in","d-caret","sort","sort-down","sort-up","tickets","document","goods","sold-out","news","message","date","printer","time","bell","mobile-phone","service","view","menu","more","more-outline","star-on","star-off","location","location-outline","phone","phone-outline","picture","picture-outline","delete","search","edit","edit-outline","rank","refresh","share","setting","upload","upload2","download","loading"] 2 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/edit.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/nested.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/permission/components/SwitchRoles.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 33 | -------------------------------------------------------------------------------- /vue-element-admin/src/api/article.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function fetchList(query) { 4 | return request({ 5 | url: '/article/list', 6 | method: 'get', 7 | params: query 8 | }) 9 | } 10 | 11 | export function fetchArticle(id) { 12 | return request({ 13 | url: '/article/detail', 14 | method: 'get', 15 | params: { id } 16 | }) 17 | } 18 | 19 | export function fetchPv(pv) { 20 | return request({ 21 | url: '/article/pv', 22 | method: 'get', 23 | params: { pv } 24 | }) 25 | } 26 | 27 | export function createArticle(data) { 28 | return request({ 29 | url: '/article/create', 30 | method: 'post', 31 | data 32 | }) 33 | } 34 | 35 | export function updateArticle(data) { 36 | return request({ 37 | url: '/article/update', 38 | method: 'post', 39 | data 40 | }) 41 | } 42 | -------------------------------------------------------------------------------- /vue-element-admin/src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | import getters from './getters' 4 | // import createLogger from 'vuex/dist/logger' 5 | Vue.use(Vuex) 6 | 7 | // https://webpack.js.org/guides/dependency-management/#requirecontext 8 | const modulesFiles = require.context('./modules', false, /\.js$/) 9 | 10 | // you do not need `import app from './modules/app'` 11 | // it will auto require all vuex module from modules file 12 | const modules = modulesFiles.keys().reduce((modules, modulePath) => { 13 | // set './app.js' => 'app' 14 | const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1') 15 | const value = modulesFiles(modulePath) 16 | modules[moduleName] = value.default 17 | return modules 18 | }, {}) 19 | 20 | const store = new Vuex.Store({ 21 | modules, 22 | getters 23 | }) 24 | 25 | export default store 26 | -------------------------------------------------------------------------------- /vue-element-admin/.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report(报告问题) 3 | about: Create a report to help us improve 4 | --- 5 | 10 | 11 | 12 | ## Bug report(问题描述) 13 | 14 | #### Steps to reproduce(问题复现步骤) 15 | 20 | 21 | #### Screenshot or Gif(截图或动态图) 22 | 23 | 24 | #### Link to minimal reproduction(最小可在线还原demo) 25 | 26 | 29 | 30 | #### Other relevant information(格外信息) 31 | - Your OS: 32 | - Node.js version: 33 | - vue-element-admin version: 34 | -------------------------------------------------------------------------------- /vue-element-admin/src/router/modules/user.js: -------------------------------------------------------------------------------- 1 | /** When your routing table is too long, you can split it into small modules**/ 2 | 3 | import Layout from '@/layout' 4 | 5 | const userRouter = { 6 | path: '/user', 7 | component: Layout, 8 | redirect: 'noredirect', 9 | name: 'User', 10 | alwaysShow: true, 11 | meta: { 12 | title: 'user', 13 | icon: 'user' 14 | }, 15 | children: [ 16 | { 17 | path: 'addUser', 18 | component: () => import('@/views/users/addUser'), 19 | name: 'addUser', 20 | meta: { title: 'addUser', noCache: true, view_id: 'main-addUser' } 21 | }, 22 | { 23 | path: 'showUser', 24 | component: () => import('@/views/users/showUser'), 25 | name: 'showUser', 26 | meta: { title: 'showUser', noCache: true, view_id: 'main-showUser' } 27 | } 28 | ] 29 | } 30 | 31 | export default userRouter 32 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/excel/components/BookTypeOption.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 40 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/project.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/tree-table.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/components/SvgIcon/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 34 | 35 | 44 | -------------------------------------------------------------------------------- /vue-element-admin/src/utils/clipboard.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Clipboard from 'clipboard' 3 | 4 | function clipboardSuccess() { 5 | Vue.prototype.$message({ 6 | message: 'Copy successfully', 7 | type: 'success', 8 | duration: 1500 9 | }) 10 | } 11 | 12 | function clipboardError() { 13 | Vue.prototype.$message({ 14 | message: 'Copy failed', 15 | type: 'error' 16 | }) 17 | } 18 | 19 | export default function handleClipboard(text, event) { 20 | const clipboard = new Clipboard(event.target, { 21 | text: () => text 22 | }) 23 | clipboard.on('success', () => { 24 | clipboardSuccess() 25 | clipboard.off('error') 26 | clipboard.off('success') 27 | clipboard.destroy() 28 | }) 29 | clipboard.on('error', () => { 30 | clipboardError() 31 | clipboard.off('error') 32 | clipboard.off('success') 33 | clipboard.destroy() 34 | }) 35 | clipboard.onClick(event) 36 | } 37 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/eye.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/styles/variables.scss: -------------------------------------------------------------------------------- 1 | // base color 2 | $blue:#324157; 3 | $light-blue:#3A71A8; 4 | $red:#C03639; 5 | $pink: #E65D6E; 6 | $green: #30B08F; 7 | $tiffany: #4AB7BD; 8 | $yellow:#FEC171; 9 | $panGreen: #30B08F; 10 | 11 | //sidebar 12 | $menuText:#bfcbd9; 13 | $menuActiveText:#409EFF; 14 | $subMenuActiveText:#f4f4f5; //https://github.com/ElemeFE/element/issues/12951 15 | 16 | $menuBg:#304156; 17 | $menuHover:#263445; 18 | 19 | $subMenuBg:#1f2d3d; 20 | $subMenuHover:#001528; 21 | 22 | $sideBarWidth: 12%; 23 | 24 | // the :export directive is the magic sauce for webpack 25 | // https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass 26 | :export { 27 | menuText: $menuText; 28 | menuActiveText: $menuActiveText; 29 | subMenuActiveText: $subMenuActiveText; 30 | menuBg: $menuBg; 31 | menuHover: $menuHover; 32 | subMenuBg: $subMenuBg; 33 | subMenuHover: $subMenuHover; 34 | sideBarWidth: $sideBarWidth; 35 | } 36 | -------------------------------------------------------------------------------- /vue-element-admin/src/styles/transition.scss: -------------------------------------------------------------------------------- 1 | //global transition css 2 | 3 | /*fade*/ 4 | .fade-enter-active, 5 | .fade-leave-active { 6 | transition: opacity 0.28s; 7 | } 8 | 9 | .fade-enter, 10 | .fade-leave-active { 11 | opacity: 0; 12 | } 13 | 14 | /*fade-transform*/ 15 | .fade-transform-leave-active, 16 | .fade-transform-enter-active { 17 | transition: all .5s; 18 | } 19 | 20 | .fade-transform-enter { 21 | opacity: 0; 22 | transform: translateX(-30px); 23 | } 24 | 25 | .fade-transform-leave-to { 26 | opacity: 0; 27 | transform: translateX(30px); 28 | } 29 | 30 | /*breadcrumb transition*/ 31 | .breadcrumb-enter-active, 32 | .breadcrumb-leave-active { 33 | transition: all .5s; 34 | } 35 | 36 | .breadcrumb-enter, 37 | .breadcrumb-leave-active { 38 | opacity: 0; 39 | transform: translateX(20px); 40 | } 41 | 42 | .breadcrumb-move { 43 | transition: all .5s; 44 | } 45 | 46 | .breadcrumb-leave-active { 47 | position: absolute; 48 | } 49 | -------------------------------------------------------------------------------- /vue-element-admin/src/directive/waves/waves.css: -------------------------------------------------------------------------------- 1 | .waves-ripple { 2 | position: absolute; 3 | border-radius: 100%; 4 | background-color: rgba(0, 0, 0, 0.15); 5 | background-clip: padding-box; 6 | pointer-events: none; 7 | -webkit-user-select: none; 8 | -moz-user-select: none; 9 | -ms-user-select: none; 10 | user-select: none; 11 | -webkit-transform: scale(0); 12 | -ms-transform: scale(0); 13 | transform: scale(0); 14 | opacity: 1; 15 | } 16 | 17 | .waves-ripple.z-active { 18 | opacity: 0; 19 | -webkit-transform: scale(2); 20 | -ms-transform: scale(2); 21 | transform: scale(2); 22 | -webkit-transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out; 23 | transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out; 24 | transition: opacity 1.2s ease-out, transform 0.6s ease-out; 25 | transition: opacity 1.2s ease-out, transform 0.6s ease-out, -webkit-transform 0.6s ease-out; 26 | } -------------------------------------------------------------------------------- /vue-element-admin/src/styles/element-variables.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * I think element-ui's default theme color is too light for long-term use. 3 | * So I modified the default color and you can modify it to your liking. 4 | **/ 5 | 6 | /* theme color */ 7 | $--color-primary: #1890ff; 8 | $--color-success: #13ce66; 9 | $--color-warning: #FFBA00; 10 | $--color-danger: #ff4949; 11 | // $--color-info: #1E1E1E; 12 | 13 | $--button-font-weight: 400; 14 | 15 | // $--color-text-regular: #1f2d3d; 16 | 17 | $--border-color-light: #dfe4ed; 18 | $--border-color-lighter: #e6ebf5; 19 | 20 | $--table-border:1px solid#dfe6ec; 21 | 22 | /* icon font path, required */ 23 | $--font-path: '~element-ui/lib/theme-chalk/fonts'; 24 | 25 | @import "~element-ui/packages/theme-chalk/src/index"; 26 | 27 | // the :export directive is the magic sauce for webpack 28 | // https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass 29 | :export { 30 | theme: $--color-primary; 31 | } 32 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/errorLog/index.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 28 | 29 | 34 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/guide/index.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 37 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/clipboard.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/components-demo/dropzone.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 31 | 32 | -------------------------------------------------------------------------------- /vue-element-admin/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | verbose: true, 3 | moduleFileExtensions: ['js', 'jsx', 'json', 'vue'], 4 | transformIgnorePatterns: [ 5 | 'node_modules/(?!(babel-jest|jest-vue-preprocessor)/)' 6 | ], 7 | transform: { 8 | '^.+\\.vue$': 'vue-jest', 9 | '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': 'jest-transform-stub', 10 | '^.+\\.jsx?$': 'babel-jest' 11 | }, 12 | moduleNameMapper: { 13 | '^@/(.*)$': '/src/$1' 14 | }, 15 | snapshotSerializers: ['jest-serializer-vue'], 16 | testMatch: [ 17 | '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)' 18 | ], 19 | collectCoverageFrom: ['src/utils/**/*.{js,vue}', '!src/utils/auth.js', '!src/utils/request.js', 'src/components/**/*.{js,vue}'], 20 | coverageDirectory: '/tests/unit/coverage', 21 | // 'collectCoverage': true, 22 | 'coverageReporters': [ 23 | 'lcov', 24 | 'text-summary' 25 | ], 26 | testURL: 'http://localhost/' 27 | } 28 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/list.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/settings.js: -------------------------------------------------------------------------------- 1 | import variables from '@/styles/element-variables.scss' 2 | 3 | export default { 4 | theme: variables.theme, 5 | 6 | /** 7 | * @type {boolean} true | false 8 | * @description Whether show the settings right-panel 9 | */ 10 | showSettings: true, 11 | 12 | /** 13 | * @type {boolean} true | false 14 | * @description Whether need tagsView 15 | */ 16 | tagsView: true, 17 | 18 | /** 19 | * @type {boolean} true | false 20 | * @description Whether fix the header 21 | */ 22 | fixedHeader: false, 23 | 24 | /** 25 | * @type {boolean} true | false 26 | * @description Whether show the logo in sidebar 27 | */ 28 | sidebarLogo: false, 29 | 30 | /** 31 | * @type {string | array} 'production' | ['production', 'development'] 32 | * @description Need show err logs component. 33 | * The default is only used in the production env 34 | * If you want to also use it in dev, you can pass ['production', 'development'] 35 | */ 36 | errorLog: 'production' 37 | } 38 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/components-demo/dndList.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 39 | 40 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/example/components/Dropdown/SourceUrl.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 39 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/layout/components/AppMain.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 24 | 25 | 49 | 50 | -------------------------------------------------------------------------------- /vue-element-admin/src/router/modules/classes.js: -------------------------------------------------------------------------------- 1 | /** When your routing table is too long, you can split it into small modules**/ 2 | 3 | import Layout from '@/layout' 4 | 5 | const examRouter = { 6 | path: '/classes', 7 | component: Layout, 8 | redirect: 'noredirect', 9 | name: 'Classes', 10 | alwaysShow: true, 11 | meta: { 12 | title: 'classes', 13 | icon: 'table' 14 | }, 15 | children: [ 16 | { 17 | path: 'class', 18 | component: () => import('@/views/classes/class'), 19 | name: 'class', 20 | meta: { title: 'class', noCache: true, view_id: 'main-grade' } 21 | }, 22 | { 23 | path: 'classroom', 24 | component: () => import('@/views/classes/classroom'), 25 | name: 'classroom', 26 | meta: { title: 'classroom', noCache: true, view_id: 'main-student' } 27 | }, 28 | { 29 | path: 'student', 30 | component: () => import('@/views/classes/student'), 31 | name: 'student', 32 | meta: { title: 'student', noCache: true, view_id: 'main-room' } 33 | } 34 | ] 35 | } 36 | 37 | export default examRouter 38 | -------------------------------------------------------------------------------- /vue-element-admin/src/utils/errorLog.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import store from '@/store' 3 | import { isString, isArray } from '@/utils/validate' 4 | import settings from '@/settings' 5 | 6 | // you can set in settings.js 7 | // errorLog:'production' | ['production','development'] 8 | const { errorLog: needErrorLog } = settings 9 | 10 | function checkNeed(arg) { 11 | const env = process.env.NODE_ENV 12 | if (isString(needErrorLog)) { 13 | return env === needErrorLog 14 | } 15 | if (isArray(needErrorLog)) { 16 | return needErrorLog.includes(env) 17 | } 18 | return false 19 | } 20 | 21 | if (checkNeed()) { 22 | Vue.config.errorHandler = function(err, vm, info, a) { 23 | // Don't ask me why I use Vue.nextTick, it just a hack. 24 | // detail see https://forum.vuejs.org/t/dispatch-in-vue-config-errorhandler-has-some-problem/23500 25 | Vue.nextTick(() => { 26 | store.dispatch('errorLog/addErrorLog', { 27 | err, 28 | vm, 29 | info, 30 | url: window.location.href 31 | }) 32 | console.error(err, info) 33 | }) 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /vue-element-admin/build/index.js: -------------------------------------------------------------------------------- 1 | const { run } = require('runjs') 2 | const chalk = require('chalk') 3 | const config = require('../vue.config.js') 4 | const rawArgv = process.argv.slice(2) 5 | const args = rawArgv.join(' ') 6 | 7 | if (process.env.npm_config_preview || rawArgv.includes('--preview')) { 8 | const report = rawArgv.includes('--report') 9 | 10 | run(`vue-cli-service build ${args}`) 11 | 12 | const port = 9526 13 | const publicPath = config.publicPath 14 | 15 | var connect = require('connect') 16 | var serveStatic = require('serve-static') 17 | const app = connect() 18 | 19 | app.use( 20 | publicPath, 21 | serveStatic('./dist', { 22 | index: ['index.html', '/'] 23 | }) 24 | ) 25 | 26 | app.listen(port, function() { 27 | console.log(chalk.green(`> Preview at http://localhost:${port}${publicPath}`)) 28 | if (report) { 29 | console.log(chalk.green(`> Report at http://localhost:${port}${publicPath}report.html`)) 30 | } 31 | 32 | }) 33 | } else { 34 | run(`vue-cli-service build ${args}`) 35 | } -------------------------------------------------------------------------------- /vue-element-admin/tests/unit/utils/parseTime.spec.js: -------------------------------------------------------------------------------- 1 | import { parseTime } from '@/utils/index.js' 2 | describe('Utils:parseTime', () => { 3 | const d = new Date('2018-07-13 17:54:01') // "2018-07-13 17:54:01" 4 | it('timestamp', () => { 5 | expect(parseTime(d)).toBe('2018-07-13 17:54:01') 6 | }) 7 | it('ten digits timestamp', () => { 8 | expect(parseTime((d / 1000).toFixed(0))).toBe('2018-07-13 17:54:01') 9 | }) 10 | it('new Date', () => { 11 | expect(parseTime(new Date(d))).toBe('2018-07-13 17:54:01') 12 | }) 13 | it('format', () => { 14 | expect(parseTime(d, '{y}-{m}-{d} {h}:{i}')).toBe('2018-07-13 17:54') 15 | expect(parseTime(d, '{y}-{m}-{d}')).toBe('2018-07-13') 16 | expect(parseTime(d, '{y}/{m}/{d} {h}-{i}')).toBe('2018/07/13 17-54') 17 | }) 18 | it('get the day of the week', () => { 19 | expect(parseTime(d, '{a}')).toBe('五') // 星期五 20 | }) 21 | it('get the day of the week', () => { 22 | expect(parseTime(+d + 1000 * 60 * 60 * 24 * 2, '{a}')).toBe('日') // 星期日 23 | }) 24 | it('empty argument', () => { 25 | expect(parseTime()).toBeNull() 26 | }) 27 | }) 28 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/sliders.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/example/components/Dropdown/Comment.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 42 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/international.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/api/examination.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 考试类型 4 | export function typeExam() { 5 | return request({ 6 | url: '/exam/examType', 7 | method: 'get' 8 | }) 9 | } 10 | // 课程 11 | export function getCurriculum() { 12 | return request({ 13 | url: '/exam/subject', 14 | method: 'get' 15 | }) 16 | } 17 | // 创建试卷 18 | export function CreateExam(params) { 19 | return request({ 20 | url: '/exam/exam', 21 | method: 'post', 22 | data: params 23 | }) 24 | } 25 | // 获取试卷列表 26 | export function getExamList() { 27 | return request({ 28 | url: '/exam/exam', 29 | method: 'get' 30 | }) 31 | } 32 | // 获取试卷列表详情 33 | export function getExamDetail(data) { 34 | return request({ 35 | url: '/exam/exam/' + data, 36 | method: 'get' 37 | }) 38 | } 39 | // 获取所有的试题 40 | export function getTest() { 41 | return request({ 42 | url: '/exam/questions/new', 43 | method: 'get' 44 | }) 45 | } 46 | // 更新试卷 47 | export function renewal(str, data) { 48 | return request({ 49 | url: '/exam/exam/' + str, 50 | method: 'put', 51 | data 52 | }) 53 | } 54 | -------------------------------------------------------------------------------- /vue-element-admin/src/components/Charts/mixins/resize.js: -------------------------------------------------------------------------------- 1 | import { debounce } from '@/utils' 2 | 3 | export default { 4 | data() { 5 | return { 6 | $_sidebarElm: null 7 | } 8 | }, 9 | mounted() { 10 | this.__resizeHandler = debounce(() => { 11 | if (this.chart) { 12 | this.chart.resize() 13 | } 14 | }, 100) 15 | window.addEventListener('resize', this.__resizeHandler) 16 | 17 | this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0] 18 | this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler) 19 | }, 20 | beforeDestroy() { 21 | window.removeEventListener('resize', this.__resizeHandler) 22 | 23 | this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler) 24 | }, 25 | methods: { 26 | // use $_ for mixins properties 27 | // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential 28 | $_sidebarResizeHandler(e) { 29 | if (e.propertyName === 'width') { 30 | this.__resizeHandler() 31 | } 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /vue-element-admin/src/components/LangSelect/index.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 39 | -------------------------------------------------------------------------------- /vue-element-admin/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017-present PanJiaChen 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/wechat.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # TypeScript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # next.js build output 61 | .next 62 | -------------------------------------------------------------------------------- /vue-element-admin/tests/unit/utils/formatTime.spec.js: -------------------------------------------------------------------------------- 1 | import { formatTime } from '@/utils/index.js' 2 | describe('Utils:formatTime', () => { 3 | const d = new Date('2018-07-13 17:54:01') // "2018-07-13 17:54:01" 4 | const retrofit = 5 * 1000 5 | 6 | it('ten digits timestamp', () => { 7 | expect(formatTime((d / 1000).toFixed(0))).toBe('7月13日17时54分') 8 | }) 9 | it('test now', () => { 10 | expect(formatTime(+new Date() - 1)).toBe('刚刚') 11 | }) 12 | it('less two minute', () => { 13 | expect(formatTime(+new Date() - 60 * 2 * 1000 + retrofit)).toBe('2分钟前') 14 | }) 15 | it('less two hour', () => { 16 | expect(formatTime(+new Date() - 60 * 60 * 2 * 1000 + retrofit)).toBe('2小时前') 17 | }) 18 | it('less one day', () => { 19 | expect(formatTime(+new Date() - 60 * 60 * 24 * 1 * 1000)).toBe('1天前') 20 | }) 21 | it('more than one day', () => { 22 | expect(formatTime(d)).toBe('7月13日17时54分') 23 | }) 24 | it('format', () => { 25 | expect(formatTime(d, '{y}-{m}-{d} {h}:{i}')).toBe('2018-07-13 17:54') 26 | expect(formatTime(d, '{y}-{m}-{d}')).toBe('2018-07-13') 27 | expect(formatTime(d, '{y}/{m}/{d} {h}-{i}')).toBe('2018/07/13 17-54') 28 | }) 29 | }) 30 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/people.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/router/modules/table.js: -------------------------------------------------------------------------------- 1 | /** When your routing table is too long, you can split it into small modules**/ 2 | 3 | import Layout from '@/layout' 4 | 5 | const tableRouter = { 6 | path: '/table', 7 | component: Layout, 8 | redirect: '/table/complex-table', 9 | name: 'Table', 10 | meta: { 11 | title: 'Table', 12 | icon: 'table' 13 | }, 14 | children: [ 15 | { 16 | path: 'dynamic-table', 17 | component: () => import('@/views/table/dynamicTable/index'), 18 | name: 'DynamicTable', 19 | meta: { title: 'dynamicTable' } 20 | }, 21 | { 22 | path: 'drag-table', 23 | component: () => import('@/views/table/dragTable'), 24 | name: 'DragTable', 25 | meta: { title: 'dragTable' } 26 | }, 27 | { 28 | path: 'inline-edit-table', 29 | component: () => import('@/views/table/inlineEditTable'), 30 | name: 'InlineEditTable', 31 | meta: { title: 'inlineEditTable' } 32 | }, 33 | { 34 | path: 'complex-table', 35 | component: () => import('@/views/table/complexTable'), 36 | name: 'ComplexTable', 37 | meta: { title: 'complexTable' } 38 | } 39 | ] 40 | } 41 | export default tableRouter 42 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/qiniu/upload.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 42 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/excel/uploadExcel.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 43 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/components-demo/dragSelect.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 44 | -------------------------------------------------------------------------------- /vue-element-admin/src/router/modules/readPapers.js: -------------------------------------------------------------------------------- 1 | import Layout from '@/layout' 2 | const readRouter = { 3 | path: '/readPapers', 4 | component: Layout, 5 | redirect: 'noredirect', 6 | name: 'readPapers', 7 | alwaysShow: true, 8 | meta: { 9 | title: 'readPapers', 10 | icon: 'project' 11 | // view_id: 'main-main-examPaperClassList,main-examPaperClassnate' 12 | }, 13 | children: [{ 14 | path: 'waitClass', // 待批班级 15 | component: () => import('@/views/readPapers/waitClass'), 16 | name: 'waitClass', 17 | meta: { 18 | title: 'waitClass', 19 | noCache: true, 20 | view_id: 'main-examinationPapers' 21 | } 22 | }, 23 | { 24 | path: 'classmate', // 待批学生 25 | component: () => import('@/views/readPapers/classmate'), // Parent router-view 26 | name: 'classmate', 27 | hidden: true, 28 | meta: { title: 'classmate', noCache: true, view_id: 'main-examPaperClassmate' } 29 | }, 30 | { 31 | path: 'getscore', // 提交批卷分数 32 | component: () => import('@/views/readPapers/getscore'), // Parent router-view 33 | name: 'getscore', 34 | hidden: true, 35 | meta: { title: 'getscore', noCache: true, view_id: 'main-examDetail' } 36 | }] 37 | } 38 | export default readRouter 39 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/language.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/tests/unit/utils/validate.spec.js: -------------------------------------------------------------------------------- 1 | import { validUsername, validURL, validLowerCase, validUpperCase, validAlphabets } from '@/utils/validate.js' 2 | describe('Utils:validate', () => { 3 | it('validUsername', () => { 4 | expect(validUsername('admin')).toBe(true) 5 | expect(validUsername('editor')).toBe(true) 6 | expect(validUsername('xxxx')).toBe(false) 7 | }) 8 | it('validURL', () => { 9 | expect(validURL('https://github.com/PanJiaChen/vue-element-admin')).toBe(true) 10 | expect(validURL('http://github.com/PanJiaChen/vue-element-admin')).toBe(true) 11 | expect(validURL('github.com/PanJiaChen/vue-element-admin')).toBe(false) 12 | }) 13 | it('validLowerCase', () => { 14 | expect(validLowerCase('abc')).toBe(true) 15 | expect(validLowerCase('Abc')).toBe(false) 16 | expect(validLowerCase('123abc')).toBe(false) 17 | }) 18 | it('validUpperCase', () => { 19 | expect(validUpperCase('ABC')).toBe(true) 20 | expect(validUpperCase('Abc')).toBe(false) 21 | expect(validUpperCase('123ABC')).toBe(false) 22 | }) 23 | it('validAlphabets', () => { 24 | expect(validAlphabets('ABC')).toBe(true) 25 | expect(validAlphabets('Abc')).toBe(true) 26 | expect(validAlphabets('123aBC')).toBe(false) 27 | }) 28 | }) 29 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/eye-open.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/utils/openWindow.js: -------------------------------------------------------------------------------- 1 | /** 2 | *Created by jiachenpan on 16/11/29. 3 | * @param {Sting} url 4 | * @param {Sting} title 5 | * @param {Number} w 6 | * @param {Number} h 7 | */ 8 | export default function openWindow(url, title, w, h) { 9 | // Fixes dual-screen position Most browsers Firefox 10 | const dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : screen.left 11 | const dualScreenTop = window.screenTop !== undefined ? window.screenTop : screen.top 12 | 13 | const width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width 14 | const height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height 15 | 16 | const left = ((width / 2) - (w / 2)) + dualScreenLeft 17 | const top = ((height / 2) - (h / 2)) + dualScreenTop 18 | const newWindow = window.open(url, title, 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=yes, copyhistory=no, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left) 19 | 20 | // Puts focus on the newWindow 21 | if (window.focus) { 22 | newWindow.focus() 23 | } 24 | } 25 | 26 | -------------------------------------------------------------------------------- /vue-element-admin/src/directive/el-table/adaptive.js: -------------------------------------------------------------------------------- 1 | 2 | import { addResizeListener, removeResizeListener } from 'element-ui/src/utils/resize-event' 3 | 4 | /** 5 | * How to use 6 | * ... 7 | * el-table height is must be set 8 | * bottomOffset: 30(default) // The height of the table from the bottom of the page. 9 | */ 10 | 11 | const doResize = (el, binding, vnode) => { 12 | const { componentInstance: $table } = vnode 13 | 14 | const { value } = binding 15 | 16 | if (!$table.height) { 17 | throw new Error(`el-$table must set the height. Such as height='100px'`) 18 | } 19 | const bottomOffset = (value && value.bottomOffset) || 30 20 | 21 | if (!$table) return 22 | 23 | const height = window.innerHeight - el.getBoundingClientRect().top - bottomOffset 24 | $table.layout.setHeight(height) 25 | $table.doLayout() 26 | } 27 | 28 | export default { 29 | bind(el, binding, vnode) { 30 | el.resizeListener = () => { 31 | doResize(el, binding, vnode) 32 | } 33 | 34 | addResizeListener(el, el.resizeListener) 35 | }, 36 | inserted(el, binding, vnode) { 37 | doResize(el, binding, vnode) 38 | }, 39 | unbind(el) { 40 | removeResizeListener(el, el.resizeListener) 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /vue-element-admin/mock/remoteSearch.js: -------------------------------------------------------------------------------- 1 | import Mock from 'mockjs' 2 | 3 | const NameList = [] 4 | const count = 100 5 | 6 | for (let i = 0; i < count; i++) { 7 | NameList.push(Mock.mock({ 8 | name: '@first' 9 | })) 10 | } 11 | NameList.push({ name: 'mock-Pan' }) 12 | 13 | export default [ 14 | // username search 15 | { 16 | url: '/search/user', 17 | type: 'get', 18 | response: config => { 19 | const { name } = config.query 20 | const mockNameList = NameList.filter(item => { 21 | const lowerCaseName = item.name.toLowerCase() 22 | return !(name && lowerCaseName.indexOf(name.toLowerCase()) < 0) 23 | }) 24 | return { 25 | code: 20000, 26 | data: { items: mockNameList } 27 | } 28 | } 29 | }, 30 | 31 | // transaction list 32 | { 33 | url: '/transaction/list', 34 | type: 'get', 35 | response: _ => { 36 | return { 37 | code: 20000, 38 | data: { 39 | total: 20, 40 | 'items|20': [{ 41 | order_no: '@guid()', 42 | timestamp: +Mock.Random.date('T'), 43 | username: '@name()', 44 | price: '@float(1000, 15000, 0, 2)', 45 | 'status|1': ['success', 'pending'] 46 | }] 47 | } 48 | } 49 | } 50 | } 51 | ] 52 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/guide/defineSteps.js: -------------------------------------------------------------------------------- 1 | const steps = [ 2 | { 3 | element: '#hamburger-container', 4 | popover: { 5 | title: 'Hamburger', 6 | description: 'Open && Close sidebar', 7 | position: 'bottom' 8 | } 9 | }, 10 | { 11 | element: '#breadcrumb-container', 12 | popover: { 13 | title: 'Breadcrumb', 14 | description: 'Indicate the current page location', 15 | position: 'bottom' 16 | } 17 | }, 18 | { 19 | element: '#header-search', 20 | popover: { 21 | title: 'Page Search', 22 | description: 'Page search, quick navigation', 23 | position: 'left' 24 | } 25 | }, 26 | { 27 | element: '#screenfull', 28 | popover: { 29 | title: 'Screenfull', 30 | description: 'Set the page into fullscreen', 31 | position: 'left' 32 | } 33 | }, 34 | { 35 | element: '#size-select', 36 | popover: { 37 | title: 'Switch Size', 38 | description: 'Switch the system size', 39 | position: 'left' 40 | } 41 | }, 42 | { 43 | element: '#tags-view-container', 44 | popover: { 45 | title: 'Tags view', 46 | description: 'The history of the page you visited', 47 | position: 'bottom' 48 | }, 49 | padding: 0 50 | } 51 | ] 52 | 53 | export default steps 54 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/example/components/Dropdown/Platform.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 47 | -------------------------------------------------------------------------------- /vue-element-admin/src/components/Screenfull/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 50 | 51 | 61 | -------------------------------------------------------------------------------- /vue-element-admin/src/components/Hamburger/index.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 32 | 33 | 45 | -------------------------------------------------------------------------------- /vue-element-admin/src/lang/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import VueI18n from 'vue-i18n' 3 | import Cookies from 'js-cookie' 4 | import elementEnLocale from 'element-ui/lib/locale/lang/en' // element-ui lang 5 | import elementZhLocale from 'element-ui/lib/locale/lang/zh-CN'// element-ui lang 6 | import elementEsLocale from 'element-ui/lib/locale/lang/es'// element-ui lang 7 | import enLocale from './en' 8 | import zhLocale from './zh' 9 | import esLocale from './es' 10 | 11 | Vue.use(VueI18n) 12 | 13 | const messages = { 14 | en: { 15 | ...enLocale, 16 | ...elementEnLocale 17 | }, 18 | zh: { 19 | ...zhLocale, 20 | ...elementZhLocale 21 | }, 22 | es: { 23 | ...esLocale, 24 | ...elementEsLocale 25 | } 26 | } 27 | export function getLanguage() { 28 | const chooseLanguage = Cookies.get('language') 29 | if (chooseLanguage) return chooseLanguage 30 | 31 | // if has not choose language 32 | const language = (navigator.language || navigator.browserLanguage).toLowerCase() 33 | const locales = Object.keys(messages) 34 | for (const locale of locales) { 35 | if (language.indexOf(locale) > -1) { 36 | return locale 37 | } 38 | } 39 | return 'en' 40 | } 41 | const i18n = new VueI18n({ 42 | // set locale 43 | // options: en | zh | es 44 | locale: getLanguage(), 45 | // set locale messages 46 | messages 47 | }) 48 | 49 | export default i18n 50 | -------------------------------------------------------------------------------- /vue-element-admin/src/views/tab/index.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 40 | 41 | 46 | -------------------------------------------------------------------------------- /vue-element-admin/src/icons/svg/404.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue-element-admin/src/router/modules/examination.js: -------------------------------------------------------------------------------- 1 | /** When your routing table is too long, you can split it into small modules**/ 2 | 3 | import Layout from '@/layout' 4 | 5 | const examination = { 6 | path: '/examination', 7 | component: Layout, 8 | redirect: 'noredirect', 9 | name: 'examination', 10 | alwaysShow: true, 11 | meta: { 12 | title: 'examination', 13 | icon: 'documentation' 14 | }, 15 | children: [{ 16 | path: 'addexamination', 17 | component: () => 18 | import('@/views/examination/addexamination'), 19 | name: 'Addexamination', 20 | meta: { title: 'Addexamination', noCache: true, view_id: 'main-addExam' } 21 | }, 22 | { 23 | path: 'listexamination', 24 | component: () => 25 | import('@/views/examination/listexamination'), 26 | name: 'Listexamination', 27 | meta: { title: 'Listexamination', noCache: true, view_id: 'main-examList' } 28 | }, 29 | { 30 | path: 'add', 31 | hidden: true, 32 | component: () => 33 | import('@/views/examination/add'), 34 | name: 'add', 35 | meta: { title: 'add', noCache: true, view_id: 'main-examEdit' } 36 | }, 37 | { 38 | path: 'detail', 39 | hidden: true, 40 | component: () => 41 | import('@/views/examination/detail'), 42 | name: 'detail', 43 | meta: { title: 'detail', noCache: true, view_id: 'main-examDetail' } 44 | }] 45 | } 46 | 47 | export default examination 48 | -------------------------------------------------------------------------------- /vue-element-admin/plop-templates/view/prompt.js: -------------------------------------------------------------------------------- 1 | const { notEmpty } = require('../utils.js') 2 | 3 | module.exports = { 4 | description: 'generate a view', 5 | prompts: [{ 6 | type: 'input', 7 | name: 'name', 8 | message: 'view name please', 9 | validate: notEmpty('name') 10 | }, 11 | { 12 | type: 'checkbox', 13 | name: 'blocks', 14 | message: 'Blocks:', 15 | choices: [{ 16 | name: '