diff --git a/.gitignore b/.gitignore index 03449e44d4337293a6e886e746750192d2ad6970..f66c4f5d5a8e04b0b18f1be82f623eb37d7f156f 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,5 @@ Homestead.yaml npm-debug.log yarn-error.log .idea -public \ No newline at end of file +public +dist \ No newline at end of file diff --git a/README.en.md b/README.en.md index 888b122e17514202d4a4f12965b62a971f83d41d..a469cdb1c2b1406d8423d31932c496d1d6ca0921 100644 --- a/README.en.md +++ b/README.en.md @@ -8,11 +8,11 @@ Software architecture description #### Installation -1. composer install -2. cp .env.example .env -3. 生成 APP_KEY:php artisan key:generate -4. JWT的key:php artisan jwt:secret -5. 导入sql:laravel-vue-admin +* 命令行:`composer install` +* 命令行:`cp .env.example .env` +* 命令行,生成 APP_KEY:`php artisan key:generate` +* 命令行,JWT的key:`php artisan jwt:secret` +* 导入根目录sql:laravel-vue-admin.sql #### Instructions diff --git a/README.md b/README.md index 19385307a5a5805bd662f46731813f1aa2d66dbe..516f54dd543abd103b83371ca7123629a25f653c 100644 --- a/README.md +++ b/README.md @@ -13,11 +13,11 @@ Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN #### 安装教程 -1. composer install -2. cp .env.example .env -3. 生成 APP_KEY:php artisan key:generate -4. JWT的key:php artisan jwt:secret -5. 导入sql:laravel-vue-admin +* 命令行:`composer install` +* 命令行:`cp .env.example .env` +* 命令行,生成 APP_KEY:`php artisan key:generate` +* 命令行,JWT的key:`php artisan jwt:secret` +* 导入根目录sql:laravel-vue-admin.sql #### 使用说明 diff --git a/app/Modules/Admin/Entities/Article/Article.php b/app/Modules/Admin/Entities/Article/Article.php index 693a2a020238991262a72788627dbd7174032026..f8c9daaff7e4c502e0091bdb66bd9d4c563f4895 100644 --- a/app/Modules/Admin/Entities/Article/Article.php +++ b/app/Modules/Admin/Entities/Article/Article.php @@ -3,9 +3,28 @@ namespace App\Modules\Admin\Entities\Article; use App\Models\Model; +use Illuminate\Support\Facades\Storage; class Article extends Model { protected $primaryKey = 'article_id'; protected $is_delete = 0; + + public function getArticleCoverAttribute($key) + { + if (empty($key)) return $key; + return Storage::url($key); + } + + public function setArticleCoverAttribute($key) + { + if (!empty($key)) { + $this->attributes['article_cover'] = str_replace(Storage::url('/'), '', $key); + } + } + + public function category() + { + return $this->hasOne(ArticleCategory::class, 'category_id', 'category_id'); + } } diff --git a/app/Modules/Admin/Http/Controllers/BaseController.php b/app/Modules/Admin/Http/Controllers/BaseController.php index 29ce99d8209ff545ab3fa31694d10f5d945f4159..c7209c26f28e7345c0de5370314ce3fff921687b 100644 --- a/app/Modules/Admin/Http/Controllers/BaseController.php +++ b/app/Modules/Admin/Http/Controllers/BaseController.php @@ -35,12 +35,12 @@ class BaseController extends Controller * * @return \Illuminate\Http\JsonResponse */ - public function detail($id = 0) + public function detail(Request $request) { if (!isset($this->service)){ return $this->successJson([], '请先设置Service或者重写方法!'); } - return $this->successJson(empty($id) ? [] : $this->service->detail($id)); + return $this->successJson($this->service->detail($request)); } /** diff --git a/app/Modules/Admin/Http/Middleware/AdminLog.php b/app/Modules/Admin/Http/Middleware/AdminLog.php index fe78bdcd1322562cb01d0a35aa70e07bcfd3712e..c07e6a39374f2679029621ef8af33da17cd52416 100644 --- a/app/Modules/Admin/Http/Middleware/AdminLog.php +++ b/app/Modules/Admin/Http/Middleware/AdminLog.php @@ -21,7 +21,9 @@ class AdminLog $resource = $next($request); - if (strtoupper($request->getMethod()) != 'GET'){ + $method = strtoupper($request->getMethod()); + + if ($method != 'GET'){ $ip_agent = get_client_info(); \App\Modules\Admin\Entities\Log\AdminLog::getInstance()->create([ 'request_data' => json_encode($request->all()), @@ -30,7 +32,7 @@ class AdminLog 'browser_type' => $ip_agent['agent'] ?? $_SERVER['HTTP_USER_AGENT'], 'created_time' => time(), 'log_action' => request()->route()->getActionName(), - 'log_method' => request()->getMethod(), + 'log_method' => $method, 'log_duration' => microtime(true) - LARAVEL_START, 'request_url' => URL::full() ?? get_this_url(), ]); diff --git a/app/Modules/Admin/Http/Requests/Article/ArticleCategoryRequest.php b/app/Modules/Admin/Http/Requests/Article/ArticleCategoryRequest.php index e18508bae1ada494a9b92240085f979af8bbea35..6d8a7ade8bcdecd291719999b7e1ada4c02193ad 100644 --- a/app/Modules/Admin/Http/Requests/Article/ArticleCategoryRequest.php +++ b/app/Modules/Admin/Http/Requests/Article/ArticleCategoryRequest.php @@ -33,7 +33,9 @@ class ArticleCategoryRequest extends BaseRequest public function messages() { return [ - 'category_name.required' => '请输入名称!', + 'category_name.required' => '请输入分类名称!', + 'category_name.max' => '分类名称字数不可超过 256!', + 'category_name.unique' => '分类名称已存在,请更换!', ]; } } diff --git a/app/Modules/Admin/Http/Requests/Article/ArticleRequest.php b/app/Modules/Admin/Http/Requests/Article/ArticleRequest.php index 4ab82d4f376511e50aff1f6c7c111b705085aa9f..104ad616fc381e8b623c4ed8a518a3d0a5e5b330 100644 --- a/app/Modules/Admin/Http/Requests/Article/ArticleRequest.php +++ b/app/Modules/Admin/Http/Requests/Article/ArticleRequest.php @@ -16,25 +16,31 @@ class ArticleRequest extends BaseRequest { $instance = Article::getInstance(); $primarykey = $instance->getKeyName(); - $validate_id = ',' . request()->input($primarykey, 0) . ',' . $primarykey; + $validate_id = ',' . request()->input($primarykey, 0) . ',' . $primarykey; return [ 'article_title' => [ 'required', 'max:256', - 'unique:' . $instance->getTable() . ',article_title' . $validate_id + 'unique:' . $instance->getTable() . ',article_title' . $validate_id, + ], + 'category_id' => [ + 'required', ], 'article_cover' => [ 'required', - ] + ], ]; } public function messages() { return [ - 'article_title.required' => '请输入标题!', - 'article_cover.required' => '请上传封面!', + 'article_title.required' => '请输入文章标题!', + 'article_title.max' => '标题字数不可超过 256!', + 'article_title.unique' => '文章标题已存在,请更换!', + 'category_id.required' => '请选择文章分类!', + 'article_cover.required' => '请上传封面!', ]; } } diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/admins.js b/app/Modules/Admin/Resources/vue-element-admin/api/admins.js index f13e762d950eff1541412a877d29c8307468ce93..6ef7f82a3e65874fdf2ea0bbb84fa9148f62ec90 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/api/admins.js +++ b/app/Modules/Admin/Resources/vue-element-admin/api/admins.js @@ -1,10 +1,11 @@ import request from '@/utils/request' -export function getRolesSelect() { +export function getAdminsSelect(params) { return request({ - url: '/admin_roles/getSelectLists', - method: 'get' - }) + url: '/admins/getSelectLists', + method: 'get', + params + }); } export function getList(params) { diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/articles.js b/app/Modules/Admin/Resources/vue-element-admin/api/articles.js index 0b9c41de2da0a1b1a54c8aeace7cc66e43fdf3cc..f020954a620c770eb07c259909f9c503077db2bd 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/api/articles.js +++ b/app/Modules/Admin/Resources/vue-element-admin/api/articles.js @@ -15,6 +15,14 @@ export function getList(params) { }) } +export function detail(id) { + return request({ + url: '/articles/detail', + method: 'get', + params: { article_id:id } + }) +} + export function create(data) { return request({ url: '/articles', diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/remote-search.js b/app/Modules/Admin/Resources/vue-element-admin/api/remote-search.js new file mode 100644 index 0000000000000000000000000000000000000000..02e42b46e56ac4dbb0bf6e4afb341562cc66eca5 --- /dev/null +++ b/app/Modules/Admin/Resources/vue-element-admin/api/remote-search.js @@ -0,0 +1,17 @@ +import request from '@/utils/request' + +export function searchUser(name) { + return request({ + url: '/vue-element-admin/search/user', + method: 'get', + params: { name } + }) +} + +export function transactionList(query) { + return request({ + url: '/vue-element-admin/transaction/list', + method: 'get', + params: query + }) +} diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/Charts/Keyboard.vue b/app/Modules/Admin/Resources/vue-element-admin/components/Charts/Keyboard.vue index 0b258f3648c7e0a5e2b902fcb3e105256b15bd88..e7d6382501041f51df419de7cd46002e9d39c91d 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/components/Charts/Keyboard.vue +++ b/app/Modules/Admin/Resources/vue-element-admin/components/Charts/Keyboard.vue @@ -1,155 +1,155 @@ diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/Charts/LineMarker.vue b/app/Modules/Admin/Resources/vue-element-admin/components/Charts/LineMarker.vue index 3dd743691ebf2a9926637be3022816a2c9601765..8d97b545f852efb20de21dce5df78ada5fe2c4d9 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/components/Charts/LineMarker.vue +++ b/app/Modules/Admin/Resources/vue-element-admin/components/Charts/LineMarker.vue @@ -1,227 +1,227 @@ diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/Charts/MixChart.vue b/app/Modules/Admin/Resources/vue-element-admin/components/Charts/MixChart.vue index c416542ef581efa04a7dc908cd3ffae83fc29fe0..c8a24b0caad72796aefec37f22b9f6971ccd3428 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/components/Charts/MixChart.vue +++ b/app/Modules/Admin/Resources/vue-element-admin/components/Charts/MixChart.vue @@ -1,271 +1,272 @@ diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/GithubCorner/index.vue b/app/Modules/Admin/Resources/vue-element-admin/components/GithubCorner/index.vue index 970faaf179cd53ccd52c2996827c06be42748772..92f7aa03670addac7326854f0f671c2c0ce6c6c0 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/components/GithubCorner/index.vue +++ b/app/Modules/Admin/Resources/vue-element-admin/components/GithubCorner/index.vue @@ -1,54 +1,56 @@ diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/MarkdownEditor/default-options.js b/app/Modules/Admin/Resources/vue-element-admin/components/MarkdownEditor/default-options.js index 303aa13d377a68406101de08a8f7fe703c1edecb..776ffc27528808bd2b3bc644a91568acdc8d1221 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/components/MarkdownEditor/default-options.js +++ b/app/Modules/Admin/Resources/vue-element-admin/components/MarkdownEditor/default-options.js @@ -1,31 +1,31 @@ // doc: https://nhnent.github.io/tui.editor/api/latest/ToastUIEditor.html#ToastUIEditor export default { - minHeight: '200px', - previewStyle: 'vertical', - useCommandShortcut: true, - useDefaultHTMLSanitizer: true, - usageStatistics: false, - hideModeSwitch: false, - toolbarItems: [ - 'heading', - 'bold', - 'italic', - 'strike', - 'divider', - 'hr', - 'quote', - 'divider', - 'ul', - 'ol', - 'task', - 'indent', - 'outdent', - 'divider', - 'table', - 'image', - 'link', - 'divider', - 'code', - 'codeblock' - ] + minHeight: '200px', + previewStyle: 'vertical', + useCommandShortcut: true, + useDefaultHTMLSanitizer: true, + usageStatistics: true, + hideModeSwitch: true, + toolbarItems: [ + 'heading', + 'bold', + 'italic', + 'strike', + 'divider', + 'hr', + 'quote', + 'divider', + 'ul', + 'ol', + 'task', + 'indent', + 'outdent', + 'divider', + 'table', + 'image', + 'link', + 'divider', + 'code', + 'codeblock' + ] } diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/MarkdownEditor/index.vue b/app/Modules/Admin/Resources/vue-element-admin/components/MarkdownEditor/index.vue index 1a8a01ee767b515b32a4ebae76a2b84c30bdbc7e..29d112b71c489635790810d6eeb2eed60bca7dcd 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/components/MarkdownEditor/index.vue +++ b/app/Modules/Admin/Resources/vue-element-admin/components/MarkdownEditor/index.vue @@ -1,118 +1,118 @@ diff --git a/app/Modules/Admin/Resources/vue-element-admin/store/modules/permission.js b/app/Modules/Admin/Resources/vue-element-admin/store/modules/permission.js index 48351e6690fc3e04b2360b37a65a7a6482002ff0..67657b40f053d9953a3a90e790295ed6804b2968 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/store/modules/permission.js +++ b/app/Modules/Admin/Resources/vue-element-admin/store/modules/permission.js @@ -1,10 +1,10 @@ import { - asyncRoutes, - constantRoutes + asyncRoutes, + constantRoutes } from '@/router'; import { - getMenus + getMenus } from '@/api/login'; import Layout from '@/layout'; @@ -15,11 +15,11 @@ import Layout from '@/layout'; * @param route */ function hasPermission(roles, route) { - if (route.meta && route.meta.roles) { - return roles.some(role => route.meta.roles.includes(role)) - } else { - return true - } + if (route.meta && route.meta.roles) { + return roles.some(role => route.meta.roles.includes(role)) + } else { + return true + } } /** @@ -28,19 +28,19 @@ function hasPermission(roles, route) { * @param roles */ export function filterAsyncRoutes(routes, roles) { - const res = [] - - routes.forEach(route => { - const tmp = { ...route } - if (hasPermission(roles, tmp)) { - if (tmp.children) { - tmp.children = filterAsyncRoutes(tmp.children, roles) - } - res.push(tmp) - } - }) - - return res + const res = [] + + routes.forEach(route => { + const tmp = {...route} + if (hasPermission(roles, tmp)) { + if (tmp.children) { + tmp.children = filterAsyncRoutes(tmp.children, roles) + } + res.push(tmp) + } + }) + + return res } /** @@ -48,87 +48,81 @@ export function filterAsyncRoutes(routes, roles) { * @param routes */ export function generaMenu(routes, data) { - - console.log('generaMenu'); - data.forEach(item => { - // 隐藏的菜单栏目,不在路由中展示 - if(item.is_hidden == 1) return; - - const menu = { - path: item.vue_path, - // () => loadView(item.vue_component) - component: (item.vue_component === 'Layout' || item.vue_component == '') ? Layout : (resolve) => require([`@/views/${item.vue_component}`], resolve), - // component: item.vue_component === 'Layout' ? Layout : (resolve) => require([`@/views/${item.vue_component}`], resolve), - // hidden: true, - children: [], - // name: 'menu_' + item.menu_id, - }; - - console.log(item); - if(item.vue_path != '/') menu.meta = { - icon: item.vue_icon, - title: item.menu_name, - id: item.menu_id - }; - - console.log(menu.meta); - - - // 首页 - if(item.vue_path == 'dashboard') menu.meta.affix = true; - // 是否跳转 - if(item.vue_redirect) menu.redirect = item.vue_redirect; - // 子菜单 - if (item._child) { - generaMenu(menu.children, item._child) - } - - console.log(menu); - routes.push(menu); - }); - // console.log(import('@/views/default/articles/index')); + // console.log('generaMenu'); + data.forEach(item => { + // 如果不存在路由页面,那么不追究到路由中 + if (item.vue_component.length <= 0) return; + + const menu = { + path: item.vue_path, + component: (item.vue_component === 'Layout') ? Layout : (resolve) => require([`@/views/${item.vue_component}`], resolve), + children: [], + }; + + // console.log(item); + if (item.vue_path != '/') menu.meta = { + icon: item.vue_icon, + title: item.menu_name, + id: item.menu_id + }; + + // 首页 + if (item.vue_path == 'dashboard') menu.meta.affix = true; + + // 是否跳转 + if (item.vue_redirect) menu.redirect = item.vue_redirect; + + // 隐藏的菜单栏目 + if (item.is_hidden == 1) menu.hidden = true; + + // 子菜单 + if (item._child) { + generaMenu(menu.children, item._child); + } + + routes.push(menu); + }); } const state = { - routes: [], - addRoutes: [] -} + routes: [], + addRoutes: [] +}; const mutations = { - SET_ROUTES: (state, routes) => { - state.addRoutes = routes - state.routes = constantRoutes.concat(routes) - } + SET_ROUTES: (state, routes) => { + state.addRoutes = routes; + state.routes = constantRoutes.concat(routes); + } } const actions = { - generateRoutes({ commit }, roles) { - return new Promise(resolve => { - getMenus(state.token).then((response) => { - const { - data - } = response; - - console.log(data); - - var pushRouter = []; - generaMenu(pushRouter, data); - // console.log('---pushRouter---'); - // console.log(pushRouter); - // console.log('---pushRouter---'); - commit('SET_ROUTES', pushRouter); - resolve(pushRouter); - }).catch(error => { - console.log(error); - resolve([]); - }); - }); - } + generateRoutes({commit}, roles) { + return new Promise(resolve => { + getMenus(state.token).then((response) => { + const { + data + } = response; + // console.log(data); + + var pushRouter = []; + generaMenu(pushRouter, data); + // console.log('---pushRouter---'); + // console.log(pushRouter); + // console.log('---pushRouter---'); + commit('SET_ROUTES', pushRouter); + resolve(pushRouter); + }).catch(error => { + console.log(error); + resolve([]); + }); + }); + } } export default { - namespaced: true, - state, - mutations, - actions + namespaced: true, + state, + mutations, + actions } diff --git a/app/Modules/Admin/Resources/vue-element-admin/store/modules/user.js b/app/Modules/Admin/Resources/vue-element-admin/store/modules/user.js index 53b1a3e4ae66f310ae30b039573cb02d806e2894..b08cc8317137047138133bf19c92b657dda5097b 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/store/modules/user.js +++ b/app/Modules/Admin/Resources/vue-element-admin/store/modules/user.js @@ -50,118 +50,118 @@ const mutations = { } const actions = { - // user login - login({ commit }, userInfo) { - const { username, password } = userInfo - return new Promise((resolve, reject) => { - login({ admin_name: username.trim(), password: password }).then(response => { - const { data } = response; + // user login + login({commit}, userInfo) { + const {username, password} = userInfo + return new Promise((resolve, reject) => { + login({admin_name: username.trim(), password: password}).then(response => { + const {data} = response; Message({ message: response.msg, type: 'success', duration: 1500 }); - commit('SET_TOKEN', data.access_token); - setToken(data.access_token); + commit('SET_TOKEN', data.access_token); + setToken(data.access_token); console.log('登录完成 - login - end'); - resolve(); - }).catch(error => { - reject(error) - }) - }) - }, + resolve(); + }).catch(error => { + reject(error) + }) + }) + }, - // get user info - getInfo({ commit, state }) { + // get user info + getInfo({commit, state}) { console.log('获取基本信息 - getInfo'); - return new Promise((resolve, reject) => { - getInfo(state.token).then(response => { - const { data } = response - - if (!data) { - reject('Verification failed, please Login again.') - } - - const { roles, admin_name, admin_head } = data - - - // 强行定义:路由权限后端做了处理,前端如何没有权限就不会展示菜单栏目 === vue的路由 - roles.push('admin'); - roles.push('editor'); - - // roles must be a non-empty array - if (!roles || roles.length <= 0) { - reject('getInfo: roles must be a non-null array!') - } - - commit('SET_ROLES', roles) - commit('SET_NAME', admin_name) - commit('SET_AVATAR', admin_head) - commit('SET_INTRODUCTION', admin_name) - resolve(data) - }).catch(error => { - reject(error) - }) - }) - }, - - // user logout - logout({ commit, state, dispatch }) { - return new Promise((resolve, reject) => { - logout(state.token).then(() => { - commit('SET_TOKEN', '') - commit('SET_ROLES', []) - removeToken() + return new Promise((resolve, reject) => { + getInfo(state.token).then(response => { + const {data} = response + + if (!data) { + reject('Verification failed, please Login again.') + } + + const {roles, admin_name, admin_head} = data + + + // 强行定义:路由权限后端做了处理,前端如何没有权限就不会展示菜单栏目 === vue的路由 + roles.push('admin'); + roles.push('editor'); + + // roles must be a non-empty array + if (!roles || roles.length <= 0) { + reject('getInfo: roles must be a non-null array!') + } + + commit('SET_ROLES', roles) + commit('SET_NAME', admin_name) + commit('SET_AVATAR', admin_head) + commit('SET_INTRODUCTION', admin_name) + resolve(data) + }).catch(error => { + reject(error) + }) + }) + }, + + // user logout + logout({commit, state, dispatch}) { + return new Promise((resolve, reject) => { + logout(state.token).then(() => { + commit('SET_TOKEN', '') + commit('SET_ROLES', []) + removeToken() + resetRouter() + + // reset visited views and cached views + // to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2485 + dispatch('tagsView/delAllViews', null, {root: true}) + + resolve() + }).catch(error => { + reject(error) + }) + }) + }, + + // remove token + resetToken({commit}) { + return new Promise(resolve => { + commit('SET_TOKEN', '') + commit('SET_ROLES', []) + removeToken() + resolve() + }) + }, + + // dynamically modify permissions + async changeRoles({commit, dispatch}, role) { + const token = role + '-token' + + commit('SET_TOKEN', token) + setToken(token) + + const {roles} = await dispatch('getInfo') + resetRouter() + // generate accessible routes map based on roles + const accessRoutes = await dispatch('permission/generateRoutes', roles, {root: true}) + // dynamically add accessible routes + router.addRoutes(accessRoutes) + // reset visited views and cached views - // to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2485 - dispatch('tagsView/delAllViews', null, { root: true }) - - resolve() - }).catch(error => { - reject(error) - }) - }) - }, - - // remove token - resetToken({ commit }) { - return new Promise(resolve => { - commit('SET_TOKEN', '') - commit('SET_ROLES', []) - removeToken() - resolve() - }) - }, - - // dynamically modify permissions - async changeRoles({ commit, dispatch }, role) { - const token = role + '-token' - - commit('SET_TOKEN', token) - setToken(token) - - const { roles } = await dispatch('getInfo') - - resetRouter() - - // generate accessible routes map based on roles - const accessRoutes = await dispatch('permission/generateRoutes', roles, { root: true }) - // dynamically add accessible routes - router.addRoutes(accessRoutes) - - // reset visited views and cached views - dispatch('tagsView/delAllViews', null, { root: true }) - } + dispatch('tagsView/delAllViews', null, {root: true}) + } } export default { - namespaced: true, - state, - mutations, - actions + namespaced: true, + state, + mutations, + actions } diff --git a/app/Modules/Admin/Resources/vue-element-admin/styles/common.scss b/app/Modules/Admin/Resources/vue-element-admin/styles/common.scss index 04ff3a03203ae2327ca3c87d2109c227a83eb597..b9ca4428288a00ae3a45cc4b90d93937b858a836 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/styles/common.scss +++ b/app/Modules/Admin/Resources/vue-element-admin/styles/common.scss @@ -11,3 +11,10 @@ .margin-buttom-10{ margin-bottom: 10px!important; } + + +// markdown +.tui-editor .te-md-splitter{ + width:auto!important; + min-width: 500px; +} diff --git a/app/Modules/Admin/Resources/vue-element-admin/utils/request.js b/app/Modules/Admin/Resources/vue-element-admin/utils/request.js index 006ce91e92591b02cd966410840f0026e1959c99..0cee67acdfafaa56f02aeac802f9153d37a1b981 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/utils/request.js +++ b/app/Modules/Admin/Resources/vue-element-admin/utils/request.js @@ -1,16 +1,16 @@ -import axios from 'axios' +import axios from 'axios'; import { - MessageBox, - Message -} from 'element-ui' -import store from '@/store' + MessageBox, + Message +} from 'element-ui'; +import store from '@/store'; import { - getToken + getToken } from '@/utils/auth'; -// console.log(process); -// console.log(process.env); -// console.log(process.env.VUE_APP_BASE_API); +console.log(process); +console.log(process.env); +console.log(process.env.VUE_APP_BASE_API); // process失效了,默认为当前URL为请求地址 process.env.VUE_APP_BASE_API = window.location.origin + window.location.pathname; @@ -18,105 +18,110 @@ console.log(process.env.VUE_APP_BASE_API); // create an axios instance const service = axios.create({ - baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url - // withCredentials: true, // send cookies when cross-domain requests - timeout: 5000, // request timeout - headers: { - // 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8', - "Content-Type": "application/json;charset=utf-8", - } -}) + baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url + // withCredentials: true, // send cookies when cross-domain requests + timeout: 5000, // request timeout + headers: { + // 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8', + "Content-Type": "application/json;charset=utf-8", + } +}); // request interceptor service.interceptors.request.use( - config => { - // do something before request is sent + config => { + // do something before request is sent - if (store.getters.token) { - // let each request carry token - // ['X-Token'] is a custom headers key - // please modify it according to the actual situation - config.headers['Authorization'] = 'Bearer ' + getToken(); - } + if (store.getters.token) { + // let each request carry token + // ['X-Token'] is a custom headers key + // please modify it according to the actual situation + config.headers['Authorization'] = 'Bearer ' + getToken(); + } - if (config.headers['Content-Type'] === 'application/x-www-form-urlencoded;charset=UTF-8') { - if (config.data) { - // config.data = JSON.stringify(config.data) - } - } - return config - }, - error => { - // do something with request error - console.log(error) // for debug - return Promise.reject(error) - } + if (config.headers['Content-Type'] === 'application/x-www-form-urlencoded;charset=UTF-8') { + if (config.data) { + // config.data = JSON.stringify(config.data) + } + } + return config; + }, + error => { + // do something with request error + console.log(error); // for debug + return Promise.reject(error); + } ) // response interceptor service.interceptors.response.use( - /** - * If you want to get http information such as headers or status - * Please return response => response - */ + /** + * If you want to get http information such as headers or status + * Please return response => response + */ - /** - * Determine the request status by custom code - * Here is just an example - * You can also judge the status by HTTP Status Code - */ - response => { - const res = response.data + /** + * Determine the request status by custom code + * Here is just an example + * You can also judge the status by HTTP Status Code + */ + response => { + const res = response.data; - // if the custom code is not 20000, it is judged as an error. - if (res.status !== 1) { - Message({ - message: res.msg || 'Error', - type: 'error', - duration: 5 * 1000 - }) + // if the custom code is not 20000, it is judged as an error. + if (res.status !== 1) { + Message({ + message: res.msg || 'Error', + type: 'error', + duration: 5 * 1000, + }); - // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired; - if (res.status === -1) { - // to re-login - MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', - 'Confirm logout', { - confirmButtonText: 'Re-Login', - cancelButtonText: 'Cancel', - type: 'warning' - }).then(() => { - store.dispatch('user/resetToken').then(() => { - location.reload() - }) - }) - } - return Promise.reject(new Error(res.msg || 'Error')) - } else { - return res - } - }, - error => { - console.log('err' + error) // for debug - console.log(error.response) // for debug + // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired; + if (res.status === -1) { + // to re-login + MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', + 'Confirm logout', { + confirmButtonText: 'Re-Login', + cancelButtonText: 'Cancel', + type: 'warning' + }).then(() => { + store.dispatch('user/resetToken').then(() => { + location.reload(); + }) + }) + } + return Promise.reject(new Error(res.msg || 'Error')); + } else { + return res; + } + }, + error => { + console.log('err' + error); // for debug + console.log(error); + console.log(error.response); // for debug let msg = error.msg; - switch (error.response.status) { - case 404: - msg = error.response.statusText; - break; - case 401: // 认证失败 - msg = error.data.msg; - break; - case 500: // 认证失败 - msg = error.response.statusText; - break; + if (error.response == undefined){ + msg = '超时 5000ms,请刷新!'; + }else{ + switch (error.response.status) { + case 404: + msg = error.response.statusText; + break; + case 401: // 认证失败 + msg = error.response.data.msg; + break; + case 500: // 认证失败 + msg = error.response.statusText; + break; + } } - Message({ - message: msg, - type: 'error', - duration: 5 * 1000 - }); - return Promise.reject(error); - } + Message({ + message: msg, + type: 'error', + duration: 5 * 1000 + }); + return Promise.reject(error); + } ) export default service diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/admin_roles/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/admin_roles/index.vue index 19afaec9b5c7a19599acc0983b625a3978857ae7..21958e9ad30e213a633c5421f3cf1a97bf11b9e2 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/views/admin_roles/index.vue +++ b/app/Modules/Admin/Resources/vue-element-admin/views/admin_roles/index.vue @@ -315,7 +315,6 @@ // set checked state of a node not affects its father and child nodes this.checkStrictly = false; }); - }, handleDelete(row) { var ids = ''; diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/adminloginlogs/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/adminloginlogs/index.vue index 9c45145438e6663018055dc8bf56f51ef611bd59..6253164396ab4edcddde451d2a8090a771422733 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/views/adminloginlogs/index.vue +++ b/app/Modules/Admin/Resources/vue-element-admin/views/adminloginlogs/index.vue @@ -1,12 +1,15 @@