From e25d28f4214a7d11db00b6ccb89814a93fa95a35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E4=B8=91=E8=B7=AF=E4=BA=BA?= <2278757482@qq.com> Date: Thu, 31 Dec 2020 09:31:15 +0800 Subject: [PATCH 1/8] update readme. --- README.en.md | 10 +++++----- README.md | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.en.md b/README.en.md index 888b122..a469cdb 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 1938530..516f54d 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 #### 使用说明 -- Gitee From 6b866c64ad839af4c8e1761b3c120eeb7588b276 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E4=B8=91=E8=B7=AF=E4=BA=BA?= <2278757482@qq.com> Date: Thu, 31 Dec 2020 15:06:12 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E6=96=87=E7=AB=A0=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Admin/Entities/Article/Article.php | 19 ++ .../Article/ArticleCategoryRequest.php | 4 +- .../Http/Requests/Article/ArticleRequest.php | 16 +- .../MarkdownEditor/default-options.js | 56 ++--- .../components/MarkdownEditor/index.vue | 220 ++++++++-------- .../store/modules/permission.js | 180 +++++++------ .../vue-element-admin/store/modules/user.js | 194 +++++++------- .../vue-element-admin/styles/common.scss | 7 + .../vue-element-admin/utils/request.js | 163 ++++++------ .../views/admin_roles/index.vue | 1 - .../vue-element-admin/views/admins/index.vue | 2 +- .../views/articles/index.vue | 237 +++++++++++++++--- app/Modules/Admin/Services/ArticleService.php | 36 +++ 13 files changed, 678 insertions(+), 457 deletions(-) diff --git a/app/Modules/Admin/Entities/Article/Article.php b/app/Modules/Admin/Entities/Article/Article.php index 693a2a0..f8c9daa 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/Requests/Article/ArticleCategoryRequest.php b/app/Modules/Admin/Http/Requests/Article/ArticleCategoryRequest.php index e18508b..6d8a7ad 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 4ab82d4..104ad61 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/components/MarkdownEditor/default-options.js b/app/Modules/Admin/Resources/vue-element-admin/components/MarkdownEditor/default-options.js index 303aa13..776ffc2 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 1a8a01e..29d112b 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 48351e6..67657b4 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 53b1a3e..b08cc83 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 04ff3a0..b9ca442 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 006ce91..babd674 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/utils/request.js +++ b/app/Modules/Admin/Resources/vue-element-admin/utils/request.js @@ -1,11 +1,11 @@ -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); @@ -18,86 +18,87 @@ 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: @@ -110,13 +111,13 @@ service.interceptors.response.use( 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 19afaec..21958e9 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/admins/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/admins/index.vue index 67319a1..f366894 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/views/admins/index.vue +++ b/app/Modules/Admin/Resources/vue-element-admin/views/admins/index.vue @@ -183,7 +183,7 @@ is_check: '' }, downloadLoading: false, - calendarCheckOptions + calendarCheckOptions, } }, created() { diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/articles/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/articles/index.vue index 5b07404..c080cc2 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/views/articles/index.vue +++ b/app/Modules/Admin/Resources/vue-element-admin/views/articles/index.vue @@ -1,5 +1,49 @@