Merge branch 'master' of https://gitee.com/likeshop_gitee/likeadmin-java
This commit is contained in:
commit
bf28e8d67e
|
|
@ -1,4 +1,4 @@
|
||||||
NODE_ENV = 'development'
|
NODE_ENV = 'development'
|
||||||
|
|
||||||
# Base API
|
# Base API
|
||||||
VITE_APP_BASE_URL='https://likeadmin.yixiangonline.com'
|
VITE_APP_BASE_URL='http://likeadmin-java-api.yixiangonline.com'
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -23,16 +23,16 @@ export default defineComponent({
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
// 获取配置
|
// 获取配置
|
||||||
const data = await store.dispatch('app/getConfig')
|
const data = await store.dispatch('app/getConfig')
|
||||||
|
console.log('data', data)
|
||||||
// 设置网站logo
|
// 设置网站logo
|
||||||
let favicon: HTMLLinkElement = document.querySelector('link[rel="icon"]')!
|
let favicon: HTMLLinkElement = document.querySelector('link[rel="icon"]')!
|
||||||
if (favicon) {
|
if (favicon) {
|
||||||
favicon.href = data.web_favicon
|
favicon.href = data.webFavicon
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
favicon = document.createElement('link')
|
favicon = document.createElement('link')
|
||||||
favicon.rel = 'icon'
|
favicon.rel = 'icon'
|
||||||
favicon.href = data.web_favicon
|
favicon.href = data.webFavicon
|
||||||
document.head.appendChild(favicon)
|
document.head.appendChild(favicon)
|
||||||
})
|
})
|
||||||
return {
|
return {
|
||||||
|
|
|
||||||
|
|
@ -40,5 +40,5 @@ export function apiFileRename(params: { id: number; name: string }) {
|
||||||
|
|
||||||
// 配置
|
// 配置
|
||||||
export function apiConfig() {
|
export function apiConfig() {
|
||||||
return request.get('/config/getConfig')
|
return request.get('/index/config')
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,30 +2,31 @@ import request from '@/utils/request'
|
||||||
import { terminal } from '@/config/app'
|
import { terminal } from '@/config/app'
|
||||||
|
|
||||||
export function adminLists(params: any) {
|
export function adminLists(params: any) {
|
||||||
return request.get('/auth.admin/lists', { params })
|
return request.get('/system/admin/lists', { params })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 管理员添加
|
// 管理员添加
|
||||||
export function apiAdminAdd(params: any) {
|
export function apiAdminAdd(params: any) {
|
||||||
return request.post('/auth.admin/add', params)
|
return request.post('/system/admin/add', params)
|
||||||
}
|
}
|
||||||
|
|
||||||
export function apiAdminEdit(params: any) {
|
export function apiAdminEdit(params: any) {
|
||||||
return request.post('/auth.admin/edit', params)
|
return request.post('/system/admin/edit', params)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 管理员删除
|
// 管理员删除
|
||||||
export function apiAdminDelete(params: { id: number }) {
|
export function apiAdminDelete(params: { id: number }) {
|
||||||
return request.post('/auth.admin/delete', params)
|
return request.post('/system/admin/del', params)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 管理员详情
|
// 管理员详情
|
||||||
export function apiAdminDetail(params: any) {
|
export function apiAdminDetail(params: any) {
|
||||||
return request.get('/auth.admin/detail', { params })
|
return request.get('/system/admin/detail', { params })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 角色列表
|
// 角色列表
|
||||||
export function apiRoleLists(params: any) {
|
export function apiRoleLists(params: any) {
|
||||||
return request.get('/auth.role/lists', { params })
|
return request.get('/system/role/lists', { params })
|
||||||
}
|
}
|
||||||
// 添加角色
|
// 添加角色
|
||||||
export function apiRoleAdd(params: any) {
|
export function apiRoleAdd(params: any) {
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ export function apiSetCopyright(params: any) {
|
||||||
|
|
||||||
// 获取网站信息
|
// 获取网站信息
|
||||||
export function apiGetWebsite() {
|
export function apiGetWebsite() {
|
||||||
return request.get('/setting.web.web_setting/getWebsite')
|
return request.get('/setting/website')
|
||||||
}
|
}
|
||||||
// 设置网站信息
|
// 设置网站信息
|
||||||
export function apiSetWebsite(params: any) {
|
export function apiSetWebsite(params: any) {
|
||||||
|
|
@ -63,3 +63,23 @@ export function apiLoginConfigSet(params: any) {
|
||||||
return request.post('/setting.user.user/setRegisterConfig', params)
|
return request.post('/setting.user.user/setRegisterConfig', params)
|
||||||
}
|
}
|
||||||
/** E 用户设置 **/
|
/** E 用户设置 **/
|
||||||
|
|
||||||
|
// 获取系统日志列表
|
||||||
|
export function apiSystemLogLists(params: any) {
|
||||||
|
return request.get('/setting.system.log/lists', { params })
|
||||||
|
}
|
||||||
|
|
||||||
|
// 清除系统缓存
|
||||||
|
export function apiSystemCacheClear() {
|
||||||
|
return request.post('/setting.system.cache/clear')
|
||||||
|
}
|
||||||
|
|
||||||
|
// 编辑管理员信息
|
||||||
|
export function apiAuthAdminEditSelf(params: any) {
|
||||||
|
return request.post('/auth.admin/editSelf', params)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取管理员信息
|
||||||
|
export function apiAuthAdminMySelf() {
|
||||||
|
return request.post('/auth.admin/mySelf')
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,16 +2,16 @@ import request from '@/utils/request'
|
||||||
import { terminal } from '@/config/app'
|
import { terminal } from '@/config/app'
|
||||||
|
|
||||||
// 登录
|
// 登录
|
||||||
export function apiLogin(params: { account: string; password: string }) {
|
export function apiLogin(params: { username: string; password: string }) {
|
||||||
return request.post('/login/account', { ...params, terminal })
|
return request.post('/system/login', { ...params, terminal })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 退出登录
|
// 退出登录
|
||||||
export function apiLogout() {
|
export function apiLogout() {
|
||||||
return request.post('/login/logout')
|
return request.post('/system/logout')
|
||||||
}
|
}
|
||||||
|
|
||||||
// 用户信息
|
// 用户信息
|
||||||
export function apiUserInfo() {
|
export function apiUserInfo() {
|
||||||
return request.get('/auth.admin/mySelf')
|
return request.get('/system/admin/self')
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,5 +2,5 @@ import request from '@/utils/request'
|
||||||
|
|
||||||
// 工作台主页
|
// 工作台主页
|
||||||
export function apiWorkbench() {
|
export function apiWorkbench() {
|
||||||
return request.get('/Workbench/index')
|
return request.get('/index/console')
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,111 @@
|
||||||
|
<template>
|
||||||
|
<el-date-picker
|
||||||
|
v-model="content"
|
||||||
|
type="datetimerange"
|
||||||
|
:shortcuts="shortcuts"
|
||||||
|
range-separator="-"
|
||||||
|
format="YYYY-MM-DD HH:mm:ss"
|
||||||
|
value-format="YYYY-MM-DD HH:mm:ss"
|
||||||
|
start-placeholder="开始时间"
|
||||||
|
end-placeholder="结束时间"
|
||||||
|
></el-date-picker>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { withDefaults, computed } from 'vue'
|
||||||
|
|
||||||
|
/* Props S */
|
||||||
|
const props = withDefaults(
|
||||||
|
defineProps<{
|
||||||
|
start_time?: string
|
||||||
|
end_time?: string
|
||||||
|
}>(),
|
||||||
|
{
|
||||||
|
start_time: '',
|
||||||
|
end_time: '',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
/* Props E */
|
||||||
|
|
||||||
|
/* Emit S */
|
||||||
|
const emit = defineEmits(['update:start_time', 'update:end_time'])
|
||||||
|
/* Emit E */
|
||||||
|
|
||||||
|
/* Computed S */
|
||||||
|
let content = computed({
|
||||||
|
get: () => {
|
||||||
|
return [props.start_time, props.end_time]
|
||||||
|
},
|
||||||
|
set: (value: Event | any) => {
|
||||||
|
if (value === null) {
|
||||||
|
emit('update:start_time', '')
|
||||||
|
emit('update:end_time', '')
|
||||||
|
} else {
|
||||||
|
emit('update:start_time', value[0])
|
||||||
|
emit('update:end_time', value[1])
|
||||||
|
}
|
||||||
|
},
|
||||||
|
})
|
||||||
|
/* Computed E */
|
||||||
|
|
||||||
|
/* Data S */
|
||||||
|
const shortcuts = [
|
||||||
|
{
|
||||||
|
text: '最近一个星期',
|
||||||
|
value: () => {
|
||||||
|
const end = new Date()
|
||||||
|
const start = new Date()
|
||||||
|
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
|
||||||
|
return [start, end]
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: '最近一个月',
|
||||||
|
value: () => {
|
||||||
|
const end = new Date()
|
||||||
|
const start = new Date()
|
||||||
|
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
|
||||||
|
return [start, end]
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: '最近三个月',
|
||||||
|
value: () => {
|
||||||
|
const end = new Date()
|
||||||
|
const start = new Date()
|
||||||
|
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
|
||||||
|
return [start, end]
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: '未来一个星期',
|
||||||
|
value: () => {
|
||||||
|
const end = new Date()
|
||||||
|
const start = new Date()
|
||||||
|
end.setTime(end.getTime() + 3600 * 1000 * 24 * 7)
|
||||||
|
return [start, end]
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: '未来一个月',
|
||||||
|
value: () => {
|
||||||
|
const end = new Date()
|
||||||
|
const start = new Date()
|
||||||
|
end.setTime(end.getTime() + 3600 * 1000 * 24 * 30)
|
||||||
|
return [start, end]
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: '未来三个月',
|
||||||
|
value: () => {
|
||||||
|
const end = new Date()
|
||||||
|
const start = new Date()
|
||||||
|
end.setTime(end.getTime() + 3600 * 1000 * 24 * 90)
|
||||||
|
return [start, end]
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]
|
||||||
|
/* Data E */
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style></style>
|
||||||
|
|
@ -1,237 +0,0 @@
|
||||||
<template>
|
|
||||||
<div class="cl-editor-quill">
|
|
||||||
<div ref="editorRef" class="editor" :style="style"></div>
|
|
||||||
<material-select ref="materialRef" :hidden="true" :limit="-1" @change="filesChange" />
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup lang="ts">
|
|
||||||
import { computed, defineComponent, onMounted, onUnmounted, ref, toRefs, watch } from 'vue'
|
|
||||||
import Quill from 'quill'
|
|
||||||
import 'quill/dist/quill.snow.css'
|
|
||||||
import MaterialSelect from '@/components/material-select/index.vue'
|
|
||||||
interface Props {
|
|
||||||
// 绑定的值
|
|
||||||
modelValue: string
|
|
||||||
// 编辑器的参数
|
|
||||||
options?: Record<any, any>
|
|
||||||
// 编辑器的宽度
|
|
||||||
width?: number | string
|
|
||||||
// 编辑器的高
|
|
||||||
height?: number | string
|
|
||||||
minHeight?: number | string
|
|
||||||
}
|
|
||||||
|
|
||||||
const props = withDefaults(defineProps<Props>(), {
|
|
||||||
options: () => ({}),
|
|
||||||
width: '100%',
|
|
||||||
height: '100%',
|
|
||||||
})
|
|
||||||
|
|
||||||
const emit = defineEmits<{
|
|
||||||
(event: 'update:modelValue', val: string): void
|
|
||||||
(event: 'load', quill: any): void
|
|
||||||
}>()
|
|
||||||
|
|
||||||
let quill: any = null
|
|
||||||
|
|
||||||
const editorRef = ref()
|
|
||||||
const materialRef = ref()
|
|
||||||
|
|
||||||
// 文本内容
|
|
||||||
const content = ref('')
|
|
||||||
|
|
||||||
// 光标位置
|
|
||||||
const cursorIndex = ref(0)
|
|
||||||
|
|
||||||
// 图片上传处理
|
|
||||||
const uploadFileHandler = () => {
|
|
||||||
const selection = quill.getSelection()
|
|
||||||
if (selection) {
|
|
||||||
cursorIndex.value = selection.index
|
|
||||||
}
|
|
||||||
|
|
||||||
materialRef.value.showPopup()
|
|
||||||
}
|
|
||||||
// 图片插入
|
|
||||||
const filesChange = (files: any[]) => {
|
|
||||||
if (files.length > 0) {
|
|
||||||
// 批量插入图片
|
|
||||||
files.forEach((file, i) => {
|
|
||||||
quill.insertEmbed(cursorIndex.value + i, 'image', file, Quill.sources.USER)
|
|
||||||
})
|
|
||||||
|
|
||||||
// 移动光标到图片后一位
|
|
||||||
quill.setSelection(cursorIndex.value + files.length)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 设置内容
|
|
||||||
const setContent = (val: string) => {
|
|
||||||
quill.root.innerHTML = val || ''
|
|
||||||
}
|
|
||||||
|
|
||||||
// 编辑框样式
|
|
||||||
const style = computed<any>(() => {
|
|
||||||
return {
|
|
||||||
height: typeof props.height == 'string' ? props.height : `${props.height}px`,
|
|
||||||
width: typeof props.width == 'string' ? props.width : `${props.width}px`,
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// 监听绑定值
|
|
||||||
watch(
|
|
||||||
() => props.modelValue,
|
|
||||||
(val: string) => {
|
|
||||||
if (val) {
|
|
||||||
if (val !== content.value) {
|
|
||||||
setContent(val)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
setContent('')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
onMounted(() => {
|
|
||||||
// 实例化
|
|
||||||
quill = new Quill(editorRef.value, {
|
|
||||||
theme: 'snow',
|
|
||||||
placeholder: '输入内容',
|
|
||||||
modules: {
|
|
||||||
toolbar: [
|
|
||||||
['bold', 'italic', 'underline', 'strike'],
|
|
||||||
['blockquote', 'code-block'],
|
|
||||||
[{ header: 1 }, { header: 2 }],
|
|
||||||
[{ list: 'ordered' }, { list: 'bullet' }],
|
|
||||||
[{ script: 'sub' }, { script: 'super' }],
|
|
||||||
[{ indent: '-1' }, { indent: '+1' }],
|
|
||||||
[{ direction: 'rtl' }],
|
|
||||||
[{ size: ['small', false, 'large', 'huge'] }],
|
|
||||||
[{ header: [1, 2, 3, 4, 5, 6, false] }],
|
|
||||||
[{ color: [] }, { background: [] }],
|
|
||||||
[{ font: [] }],
|
|
||||||
[{ align: [] }],
|
|
||||||
['clean'],
|
|
||||||
['link', 'image'],
|
|
||||||
],
|
|
||||||
},
|
|
||||||
...props.options,
|
|
||||||
})
|
|
||||||
|
|
||||||
// 添加图片工具
|
|
||||||
quill.getModule('toolbar').addHandler('image', uploadFileHandler)
|
|
||||||
|
|
||||||
// 监听输入
|
|
||||||
quill.on('text-change', () => {
|
|
||||||
content.value = quill.root.innerHTML
|
|
||||||
emit('update:modelValue', content.value)
|
|
||||||
})
|
|
||||||
|
|
||||||
setContent(props.modelValue)
|
|
||||||
|
|
||||||
// 加载回调
|
|
||||||
emit('load', quill)
|
|
||||||
})
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss">
|
|
||||||
.cl-editor-quill {
|
|
||||||
background-color: #fff;
|
|
||||||
|
|
||||||
.ql-snow {
|
|
||||||
line-height: 22px !important;
|
|
||||||
}
|
|
||||||
#quill-upload-btn {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.ql-snow {
|
|
||||||
border: 1px solid #dcdfe6;
|
|
||||||
}
|
|
||||||
|
|
||||||
.ql-snow .ql-tooltip[data-mode='link']::before {
|
|
||||||
content: '请输入链接地址:';
|
|
||||||
}
|
|
||||||
|
|
||||||
.ql-snow .ql-tooltip.ql-editing a.ql-action::after {
|
|
||||||
border-right: 0px;
|
|
||||||
content: '保存';
|
|
||||||
padding-right: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.ql-snow .ql-tooltip[data-mode='video']::before {
|
|
||||||
content: '请输入视频地址:';
|
|
||||||
}
|
|
||||||
|
|
||||||
.ql-snow .ql-picker.ql-size .ql-picker-label::before,
|
|
||||||
.ql-snow .ql-picker.ql-size .ql-picker-item::before {
|
|
||||||
content: '14px';
|
|
||||||
}
|
|
||||||
|
|
||||||
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='small']::before,
|
|
||||||
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='small']::before {
|
|
||||||
content: '10px';
|
|
||||||
}
|
|
||||||
|
|
||||||
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='large']::before,
|
|
||||||
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='large']::before {
|
|
||||||
content: '18px';
|
|
||||||
}
|
|
||||||
|
|
||||||
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='huge']::before,
|
|
||||||
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='huge']::before {
|
|
||||||
content: '32px';
|
|
||||||
}
|
|
||||||
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-label::before,
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-item::before {
|
|
||||||
content: '文本';
|
|
||||||
}
|
|
||||||
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='1']::before,
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='1']::before {
|
|
||||||
content: '标题1';
|
|
||||||
}
|
|
||||||
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='2']::before,
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='2']::before {
|
|
||||||
content: '标题2';
|
|
||||||
}
|
|
||||||
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='3']::before,
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='3']::before {
|
|
||||||
content: '标题3';
|
|
||||||
}
|
|
||||||
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='4']::before,
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='4']::before {
|
|
||||||
content: '标题4';
|
|
||||||
}
|
|
||||||
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='5']::before,
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='5']::before {
|
|
||||||
content: '标题5';
|
|
||||||
}
|
|
||||||
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='6']::before,
|
|
||||||
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='6']::before {
|
|
||||||
content: '标题6';
|
|
||||||
}
|
|
||||||
|
|
||||||
.ql-snow .ql-picker.ql-font .ql-picker-label::before,
|
|
||||||
.ql-snow .ql-picker.ql-font .ql-picker-item::before {
|
|
||||||
content: '标准字体';
|
|
||||||
}
|
|
||||||
|
|
||||||
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value='serif']::before,
|
|
||||||
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value='serif']::before {
|
|
||||||
content: '衬线字体';
|
|
||||||
}
|
|
||||||
|
|
||||||
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value='monospace']::before,
|
|
||||||
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value='monospace']::before {
|
|
||||||
content: '等宽字体';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,14 +1,15 @@
|
||||||
<template>
|
<template>
|
||||||
<div v-if="permission" class="perm">
|
<!-- <div v-if="permission" class="perm"> -->
|
||||||
<template v-if="hasPermission">
|
<div class="perm">
|
||||||
|
<!-- <template v-if="hasPermission"> -->
|
||||||
|
|
||||||
<router-view></router-view>
|
<router-view></router-view>
|
||||||
</template>
|
<!-- <template v-else>
|
||||||
<template v-else>
|
|
||||||
<div class="no-perm flex flex-col flex-center">
|
<div class="no-perm flex flex-col flex-center">
|
||||||
<img src="@/assets/images/no_perm.png" />
|
<img src="@/assets/images/no_perm.png" />
|
||||||
<div class="muted">暂无查看权限</div>
|
<div class="muted">暂无查看权限</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template> -->
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,10 +21,10 @@ export const asyncRoutes: Array<RouteRecordRaw> = [
|
||||||
component: workbench,
|
component: workbench,
|
||||||
meta: { title: '工作台', icon: 'icon-home', permission: ['view'] }
|
meta: { title: '工作台', icon: 'icon-home', permission: ['view'] }
|
||||||
},
|
},
|
||||||
decoration, // 装修管理
|
// decoration, // 装修管理
|
||||||
application,// 应用管理
|
// application,// 应用管理
|
||||||
content, // 内容管理
|
// content, // 内容管理
|
||||||
channel, // 渠道管理
|
// channel, // 渠道管理
|
||||||
permission,
|
permission,
|
||||||
setting
|
setting
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,10 @@ const routes: RouteRecordRaw = {
|
||||||
path: '/setting/service',
|
path: '/setting/service',
|
||||||
redirect: '/setting/service/online_service',
|
redirect: '/setting/service/online_service',
|
||||||
component: RouterView,
|
component: RouterView,
|
||||||
meta: { title: '客服设置' },
|
meta: {
|
||||||
|
title: '客服设置',
|
||||||
|
hidden: true,
|
||||||
|
},
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
path: '/setting/service/online_service',
|
path: '/setting/service/online_service',
|
||||||
|
|
@ -49,6 +52,7 @@ const routes: RouteRecordRaw = {
|
||||||
meta: {
|
meta: {
|
||||||
title: '政策/协议',
|
title: '政策/协议',
|
||||||
permission: ['view'],
|
permission: ['view'],
|
||||||
|
hidden: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|
@ -57,7 +61,10 @@ const routes: RouteRecordRaw = {
|
||||||
path: '/setting/user',
|
path: '/setting/user',
|
||||||
redirect: '/setting/user',
|
redirect: '/setting/user',
|
||||||
component: RouterView,
|
component: RouterView,
|
||||||
meta: { title: '用户设置' },
|
meta: {
|
||||||
|
title: '用户设置',
|
||||||
|
hidden: true,
|
||||||
|
},
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
path: '/setting/user',
|
path: '/setting/user',
|
||||||
|
|
@ -91,8 +98,33 @@ const routes: RouteRecordRaw = {
|
||||||
permission: ['view'],
|
permission: ['view'],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: '/setting/website/journal',
|
||||||
|
component: () => import('@/views/setting/system/journal.vue'),
|
||||||
|
meta: {
|
||||||
|
title: '系统日志',
|
||||||
|
permission: ['view'],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/setting/website/cache',
|
||||||
|
component: () => import('@/views/setting/system/cache.vue'),
|
||||||
|
meta: {
|
||||||
|
title: '系统缓存',
|
||||||
|
permission: ['view'],
|
||||||
|
},
|
||||||
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
// component: RouterView,
|
||||||
|
path: '/setting/personal/personal_data',
|
||||||
|
component: () => import('@/views/setting/personal/personal_data.vue'),
|
||||||
|
meta: {
|
||||||
|
title: '个人设置',
|
||||||
|
permission: ['view'],
|
||||||
|
},
|
||||||
|
},
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,14 +30,16 @@ const permission: Module<PermissionModule, any> = {
|
||||||
actions: {
|
actions: {
|
||||||
getPermission({ commit }) {
|
getPermission({ commit }) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
apiConfigGetAuth()
|
// apiConfigGetAuth()
|
||||||
.then(data => {
|
// .then(data => {
|
||||||
commit('setPermission', data)
|
// commit('setPermission', data)
|
||||||
resolve(data)
|
// resolve(data)
|
||||||
})
|
// })
|
||||||
.catch(err => {
|
// .catch(err => {
|
||||||
reject(err)
|
// reject(err)
|
||||||
})
|
// })
|
||||||
|
|
||||||
|
resolve({})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,9 +25,11 @@ const user: Module<UserModule, any> = {
|
||||||
// 登录
|
// 登录
|
||||||
login({ commit }, data) {
|
login({ commit }, data) {
|
||||||
const { account, password } = data
|
const { account, password } = data
|
||||||
|
console.log(data, '----------------------')
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
apiLogin({
|
apiLogin({
|
||||||
account: account.trim(),
|
username: account,
|
||||||
password: password
|
password: password
|
||||||
})
|
})
|
||||||
.then((data: any) => {
|
.then((data: any) => {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
// 引入所有样式
|
// 引入所有样式
|
||||||
@use 'element-plus/theme-chalk/src/index.scss';
|
// @use 'element-plus/theme-chalk/src/index.scss';
|
||||||
|
@import "element-plus/theme-chalk/src/index.scss";
|
||||||
:root {
|
:root {
|
||||||
--el-font-weight-primary: 400;
|
--el-font-weight-primary: 400;
|
||||||
}
|
}
|
||||||
|
|
@ -97,3 +97,8 @@
|
||||||
.el-icon {
|
.el-icon {
|
||||||
font-size: var(--font-size);
|
font-size: var(--font-size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.el-alert--primary {
|
||||||
|
color: $color-primary;
|
||||||
|
background-color: $color-primary-light-9;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ const eventResponse = {
|
||||||
}
|
}
|
||||||
|
|
||||||
const request = axios.create({
|
const request = axios.create({
|
||||||
baseURL: `${import.meta.env.VITE_APP_BASE_URL}/adminapi`,
|
baseURL: `${import.meta.env.VITE_APP_BASE_URL}/api`,
|
||||||
timeout: 60 * 1000,
|
timeout: 60 * 1000,
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
|
|
@ -66,11 +66,23 @@ request.interceptors.request.use(
|
||||||
request.interceptors.response.use(
|
request.interceptors.response.use(
|
||||||
response => {
|
response => {
|
||||||
switch (response.data.code) {
|
switch (response.data.code) {
|
||||||
case 1:
|
case 200:
|
||||||
return eventResponse.success(response.data)
|
return eventResponse.success(response.data)
|
||||||
case 0:
|
case 300:
|
||||||
|
case 310:
|
||||||
|
case 311:
|
||||||
|
case 312:
|
||||||
|
case 313:
|
||||||
|
case 314:
|
||||||
|
case 403:
|
||||||
|
case 404:
|
||||||
|
case 500:
|
||||||
return eventResponse.error(response.data)
|
return eventResponse.error(response.data)
|
||||||
case -1:
|
case -1:
|
||||||
|
case 330:
|
||||||
|
case 331:
|
||||||
|
case 332:
|
||||||
|
case 333:
|
||||||
return eventResponse.redirect()
|
return eventResponse.redirect()
|
||||||
case 2:
|
case 2:
|
||||||
return eventResponse.page(response.data)
|
return eventResponse.page(response.data)
|
||||||
|
|
|
||||||
|
|
@ -5,12 +5,12 @@
|
||||||
<div
|
<div
|
||||||
class="login-img"
|
class="login-img"
|
||||||
:style="{
|
:style="{
|
||||||
'background-image': `url(${config.login_image})`
|
'background-image': `url(${config.webBackdrop})`
|
||||||
}"
|
}"
|
||||||
></div>
|
></div>
|
||||||
<div class="login-form flex flex-col">
|
<div class="login-form flex flex-col">
|
||||||
<div class="f-s-24 f-w-500 text-center m-b-40">
|
<div class="f-s-24 f-w-500 text-center m-b-40">
|
||||||
{{ config.web_name }}
|
{{ config.webName }}
|
||||||
</div>
|
</div>
|
||||||
<el-form ref="loginFormRefs" :model="loginForm" status-icon :rules="rules">
|
<el-form ref="loginFormRefs" :model="loginForm" status-icon :rules="rules">
|
||||||
<el-form-item prop="account">
|
<el-form-item prop="account">
|
||||||
|
|
|
||||||
|
|
@ -3,13 +3,13 @@
|
||||||
<el-card shadow="never">
|
<el-card shadow="never">
|
||||||
<el-form class="ls-form" :model="formData" label-width="80px" size="small" inline>
|
<el-form class="ls-form" :model="formData" label-width="80px" size="small" inline>
|
||||||
<el-form-item label="账号:">
|
<el-form-item label="账号:">
|
||||||
<el-input v-model="formData.account" class="ls-input" />
|
<el-input v-model="formData.username" class="ls-input" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="名称:">
|
<el-form-item label="名称:">
|
||||||
<el-input v-model="formData.name" class="ls-input" />
|
<el-input v-model="formData.nickname" class="ls-input" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="角色:">
|
<el-form-item label="角色:">
|
||||||
<el-select v-model="formData.role_id" placeholder="全部">
|
<el-select v-model="formData.role" placeholder="全部">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="(item, index) in roleList"
|
v-for="(item, index) in roleList"
|
||||||
:key="index"
|
:key="index"
|
||||||
|
|
@ -38,32 +38,28 @@
|
||||||
<el-avatar :size="50" :src="row.avatar"></el-avatar>
|
<el-avatar :size="50" :src="row.avatar"></el-avatar>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="账号" prop="account" min-width="100"></el-table-column>
|
<el-table-column label="账号" prop="username" min-width="100"></el-table-column>
|
||||||
<el-table-column label="名称" prop="name" min-width="100"></el-table-column>
|
<el-table-column label="名称" prop="nickname" min-width="100"></el-table-column>
|
||||||
<el-table-column
|
<el-table-column label="角色" prop="role" min-width="100"></el-table-column>
|
||||||
label="角色"
|
|
||||||
prop="role_name"
|
|
||||||
min-width="100"
|
|
||||||
></el-table-column>
|
|
||||||
<el-table-column
|
<el-table-column
|
||||||
label="创建时间"
|
label="创建时间"
|
||||||
prop="create_time"
|
prop="createTime"
|
||||||
min-width="150"
|
min-width="150"
|
||||||
></el-table-column>
|
></el-table-column>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
label="最近登录时间"
|
label="最近登录时间"
|
||||||
prop="login_time"
|
prop="lastLoginTime"
|
||||||
min-width="150"
|
min-width="150"
|
||||||
></el-table-column>
|
></el-table-column>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
label="最近登录IP"
|
label="最近登录IP"
|
||||||
prop="login_ip"
|
prop="lastLoginIp"
|
||||||
min-width="100"
|
min-width="100"
|
||||||
></el-table-column>
|
></el-table-column>
|
||||||
<el-table-column label="状态" min-width="100">
|
<el-table-column label="状态" min-width="100">
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
<el-switch
|
<el-switch
|
||||||
v-model="row.disable"
|
v-model="row.isDisable"
|
||||||
:active-value="0"
|
:active-value="0"
|
||||||
:inactive-value="1"
|
:inactive-value="1"
|
||||||
@change="changeStatus(row)"
|
@change="changeStatus(row)"
|
||||||
|
|
@ -117,9 +113,9 @@ export default defineComponent({
|
||||||
setup() {
|
setup() {
|
||||||
// 表单数据
|
// 表单数据
|
||||||
const formData = reactive({
|
const formData = reactive({
|
||||||
account: '',
|
username: '',
|
||||||
name: '',
|
nickname: '',
|
||||||
role_id: ''
|
role: ''
|
||||||
})
|
})
|
||||||
const roleList: Ref<any[]> = ref([])
|
const roleList: Ref<any[]> = ref([])
|
||||||
const { pager, requestApi, resetParams, resetPage } = usePages({
|
const { pager, requestApi, resetParams, resetPage } = usePages({
|
||||||
|
|
@ -129,10 +125,10 @@ export default defineComponent({
|
||||||
const changeStatus = (data: any) => {
|
const changeStatus = (data: any) => {
|
||||||
apiAdminEdit({
|
apiAdminEdit({
|
||||||
id: data.id,
|
id: data.id,
|
||||||
account: data.account,
|
username: data.username,
|
||||||
name: data.name,
|
nickname: data.nickname,
|
||||||
role_id: data.role_id,
|
role: data.role,
|
||||||
disable: data.disable,
|
isDisable: data.isDisable,
|
||||||
multipoint_login: data.multipoint_login
|
multipoint_login: data.multipoint_login
|
||||||
}).finally(() => {
|
}).finally(() => {
|
||||||
requestApi()
|
requestApi()
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,9 @@
|
||||||
<el-table :data="pager.lists" size="medium">
|
<el-table :data="pager.lists" size="medium">
|
||||||
<el-table-column prop="id" label="ID"></el-table-column>
|
<el-table-column prop="id" label="ID"></el-table-column>
|
||||||
<el-table-column prop="name" label="名称"></el-table-column>
|
<el-table-column prop="name" label="名称"></el-table-column>
|
||||||
<el-table-column prop="desc" label="备注"></el-table-column>
|
<el-table-column prop="remark" label="备注"></el-table-column>
|
||||||
<el-table-column prop label="权限"></el-table-column>
|
<el-table-column prop label="权限"></el-table-column>
|
||||||
<el-table-column prop="create_time" label="创建时间"></el-table-column>
|
<el-table-column prop="createTime" label="创建时间"></el-table-column>
|
||||||
<el-table-column prop label="操作">
|
<el-table-column prop label="操作">
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
<!-- 编辑 -->
|
<!-- 编辑 -->
|
||||||
|
|
@ -64,7 +64,7 @@ export default defineComponent({
|
||||||
const formData = reactive({
|
const formData = reactive({
|
||||||
id: 0, // 角色id
|
id: 0, // 角色id
|
||||||
name: '', // 角色名称
|
name: '', // 角色名称
|
||||||
desc: '', // 备注
|
remark: '', // 备注
|
||||||
create_time: '', // 创建时间
|
create_time: '', // 创建时间
|
||||||
num: 0 // 使用该角色的人数
|
num: 0 // 使用该角色的人数
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,145 @@
|
||||||
|
<!-- 个人资料 -->
|
||||||
|
<template>
|
||||||
|
<div class="personal-data">
|
||||||
|
<el-card class="m-t-15" shadow="never">
|
||||||
|
<el-form
|
||||||
|
ref="formRefs"
|
||||||
|
class="ls-form"
|
||||||
|
:model="formData"
|
||||||
|
:rules="rules"
|
||||||
|
label-width="150px"
|
||||||
|
size="small"
|
||||||
|
>
|
||||||
|
<el-form-item label="头像:" prop="avatar">
|
||||||
|
<material-select v-model="formData.avatar" :limit="1"></material-select>
|
||||||
|
<!-- <div class="muted">建议尺寸:240*200,支持jpg、png格式</div> -->
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item label="账号:" prop="account">
|
||||||
|
<el-input v-model="formData.account" placeholder="" disabled></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item label="名称:" prop="name">
|
||||||
|
<el-input v-model="formData.name" placeholder="请输入名称"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item label="当前密码:" prop="password_old">
|
||||||
|
<el-input v-model.trim="formData.password_old" placeholder="修改密码时必填, 不修改密码时留空" type="password" show-password></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item label="新的密码:" prop="password">
|
||||||
|
<el-input v-model.trim="formData.password" placeholder="修改密码时必填, 不修改密码时留空" type="password" show-password></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item label="确定密码:" prop="password_confirm">
|
||||||
|
<el-input v-model.trim="formData.password_confirm" placeholder="修改密码时必填, 不修改密码时留空" type="password" show-password></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</el-card>
|
||||||
|
|
||||||
|
<footer-btns>
|
||||||
|
<el-button type="primary" size="small" @click="onSubmit(formRefs)">保存</el-button>
|
||||||
|
</footer-btns>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { reactive, ref, onMounted } from 'vue'
|
||||||
|
import type { ElForm } from 'element-plus'
|
||||||
|
import MaterialSelect from '@/components/material-select/index.vue'
|
||||||
|
import FooterBtns from '@/components/footer-btns/index.vue'
|
||||||
|
import { apiAuthAdminEditSelf, apiAuthAdminMySelf } from '@/api/setting'
|
||||||
|
import { ElMessage } from 'element-plus'
|
||||||
|
import { useAdmin } from '@/core/hooks/app'
|
||||||
|
|
||||||
|
const { store } = useAdmin()
|
||||||
|
type FormInstance = InstanceType<typeof ElForm>
|
||||||
|
const formRefs = ref<FormInstance>()
|
||||||
|
|
||||||
|
// 表单数据
|
||||||
|
const formData = ref({
|
||||||
|
avatar: '', // 头像
|
||||||
|
account: '', // 账号
|
||||||
|
name: '', // 名称
|
||||||
|
password_old: '', // 当前密码
|
||||||
|
password: '', // 新的密码
|
||||||
|
password_confirm: '', // 确定密码
|
||||||
|
})
|
||||||
|
|
||||||
|
// 表单校验规则
|
||||||
|
const rules = reactive<object>({
|
||||||
|
avatar: [
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
message: '头像不能为空',
|
||||||
|
trigger: ['change'],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
name: [
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
message: '请输入名称',
|
||||||
|
trigger: ['blur'],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
})
|
||||||
|
|
||||||
|
// 获取个人设置
|
||||||
|
const getAuthAdminMySelf = async (): Promise<void> => {
|
||||||
|
formData.value = await apiAuthAdminMySelf()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置个人设置
|
||||||
|
const setAuthAdminEditSelf = async ():Promise<void> => {
|
||||||
|
if(formData.value.password_old || formData.value.password || formData.value.password_confirm) {
|
||||||
|
if(!formData.value.password_old) {
|
||||||
|
return ElMessage({ type: 'error', message: '请输入当前密码' })
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!formData.value.password) {
|
||||||
|
return ElMessage({ type: 'error', message: '请输入新的密码' })
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!formData.value.password_confirm) {
|
||||||
|
return ElMessage({ type: 'error', message: '请输入确定密码' })
|
||||||
|
}
|
||||||
|
|
||||||
|
if(formData.value.password_confirm != formData.value.password) {
|
||||||
|
return ElMessage({ type: 'error', message: '两次输入的密码不一样' })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(formData.value.password_old && formData.value.password && formData.value.password_confirm) {
|
||||||
|
if(formData.value.password_old.length < 6 || formData.value.password_old.length > 32) {
|
||||||
|
return ElMessage({ type: 'error', message: '密码长度在6到32之间' })
|
||||||
|
}
|
||||||
|
if(formData.value.password.length < 6 || formData.value.password.length > 32) {
|
||||||
|
return ElMessage({ type: 'error', message: '密码长度在6到32之间' })
|
||||||
|
}
|
||||||
|
if(formData.value.password_confirm.length < 6 || formData.value.password_confirm.length > 32) {
|
||||||
|
return ElMessage({ type: 'error', message: '密码长度在6到32之间' })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await apiAuthAdminEditSelf({...formData.value})
|
||||||
|
getAuthAdminMySelf()
|
||||||
|
store.dispatch('user/getUser')
|
||||||
|
}
|
||||||
|
|
||||||
|
// 提交数据
|
||||||
|
const onSubmit = (formEl: FormInstance | undefined): void => {
|
||||||
|
if(!formEl) return
|
||||||
|
|
||||||
|
formEl.validate((valid): Boolean | undefined => {
|
||||||
|
if(!valid) return false
|
||||||
|
setAuthAdminEditSelf()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
getAuthAdminMySelf()
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,54 @@
|
||||||
|
<!-- 系统缓存 -->
|
||||||
|
<template>
|
||||||
|
<div class="cache">
|
||||||
|
<el-card shadow="never">
|
||||||
|
<el-alert
|
||||||
|
class="xxl"
|
||||||
|
title="温馨提示:管理系统运行过程中产生的缓存"
|
||||||
|
type="primary"
|
||||||
|
:closable="false"
|
||||||
|
show-icon
|
||||||
|
>
|
||||||
|
</el-alert>
|
||||||
|
</el-card>
|
||||||
|
|
||||||
|
<el-card class="m-t-15" shadow="never">
|
||||||
|
<div>
|
||||||
|
<el-table class="m-t-20" :data="cacheDate">
|
||||||
|
<el-table-column label="管理内容" prop="content"></el-table-column>
|
||||||
|
<el-table-column label="内容说明" prop="desc"> </el-table-column>
|
||||||
|
<el-table-column label="操作" width="150" fixed="right">
|
||||||
|
<template #default="scope">
|
||||||
|
<popup class="m-r-10 inline" @confirm="handleClean" content="确定要清除系统缓存?">
|
||||||
|
<template #trigger>
|
||||||
|
<el-button type="text">清除系统缓存</el-button>
|
||||||
|
</template>
|
||||||
|
</popup>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
</el-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import {
|
||||||
|
apiSystemCacheClear
|
||||||
|
} from '@/api/setting'
|
||||||
|
import { ref } from 'vue'
|
||||||
|
import Popup from '@/components/Popup/index.vue'
|
||||||
|
|
||||||
|
// 列表数据
|
||||||
|
let cacheDate = ref<Array<object>>([{
|
||||||
|
content: '系统缓存',
|
||||||
|
desc: '系统运行过程中产生的各类缓存数据',
|
||||||
|
}])
|
||||||
|
|
||||||
|
// 清理缓存
|
||||||
|
const handleClean = async () => {
|
||||||
|
await apiSystemCacheClear()
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped></style>
|
||||||
|
|
@ -0,0 +1,149 @@
|
||||||
|
<!-- 系统日志 -->
|
||||||
|
<template>
|
||||||
|
<div class="journal">
|
||||||
|
<el-card shadow="never">
|
||||||
|
<el-form class="ls-form" :model="formData" label-width="80px" size="small" inline>
|
||||||
|
<el-form-item label="管理员">
|
||||||
|
<el-input
|
||||||
|
placeholder="请输入"
|
||||||
|
class="ls-input"
|
||||||
|
v-model="formData.admin_name"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item label="访问方式">
|
||||||
|
<el-select v-model="formData.type" placeholder="请选择">
|
||||||
|
<el-option
|
||||||
|
v-for="(item, index) in visitType"
|
||||||
|
:key="index"
|
||||||
|
:label="item.label"
|
||||||
|
:value="item.value"
|
||||||
|
></el-option>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item label="来源IP">
|
||||||
|
<el-input
|
||||||
|
placeholder="请输入"
|
||||||
|
class="ls-input"
|
||||||
|
v-model="formData.ip"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item label="访问时间">
|
||||||
|
<data-picker
|
||||||
|
v-model:start_time="formData.start_time"
|
||||||
|
v-model:end_time="formData.end_time"
|
||||||
|
></data-picker>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item label="访问链接">
|
||||||
|
<el-input
|
||||||
|
placeholder="请输入"
|
||||||
|
class="ls-input"
|
||||||
|
v-model="formData.url"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item>
|
||||||
|
<div class="m-l-20">
|
||||||
|
<el-button type="primary" @click="resetPage">查询</el-button>
|
||||||
|
<el-button @click="resetParams">重置</el-button>
|
||||||
|
</div>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</el-card>
|
||||||
|
|
||||||
|
<el-card class="m-t-15" shadow="never" v-loading="pager.loading">
|
||||||
|
<div>
|
||||||
|
<el-table class="m-t-20" :data="pager.lists">
|
||||||
|
<el-table-column label="记录ID" prop="id"></el-table-column>
|
||||||
|
<el-table-column label="操作" prop="action"></el-table-column>
|
||||||
|
<el-table-column label="管理员" prop="admin_name"></el-table-column>
|
||||||
|
<el-table-column label="管理员ID" prop="admin_id"> </el-table-column>
|
||||||
|
<el-table-column label="访问链接" prop="url"></el-table-column>
|
||||||
|
<el-table-column label="访问方式" prop="type"></el-table-column>
|
||||||
|
<el-table-column label="访问参数" prop="params"> </el-table-column>
|
||||||
|
<el-table-column label="来源IP" prop="ip"> </el-table-column>
|
||||||
|
<el-table-column label="日志时间" prop="create_time"> </el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
<div class="flex row-right">
|
||||||
|
<pagination
|
||||||
|
v-model="pager"
|
||||||
|
@change="requestApi"
|
||||||
|
layout="total, prev, pager, next, jumper"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</el-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import {
|
||||||
|
apiSystemLogLists
|
||||||
|
} from '@/api/setting'
|
||||||
|
import { onMounted, reactive, ref } from 'vue'
|
||||||
|
import Pagination from '@/components/pagination/index.vue'
|
||||||
|
import Popup from '@/components/Popup/index.vue'
|
||||||
|
import { usePages } from '@/core/hooks/pages'
|
||||||
|
import DataPicker from '@/components/data-picker/index.vue'
|
||||||
|
|
||||||
|
interface formDataObj {
|
||||||
|
admin_name?: string // 管理员
|
||||||
|
url?: string // 访问链接
|
||||||
|
ip?: string // ip
|
||||||
|
type?: string // 访问方式
|
||||||
|
start_time?: string // 日志时间开始
|
||||||
|
end_time?: string // 日志时间结束
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询表单
|
||||||
|
let formData = ref<formDataObj>({
|
||||||
|
admin_name: '',
|
||||||
|
url: '',
|
||||||
|
ip: '',
|
||||||
|
type: '',
|
||||||
|
start_time: '',
|
||||||
|
end_time: '',
|
||||||
|
})
|
||||||
|
|
||||||
|
// 访问方式
|
||||||
|
const visitType = ref<Array<any>>([
|
||||||
|
{
|
||||||
|
label: '全部',
|
||||||
|
value: '',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'get',
|
||||||
|
value: 'get',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'post',
|
||||||
|
value: 'post',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'put',
|
||||||
|
value: 'put',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'delete',
|
||||||
|
value: 'delete',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'option',
|
||||||
|
value: 'option',
|
||||||
|
},
|
||||||
|
])
|
||||||
|
|
||||||
|
const { pager, requestApi, resetParams, resetPage } = usePages({
|
||||||
|
callback: apiSystemLogLists,
|
||||||
|
params: formData.value,
|
||||||
|
})
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
requestApi()
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped></style>
|
||||||
Loading…
Reference in New Issue