├── public ├── favicon.ico ├── img │ ├── 0-1.jpg │ ├── 0-2.jpg │ ├── 0-3.png │ ├── 0-6.png │ └── github-16.png └── index.html ├── src ├── assets │ └── logo.png ├── App.vue ├── utils │ ├── config.js │ ├── sessionStorage.js │ └── request.js ├── main.js ├── pages │ ├── welfare │ │ └── girls.vue │ ├── org │ │ ├── dept-add.vue │ │ ├── dept-edit.vue │ │ ├── role-add.vue │ │ ├── permission-list.vue │ │ ├── dept-list.vue │ │ ├── role-list.vue │ │ ├── role-edit.vue │ │ ├── permission-add.vue │ │ ├── user-add.vue │ │ ├── user-edit.vue │ │ ├── permission-edit.vue │ │ └── user-list.vue │ ├── book │ │ ├── book-details.vue │ │ ├── chapter-add.vue │ │ ├── chapter-edit.vue │ │ ├── book-read.vue │ │ ├── author-list.vue │ │ ├── author-details.vue │ │ ├── chapter-list.vue │ │ ├── author-add.vue │ │ ├── author-edit.vue │ │ ├── book-list.vue │ │ ├── book-edit.vue │ │ └── book-add.vue │ ├── dictionary │ │ ├── edit.vue │ │ ├── add.vue │ │ └── list.vue │ ├── user │ │ ├── password.vue │ │ └── info.vue │ ├── login.vue │ └── home.vue └── router │ └── index.js ├── babel.config.js ├── vue.config.js ├── .gitignore ├── LICENSE ├── package.json └── README.md /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zealon159/book-ms-ui/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /public/img/0-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zealon159/book-ms-ui/HEAD/public/img/0-1.jpg -------------------------------------------------------------------------------- /public/img/0-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zealon159/book-ms-ui/HEAD/public/img/0-2.jpg -------------------------------------------------------------------------------- /public/img/0-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zealon159/book-ms-ui/HEAD/public/img/0-3.png -------------------------------------------------------------------------------- /public/img/0-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zealon159/book-ms-ui/HEAD/public/img/0-6.png -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zealon159/book-ms-ui/HEAD/src/assets/logo.png -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/cli-plugin-babel/preset' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /public/img/github-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zealon159/book-ms-ui/HEAD/public/img/github-16.png -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /src/utils/config.js: -------------------------------------------------------------------------------- 1 | /** 公共配置 */ 2 | 3 | // API接口前缀 4 | export const baseApi = "/api"; 5 | 6 | /** 图片路径处理 */ 7 | export function handleImgUri(imgUrl){ 8 | return this.baseApi + "/" + imgUrl; 9 | } 10 | -------------------------------------------------------------------------------- /src/utils/sessionStorage.js: -------------------------------------------------------------------------------- 1 | let db = { 2 | save (key, value) { 3 | window.sessionStorage.setItem(key, JSON.stringify(value)) 4 | }, 5 | get (key) { 6 | return JSON.parse(window.sessionStorage.getItem(key)) 7 | }, 8 | remove (key) { 9 | window.sessionStorage.removeItem(key) 10 | }, 11 | clear () { 12 | window.sessionStorage.clear() 13 | } 14 | } 15 | 16 | export default db -------------------------------------------------------------------------------- /vue.config.js: -------------------------------------------------------------------------------- 1 | // vue.config.js 2 | module.exports = { 3 | publicPath: './', 4 | devServer: { 5 | port: 9000, 6 | proxy: { 7 | "/api": { 8 | //请求源地址 9 | target: 'http://localhost:8002', 10 | //是否跨域 11 | changeOrigin: true, 12 | ws: true, 13 | pathRewrite: { 14 | '^/api': '' 15 | } 16 | } 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | package-lock.json.json 4 | public/img/girls/00-0.jpg 5 | public/img/girls/00-1.jpg 6 | public/img/girls/00-2.jpg 7 | public/img/girls/00-3.jpg 8 | public/img/girls/00-4.jpg 9 | public/img/girls/00-5.jpg 10 | public/img/girls/00-6.jpg 11 | public/img/girls/00-7.jpg 12 | public/img/girls/00-8.jpg 13 | public/img/girls/00-9.jpg 14 | public/img/girls/00-10.jpg 15 | public/img/girls/00-11.jpg 16 | public/img/girls/00-12.jpg 17 | public/img/girls/00-13.jpg 18 | public/img/girls/00-14.jpg 19 | public/img/girls/00-15.jpg 20 | public/img/girls/00-16.jpg 21 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | book-ms 9 | 10 | 11 | 14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from './App.vue' 3 | import ElementUI from 'element-ui' 4 | import 'element-ui/lib/theme-chalk/index.css' 5 | import iconPicker from 'vue-fontawesome-elementui-icon-picker' 6 | import {postRequest} from "./utils/request" 7 | import {postKeyValueRequest} from "./utils/request" 8 | import {putRequest} from "./utils/request" 9 | import {deleteRequest} from "./utils/request" 10 | import {getRequest} from "./utils/request" 11 | import router from "./router" 12 | import db from "./utils/sessionStorage" 13 | import * as config from "./utils/config" 14 | 15 | Vue.config.productionTip = false 16 | Vue.use(ElementUI) 17 | Vue.use(iconPicker) 18 | 19 | Vue.prototype.db = db 20 | Vue.prototype.config = config 21 | Vue.prototype.postRequest = postRequest; 22 | Vue.prototype.postKeyValueRequest = postKeyValueRequest; 23 | Vue.prototype.putRequest = putRequest; 24 | Vue.prototype.deleteRequest = deleteRequest; 25 | Vue.prototype.getRequest = getRequest; 26 | 27 | new Vue({ 28 | router, 29 | render: h => h(App), 30 | }).$mount('#app') 31 | -------------------------------------------------------------------------------- /src/pages/welfare/girls.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 35 | 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 光彩盛年 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 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "book-ms-ui", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build", 8 | "lint": "vue-cli-service lint" 9 | }, 10 | "dependencies": { 11 | "axios": "^0.19.1", 12 | "core-js": "^3.4.4", 13 | "element-ui": "^2.13.0", 14 | "vue": "^2.6.10", 15 | "vue-fontawesome-elementui-icon-picker": "^0.1.9", 16 | "vue-multiselect": "^2.1.6", 17 | "vue-router": "^3.1.5" 18 | }, 19 | "devDependencies": { 20 | "@vue/cli-plugin-babel": "^4.1.0", 21 | "@vue/cli-plugin-eslint": "^4.1.0", 22 | "@vue/cli-service": "^4.1.0", 23 | "babel-eslint": "^10.0.3", 24 | "eslint": "^5.16.0", 25 | "eslint-plugin-vue": "^5.0.0", 26 | "vue-template-compiler": "^2.6.10" 27 | }, 28 | "eslintConfig": { 29 | "root": true, 30 | "env": { 31 | "node": true 32 | }, 33 | "extends": [ 34 | "plugin:vue/essential", 35 | "eslint:recommended" 36 | ], 37 | "rules": {}, 38 | "parserOptions": { 39 | "parser": "babel-eslint" 40 | } 41 | }, 42 | "browserslist": [ 43 | "> 1%", 44 | "last 2 versions" 45 | ] 46 | } 47 | -------------------------------------------------------------------------------- /src/pages/org/dept-add.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 60 | 61 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

