From 932b20fe725de92661eb2edb317e0cd726c5ab0f Mon Sep 17 00:00:00 2001 From: veypi Date: Thu, 31 Oct 2024 01:58:11 +0800 Subject: [PATCH] feat: i18n --- oa/api/app/app.go | 23 +- oa/models/app.gen.go | 10 +- oa/models/app.go | 11 +- oaer/lib/fs.ts | 6 +- oaweb/app.config.ts | 4 + oaweb/app.vue | 4 +- oaweb/assets/css/app.scss | 68 ++- oaweb/components/menu.vue | 5 +- oaweb/components/uploader.vue | 31 +- oaweb/components/vinput.vue | 49 +-- oaweb/composables/api/app.ts | 2 +- oaweb/composables/api/models.ts | 3 + oaweb/composables/api/webapi.ts | 2 +- oaweb/layouts/default.vue | 16 +- oaweb/nuxt.config.ts | 2 +- oaweb/package.json | 3 + oaweb/pages/app/[id].vue | 8 +- oaweb/pages/index.vue | 53 ++- oaweb/plugins/i18n/en.ts | 36 ++ oaweb/plugins/i18n/zh.ts | 35 ++ oaweb/plugins/third.ts | 19 + oaweb/public/icon.js | 2 +- oaweb/stores/menu.ts | 12 +- oaweb/tailwind.config.js | 13 +- oaweb/yarn.lock | 723 ++++++++++++++++++++++++++++++-- 25 files changed, 1014 insertions(+), 126 deletions(-) create mode 100644 oaweb/plugins/i18n/en.ts create mode 100644 oaweb/plugins/i18n/zh.ts diff --git a/oa/api/app/app.go b/oa/api/app/app.go index 45a9ea6..bd4730f 100644 --- a/oa/api/app/app.go +++ b/oa/api/app/app.go @@ -4,10 +4,9 @@ import ( "oa/cfg" "oa/libs/auth" M "oa/models" - "strings" - "github.com/google/uuid" "github.com/veypi/OneBD/rest" + "gorm.io/gorm" ) func useApp(r rest.Router) { @@ -52,7 +51,7 @@ func appList(x *rest.X) (any, error) { UserStatus string `json:"user_status"` }, 0, 10) - query := cfg.DB().Debug().Table("apps").Select("apps.*,app_users.status user_status") + query := cfg.DB().Table("apps").Select("apps.*,app_users.status user_status") uid := x.Request.Context().Value("uid").(string) if opts.Name != nil { query = query.Joins("LEFT JOIN app_users ON app_users.app_id = apps.id AND app_users.user_id = ? AND apps.name LIKE ?", uid, opts.Name) @@ -108,12 +107,24 @@ func appPost(x *rest.X) (any, error) { } data := &M.App{} - data.ID = strings.ReplaceAll(uuid.New().String(), "-", "") data.Name = opts.Name data.Icon = opts.Icon - data.Des = opts.Des data.Typ = opts.Typ - err = cfg.DB().Create(data).Error + if opts.Des != nil { + data.Des = *opts.Des + } + err = cfg.DB().Transaction(func(tx *gorm.DB) error { + err := tx.Create(data).Error + if err != nil { + return err + } + au := &M.AppUser{ + AppID: data.ID, + UserID: x.Request.Context().Value("uid").(string), + Status: M.AUSTATUS_OK, + } + return tx.Create(au).Error + }) return data, err } diff --git a/oa/models/app.gen.go b/oa/models/app.gen.go index 5da2484..27aa4a0 100644 --- a/oa/models/app.gen.go +++ b/oa/models/app.gen.go @@ -21,11 +21,11 @@ type AppDelete struct { } type AppPost struct { - Name string `json:"name" parse:"json"` - Icon string `json:"icon" parse:"json"` - Des string `json:"des" parse:"json"` - Typ string `json:"typ" gorm:"default:auto" parse:"json"` - Status string `json:"status" gorm:"default:ok" parse:"json"` + Name string `json:"name" parse:"json"` + Icon string `json:"icon" parse:"json"` + Des *string `json:"des" parse:"json"` + Typ string `json:"typ" gorm:"default:auto" parse:"json"` + Status string `json:"status" gorm:"default:ok" parse:"json"` } type AppList struct { diff --git a/oa/models/app.go b/oa/models/app.go index 8fecf97..6ca2d43 100644 --- a/oa/models/app.go +++ b/oa/models/app.go @@ -5,11 +5,16 @@ import ( "gorm.io/gorm" ) +const AUSTATUS_OK = "ok" +const AUSTATUS_NO = "no" +const AUSTATUS_APPLYING = "applying" +const AUSTATUS_REJECT = "reject" + type App struct { BaseModel Name string `json:"name" methods:"post,*patch,*list" parse:"json"` Icon string `json:"icon" methods:"post,*patch" parse:"json"` - Des string `json:"des" methods:"post,*patch" parse:"json"` + Des string `json:"des" methods:"*post,*patch" parse:"json"` Typ string `json:"typ" gorm:"default:public" methods:"post,*patch" parse:"json"` Status string `json:"status" gorm:"default:ok" methods:"post,*patch" parse:"json"` InitRoleID *string `json:"init_role_id" gorm:"index;type:varchar(32);default: null" methods:"*patch" parse:"json"` @@ -49,14 +54,14 @@ func (m *AppUser) onOk(tx *gorm.DB) (err error) { } func (m *AppUser) AfterCreate(tx *gorm.DB) error { - if m.Status == "ok" { + if m.Status == AUSTATUS_OK { logv.AssertError(m.onOk(tx)) } return tx.Model(&App{}).Where("id = ?", m.AppID).Update("user_count", gorm.Expr("user_count + ?", 1)).Error } func (m *AppUser) AfterUpdate(tx *gorm.DB) error { - if m.Status == "ok" { + if m.Status == AUSTATUS_OK { return m.onOk(tx) } return nil diff --git a/oaer/lib/fs.ts b/oaer/lib/fs.ts index cd80167..6fd81a9 100644 --- a/oaer/lib/fs.ts +++ b/oaer/lib/fs.ts @@ -49,7 +49,7 @@ class davWraper { } } } - putFileContents(filename: string, data: string, options?: webdav.PutFileContentsOptions) { + putFileContents(filename: string, data: string | webdav.BufferLike, options?: webdav.PutFileContentsOptions) { return this.retry(() => this.client.putFileContents(filename, data, options)) } getFileContents(filename: string, options?: webdav.GetFileContentsOptions) { @@ -118,8 +118,8 @@ const rename = (o: string, n?: string) => { if (n) { return n + ext } - let d = new Date().getTime() - return d + o + ext + const d = performance.now().toString(36); + return d + ext } diff --git a/oaweb/app.config.ts b/oaweb/app.config.ts index b7cbb56..f9dfb20 100644 --- a/oaweb/app.config.ts +++ b/oaweb/app.config.ts @@ -8,6 +8,10 @@ export default defineAppConfig({ // host: window.location.protocol + '//' + window.location.host, + ui: { + // primary: '#2196f3', + // gray: '#111' + }, host: '', id: 'tMRxWz77P9ABNZA3ZIuoNQILjVBBIUdf', layout: { diff --git a/oaweb/app.vue b/oaweb/app.vue index b7affe2..80621f9 100644 --- a/oaweb/app.vue +++ b/oaweb/app.vue @@ -1,11 +1,9 @@