作者 yangfu

Merge branch 'dev' into test

... ... @@ -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)
... ...
... ... @@ -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
}
// 短信验证码
... ...
... ... @@ -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
... ... @@ -160,6 +160,7 @@ type(
CompanyId int64 `json:"companyId,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:普通用户 (有绑定角色是管理员)
... ...
... ... @@ -7,7 +7,7 @@ Timeout: 30000
# CertFile: ./key/fjmaimaimai.com_bundle.crt
# KeyFile: ./key/fjmaimaimai.com.key
Log:
#Mode: file
Mode: file
Encoding: plain
Level: debug # info
MaxSize: 1 # 2MB
... ...
... ... @@ -15,6 +15,7 @@ type Config struct {
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"
... ... @@ -49,6 +50,8 @@ func (l *MiniUserInfoLogic) MiniUserInfo(req *types.MiniUserInfoRequest) (resp *
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 {
... ...
... ... @@ -53,13 +53,7 @@ func (l *MiniUserLoginLogic) MiniUserLogin(req *types.MiniUserLoginRequest) (res
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"
}
token, err = userJwtToken.GenerateToken(l.svcCtx.Config.MiniAuth.AccessSecret, l.svcCtx.Config.MiniAuth.AccessExpire)
token, err = generateToken(l.svcCtx, loginInfo.User)
if err != nil {
return nil, xerr.NewErrMsgErr("登录失败", err)
}
... ... @@ -74,6 +68,20 @@ func (l *MiniUserLoginLogic) MiniUserLogin(req *types.MiniUserLoginRequest) (res
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
}
... ... @@ -121,8 +129,12 @@ func (c WxClientLogin) PhoneSmsCodeLogin(phone string, code string) (*domain.Log
var (
users []*domain.User
err error
skipCheckSmsCode bool = false
)
if _, err = c.l.svcCtx.SmsService.CheckSmsCode(c.l.ctx, smslib.RequestCheckSmsCode{Phone: phone, Code: code}); err != nil {
if c.l.svcCtx.Config.DebugSmsCode != "" && c.l.svcCtx.Config.DebugSmsCode == code {
skipCheckSmsCode = true
}
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)
}
conn := c.l.svcCtx.DefaultDBConn()
... ...
... ... @@ -439,6 +439,7 @@ type MiniUserApplyJoinCompanyRequest struct {
}
type MiniUserApplyJoinCompanyResponse struct {
Token string `json:"token"` // x-token
}
type MiniUserAuditRequest struct {
... ... @@ -498,6 +499,7 @@ type UserItem struct {
CompanyId int64 `json:"companyId,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"` // 头像
... ...
-- 用户表
-- (公司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
... ...