diff --git a/README.md b/README.md index 516f54dd543abd103b83371ca7123629a25f653c..a9ff12811a3e15054f3be050be08d0d5c18e7dc4 100644 --- a/README.md +++ b/README.md @@ -8,8 +8,7 @@ Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN #### 软件架构 软件架构说明 -文档地址:https://docs.apipost.cn/view/680a60d8e13e4745 - +文档地址(无文档,自己对接):https://docs.apipost.cn/view/680a60d8e13e4745 #### 安装教程 diff --git a/app/Helper/functions.php b/app/Helper/functions.php index 06b0a2bcdc9d40cf94bd1f4651364dcd456b9396..981d5da6bc746dec752a4a0b65801e9e036e01e6 100644 --- a/app/Helper/functions.php +++ b/app/Helper/functions.php @@ -1,4 +1,40 @@ setMonthTable(); + } + + /** + * 获取从开始分表到明年为止,所有的年份 + * + * @return array + */ + public function getAllMonthes(): array + { + $years = get_year_range(self::MIN_TABLE . '-01', date('Y-01', strtotime('+1 year'))); + krsort($years); + return $years; + } + + /** + * 设置按年分表 + * + * @param string $month + * + * @return $this + */ + public function setMonthTable(string $month = '') + { + $month = empty($month) ? date(self::MONTH_FORMAT) : (strlen($month) == 4 ? $month : date(self::MONTH_FORMAT, strtotime($month))); + // 替换为日期格式,否则将无法转化为时间戳(有效的日期格式 - 拼接才可以) + $month = str_replace('_', '-', $month); + + // 当表名大于最小表名时,设置表名。 + if ( $month >= self::MIN_TABLE ) { + $this->month = $month; + $this->table = $this->getOldTableName() . '_' . $this->month; + } + + return $this; + } + + /** + * 生成新表 + * + * @param string $new_table + * @param string $time + * @param string $format + * @param string $old_table + * + * @return bool + */ + public function createMonthTable(string $new_table = '', $time = '', $format = self::MONTH_FORMAT, string $old_table = '') + { + $new_table = empty($new_table) ? $this->getOldTableName() . '_' . date($format, empty($time) ? time() : $time) : $new_table; + + // 数据表前缀 + $db_prefix = env('DB_PREFIX'); + + return $this->setCopyTable($db_prefix . $new_table, $db_prefix . $this->getOldTableName()); + } + + /** + * 获取原始表名(移除年份表的后缀)【包含前缀】 + * + * @return string + */ + public function getOldTableName():string + { + $table_name = $this->getTable(); + $suffix_len = strlen(self::MIN_TABLE); + $suffix = substr($table_name, -$suffix_len, $suffix_len); + // 检测当前表名是否为按年分表的表名 + if (preg_match ("/^([0-9]{4})$/", $suffix, $parts)){ + // 减1是因为默认还有一个下划线 + $table_name = substr($table_name, 0, -$suffix_len - 1); + } + return $table_name; + } +} diff --git a/app/Modules/Admin/Console/AutoTableBuild.php b/app/Modules/Admin/Console/AutoTableBuild.php index 7d47e733472c04bfb6a7d5e3c965d85ad31bac09..88c27747dae2e642dec44a8cbecb482478521548 100644 --- a/app/Modules/Admin/Console/AutoTableBuild.php +++ b/app/Modules/Admin/Console/AutoTableBuild.php @@ -47,7 +47,7 @@ class AutoTableBuild extends Command public function handle() { foreach ($this->model_lists as $model){ - (new $model)->createMonthTable('', strtotime('+0 month')); + (new $model)->createMonthTable('', strtotime('+1 month')); } } diff --git a/app/Modules/Admin/Http/Controllers/IndexController.php b/app/Modules/Admin/Http/Controllers/IndexController.php index 1dd29bc8080e3c13288490612a61399b7c100ec3..97145769bc5706165f963af994ebd77721d90302 100644 --- a/app/Modules/Admin/Http/Controllers/IndexController.php +++ b/app/Modules/Admin/Http/Controllers/IndexController.php @@ -18,6 +18,18 @@ class IndexController extends BaseController return $this->successJson($this->service->index()); } + /** + * 按照日志类型的统计图数据 + * + * @param \Illuminate\Http\Request $request + * + * @return \Illuminate\Http\JsonResponse + */ + public function logsStatistics(Request $request) + { + return $this->successJson($this->service->logsStatistics()); + } + /** * 月份表列表 * @@ -27,4 +39,19 @@ class IndexController extends BaseController { return $this->successJson(MonthModel::getInstance()->getAllMonthes()); } + + /** + * 编辑登录管理员信息 + * + * @param \Illuminate\Http\Request $request + * + * @return \Illuminate\Http\JsonResponse + */ + public function update(Request $request){ + if ($this->service->updateAdmin($request)){ + return $this->successJson([], $this->service->getError()); + }else{ + return $this->errorJson($this->service->getError()); + } + } } diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/configs.js b/app/Modules/Admin/Resources/vue-element-admin/api/configs.js index 6b1452a4b1d2832bdf18d9ca32062afcd43c3379..0316ce4012c376be098a20f1b2a6c6ee544c3a23 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/api/configs.js +++ b/app/Modules/Admin/Resources/vue-element-admin/api/configs.js @@ -20,7 +20,7 @@ export function update(data) { return request({ url: '/configs', method: 'put', - parmas: data + data }) } diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/indexs.js b/app/Modules/Admin/Resources/vue-element-admin/api/indexs.js index e271250f4bc900ff05b795869bf502fc04b960ba..09086a398035a742ac5cab8ca8e76a1abecf9599 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/api/indexs.js +++ b/app/Modules/Admin/Resources/vue-element-admin/api/indexs.js @@ -1,8 +1,26 @@ import request from '@/utils/request' +// 首页 - 基础统计数据 export function statistics() { return request({ url: '/indexs', method: 'get' }) } + +// 首页 - 请求日志统计表数据 +export function logsStatistics() { + return request({ + url: '/logsStatistics', + method: 'get' + }) +} + +// 编辑登录管理员信息 +export function updateAdmin(data) { + return request({ + url: '/updateAdmin', + method: 'put', + data, + }) +} diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/Charts/mixins/resize.js b/app/Modules/Admin/Resources/vue-element-admin/components/Charts/mixins/resize.js index b1e76e947aef4ef6f386250c5b486dff3cefba34..89fbed183877b68a50dc9df2f4c96a16ceb4c9bc 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/components/Charts/mixins/resize.js +++ b/app/Modules/Admin/Resources/vue-element-admin/components/Charts/mixins/resize.js @@ -1,56 +1,56 @@ -import { debounce } from '@/utils' +import {debounce} from '@/utils' export default { - data() { - return { - $_sidebarElm: null, - $_resizeHandler: null - } - }, - mounted() { - this.initListener() - }, - activated() { - if (!this.$_resizeHandler) { - // avoid duplication init - this.initListener() - } - - // when keep-alive chart activated, auto resize - this.resize() - }, - beforeDestroy() { - this.destroyListener() - }, - deactivated() { - this.destroyListener() - }, - methods: { - // use $_ for mixins properties - // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential - $_sidebarResizeHandler(e) { - if (e.propertyName === 'width') { - this.$_resizeHandler() - } + data() { + return { + $_sidebarElm: null, + $_resizeHandler: null + } }, - initListener() { - this.$_resizeHandler = debounce(() => { - this.resize() - }, 100) - window.addEventListener('resize', this.$_resizeHandler) - - this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0] - this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler) + mounted() { + this.initListener() }, - destroyListener() { - window.removeEventListener('resize', this.$_resizeHandler) - this.$_resizeHandler = null + activated() { + if (!this.$_resizeHandler) { + // avoid duplication init + this.initListener() + } - this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler) + // when keep-alive chart activated, auto resize + this.resize() + }, + beforeDestroy() { + this.destroyListener() + }, + deactivated() { + this.destroyListener() }, - resize() { - const { chart } = this - chart && chart.resize() + methods: { + // use $_ for mixins properties + // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential + $_sidebarResizeHandler(e) { + if (e.propertyName === 'width') { + this.$_resizeHandler() + } + }, + initListener() { + this.$_resizeHandler = debounce(() => { + this.resize() + }, 100) + window.addEventListener('resize', this.$_resizeHandler) + + this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0] + this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler) + }, + destroyListener() { + window.removeEventListener('resize', this.$_resizeHandler) + this.$_resizeHandler = null + + this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler) + }, + resize() { + const {chart} = this + chart && chart.resize() + } } - } } diff --git a/app/Modules/Admin/Resources/vue-element-admin/router/index.js b/app/Modules/Admin/Resources/vue-element-admin/router/index.js index f8a274f911835ba68f62aff84d79a372274df31b..3b1e38af9c38589de4c9757be55d0c22ef24f665 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/router/index.js +++ b/app/Modules/Admin/Resources/vue-element-admin/router/index.js @@ -7,10 +7,8 @@ Vue.use(Router) import Layout from '@/layout' /* Router Modules */ -// import componentsRouter from './modules/components' -// import chartsRouter from './modules/charts' -// import tableRouter from './modules/table' -// import nestedRouter from './modules/nested' +import componentsRouter from './modules/components' +import chartsRouter from './modules/charts' /** * Note: sub-menu only appear when route children.length >= 1 @@ -105,11 +103,17 @@ export const constantRoutes = [ path: 'index', component: () => import('@/views/sundry/icons/index'), name: 'Icons', - meta: { title: 'icons', icon: 'icon', noCache: true } + meta: {title: 'icons', icon: 'icon', noCache: true} } ] }, -] + {path: '*', redirect: '/404', hidden: true}, + + componentsRouter, + chartsRouter +]; +console.log('---componentsRouter---'); +console.log(componentsRouter); /** * asyncRoutes @@ -119,8 +123,18 @@ export const asyncRoutes = [ /** when your routing map is too long, you can split it into small modules **/ // componentsRouter, // chartsRouter, - // nestedRouter, - // tableRouter, + + + // { + // path: 'external-link', + // component: Layout, + // children: [ + // { + // path: 'https://github.com/PanJiaChen/vue-element-admin', + // meta: {title: 'externalLink', icon: 'link'} + // } + // ] + // }, { path: '/error', @@ -146,19 +160,7 @@ export const asyncRoutes = [ } ] }, - // { - // path: 'external-link', - // component: Layout, - // children: [ - // { - // path: 'https://github.com/PanJiaChen/vue-element-admin', - // meta: {title: 'externalLink', icon: 'link'} - // } - // ] - // }, - // 404 page must be placed at the end !!! - {path: '*', redirect: '/404', hidden: true} ] const createRouter = () => new Router({ diff --git a/app/Modules/Admin/Resources/vue-element-admin/router/modules/charts.js b/app/Modules/Admin/Resources/vue-element-admin/router/modules/charts.js index 59ebf18877f887b55d2d6305481e747ffe4d72c7..42d7d20f252f954454bb22e01ea107e203dfa441 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/router/modules/charts.js +++ b/app/Modules/Admin/Resources/vue-element-admin/router/modules/charts.js @@ -3,34 +3,34 @@ import Layout from '@/layout' const chartsRouter = { - path: '/charts', - component: Layout, - redirect: 'noRedirect', - name: 'Charts', - meta: { - title: 'charts', - icon: 'chart' - }, - children: [ - { - path: 'keyboard', - component: () => import('@/views/charts/keyboard'), - name: 'KeyboardChart', - meta: { title: 'keyboardChart', noCache: true } + path: '/charts', + component: Layout, + redirect: 'noRedirect', + name: 'Charts', + meta: { + title: 'charts', + icon: 'chart' }, - { - path: 'line', - component: () => import('@/views/charts/line'), - name: 'LineChart', - meta: { title: 'lineChart', noCache: true } - }, - { - path: 'mix-chart', - component: () => import('@/views/charts/mix-chart'), - name: 'MixChart', - meta: { title: 'mixChart', noCache: true } - } - ] + children: [ + { + path: 'keyboard', + component: () => import('@/views/charts/keyboard'), + name: 'KeyboardChart', + meta: {title: 'keyboardChart', noCache: true} + }, + { + path: 'line', + component: () => import('@/views/charts/line'), + name: 'LineChart', + meta: {title: 'lineChart', noCache: true} + }, + { + path: 'mix-chart', + component: () => import('@/views/charts/mix-chart'), + name: 'MixChart', + meta: {title: 'mixChart', noCache: true} + } + ] } export default chartsRouter diff --git a/app/Modules/Admin/Resources/vue-element-admin/router/modules/components.js b/app/Modules/Admin/Resources/vue-element-admin/router/modules/components.js index b7407e25dcaa0bc6510303fae73a98ee407213b6..544769921defd9f0b66f52b4c0cb07adf2156b0d 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/router/modules/components.js +++ b/app/Modules/Admin/Resources/vue-element-admin/router/modules/components.js @@ -3,100 +3,76 @@ import Layout from '@/layout' const componentsRouter = { - path: '/components', - component: Layout, - redirect: 'noRedirect', - name: 'ComponentDemo', - meta: { - title: 'components', - icon: 'component' - }, - children: [ - { - path: 'tinymce', - component: () => import('@/views/components-demo/tinymce'), - name: 'TinymceDemo', - meta: { title: 'tinymce' } + path: '/components', + component: Layout, + redirect: 'noRedirect', + name: 'ComponentDemo', + meta: { + title: 'components', + icon: 'component' }, - { - path: 'markdown', - component: () => import('@/views/components-demo/markdown'), - name: 'MarkdownDemo', - meta: { title: 'markdown' } - }, - { - path: 'json-editor', - component: () => import('@/views/components-demo/json-editor'), - name: 'JsonEditorDemo', - meta: { title: 'jsonEditor' } - }, - { - path: 'split-pane', - component: () => import('@/views/components-demo/split-pane'), - name: 'SplitpaneDemo', - meta: { title: 'splitPane' } - }, - { - path: 'avatar-upload', - component: () => import('@/views/components-demo/avatar-upload'), - name: 'AvatarUploadDemo', - meta: { title: 'avatarUpload' } - }, - { - path: 'dropzone', - component: () => import('@/views/components-demo/dropzone'), - name: 'DropzoneDemo', - meta: { title: 'dropzone' } - }, - { - path: 'sticky', - component: () => import('@/views/components-demo/sticky'), - name: 'StickyDemo', - meta: { title: 'sticky' } - }, - { - path: 'count-to', - component: () => import('@/views/components-demo/count-to'), - name: 'CountToDemo', - meta: { title: 'countTo' } - }, - { - path: 'mixin', - component: () => import('@/views/components-demo/mixin'), - name: 'ComponentMixinDemo', - meta: { title: 'componentMixin' } - }, - { - path: 'back-to-top', - component: () => import('@/views/components-demo/back-to-top'), - name: 'BackToTopDemo', - meta: { title: 'backToTop' } - }, - { - path: 'drag-dialog', - component: () => import('@/views/components-demo/drag-dialog'), - name: 'DragDialogDemo', - meta: { title: 'dragDialog' } - }, - { - path: 'drag-select', - component: () => import('@/views/components-demo/drag-select'), - name: 'DragSelectDemo', - meta: { title: 'dragSelect' } - }, - { - path: 'dnd-list', - component: () => import('@/views/components-demo/dnd-list'), - name: 'DndListDemo', - meta: { title: 'dndList' } - }, - { - path: 'drag-kanban', - component: () => import('@/views/components-demo/drag-kanban'), - name: 'DragKanbanDemo', - meta: { title: 'dragKanban' } - } - ] + children: [ + { + path: 'tinymce', + component: () => import('@/views/components-demo/tinymce'), + name: 'TinymceDemo', + meta: {title: 'tinymce'} + }, + { + path: 'markdown', + component: () => import('@/views/components-demo/markdown'), + name: 'MarkdownDemo', + meta: {title: 'markdown'} + }, + { + path: 'json-editor', + component: () => import('@/views/components-demo/json-editor'), + name: 'JsonEditorDemo', + meta: {title: 'jsonEditor'} + }, + { + path: 'avatar-upload', + component: () => import('@/views/components-demo/avatar-upload'), + name: 'AvatarUploadDemo', + meta: {title: 'avatarUpload'} + }, + { + path: 'dropzone', + component: () => import('@/views/components-demo/dropzone'), + name: 'DropzoneDemo', + meta: {title: 'dropzone'} + }, + { + path: 'count-to', + component: () => import('@/views/components-demo/count-to'), + name: 'CountToDemo', + meta: {title: 'countTo'} + }, + { + path: 'mixin', + component: () => import('@/views/components-demo/mixin'), + name: 'ComponentMixinDemo', + meta: {title: 'componentMixin'} + }, + { + path: 'back-to-top', + component: () => import('@/views/components-demo/back-to-top'), + name: 'BackToTopDemo', + meta: {title: 'backToTop'} + }, + { + path: 'drag-select', + component: () => import('@/views/components-demo/drag-select'), + name: 'DragSelectDemo', + meta: {title: 'dragSelect'} + }, + { + path: 'drag-kanban', + component: () => import('@/views/components-demo/drag-kanban'), + name: 'DragKanbanDemo', + meta: {title: 'dragKanban'} + } + ] } export default componentsRouter diff --git a/app/Modules/Admin/Resources/vue-element-admin/router/modules/nested.js b/app/Modules/Admin/Resources/vue-element-admin/router/modules/nested.js deleted file mode 100644 index c52664c99d4578aa50239b4a94957391adeebe74..0000000000000000000000000000000000000000 --- a/app/Modules/Admin/Resources/vue-element-admin/router/modules/nested.js +++ /dev/null @@ -1,66 +0,0 @@ -/** When your routing table is too long, you can split it into small modules **/ - -import Layout from '@/layout' - -const nestedRouter = { - path: '/nested', - component: Layout, - redirect: '/nested/menu1/menu1-1', - name: 'Nested', - meta: { - title: 'nested', - icon: 'nested' - }, - children: [ - { - path: 'menu1', - component: () => import('@/views/nested/menu1/index'), // Parent router-view - name: 'Menu1', - meta: { title: 'menu1' }, - redirect: '/nested/menu1/menu1-1', - children: [ - { - path: 'menu1-1', - component: () => import('@/views/nested/menu1/menu1-1'), - name: 'Menu1-1', - meta: { title: 'menu1-1' } - }, - { - path: 'menu1-2', - component: () => import('@/views/nested/menu1/menu1-2'), - name: 'Menu1-2', - redirect: '/nested/menu1/menu1-2/menu1-2-1', - meta: { title: 'menu1-2' }, - children: [ - { - path: 'menu1-2-1', - component: () => import('@/views/nested/menu1/menu1-2/menu1-2-1'), - name: 'Menu1-2-1', - meta: { title: 'menu1-2-1' } - }, - { - path: 'menu1-2-2', - component: () => import('@/views/nested/menu1/menu1-2/menu1-2-2'), - name: 'Menu1-2-2', - meta: { title: 'menu1-2-2' } - } - ] - }, - { - path: 'menu1-3', - component: () => import('@/views/nested/menu1/menu1-3'), - name: 'Menu1-3', - meta: { title: 'menu1-3' } - } - ] - }, - { - path: 'menu2', - name: 'Menu2', - component: () => import('@/views/nested/menu2/index'), - meta: { title: 'menu2' } - } - ] -} - -export default nestedRouter diff --git a/app/Modules/Admin/Resources/vue-element-admin/router/modules/table.js b/app/Modules/Admin/Resources/vue-element-admin/router/modules/table.js deleted file mode 100644 index d8e50302ac39efab58afa39b716d4a11a6baf7d6..0000000000000000000000000000000000000000 --- a/app/Modules/Admin/Resources/vue-element-admin/router/modules/table.js +++ /dev/null @@ -1,41 +0,0 @@ -/** When your routing table is too long, you can split it into small modules **/ - -import Layout from '@/layout' - -const tableRouter = { - path: '/table', - component: Layout, - redirect: '/table/complex-table', - name: 'Table', - meta: { - title: 'Table', - icon: 'table' - }, - children: [ - { - path: 'dynamic-table', - component: () => import('@/views/table/dynamic-table/index'), - name: 'DynamicTable', - meta: { title: 'dynamicTable' } - }, - { - path: 'drag-table', - component: () => import('@/views/table/drag-table'), - name: 'DragTable', - meta: { title: 'dragTable' } - }, - { - path: 'inline-edit-table', - component: () => import('@/views/table/inline-edit-table'), - name: 'InlineEditTable', - meta: { title: 'inlineEditTable' } - }, - { - path: 'complex-table', - component: () => import('@/views/table/complex-table'), - name: 'ComplexTable', - meta: { title: 'complexTable' } - } - ] -} -export default tableRouter diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/admins/components/detail.vue b/app/Modules/Admin/Resources/vue-element-admin/views/admins/components/detail.vue index be91fa7887097b7c9216c2d8ff4462587150a3f5..17086984ca6bf07327d0e70415112d4722b4ac9e 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/views/admins/components/detail.vue +++ b/app/Modules/Admin/Resources/vue-element-admin/views/admins/components/detail.vue @@ -215,10 +215,10 @@ save() { this.$refs['form'].validate(async (valid) => { if (valid) { - const {msg} = this.form.admin_id ? await update(this.form) : await create(this.form); + const {msg, status} = this.form.admin_id ? await update(this.form) : await create(this.form); this.$message({ message: msg, - type: 'success' + type: status == 1 ? 'success' : 'error', }); this.$emit('fetchData'); this.close(); diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/article_categories/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/article_categories/index.vue index bb4cd7e34e79f5e20e733db565b003d51212e24e..7734da6668c7b283c57f7ee00cc88e2e15783832 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/views/article_categories/index.vue +++ b/app/Modules/Admin/Resources/vue-element-admin/views/article_categories/index.vue @@ -137,10 +137,10 @@ type: 'warning' }) .then(async () => { - const {msg} = await setDel({category_id: row.category_id}); + const {msg, status} = await setDel({category_id: row.category_id}); this.$message({ message: msg, - type: 'success' + type: status == 1 ? 'success' : 'error', }); this.getMenus(); }) diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/articles/components/ArticleDetail.vue b/app/Modules/Admin/Resources/vue-element-admin/views/articles/components/ArticleDetail.vue index edb4aed2b8719be04ee68ad5602261ab3a4d74c6..380f4972d1f3f466b163d1ccf5e75665995e81b2 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/views/articles/components/ArticleDetail.vue +++ b/app/Modules/Admin/Resources/vue-element-admin/views/articles/components/ArticleDetail.vue @@ -247,7 +247,7 @@ }else{ this.$message({ message: msg, - type: 'success', + type: 'error', }); } diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/components-demo/count-to.vue b/app/Modules/Admin/Resources/vue-element-admin/views/components-demo/count-to.vue index 70681df691eace66b598ac4dd8fcd55240f348cb..ea5ce0316de48cab8caaaccae7560867d7064a3b 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/views/components-demo/count-to.vue +++ b/app/Modules/Admin/Resources/vue-element-admin/views/components-demo/count-to.vue @@ -1,218 +1,222 @@ diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/components-demo/drag-dialog.vue b/app/Modules/Admin/Resources/vue-element-admin/views/components-demo/drag-dialog.vue deleted file mode 100644 index c815b282e147f195ca04513cae43d110fa8cf0c6..0000000000000000000000000000000000000000 --- a/app/Modules/Admin/Resources/vue-element-admin/views/components-demo/drag-dialog.vue +++ /dev/null @@ -1,61 +0,0 @@ - - - diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/components-demo/mixin.vue b/app/Modules/Admin/Resources/vue-element-admin/views/components-demo/mixin.vue index 425cf4fb431388c48b5946211e3e5fba8dbe5fbd..b435d37605d364cc0cfd89f2133496679e642c52 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/views/components-demo/mixin.vue +++ b/app/Modules/Admin/Resources/vue-element-admin/views/components-demo/mixin.vue @@ -1,169 +1,171 @@ diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/components-demo/split-pane.vue b/app/Modules/Admin/Resources/vue-element-admin/views/components-demo/split-pane.vue deleted file mode 100644 index 7dba353fe0915df81329c1b02d584bb86bc290b6..0000000000000000000000000000000000000000 --- a/app/Modules/Admin/Resources/vue-element-admin/views/components-demo/split-pane.vue +++ /dev/null @@ -1,67 +0,0 @@ - - - - - diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/components-demo/sticky.vue b/app/Modules/Admin/Resources/vue-element-admin/views/components-demo/sticky.vue deleted file mode 100644 index de86e1a1370b48b5af73cea832cc74735f3b76bc..0000000000000000000000000000000000000000 --- a/app/Modules/Admin/Resources/vue-element-admin/views/components-demo/sticky.vue +++ /dev/null @@ -1,133 +0,0 @@ - - - - - diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/LineMarker.vue b/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/LineMarker.vue new file mode 100644 index 0000000000000000000000000000000000000000..f8dd2a71cfa270d80da6e633a55a7731c82c1539 --- /dev/null +++ b/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/LineMarker.vue @@ -0,0 +1,244 @@ + + + diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/mixins/resize.js b/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/mixins/resize.js index 234953b18aaf76fcbe81083c5c23a63b5f7c66ce..6567a1e9259389fe0ace752c492d3ddd29a02ae9 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/mixins/resize.js +++ b/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/mixins/resize.js @@ -1,55 +1,55 @@ -import { debounce } from '@/utils' +import {debounce} from '@/utils' export default { - data() { - return { - $_sidebarElm: null, - $_resizeHandler: null - } - }, - mounted() { - this.$_resizeHandler = debounce(() => { - if (this.chart) { - this.chart.resize() - } - }, 100) - this.$_initResizeEvent() - this.$_initSidebarResizeEvent() - }, - beforeDestroy() { - this.$_destroyResizeEvent() - this.$_destroySidebarResizeEvent() - }, - // to fixed bug when cached by keep-alive - // https://github.com/PanJiaChen/vue-element-admin/issues/2116 - activated() { - this.$_initResizeEvent() - this.$_initSidebarResizeEvent() - }, - deactivated() { - this.$_destroyResizeEvent() - this.$_destroySidebarResizeEvent() - }, - methods: { - // use $_ for mixins properties - // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential - $_initResizeEvent() { - window.addEventListener('resize', this.$_resizeHandler) + data() { + return { + $_sidebarElm: null, + $_resizeHandler: null + } + }, + mounted() { + this.$_resizeHandler = debounce(() => { + if (this.chart) { + this.chart.resize() + } + }, 100) + this.$_initResizeEvent() + this.$_initSidebarResizeEvent() }, - $_destroyResizeEvent() { - window.removeEventListener('resize', this.$_resizeHandler) + beforeDestroy() { + this.$_destroyResizeEvent() + this.$_destroySidebarResizeEvent() }, - $_sidebarResizeHandler(e) { - if (e.propertyName === 'width') { - this.$_resizeHandler() - } + // to fixed bug when cached by keep-alive + // https://github.com/PanJiaChen/vue-element-admin/issues/2116 + activated() { + this.$_initResizeEvent() + this.$_initSidebarResizeEvent() }, - $_initSidebarResizeEvent() { - this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0] - this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler) + deactivated() { + this.$_destroyResizeEvent() + this.$_destroySidebarResizeEvent() }, - $_destroySidebarResizeEvent() { - this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler) + methods: { + // use $_ for mixins properties + // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential + $_initResizeEvent() { + window.addEventListener('resize', this.$_resizeHandler) + }, + $_destroyResizeEvent() { + window.removeEventListener('resize', this.$_resizeHandler) + }, + $_sidebarResizeHandler(e) { + if (e.propertyName === 'width') { + this.$_resizeHandler() + } + }, + $_initSidebarResizeEvent() { + this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0] + this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler) + }, + $_destroySidebarResizeEvent() { + this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler) + } } - } } diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/index.vue index ad22ab74cb17e098ca9b6c9838e0bbd785f7148e..56a21395cd17ee52f5abe1e06331fc76b2e172a0 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/index.vue +++ b/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/index.vue @@ -37,7 +37,7 @@ import LineChart from './components/LineChart' import BarChart from './components/BarChart' import BoxCard from './components/BoxCard' - import Chart from '@/components/Charts/LineMarker' + import Chart from './components/LineMarker' import {statistics} from "@/api/indexs"; const lineChartData = { @@ -77,6 +77,7 @@ } }, created() { + console.log('index-created'); this.statistics(); }, methods: { diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/i18n-demo/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/i18n-demo/index.vue index 32cee075bd113cc42c499fd4b2e8a8d1f45896b1..2fe739caee886471d2b448c0f22d6a461190ddad 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/views/i18n-demo/index.vue +++ b/app/Modules/Admin/Resources/vue-element-admin/views/i18n-demo/index.vue @@ -1,168 +1,171 @@ diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/i18n-demo/local.js b/app/Modules/Admin/Resources/vue-element-admin/views/i18n-demo/local.js index ae38dd285f249ff6c493ca9ebc7ced85a7b966fc..e6970f573805ad3bf14e2af1ae656eb8516d3e7c 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/views/i18n-demo/local.js +++ b/app/Modules/Admin/Resources/vue-element-admin/views/i18n-demo/local.js @@ -1,83 +1,82 @@ - export default { - zh: { - i18nView: { - title: '切换语言', - note: '本项目国际化基于 vue-i18n', - datePlaceholder: '请选择日期', - selectPlaceholder: '请选择', - tableDate: '日期', - tableName: '姓名', - tableAddress: '地址', - default: '默认按钮', - primary: '主要按钮', - success: '成功按钮', - info: '信息按钮', - warning: '警告按钮', - danger: '危险按钮', - one: '一', - two: '二', - three: '三' + zh: { + i18nView: { + title: '切换语言', + note: '本项目国际化基于 vue-i18n', + datePlaceholder: '请选择日期', + selectPlaceholder: '请选择', + tableDate: '日期', + tableName: '姓名', + tableAddress: '地址', + default: '默认按钮', + primary: '主要按钮', + success: '成功按钮', + info: '信息按钮', + warning: '警告按钮', + danger: '危险按钮', + one: '一', + two: '二', + three: '三' + } + }, + en: { + i18nView: { + title: 'Switch Language', + note: 'The internationalization of this project is based on vue-i18n', + datePlaceholder: 'Pick a day', + selectPlaceholder: 'Select', + tableDate: 'tableDate', + tableName: 'tableName', + tableAddress: 'tableAddress', + default: 'default:', + primary: 'primary', + success: 'success', + info: 'info', + warning: 'warning', + danger: 'danger', + one: 'One', + two: 'Two', + three: 'Three' + } + }, + es: { + i18nView: { + title: 'Switch Language', + note: 'The internationalization of this project is based on vue-i18n', + datePlaceholder: 'Pick a day', + selectPlaceholder: 'Select', + tableDate: 'tableDate', + tableName: 'tableName', + tableAddress: 'tableAddress', + default: 'default:', + primary: 'primary', + success: 'success', + info: 'info', + warning: 'warning', + danger: 'danger', + one: 'One', + two: 'Two', + three: 'Three' + } + }, + ja: { + i18nView: { + title: '言語切替', + note: 'vue-i18nを使っています', + datePlaceholder: '日時選択', + selectPlaceholder: '選択してください', + tableDate: '日時', + tableName: '姓名', + tableAddress: '住所', + default: 'default', + primary: 'primary', + success: 'success', + info: 'info', + warning: 'warning', + danger: 'danger', + one: '1', + two: '2', + three: '3' + } } - }, - en: { - i18nView: { - title: 'Switch Language', - note: 'The internationalization of this project is based on vue-i18n', - datePlaceholder: 'Pick a day', - selectPlaceholder: 'Select', - tableDate: 'tableDate', - tableName: 'tableName', - tableAddress: 'tableAddress', - default: 'default:', - primary: 'primary', - success: 'success', - info: 'info', - warning: 'warning', - danger: 'danger', - one: 'One', - two: 'Two', - three: 'Three' - } - }, - es: { - i18nView: { - title: 'Switch Language', - note: 'The internationalization of this project is based on vue-i18n', - datePlaceholder: 'Pick a day', - selectPlaceholder: 'Select', - tableDate: 'tableDate', - tableName: 'tableName', - tableAddress: 'tableAddress', - default: 'default:', - primary: 'primary', - success: 'success', - info: 'info', - warning: 'warning', - danger: 'danger', - one: 'One', - two: 'Two', - three: 'Three' - } - }, - ja: { - i18nView: { - title: '言語切替', - note: 'vue-i18nを使っています', - datePlaceholder: '日時選択', - selectPlaceholder: '選択してください', - tableDate: '日時', - tableName: '姓名', - tableAddress: '住所', - default: 'default', - primary: 'primary', - success: 'success', - info: 'info', - warning: 'warning', - danger: 'danger', - one: '1', - two: '2', - three: '3' - } - } } diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/profile/components/Account.vue b/app/Modules/Admin/Resources/vue-element-admin/views/profile/components/Account.vue index 9f2e3865a4edcf4185a296aec733a0312a28b0ba..ff6cf7707707c1152c0939099bd57dca06efa425 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/views/profile/components/Account.vue +++ b/app/Modules/Admin/Resources/vue-element-admin/views/profile/components/Account.vue @@ -1,38 +1,66 @@ diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/profile/components/Activity.vue b/app/Modules/Admin/Resources/vue-element-admin/views/profile/components/Activity.vue index dd5db3a5c553ece8512a994a1e6b663184441089..87271133b53c450191a318036add3c0b1265e7fe 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/views/profile/components/Activity.vue +++ b/app/Modules/Admin/Resources/vue-element-admin/views/profile/components/Activity.vue @@ -1,185 +1,188 @@ diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/profile/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/profile/index.vue index c115570d85afff4d1ea3b60e97df08b7d724c4a1..9e765c0d9babd5c7a7db9230bc7c60cbb4f96594 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/views/profile/index.vue +++ b/app/Modules/Admin/Resources/vue-element-admin/views/profile/index.vue @@ -10,15 +10,15 @@ + + + - - - @@ -41,7 +41,7 @@ data() { return { user: {}, - activeTab: 'activity' + activeTab: 'account' } }, computed: { @@ -52,7 +52,7 @@ ]) }, created() { - this.getUser() + this.getUser(); }, methods: { getUser() { diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/setting/banners/components/detail.vue b/app/Modules/Admin/Resources/vue-element-admin/views/setting/banners/components/detail.vue index 574122cfa31f2d89c7fc40d97e703ded86c2eee6..4fbde4994c7a873116cf0266f8dcf67dcc1474d4 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/views/setting/banners/components/detail.vue +++ b/app/Modules/Admin/Resources/vue-element-admin/views/setting/banners/components/detail.vue @@ -159,10 +159,10 @@ this.$refs['form'].validate(async (valid) => { console.log(valid); if (valid) { - const {msg} = this.form.banner_id ? await update(this.form) : await create(this.form); + const {msg, status} = this.form.banner_id ? await update(this.form) : await create(this.form); this.$message({ message: msg, - type: 'success' + type: status == 1 ? 'success' : 'error', }); this.$emit('fetchData'); this.close(); diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/setting/configs/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/setting/configs/index.vue index 8296c962b6272b7c37e5c1a19d56caf551992ad3..595960e564106098719885e663935bea03930e58 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/views/setting/configs/index.vue +++ b/app/Modules/Admin/Resources/vue-element-admin/views/setting/configs/index.vue @@ -53,17 +53,20 @@ class="margin-buttom-10" > + + + + + + + + 编辑 删除 diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/setting/friendlinks/components/detail.vue b/app/Modules/Admin/Resources/vue-element-admin/views/setting/friendlinks/components/detail.vue index 2fdad08942d405ec0bff8e7b66bf843a0feef583..21f9f17ef82d512ef221a7d97e8ab36195edd098 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/views/setting/friendlinks/components/detail.vue +++ b/app/Modules/Admin/Resources/vue-element-admin/views/setting/friendlinks/components/detail.vue @@ -160,10 +160,10 @@ this.$refs['form'].validate(async (valid) => { console.log(valid); if (valid) { - const {msg} = this.form.link_id ? await update(this.form) : await create(this.form); + const {msg, status} = this.form.link_id ? await update(this.form) : await create(this.form); this.$message({ message: msg, - type: 'success' + type: status == 1 ? 'success' : 'error', }); this.$emit('fetchData'); this.close(); diff --git a/app/Modules/Admin/Routes/web.php b/app/Modules/Admin/Routes/web.php index 8647a8c2011e7b879da5b696c06ebda852749f33..88545284b9486e27391c703a2722c90018bc1220 100644 --- a/app/Modules/Admin/Routes/web.php +++ b/app/Modules/Admin/Routes/web.php @@ -33,6 +33,10 @@ Route::prefix('admin')->group(function() { Route::middleware([CheckAuth::class, AdminLog::class])->group(function () { // 首页 Route::get('indexs', 'IndexController@index'); + // 编辑登录管理员资料 + Route::put('updateAdmin', 'IndexController@update'); + // 按照日志类型的统计图数据 + Route::get('logsStatistics', 'IndexController@logsStatistics'); // 月份表列表 Route::get('get_month_lists', 'IndexController@getMonthList'); diff --git a/app/Modules/Admin/Services/IndexService.php b/app/Modules/Admin/Services/IndexService.php index 5ce8433437530bdb394406fd29679676197f106f..16867215d3f2ed06e702e129009b06dfe5ed43a0 100644 --- a/app/Modules/Admin/Services/IndexService.php +++ b/app/Modules/Admin/Services/IndexService.php @@ -3,6 +3,7 @@ namespace App\Modules\Admin\Services; use App\Modules\Admin\Entities\Article\Article; +use App\Modules\Admin\Entities\Log\AdminLog; use App\Modules\Admin\Entities\Rabc\Admin; use App\Modules\Admin\Entities\System\Banner; use App\Modules\Admin\Entities\System\Friendlink; @@ -13,38 +14,133 @@ class IndexService extends BaseService { return [ // 管理员人数 - 'admins_count' => Admin::count(), + 'admins_count' => Admin::count(), // 文章总数 - 'articles_count' => Article::count(), + 'articles_count' => Article::count(), // Banner数量 - 'banners_count' => Banner::count(), + 'banners_count' => Banner::count(), // 友情链接数量 'friendlinks_count' => Friendlink::count(), // 技能 - 'skill' => $this->skill() + 'skill' => $this->skill(), + // 统计图:使用请求日志来做数据 + 'statistics' => $this->logsStatistics(), ]; } private function skill() { $arr = [ - 'cnpscy' => 100, - 'PHP' => rand(70, 99), - 'Mysql' => rand(70, 99), - 'Redis' => rand(70, 99), - 'Thinkphp' => rand(70, 99), - 'Laravel' => rand(50, 99), - 'Hypref' => rand(50, 99), - 'Vue' => rand(10, 99), + 'cnpscy' => 100, + 'PHP' => rand(70, 99), + 'Mysql' => rand(70, 99), + 'Redis' => rand(70, 99), + 'Thinkphp' => rand(70, 99), + 'Laravel' => rand(50, 99), + 'Hypref' => rand(50, 99), + 'Vue' => rand(10, 99), 'JavaScript' => rand(20, 99), ]; $list = []; - foreach ($arr as $key => $value){ + foreach ($arr as $key => $value) { $list[] = [ - 'name' => $key, + 'name' => $key, 'value' => $value, ]; } return $list; } + + /** + * 按照日志的请求类型来获取对应的统计图数据 + * + * @return array + */ + public function logsStatistics() + { + $default_data = [ + 'xAxis' => [ + 'data' => [ + + ], + ], + 'list_name' => [ + // 'GET', + 'POST', + 'PUT', + 'DELETE', + ], + 'data_lists' => [ + // 'GET' => [], + 'POST' => [ + + ], + 'PUT' => [ + + ], + 'DELETE' => [ + + ], + ], + ]; + $adminLogInstance = AdminLog::getInstance(); + $interval_nums = 100; // 时段次数:100个时间段,自己调整 + $time_interval = 300; // 时段间隔:5分钟,自己调整 + $hours = ceil($time_interval / 3600); // 时间间隔设置,超过几小时:查询时的开始时间需要加上才有意义 + $time = strtotime(date('Y-m-d H:i', strtotime('+' . $hours . ' hour')) . ':00'); + + // 数据查询 + $list = $adminLogInstance->whereBetWeen('created_time', [ + $time - $interval_nums * $time_interval, + $time, + ])->get(); + for ($i = 0; $i < $interval_nums; $i++) { + $end_time = $time - $time_interval; + // 默认X轴的时段 + $default_data['xAxis']['data'][$i] = date('Y-m-d H:i', $end_time); + + // $default_data['data_lists']['GET'][$i] = + $default_data['data_lists']['POST'][$i] + = $default_data['data_lists']['PUT'][$i] + = $default_data['data_lists']['DELETE'][$i] + = 0; + + if ( $list ) { + foreach ($list as $v) { + if ($v->created_time >= $end_time && $v->created_time <= $time){ + if ( $v->log_method == 'GET' ) { + // ++$default_data['data_lists']['GET'][$i]; + } elseif ( $v->log_method == 'POST' ) { + ++$default_data['data_lists']['POST'][$i]; + } elseif ( $v->log_method == 'PUT' ) { + ++$default_data['data_lists']['PUT'][$i]; + } elseif ( $v->log_method == 'DELETE' ) { + ++$default_data['data_lists']['DELETE'][$i]; + } + } + } + } + + // 把当前的结束时间设置为下一次的开始时间 + $time = $end_time; + } + return (array)$default_data; + } + + /** + * 编辑登录管理员信息 + * + * @param $request + * + * @return mixed + */ + public function updateAdmin($request) + { + $update['admin_name'] = $request->input('admin_name'); + $password = $request->input('password', ''); + if (!empty($password)){ + $update['password'] = $password; + } + return $request->user()->update($update); + } }