You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

380 lines
8.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package service
import (
"context"
"fmt"
"go_fabric/conf"
"go_fabric/dao"
"go_fabric/model"
"go_fabric/pkg/e"
"go_fabric/pkg/util"
"go_fabric/serializer"
"mime/multipart"
"strings"
"time"
"gopkg.in/mail.v2"
)
type UserService struct {
NickName string `json:"nick_name" form:"nick_name"`
UserName string `json:"user_name" form:"user_name"`
Password string `json:"password" form:"password"`
Key string `json:"key" form:"key"` //加密密钥
}
type SendEmailService struct {
Email string `json:"email" form:"email"`
Password string `json:"password"`
OperationType uint `json:"operation_type" form:"operation_type"` // 1.绑定邮箱 2.解绑邮箱 3.更改密码
}
type ValidEmailService struct {
}
// 注册
func (service *UserService) Register(ctx context.Context) serializer.Response {
var user model.User
code := e.Success
if service.Key == "" || len(service.Key) != 6 {
code = e.Error
return serializer.Response{
Status: code,
Data: nil,
Msg: e.GetMsg(code),
Error: "密钥长度不符",
}
}
util.Encrypt.SetKey(service.Key)
userDao := dao.NewUserDao(ctx)
_, exist, err := userDao.ExistOrNotByUserName(service.UserName)
if err != nil {
util.LoggerObj.Error(err)
code = e.Error
return serializer.Response{
Status: code,
Msg: e.GetMsg(code),
}
}
if exist {
code = e.ErrorExistUser
return serializer.Response{
Status: code,
Msg: e.GetMsg(code),
}
}
user = model.User{
UserName: service.UserName,
NickName: service.NickName,
Avatar: "avatar.JPG",
Status: model.Active,
Money: "1000",
Vip: 0,
}
//密码是否为空
if service.Password == "" {
code = e.NullPassword
return serializer.Response{
Status: code,
Msg: e.GetMsg(code),
}
}
//密码加密
if err = user.SetPassword(service.Password); err != nil {
util.LoggerObj.Error(err)
code = e.ErrorFailEncryption
return serializer.Response{
Status: code,
Msg: e.GetMsg(code),
}
}
//创建用户
err = userDao.CreateUser(&user)
if err != nil {
util.LoggerObj.Error(err)
code = e.Error
}
return serializer.Response{
Status: code,
Msg: e.GetMsg(code),
}
}
// 登录
func (service *UserService) Login(ctx context.Context) serializer.Response {
var user *model.User
code := e.Success
userDao := dao.NewUserDao(ctx)
//检查用户是否存在
user, exist, err := userDao.ExistOrNotByUserName(service.UserName)
if !exist || err != nil {
util.LoggerObj.Error(err)
code = e.UserNotFind
return serializer.Response{
Status: code,
Msg: e.GetMsg(code),
Data: "用户不存在,请先注册",
}
}
//验证密码是否正确
if user.CheckPassword(service.Password) == false {
code = e.ErrorPassword
return serializer.Response{
Status: code,
Msg: e.GetMsg(code),
Data: "密码错误,请重新输入",
}
}
//分发token
token, err := util.GenerateToken(user.ID, service.UserName, 0)
if err != nil {
util.LoggerObj.Error(err)
code = e.ErrorToken
return serializer.Response{
Status: code,
Msg: e.GetMsg(code),
Data: "token验证失败",
}
}
return serializer.Response{
Status: code,
Data: serializer.TokenData{User: serializer.BuildUser(user), Token: token},
Msg: e.GetMsg(code),
}
}
// 用户修改信息
func (service *UserService) Update(ctx context.Context, uId uint) serializer.Response {
var user *model.User
var err error
code := e.Success
//寻找用户
userDao := dao.NewUserDao(ctx)
user, err = userDao.GetUserById(uId)
//检查用户状态
if user.Status == "passive" {
code = e.ErrorNotActive
return serializer.Response{
Status: code,
Msg: e.GetMsg(code),
Error: "用户没有激活,没有权限",
}
}
//修改昵称nickname
if service.NickName != "" {
user.NickName = service.NickName
}
err = userDao.UpdateUserById(uId, user)
if err != nil {
util.LoggerObj.Error(err)
code = e.Error
return serializer.Response{
Status: code,
Msg: e.GetMsg(code),
}
}
return serializer.Response{
Status: code,
Msg: e.GetMsg(code),
Data: serializer.BuildUser(user),
}
}
// 头像更新
func (service *UserService) Post(ctx context.Context, uId uint, file multipart.File, fileSize int64) serializer.Response {
code := e.Success
var user *model.User
var err error
userDao := dao.NewUserDao(ctx)
user, err = userDao.GetUserById(uId)
if user.Status == "passive" {
code = e.ErrorNotActive
return serializer.Response{
Status: code,
Msg: e.GetMsg(code),
Error: "用户没有激活,没有权限",
}
}
if err != nil {
code = e.Error
return serializer.Response{
Status: code,
Msg: e.GetMsg(code),
Error: err.Error(),
}
}
//保存图片到本地
path, err := UploadAvatarLocalStatic(file, uId, user.UserName)
if err != nil {
code = e.ErrorUploadFail
return serializer.Response{
Status: code,
Msg: e.GetMsg(code),
Error: err.Error(),
}
}
user.Avatar = path
err = userDao.UpdateUserById(uId, user)
if err != nil {
util.LoggerObj.Error(err)
code = e.Error
return serializer.Response{
Status: code,
Msg: e.GetMsg(code),
Error: err.Error(),
}
}
return serializer.Response{
Status: code,
Msg: e.GetMsg(code),
Data: serializer.BuildUser(user),
}
}
// 发送验证邮件
func (service *SendEmailService) Send(ctx context.Context, uId uint) serializer.Response {
code := e.Success
var address string
var notice *model.Notice // 绑定邮箱,修改密码 模板通知
userDao := dao.NewUserDao(ctx)
user, err := userDao.GetUserById(uId)
//检查用户状态
if user.Status == "passive" {
code = e.ErrorNotActive
return serializer.Response{
Status: code,
Msg: e.GetMsg(code),
Error: "用户没有激活,没有权限",
}
}
token, err := util.GenerateEmailToken(uId, service.OperationType, service.Email, service.Password)
if err != nil {
util.LoggerObj.Error(err)
code = e.ErrorToken
return serializer.Response{
Status: code,
Msg: e.GetMsg(code),
Error: err.Error(),
}
}
noticeDao := dao.NewNoticeDao(ctx)
notice, err = noticeDao.GetNoticeById(service.OperationType)
if err != nil {
util.LoggerObj.Error(err)
code = e.Error
return serializer.Response{
Status: code,
Msg: e.GetMsg(code),
Error: err.Error(),
}
}
address = conf.ValidEmail + token //发送者
mailStr := notice.Text
mailText := strings.Replace(mailStr, "+", address, -1)
fmt.Println(mailText)
m := mail.NewMessage()
m.SetHeader("From", conf.SmtpEmail) //管理员邮箱
m.SetHeader("To", service.Email) //验证者邮箱
m.SetHeader("Subject", "fabric_mall")
m.SetBody("text/html", mailText)
d := mail.NewDialer(conf.SmtpHost, 465, conf.SmtpEmail, conf.SmtpPass)
d.StartTLSPolicy = mail.MandatoryStartTLS
if err = d.DialAndSend(m); err != nil {
util.LoggerObj.Error(err)
code = e.ErrorSendEmail
return serializer.Response{
Status: code,
Msg: e.GetMsg(code),
Error: err.Error(),
}
}
return serializer.Response{
Status: code,
Msg: e.GetMsg(code),
}
}
// 验证邮箱
func (service *ValidEmailService) Valid(ctx context.Context, token string) serializer.Response {
var userId uint
var email string
var password string
var operationType uint
code := e.Success
//验证token
if token == "" {
code = e.InvalidParams
} else {
claims, err := util.ParseEmailToken(token)
if err != nil {
util.LoggerObj.Error(err)
code = e.ErrorToken
} else if time.Now().Unix() > claims.ExpiresAt {
code = e.ErrorCheckTokenTimeOut
} else {
userId = claims.UserID
email = claims.Email
password = claims.Password
operationType = claims.OperationType
}
}
if code != e.Success {
return serializer.Response{
Status: code,
Msg: e.GetMsg(code),
}
}
// token解析成功获取用户信息
userDao := dao.NewUserDao(ctx)
user, err := userDao.GetUserById(userId)
if err != nil {
util.LoggerObj.Error(err)
code = e.Error
return serializer.Response{
Status: code,
Msg: e.GetMsg(code),
}
}
if operationType == 1 { //1.绑定邮箱
user.Email = email
} else if operationType == 2 { //2.解绑邮箱
user.Email = ""
} else if operationType == 3 { //3.修改密码
err = user.SetPassword(password)
if err != nil {
util.LoggerObj.Error(err)
code = e.Error
return serializer.Response{
Status: code,
Msg: e.GetMsg(code),
}
}
}
err = userDao.UpdateUserById(userId, user)
if err != nil {
util.LoggerObj.Error(err)
code = e.Error
return serializer.Response{
Status: code,
Msg: e.GetMsg(code),
}
}
return serializer.Response{
Status: code,
Msg: e.GetMsg(code),
Data: serializer.BuildUser(user),
}
}