diff --git a/internal/data/website.go b/internal/data/website.go
index 8a84f383..b367f248 100644
--- a/internal/data/website.go
+++ b/internal/data/website.go
@@ -186,7 +186,13 @@ func (r *websiteRepo) Get(id uint) (*types.WebsiteSetting, error) {
rewrite, _ := io.Read(filepath.Join(app.Root, "server/vhost/rewrite", website.Name+".conf"))
setting.Rewrite = rewrite
// 访问日志
- setting.Log = fmt.Sprintf("%s/wwwlogs/%s.log", app.Root, website.Name)
+ if setting.Log, err = p.GetAccessLog(); err != nil {
+ setting.Log = fmt.Sprintf("%s/wwwlogs/%s.log", app.Root, website.Name)
+ }
+ // 错误日志
+ if setting.ErrorLog, err = p.GetErrorLog(); err != nil {
+ setting.ErrorLog = fmt.Sprintf("%s/wwwlogs/%s.error.log", app.Root, website.Name)
+ }
return setting, err
}
diff --git a/pkg/types/website.go b/pkg/types/website.go
index 0e505e6c..1b242467 100644
--- a/pkg/types/website.go
+++ b/pkg/types/website.go
@@ -32,4 +32,5 @@ type WebsiteSetting struct {
Rewrite string `json:"rewrite"`
Raw string `json:"raw"`
Log string `json:"log"`
+ ErrorLog string `json:"error_log"`
}
diff --git a/web/src/utils/http/index.ts b/web/src/utils/http/index.ts
index bff83cd0..c0c9edcc 100644
--- a/web/src/utils/http/index.ts
+++ b/web/src/utils/http/index.ts
@@ -27,7 +27,6 @@ export const http = createAlova({
const { meta } = method
if (status !== 200) {
const code = json?.code ?? status
- console.log(json)
const message = resolveResError(
code,
(typeof json?.message === 'string' && json.message.trim()) || statusText
diff --git a/web/src/views/cert/CertView.vue b/web/src/views/cert/CertView.vue
index 06768d68..2e4971cc 100644
--- a/web/src/views/cert/CertView.vue
+++ b/web/src/views/cert/CertView.vue
@@ -468,6 +468,7 @@ onUnmounted(() => {
v-model:value="updateModel.cert"
type="textarea"
placeholder="输入 PEM 证书文件的内容"
+ :autosize="{ minRows: 10, maxRows: 15 }"
/>
@@ -475,6 +476,7 @@ onUnmounted(() => {
v-model:value="updateModel.key"
type="textarea"
placeholder="输入 KEY 私钥文件的内容"
+ :autosize="{ minRows: 10, maxRows: 15 }"
/>
diff --git a/web/src/views/cert/UploadCertModal.vue b/web/src/views/cert/UploadCertModal.vue
index 325dc41c..557072b5 100644
--- a/web/src/views/cert/UploadCertModal.vue
+++ b/web/src/views/cert/UploadCertModal.vue
@@ -38,6 +38,7 @@ const handleSubmit = () => {
v-model:value="model.cert"
type="textarea"
placeholder="输入 PEM 证书文件的内容"
+ :autosize="{ minRows: 10, maxRows: 15 }"
/>
@@ -45,6 +46,7 @@ const handleSubmit = () => {
v-model:value="model.key"
type="textarea"
placeholder="输入 KEY 私钥文件的内容"
+ :autosize="{ minRows: 10, maxRows: 15 }"
/>
diff --git a/web/src/views/container/ContainerView.vue b/web/src/views/container/ContainerView.vue
index 73ca93bd..17d39987 100644
--- a/web/src/views/container/ContainerView.vue
+++ b/web/src/views/container/ContainerView.vue
@@ -429,46 +429,42 @@ onMounted(() => {
-
-
-
- 创建容器
- 清理容器
-
- 启动
- 停止
- 重启
- 强制停止
- 暂停
- 恢复
- 删除
-
-
-
-
-
-
-
+
+
+ 创建容器
+ 清理容器
+
+ 启动
+ 停止
+ 重启
+ 强制停止
+ 暂停
+ 恢复
+ 删除
+
+
+
+
{
-
-
-
- 拉取镜像
- 清理镜像
-
-
-
-
-
-
+
+
+ 拉取镜像
+ 清理镜像
+
+
+
-
+
diff --git a/web/src/views/container/NetworkView.vue b/web/src/views/container/NetworkView.vue
index 9867d824..7fbec441 100644
--- a/web/src/views/container/NetworkView.vue
+++ b/web/src/views/container/NetworkView.vue
@@ -182,37 +182,33 @@ onMounted(() => {
-
-
-
- 创建网络
- 清理网络
-
-
-
-
-
-
+
+
+ 创建网络
+ 清理网络
+
+
+
{
-
-
-
- 创建卷
- 清理卷
-
-
-
-
-
-
+
+
+ 创建卷
+ 清理卷
+
+
+
{
-
-
-
-
-
- 创建转发
-
-
-
-
-
- 批量删除
-
-
- 确定要批量删除吗?
-
-
-
+
+
+
+
+ 创建转发
+
+
+
+
+
+ 批量删除
+
+
+ 确定要批量删除吗?
+
+
-
+
diff --git a/web/src/views/firewall/IpRuleView.vue b/web/src/views/firewall/IpRuleView.vue
index b748cb7a..3401177e 100644
--- a/web/src/views/firewall/IpRuleView.vue
+++ b/web/src/views/firewall/IpRuleView.vue
@@ -202,24 +202,22 @@ onMounted(() => {
-
-
-
-
-
- 创建规则
-
-
-
-
-
- 批量删除
-
-
- 确定要批量删除吗?
-
-
-
+
+
+
+
+ 创建规则
+
+
+
+
+
+ 批量删除
+
+
+ 确定要批量删除吗?
+
+
{
-
-
-
-
-
- 创建规则
-
-
-
-
-
- 批量删除
-
-
- 确定要批量删除吗?
-
-
-
+
+
+
+
+ 创建规则
+
+
+
+
+
+ 批量删除
+
+
+ 确定要批量删除吗?
+
+
{
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/web/src/views/monitor/IndexView.vue b/web/src/views/monitor/IndexView.vue
index 5a738caa..c9e12816 100644
--- a/web/src/views/monitor/IndexView.vue
+++ b/web/src/views/monitor/IndexView.vue
@@ -481,22 +481,22 @@ watch(data, () => {
pt-20
>
-
+
-
+
-
+
-
+
diff --git a/web/src/views/setting/SettingHttps.vue b/web/src/views/setting/SettingHttps.vue
index 26785072..0b7aaec8 100644
--- a/web/src/views/setting/SettingHttps.vue
+++ b/web/src/views/setting/SettingHttps.vue
@@ -32,16 +32,24 @@ const handleSave = () => {
- 错误的证书会导致面板无法访问,请谨慎操作!
+ 错误的证书可能导致面板无法访问,请谨慎操作!
-
+
-
+
diff --git a/web/src/views/task/CronView.vue b/web/src/views/task/CronView.vue
index b08a1a70..5a92b555 100644
--- a/web/src/views/task/CronView.vue
+++ b/web/src/views/task/CronView.vue
@@ -222,28 +222,26 @@ onUnmounted(() => {
-
-
-
+
-
+
diff --git a/web/src/views/website/EditView.vue b/web/src/views/website/EditView.vue
index 0c441d62..b0f57508 100644
--- a/web/src/views/website/EditView.vue
+++ b/web/src/views/website/EditView.vue
@@ -40,7 +40,8 @@ const { data: setting, send: fetchSetting } = useRequest(website.config(Number(i
ocsp: false,
rewrite: '',
raw: '',
- log: ''
+ log: '',
+ error_log: ''
}
})
const { data: installedDbAndPhp } = useRequest(dashboard.installedDbAndPhp, {
@@ -77,7 +78,7 @@ const title = computed(() => {
if (setting.value) {
return `编辑网站 - ${setting.value.name}`
}
- return '编辑网站 - 加载中...'
+ return '编辑网站'
})
const certOptions = computed(() => {
return certs.value.map((item: any) => ({
@@ -141,9 +142,11 @@ const handleObtainCert = () => {
const handleSelectCert = (value: number) => {
const cert = certs.value.find((item: any) => item.id === value)
- if (cert) {
+ if (cert && cert.cert !== '' && cert.key !== '') {
setting.value.ssl_certificate = cert.cert
setting.value.ssl_certificate_key = cert.key
+ } else {
+ window.$message.error('选择的证书无效')
}
}
@@ -299,7 +302,7 @@ const onCreateListen = () => {
-
+
@@ -311,7 +314,7 @@ const onCreateListen = () => {
-
+
@@ -322,12 +325,13 @@ const onCreateListen = () => {
-
+
@@ -335,6 +339,7 @@ const onCreateListen = () => {
v-model:value="setting.ssl_certificate_key"
type="textarea"
placeholder="输入 KEY 私钥文件的内容"
+ :autosize="{ minRows: 10, maxRows: 15 }"
/>
@@ -398,6 +403,18 @@ const onCreateListen = () => {
+
+
+
+
+ 全部日志可通过下载文件
+ {{ setting.error_log }}
+ 查看。
+
+
+
+
+
diff --git a/web/src/views/website/IndexView.vue b/web/src/views/website/IndexView.vue
index 72027894..673803db 100644
--- a/web/src/views/website/IndexView.vue
+++ b/web/src/views/website/IndexView.vue
@@ -4,17 +4,7 @@ defineOptions({
})
import Editor from '@guolao/vue-monaco-editor'
-import {
- NButton,
- NCheckbox,
- NDataTable,
- NFlex,
- NInput,
- NPopconfirm,
- NSpace,
- NSwitch,
- NTag
-} from 'naive-ui'
+import { NButton, NCheckbox, NDataTable, NFlex, NInput, NPopconfirm, NSwitch, NTag } from 'naive-ui'
import { useI18n } from 'vue-i18n'
import dashboard from '@/api/panel/dashboard'
@@ -344,23 +334,21 @@ onMounted(() => {
-
-
-
-
- {{ $t('websiteIndex.create.trigger') }}
-
-
-
- 批量删除
-
- 这会删除网站目录但不会删除同名数据库,确定删除选中的网站吗?
-
-
- {{ $t('websiteIndex.edit.trigger') }}
-
-
-
+
+
+
+ {{ $t('websiteIndex.create.trigger') }}
+
+
+
+ 批量删除
+
+ 这会删除网站目录但不会删除同名数据库,确定删除选中的网站吗?
+
+
+ {{ $t('websiteIndex.edit.trigger') }}
+
+