From c377b6b92db89e9015bf146e2ed244306b589445 Mon Sep 17 00:00:00 2001 From: yazzyk Date: Wed, 25 Jun 2025 17:31:43 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E7=A0=81=E9=80=89=E6=8B=A9,=E5=8F=AF=E4=BB=A5=E8=87=AA?= =?UTF-8?q?=E5=B7=B1=E9=80=89=E6=8B=A9=E4=BD=BF=E7=94=A8=E7=AE=97=E6=95=B0?= =?UTF-8?q?=E6=88=96=E5=AD=97=E7=AC=A6=E4=B8=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/pnpm-lock.yaml | 53 ++++++-------------- web/src/views/system/config/LoginSetting.vue | 10 ++++ 2 files changed, 26 insertions(+), 37 deletions(-) diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index f006f24..7e4f195 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -54,8 +54,8 @@ importers: specifier: ^3.0.1 version: 3.0.1 naive-ui: - specifier: ^2.39.0 - version: 2.39.0(vue@3.4.38(typescript@5.5.4)) + specifier: ^2.41.0 + version: 2.42.0(vue@3.4.38(typescript@5.5.4)) pinia: specifier: ^2.2.2 version: 2.2.2(typescript@5.5.4)(vue@3.4.38(typescript@5.5.4)) @@ -488,10 +488,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.25.6': - resolution: {integrity: sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==} - engines: {node: '>=6.9.0'} - '@babel/template@7.25.0': resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} engines: {node: '>=6.9.0'} @@ -2081,14 +2077,10 @@ packages: resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} engines: {node: '>=12'} - date-fns-tz@2.0.1: - resolution: {integrity: sha512-fJCG3Pwx8HUoLhkepdsP7Z5RsucUi+ZBOxyM5d0ZZ6c4SdYustq0VMmOu6Wf7bli+yS/Jwp91TOCqn9jMcVrUA==} + date-fns-tz@3.2.0: + resolution: {integrity: sha512-sg8HqoTEulcbbbVXeg84u5UnlsQa8GS5QXMqjjYIhS4abEVVKIUwe0/l/UhrZdKaL/W5eWZNlbTeEIiOXTcsBQ==} peerDependencies: - date-fns: 2.x - - date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} + date-fns: ^3.0.0 || ^4.0.0 date-fns@3.6.0: resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} @@ -3461,8 +3453,8 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - naive-ui@2.39.0: - resolution: {integrity: sha512-5oUJzRG+rtLSH8eRU+fJvVYiQids2BxF9jp+fwGoAqHOptEINrBlgBu9uy+95RHE5FLJ7Q/z41o+qkoGnUrKxQ==} + naive-ui@2.42.0: + resolution: {integrity: sha512-c7cXR2YgOjgtBadXHwiWL4Y0tpGLAI5W5QzzHksOi22iuHXoSGMAzdkVTGVPE/PM0MSGQ/JtUIzCx2Y0hU0vTQ==} peerDependencies: vue: ^3.0.0 @@ -3891,9 +3883,6 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regexp.prototype.flags@1.5.2: resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} engines: {node: '>= 0.4'} @@ -4561,8 +4550,8 @@ packages: peerDependencies: vue: ^3.0.1 - vueuc@0.4.58: - resolution: {integrity: sha512-Wnj/N8WbPRSxSt+9ji1jtDHPzda5h2OH/0sFBhvdxDRuyCZbjGg3/cKMaKqEoe+dErTexG2R+i6Q8S/Toq1MYg==} + vueuc@0.4.64: + resolution: {integrity: sha512-wlJQj7fIwKK2pOEoOq4Aro8JdPOGpX8aWQhV8YkTW9OgWD2uj2O8ANzvSsIGjx7LTOc7QbS7sXdxHi6XvRnHPA==} peerDependencies: vue: ^3.0.11 @@ -4916,10 +4905,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/runtime@7.25.6': - dependencies: - regenerator-runtime: 0.14.1 - '@babel/template@7.25.0': dependencies: '@babel/code-frame': 7.24.7 @@ -6665,13 +6650,9 @@ snapshots: dargs@8.1.0: {} - date-fns-tz@2.0.1(date-fns@2.30.0): + date-fns-tz@3.2.0(date-fns@3.6.0): dependencies: - date-fns: 2.30.0 - - date-fns@2.30.0: - dependencies: - '@babel/runtime': 7.25.6 + date-fns: 3.6.0 date-fns@3.6.0: {} @@ -8250,7 +8231,7 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - naive-ui@2.39.0(vue@3.4.38(typescript@5.5.4)): + naive-ui@2.42.0(vue@3.4.38(typescript@5.5.4)): dependencies: '@css-render/plugin-bem': 0.15.14(css-render@0.15.14) '@css-render/vue3-ssr': 0.15.14(vue@3.4.38(typescript@5.5.4)) @@ -8260,8 +8241,8 @@ snapshots: async-validator: 4.2.5 css-render: 0.15.14 csstype: 3.1.3 - date-fns: 2.30.0 - date-fns-tz: 2.0.1(date-fns@2.30.0) + date-fns: 3.6.0 + date-fns-tz: 3.2.0(date-fns@3.6.0) evtd: 0.2.4 highlight.js: 11.10.0 lodash: 4.17.21 @@ -8271,7 +8252,7 @@ snapshots: vdirs: 0.1.8(vue@3.4.38(typescript@5.5.4)) vooks: 0.2.12(vue@3.4.38(typescript@5.5.4)) vue: 3.4.38(typescript@5.5.4) - vueuc: 0.4.58(vue@3.4.38(typescript@5.5.4)) + vueuc: 0.4.64(vue@3.4.38(typescript@5.5.4)) nanoid@3.3.7: {} @@ -8668,8 +8649,6 @@ snapshots: dependencies: picomatch: 2.3.1 - regenerator-runtime@0.14.1: {} - regexp.prototype.flags@1.5.2: dependencies: call-bind: 1.0.7 @@ -9413,7 +9392,7 @@ snapshots: sortablejs: 1.14.0 vue: 3.4.38(typescript@5.5.4) - vueuc@0.4.58(vue@3.4.38(typescript@5.5.4)): + vueuc@0.4.64(vue@3.4.38(typescript@5.5.4)): dependencies: '@css-render/vue3-ssr': 0.15.14(vue@3.4.38(typescript@5.5.4)) '@juggle/resize-observer': 3.4.0 diff --git a/web/src/views/system/config/LoginSetting.vue b/web/src/views/system/config/LoginSetting.vue index 89a58b6..998ec64 100644 --- a/web/src/views/system/config/LoginSetting.vue +++ b/web/src/views/system/config/LoginSetting.vue @@ -12,6 +12,15 @@ + + + + 字符 + 算数 + + + + @@ -113,6 +122,7 @@ const formValue = ref({ loginRegisterSwitch: 1, loginCaptchaSwitch: 1, + loginCaptchaType: 1, // 1: 'str' or 2: 'numMath' loginForceInvite: 2, loginAutoOpenId: 2, loginAvatar: '', From 6cb0fcfd93e48a6edd2bf971624e020bd93087d6 Mon Sep 17 00:00:00 2001 From: yazzyk Date: Wed, 25 Jun 2025 17:33:28 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E7=A0=81=E9=80=89=E6=8B=A9=EF=BC=8C=E5=8F=AF=E8=87=AA=E7=94=B1?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E5=AD=97=E7=AC=A6=E6=88=96=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/internal/consts/captcha.go | 6 ++ .../internal/controller/admin/common/site.go | 6 +- server/internal/library/captcha/captcha.go | 71 +++++++++++-------- server/internal/model/config.go | 1 + 4 files changed, 52 insertions(+), 32 deletions(-) create mode 100644 server/internal/consts/captcha.go diff --git a/server/internal/consts/captcha.go b/server/internal/consts/captcha.go new file mode 100644 index 0000000..c5c7a75 --- /dev/null +++ b/server/internal/consts/captcha.go @@ -0,0 +1,6 @@ +package consts + +const ( + CaptchaTypeString = iota + 1 // 字符串 + CaptchaTypeMath // 数字计算 +) diff --git a/server/internal/controller/admin/common/site.go b/server/internal/controller/admin/common/site.go index da3462d..67a09c7 100644 --- a/server/internal/controller/admin/common/site.go +++ b/server/internal/controller/admin/common/site.go @@ -95,7 +95,11 @@ func (c *cSite) LoginConfig(ctx context.Context, _ *common.SiteLoginConfigReq) ( // Captcha 登录验证码 func (c *cSite) Captcha(ctx context.Context, _ *common.LoginCaptchaReq) (res *common.LoginCaptchaRes, err error) { - cid, base64 := captcha.Generate(ctx) + loginConf, err := service.SysConfig().GetLogin(ctx) + if err != nil { + return + } + cid, base64 := captcha.Generate(ctx, loginConf.CaptchaType) res = &common.LoginCaptchaRes{Cid: cid, Base64: base64} return } diff --git a/server/internal/library/captcha/captcha.go b/server/internal/library/captcha/captcha.go index 3ee3863..6cdca8c 100644 --- a/server/internal/library/captcha/captcha.go +++ b/server/internal/library/captcha/captcha.go @@ -7,6 +7,7 @@ package captcha import ( "context" + "hotgo/internal/consts" "image/color" "github.com/gogf/gf/v2/frame/g" @@ -18,44 +19,52 @@ import ( var store = base64Captcha.DefaultMemStore // Generate 生成验证码 -func Generate(ctx context.Context) (id string, base64 string) { - // 字符 - // driver := &base64Captcha.DriverString{ - // Height: 42, - // Width: 100, - // //NoiseCount: 50, - // //ShowLineOptions: 20, - // Length: 4, - // BgColor: &color.RGBA{ - // R: 255, - // G: 250, - // B: 250, - // A: 250, - // }, - // Source: "0123456789", // abcdefghjkmnpqrstuvwxyz23456789 - // Fonts: []string{"chromohv.ttf"}, - // } +func Generate(ctx context.Context, captchaType int) (id string, base64 string) { + var err error + switch captchaType { // 算数 - driver := &base64Captcha.DriverMath{ - Height: 42, - Width: 100, - NoiseCount: 0, - ShowLineOptions: 0, - BgColor: &color.RGBA{ - R: 255, - G: 250, - B: 250, - A: 250, - }, - Fonts: []string{"chromohv.ttf"}, + case consts.CaptchaTypeMath: + driver := &base64Captcha.DriverMath{ + Height: 42, + Width: 100, + NoiseCount: 0, + ShowLineOptions: 0, + BgColor: &color.RGBA{ + R: 255, + G: 250, + B: 250, + A: 250, + }, + Fonts: []string{"chromohv.ttf"}, + } + c := base64Captcha.NewCaptcha(driver.ConvertFonts(), store) + id, base64, _, err = c.Generate() + // 字符 + default: + driver := &base64Captcha.DriverString{ + Height: 42, + Width: 100, + //NoiseCount: 50, + //ShowLineOptions: 20, + Length: 4, + BgColor: &color.RGBA{ + R: 255, + G: 250, + B: 250, + A: 250, + }, + Source: "abcdefghjkmnpqrstuvwxyz23456789", // abcdefghjkmnpqrstuvwxyz23456789 + Fonts: []string{"chromohv.ttf"}, + } + c := base64Captcha.NewCaptcha(driver.ConvertFonts(), store) + id, base64, _, err = c.Generate() } - c := base64Captcha.NewCaptcha(driver.ConvertFonts(), store) - id, base64, _, err := c.Generate() if err != nil { g.Log().Errorf(ctx, "captcha.Generate err:%+v", err) } + return } diff --git a/server/internal/model/config.go b/server/internal/model/config.go index 2ada6cb..dc333e6 100644 --- a/server/internal/model/config.go +++ b/server/internal/model/config.go @@ -176,6 +176,7 @@ type WechatConfig struct { type LoginConfig struct { RegisterSwitch int `json:"loginRegisterSwitch"` CaptchaSwitch int `json:"loginCaptchaSwitch"` + CaptchaType int `json:"loginCaptchaType"` Avatar string `json:"loginAvatar"` RoleId int64 `json:"loginRoleId"` DeptId int64 `json:"loginDeptId"` From 99967d35e53ab786b7212a29931e6a8d8fe53104 Mon Sep 17 00:00:00 2001 From: yazzyk Date: Wed, 25 Jun 2025 17:43:38 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E5=A4=84=E7=90=86=E4=BD=8E=E5=8D=B1?= =?UTF-8?q?=E6=BC=8F=E6=B4=9E:=E7=94=A8=E6=88=B7=E6=9E=9A=E4=B8=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/internal/logic/admin/site.go | 2 +- server/utility/simple/simple.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/internal/logic/admin/site.go b/server/internal/logic/admin/site.go index 519ea76..ac3f7b2 100644 --- a/server/internal/logic/admin/site.go +++ b/server/internal/logic/admin/site.go @@ -154,7 +154,7 @@ func (s *sAdminSite) AccountLogin(ctx context.Context, in *adminin.AccountLoginI } if mb == nil { - err = gerror.New("账号不存在") + err = gerror.New("用户名或密码错误") return } diff --git a/server/utility/simple/simple.go b/server/utility/simple/simple.go index f1cd923..d2e8e1c 100644 --- a/server/utility/simple/simple.go +++ b/server/utility/simple/simple.go @@ -68,7 +68,7 @@ func CheckPassword(input, salt, hash string) (err error) { } if hash != gmd5.MustEncryptString(password+salt) { - err = gerror.New("用户密码不正确") + err = gerror.New("用户名或密码错误") return } return From d807084d5582f40693b905ace5b03b727716533c Mon Sep 17 00:00:00 2001 From: yazzyk Date: Wed, 25 Jun 2025 17:50:48 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E9=AA=8C=E8=AF=81=E7=A0=81=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/storage/data/hotgo.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/storage/data/hotgo.sql b/server/storage/data/hotgo.sql index 1e8e4ba..5d690cd 100644 --- a/server/storage/data/hotgo.sql +++ b/server/storage/data/hotgo.sql @@ -1527,8 +1527,8 @@ INSERT INTO `hg_sys_config` (`id`, `group`, `name`, `type`, `key`, `value`, `def (125, 'upload', 'minio是否启用SSL', 'int', 'uploadMinioUseSSL', '1', '', 650, '', 1, 1, '2021-01-30 13:27:43', '2024-02-28 16:56:35'), (126, 'upload', 'minio存储路径', 'string', 'uploadMinioPath', 'hotgo/attachment/', '', 650, '', 1, 1, '2021-01-30 13:27:43', '2024-02-28 16:56:35'), (127, 'upload', 'minio桶名称', 'string', 'uploadMinioBucket', '', '', 650, '', 1, 1, '2021-01-30 13:27:43', '2024-02-28 16:56:35'), -(128, 'upload', 'minio对外访问域名', 'string', 'uploadMinioDomain', '', '', 650, '', 1, 1, '2021-01-30 13:27:43', '2024-02-28 16:56:35'); - +(128, 'upload', 'minio对外访问域名', 'string', 'uploadMinioDomain', '', '', 650, '', 1, 1, '2021-01-30 13:27:43', '2024-02-28 16:56:35'), +(129, 'login', '验证码方式', 'int', 'loginCaptchaType', '1', '2', 1200, '', 1, 1, '2025-06-25 17:04:39', '2025-06-25 17:23:15'); -- -------------------------------------------------------- -- From ae3ad538064dd11e5f2f06872dc98c4b0cc19576 Mon Sep 17 00:00:00 2001 From: yazzyk Date: Wed, 25 Jun 2025 18:03:43 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=AB=98=E5=8D=B1?= =?UTF-8?q?=E6=BC=8F=E6=B4=9E:token=E6=8A=93=E5=8C=85=E6=9A=B4=E9=9C=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/internal/logic/sys/login_log.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/server/internal/logic/sys/login_log.go b/server/internal/logic/sys/login_log.go index c83c4c3..21aafc9 100644 --- a/server/internal/logic/sys/login_log.go +++ b/server/internal/logic/sys/login_log.go @@ -82,6 +82,9 @@ func (s *sSysLoginLog) List(ctx context.Context, in *sysin.LoginLogListInp) (lis } for _, v := range list { + if v.Response.Contains("token") { + v.Response.Set("token", "******") + } v.Os = useragent.GetOs(v.UserAgent) v.Browser = useragent.GetBrowser(v.UserAgent) v.SysLogId, err = dao.SysLog.Ctx(ctx).Fields("id").Where("req_id", v.ReqId).Value()