From 24073d3bbe75b2bce9738dd1948cec53013ba01e Mon Sep 17 00:00:00 2001 From: IRONICBo <47499836+IRONICBo@users.noreply.github.com> Date: Sun, 6 Aug 2023 18:40:41 +0800 Subject: [PATCH 1/4] feat: Add session page. Signed-off-by: IRONICBo <47499836+IRONICBo@users.noreply.github.com> --- web/.eslintrc.js | 1 + web/package-lock.json | 1 + web/package.json | 1 + web/src/style/reset-tdesign.less | 39 +++++ .../views/session/components/SessionList.vue | 85 +++++++++++ .../session/components/SessionWindow.vue | 143 ++++++++++++++++++ web/src/views/session/index.less | 143 ++++++++++++++++++ web/src/views/session/index.vue | 24 ++- 8 files changed, 434 insertions(+), 3 deletions(-) create mode 100644 web/src/views/session/components/SessionList.vue create mode 100644 web/src/views/session/components/SessionWindow.vue create mode 100644 web/src/views/session/index.less diff --git a/web/.eslintrc.js b/web/.eslintrc.js index e2c18b9..be197c6 100644 --- a/web/.eslintrc.js +++ b/web/.eslintrc.js @@ -47,5 +47,6 @@ module.exports = { '@typescript-eslint/ban-types': 'off', 'vue/multi-word-component-names': 'off', 'vue/comment-directive': 'off', + 'no-async-promise-executor': 'off', }, }; diff --git a/web/package-lock.json b/web/package-lock.json index a8b6ff5..92d7713 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -19,6 +19,7 @@ "tdesign-icons-vue-next": "^0.1.11", "tdesign-vue-next": "^1.3.10", "tvision-color": "^1.6.0", + "uuid": "^9.0.0", "vite-svg-loader": "^4.0.0", "vue": "^3.3.4", "vue-router": "^4.2.2" diff --git a/web/package.json b/web/package.json index 1b7d104..30b378e 100644 --- a/web/package.json +++ b/web/package.json @@ -21,6 +21,7 @@ "tdesign-icons-vue-next": "^0.1.11", "tdesign-vue-next": "^1.3.10", "tvision-color": "^1.6.0", + "uuid": "^9.0.0", "vite-svg-loader": "^4.0.0", "vue": "^3.3.4", "vue-router": "^4.2.2" diff --git a/web/src/style/reset-tdesign.less b/web/src/style/reset-tdesign.less index 2a608c3..b8ee0c7 100644 --- a/web/src/style/reset-tdesign.less +++ b/web/src/style/reset-tdesign.less @@ -1,8 +1,22 @@ // reset for openkf +.t-textarea__inner { + border-radius: var(--td-radius-large); + height: var(--td-comp-size-xxxxxl); + padding: var(--td-comp-paddingTB-s) var(--td-comp-paddingLR-l); + resize: none; +} + .t-menu__logo { min-height: var(--td-comp-size-xxxxxl); } +.kf-session-input { + .t-input { + border-radius: var(--td-radius-large); + width: 180px; + } +} + .kf-config-input { .t-input { border-radius: var(--td-radius-large); @@ -10,6 +24,31 @@ } } +.kf-session-list-card { + margin-bottom: var(--td-comp-margin-m); + + .t-card { + border-radius: var(--td-radius-large); + background-color: var(--td-font-white-1); + } + + .t-card__header { + padding: var(--td-comp-paddingTB-xs) var(--td-comp-paddingLR-l); + padding-top: var(--td-comp-paddingTB-m); + + .t-card__title { + font-weight: 500; + } + } + + .t-card__body { + padding: var(--td-comp-paddingTB-xs) var(--td-comp-paddingLR-l); + padding-bottom: var(--td-comp-paddingTB-m); + font-size: var(--td-font-size-body-small); + color: var(--td-text-color-secondary); + } +} + .kf-config-list-card { margin-bottom: var(--td-comp-margin-m); diff --git a/web/src/views/session/components/SessionList.vue b/web/src/views/session/components/SessionList.vue new file mode 100644 index 0000000..36d6a29 --- /dev/null +++ b/web/src/views/session/components/SessionList.vue @@ -0,0 +1,85 @@ + + + + + + + diff --git a/web/src/views/session/components/SessionWindow.vue b/web/src/views/session/components/SessionWindow.vue new file mode 100644 index 0000000..5548e29 --- /dev/null +++ b/web/src/views/session/components/SessionWindow.vue @@ -0,0 +1,143 @@ + + + + + + + diff --git a/web/src/views/session/index.less b/web/src/views/session/index.less new file mode 100644 index 0000000..c1dfdbd --- /dev/null +++ b/web/src/views/session/index.less @@ -0,0 +1,143 @@ +.light { + &.session-list-wrapper { + background-color: var(--td-brand-color-1); + } + + &.session-window-wrapper { + background-color: var(--td-font-white-1); + } +} + +.dark { + &.session-list-wrapper { + background-color: var(--td-bg-color-page); + } + + &.session-window-wrapper { + background-color: var(--td-bg-color-page); + } +} + +.session-window-wrapper { + height: 100vh; + display: flex; + flex-direction: column; + background-size: cover; + background-position: 100%; + position: relative; +} + +.session-header { + position: relative; + padding: var(--td-comp-paddingTB-l) var(--td-comp-paddingLR-xl); + border-bottom: 1px solid var(--td-component-border); + + .welcome { + font-size: var(--td-font-size-title-large); + font-weight: 700; + } + + .sub-title { + font-size: var(--td-font-size-body-small); + font-weight: 400; + } +} + +.session-container { + min-height: 100vh; +} + +// session list start +.session-list-wrapper { + min-height: 100vh; + padding: var(--td-size-6); + display: flex; + flex-direction: column; + background-size: cover; + background-position: 100%; + position: relative; +} + +.session-title { + position: relative; + padding-top: var(--td-size-7); + padding-bottom: var(--td-size-7); + + .welcome { + font-size: var(--td-font-size-title-large); + font-weight: 700; + } + + .sub-title { + font-size: var(--td-font-size-body-small); + font-weight: 400; + } +} + +// session list end + +// session window start +.session-body { + flex: 1 1; + padding: 20px; + overflow: auto; + + & .message-card { + & .session-avatar { + margin-top: var(--td-comp-margin-s); + } + + & .session-content { + margin-top: var(--td-comp-margin-s); + max-width: 60%; + width: fit-content; + padding: var(--td-comp-paddingLR-s) var(--td-comp-paddingTB-l); + border: 1px solid var(--td-component-border); + border-radius: var(--td-radius-large); + + & .session-content-text {} + } + } +} + +.send { + align-items: flex-end; + display: flex; + flex-direction: column; + + & .session-content { + background-color: var(--td-brand-color-1); + } +} + +.recv { + & .session-content { + background-color: var(--td-gray-color-1); + } +} + +.session-input { + border-top: 1px solid var(--td-component-border); + width: 100%; + padding: var(--td-comp-paddingTB-s) var(--td-comp-paddingLR-l); + position: relative; + + & .tools { + margin-bottom: var(--td-comp-margin-s); + } + + & .inner { + & .t-textarea__inner { + height: 10vh; + } + + & .send-button { + border-radius: var(--td-radius-large); + position: absolute; + right: var(--td-comp-size-s); + bottom: var(--td-comp-size-xxxs); + } + } +} + +// session window end \ No newline at end of file diff --git a/web/src/views/session/index.vue b/web/src/views/session/index.vue index b0fe969..68263e6 100644 --- a/web/src/views/session/index.vue +++ b/web/src/views/session/index.vue @@ -1,7 +1,25 @@ - + - + + + From f2cc85b4096f0f7b501cf9a71b930a2996857066 Mon Sep 17 00:00:00 2001 From: IRONICBo <47499836+IRONICBo@users.noreply.github.com> Date: Thu, 10 Aug 2023 15:26:58 +0800 Subject: [PATCH 2/4] feat: Update to OpenIM 3.1. Signed-off-by: IRONICBo <47499836+IRONICBo@users.noreply.github.com> --- server/config.docker.yaml | 1 + server/config.example.yaml | 1 + server/config.yaml | 3 +- server/internal/api/admin.go | 4 +- server/internal/config/config.go | 2 + server/internal/dal/dao/gen_sys_bot_dao.go | 6 +- .../internal/dal/dao/gen_sys_community_dao.go | 6 +- .../internal/dal/dao/gen_sys_customer_dao.go | 6 +- server/internal/dal/dao/gen_sys_user_dao.go | 6 +- server/internal/dal/gen/sys_bot.gen.go | 6 +- server/internal/dal/gen/sys_community.gen.go | 6 +- server/internal/dal/gen/sys_customer.gen.go | 6 +- server/internal/dal/gen/sys_user.gen.go | 6 +- server/internal/models/base/user_base.go | 14 ++-- .../internal/models/system_roles/sys_bot.go | 4 +- .../models/system_roles/sys_community.go | 12 ++-- server/internal/params/request/community.go | 4 +- server/internal/service/bot.go | 38 +++------- server/internal/service/community.go | 42 +++++------ server/internal/service/user.go | 70 ++++++------------- server/pkg/openim/client/client.go | 9 +-- server/pkg/openim/param/request/msg.go | 45 ++++++++++++ server/pkg/openim/param/response/response.go | 7 +- server/pkg/openim/sdk/auth/auth.go | 4 +- server/pkg/openim/sdk/auth/auth_test.go | 4 +- server/pkg/openim/sdk/constant/type.go | 42 +++++++++++ server/pkg/openim/sdk/msg/msg.go | 54 ++++++++++++++ server/pkg/openim/sdk/msg/msg_test.go | 67 ++++++++++++++++++ server/pkg/openim/sdk/user/user.go | 6 +- server/pkg/openim/sdk/user/user_test.go | 4 +- server/pkg/utils/uuid.go | 44 +++++++++++- 31 files changed, 361 insertions(+), 168 deletions(-) create mode 100644 server/pkg/openim/param/request/msg.go create mode 100644 server/pkg/openim/sdk/constant/type.go create mode 100644 server/pkg/openim/sdk/msg/msg.go create mode 100644 server/pkg/openim/sdk/msg/msg_test.go diff --git a/server/config.docker.yaml b/server/config.docker.yaml index fb9e4f8..b05ed54 100644 --- a/server/config.docker.yaml +++ b/server/config.docker.yaml @@ -65,6 +65,7 @@ openim: ip: 127.0.0.1 api_port: 10002 platform_id: 5 # web + admin_id: openkf_admin # OpenIMServer admin userID slack: bot_token: diff --git a/server/config.example.yaml b/server/config.example.yaml index eb1fcab..c63aa45 100644 --- a/server/config.example.yaml +++ b/server/config.example.yaml @@ -65,6 +65,7 @@ openim: ip: 127.0.0.1 api_port: 10002 platform_id: 5 # web + admin_id: openkf_admin # OpenIMServer admin userID slack: bot_token: diff --git a/server/config.yaml b/server/config.yaml index eb1fcab..9388f63 100644 --- a/server/config.yaml +++ b/server/config.yaml @@ -61,10 +61,11 @@ email: pool_size: 4 openim: - secret: openkf + secret: openIM123 ip: 127.0.0.1 api_port: 10002 platform_id: 5 # web + admin_id: openIMAdmin slack: bot_token: diff --git a/server/internal/api/admin.go b/server/internal/api/admin.go index bf754d1..0b73a87 100644 --- a/server/internal/api/admin.go +++ b/server/internal/api/admin.go @@ -37,7 +37,7 @@ import ( func CreateStaff(c *gin.Context) { uuid, err := utils.GetCommunityUUID(c) if err != nil { - response.FailWithCode(common.ERROR, c) + response.FailWithAll(common.ERROR, err.Error(), c) return } @@ -53,7 +53,7 @@ func CreateStaff(c *gin.Context) { svc := service.NewUserService(c) _, _, err = svc.CreateStaff(uuid, ¶ms) if err != nil { - response.FailWithCode(common.ERROR, c) + response.FailWithAll(common.ERROR, err.Error(), c) return } diff --git a/server/internal/config/config.go b/server/internal/config/config.go index bc4346e..38136b8 100644 --- a/server/internal/config/config.go +++ b/server/internal/config/config.go @@ -77,6 +77,7 @@ func ConfigInit(configPath string) { Ip: GetStringOrDefault("openim.ip", "127.0.0.1"), ApiPort: GetIntOrDefault("openim.api_port", 10002), PlatformID: GetIntOrDefault("openim.platform_id", 5), + AdminID: GetStringOrDefault("openim.admin_id", "openkf_admin"), }, Slack: Slack{ BotToken: GetString("slack.bot_token"), @@ -170,6 +171,7 @@ type OpenIM struct { Ip string `mapstructure:"ip"` ApiPort int `mapstructure:"api_port"` PlatformID int `mapstructure:"platform_id"` + AdminID string `mapstructure:"admin_id"` } // Slack Bot config. diff --git a/server/internal/dal/dao/gen_sys_bot_dao.go b/server/internal/dal/dao/gen_sys_bot_dao.go index bc4f883..3d362f0 100644 --- a/server/internal/dal/dao/gen_sys_bot_dao.go +++ b/server/internal/dal/dao/gen_sys_bot_dao.go @@ -18,8 +18,6 @@ import ( "context" "time" - "github.com/gofrs/uuid" - "github.com/OpenIMSDK/OpenKF/server/internal/conn/db" "github.com/OpenIMSDK/OpenKF/server/internal/dal/cache" "github.com/OpenIMSDK/OpenKF/server/internal/dal/gen" @@ -125,14 +123,14 @@ func (d *SysBotDao) FindByDeletedAtPage(deletedat time.Time, offset int, limit i } // FindFirstByUUID get first matched result by uuid. -func (d *SysBotDao) FindFirstByUUID(uuid uuid.UUID) (*systemroles.SysBot, error) { +func (d *SysBotDao) FindFirstByUUID(uuid string) (*systemroles.SysBot, error) { m := d.query.SysBot return m.WithContext(d.ctx).Where(m.UUID.Eq(uuid)).First() } // FindByUUIDPage get page by UUID. -func (d *SysBotDao) FindByUUIDPage(uuid uuid.UUID, offset int, limit int) ([]*systemroles.SysBot, int64, error) { +func (d *SysBotDao) FindByUUIDPage(uuid string, offset int, limit int) ([]*systemroles.SysBot, int64, error) { m := d.query.SysBot result, count, err := m.WithContext(d.ctx).Where(m.UUID.Eq(uuid)).FindByPage(offset, limit) diff --git a/server/internal/dal/dao/gen_sys_community_dao.go b/server/internal/dal/dao/gen_sys_community_dao.go index 50bbb17..2331448 100644 --- a/server/internal/dal/dao/gen_sys_community_dao.go +++ b/server/internal/dal/dao/gen_sys_community_dao.go @@ -18,8 +18,6 @@ import ( "context" "time" - "github.com/gofrs/uuid" - "github.com/OpenIMSDK/OpenKF/server/internal/conn/db" "github.com/OpenIMSDK/OpenKF/server/internal/dal/cache" "github.com/OpenIMSDK/OpenKF/server/internal/dal/gen" @@ -125,14 +123,14 @@ func (d *SysCommunityDao) FindByDeletedAtPage(deletedat time.Time, offset int, l } // FindFirstByUUID get first matched result by uuid. -func (d *SysCommunityDao) FindFirstByUUID(uuid uuid.UUID) (*systemroles.SysCommunity, error) { +func (d *SysCommunityDao) FindFirstByUUID(uuid string) (*systemroles.SysCommunity, error) { m := d.query.SysCommunity return m.WithContext(d.ctx).Where(m.UUID.Eq(uuid)).First() } // FindByUUIDPage get page by UUID. -func (d *SysCommunityDao) FindByUUIDPage(uuid uuid.UUID, offset int, limit int) ([]*systemroles.SysCommunity, int64, error) { +func (d *SysCommunityDao) FindByUUIDPage(uuid string, offset int, limit int) ([]*systemroles.SysCommunity, int64, error) { m := d.query.SysCommunity result, count, err := m.WithContext(d.ctx).Where(m.UUID.Eq(uuid)).FindByPage(offset, limit) diff --git a/server/internal/dal/dao/gen_sys_customer_dao.go b/server/internal/dal/dao/gen_sys_customer_dao.go index eee7b5e..c737350 100644 --- a/server/internal/dal/dao/gen_sys_customer_dao.go +++ b/server/internal/dal/dao/gen_sys_customer_dao.go @@ -18,8 +18,6 @@ import ( "context" "time" - "github.com/gofrs/uuid" - "github.com/OpenIMSDK/OpenKF/server/internal/conn/db" "github.com/OpenIMSDK/OpenKF/server/internal/dal/cache" "github.com/OpenIMSDK/OpenKF/server/internal/dal/gen" @@ -125,14 +123,14 @@ func (d *SysCustomerDao) FindByDeletedAtPage(deletedat time.Time, offset int, li } // FindFirstByUUID get first matched result by uuid. -func (d *SysCustomerDao) FindFirstByUUID(uuid uuid.UUID) (*systemroles.SysCustomer, error) { +func (d *SysCustomerDao) FindFirstByUUID(uuid string) (*systemroles.SysCustomer, error) { m := d.query.SysCustomer return m.WithContext(d.ctx).Where(m.UUID.Eq(uuid)).First() } // FindByUUIDPage get page by UUID. -func (d *SysCustomerDao) FindByUUIDPage(uuid uuid.UUID, offset int, limit int) ([]*systemroles.SysCustomer, int64, error) { +func (d *SysCustomerDao) FindByUUIDPage(uuid string, offset int, limit int) ([]*systemroles.SysCustomer, int64, error) { m := d.query.SysCustomer result, count, err := m.WithContext(d.ctx).Where(m.UUID.Eq(uuid)).FindByPage(offset, limit) diff --git a/server/internal/dal/dao/gen_sys_user_dao.go b/server/internal/dal/dao/gen_sys_user_dao.go index cc7567a..6cb67df 100644 --- a/server/internal/dal/dao/gen_sys_user_dao.go +++ b/server/internal/dal/dao/gen_sys_user_dao.go @@ -18,8 +18,6 @@ import ( "context" "time" - "github.com/gofrs/uuid" - "github.com/OpenIMSDK/OpenKF/server/internal/conn/db" "github.com/OpenIMSDK/OpenKF/server/internal/dal/cache" "github.com/OpenIMSDK/OpenKF/server/internal/dal/gen" @@ -125,14 +123,14 @@ func (d *SysUserDao) FindByDeletedAtPage(deletedat time.Time, offset int, limit } // FindFirstByUUID get first matched result by uuid. -func (d *SysUserDao) FindFirstByUUID(uuid uuid.UUID) (*systemroles.SysUser, error) { +func (d *SysUserDao) FindFirstByUUID(uuid string) (*systemroles.SysUser, error) { m := d.query.SysUser return m.WithContext(d.ctx).Where(m.UUID.Eq(uuid)).First() } // FindByUUIDPage get page by UUID. -func (d *SysUserDao) FindByUUIDPage(uuid uuid.UUID, offset int, limit int) ([]*systemroles.SysUser, int64, error) { +func (d *SysUserDao) FindByUUIDPage(uuid string, offset int, limit int) ([]*systemroles.SysUser, int64, error) { m := d.query.SysUser result, count, err := m.WithContext(d.ctx).Where(m.UUID.Eq(uuid)).FindByPage(offset, limit) diff --git a/server/internal/dal/gen/sys_bot.gen.go b/server/internal/dal/gen/sys_bot.gen.go index 9af4180..ab4c027 100644 --- a/server/internal/dal/gen/sys_bot.gen.go +++ b/server/internal/dal/gen/sys_bot.gen.go @@ -31,7 +31,7 @@ func newSysBot(db *gorm.DB, opts ...gen.DOOption) sysBot { _sysBot.CreatedAt = field.NewTime(tableName, "created_at") _sysBot.UpdatedAt = field.NewTime(tableName, "updated_at") _sysBot.DeletedAt = field.NewTime(tableName, "deleted_at") - _sysBot.UUID = field.NewField(tableName, "uuid") + _sysBot.UUID = field.NewString(tableName, "uuid") _sysBot.BotAddr = field.NewString(tableName, "bot_addr") _sysBot.BotPort = field.NewInt(tableName, "bot_port") _sysBot.BotToken = field.NewString(tableName, "bot_token") @@ -58,7 +58,7 @@ type sysBot struct { CreatedAt field.Time UpdatedAt field.Time DeletedAt field.Time - UUID field.Field + UUID field.String BotAddr field.String BotPort field.Int BotToken field.String @@ -87,7 +87,7 @@ func (s *sysBot) updateTableName(table string) *sysBot { s.CreatedAt = field.NewTime(table, "created_at") s.UpdatedAt = field.NewTime(table, "updated_at") s.DeletedAt = field.NewTime(table, "deleted_at") - s.UUID = field.NewField(table, "uuid") + s.UUID = field.NewString(table, "uuid") s.BotAddr = field.NewString(table, "bot_addr") s.BotPort = field.NewInt(table, "bot_port") s.BotToken = field.NewString(table, "bot_token") diff --git a/server/internal/dal/gen/sys_community.gen.go b/server/internal/dal/gen/sys_community.gen.go index 92ca1ad..1ca89eb 100644 --- a/server/internal/dal/gen/sys_community.gen.go +++ b/server/internal/dal/gen/sys_community.gen.go @@ -30,7 +30,7 @@ func newSysCommunity(db *gorm.DB, opts ...gen.DOOption) sysCommunity { _sysCommunity.CreatedAt = field.NewTime(tableName, "created_at") _sysCommunity.UpdatedAt = field.NewTime(tableName, "updated_at") _sysCommunity.DeletedAt = field.NewTime(tableName, "deleted_at") - _sysCommunity.UUID = field.NewField(tableName, "uuid") + _sysCommunity.UUID = field.NewString(tableName, "uuid") _sysCommunity.Name = field.NewString(tableName, "name") _sysCommunity.Email = field.NewString(tableName, "email") _sysCommunity.Avatar = field.NewString(tableName, "avatar") @@ -49,7 +49,7 @@ type sysCommunity struct { CreatedAt field.Time UpdatedAt field.Time DeletedAt field.Time - UUID field.Field + UUID field.String Name field.String Email field.String Avatar field.String @@ -74,7 +74,7 @@ func (s *sysCommunity) updateTableName(table string) *sysCommunity { s.CreatedAt = field.NewTime(table, "created_at") s.UpdatedAt = field.NewTime(table, "updated_at") s.DeletedAt = field.NewTime(table, "deleted_at") - s.UUID = field.NewField(table, "uuid") + s.UUID = field.NewString(table, "uuid") s.Name = field.NewString(table, "name") s.Email = field.NewString(table, "email") s.Avatar = field.NewString(table, "avatar") diff --git a/server/internal/dal/gen/sys_customer.gen.go b/server/internal/dal/gen/sys_customer.gen.go index dcd16de..712386f 100644 --- a/server/internal/dal/gen/sys_customer.gen.go +++ b/server/internal/dal/gen/sys_customer.gen.go @@ -31,7 +31,7 @@ func newSysCustomer(db *gorm.DB, opts ...gen.DOOption) sysCustomer { _sysCustomer.CreatedAt = field.NewTime(tableName, "created_at") _sysCustomer.UpdatedAt = field.NewTime(tableName, "updated_at") _sysCustomer.DeletedAt = field.NewTime(tableName, "deleted_at") - _sysCustomer.UUID = field.NewField(tableName, "uuid") + _sysCustomer.UUID = field.NewString(tableName, "uuid") _sysCustomer.Email = field.NewString(tableName, "email") _sysCustomer.Nickname = field.NewString(tableName, "nickname") _sysCustomer.Avatar = field.NewString(tableName, "avatar") @@ -55,7 +55,7 @@ type sysCustomer struct { CreatedAt field.Time UpdatedAt field.Time DeletedAt field.Time - UUID field.Field + UUID field.String Email field.String Nickname field.String Avatar field.String @@ -85,7 +85,7 @@ func (s *sysCustomer) updateTableName(table string) *sysCustomer { s.CreatedAt = field.NewTime(table, "created_at") s.UpdatedAt = field.NewTime(table, "updated_at") s.DeletedAt = field.NewTime(table, "deleted_at") - s.UUID = field.NewField(table, "uuid") + s.UUID = field.NewString(table, "uuid") s.Email = field.NewString(table, "email") s.Nickname = field.NewString(table, "nickname") s.Avatar = field.NewString(table, "avatar") diff --git a/server/internal/dal/gen/sys_user.gen.go b/server/internal/dal/gen/sys_user.gen.go index 5dfa85b..6bedb97 100644 --- a/server/internal/dal/gen/sys_user.gen.go +++ b/server/internal/dal/gen/sys_user.gen.go @@ -31,7 +31,7 @@ func newSysUser(db *gorm.DB, opts ...gen.DOOption) sysUser { _sysUser.CreatedAt = field.NewTime(tableName, "created_at") _sysUser.UpdatedAt = field.NewTime(tableName, "updated_at") _sysUser.DeletedAt = field.NewTime(tableName, "deleted_at") - _sysUser.UUID = field.NewField(tableName, "uuid") + _sysUser.UUID = field.NewString(tableName, "uuid") _sysUser.Email = field.NewString(tableName, "email") _sysUser.Nickname = field.NewString(tableName, "nickname") _sysUser.Avatar = field.NewString(tableName, "avatar") @@ -59,7 +59,7 @@ type sysUser struct { CreatedAt field.Time UpdatedAt field.Time DeletedAt field.Time - UUID field.Field + UUID field.String Email field.String Nickname field.String Avatar field.String @@ -89,7 +89,7 @@ func (s *sysUser) updateTableName(table string) *sysUser { s.CreatedAt = field.NewTime(table, "created_at") s.UpdatedAt = field.NewTime(table, "updated_at") s.DeletedAt = field.NewTime(table, "deleted_at") - s.UUID = field.NewField(table, "uuid") + s.UUID = field.NewString(table, "uuid") s.Email = field.NewString(table, "email") s.Nickname = field.NewString(table, "nickname") s.Avatar = field.NewString(table, "avatar") diff --git a/server/internal/models/base/user_base.go b/server/internal/models/base/user_base.go index b32ffce..77d57bc 100644 --- a/server/internal/models/base/user_base.go +++ b/server/internal/models/base/user_base.go @@ -14,16 +14,14 @@ package base -import "github.com/gofrs/uuid" - // UserBase user base model. type UserBase struct { Model - UUID uuid.UUID `json:"uuid" gorm:"index;type:varchar(36);not null;comment:UUID"` - Email string `json:"email" gorm:"type:varchar(255);not null;unique;comment:Email"` - Nickname string `json:"nickname" gorm:"type:varchar(20);not null;comment:Nickname"` - Avatar string `json:"avatar" gorm:"type:varchar(255);not null;comment:Avatar"` - Description string `json:"description" gorm:"type:varchar(255);not null;comment:Description"` - IsEnable bool `json:"is_enable" gorm:"type:tinyint(1);not null;default:1;comment:IsEnable,1:enable,0:disable"` + UUID string `json:"uuid" gorm:"index;type:varchar(36);not null;comment:UUID"` + Email string `json:"email" gorm:"type:varchar(255);not null;unique;comment:Email"` + Nickname string `json:"nickname" gorm:"type:varchar(20);not null;comment:Nickname"` + Avatar string `json:"avatar" gorm:"type:varchar(255);not null;comment:Avatar"` + Description string `json:"description" gorm:"type:varchar(255);not null;comment:Description"` + IsEnable bool `json:"is_enable" gorm:"type:tinyint(1);not null;default:1;comment:IsEnable,1:enable,0:disable"` } diff --git a/server/internal/models/system_roles/sys_bot.go b/server/internal/models/system_roles/sys_bot.go index f1fd4eb..3b4992e 100644 --- a/server/internal/models/system_roles/sys_bot.go +++ b/server/internal/models/system_roles/sys_bot.go @@ -15,8 +15,6 @@ package systemroles import ( - "github.com/gofrs/uuid" - "github.com/OpenIMSDK/OpenKF/server/internal/models/base" ) @@ -24,7 +22,7 @@ import ( type SysBot struct { base.Model - UUID uuid.UUID `json:"uuid" gorm:"index;type:varchar(36);not null;comment:UUID"` + UUID string `json:"uuid" gorm:"index;type:varchar(36);not null;comment:UUID"` BotAddr string `gorm:"column:bot_addr;type:varchar(255);not null;comment:'AI bot address'"` BotPort int `gorm:"column:bot_port;type:int(11);not null;comment:'AI bot port'"` BotToken string `gorm:"column:bot_token;type:varchar(255);not null;comment:'AI bot token'"` diff --git a/server/internal/models/system_roles/sys_community.go b/server/internal/models/system_roles/sys_community.go index 8978b28..31a642c 100644 --- a/server/internal/models/system_roles/sys_community.go +++ b/server/internal/models/system_roles/sys_community.go @@ -15,8 +15,6 @@ package systemroles import ( - "github.com/gofrs/uuid" - "github.com/OpenIMSDK/OpenKF/server/internal/models/base" ) @@ -24,11 +22,11 @@ import ( type SysCommunity struct { base.Model - UUID uuid.UUID `gorm:"index;column:uuid;column:uuid;not null;unique;comment:'community uuid'"` - Name string `gorm:"column:name;type:varchar(64);not null;comment:'community name'"` - Email string `gorm:"column:email;type:varchar(64);not null;comment:'community email'"` - Avatar string `gorm:"column:avatar;type:varchar(255);not null;comment:'community avatar'"` - Description string `gorm:"column:description;type:varchar(255);not null;comment:'community description'"` + UUID string `gorm:"index;column:uuid;column:uuid;not null;unique;comment:'community uuid'"` + Name string `gorm:"column:name;type:varchar(64);not null;comment:'community name'"` + Email string `gorm:"column:email;type:varchar(64);not null;comment:'community email'"` + Avatar string `gorm:"column:avatar;type:varchar(255);comment:'community avatar'"` + Description string `gorm:"column:description;type:varchar(255);comment:'community description'"` } // TableName table name. diff --git a/server/internal/params/request/community.go b/server/internal/params/request/community.go index 49e9739..ecbed77 100644 --- a/server/internal/params/request/community.go +++ b/server/internal/params/request/community.go @@ -18,8 +18,8 @@ package requestparams type CommunityParams struct { Name string `json:"name" binding:"required"` Email string `json:"email" binding:"required"` - Description *string `json:"description"` // Description is optional. - Avatar *string `json:"avatar" binding:"required"` // Avatar is optional. + Description *string `json:"description"` // Description is optional. + Avatar *string `json:"avatar"` // Avatar is optional. } // GetCommunityInfoParams community info params. diff --git a/server/internal/service/bot.go b/server/internal/service/bot.go index ea6427f..b7da7b4 100644 --- a/server/internal/service/bot.go +++ b/server/internal/service/bot.go @@ -16,7 +16,6 @@ package service import ( "github.com/gin-gonic/gin" - "github.com/gofrs/uuid" "github.com/OpenIMSDK/OpenKF/server/internal/common" "github.com/OpenIMSDK/OpenKF/server/internal/config" @@ -50,14 +49,9 @@ func NewBotService(c *gin.Context) *BotService { // CreateBot create bot. func (svc *BotService) CreateBot(cid string, params *requestparams.CreateBotParams) (string, uint, error) { // Create bot - uid := utils.GenUUID() + uid := utils.GenUUIDWithoutHyphen() - // Get community id - _uuid, err := uuid.FromString(cid) - if err != nil { - return "", 0, err - } - communityInfo, err := svc.SysCommunityDao.FindFirstByUUID(_uuid) + communityInfo, err := svc.SysCommunityDao.FindFirstByUUID(cid) if err != nil { return "", 0, err } @@ -73,7 +67,7 @@ func (svc *BotService) CreateBot(cid string, params *requestparams.CreateBotPara CommunityId: communityInfo.Id, } if err = svc.SysBotDao.Create(bot); err != nil { - return uid.String(), 0, err + return uid, 0, err } b, _ := svc.SysBotDao.FindFirstByUUID(uid) @@ -83,7 +77,7 @@ func (svc *BotService) CreateBot(cid string, params *requestparams.CreateBotPara Secret: config.Config.OpenIM.Secret, Users: []request.User{ { - UserID: uid.String(), + UserID: uid, Nickname: params.Nickname, FaceURL: "", // Use OpenKF avatar }, @@ -94,10 +88,10 @@ func (svc *BotService) CreateBot(cid string, params *requestparams.CreateBotPara // Assume that the user has been created/deleted successfully _ = svc.SysBotDao.Delete(b) - return uid.String(), b.Id, err + return uid, b.Id, err } - return uid.String(), b.Id, nil + return uid, b.Id, nil } // GetCommunityBotList get community bot list. @@ -120,7 +114,7 @@ func (svc *BotService) GetCommunityBotList(cid string, params *requestparams.Lis // Fill response data for _, b := range bots { botInfos = append(botInfos, &responseparams.BotInfoResponse{ - UUID: b.UUID.String(), + UUID: b.UUID, BotAddr: b.BotAddr, BotPort: b.BotPort, BotToken: b.BotToken, @@ -144,12 +138,7 @@ func (svc *BotService) DeleteBot(uid string) error { return common.NewError(common.I_INVALID_PARAM) } - _uuid, err := uuid.FromString(uid) - if err != nil { - return err - } - - u, err := svc.SysBotDao.FindFirstByUUID(_uuid) + u, err := svc.SysBotDao.FindFirstByUUID(uid) if err != nil { return err } @@ -170,12 +159,7 @@ func (svc *BotService) UpdateBotInfo(params *requestparams.UpdateBotParams) (*re return resp, common.NewError(common.I_INVALID_PARAM) } - _uuid, err := uuid.FromString(params.UUID) - if err != nil { - return resp, err - } - - b, err := svc.SysBotDao.FindFirstByUUID(_uuid) + b, err := svc.SysBotDao.FindFirstByUUID(params.UUID) if err != nil { return resp, err } @@ -206,8 +190,8 @@ func (svc *BotService) UpdateBotInfo(params *requestparams.UpdateBotParams) (*re } // Get new info - b, _ = svc.SysBotDao.FindFirstByUUID(_uuid) - resp.UUID = b.UUID.String() + b, _ = svc.SysBotDao.FindFirstByUUID(params.UUID) + resp.UUID = b.UUID resp.BotAddr = b.BotAddr resp.BotPort = b.BotPort resp.BotToken = b.BotToken diff --git a/server/internal/service/community.go b/server/internal/service/community.go index 3b32ea2..30111c2 100644 --- a/server/internal/service/community.go +++ b/server/internal/service/community.go @@ -16,7 +16,6 @@ package service import ( "github.com/gin-gonic/gin" - "github.com/gofrs/uuid" "github.com/OpenIMSDK/OpenKF/server/internal/common" "github.com/OpenIMSDK/OpenKF/server/internal/dal/dao" @@ -45,7 +44,15 @@ func NewCommunityService(c *gin.Context) *CommunityService { // Create create community. func (svc *CommunityService) Create(community *requestparams.CommunityParams) (string, uint, error) { - uuid := utils.GenUUID() + uuid := utils.GenUUIDWithoutHyphen() + + if community.Description == nil { + *community.Description = "" + } + if community.Avatar == nil { + *community.Avatar = "" + } + data := &systemroles.SysCommunity{ UUID: uuid, Name: community.Name, @@ -57,13 +64,13 @@ func (svc *CommunityService) Create(community *requestparams.CommunityParams) (s // err := db.GetMysqlDB().Create(data).Error err := svc.SysCommunityDao.Create(data) if err != nil { - return uuid.String(), 0, err + return uuid, 0, err } // Get community id c, _ := svc.SysCommunityDao.FindFirstByUUID(uuid) - return c.UUID.String(), c.Id, nil + return c.UUID, c.Id, nil } // GetCommunityInfoById get community info by id. @@ -79,7 +86,7 @@ func (svc *CommunityService) GetCommunityInfoById(id uint) (*responseparams.Comm return resp, err } - resp.UUID = c.UUID.String() + resp.UUID = c.UUID resp.Email = c.Email resp.Avatar = c.Avatar resp.Name = c.Name @@ -96,17 +103,12 @@ func (svc *CommunityService) GetCommunityInfoByUUID(uid string) (*responseparams return resp, common.NewError(common.I_INVALID_PARAM) } - _uuid, err := uuid.FromString(uid) - if err != nil { - return resp, err - } - - c, err := svc.SysCommunityDao.FindFirstByUUID(_uuid) + c, err := svc.SysCommunityDao.FindFirstByUUID(uid) if err != nil { return resp, err } - resp.UUID = c.UUID.String() + resp.UUID = c.UUID resp.Email = c.Email resp.Avatar = c.Avatar resp.Name = c.Name @@ -121,12 +123,7 @@ func (svc *CommunityService) GetCommunityInfoByUUIDV2(uid string) (*systemroles. return nil, common.NewError(common.I_INVALID_PARAM) } - _uuid, err := uuid.FromString(uid) - if err != nil { - return nil, err - } - - c, err := svc.SysCommunityDao.FindFirstByUUID(_uuid) + c, err := svc.SysCommunityDao.FindFirstByUUID(uid) if err != nil { return nil, err } @@ -142,12 +139,7 @@ func (svc *CommunityService) UpdateCommunity(uid string, community *requestparam return resp, common.NewError(common.I_INVALID_PARAM) } - _uuid, err := uuid.FromString(uid) - if err != nil { - return resp, err - } - - info, err := svc.SysCommunityDao.FindFirstByUUID(_uuid) + info, err := svc.SysCommunityDao.FindFirstByUUID(uid) if err != nil { return resp, err } @@ -171,7 +163,7 @@ func (svc *CommunityService) UpdateCommunity(uid string, community *requestparam return resp, err } - resp.UUID = info.UUID.String() + resp.UUID = info.UUID resp.Email = info.Email resp.Avatar = info.Avatar resp.Name = info.Name diff --git a/server/internal/service/user.go b/server/internal/service/user.go index f02cf5f..0363c37 100644 --- a/server/internal/service/user.go +++ b/server/internal/service/user.go @@ -20,7 +20,6 @@ import ( "net" "github.com/gin-gonic/gin" - "github.com/gofrs/uuid" "github.com/OpenIMSDK/OpenKF/server/internal/common" "github.com/OpenIMSDK/OpenKF/server/internal/config" @@ -73,7 +72,7 @@ func (svc *UserService) CreateAdmin(user *requestparams.RegisterAdminParams) (st } // Create admin - uuid := utils.GenUUID() + uuid := utils.GenUUIDWithoutHyphen() adminParam := user.UserInfo admin := &systemroles.SysUser{ UserBase: base.UserBase{ @@ -88,7 +87,7 @@ func (svc *UserService) CreateAdmin(user *requestparams.RegisterAdminParams) (st CommunityId: cid, } if err = svc.SysUserDao.Create(admin); err != nil { - return uuid.String(), 0, err + return uuid, 0, err } u, _ := svc.SysUserDao.FindFirstByUUID(uuid) @@ -98,7 +97,7 @@ func (svc *UserService) CreateAdmin(user *requestparams.RegisterAdminParams) (st Secret: config.Config.OpenIM.Secret, Users: []request.User{ { - UserID: uuid.String(), + UserID: uuid, Nickname: adminParam.Nickname, FaceURL: "", // Use OpenKF avatar }, @@ -109,23 +108,18 @@ func (svc *UserService) CreateAdmin(user *requestparams.RegisterAdminParams) (st // Assume that the user has been created/deleted successfully _ = svc.SysUserDao.Delete(u) - return uuid.String(), u.Id, err + return uuid, u.Id, err } - return uuid.String(), u.Id, nil + return uuid, u.Id, nil } // CreateStaff create staff user. func (svc *UserService) CreateStaff(cid string, user *requestparams.RegisterStaffParams) (string, uint, error) { // Create staff - uid := utils.GenUUID() + uid := utils.GenUUIDWithoutHyphen() - // Get community id - _uuid, err := uuid.FromString(cid) - if err != nil { - return "", 0, err - } - communityInfo, err := svc.SysCommunityDao.FindFirstByUUID(_uuid) + communityInfo, err := svc.SysCommunityDao.FindFirstByUUID(cid) if err != nil { return "", 0, err } @@ -144,7 +138,7 @@ func (svc *UserService) CreateStaff(cid string, user *requestparams.RegisterStaf CommunityId: communityInfo.Id, } if err = svc.SysUserDao.Create(staff); err != nil { - return uid.String(), 0, err + return uid, 0, err } // TODO: Send email to staff @@ -156,7 +150,7 @@ func (svc *UserService) CreateStaff(cid string, user *requestparams.RegisterStaf Secret: config.Config.OpenIM.Secret, Users: []request.User{ { - UserID: uid.String(), + UserID: uid, Nickname: staffParam.Nickname, FaceURL: "", // Use OpenKF avatar }, @@ -167,10 +161,10 @@ func (svc *UserService) CreateStaff(cid string, user *requestparams.RegisterStaf // Assume that the user has been created/deleted successfully _ = svc.SysUserDao.Delete(u) - return uid.String(), u.Id, err + return uid, u.Id, err } - return uid.String(), u.Id, nil + return uid, u.Id, nil } // registerUserToOpenIM register user to openim. @@ -195,12 +189,7 @@ func (svc *UserService) DeleteStaff(uid string) error { return common.NewError(common.I_INVALID_PARAM) } - _uuid, err := uuid.FromString(uid) - if err != nil { - return err - } - - u, err := svc.SysUserDao.FindFirstByUUID(_uuid) + u, err := svc.SysUserDao.FindFirstByUUID(uid) if err != nil { return err } @@ -236,7 +225,7 @@ func (svc *UserService) LoginWithAccount(param *requestparams.LoginParamsWithAcc } // Generate KF token - kfToken, kfExpireTimeSeconds, err := internal_utils.GenerateJwtToken(u.UUID.String(), c.UUID) + kfToken, kfExpireTimeSeconds, err := internal_utils.GenerateJwtToken(u.UUID, c.UUID) if err != nil { return resp, err } @@ -244,7 +233,7 @@ func (svc *UserService) LoginWithAccount(param *requestparams.LoginParamsWithAcc // Get IM token imParam := &request.UserTokenParams{ Secret: config.Config.OpenIM.Secret, - UserID: u.UUID.String(), + UserID: u.UUID, PlatformID: uint(config.Config.OpenIM.PlatformID), } imResp, err := getUserIMToken(imParam) @@ -253,7 +242,7 @@ func (svc *UserService) LoginWithAccount(param *requestparams.LoginParamsWithAcc } // Fill response data - resp.UUID = u.UUID.String() + resp.UUID = u.UUID resp.KFToken = &responseparams.TokenResponse{ Token: kfToken, ExpireTimeSeconds: kfExpireTimeSeconds, @@ -292,17 +281,12 @@ func (svc *UserService) GetUserInfoByUUID(uid string) (*responseparams.UserInfoR return resp, common.NewError(common.I_INVALID_PARAM) } - _uuid, err := uuid.FromString(uid) - if err != nil { - return resp, err - } - - u, err := svc.SysUserDao.FindFirstByUUID(_uuid) + u, err := svc.SysUserDao.FindFirstByUUID(uid) if err != nil { return resp, err } - resp.UUID = u.UUID.String() + resp.UUID = u.UUID resp.Email = u.Email resp.Nickname = u.Nickname resp.Avatar = u.Avatar @@ -322,12 +306,7 @@ func (svc *UserService) UpdateUserInfo(uid string, params *requestparams.UpdateU return resp, common.NewError(common.I_INVALID_PARAM) } - _uuid, err := uuid.FromString(uid) - if err != nil { - return resp, err - } - - u, err := svc.SysUserDao.FindFirstByUUID(_uuid) + u, err := svc.SysUserDao.FindFirstByUUID(uid) if err != nil { return resp, err } @@ -360,8 +339,8 @@ func (svc *UserService) UpdateUserInfo(uid string, params *requestparams.UpdateU } // Get new info - u, _ = svc.SysUserDao.FindFirstByUUID(_uuid) - resp.UUID = u.UUID.String() + u, _ = svc.SysUserDao.FindFirstByUUID(uid) + resp.UUID = u.UUID resp.Email = u.Email resp.Nickname = u.Nickname resp.Avatar = u.Avatar @@ -379,12 +358,7 @@ func (svc *UserService) UpdateUserPassword(uid string, params *requestparams.Upd return common.NewError(common.I_INVALID_PARAM) } - _uuid, err := uuid.FromString(uid) - if err != nil { - return err - } - - u, err := svc.SysUserDao.FindFirstByUUID(_uuid) + u, err := svc.SysUserDao.FindFirstByUUID(uid) if err != nil { return err } @@ -423,7 +397,7 @@ func (svc *UserService) GetCommunityUserList(cid string, params *requestparams.L // Fill response data for _, u := range users { userInfos = append(userInfos, &responseparams.UserInfoResponse{ - UUID: u.UUID.String(), + UUID: u.UUID, Email: u.Email, Nickname: u.Nickname, Avatar: u.Avatar, diff --git a/server/pkg/openim/client/client.go b/server/pkg/openim/client/client.go index 1b51668..85884db 100644 --- a/server/pkg/openim/client/client.go +++ b/server/pkg/openim/client/client.go @@ -22,8 +22,8 @@ import ( // Client client. type Client interface { - GET(operationID string, params interface{}) (map[string]interface{}, error) - POST(operationID string, params interface{}) (map[string]interface{}, error) + GET(operationID, token string, params interface{}) (map[string]interface{}, error) + POST(operationID, token string, params interface{}) (map[string]interface{}, error) } // httpClient http client. @@ -41,15 +41,16 @@ func NewClient(url string) Client { } // GET get unimplemented. -func (c *httpClient) GET(operationID string, params interface{}) (map[string]interface{}, error) { +func (c *httpClient) GET(operationID, token string, params interface{}) (map[string]interface{}, error) { return nil, nil } // POST post. -func (c *httpClient) POST(operationID string, params interface{}) (map[string]interface{}, error) { +func (c *httpClient) POST(operationID, token string, params interface{}) (map[string]interface{}, error) { resp, err := c.client.R(). SetHeader("Content-Type", "application/json"). SetHeader("operationID", operationID). + SetHeader("token", token). SetBody(params). Post(c.url) if err != nil { diff --git a/server/pkg/openim/param/request/msg.go b/server/pkg/openim/param/request/msg.go new file mode 100644 index 0000000..5022e8b --- /dev/null +++ b/server/pkg/openim/param/request/msg.go @@ -0,0 +1,45 @@ +// Copyright © 2023 OpenIM open source community. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package request + +// MsgInfo msg info. +type MsgInfo struct { + SendID string `json:"sendID" binding:"required"` + RecvID string `json:"recvID" binding:"required"` + GroupID string `json:"groupID"` + SenderNickname string `json:"senderNickname"` + SenderFaceURL string `json:"senderFaceURL"` + SenderPlatformID int `json:"senderPlatformID"` + Content *TextContent `json:"content" binding:"required"` + ContentType int `json:"contentType" binding:"required"` + SessionType int `json:"sessionType" binding:"required"` + IsOnlineOnly bool `json:"isOnlineOnly"` + NotOfflinePush bool `json:"notOfflinePush"` + OfflinePushInfo *OfflinePushInfo `json:"offlinePushInfo"` +} + +// TextContent text content. +type TextContent struct { + Text string `json:"text"` +} + +// OfflinePushInfo offline push info. +type OfflinePushInfo struct { + Title string `json:"title"` + Desc string `json:"desc"` + Ex string `json:"ex"` + IOSPushSound string `json:"iOSPushSound"` + IOSBadgeCount bool `json:"iOSBadgeCount"` +} diff --git a/server/pkg/openim/param/response/response.go b/server/pkg/openim/param/response/response.go index 6e8f24a..f9edb48 100644 --- a/server/pkg/openim/param/response/response.go +++ b/server/pkg/openim/param/response/response.go @@ -16,9 +16,10 @@ package response // BaseResponse base response. type BaseResponse struct { - ErrCode uint `json:"errCode"` - ErrMsg string `json:"errMsg"` - ErrDlt string `json:"errDlt"` + ErrCode uint `json:"errCode"` + ErrMsg string `json:"errMsg"` + ErrDlt string `json:"errDlt"` + Data interface{} `json:"data"` } // UserTokenResponse user token response. diff --git a/server/pkg/openim/sdk/auth/auth.go b/server/pkg/openim/sdk/auth/auth.go index 7663fa5..a1820e0 100644 --- a/server/pkg/openim/sdk/auth/auth.go +++ b/server/pkg/openim/sdk/auth/auth.go @@ -28,13 +28,13 @@ const ( ) // GetUserToken get user token from openim server. -func GetUserToken(param *request.UserTokenParams, host string) (*response.UserTokenResponse, error) { +func GetUserToken(param *request.UserTokenParams, operationID, host string) (*response.UserTokenResponse, error) { // host: http://ip:port url := fmt.Sprintf("%s%s", host, PATH_USER_TOKEN) r := &response.UserTokenResponse{} client := client.NewClient(url) - resp, err := client.POST(PATH_USER_TOKEN, param) + resp, err := client.POST(operationID, "", param) if err != nil { return r, err } diff --git a/server/pkg/openim/sdk/auth/auth_test.go b/server/pkg/openim/sdk/auth/auth_test.go index f0bc528..48c83fe 100644 --- a/server/pkg/openim/sdk/auth/auth_test.go +++ b/server/pkg/openim/sdk/auth/auth_test.go @@ -42,7 +42,9 @@ func TestGetUserToken(t *testing.T) { Secret: data.secret, PlatformID: data.platformID, UserID: data.userID, - }, "http://127.0.0.1:10002") + }, + "123123123123", + "http://127.0.0.1:10002") if err != nil { t.Error(err) } diff --git a/server/pkg/openim/sdk/constant/type.go b/server/pkg/openim/sdk/constant/type.go new file mode 100644 index 0000000..dc6cd55 --- /dev/null +++ b/server/pkg/openim/sdk/constant/type.go @@ -0,0 +1,42 @@ +// Copyright © 2023 OpenIM open source community. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package constant + +// Platform types. +const ( + PLATFORMID_IOS = 1 + PLATFORMID_ANDROID = 2 + PLATFORMID_WINDOWS = 3 + PLATFORMID_OSX = 4 + PLATFORMID_WEB = 5 + PLATFORMID_MINIWEB = 6 + PLATFORMID_LINUX = 7 + PLATFORMID_ANDROIDPAD = 8 + PLATFORMID_IPAD = 9 +) + +// Msg types. +const ( + CONTENT_TYPE_TEXT = 101 + CONTENT_TYPE_IMAGE = 102 +) + +// Session types. +const ( + SESSION_TYPE_SINGLE_CHAT = 1 + SESSION_TYPE_GROUP_CHAT = 2 + SESSION_TYPE_LARGE_GROUP_READ_DIFFUSION = 3 + SESSION_TYPE_NOTIFY = 4 +) diff --git a/server/pkg/openim/sdk/msg/msg.go b/server/pkg/openim/sdk/msg/msg.go new file mode 100644 index 0000000..38e833e --- /dev/null +++ b/server/pkg/openim/sdk/msg/msg.go @@ -0,0 +1,54 @@ +// Copyright © 2023 OpenIM open source community. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package msg + +import ( + "errors" + "fmt" + + "github.com/OpenIMSDK/OpenKF/server/pkg/openim/client" + "github.com/OpenIMSDK/OpenKF/server/pkg/openim/param/request" + "github.com/OpenIMSDK/OpenKF/server/pkg/openim/param/response" +) + +const ( + // PATH_SEND_MSG admin send message. + PATH_SEND_MSG = "/msg/send_msg" +) + +// AdminSendMsg admin send message. +func AdminSendMsg(param *request.MsgInfo, operationID, host, adminToken string) (*response.BaseResponse, error) { + // host: http://ip:port + url := fmt.Sprintf("%s%s", host, PATH_SEND_MSG) + + r := &response.BaseResponse{} + client := client.NewClient(url) + resp, err := client.POST(operationID, adminToken, param) + if err != nil { + return r, err + } + + r.ErrCode = uint(resp["errCode"].(float64)) + r.ErrMsg = resp["errMsg"].(string) + r.ErrDlt = resp["errDlt"].(string) + + if resp["data"] == nil { + return r, errors.New("data is nil") + } + + r.Data = resp["data"] + + return r, nil +} diff --git a/server/pkg/openim/sdk/msg/msg_test.go b/server/pkg/openim/sdk/msg/msg_test.go new file mode 100644 index 0000000..ed2e233 --- /dev/null +++ b/server/pkg/openim/sdk/msg/msg_test.go @@ -0,0 +1,67 @@ +// Copyright © 2023 OpenIM open source community. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package msg + +import ( + "fmt" + "testing" + + "github.com/OpenIMSDK/OpenKF/server/pkg/openim/param/request" + "github.com/OpenIMSDK/OpenKF/server/pkg/openim/sdk/constant" +) + +// TestAdminSendMsg test admin send msg function +func TestAdminSendMsg(t *testing.T) { + adminToken := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySUQiOiJvcGVuSU1BZG1pbiIsIlBsYXRmb3JtSUQiOjEsImV4cCI6MTY5OTQyNTExMywibmJmIjoxNjkxNjQ4ODEzLCJpYXQiOjE2OTE2NDkxMTN9.JYNly2XpKkZuwZ9t4YTGki2TFst29fQYlmIFQytsoho" + + // test case + testData := []struct { + sendID string + recvID string + SenderPlatformID int + content string + contentType int + sessionType int + }{ + { + sendID: "555248a1d1409a7abb5830fdad5d", + recvID: "54c09e9a6645bad1c6657dcee887", + SenderPlatformID: constant.PLATFORMID_WEB, + content: "{\"content\":\"hello world!\"}", + contentType: constant.CONTENT_TYPE_TEXT, + sessionType: constant.SESSION_TYPE_SINGLE_CHAT, + }, + } + + // range test case + for _, data := range testData { + res, err := AdminSendMsg(&request.MsgInfo{ + SendID: data.sendID, + RecvID: data.recvID, + SenderPlatformID: data.SenderPlatformID, + Content: &request.TextContent{Text: data.content}, + ContentType: data.contentType, + SessionType: data.sessionType, + }, + "123123123123123", + "http://127.0.0.1:10002", + adminToken, + ) + if err != nil { + t.Error(err) + } + fmt.Printf("%v", res) + } +} diff --git a/server/pkg/openim/sdk/user/user.go b/server/pkg/openim/sdk/user/user.go index 6a149da..869a290 100644 --- a/server/pkg/openim/sdk/user/user.go +++ b/server/pkg/openim/sdk/user/user.go @@ -24,17 +24,17 @@ import ( const ( // PATH_USER_REGISTER register user path. - PATH_USER_REGISTER = "/auth/user_register" + PATH_USER_REGISTER = "/user/user_register" ) // RegisterUser register user. -func RegisterUser(param *request.RegisterUserParams, host string) (*response.BaseResponse, error) { +func RegisterUser(param *request.RegisterUserParams, operationID, host string) (*response.BaseResponse, error) { // host: http://ip:port url := fmt.Sprintf("%s%s", host, PATH_USER_REGISTER) r := &response.BaseResponse{} client := client.NewClient(url) - resp, err := client.POST(PATH_USER_REGISTER, param) + resp, err := client.POST(operationID, "", param) if err != nil { return r, err } diff --git a/server/pkg/openim/sdk/user/user_test.go b/server/pkg/openim/sdk/user/user_test.go index 6b55b50..3f83d99 100644 --- a/server/pkg/openim/sdk/user/user_test.go +++ b/server/pkg/openim/sdk/user/user_test.go @@ -49,7 +49,9 @@ func TestRegisterUser(t *testing.T) { FaceURL: data.faceURL, }, }, - }, "http://127.0.0.1:10002") + }, + "123123123", + "http://127.0.0.1:10002") if err != nil { t.Error(err) } diff --git a/server/pkg/utils/uuid.go b/server/pkg/utils/uuid.go index 7e92fe3..16b6447 100644 --- a/server/pkg/utils/uuid.go +++ b/server/pkg/utils/uuid.go @@ -14,9 +14,47 @@ package utils -import "github.com/gofrs/uuid" +import ( + "fmt" + + "github.com/gofrs/uuid" +) // GenUUID generate uuid. -func GenUUID() uuid.UUID { - return uuid.Must(uuid.NewV4()) +func GenUUID() string { + return uuid.Must(uuid.NewV4()).String() +} + +// GenUUIDWithoutHyphen generate uuid without hyphen. +func GenUUIDWithoutHyphen() string { + return toString(uuid.Must(uuid.NewV4())) +} + +// encodeCanonical encodes the canonical RFC-4122 form of UUID u into the +// first 36 bytes dst. +func encodeCanonical(dst []byte, u uuid.UUID) { + const hextable = "0123456789abcdef" + dst[8] = '-' + dst[13] = '-' + dst[18] = '-' + dst[23] = '-' + for i, x := range [16]byte{ + 0, 2, 4, 6, + 9, 11, + 14, 16, + 19, 21, + 24, 26, 28, 30, 32, 34, + } { + c := u[i] + dst[x] = hextable[c>>4] + dst[x+1] = hextable[c&0x0f] + } +} + +// String returns a canonical RFC-4122 string representation of the UUID: +// xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, but delete separator -. +func toString(u uuid.UUID) string { + var buf [36]byte + encodeCanonical(buf[:], u) + return fmt.Sprintf("%s%s%s%s%s", buf[0:7], buf[9:12], buf[14:17], buf[19:22], buf[24:]) } From 43a9d529c33a49edbe7c4f4316390150a0a3b60b Mon Sep 17 00:00:00 2001 From: IRONICBo <47499836+IRONICBo@users.noreply.github.com> Date: Thu, 10 Aug 2023 15:43:53 +0800 Subject: [PATCH 3/4] fix: Update sdk params. Signed-off-by: IRONICBo <47499836+IRONICBo@users.noreply.github.com> --- server/internal/service/user.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/server/internal/service/user.go b/server/internal/service/user.go index 0363c37..a2e4f94 100644 --- a/server/internal/service/user.go +++ b/server/internal/service/user.go @@ -169,9 +169,11 @@ func (svc *UserService) CreateStaff(cid string, user *requestparams.RegisterStaf // registerUserToOpenIM register user to openim. func registerUserToOpenIM(param *request.RegisterUserParams) (bool, error) { + // TODO: Add get operationID + // Default not use tls/ssl host := fmt.Sprintf("http://%s", net.JoinHostPort(config.Config.OpenIM.Ip, fmt.Sprintf("%d", config.Config.OpenIM.ApiPort))) - resp, err := user.RegisterUser(param, host) + resp, err := user.RegisterUser(param, "registerUserToOpenIM", host) if err != nil { return false, err } @@ -259,9 +261,11 @@ func (svc *UserService) LoginWithAccount(param *requestparams.LoginParamsWithAcc // getUserIMToken get user im token. func getUserIMToken(param *request.UserTokenParams) (*response.TokenData, error) { + // TODO: Add operationID + // Default not use tls/ssl host := fmt.Sprintf("http://%s", net.JoinHostPort(config.Config.OpenIM.Ip, fmt.Sprintf("%d", config.Config.OpenIM.ApiPort))) - resp, err := auth.GetUserToken(param, host) + resp, err := auth.GetUserToken(param, "getUserIMToken", host) if err != nil { return &response.TokenData{}, err } From cb343ab3328ac42e976dfdd3f7b9344eb3ab463f Mon Sep 17 00:00:00 2001 From: IRONICBo <47499836+IRONICBo@users.noreply.github.com> Date: Fri, 11 Aug 2023 15:16:04 +0800 Subject: [PATCH 4/4] feat: Interact with OpenIM Server 3.1. Signed-off-by: IRONICBo <47499836+IRONICBo@users.noreply.github.com> --- web/.eslintrc.js | 1 + web/package-lock.json | 8 +- web/package.json | 2 +- web/src/api/request/communityModel.ts | 1 + web/src/api/request/openimModel.ts | 4 +- web/src/store/index.ts | 2 + web/src/store/menu/index.ts | 9 +- web/src/store/openim_message/index.ts | 75 +++++++ web/src/store/openim_session/index.ts | 63 ++++++ web/src/store/user/index.ts | 27 ++- web/src/utils/common/im.ts | 37 ++++ web/src/utils/common/time.ts | 14 ++ web/src/utils/request/index.ts | 2 +- web/src/views/config/components/BotTable.vue | 2 +- .../views/config/components/ConfigForm.vue | 8 +- .../views/config/components/ConfigList.vue | 30 ++- .../views/config/components/GroupTable.vue | 2 +- .../config/components/KnowledgeBaseTable.vue | 2 +- web/src/views/config/index.less | 6 + .../views/dashboard/components/MemberCard.vue | 2 +- web/src/views/dashboard/index.vue | 10 +- .../layouts/components/LayoutSideNav.vue | 16 +- web/src/views/layouts/im.ts | 110 ++++++++++ web/src/views/layouts/index.vue | 50 +++++ web/src/views/login/components/LoginForm.vue | 7 +- .../views/login/components/RegisterForm.vue | 3 +- web/src/views/platform/index.vue | 4 +- .../views/session/components/SessionList.vue | 102 ++++----- .../session/components/SessionWindow.vue | 195 +++++++++++------- web/src/views/session/index.less | 17 ++ web/src/views/session/index.vue | 15 +- 31 files changed, 666 insertions(+), 160 deletions(-) create mode 100644 web/src/store/openim_message/index.ts create mode 100644 web/src/store/openim_session/index.ts create mode 100644 web/src/utils/common/im.ts create mode 100644 web/src/views/layouts/im.ts diff --git a/web/.eslintrc.js b/web/.eslintrc.js index be197c6..5ec1698 100644 --- a/web/.eslintrc.js +++ b/web/.eslintrc.js @@ -48,5 +48,6 @@ module.exports = { 'vue/multi-word-component-names': 'off', 'vue/comment-directive': 'off', 'no-async-promise-executor': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', }, }; diff --git a/web/package-lock.json b/web/package-lock.json index 92d7713..c563151 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -12,7 +12,7 @@ "echarts": "^5.4.2", "less-loader": "^11.1.3", "lodash": "^4.17.21", - "open-im-sdk-wasm": "^0.1.1", + "open-im-sdk-wasm": "^3.1.0", "pinia": "^2.1.4", "pinia-plugin-persistedstate": "^3.1.0", "qs": "^6.11.2", @@ -2865,9 +2865,9 @@ } }, "node_modules/open-im-sdk-wasm": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/open-im-sdk-wasm/-/open-im-sdk-wasm-0.1.1.tgz", - "integrity": "sha512-I12XLvP2YwaPPWUCTaOCkqoRuqEx3A1aMvS2f9ouzCMtiFa6FRDLT7koVIri2+XtM8MmEB1XZAxwt3jYBb22gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/open-im-sdk-wasm/-/open-im-sdk-wasm-3.1.0.tgz", + "integrity": "sha512-Q1VpRCfV6vUrpZKzL/G351zsLeRxByV6FecKWB4blHzJEhXVH47DxbHjXduOs4MU0IcYYRqXiQseiVLsYHUKkQ==", "dependencies": { "@jlongster/sql.js": "^1.6.7", "absurd-sql": "^0.0.53", diff --git a/web/package.json b/web/package.json index 30b378e..67454ee 100644 --- a/web/package.json +++ b/web/package.json @@ -14,7 +14,7 @@ "echarts": "^5.4.2", "less-loader": "^11.1.3", "lodash": "^4.17.21", - "open-im-sdk-wasm": "^0.1.1", + "open-im-sdk-wasm": "^3.1.0", "pinia": "^2.1.4", "pinia-plugin-persistedstate": "^3.1.0", "qs": "^6.11.2", diff --git a/web/src/api/request/communityModel.ts b/web/src/api/request/communityModel.ts index 2b3329d..5614768 100644 --- a/web/src/api/request/communityModel.ts +++ b/web/src/api/request/communityModel.ts @@ -2,6 +2,7 @@ export interface CommunityInfo { avatar: string; name: string; email: string; + description: string; } export type CreateCommunityParam = CommunityInfo; diff --git a/web/src/api/request/openimModel.ts b/web/src/api/request/openimModel.ts index bd143e2..87812bc 100644 --- a/web/src/api/request/openimModel.ts +++ b/web/src/api/request/openimModel.ts @@ -1,3 +1,3 @@ -import { LoginParam } from '@/utils/open-im-sdk-wasm/types/params'; +import { InitAndLoginConfig } from '@/utils/open-im-sdk-wasm/types/params'; -export type IMLoginParam = LoginParam; +export type IMLoginParam = InitAndLoginConfig; diff --git a/web/src/store/index.ts b/web/src/store/index.ts index 7f62c9a..7e14ee2 100644 --- a/web/src/store/index.ts +++ b/web/src/store/index.ts @@ -8,5 +8,7 @@ export { store }; export * from './menu'; export * from './user'; +export * from './openim_session'; +export * from './openim_message'; export default store; diff --git a/web/src/store/menu/index.ts b/web/src/store/menu/index.ts index 31b6002..9f6185a 100644 --- a/web/src/store/menu/index.ts +++ b/web/src/store/menu/index.ts @@ -2,6 +2,7 @@ import { defineStore } from 'pinia'; import usePermissionStore from '@/store'; import type { MenuRoute } from '@/types/interface' import type { MenuInfoResponse } from '@/api/response/menuModel'; +import store from "../index"; const MockMenuInfo: MenuInfoResponse[] = [ { @@ -36,7 +37,7 @@ const MockMenuInfo: MenuInfoResponse[] = [ } ] -export const useMenuStore = defineStore('menu', { +const useStore = defineStore('menu', { state: () => ({ menu_routes: MockMenuInfo, }), @@ -46,4 +47,8 @@ export const useMenuStore = defineStore('menu', { // TODO: fetch menu info } } -}); \ No newline at end of file +}); + +export default function useMenuStore() { + return useStore(store); +} diff --git a/web/src/store/openim_message/index.ts b/web/src/store/openim_message/index.ts new file mode 100644 index 0000000..a441bce --- /dev/null +++ b/web/src/store/openim_message/index.ts @@ -0,0 +1,75 @@ +import { OpenIM } from '@/api/openim'; +import { MessageItem } from "open-im-sdk-wasm/lib/types/entity"; +import { GetAdvancedHistoryMsgParams } from "open-im-sdk-wasm/lib/types/params"; +import { defineStore } from "pinia"; +import store from "../index"; + +interface StateType { + historyMessageList: MessageItem[]; + hasMore: boolean; +} + +interface IAdvancedMessageResponse { + lastMinSeq: number; + isEnd: boolean; + messageList: MessageItem[]; +} + +type GetHistoryMessageListFromReqResp = { + messageIDList: string[]; + lastMinSeq: number; +}; + +const useStore = defineStore("message", { + state: (): StateType => ({ + historyMessageList: [], + hasMore: true, + }), + getters: { + storeHistoryMessageList: (state) => state.historyMessageList, + storeHistoryMessageHasMore: (state) => state.hasMore, + }, + actions: { + async getHistoryMessageListFromReq( + params: GetAdvancedHistoryMsgParams + ): Promise { + const isFirstPage = + params.startClientMsgID === "" || params.lastMinSeq === 0; + try { + const { data } = await OpenIM.getAdvancedHistoryMessageList(params); + this.historyMessageList = [ + ...data.messageList, + ...(isFirstPage ? [] : this.historyMessageList), + ]; + this.hasMore = !data.isEnd && data.messageList.length === 20; + return { + messageIDList: data.messageList.map( + (message: MessageItem) => message.clientMsgID + ), + lastMinSeq: data.lastMinSeq, + }; + } catch (error) { + console.log("Get history message failed", error); + this.hasMore = false; + return { + messageIDList: [], + lastMinSeq: 0, + }; + } + }, + pushNewMessage(message: MessageItem) { + this.historyMessageList.push(message); + }, + clearHistoryMessage() { + this.historyMessageList = []; + }, + resetHistoryMessageList() { + this.historyMessageList = []; + this.hasMore = true; + }, + }, +}); + +export default function useMessageStore() { + return useStore(store); +} diff --git a/web/src/store/openim_session/index.ts b/web/src/store/openim_session/index.ts new file mode 100644 index 0000000..9b909b6 --- /dev/null +++ b/web/src/store/openim_session/index.ts @@ -0,0 +1,63 @@ +import { OpenIM } from '@/api/openim'; +import { + ConversationItem, +} from "@/utils/open-im-sdk-wasm/types/entity"; + +import { defineStore } from "pinia"; +import store from "../index"; + +interface StateType { + conversationList: ConversationItem[]; + currentConversation: ConversationItem; + unReadCount: number; +} + +const useStore = defineStore("session", { + state: (): StateType => ({ + conversationList: [], + currentConversation: {} as ConversationItem, + unReadCount: 0, + }), + getters: { + storeConversationList: (state) => state.conversationList, + storeCurrentConversation: (state) => state.currentConversation, + storeUnReadCount: (state) => state.unReadCount, + }, + actions: { + async getConversationListFromReq(): Promise { + try { + const { data } = await OpenIM.getAllConversationList(); + this.conversationList = data; + console.log('getConversationListFromReq', data); + return true; + } catch (error) { + return false; + } + }, + async getUnReadCountFromReq() { + const { data } = await OpenIM.getTotalUnreadMsgCount(); + this.unReadCount = data; + }, + updateUnReadCount(data: number) { + this.unReadCount = data; + }, + updateCurrentConversation(item: ConversationItem) { + this.currentConversation = { ...item }; + }, + updateConversationList(list: ConversationItem[]) { + this.conversationList = [...list]; + }, + delConversationByCID(conversationID: string) { + const idx = this.conversationList.findIndex( + (cve) => cve.conversationID === conversationID + ); + if (idx !== -1) { + this.conversationList.splice(idx, 1); + } + }, + }, +}); + +export default function useSessionStore() { + return useStore(store); +} diff --git a/web/src/store/user/index.ts b/web/src/store/user/index.ts index 53ab7c5..050e69b 100644 --- a/web/src/store/user/index.ts +++ b/web/src/store/user/index.ts @@ -7,6 +7,7 @@ import type { GetCommunityInfoResponse } from '@/api/response/communityModel'; import { defineStore } from 'pinia'; import { getMyCommunityInfo } from '@/api/index/community'; import { getMyInfo } from '@/api/index/user'; +import store from "../index"; const InitUserInfo: GetUserInfoResponse = { uuid: '', @@ -28,14 +29,23 @@ const InitCommunityInfo: GetCommunityInfoResponse = { }; const InitToken: TokenResponse = { - token: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX3V1aWQiOiI5NmUwNGQ5Mi1mZTkwLTRmMGEtYWU4MC1hZTg4YWRmNWY2ZGIiLCJjb21tdW5pdHlfdXVpZCI6ImNmZjkxMjEwLWE5MGEtNGNjYi04MmI3LWI1MzU2M2E3NzkxOSIsImlzcyI6Im9wZW5rZiIsImV4cCI6MTY5MTMxOTM3OCwibmJmIjoxNjkxMjMyOTc4fQ.PaCXrxjP_WyJSY8yishU5jCouRZ1cgpVrh5OSMVBnh0', + token: '', expire_time_seconds: 0, }; -export const useUserStore = defineStore('user', { +const InitKFToken: TokenResponse = { + token: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX3V1aWQiOiI1NTUyNDhhMWQxNDA5YTdhYmI1ODMwZmRhZDVkIiwiY29tbXVuaXR5X3V1aWQiOiI4NjNiOTExMjdmNGYwODhlZDQ2MjZjMzU3MTYyIiwiaXNzIjoib3BlbmtmIiwiZXhwIjoxNjkxNzI5MzgwLCJuYmYiOjE2OTE2NDI5ODB9.JomPDoVlrRYHWr03yIWqHbPaIQfuXdACEkhw4Ccwm0c', + expire_time_seconds: 0, +}; +const InitIMToken: TokenResponse = { + token: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySUQiOiI1NTUyNDhhMWQxNDA5YTdhYmI1ODMwZmRhZDVkIiwiUGxhdGZvcm1JRCI6NSwiZXhwIjoxNjk5NDE4OTgwLCJuYmYiOjE2OTE2NDI2ODAsImlhdCI6MTY5MTY0Mjk4MH0.btYIWiNc21o7sowLddv-6k9qEKQdiWlTFnQraX3eAYE', + expire_time_seconds: 0, +}; + +const useStore = defineStore('user', { state: () => ({ - kf_token: { ...InitToken }, - im_token: { ...InitToken }, + kf_token: { ...InitKFToken }, + im_token: { ...InitIMToken }, userInfo: { ...InitUserInfo }, communityInfo: { ...InitCommunityInfo }, }), @@ -50,7 +60,7 @@ export const useUserStore = defineStore('user', { const [userInfo, communityInfo] = await Promise.all([ getMyInfo() .then(res => { - console.log('getMyInfo success', res); + // console.log('getMyInfo success', res); return res; }) .catch(res => { @@ -59,7 +69,7 @@ export const useUserStore = defineStore('user', { }), // if error, set to default value getMyCommunityInfo() .then(res => { - console.log('getMyCommunityInfo success', res); + // console.log('getMyCommunityInfo success', res); return res; }) .catch(res => { @@ -78,3 +88,8 @@ export const useUserStore = defineStore('user', { }, }, }); + +export default function useUserStore() { + return useStore(store); + } + \ No newline at end of file diff --git a/web/src/utils/common/im.ts b/web/src/utils/common/im.ts new file mode 100644 index 0000000..f33ff83 --- /dev/null +++ b/web/src/utils/common/im.ts @@ -0,0 +1,37 @@ +import { + ConversationItem, +} from "@/utils/open-im-sdk-wasm/types/entity"; + +export const conversationSort = (conversationList: ConversationItem[]) => { + const arr: string[] = []; + const filterArr = conversationList.filter( + (c) => !arr.includes(c.conversationID) && arr.push(c.conversationID) + ); + filterArr.sort((a, b) => { + if (a.isPinned === b.isPinned) { + if (!(a.latestMsgSendTime && b.latestMsgSendTime)) { + return 0; + } + const aCompare = + a.draftTextTime! > a.latestMsgSendTime! + ? a.draftTextTime! + : a.latestMsgSendTime!; + const bCompare = + b.draftTextTime! > b.latestMsgSendTime! + ? b.draftTextTime! + : b.latestMsgSendTime!; + if (aCompare > bCompare) { + return -1; + } else if (aCompare < bCompare) { + return 1; + } else { + return 0; + } + } else if (a.isPinned && !b.isPinned) { + return -1; + } else { + return 1; + } + }); + return filterArr; +}; \ No newline at end of file diff --git a/web/src/utils/common/time.ts b/web/src/utils/common/time.ts index 438d5e8..f9c3794 100644 --- a/web/src/utils/common/time.ts +++ b/web/src/utils/common/time.ts @@ -43,4 +43,18 @@ export const getNowDiffDays = (date: string): number => { const diffTime = Math.abs(new Date(date).getTime() - new Date().getTime()); const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); return diffDays; +} + +// Return a time from date +// if date is today, return time +// if date is yesterday, return yesterday +// if date is before yesterday, return date +export const getTimeFromDate = (timestamp: number | string): string => { + const dat = new Date(timestamp); + const diffDays = getNowDiffDays(dat.toString()); + if (diffDays === 0) { + return dat.getHours() + ':' + dat.getMinutes(); + } else { + return dat.getDate() + '/' + (dat.getMonth() + 1) + '/' + dat.getFullYear(); + } } \ No newline at end of file diff --git a/web/src/utils/request/index.ts b/web/src/utils/request/index.ts index 33c6aee..0852f5a 100644 --- a/web/src/utils/request/index.ts +++ b/web/src/utils/request/index.ts @@ -7,7 +7,7 @@ import { ContentTypeEnum } from '@/constants'; import { VAxios } from './axios'; import type { AxiosTransform, CreateAxiosOptions } from './transform'; import { formatRequestDate, joinTimestamp, setObjToUrlParams } from './utils'; -import { useUserStore } from '@/store'; +import useUserStore from '@/store/user'; // Default API url const host = import.meta.env.VITE_API_URL; diff --git a/web/src/views/config/components/BotTable.vue b/web/src/views/config/components/BotTable.vue index 59198e8..3dd84e1 100644 --- a/web/src/views/config/components/BotTable.vue +++ b/web/src/views/config/components/BotTable.vue @@ -197,7 +197,7 @@ const COLUMNS: PrimaryTableCol[] = [ >