fix: align admin behavior and Kratos integrations
This commit is contained in:
@@ -241,20 +241,11 @@
|
||||
来获取对应的参数。
|
||||
</p>
|
||||
<p class="text-sm text-gray-600">
|
||||
后端需要提前
|
||||
后端通过
|
||||
<code class="bg-blue-100 px-1 py-0.5 rounded"
|
||||
>import
|
||||
"github.com/kra/kra/server/service/system"</code
|
||||
>SettingsUsecase.ParameterByKey(ctx, key)</code
|
||||
>
|
||||
</p>
|
||||
<p class="mb-2 text-sm text-gray-600">
|
||||
然后调用
|
||||
<code class="bg-blue-100 px-1 py-0.5 rounded"
|
||||
>new(system.SysParamsService).GetSysParam("{{
|
||||
formData.key
|
||||
}}")</code
|
||||
>
|
||||
来获取对应的 value 值。
|
||||
获取对应参数值,业务代码应通过 biz 层接口调用。
|
||||
</p>
|
||||
</div>
|
||||
</el-drawer>
|
||||
|
||||
@@ -23,6 +23,24 @@
|
||||
<el-form-item label="JWT 签名密钥">
|
||||
<el-input v-model="config.admin.jwt.signingKey" show-password />
|
||||
</el-form-item>
|
||||
<el-form-item label="JWT 有效期">
|
||||
<el-input v-model.trim="config.admin.jwt.expiresTime" placeholder="例如 168h" />
|
||||
</el-form-item>
|
||||
<el-form-item label="JWT 缓冲期">
|
||||
<el-input v-model.trim="config.admin.jwt.bufferTime" placeholder="例如 24h" />
|
||||
</el-form-item>
|
||||
<el-form-item label="验证码长度">
|
||||
<el-input-number v-model="config.admin.captcha.keyLong" :min="1" :max="12" class="!w-full" />
|
||||
</el-form-item>
|
||||
<el-form-item label="验证码宽度">
|
||||
<el-input-number v-model="config.admin.captcha.imgWidth" :min="40" class="!w-full" />
|
||||
</el-form-item>
|
||||
<el-form-item label="验证码高度">
|
||||
<el-input-number v-model="config.admin.captcha.imgHeight" :min="20" class="!w-full" />
|
||||
</el-form-item>
|
||||
<el-form-item label="验证码缓存时间">
|
||||
<el-input v-model.trim="config.admin.captcha.storeExpiration" placeholder="例如 3m" />
|
||||
</el-form-item>
|
||||
<el-form-item label="本地文件目录">
|
||||
<el-input v-model.trim="config.admin.local.storePath" />
|
||||
</el-form-item>
|
||||
@@ -32,6 +50,43 @@
|
||||
<el-form-item label="大文件上传会话有效期(小时)">
|
||||
<el-input-number v-model="config.admin.media.sessionTtl" :min="1" :max="720" class="!w-full" />
|
||||
</el-form-item>
|
||||
<el-form-item label="运行开关" class="md:col-span-2">
|
||||
<div class="flex flex-wrap gap-5">
|
||||
<el-switch v-model="config.admin.system.useRedis" active-text="启用 Redis" />
|
||||
<el-switch v-model="config.admin.system.useMultipoint" active-text="限制多点登录" />
|
||||
<el-switch v-model="config.admin.system.useStrictAuth" active-text="严格角色树" />
|
||||
<el-switch v-model="config.admin.system.disableAutoMigrate" active-text="禁用自动迁移" />
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-tab-pane>
|
||||
|
||||
<el-tab-pane label="数据库" name="database">
|
||||
<el-form label-position="top" class="grid grid-cols-1 md:grid-cols-2 gap-x-5">
|
||||
<el-form-item label="数据库类型">
|
||||
<el-select v-model="config.data.database.driver" class="!w-full">
|
||||
<el-option label="MySQL" value="mysql" /><el-option label="PostgreSQL" value="pgsql" />
|
||||
<el-option label="SQL Server" value="mssql" /><el-option label="SQLite" value="sqlite" />
|
||||
<el-option label="Oracle" value="oracle" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="主机"><el-input v-model.trim="config.data.database.host" /></el-form-item>
|
||||
<el-form-item label="端口"><el-input v-model.trim="config.data.database.port" /></el-form-item>
|
||||
<el-form-item label="用户名"><el-input v-model.trim="config.data.database.user" /></el-form-item>
|
||||
<el-form-item label="密码"><el-input v-model="config.data.database.password" show-password /></el-form-item>
|
||||
<el-form-item label="数据库名"><el-input v-model.trim="config.data.database.name" /></el-form-item>
|
||||
<el-form-item label="SQLite 目录"><el-input v-model.trim="config.data.database.path" /></el-form-item>
|
||||
<el-form-item label="连接参数"><el-input v-model.trim="config.data.database.config" /></el-form-item>
|
||||
<p class="md:col-span-2 text-sm text-gray-500">保存后点击“重载服务”,数据库连接会按新配置重建。</p>
|
||||
</el-form>
|
||||
</el-tab-pane>
|
||||
|
||||
<el-tab-pane label="Redis" name="redis">
|
||||
<el-form label-position="top" class="grid grid-cols-1 md:grid-cols-2 gap-x-5">
|
||||
<el-form-item label="网络"><el-input v-model.trim="config.data.redis.network" placeholder="tcp" /></el-form-item>
|
||||
<el-form-item label="地址"><el-input v-model.trim="config.data.redis.addr" placeholder="127.0.0.1:6379;留空关闭 Redis" /></el-form-item>
|
||||
<el-form-item label="读取超时"><el-input v-model.trim="config.data.redis.read_timeout" placeholder="例如 200ms" /></el-form-item>
|
||||
<el-form-item label="写入超时"><el-input v-model.trim="config.data.redis.write_timeout" placeholder="例如 200ms" /></el-form-item>
|
||||
</el-form>
|
||||
</el-tab-pane>
|
||||
|
||||
@@ -114,13 +169,19 @@
|
||||
const config = ref({
|
||||
admin: {
|
||||
routerPrefix: '',
|
||||
jwt: { signingKey: '******', issuer: 'kra' },
|
||||
jwt: { signingKey: '******', expiresTime: '168h', bufferTime: '24h', issuer: 'kra' },
|
||||
captcha: { keyLong: 6, imgWidth: 240, imgHeight: 80, storeExpiration: '3m' },
|
||||
local: { storePath: 'uploads/file', pathPrefix: 'uploads/file' }, media: { sessionTtl: 24 },
|
||||
system: { useRedis: false, useMultipoint: false, useStrictAuth: false, disableAutoMigrate: false },
|
||||
storage: { type: 'local', qiniu: {}, aliyun_oss: {}, huawei_obs: {}, tencent_cos: {}, aws_s3: {}, cloudflare_r2: {}, minio: {} }
|
||||
},
|
||||
email: {
|
||||
to: '', from: '', host: '', secret: '******', nickname: '', port: 465,
|
||||
'is-ssl': true, 'is-loginauth': false
|
||||
},
|
||||
data: {
|
||||
database: { driver: 'mysql', source: '', host: '127.0.0.1', port: '3306', user: '', password: '******', name: '', config: '', path: '' },
|
||||
redis: { network: 'tcp', addr: '', read_timeout: '200ms', write_timeout: '200ms' }
|
||||
}
|
||||
})
|
||||
const storageTypes = [
|
||||
@@ -138,8 +199,10 @@
|
||||
config.value = {
|
||||
admin: { ...config.value.admin, ...res.data.config.admin,
|
||||
jwt: { ...config.value.admin.jwt, ...res.data.config.admin?.jwt },
|
||||
captcha: { ...config.value.admin.captcha, ...res.data.config.admin?.captcha },
|
||||
local: { ...config.value.admin.local, ...res.data.config.admin?.local }
|
||||
, media: { ...config.value.admin.media, ...res.data.config.admin?.media }
|
||||
, system: { ...config.value.admin.system, ...res.data.config.admin?.system }
|
||||
, storage: { ...config.value.admin.storage, ...res.data.config.admin?.storage,
|
||||
qiniu: { ...config.value.admin.storage.qiniu, ...res.data.config.admin?.storage?.qiniu },
|
||||
aliyun_oss: { ...config.value.admin.storage.aliyun_oss, ...res.data.config.admin?.storage?.aliyun_oss },
|
||||
@@ -150,7 +213,11 @@
|
||||
minio: { ...config.value.admin.storage.minio, ...res.data.config.admin?.storage?.minio }
|
||||
}
|
||||
},
|
||||
email: { ...config.value.email, ...res.data.config.email }
|
||||
email: { ...config.value.email, ...res.data.config.email },
|
||||
data: {
|
||||
database: { ...config.value.data.database, ...res.data.config.data?.database },
|
||||
redis: { ...config.value.data.redis, ...res.data.config.data?.redis }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -299,21 +299,16 @@ const headerText = ref('')
|
||||
const methodOptions = ref([])
|
||||
const formTitle = computed(() => (form.value.ID ? '编辑定时任务' : '新增定时任务'))
|
||||
|
||||
// 注册方法代码模板: 引导二开在 server/initialize/timer.go 的 Timer() 中追加 task.Register
|
||||
const methodRegisterTemplate = `// 位置: server/initialize/timer.go -> Timer()
|
||||
task.Register("MyTask", "任务说明(展示在方法下拉中)", func(ctx context.Context, params json.RawMessage) error {
|
||||
// params 为面板「参数(JSON)」原文, 按需解析; 无参数可忽略
|
||||
// var p struct {
|
||||
// Days int \`json:"days"\`
|
||||
// }
|
||||
// if len(params) > 0 {
|
||||
// if err := json.Unmarshal(params, &p); err != nil {
|
||||
// return err
|
||||
// }
|
||||
// }
|
||||
// TODO: 业务逻辑; 数据库操作请使用 global.KRA_DB.WithContext(ctx)
|
||||
return nil
|
||||
})`
|
||||
// 扩展内置任务时需要同时登记名称并实现执行分支。
|
||||
const methodRegisterTemplate = `// 1. internal/biz/task.go: 在 RegisteredTaskMethods 中登记任务
|
||||
{Name: "MyTask", Description: "任务说明(展示在方法下拉中)"},
|
||||
|
||||
// 2. internal/service/task_execution.go: 在 TaskExecutorMethod 分支中实现
|
||||
case "MyTask":
|
||||
// params := v.Params // 面板「参数(JSON)」原文,可按需解析
|
||||
// 通过 biz usecase 执行业务逻辑,不要在 service 中直接访问数据库
|
||||
err = s.uc.RunMyTask(runCtx, v.Params)
|
||||
log.Output = "任务执行完成"`
|
||||
|
||||
const copyRegisterTemplate = () => {
|
||||
const input = document.createElement('textarea')
|
||||
@@ -322,7 +317,7 @@ const copyRegisterTemplate = () => {
|
||||
input.select()
|
||||
document.execCommand('copy')
|
||||
document.body.removeChild(input)
|
||||
ElMessage.success('已复制, 请粘贴到 server/initialize/timer.go 的 Timer() 中, 重启后生效')
|
||||
ElMessage.success('扩展说明已复制,请按注释修改后端并重启服务')
|
||||
}
|
||||
|
||||
const openForm = async (row) => {
|
||||
|
||||
Reference in New Issue
Block a user