From 1cad44c33dcedff86347d174cf2b3d1d9f0be0ba Mon Sep 17 00:00:00 2001 From: ssongliu Date: Mon, 5 Dec 2022 11:12:07 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=99=BB=E5=BD=95=E7=95=8C=E9=9D=A2?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E4=BF=A1=E6=81=AF=E6=8F=90=E7=A4=BA=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/api/v1/helper/helper.go | 33 +-- backend/app/dto/common_res.go | 6 +- backend/app/service/dashboard.go | 7 +- backend/app/service/logs.go | 2 +- backend/constant/errs.go | 1 + backend/i18n/lang/en.yaml | 2 - backend/i18n/lang/zh.yaml | 2 - frontend/src/api/index.ts | 3 + frontend/src/enums/http-enum.ts | 1 + frontend/src/lang/modules/en.ts | 5 + frontend/src/lang/modules/zh.ts | 5 + frontend/src/styles/common.scss | 10 + frontend/src/views/container/index.vue | 16 +- frontend/src/views/home/app/index.vue | 31 +-- frontend/src/views/home/index.vue | 16 +- frontend/src/views/home/status/index.vue | 243 +++++++++--------- .../src/views/login/components/login-form.vue | 22 ++ 17 files changed, 225 insertions(+), 180 deletions(-) diff --git a/backend/app/api/v1/helper/helper.go b/backend/app/api/v1/helper/helper.go index 822d7fab9..4a035501f 100644 --- a/backend/app/api/v1/helper/helper.go +++ b/backend/app/api/v1/helper/helper.go @@ -2,16 +2,15 @@ package helper import ( "fmt" - "github.com/1Panel-dev/1Panel/backend/buserr" "net/http" "strconv" - "github.com/pkg/errors" - "github.com/1Panel-dev/1Panel/backend/app/dto" + "github.com/1Panel-dev/1Panel/backend/buserr" "github.com/1Panel-dev/1Panel/backend/constant" "github.com/1Panel-dev/1Panel/backend/i18n" "github.com/gin-gonic/gin" + "github.com/pkg/errors" ) func GeneratePaginationFromReq(c *gin.Context) (*dto.PageInfo, bool) { @@ -35,30 +34,32 @@ func GeneratePaginationFromReq(c *gin.Context) (*dto.PageInfo, bool) { func ErrorWithDetail(ctx *gin.Context, code int, msgKey string, err error) { res := dto.Response{ - Code: code, - Msg: "", + Code: code, + Message: "", } if msgKey == constant.ErrTypeInternalServer { switch { case errors.Is(err, constant.ErrRecordExist): - res.Msg = i18n.GetMsgWithMap("ErrRecordExist", map[string]interface{}{"detail": err}) + res.Message = i18n.GetMsgWithMap("ErrRecordExist", map[string]interface{}{"detail": err}) case errors.Is(constant.ErrRecordNotFound, err): - res.Msg = i18n.GetMsgWithMap("ErrRecordNotFound", map[string]interface{}{"detail": err}) + res.Message = i18n.GetMsgWithMap("ErrRecordNotFound", map[string]interface{}{"detail": err}) case errors.Is(constant.ErrStructTransform, err): - res.Msg = i18n.GetMsgWithMap("ErrStructTransform", map[string]interface{}{"detail": err}) + res.Message = i18n.GetMsgWithMap("ErrStructTransform", map[string]interface{}{"detail": err}) case errors.Is(constant.ErrCaptchaCode, err): - res.Msg = i18n.GetMsgWithMap("ErrCaptchaCode", map[string]interface{}{"detail": err}) + res.Code = constant.CodeAuth + res.Message = "ErrCaptchaCode" case errors.Is(constant.ErrAuth, err): - res.Msg = i18n.GetMsgWithMap("ErrAuth", map[string]interface{}{"detail": err}) + res.Code = constant.CodeAuth + res.Message = "ErrAuth" case errors.Is(constant.ErrInitialPassword, err): - res.Msg = i18n.GetMsgWithMap("ErrInitialPassword", map[string]interface{}{"detail": err}) + res.Message = i18n.GetMsgWithMap("ErrInitialPassword", map[string]interface{}{"detail": err}) case errors.As(err, &buserr.BusinessError{}): - res.Msg = err.Error() + res.Message = err.Error() default: - res.Msg = i18n.GetMsgWithMap(msgKey, map[string]interface{}{"detail": err}) + res.Message = i18n.GetMsgWithMap(msgKey, map[string]interface{}{"detail": err}) } } else { - res.Msg = i18n.GetMsgWithMap(msgKey, map[string]interface{}{"detail": err}) + res.Message = i18n.GetMsgWithMap(msgKey, map[string]interface{}{"detail": err}) } ctx.JSON(http.StatusOK, res) ctx.Abort() @@ -78,8 +79,8 @@ func SuccessWithData(ctx *gin.Context, data interface{}) { func SuccessWithMsg(ctx *gin.Context, msg string) { res := dto.Response{ - Code: constant.CodeSuccess, - Msg: msg, + Code: constant.CodeSuccess, + Message: msg, } ctx.JSON(http.StatusOK, res) ctx.Abort() diff --git a/backend/app/dto/common_res.go b/backend/app/dto/common_res.go index 0e707df09..5c7c11193 100644 --- a/backend/app/dto/common_res.go +++ b/backend/app/dto/common_res.go @@ -6,9 +6,9 @@ type PageResult struct { } type Response struct { - Code int `json:"code"` - Msg string `json:"msg"` - Data interface{} `json:"data"` + Code int `json:"code"` + Message string `json:"message"` + Data interface{} `json:"data"` } type Options struct { diff --git a/backend/app/service/dashboard.go b/backend/app/service/dashboard.go index 562554550..e3460ce33 100644 --- a/backend/app/service/dashboard.go +++ b/backend/app/service/dashboard.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "os/exec" + "strings" "time" "github.com/1Panel-dev/1Panel/backend/app/dto" @@ -43,10 +44,10 @@ func (u *DashboardService) LoadBaseInfo(ioOption string, netOption string) (*dto cmd := exec.Command("uptime", "-s") stdout, err := cmd.CombinedOutput() - if err != nil { + if err == nil { baseInfo.Uptime = string(stdout) - uptime, err := time.Parse("2006-01-02 15:04:05", string(stdout)) - if err != nil { + uptime, err := time.Parse("2006-01-02 15:04:05", strings.ReplaceAll(string(stdout), "\n", "")) + if err == nil { hours := int(time.Since(uptime).Hours()) minutes := int(time.Since(uptime).Minutes()) baseInfo.TimeSinceUptime = fmt.Sprintf("%ddays %dhours %dmimutes", hours/24, hours%24, minutes-hours*60) diff --git a/backend/app/service/logs.go b/backend/app/service/logs.go index 56fff6582..85e8be64e 100644 --- a/backend/app/service/logs.go +++ b/backend/app/service/logs.go @@ -65,7 +65,7 @@ func (u *LogService) PageOperationLog(search dto.PageInfo) (int64, interface{}, } item.Status = res.Code if item.Status != 200 { - item.ErrorMessage = res.Msg + item.ErrorMessage = res.Message } dtoOps = append(dtoOps, item) } diff --git a/backend/constant/errs.go b/backend/constant/errs.go index bd2dea298..7259dd979 100644 --- a/backend/constant/errs.go +++ b/backend/constant/errs.go @@ -12,6 +12,7 @@ const ( CodeErrForbidden = 403 CodeErrNotFound = 404 CodePasswordExpired = 405 + CodeAuth = 406 CodeErrInternalServer = 500 CodeErrHeader = 406 ) diff --git a/backend/i18n/lang/en.yaml b/backend/i18n/lang/en.yaml index 3f8ae2429..a88ad690f 100644 --- a/backend/i18n/lang/en.yaml +++ b/backend/i18n/lang/en.yaml @@ -2,8 +2,6 @@ ErrInvalidParams: "Request parameter error: {{ .detail }}" ErrToken: "Token information is incorrect.: {{ .detail }}" ErrTokenParse: "Token generation error: {{ .detail }}" ErrTokenTimeOut: "Login information is out of date: {{ .detail }}" -ErrAuth: "Login information is incorrect." -ErrCaptchaCode: "The verification code information is incorrect" ErrInitialPassword: "Initial password error" ErrInternalServer: "Service internal error: {{ .detail }}" ErrRecordExist: "Record already exists: {{ .detail }}" diff --git a/backend/i18n/lang/zh.yaml b/backend/i18n/lang/zh.yaml index faf06934c..4e9b36fc7 100644 --- a/backend/i18n/lang/zh.yaml +++ b/backend/i18n/lang/zh.yaml @@ -2,8 +2,6 @@ ErrInvalidParams: "请求参数错误: {{ .detail }}" ErrToken: "Token 信息错误: {{ .detail }}" ErrTokenParse: "Token 生成错误: {{ .detail }}" ErrTokenTimeOut: "登陆信息已过期: {{ .detail }}" -ErrAuth: "登录信息错误" -ErrCaptchaCode: "错误的验证码信息" ErrInitialPassword: "原密码错误" ErrInternalServer: "服务内部错误: {{ .detail }}" ErrRecordExist: "记录已存在: {{ .detail }}" diff --git a/frontend/src/api/index.ts b/frontend/src/api/index.ts index 3bfc1637d..6b866deff 100644 --- a/frontend/src/api/index.ts +++ b/frontend/src/api/index.ts @@ -59,6 +59,9 @@ class RequestHttp { router.push({ name: 'Expired' }); return data; } + if (data.code == ResultEnum.ERRAUTH) { + return data; + } if (data.code && data.code !== ResultEnum.SUCCESS) { ElMessage.error(data.msg); return Promise.reject(data); diff --git a/frontend/src/enums/http-enum.ts b/frontend/src/enums/http-enum.ts index bb4f33407..159778185 100644 --- a/frontend/src/enums/http-enum.ts +++ b/frontend/src/enums/http-enum.ts @@ -5,6 +5,7 @@ export enum ResultEnum { UNSAFETY = 402, FORBIDDEN = 403, EXPIRED = 405, + ERRAUTH = 406, TIMEOUT = 100000, TYPE = 'success', } diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index cd52d61dc..0ed990759 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -80,7 +80,9 @@ export default { password: 'Password', rePassword: 'Confirm Password', welcome: 'Welcome back, please enter your username and password to log in!', + errorAuthInfo: 'The user name or password you entered is incorrect, please re-enter!', captchaHelper: 'Please enter the verification code', + errorCaptcha: 'Incorrect verification code information!', safeEntrance: 'Please use the correct entry to log in to the panel', reason: 'Cause of error:', reasonHelper: @@ -165,6 +167,9 @@ export default { time: 'Times', uptime: 'Up Time', runningTime: 'Running Time', + Day: 'Days', + Hour: 'Hours', + Minute: 'Minutes', runSmoothly: 'Run smoothly', runNormal: 'Run normal', diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index 050c955a0..8616b70bb 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -82,7 +82,9 @@ export default { password: '密码', rePassword: '确认密码', welcome: '欢迎回来,请输入用户名和密码登录!', + errorAuthInfo: '您输入的用户名或密码不正确,请重新输入!', captchaHelper: '请输入验证码', + errorCaptcha: '错误的验证码信息!', safeEntrance: '请使用正确的入口登录面板', reason: '错误原因:', reasonHelper: @@ -171,6 +173,9 @@ export default { time: '次', uptime: '启动时间', runningTime: '运行时间', + Day: '天', + Hour: '小时', + Minute: '分钟', runSmoothly: '运行流畅', runNormal: '运行正常', diff --git a/frontend/src/styles/common.scss b/frontend/src/styles/common.scss index 233a1b24a..1d42c9092 100644 --- a/frontend/src/styles/common.scss +++ b/frontend/src/styles/common.scss @@ -125,6 +125,16 @@ display: inline-block; } +.input-error { + font-size: 12px; + word-break: break-all; + color: red; + transform: scale(0.9); + transform-origin: left; + width: 110%; + display: inline-block; + } + .myTable { border-collapse: collapse; font-size: 12px; diff --git a/frontend/src/views/container/index.vue b/frontend/src/views/container/index.vue index 39410a977..cc4b39dd4 100644 --- a/frontend/src/views/container/index.vue +++ b/frontend/src/views/container/index.vue @@ -5,6 +5,14 @@ {{ $t('container.container') }} + + {{ $t('container.compose') }} + {{ $t('container.image') }} @@ -22,14 +30,6 @@ {{ $t('container.repo') }} - - {{ $t('container.compose') }} - -
- +
+ @@ -26,8 +26,8 @@
-
- +
+ @@ -46,8 +46,8 @@ -
- +
+ @@ -64,8 +64,8 @@
-
- +
+ @@ -84,8 +84,8 @@ -
- +
+ @@ -102,8 +102,8 @@
-
- +
+ @@ -148,11 +148,8 @@ const acceptParams = (base: Dashboard.BaseInfo): void => { baseInfo.value.kubepiID = base.kubepiID; }; -const goInstall = (id: number) => { - let params: { [key: string]: any } = { - id: id, - }; - router.push({ name: 'AppDetail', params }); +const goInstall = () => { + router.push({ name: 'App' }); }; defineExpose({ diff --git a/frontend/src/views/home/index.vue b/frontend/src/views/home/index.vue index 55ff04111..2ba7a3df3 100644 --- a/frontend/src/views/home/index.vue +++ b/frontend/src/views/home/index.vue @@ -75,7 +75,14 @@ - + + + + @@ -309,6 +316,11 @@ const onLoadBaseInfo = async (isInit: boolean, range: string) => { const res = await loadBaseInfo(searchInfo.ioOption, searchInfo.netOption); baseInfo.value = res.data; currentInfo.value = baseInfo.value.currentInfo; + if (baseInfo.value.timeSinceUptime) { + baseInfo.value.timeSinceUptime.replaceAll('days', i18n.global.t('home.Day')); + baseInfo.value.timeSinceUptime.replaceAll('hours', i18n.global.t('home.Hour')); + baseInfo.value.timeSinceUptime.replaceAll('minutes', i18n.global.t('home.Minute')); + } onLoadCurrentInfo(); statuRef.value.acceptParams(currentInfo.value, baseInfo.value); appRef.value.acceptParams(baseInfo.value); @@ -393,7 +405,7 @@ const loadData = async () => { [i18n.global.t('monitor.read'), i18n.global.t('monitor.write')], timeIODatas.value, [ioReadYDatas, ioWriteYDatas], - '流量', + i18n.global.t('monitor.network'), 'MB', ); } else { diff --git a/frontend/src/views/home/status/index.vue b/frontend/src/views/home/status/index.vue index d9b2c5fc7..90ae614fd 100644 --- a/frontend/src/views/home/status/index.vue +++ b/frontend/src/views/home/status/index.vue @@ -1,134 +1,123 @@ @@ -149,6 +138,8 @@ const baseInfo = ref({ databaseNumber: 0, cronjobNumber: 0, appInstalldNumber: 0, + uptime: '', + timeSinceUptime: '', hostname: '', os: '', diff --git a/frontend/src/views/login/components/login-form.vue b/frontend/src/views/login/components/login-form.vue index 1fe6e4b8a..e3c4d85c2 100644 --- a/frontend/src/views/login/components/login-form.vue +++ b/frontend/src/views/login/components/login-form.vue @@ -123,6 +123,9 @@ + + {{ $t('commons.login.errorAuthInfo') }} + + + {{ $t('commons.login.errorCaptcha') }} + ; @@ -241,6 +250,19 @@ const login = (formEl: FormInstance | undefined) => { authMethod: '', }; const res = await loginApi(requestLoginForm); + if (res.code === 406) { + if (res.message === 'ErrCaptchaCode') { + errCaptcha.value = true; + errAuthInfo.value = false; + loginVerify(); + } + if (res.message === 'ErrAuth') { + errCaptcha.value = false; + errAuthInfo.value = true; + loginVerify(); + } + return; + } if (res.data.mfaStatus === 'enable') { mfaShow.value = true; mfaLoginForm.secret = res.data.mfaSecret;