diff --git a/internal/core/user.go b/internal/core/user.go index 78ac1c8d..9e217c25 100644 --- a/internal/core/user.go +++ b/internal/core/user.go @@ -5,6 +5,7 @@ package core import ( + connectMidleware "github.com/go-zoox/connect/pkg/middleware" "github.com/rocboss/paopao-ce/internal/core/cs" "github.com/rocboss/paopao-ce/internal/core/ms" ) @@ -20,6 +21,8 @@ type UserManageService interface { CreateUser(user *ms.User) (*ms.User, error) UpdateUser(user *ms.User) error GetRegisterUserCount() (int64, error) + // + GetOrCreateUserByEmail(email string, connectUser *connectMidleware.User) (*ms.User, error) } // ContactManageService 联系人管理服务 diff --git a/internal/dao/jinzhu/dbr/user.go b/internal/dao/jinzhu/dbr/user.go index 4d7f7f6d..c31371e2 100644 --- a/internal/dao/jinzhu/dbr/user.go +++ b/internal/dao/jinzhu/dbr/user.go @@ -18,6 +18,7 @@ type User struct { *Model Nickname string `json:"nickname"` Username string `json:"username"` + Email string `json:"email"` Phone string `json:"phone"` Password string `json:"password"` Salt string `json:"salt"` @@ -59,6 +60,8 @@ func (u *User) Get(db *gorm.DB) (*User, error) { db = db.Where("id= ? AND is_del = ?", u.Model.ID, 0) } else if u.Phone != "" { db = db.Where("phone = ? AND is_del = ?", u.Phone, 0) + } else if u.Email != "" { + db = db.Where("email = ? AND is_del = ?", u.Email, 0) } else { db = db.Where("username = ? AND is_del = ?", u.Username, 0) } diff --git a/internal/dao/jinzhu/user.go b/internal/dao/jinzhu/user.go index 6f5c2c71..c8383bc6 100644 --- a/internal/dao/jinzhu/user.go +++ b/internal/dao/jinzhu/user.go @@ -7,7 +7,10 @@ package jinzhu import ( "fmt" "strings" + "sync" + connectMidleware "github.com/go-zoox/connect/pkg/middleware" + "github.com/go-zoox/random" "github.com/rocboss/paopao-ce/internal/core" "github.com/rocboss/paopao-ce/internal/core/cs" "github.com/rocboss/paopao-ce/internal/core/ms" @@ -75,6 +78,34 @@ func (s *userManageSrv) GetUserByUsername(username string) (*ms.User, error) { return user.Get(s.db) } +var GetOrCreateUserByEmailSync = &sync.Mutex{} + +func (s *userManageSrv) GetOrCreateUserByEmail(email string, connectUser *connectMidleware.User) (*ms.User, error) { + GetOrCreateUserByEmailSync.Lock() + defer GetOrCreateUserByEmailSync.Unlock() + + user := &dbr.User{ + Email: email, + } + + u, err := user.Get(s.db) + if err == nil { + return u, nil + } + + fmt.Println("[GetOrCreateUserByEmail] connectUser:", connectUser) + + user.Nickname = connectUser.Nickname + user.Avatar = connectUser.Avatar + user.Status = ms.UserStatusNormal + // user.OpenID = connectUser.ID + // user.Username = random.String(16) + user.Username = strings.Split(email, "@")[0] + user.Password = random.String(32) + + return s.CreateUser(user) +} + func (s *userManageSrv) UserProfileByName(username string) (res *cs.UserProfile, err error) { err = s.db.Table(_user_).Joins(s._userProfileJoins). Where(s._userProfileWhere, username). diff --git a/internal/servants/web/loose.go b/internal/servants/web/loose.go index 3fe3517f..913aeff4 100644 --- a/internal/servants/web/loose.go +++ b/internal/servants/web/loose.go @@ -172,16 +172,19 @@ func (s *looseSrv) tweetCommentsFromCache(req *web.TweetCommentsReq, limit int, } func (s *looseSrv) GetUserTweets(req *web.GetUserTweetsReq) (res *web.GetUserTweetsResp, err mir.Error) { + fmt.Println("123123") user, xerr := s.RelationTypFrom(req.User, req.Username) if xerr != nil { return nil, err } // 尝试直接从缓存中获取数据 + fmt.Println("468888") key, ok := "", false if res, key, ok = s.userTweetsFromCache(req, user); ok { // logrus.Debugf("GetUserTweets from cache key:%s", key) return } + fmt.Println("77") // 缓存获取未成功,只能查库了 switch req.Style { case web.UserPostsStyleComment, web.UserPostsStyleMedia: diff --git a/internal/service/web.go b/internal/service/web.go index a663b70f..ecbb0b8d 100644 --- a/internal/service/web.go +++ b/internal/service/web.go @@ -17,6 +17,8 @@ import ( connectMidleware "github.com/go-zoox/connect/pkg/middleware" "github.com/rocboss/paopao-ce/internal/conf" "github.com/rocboss/paopao-ce/internal/servants" + "github.com/rocboss/paopao-ce/internal/servants/base" + "github.com/rocboss/paopao-ce/pkg/app" ) var ( @@ -52,9 +54,65 @@ func newWebEngine() *gin.Engine { e.Use(connectMidleware.CreateGinMiddleware(os.Getenv("SECRET_KEY"))) e.Use(func(ctx *gin.Context) { - v, _ := ctx.Get(connectMidleware.ContextUserKeyForGin) + u, ok := ctx.Get(connectMidleware.ContextUserKeyForGin) + if !ok { + ctx.JSON(http.StatusUnauthorized, gin.H{ + "message": "unauthorized (1)", + }) + ctx.Abort() + return + } + + connectUser, ok := u.(*connectMidleware.User) + if !ok { + ctx.JSON(http.StatusUnauthorized, gin.H{ + "message": "unauthorized (2)", + }) + ctx.Abort() + return + } - fmt.Println("user:", v) + fmt.Println("connect user:", connectUser) + dao := base.NewDaoServant() + user, err := dao.Ds.GetOrCreateUserByEmail(connectUser.Email, connectUser) + if err != nil { + ctx.JSON(http.StatusInternalServerError, gin.H{ + "message": fmt.Sprintf("failed to get user by email: %s", err), + }) + ctx.Abort() + return + } + + // auth login + if ctx.Request.URL.Path == "/v1/auth/login" { + token, err := app.GenerateToken(user) + if err != nil { + ctx.JSON(http.StatusInternalServerError, gin.H{ + "message": "failed to generate token", + }) + ctx.Abort() + return + } + + ctx.JSON(http.StatusOK, gin.H{ + "code": 0, + "msg": "success", + "data": gin.H{ + "token": token, + }, + }) + ctx.Abort() + return + } else if ctx.Request.URL.Path == "/v1/user/info" { + // user info + ctx.JSON(http.StatusOK, gin.H{ + "code": 0, + "msg": "success", + "data": user, + }) + ctx.Abort() + return + } ctx.Next() }) diff --git a/scripts/paopao-mysql.sql b/scripts/paopao-mysql.sql index fddeaaac..af7a835c 100644 --- a/scripts/paopao-mysql.sql +++ b/scripts/paopao-mysql.sql @@ -342,6 +342,7 @@ CREATE TABLE `p_user` ( `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '用户ID', `nickname` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '昵称', `username` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户名', + `email` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '邮箱', `phone` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '手机号', `password` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'MD5密码', `salt` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '盐值', diff --git a/scripts/paopao-postgres.sql b/scripts/paopao-postgres.sql index 276abdde..17d315d8 100644 --- a/scripts/paopao-postgres.sql +++ b/scripts/paopao-postgres.sql @@ -280,6 +280,7 @@ CREATE TABLE p_user ( id BIGINT NOT NULL DEFAULT nextval('user_id_seq'::regclass), nickname VARCHAR(32) NOT NULL DEFAULT '', username VARCHAR(32) NOT NULL DEFAULT '', + email VARCHAR(64) NOT NULL DEFAULT '', phone VARCHAR(16) NOT NULL DEFAULT '', -- 手机号 password VARCHAR(32) NOT NULL DEFAULT '', -- MD5密码 salt VARCHAR(16) NOT NULL DEFAULT '', -- 盐值 diff --git a/web/src/components/auth.vue b/web/src/components/auth.vue index 8b348bcd..49063bbb 100644 --- a/web/src/components/auth.vue +++ b/web/src/components/auth.vue @@ -290,7 +290,32 @@ onMounted(() => { store.commit('userLogout'); }); } else { - store.commit('userLogout'); + // store.commit('userLogout'); + + userLogin({ + username: "placeholder", + password: "placeholder", + }) + .then((res) => { + const token = res?.token || ''; + // 写入用户信息 + localStorage.setItem('PAOPAO_TOKEN', token); + + return userInfo(token); + }) + .then((res) => { + // window.$message.success('登录成功'); + loading.value = false; + + store.commit('updateUserinfo', res); + store.commit('triggerAuth', false); + store.commit('refresh') + loginForm.username = ''; + loginForm.password = ''; + }) + .catch((err) => { + loading.value = false; + }); } }); @@ -304,4 +329,4 @@ onMounted(() => { background-color: rgba(16, 16, 20, 0.75); } } - \ No newline at end of file +