初始化地区合伙人
This commit is contained in:
45
src/views/setting/system/cache.vue
Normal file
45
src/views/setting/system/cache.vue
Normal file
@ -0,0 +1,45 @@
|
||||
<!-- 系统缓存 -->
|
||||
<template>
|
||||
<div class="cache">
|
||||
<el-card class="!border-none" shadow="never">
|
||||
<el-alert
|
||||
type="warning"
|
||||
title="温馨提示:管理系统运行过程中产生的缓存"
|
||||
:closable="false"
|
||||
show-icon
|
||||
></el-alert>
|
||||
</el-card>
|
||||
|
||||
<el-card class="!border-none mt-4" shadow="never">
|
||||
<el-table :data="cacheDate" size="large">
|
||||
<el-table-column label="管理内容" prop="content" min-width="130"></el-table-column>
|
||||
<el-table-column label="内容说明" prop="desc" min-width="180"></el-table-column>
|
||||
<el-table-column label="操作" width="130" fixed="right">
|
||||
<template #default>
|
||||
<el-button type="primary" link @click="handleClean">清除系统缓存</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="cache">
|
||||
import { systemCacheClear } from '@/api/setting/system'
|
||||
import feedback from '@/utils/feedback'
|
||||
|
||||
// 列表数据
|
||||
const cacheDate = ref<Array<object>>([
|
||||
{
|
||||
content: '系统缓存',
|
||||
desc: '系统运行过程中产生的各类缓存数据'
|
||||
}
|
||||
])
|
||||
|
||||
// 清理缓存
|
||||
const handleClean = async () => {
|
||||
await feedback.confirm('确认清除系统缓存?')
|
||||
await systemCacheClear()
|
||||
window.location.reload()
|
||||
}
|
||||
</script>
|
||||
80
src/views/setting/system/environment.vue
Normal file
80
src/views/setting/system/environment.vue
Normal file
@ -0,0 +1,80 @@
|
||||
<!-- 系统环境 -->
|
||||
<template>
|
||||
<div class="system-environment">
|
||||
<el-card class="!border-none" shadow="never">
|
||||
<div>服务器信息</div>
|
||||
<div class="mt-4">
|
||||
<el-table :data="info.server">
|
||||
<el-table-column prop="param" label="参数"></el-table-column>
|
||||
<el-table-column prop="value" label="值"></el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
</el-card>
|
||||
|
||||
<el-card shadow="never" class="!border-none mt-4">
|
||||
<div>PHP环境要求</div>
|
||||
<div class="mt-4">
|
||||
<el-table :data="info.env">
|
||||
<el-table-column prop="option" label="选项"></el-table-column>
|
||||
<el-table-column prop="require" label="要求"></el-table-column>
|
||||
<el-table-column label="状态">
|
||||
<template #default="scope">
|
||||
<icon
|
||||
v-if="scope.row.status"
|
||||
name="el-icon-Select"
|
||||
class="text-success"
|
||||
/>
|
||||
<icon v-else name="el-icon-CloseBold" class="text-danger" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="remark" label="说明及帮助"></el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
</el-card>
|
||||
|
||||
<el-card shadow="never" class="!border-none mt-4">
|
||||
<div>目录权限</div>
|
||||
<div class="mt-4">
|
||||
<el-table :data="info.auth">
|
||||
<el-table-column prop="dir" label="选项"></el-table-column>
|
||||
<el-table-column prop="require" label="要求"></el-table-column>
|
||||
<el-table-column label="状态">
|
||||
<template #default="scope">
|
||||
<icon
|
||||
v-if="scope.row.status"
|
||||
name="el-icon-Select"
|
||||
class="text-success"
|
||||
/>
|
||||
<icon v-else name="el-icon-CloseBold" class="text-danger" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="remark" label="说明及帮助"></el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup name="environment">
|
||||
import { systemInfo } from '@/api/setting/system'
|
||||
|
||||
const info = reactive({
|
||||
server: [], // 服务器信息
|
||||
env: [], // PHP环境要求
|
||||
auth: [] // 目录权限
|
||||
})
|
||||
|
||||
const getSystemInfo = () => {
|
||||
systemInfo().then((res) => {
|
||||
info.server = res.server
|
||||
info.env = res.env
|
||||
info.auth = res.auth
|
||||
})
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
getSystemInfo()
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped></style>
|
||||
146
src/views/setting/system/journal.vue
Normal file
146
src/views/setting/system/journal.vue
Normal file
@ -0,0 +1,146 @@
|
||||
<!-- 系统日志 -->
|
||||
<template>
|
||||
<div class="journal">
|
||||
<el-card class="!border-none" shadow="never">
|
||||
<el-form class="ls-form" :model="formData" inline>
|
||||
<el-form-item class="w-[280px]" label="管理员">
|
||||
<el-input
|
||||
placeholder="请输入"
|
||||
v-model="formData.admin_name"
|
||||
clearable
|
||||
@keyup.enter="resetPage"
|
||||
/>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item class="w-[280px]" 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-select>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item class="w-[280px]" label="来源IP">
|
||||
<el-input
|
||||
placeholder="请输入"
|
||||
v-model="formData.ip"
|
||||
clearable
|
||||
@keyup.enter="resetPage"
|
||||
/>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="访问时间">
|
||||
<daterange-picker
|
||||
v-model:startTime="formData.start_time"
|
||||
v-model:endTime="formData.end_time"
|
||||
/>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item class="w-[280px]" label="访问链接">
|
||||
<el-input
|
||||
placeholder="请输入"
|
||||
v-model="formData.url"
|
||||
clearable
|
||||
@keyup.enter="resetPage"
|
||||
/>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="resetPage">查询</el-button>
|
||||
<el-button @click="resetParams">重置</el-button>
|
||||
<export-data
|
||||
class="ml-2.5"
|
||||
:fetch-fun="systemLogLists"
|
||||
:params="formData"
|
||||
:page-size="pager.size"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
|
||||
<el-card class="!border-none mt-4" shadow="never" v-loading="pager.loading">
|
||||
<div>
|
||||
<el-table :data="pager.lists" size="large">
|
||||
<el-table-column label="记录ID" prop="id" />
|
||||
<el-table-column label="操作" prop="action" min-width="120" />
|
||||
<el-table-column label="管理员" prop="admin_name" min-width="120" />
|
||||
<el-table-column label="管理员ID" prop="admin_id" min-width="120" />
|
||||
<el-table-column label="访问链接" prop="url" min-width="160" />
|
||||
<el-table-column label="访问方式" prop="type" />
|
||||
<el-table-column label="访问参数" prop="params" min-width="160" />
|
||||
<el-table-column label="来源IP" prop="ip" min-width="160" />
|
||||
<el-table-column label="日志时间" prop="create_time" min-width="180" />
|
||||
</el-table>
|
||||
</div>
|
||||
<div class="flex mt-4 justify-end">
|
||||
<pagination v-model="pager" @change="getLists" />
|
||||
</div>
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="journal">
|
||||
import { systemLogLists } from '@/api/setting/system'
|
||||
import { usePaging } from '@/hooks/usePaging'
|
||||
|
||||
interface formDataObj {
|
||||
admin_name?: string // 管理员
|
||||
url?: string // 访问链接
|
||||
ip?: string // ip
|
||||
type?: string // 访问方式
|
||||
start_time?: string // 日志时间开始
|
||||
end_time?: string // 日志时间结束
|
||||
}
|
||||
|
||||
// 查询表单
|
||||
const 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, getLists, resetParams, resetPage } = usePaging({
|
||||
fetchFun: systemLogLists,
|
||||
params: formData.value
|
||||
})
|
||||
|
||||
onMounted(() => {
|
||||
getLists()
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped></style>
|
||||
148
src/views/setting/system/scheduled_task/edit.vue
Normal file
148
src/views/setting/system/scheduled_task/edit.vue
Normal file
@ -0,0 +1,148 @@
|
||||
<template>
|
||||
<div class="article-edit">
|
||||
<el-card class="!border-none" shadow="never">
|
||||
<el-page-header :content="$route.meta.title" @back="$router.back()" />
|
||||
</el-card>
|
||||
<el-card class="mt-4 !border-none" shadow="never">
|
||||
<el-form
|
||||
ref="formRef"
|
||||
class="ls-form"
|
||||
:model="formData"
|
||||
label-width="85px"
|
||||
:rules="rules"
|
||||
>
|
||||
<el-form-item label="名称" prop="name">
|
||||
<div class="w-80">
|
||||
<el-input
|
||||
v-model="formData.name"
|
||||
placeholder="请输入名称"
|
||||
maxlength="30"
|
||||
clearable
|
||||
/>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="类型" prop="type">
|
||||
<el-radio-group v-model="formData.type">
|
||||
<el-radio :value="1">定时任务</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="命令" prop="command">
|
||||
<div class="w-80">
|
||||
<el-input
|
||||
v-model="formData.command"
|
||||
placeholder="请输入thinkphp命令,如vresion"
|
||||
clearable
|
||||
/>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="参数" prop="params">
|
||||
<div class="w-80">
|
||||
<el-input
|
||||
v-model="formData.params"
|
||||
placeholder="请输入参数,例:--id 8 --name 测试"
|
||||
clearable
|
||||
/>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="状态">
|
||||
<el-switch v-model="formData.status" :active-value="1" :inactive-value="2" />
|
||||
</el-form-item>
|
||||
<el-form-item label="规则" prop="expression">
|
||||
<div class="w-80">
|
||||
<el-input
|
||||
@blur="getExpression"
|
||||
v-model="formData.expression"
|
||||
placeholder="请输入crontab规则,例:5 9 * * *"
|
||||
/>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-table :data="expressionLists" style="max-width: 320px">
|
||||
<el-table-column prop="time" label="序号" min-width="80" />
|
||||
<el-table-column prop="date" label="执行时间" min-width="240" />
|
||||
</el-table>
|
||||
</el-form-item>
|
||||
<el-form-item label="备注" prop="remark">
|
||||
<div class="w-80">
|
||||
<el-input
|
||||
v-model="formData.remark"
|
||||
type="textarea"
|
||||
:autosize="{ minRows: 3, maxRows: 6 }"
|
||||
:maxlength="200"
|
||||
show-word-limit
|
||||
clearable
|
||||
/>
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
<footer-btns>
|
||||
<el-button type="primary" @click="handleSave">保存</el-button>
|
||||
</footer-btns>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup name="scheduledTaskEdit">
|
||||
import type { FormInstance } from 'element-plus'
|
||||
|
||||
import { crontabAdd, crontabDetail, crontabEdit, crontabExpression } from '@/api/setting/system'
|
||||
import useMultipleTabs from '@/hooks/useMultipleTabs'
|
||||
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
const formData = reactive({
|
||||
id: '',
|
||||
name: '',
|
||||
command: '',
|
||||
expression: '',
|
||||
params: '',
|
||||
remark: '',
|
||||
status: 1,
|
||||
type: 1
|
||||
})
|
||||
|
||||
const { removeTab } = useMultipleTabs()
|
||||
const formRef = shallowRef<FormInstance>()
|
||||
const rules = reactive({
|
||||
name: [{ required: true, message: '请输入名称' }],
|
||||
command: [{ required: true, message: '请输入thankphp命令,如vresion' }],
|
||||
expression: [{ required: true, message: '请输入crontab规则,例:5 9 * * *' }]
|
||||
})
|
||||
|
||||
const getDetails = async () => {
|
||||
const data = await crontabDetail({
|
||||
id: route.query.id
|
||||
})
|
||||
Object.keys(formData).forEach((key) => {
|
||||
//@ts-ignore
|
||||
formData[key] = data[key]
|
||||
})
|
||||
}
|
||||
|
||||
const expressionLists = ref([])
|
||||
const getExpression = async () => {
|
||||
await formRef.value?.validateField(['expression'])
|
||||
const res = await crontabExpression({
|
||||
expression: formData.expression
|
||||
})
|
||||
expressionLists.value = res
|
||||
}
|
||||
|
||||
const handleSave = async () => {
|
||||
await formRef.value?.validate()
|
||||
if (route.query.id) {
|
||||
await crontabEdit(formData)
|
||||
} else {
|
||||
await crontabAdd(formData)
|
||||
}
|
||||
removeTab()
|
||||
router.back()
|
||||
}
|
||||
onMounted(async () => {
|
||||
if (!route.query.id) {
|
||||
return
|
||||
}
|
||||
await getDetails()
|
||||
await getExpression()
|
||||
})
|
||||
</script>
|
||||
96
src/views/setting/system/scheduled_task/index.vue
Normal file
96
src/views/setting/system/scheduled_task/index.vue
Normal file
@ -0,0 +1,96 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-card shadow="never" class="!border-none">
|
||||
<router-link
|
||||
v-perms="['crontab.crontab/add', 'crontab.crontab/add:edit']"
|
||||
:to="getRoutePath('crontab.crontab/add:edit')"
|
||||
>
|
||||
<el-button type="primary" class="mb-[16px]">
|
||||
<template #icon>
|
||||
<icon name="el-icon-Plus" />
|
||||
</template>
|
||||
新增
|
||||
</el-button>
|
||||
</router-link>
|
||||
|
||||
<el-table
|
||||
ref="paneTable"
|
||||
class="m-t-24"
|
||||
:data="pager.lists"
|
||||
v-loading="pager.loading"
|
||||
style="width: 100%"
|
||||
>
|
||||
<el-table-column prop="name" label="名称" min-width="120" />
|
||||
<el-table-column prop="type_desc" label="类型" min-width="100" />
|
||||
<el-table-column prop="command" label="命令" min-width="100" />
|
||||
<el-table-column prop="params" label="参数" min-width="80" />
|
||||
<el-table-column prop="expression" label="规则" min-width="100" />
|
||||
<el-table-column prop="status" label="状态" min-width="100">
|
||||
<template #default="{ row }">
|
||||
<el-tag v-if="row.status == 1" type="success">运行中</el-tag>
|
||||
<el-tag v-if="row.status == 2" type="info">已停止</el-tag>
|
||||
<el-tag v-if="row.status == 3" type="danger">错误</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="error" label="错误原因" min-width="120" />
|
||||
<el-table-column prop="last_time" label="最后执行时间" width="180" />
|
||||
<el-table-column prop="time" label="时长" min-width="100" />
|
||||
<el-table-column prop="max_time" label="最大时长" min-width="100" />
|
||||
|
||||
<el-table-column label="操作" width="120" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<div class="flex">
|
||||
<el-button type="primary" link>
|
||||
<router-link
|
||||
v-perms="['crontab.crontab/edit', 'crontab.crontab/add:edit']"
|
||||
:to="{
|
||||
path: getRoutePath('crontab.crontab/add:edit'),
|
||||
query: {
|
||||
id: row.id
|
||||
}
|
||||
}"
|
||||
>
|
||||
<el-button type="primary" link> 编辑 </el-button>
|
||||
</router-link>
|
||||
</el-button>
|
||||
<el-button
|
||||
v-perms="['crontab.crontab/delete']"
|
||||
type="danger"
|
||||
link
|
||||
@click="handleDelete(row.id)"
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<div class="flex justify-end mt-4">
|
||||
<pagination v-model="pager" @change="getLists" />
|
||||
</div>
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup name="scheduledTask">
|
||||
import { crontabDel, crontabLists } from '@/api/setting/system'
|
||||
import { usePaging } from '@/hooks/usePaging'
|
||||
import { getRoutePath } from '@/router'
|
||||
import feedback from '@/utils/feedback'
|
||||
|
||||
const { pager, getLists } = usePaging({
|
||||
fetchFun: crontabLists,
|
||||
params: {}
|
||||
})
|
||||
|
||||
const handleDelete = async (id: number) => {
|
||||
await feedback.confirm('确定要删除?')
|
||||
await crontabDel({ id })
|
||||
getLists()
|
||||
}
|
||||
|
||||
getLists()
|
||||
</script>
|
||||
|
||||
<style lang="scss"></style>
|
||||
Reference in New Issue
Block a user