作者 tangxvhui

Merge branch 'dev' into test

... ... @@ -6,6 +6,8 @@ ARG PROJECT=core
WORKDIR /build
COPY . .
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk update --no-cache && apk add --no-cache tzdata
RUN go env -w GO111MODULE=on \
&& go env -w GOPROXY=https://goproxy.cn,direct \
&& go env -w CGO_ENABLED=0 \
... ... @@ -28,7 +30,9 @@ LABEL org.opencontainers.image.authors=${AUTHOR}
WORKDIR /app
ENV PROJECT=${PROJECT}
ENV CONFIG_FILE=${CONFIG_FILE}
ENV TZ Asia/Shanghai
COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /usr/share/zoneinfo/Asia/Shanghai
COPY --from=builder /build/api/${PROJECT} ./
COPY --from=builder /build/cmd/discuss/api/etc/${CONFIG_FILE} ./etc/
... ...
... ... @@ -2,6 +2,7 @@
### 测试环境
服务端域名 http://sumifcc-discuss-test.sumifcc.com/
日志地址 https://sumifcc-discuss-test.sumifcc.com/v1/log/access
### 可设置环境变量
- DataSource
... ...
... ... @@ -33,12 +33,17 @@ func main() {
// 服务初始化
opts := make([]rest.RunOption, 0)
opt := rest.WithCustomCors(func(header http.Header) {
opts = append(opts, rest.WithCustomCors(func(header http.Header) {
header.Set("Access-Control-Allow-Headers", "*")
}, func(writer http.ResponseWriter) {
})
opts = append(opts, opt)
}))
opts = append(opts, rest.WithUnauthorizedCallback(func(w http.ResponseWriter, r *http.Request, err error) {
if err != nil {
logx.Debugf("unauthorized: %s \n", err.Error())
}
}))
server := rest.MustNewServer(c.RestConf, opts...)
defer server.Stop()
ctx := svc.NewServiceContext(c)
... ... @@ -73,6 +78,7 @@ func systemSetup(c config.Config) {
httpx.SetErrorHandlerCtx(func(ctx context.Context, err error) (int, any) {
return http.StatusOK, result.Error(xerr.ServerCommonError, err.Error())
})
// 系统成功应答包装
httpx.SetOkHandler(func(ctx context.Context, a any) any {
return result.Success(a)
... ...
... ... @@ -504,11 +504,11 @@ type (
Size int `json:"size"`
CompanyId int64 `json:",optional"`
UserId int64 `json:",optional"`
TagCategory string `json:"tagCategory"`
TagId int64 `json:"tagId"`
BeginTime int64 `json:"beginTime"`
EndTime int64 `json:"endTime"`
SearchWord string `json:"searchWord"`
TagCategory string `json:"tagCategory,optional"`
TagId int64 `json:"tagId,optional"`
BeginTime int64 `json:"beginTime,optional"`
EndTime int64 `json:"endTime,optional"`
SearchWord string `json:"searchWord,optional"`
}
//
MiniSearchArticleResponse {
... ...
... ... @@ -10,13 +10,17 @@ info(
// 通用接口
@server(
prefix: v1/common
prefix: v1
group: common
)
service Core {
@doc "短信验证码"
@handler commonSmsCode
post /sms/code (CommonSmsCodeRequest) returns (CommonSmsCodeResposne)
post /common/sms/code (CommonSmsCodeRequest) returns (CommonSmsCodeResposne)
@doc "日志查询"
@handler commonGetLog
get /log/:module
}
// 短信验证码
... ...
... ... @@ -91,14 +91,14 @@ type(
Success bool `json:"success"` // 成功标识
}
MiniUserSwitchAccountRequest{
CompanyId int64 `json:"companyId"`
CompanyId int64 `json:"companyId,string"`
}
MiniUserInfoRequest {
//MyStatisticsFlag bool `json:"myStatisticsFlag"` // true:返回统计信息 false;统计信息不返回
}
MiniUserInfoResponse {
User *UserItem `json:"user,omitempty"` // 用户信息
User *UserItem `json:"user,omitempty"` // 用户信息
Accounts []Account `json:"accounts"` // 公司账号
Auths []Auth `json:"auths"` // 权限列表
}
... ... @@ -108,7 +108,7 @@ type(
IsFromQr bool `json:"isFromQr,optional"` // true:扫码添加 false:手动查找添加
}
MiniUserApplyJoinCompanyResponse{
Token string `json:"token"` // x-token
}
MiniUserAuditRequest{
UserId int64 `json:"userId"` // 用户ID
... ... @@ -157,9 +157,10 @@ type(
UserItem {
Id int64 `json:"id,omitempty"` // 用户ID
CompanyId int64 `json:"companyId,omitempty"` // 公司ID
CompanyId int64 `json:"companyId,string,omitempty"` // 公司ID
CompanyName string `json:"companyName,omitempty"` // 公司名称
CompanyCode string `json:"companyCode,omitempty"` // 公司编码(邀请码)
CompanyLogo *string `json:"companyLogo,omitempty"` // 公司LOGO
//DepartmentId int64 `json:"departmentId,omitempty"` // 部门ID
//Roles []int64 `json:"roleId,omitempty"` // 角色
Flag int `json:"flag,omitempty"` // 标识 1:管理员 2:普通用户 (有绑定角色是管理员)
... ... @@ -175,7 +176,7 @@ type(
AccountFrom string `json:"accountFrom,omitempty"` // 账号来源 后台新增、扫码注册
}
Account {
CompanyId int64 `json:"companyId"` // 公司ID
CompanyId int64 `json:"companyId,string"` // 公司ID
CompanyName string `json:"companyName"` // 公司名称
Logo string `json:"logo"` // 公司图标
UserId int64 `json:"userId"` // 用户ID
... ...
Name: discuss
Host: 0.0.0.0
Port: 8081
Verbose: true
Verbose: false
Migrate: false
Timeout: 30000
# CertFile: ./key/fjmaimaimai.com_bundle.crt
... ... @@ -11,7 +11,8 @@ Log:
Encoding: plain
Level: debug # info
MaxSize: 1 # 2MB
TimeFormat: 2006-01-02 15:04:05.000
TimeFormat: 2006-01-02 15:04:05
#Rotation: size
SystemAuth:
AccessSecret: digital-platform
... ... @@ -32,3 +33,7 @@ ApiAuth:
Name: ApiAuth
Host: http://digital-platform-dev.fjmaimaimai.com
Timeout: 0s
Wechat:
AppID: wxae5b305849343ec8
AppSecret: f584adb68f7d784425b60e1ebb2ffd4b
\ No newline at end of file
... ...
... ... @@ -10,11 +10,12 @@ import (
type Config struct {
rest.RestConf
config.Config
Redis redis.RedisConf `json:",optional"`
SystemAuth config.Auth
MiniAuth config.Auth
Migrate bool `json:",optional,default=true"`
ApiAuth ApiService
Redis redis.RedisConf `json:",optional"`
SystemAuth config.Auth
MiniAuth config.Auth
Migrate bool `json:",optional,default=true"`
ApiAuth ApiService
DebugSmsCode string `json:",optional,default=999512"`
}
type ApiService struct {
... ...
package common
import (
"net/http"
"path/filepath"
"strings"
"github.com/zeromicro/go-zero/rest/httpx"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
)
func CommonGetLogHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req struct {
Module string `path:"module"`
}
if err := httpx.Parse(r, &req); err != nil {
httpx.ErrorCtx(r.Context(), w, err)
return
}
path := svcCtx.Config.Log.Path
if svcCtx.Config.Log.Mode != "file" {
return
}
if path == "" {
path = "logs"
}
if !strings.HasSuffix(req.Module, ".log") {
req.Module += ".log"
}
handler := http.FileServer(http.Dir(path))
r.URL.Path = filepath.Join(req.Module)
handler.ServeHTTP(w, r)
}
}
... ...
... ... @@ -23,11 +23,16 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
[]rest.Route{
{
Method: http.MethodPost,
Path: "/sms/code",
Path: "/common/sms/code",
Handler: common.CommonSmsCodeHandler(serverCtx),
},
{
Method: http.MethodGet,
Path: "/log/:module",
Handler: common.CommonGetLogHandler(serverCtx),
},
},
rest.WithPrefix("/v1/common"),
rest.WithPrefix("/v1"),
)
server.AddRoutes(
... ...
package common
import (
"context"
"github.com/zeromicro/go-zero/core/logx"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
)
type CommonGetLogLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewCommonGetLogLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CommonGetLogLogic {
return &CommonGetLogLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *CommonGetLogLogic) CommonGetLog() error {
// todo: add your logic here and delete this line
return nil
}
... ...
... ... @@ -32,7 +32,9 @@ func (l *MiniBusinessLogic) MiniBusiness(req *types.MessageRequest, msgType doma
total, list, err := l.svcCtx.MessageBusinessRepository.Find(l.ctx, conn, domain.NewQueryOptions().
WithOffsetLimit(req.Page, req.Size).
WithKV("type", msgType))
WithKV("type", msgType).
WithKV("companyId", userToken.CompanyId).
WithKV("recipientId", userToken.UserId))
if err != nil {
return nil, err
}
... ...
package message
import (
"context"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
type MiniCommentLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewMiniCommentLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MiniCommentLogic {
return &MiniCommentLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *MiniCommentLogic) MiniComment(req *types.MessageRequest) (resp *types.MessageBusinessResponse, err error) {
// todo: add your logic here and delete this line
return
}
... ...
package message
import (
"context"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
type MiniLikeLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewMiniLikeLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MiniLikeLogic {
return &MiniLikeLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *MiniLikeLogic) MiniLike(req *types.MessageRequest) (resp *types.MessageBusinessResponse, err error) {
// todo: add your logic here and delete this line
return
}
... ...
... ... @@ -35,6 +35,7 @@ func (l *MiniUserApplyJoinCompanyLogic) MiniUserApplyJoinCompany(req *types.Mini
company *domain.Company
user *domain.User
name = fmt.Sprintf("用户%s", tool.Krand(6, tool.KC_RAND_KIND_NUM))
token string
)
if company, err = l.svcCtx.CompanyRepository.FindOneByCode(l.ctx, conn, req.Code); err != nil {
return nil, xerr.NewErrMsgErr("公司不存在", err)
... ... @@ -48,12 +49,14 @@ func (l *MiniUserApplyJoinCompanyLogic) MiniUserApplyJoinCompany(req *types.Mini
return nil, xerr.NewErrMsgErr("申请失败", err)
}
if user != nil {
if user.AuditStatus == domain.UserAuditStatusWait {
return nil, xerr.NewErrMsgErr("已申请,待审核中", err)
token, err = generateToken(l.svcCtx, user)
if err != nil {
return nil, xerr.NewErrMsgErr("登录失败", err)
}
if user.AuditStatus == domain.UserAuditStatusPassed {
return nil, xerr.NewErrMsgErr("公司已申请", err)
resp = &types.MiniUserApplyJoinCompanyResponse{
Token: token,
}
return
}
queryOptions := domain.NewQueryOptions().
WithOffsetLimit(1, 1).
... ... @@ -87,6 +90,12 @@ func (l *MiniUserApplyJoinCompanyLogic) MiniUserApplyJoinCompany(req *types.Mini
}, true); err != nil {
return nil, xerr.NewErrMsgErr("申请失败", err)
}
resp = &types.MiniUserApplyJoinCompanyResponse{}
token, err = generateToken(l.svcCtx, user)
if err != nil {
return nil, xerr.NewErrMsgErr("登录失败", err)
}
resp = &types.MiniUserApplyJoinCompanyResponse{
Token: token,
}
return
}
... ...
... ... @@ -2,6 +2,7 @@ package user
import (
"context"
"github.com/samber/lo"
"github.com/zeromicro/go-zero/core/collection"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
... ... @@ -45,10 +46,12 @@ func (l *MiniUserInfoLogic) MiniUserInfo(req *types.MiniUserInfoRequest) (resp *
resp = &types.MiniUserInfoResponse{
User: &types.UserItem{
Id: user.Id,
Name: user.Name,
Avatar: user.Avatar,
Position: user.Position,
Id: user.Id,
Name: user.Name,
Avatar: user.Avatar,
Position: user.Position,
AuditStatus: lo.ToPtr(user.AuditStatus),
Enable: user.Enable,
},
Accounts: make([]types.Account, 0),
Auths: make([]types.Auth, 0),
... ... @@ -56,6 +59,7 @@ func (l *MiniUserInfoLogic) MiniUserInfo(req *types.MiniUserInfoRequest) (resp *
if company, _ := domain.LazyLoad(companyMap, l.ctx, conn, user.CompanyId, l.svcCtx.CompanyRepository.FindOne); company != nil {
resp.User.CompanyName = company.Name
resp.User.CompanyCode = company.Code
resp.User.CompanyLogo = lo.ToPtr(company.Logo)
}
_, accounts, err = l.svcCtx.UserRepository.Find(l.ctx, conn, domain.NewQueryOptions().MustWithKV("phone", user.Phone).MustWithKV("auditStatus", []int{domain.UserAuditStatusPassed}))
if err != nil {
... ...
... ... @@ -50,16 +50,28 @@ func (l *MiniUserLoginLogic) MiniUserLogin(req *types.MiniUserLoginRequest) (res
if err != nil {
return
}
if loginInfo.User == nil {
return nil, xerr.NewErrMsgErr("用户不存在", err)
}
var userJwtToken = tool.UserToken{}
if loginInfo.User != nil {
userJwtToken.UserId = loginInfo.User.Id
userJwtToken.CompanyId = loginInfo.User.CompanyId
userJwtToken.ClientType = "mini"
var users []*domain.User
conn := l.svcCtx.DefaultDBConn()
_, users, err = l.svcCtx.UserRepository.Find(l.ctx, conn, domain.NewQueryOptions().
MustWithKV("phone", loginInfo.Phone).
MustWithKV("auditStatus", []int{domain.UserAuditStatusWait, domain.UserAuditStatusPassed}).
WithFindOnly())
if err != nil {
return nil, err
}
token, err = userJwtToken.GenerateToken(l.svcCtx.Config.MiniAuth.AccessSecret, l.svcCtx.Config.MiniAuth.AccessExpire)
if len(users) > 0 {
for _, user := range users {
if user.Enable == domain.UserEnable && user.AuditStatus == domain.UserAuditStatusPassed {
loginInfo.User = user
break
}
}
if loginInfo.User == nil {
loginInfo.User = users[0]
}
}
token, err = generateToken(l.svcCtx, loginInfo.User)
if err != nil {
return nil, xerr.NewErrMsgErr("登录失败", err)
}
... ... @@ -69,17 +81,35 @@ func (l *MiniUserLoginLogic) MiniUserLogin(req *types.MiniUserLoginRequest) (res
Success: true,
}
if loginInfo.User == nil {
resp.Token = ""
resp.Success = false
}
return
}
func generateToken(svcCtx *svc.ServiceContext, user *domain.User) (token string, err error) {
var userJwtToken = tool.UserToken{}
if user != nil {
userJwtToken.UserId = user.Id
userJwtToken.CompanyId = user.CompanyId
userJwtToken.ClientType = "mini"
}
token, err = userJwtToken.GenerateToken(svcCtx.Config.MiniAuth.AccessSecret, svcCtx.Config.MiniAuth.AccessExpire)
if err != nil {
return "", xerr.NewErrMsgErr("登录失败", err)
}
return
}
type WxClientLogin struct {
l *MiniUserLoginLogic
}
func (c WxClientLogin) WechatPhoneLogin(r domain.WechatLoginRequest) (*domain.LoginInfo, error) {
code := r.Code
response := &domain.LoginInfo{
Phone: "",
}
miniprogram := wechat.NewWechat().GetMiniProgram(&miniConfig.Config{
AppID: c.l.svcCtx.Config.Wechat.AppID,
AppSecret: c.l.svcCtx.Config.Wechat.AppSecret,
... ... @@ -87,25 +117,12 @@ func (c WxClientLogin) WechatPhoneLogin(r domain.WechatLoginRequest) (*domain.Lo
})
authResult, err := miniprogram.GetAuth().GetPhoneNumber(code)
if err != nil || authResult.ErrCode != 0 || authResult.PhoneInfo.PhoneNumber == "" {
return nil, xerr.NewCodeErrMsg(xerr.ErrWxMiniAuthFailError, nil, fmt.Sprintf("发起授权请求失败1 err : %v , code : %s , authResult : %+v", err, code, authResult))
return response, xerr.NewCodeErrMsg(xerr.ErrWxMiniAuthFailError, nil, fmt.Sprintf("发起授权请求失败1 err : %v , code : %s , authResult : %+v", err, code, authResult))
}
var (
users []*domain.User
phone = authResult.PhoneInfo.PhoneNumber
)
conn := c.l.svcCtx.DefaultDBConn()
_, users, err = c.l.svcCtx.UserRepository.Find(c.l.ctx, conn, domain.NewQueryOptions().
MustWithKV("phone", phone).
MustWithKV("auditStatus", []int{domain.UserAuditStatusPassed}))
if err != nil {
return nil, err
}
response := &domain.LoginInfo{
Phone: phone,
}
if len(users) != 0 {
response.User = users[0]
}
response.Phone = phone
return response, nil
}
... ... @@ -119,25 +136,17 @@ func (c WxClientLogin) PhonePasswordLogin(phone string, password string) (*domai
func (c WxClientLogin) PhoneSmsCodeLogin(phone string, code string) (*domain.LoginInfo, error) {
var (
users []*domain.User
err error
err error
skipCheckSmsCode bool = false
)
if _, err = c.l.svcCtx.SmsService.CheckSmsCode(c.l.ctx, smslib.RequestCheckSmsCode{Phone: phone, Code: code}); err != nil {
return nil, xerr.NewErrMsgErr(err.Error(), err)
if c.l.svcCtx.Config.DebugSmsCode != "" && c.l.svcCtx.Config.DebugSmsCode == code {
skipCheckSmsCode = true
}
conn := c.l.svcCtx.DefaultDBConn()
_, users, err = c.l.svcCtx.UserRepository.Find(c.l.ctx, conn, domain.NewQueryOptions().
MustWithKV("phone", phone).
MustWithKV("auditStatus", []int{domain.UserAuditStatusPassed}).
WithFindOnly())
if err != nil {
return nil, err
if _, err = c.l.svcCtx.SmsService.CheckSmsCode(c.l.ctx, smslib.RequestCheckSmsCode{Phone: phone, Code: code}); err != nil && !skipCheckSmsCode {
return nil, xerr.NewErrMsgErr(err.Error(), err)
}
response := &domain.LoginInfo{
Phone: phone,
}
if len(users) != 0 {
response.User = users[0]
}
return response, nil
}
... ...
... ... @@ -420,7 +420,7 @@ type MiniUserLoginResponse struct {
}
type MiniUserSwitchAccountRequest struct {
CompanyId int64 `json:"companyId"`
CompanyId int64 `json:"companyId,string"`
}
type MiniUserInfoRequest struct {
... ... @@ -439,6 +439,7 @@ type MiniUserApplyJoinCompanyRequest struct {
}
type MiniUserApplyJoinCompanyResponse struct {
Token string `json:"token"` // x-token
}
type MiniUserAuditRequest struct {
... ... @@ -494,30 +495,31 @@ type MiniUserFollowingMarkReadRequest struct {
}
type UserItem struct {
Id int64 `json:"id,omitempty"` // 用户ID
CompanyId int64 `json:"companyId,omitempty"` // 公司ID
CompanyName string `json:"companyName,omitempty"` // 公司名称
CompanyCode string `json:"companyCode,omitempty"` // 公司编码(邀请码)
Flag int `json:"flag,omitempty"` // 标识 1:管理员 2:普通用户 (有绑定角色是管理员)
Name string `json:"name,omitempty"` // 名称
Avatar string `json:"avatar,omitempty"` // 头像
Phone string `json:"phone,omitempty"` // 手机号 唯一
Position string `json:"position,omitempty"` // 职位
Enable int `json:"enable,omitempty"` // 启用状态 1:启用 2:禁用
AuditStatus *int `json:"auditStatus,omitempty"` // 审核状态 0:待审核 1:审核通过 2:拒绝
Follower []int64 `json:"followers,omitempty"` // 关注我的人 (冗余)
Following []int64 `json:"following,omitempty"` // 我关注的人 (冗余)
Departments []int64 `json:"departments,omitempty"` // 所属部门
AccountFrom string `json:"accountFrom,omitempty"` // 账号来源 后台新增、扫码注册
Id int64 `json:"id,omitempty"` // 用户ID
CompanyId int64 `json:"companyId,string,omitempty"` // 公司ID
CompanyName string `json:"companyName,omitempty"` // 公司名称
CompanyCode string `json:"companyCode,omitempty"` // 公司编码(邀请码)
CompanyLogo *string `json:"companyLogo,omitempty"` // 公司LOGO
Flag int `json:"flag,omitempty"` // 标识 1:管理员 2:普通用户 (有绑定角色是管理员)
Name string `json:"name,omitempty"` // 名称
Avatar string `json:"avatar,omitempty"` // 头像
Phone string `json:"phone,omitempty"` // 手机号 唯一
Position string `json:"position,omitempty"` // 职位
Enable int `json:"enable,omitempty"` // 启用状态 1:启用 2:禁用
AuditStatus *int `json:"auditStatus,omitempty"` // 审核状态 0:待审核 1:审核通过 2:拒绝
Follower []int64 `json:"followers,omitempty"` // 关注我的人 (冗余)
Following []int64 `json:"following,omitempty"` // 我关注的人 (冗余)
Departments []int64 `json:"departments,omitempty"` // 所属部门
AccountFrom string `json:"accountFrom,omitempty"` // 账号来源 后台新增、扫码注册
}
type Account struct {
CompanyId int64 `json:"companyId"` // 公司ID
CompanyName string `json:"companyName"` // 公司名称
Logo string `json:"logo"` // 公司图标
UserId int64 `json:"userId"` // 用户ID
Name string `json:"name"` // 名称
Position string `json:"position"` // 职位
CompanyId int64 `json:"companyId,string"` // 公司ID
CompanyName string `json:"companyName"` // 公司名称
Logo string `json:"logo"` // 公司图标
UserId int64 `json:"userId"` // 用户ID
Name string `json:"name"` // 名称
Position string `json:"position"` // 职位
}
type Department struct {
... ... @@ -1198,11 +1200,11 @@ type MiniSearchArticleRequest struct {
Size int `json:"size"`
CompanyId int64 `json:",optional"`
UserId int64 `json:",optional"`
TagCategory string `json:"tagCategory"`
TagId int64 `json:"tagId"`
BeginTime int64 `json:"beginTime"`
EndTime int64 `json:"endTime"`
SearchWord string `json:"searchWord"`
TagCategory string `json:"tagCategory,optional"`
TagId int64 `json:"tagId,optional"`
BeginTime int64 `json:"beginTime,optional"`
EndTime int64 `json:"endTime,optional"`
SearchWord string `json:"searchWord,optional"`
}
type MiniSearchArticleResponse struct {
... ...
-- 用户表
-- (公司ID)索引
CREATE INDEX IF NOT EXISTS idx_user_company_id ON "public"."user" USING btree(company_id);
-- (手机号)索引
CREATE INDEX IF NOT EXISTS idx_user_phone ON "public"."user" USING btree(phone);
-- 用户关注表
-- (发起人)索引
CREATE INDEX IF NOT EXISTS idx_user_follow_from_user_id ON "public".user_follow USING btree(from_user_id);
-- 角色表
-- (公司ID)索引
CREATE INDEX IF NOT EXISTS idx_role_company_id ON "public"."role" USING btree(company_id);
-- 文章表
-- (公司ID)索引
CREATE INDEX article_company_id_idx ON public.article USING btree(company_id);
-- 文章与标签关系表
-- (公司ID)索引
CREATE INDEX article_and_tag_company_id_idx ON public.article_and_tag USING btree(company_id);
-- 文章历史记录
-- (公司ID)索引
CREATE INDEX article_backup_company_id_idx ON public.article_backup USING btree(company_id);
-- 文章的评论记录
-- (公司ID)索引
CREATE INDEX article_comment_company_id_idx ON public.article_comment USING btree(company_id);
-- 文章的草稿箱记录
-- (公司ID)索引
CREATE INDEX article_draft_company_id_idx ON public.article_draft USING btree(company_id);
-- 文章的段落内容
-- (公司ID)索引
CREATE INDEX article_section_company_id_idx ON public.article_section USING btree(company_id);
-- 文章的段落内容
-- (文章ID)索引
CREATE INDEX article_section_article_id_idx ON public.article_section USING btree(article_id);
-- 标签
-- (公司ID)索引
CREATE INDEX article_tag_company_id_idx ON public.article_tag USING btree(company_id);
-- 人员点赞标识
-- (评论id)索引
CREATE INDEX user_love_flag_comment_id_idx ON public.user_love_flag USING btree(comment_id);
-- 人员点赞标识
-- (用户id)索引
CREATE INDEX user_love_flag_user_id_idx ON public.user_love_flag USING btree(user_id);
-- 标记人员已浏览的文章
-- (公司ID)索引
CREATE INDEX user_read_article_company_id_idx ON public.user_read_article USING btree(company_id);
-- 标记人员已浏览的文章
-- (用户id)索引
CREATE INDEX user_read_article_user_id_idx ON public.user_read_article USING btree(user_id);
-- 部门表
-- (公司ID)索引
CREATE INDEX IF NOT EXISTS idx_department_company_id ON "public"."department" USING btree(company_id);
-- 系统消息表
-- (公司ID)索引
CREATE INDEX IF NOT EXISTS idx_message_system_company_id ON "public"."message_system" USING btree(company_id);
-- 业务消息表
-- (公司ID)索引
CREATE INDEX IF NOT EXISTS idx_message_business_company_id ON "public"."message_business" USING btree(company_id);
\ No newline at end of file
... ...