初始化地区合伙人

This commit is contained in:
wangxiaowei
2026-03-10 14:22:40 +08:00
commit 4304624e92
599 changed files with 42117 additions and 0 deletions

View 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>

View 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>

View 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>

View 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>

View 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>