From c5d0b31251a40657426696002cd2589446ea509b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=97=E5=AD=90?= Date: Wed, 9 Oct 2024 23:41:26 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E9=83=A8=E5=88=86?= =?UTF-8?q?=E8=B7=AF=E7=94=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/route/http.go | 2 +- internal/service/cli.go | 64 +++++++++++++++++++++++++++++++-- web/package.json | 12 +++---- web/pnpm-lock.yaml | 79 +++++++++++++++++++++++------------------ 4 files changed, 112 insertions(+), 45 deletions(-) diff --git a/internal/route/http.go b/internal/route/http.go index 84280873..9a20265c 100644 --- a/internal/route/http.go +++ b/internal/route/http.go @@ -113,7 +113,7 @@ func Http(r chi.Router) { }) r.Route("/app", func(r chi.Router) { - //r.Use(middleware.MustLogin) + r.Use(middleware.MustLogin) app := service.NewAppService() r.Get("/list", app.List) r.Post("/install", app.Install) diff --git a/internal/service/cli.go b/internal/service/cli.go index 76ff1652..da236753 100644 --- a/internal/service/cli.go +++ b/internal/service/cli.go @@ -2,7 +2,9 @@ package service import ( "context" + "errors" "fmt" + "gorm.io/gorm" "path/filepath" "github.com/go-rat/utils/hash" @@ -95,17 +97,73 @@ func (s *CliService) Info(ctx context.Context, cmd *cli.Command) error { } func (s *CliService) UserList(ctx context.Context, cmd *cli.Command) error { - println("Hello, World!") + users := make([]biz.User, 0) + if err := app.Orm.Find(&users).Error; err != nil { + return fmt.Errorf("获取用户列表失败:%v", err) + } + + for _, user := range users { + color.Greenln(fmt.Sprintf("ID: %d, 用户名: %s, 邮箱: %s, 创建日期: %s", user.ID, user.Username, user.Email, user.CreatedAt.Format("2006-01-02 15:04:05"))) + } + return nil } func (s *CliService) UserName(ctx context.Context, cmd *cli.Command) error { - println("Hello, World!") + user := new(biz.User) + oldUsername := cmd.Args().Get(0) + newUsername := cmd.Args().Get(1) + if oldUsername == "" { + return fmt.Errorf("旧用户名不能为空") + } + if newUsername == "" { + return fmt.Errorf("新用户名不能为空") + } + + if err := app.Orm.Where("username", oldUsername).First(user).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return fmt.Errorf("用户不存在") + } else { + return fmt.Errorf("获取用户失败:%v", err) + } + } + + user.Username = newUsername + if err := app.Orm.Save(user).Error; err != nil { + return fmt.Errorf("用户名修改失败:%v", err) + } + return nil } func (s *CliService) UserPassword(ctx context.Context, cmd *cli.Command) error { - println("Hello, World!") + user := new(biz.User) + username := cmd.Args().Get(0) + password := cmd.Args().Get(1) + if username == "" || password == "" { + return fmt.Errorf("用户名和密码不能为空") + } + if len(password) < 6 { + return fmt.Errorf("密码长度不能小于6") + } + + if err := app.Orm.Where("username", username).First(user).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return fmt.Errorf("用户不存在") + } else { + return fmt.Errorf("获取用户失败:%v", err) + } + } + + hashed, err := s.hash.Make(password) + if err != nil { + return fmt.Errorf("密码生成失败:%v", err) + } + user.Password = hashed + if err = app.Orm.Save(user).Error; err != nil { + return fmt.Errorf("密码修改失败:%v", err) + } + return nil } diff --git a/web/package.json b/web/package.json index 4237f55b..cbc421cc 100644 --- a/web/package.json +++ b/web/package.json @@ -34,18 +34,18 @@ "remove": "^0.1.5", "vue": "^3.5.11", "vue-echarts": "^7.0.3", - "vue-i18n": "^10.0.3", + "vue-i18n": "^10.0.4", "vue-router": "^4.4.5" }, "devDependencies": { - "@iconify/json": "^2.2.256", + "@iconify/json": "^2.2.258", "@iconify/vue": "^4.1.2", "@rushstack/eslint-patch": "^1.10.4", "@tsconfig/node20": "^20.1.4", "@types/crypto-js": "^4.2.2", "@types/lodash-es": "^4.17.12", - "@types/node": "^20.16.10", - "@unocss/eslint-config": "^0.63.3", + "@types/node": "^20.16.11", + "@unocss/eslint-config": "^0.63.4", "@vitejs/plugin-vue": "^5.1.4", "@vue/eslint-config-prettier": "^10.0.0", "@vue/eslint-config-typescript": "^13.0.0", @@ -60,8 +60,8 @@ "prettier": "^3.3.3", "prettier-plugin-organize-imports": "^4.1.0", "sass": "^1.79.4", - "typescript": "^5.6.2", - "unocss": "^0.63.3", + "typescript": "^5.6.3", + "unocss": "^0.63.4", "unplugin-auto-import": "^0.18.3", "unplugin-icons": "^0.19.3", "unplugin-vue-components": "^0.27.4", diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index 7fcf5106..0b6a5f8d 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -51,14 +51,14 @@ importers: specifier: ^7.0.3 version: 7.0.3(@vue/runtime-core@3.5.11)(echarts@5.5.1)(vue@3.5.11(typescript@5.6.3)) vue-i18n: - specifier: ^10.0.3 + specifier: ^10.0.4 version: 10.0.4(vue@3.5.11(typescript@5.6.3)) vue-router: specifier: ^4.4.5 version: 4.4.5(vue@3.5.11(typescript@5.6.3)) devDependencies: '@iconify/json': - specifier: ^2.2.256 + specifier: ^2.2.258 version: 2.2.258 '@iconify/vue': specifier: ^4.1.2 @@ -76,10 +76,10 @@ importers: specifier: ^4.17.12 version: 4.17.12 '@types/node': - specifier: ^20.16.10 + specifier: ^20.16.11 version: 20.16.11 '@unocss/eslint-config': - specifier: ^0.63.3 + specifier: ^0.63.4 version: 0.63.4(eslint@8.57.1)(typescript@5.6.3) '@vitejs/plugin-vue': specifier: ^5.1.4 @@ -124,10 +124,10 @@ importers: specifier: ^1.79.4 version: 1.79.4 typescript: - specifier: ^5.6.2 + specifier: ^5.6.3 version: 5.6.3 unocss: - specifier: ^0.63.3 + specifier: ^0.63.4 version: 0.63.4(postcss@8.4.47)(rollup@4.24.0)(vite@5.4.8(@types/node@20.16.11)(sass@1.79.4)(terser@5.34.1)) unplugin-auto-import: specifier: ^0.18.3 @@ -630,46 +630,55 @@ packages: resolution: {integrity: sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.24.0': resolution: {integrity: sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.24.0': resolution: {integrity: sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.24.0': resolution: {integrity: sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': resolution: {integrity: sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.24.0': resolution: {integrity: sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-s390x-gnu@4.24.0': resolution: {integrity: sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.24.0': resolution: {integrity: sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.24.0': resolution: {integrity: sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.24.0': resolution: {integrity: sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==} @@ -902,14 +911,14 @@ packages: vite: ^5.0.0 vue: ^3.2.25 - '@volar/language-core@2.4.5': - resolution: {integrity: sha512-F4tA0DCO5Q1F5mScHmca0umsi2ufKULAnMOVBfMsZdT4myhVl4WdKRwCaKcfOkIEuyrAVvtq1ESBdZ+rSyLVww==} + '@volar/language-core@2.4.6': + resolution: {integrity: sha512-FxUfxaB8sCqvY46YjyAAV6c3mMIq/NWQMVvJ+uS4yxr1KzOvyg61gAuOnNvgCvO4TZ7HcLExBEsWcDu4+K4E8A==} - '@volar/source-map@2.4.5': - resolution: {integrity: sha512-varwD7RaKE2J/Z+Zu6j3mNNJbNT394qIxXwdvz/4ao/vxOfyClZpSDtLKkwWmecinkOVos5+PWkWraelfMLfpw==} + '@volar/source-map@2.4.6': + resolution: {integrity: sha512-Nsh7UW2ruK+uURIPzjJgF0YRGP5CX9nQHypA2OMqdM2FKy7rh+uv3XgPnWPw30JADbKvZ5HuBzG4gSbVDYVtiw==} - '@volar/typescript@2.4.5': - resolution: {integrity: sha512-mcT1mHvLljAEtHviVcBuOyAwwMKz1ibXTi5uYtP/pf4XxoAzpdkQ+Br2IC0NPCvLCbjPZmbf3I0udndkfB1CDg==} + '@volar/typescript@2.4.6': + resolution: {integrity: sha512-NMIrA7y5OOqddL9VtngPWYmdQU03htNKFtAYidbYfWA0TOhyGVd9tfcP4TsLWQ+RBWDZCbBqsr8xzU0ZOxYTCQ==} '@vue/compiler-core@3.5.11': resolution: {integrity: sha512-PwAdxs7/9Hc3ieBO12tXzmTD+Ln4qhT/56S+8DvrrZ4kLDn4Z/AMUr8tXJD0axiJBS0RKIoNaR0yMuQB9v9Udg==} @@ -2005,8 +2014,8 @@ packages: resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} - ofetch@1.4.0: - resolution: {integrity: sha512-MuHgsEhU6zGeX+EMh+8mSMrYTnsqJQQrpM00Q6QHMKNqQ0bKy0B43tk8tL1wg+CnsSTy1kg4Ir2T5Ig6rD+dfQ==} + ofetch@1.4.1: + resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} on-finished@2.3.0: resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} @@ -2106,8 +2115,8 @@ packages: typescript: optional: true - pkg-types@1.2.0: - resolution: {integrity: sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==} + pkg-types@1.2.1: + resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==} possible-typed-array-names@1.0.0: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} @@ -2221,8 +2230,8 @@ packages: scule@1.3.0: resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} - seemly@0.3.8: - resolution: {integrity: sha512-MW8Qs6vbzo0pHmDpFSYPna+lwpZ6Zk1ancbajw/7E8TKtHdV+1DfZZD+kKJEhG/cAoB/i+LiT+5msZOqj0DwRA==} + seemly@0.3.9: + resolution: {integrity: sha512-bMLcaEqhIViiPbaumjLN8t1y+JpD/N8SiyYOyp0i0W6RgdyLWboIsUWAbZojF//JyerxPZR5Tgda+x3Pdne75A==} semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} @@ -3275,7 +3284,7 @@ snapshots: dependencies: '@iconify/utils': 2.1.33 '@unocss/core': 0.63.4 - ofetch: 1.4.0 + ofetch: 1.4.1 transitivePeerDependencies: - supports-color @@ -3304,7 +3313,7 @@ snapshots: '@unocss/preset-web-fonts@0.63.4': dependencies: '@unocss/core': 0.63.4 - ofetch: 1.4.0 + ofetch: 1.4.1 '@unocss/preset-wind@0.63.4': dependencies: @@ -3357,15 +3366,15 @@ snapshots: vite: 5.4.8(@types/node@20.16.11)(sass@1.79.4)(terser@5.34.1) vue: 3.5.11(typescript@5.6.3) - '@volar/language-core@2.4.5': + '@volar/language-core@2.4.6': dependencies: - '@volar/source-map': 2.4.5 + '@volar/source-map': 2.4.6 - '@volar/source-map@2.4.5': {} + '@volar/source-map@2.4.6': {} - '@volar/typescript@2.4.5': + '@volar/typescript@2.4.6': dependencies: - '@volar/language-core': 2.4.5 + '@volar/language-core': 2.4.6 path-browserify: 1.0.1 vscode-uri: 3.0.8 @@ -3429,7 +3438,7 @@ snapshots: '@vue/language-core@2.1.6(typescript@5.6.3)': dependencies: - '@volar/language-core': 2.4.5 + '@volar/language-core': 2.4.6 '@vue/compiler-dom': 3.5.11 '@vue/compiler-vue2': 2.7.16 '@vue/shared': 3.5.11 @@ -4511,7 +4520,7 @@ snapshots: local-pkg@0.5.0: dependencies: mlly: 1.7.2 - pkg-types: 1.2.0 + pkg-types: 1.2.1 locate-path@6.0.0: dependencies: @@ -4566,7 +4575,7 @@ snapshots: dependencies: acorn: 8.12.1 pathe: 1.1.2 - pkg-types: 1.2.0 + pkg-types: 1.2.1 ufo: 1.5.4 mockjs@1.1.0: @@ -4599,7 +4608,7 @@ snapshots: highlight.js: 11.10.0 lodash: 4.17.21 lodash-es: 4.17.21 - seemly: 0.3.8 + seemly: 0.3.9 treemate: 0.3.11 vdirs: 0.1.8(vue@3.5.11(typescript@5.6.3)) vooks: 0.2.12(vue@3.5.11(typescript@5.6.3)) @@ -4670,7 +4679,7 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 - ofetch@1.4.0: + ofetch@1.4.1: dependencies: destr: 2.0.3 node-fetch-native: 1.6.4 @@ -4755,7 +4764,7 @@ snapshots: optionalDependencies: typescript: 5.6.3 - pkg-types@1.2.0: + pkg-types@1.2.1: dependencies: confbox: 0.1.8 mlly: 1.7.2 @@ -4882,7 +4891,7 @@ snapshots: scule@1.3.0: {} - seemly@0.3.8: {} + seemly@0.3.9: {} semver@6.3.1: {} @@ -5122,7 +5131,7 @@ snapshots: magic-string: 0.30.11 mlly: 1.7.2 pathe: 1.1.2 - pkg-types: 1.2.0 + pkg-types: 1.2.1 scule: 1.3.0 strip-literal: 2.1.0 unplugin: 1.14.1 @@ -5331,7 +5340,7 @@ snapshots: vue-tsc@2.1.6(typescript@5.6.3): dependencies: - '@volar/typescript': 2.4.5 + '@volar/typescript': 2.4.6 '@vue/language-core': 2.1.6(typescript@5.6.3) semver: 7.6.3 typescript: 5.6.3 @@ -5352,7 +5361,7 @@ snapshots: '@juggle/resize-observer': 3.4.0 css-render: 0.15.14 evtd: 0.2.4 - seemly: 0.3.8 + seemly: 0.3.9 vdirs: 0.1.8(vue@3.5.11(typescript@5.6.3)) vooks: 0.2.12(vue@3.5.11(typescript@5.6.3)) vue: 3.5.11(typescript@5.6.3)