微图书管理平台

2 | 3 |

4 | 5 | vue 6 | 7 | 8 | element-ui 9 | 10 | 11 | license 12 | 13 |

14 | 15 | 演示地址:[http://books.zealon.cn/](http://books.zealon.cn/) 16 | 17 | ## 项目介绍 18 | 19 | 基于 vue.js 、element-ui 搭建一个极简的图书管理平台。项目功能不是很多,但是前后端分离的项目,该用到的技术点也都会涉及到,很适合开始准备学 vue 的同学,具体有以下特点: 20 | 21 | - 完备组织架构体系,基于 RBAC 模型实现用户权限配置 22 | 23 | - 基于导航守卫,动态生成路由、用户菜单、面包屑导航等 24 | 25 | - axios 异步请求统一封装,统一处理操作结果通知 26 | - element-ui 组件使用覆盖率达到 70% 以上 27 | 28 | 项目接口工程基于 SpringBoot2.x 开发,[点击进入仓库](https://github.com/Zealon159/book-ms-interface) 29 | 30 | ## 项目截图 31 | 32 | ![image](https://zealon.cn/upload/github/book-ms-ui/login.jpg) 33 | 34 | ![image](https://zealon.cn/upload/github/book-ms-ui/home.jpg) 35 | 36 | ![image](https://zealon.cn/upload/github/book-ms-ui/book-list.jpg) 37 | 38 | ![image](https://zealon.cn/upload/github/book-ms-ui/book.jpg) 39 | 40 | ## 其它说明 41 | 42 | 虽是一款图书管理平台,更恰切滴描述的话,其实是一个后台管理的脚手架,任何后台管理内容的方式都大同小异,无非是一套通用的组织权限管理,在这个基础上,也可以用来开发自己想维护的任何模块,对吧 43 | 44 | ## 快速开始 45 | 46 | ### 工程结构 47 | 48 | ``` 49 | - assets / 资源 50 | - router / 路由 51 | - utils / 52 | - config / 静态配置 53 | - request / axios封装 54 | - sessionStorage / 本地存储封装 55 | - style / 样式文件 56 | - App.vue 57 | - vue.config.js 58 | - pages / 组件 59 | - book / 图书、章节、作者 60 | - dictionary / 数据字典 61 | - org / 组织、用户、角色、权限 62 | - user / 个人信息 63 | - welfare / 小福利 64 | ``` 65 | 66 | ### 环境安装 67 | 68 | 1.拉取项目至本地 69 | 70 | 命令:`git clone https://github.com/Zealon159/book-ms-ui.git` 71 | 72 | 2.初始化npm依赖 73 | 74 | 使用cd命令进入本地工程目录,再用 cnpm 安装依赖,`cnpm install` 75 | 76 | 3.启动 77 | 78 | 命令:`npm run serve`,启动成功 `http://localhost:9000/ `,默认端口9000,可以进入 `vue.config.js` 配置文件修改端口 79 | 80 | ## License 81 | 82 | [MIT](https://github.com/Zealon159/book-ms-ui/blob/master/LICENSE) 83 | 84 | Copyright (c) 2020 光彩盛年 85 | -------------------------------------------------------------------------------- /src/pages/org/dept-edit.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 72 | 73 | -------------------------------------------------------------------------------- /src/pages/book/book-details.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 65 | 66 | -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | import db from "../utils/sessionStorage" 4 | import {getRequest} from "../utils/request" 5 | Vue.use(Router) 6 | 7 | // 静态路由 8 | const login = r => require.ensure([], () => r(require('@/pages/login')), 'login'); 9 | const home = r => require.ensure([], () => r(require('@/pages/home')), 'home'); 10 | const userinfo = r => require.ensure([], () => r(require('@/pages/user/info')), 'userinfo'); 11 | const pwd = r => require.ensure([], () => r(require('@/pages/user/password')), 'pwd'); 12 | const constRouter = [ 13 | { 14 | path: '/', 15 | name: '登录页', 16 | component: login, 17 | hidden: true 18 | } 19 | ] 20 | 21 | // 动态路由主页 22 | const dynamicRouter = [ 23 | { 24 | path: '/home', 25 | name: '主页', 26 | component: home, 27 | hidden: true, 28 | children:[ 29 | { 30 | path: '/userinfo', 31 | name: '个人中心', 32 | component: userinfo, 33 | hidden: false , 34 | meta:[ 35 | {"name":"个人中心","path":""} 36 | ] 37 | }, 38 | { 39 | path: '/pwd', 40 | name: '修改密码', 41 | component: pwd, 42 | hidden: false , 43 | meta:[ 44 | {"name":"个人中心","path":"/userinfo"},{"name":"修改密码","path":""} 45 | ] 46 | } 47 | ] 48 | } 49 | ] 50 | 51 | let router = new Router({ 52 | routes: constRouter 53 | }) 54 | 55 | // 导航守卫,处理动态路由 56 | let asyncRouter 57 | router.beforeEach((to, from, next) => { 58 | let user = db.get("USER") 59 | let userRouter = db.get('USER_ROUTER') 60 | 61 | if(user && user.userId){ 62 | if (!asyncRouter || asyncRouter=='') { 63 | if (!userRouter || userRouter=='' || userRouter==null) { 64 | getRequest('/system/org/permission/get-user-router', {}).then(resp => { 65 | if (resp.code == 200) { 66 | asyncRouter = resp.data 67 | if(resp.data.length>0){ 68 | db.save('USER_ROUTER', resp.data) 69 | loadAsyncRouter(to, next) 70 | } 71 | } 72 | }) 73 | } else { 74 | asyncRouter = userRouter 75 | loadAsyncRouter(to, next) 76 | } 77 | } else { 78 | next() 79 | } 80 | } else { 81 | next() 82 | } 83 | }) 84 | 85 | // 载入异步路由 86 | function loadAsyncRouter (to, next) { 87 | if(asyncRouter.length > 0){ 88 | asyncRouter = filterAsyncRouter(asyncRouter) 89 | dynamicRouter.find(v => v.path === '/home').children.push(...asyncRouter) 90 | router.addRoutes(dynamicRouter) 91 | } 92 | next({...to, replace: true}) 93 | } 94 | 95 | // 过滤路由 96 | function filterAsyncRouter(routes){ 97 | return routes.filter((route) => { 98 | route.component = resolveComponent(route.component) 99 | return true 100 | }) 101 | } 102 | 103 | // 解析组件 104 | function resolveComponent (path) { 105 | return function (resolve) { 106 | import(`@/pages/${path}.vue`).then(mod => { 107 | resolve(mod) 108 | }) 109 | } 110 | } 111 | 112 | export default router -------------------------------------------------------------------------------- /src/pages/dictionary/edit.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 76 | 77 | -------------------------------------------------------------------------------- /src/pages/book/chapter-add.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | 82 | 83 | -------------------------------------------------------------------------------- /src/pages/book/chapter-edit.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | 87 | 88 | -------------------------------------------------------------------------------- /src/pages/user/password.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 77 | 78 | -------------------------------------------------------------------------------- /src/pages/org/role-add.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | 93 | 94 | -------------------------------------------------------------------------------- /src/pages/dictionary/add.vue: -------------------------------------------------------------------------------- 1 | 26 | 27 | 82 | 83 | -------------------------------------------------------------------------------- /src/utils/request.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | import {Message} from 'element-ui'; 3 | import router from '../router' 4 | import db from '../utils/sessionStorage' 5 | import * as config from '../utils/config' 6 | 7 | //axios.defaults.withCredentials = true; 8 | axios.interceptors.response.use(success => { 9 | if (success.status && success.status == 200 && success.data.status == 500) { 10 | Message.error({message: success.data.msg}) 11 | return; 12 | } 13 | if (success.data.msg) { 14 | if(success.data.code == 200){ 15 | Message.success({message: success.data.msg}) 16 | }else{ 17 | Message.warning({message: success.data.msg}) 18 | } 19 | } 20 | return success.data; 21 | }, error => { 22 | if (error.response.status == 504 || error.response.status == 404) { 23 | Message.error({message: '服务器被吃了( ╯□╰ )'}) 24 | } else if (error.response.status == 403) { 25 | Message.error({message: '权限不足,请联系管理员'}) 26 | } else if (error.response.status == 401) { 27 | // 防止重复弹出消息 28 | if(db.get("LOGINFLAG") == "0"){ 29 | Message.error({message: '尚未登录或登录状态已过期,请登录'}) 30 | db.remove("LOGINFLAG") 31 | db.save("LOGINFLAG","1") 32 | } 33 | router.replace('/'); 34 | } else { 35 | if (error.response.data.msg) { 36 | Message.error({message: error.response.data.msg}) 37 | } else { 38 | Message.error({message: '未知错误!'}) 39 | } 40 | } 41 | return; 42 | }) 43 | 44 | let base = config.baseApi; 45 | 46 | export const postKeyValueRequest = (url, params) => { 47 | return axios({ 48 | method: 'post', 49 | url: `${base}${url}`, 50 | data: params, 51 | transformRequest: [function (data) { 52 | let ret = ''; 53 | for (let i in data) { 54 | ret += encodeURIComponent(i) + '=' + encodeURIComponent(data[i]) + '&' 55 | } 56 | return ret; 57 | }], 58 | headers: { 59 | 'Content-Type': 'application/x-www-form-urlencoded' 60 | } 61 | }); 62 | } 63 | export const postRequest = (url, params) => { 64 | return axios({ 65 | method: 'post', 66 | url: `${base}${url}`, 67 | data: params 68 | }) 69 | } 70 | export const putRequest = (url, params) => { 71 | return axios({ 72 | method: 'put', 73 | url: `${base}${url}`, 74 | data: params 75 | }) 76 | } 77 | export const getRequest = (url, params) => { 78 | let apiUrl = `${base}${url}`; 79 | apiUrl = getApiUrl(apiUrl,params); 80 | // 请求 81 | return axios({ 82 | method: 'get', 83 | url: apiUrl, 84 | data: params 85 | }) 86 | } 87 | export const deleteRequest = (url, params) => { 88 | let apiUrl = `${base}${url}`; 89 | apiUrl = getApiUrl(apiUrl,params); 90 | return axios({ 91 | method: 'delete', 92 | url: apiUrl, 93 | data: params 94 | }) 95 | } 96 | 97 | // 处理参数转换 98 | function getApiUrl(url,params){ 99 | let apiUrl = url; 100 | let i = 0; 101 | for (const key in params) { 102 | if (params.hasOwnProperty(key)) { 103 | const value = params[key]; 104 | const param = key+"="+value; 105 | let s = '?'; 106 | if ( i > 0 ){ 107 | s = '&'; 108 | } 109 | apiUrl = apiUrl+s+param; 110 | i++; 111 | } 112 | } 113 | return apiUrl; 114 | } -------------------------------------------------------------------------------- /src/pages/org/permission-list.vue: -------------------------------------------------------------------------------- 1 | 40 | 41 | 95 | 96 | -------------------------------------------------------------------------------- /src/pages/book/book-read.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 80 | 81 | -------------------------------------------------------------------------------- /src/pages/org/dept-list.vue: -------------------------------------------------------------------------------- 1 | 41 | 42 | 102 | 103 | -------------------------------------------------------------------------------- /src/pages/org/role-list.vue: -------------------------------------------------------------------------------- 1 | 41 | 42 | 102 | 103 | -------------------------------------------------------------------------------- /src/pages/dictionary/list.vue: -------------------------------------------------------------------------------- 1 | 45 | 46 | 106 | 107 | -------------------------------------------------------------------------------- /src/pages/book/author-list.vue: -------------------------------------------------------------------------------- 1 | 48 | 49 | 112 | 113 | -------------------------------------------------------------------------------- /src/pages/book/author-details.vue: -------------------------------------------------------------------------------- 1 | 34 | 35 | 84 | 85 | -------------------------------------------------------------------------------- /src/pages/login.vue: -------------------------------------------------------------------------------- 1 | 28 | 29 | 87 | 88 | -------------------------------------------------------------------------------- /src/pages/org/role-edit.vue: -------------------------------------------------------------------------------- 1 | 34 | 35 | 116 | 117 | -------------------------------------------------------------------------------- /src/pages/book/chapter-list.vue: -------------------------------------------------------------------------------- 1 | 48 | 49 | 122 | 123 | -------------------------------------------------------------------------------- /src/pages/org/permission-add.vue: -------------------------------------------------------------------------------- 1 | 41 | 42 | 110 | 111 | -------------------------------------------------------------------------------- /src/pages/org/user-add.vue: -------------------------------------------------------------------------------- 1 | 37 | 38 | 112 | 113 | -------------------------------------------------------------------------------- /src/pages/book/author-add.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | 104 | 105 | -------------------------------------------------------------------------------- /src/pages/org/user-edit.vue: -------------------------------------------------------------------------------- 1 | 35 | 36 | 121 | 122 | -------------------------------------------------------------------------------- /src/pages/org/permission-edit.vue: -------------------------------------------------------------------------------- 1 | 41 | 42 | 119 | 120 | -------------------------------------------------------------------------------- /src/pages/book/author-edit.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | 119 | 120 | -------------------------------------------------------------------------------- /src/pages/book/book-list.vue: -------------------------------------------------------------------------------- 1 | 68 | 69 | 165 | 166 | -------------------------------------------------------------------------------- /src/pages/user/info.vue: -------------------------------------------------------------------------------- 1 | 39 | 40 | 141 | 142 | -------------------------------------------------------------------------------- /src/pages/org/user-list.vue: -------------------------------------------------------------------------------- 1 | 84 | 85 | 202 | 203 | -------------------------------------------------------------------------------- /src/pages/book/book-edit.vue: -------------------------------------------------------------------------------- 1 | 89 | 90 | 224 | 225 | -------------------------------------------------------------------------------- /src/pages/book/book-add.vue: -------------------------------------------------------------------------------- 1 | 104 | 105 | 253 | 254 | -------------------------------------------------------------------------------- /src/pages/home.vue: -------------------------------------------------------------------------------- 1 | 101 | 102 | 203 | 204 | --------------------------------------------------------------------------------