Browse Source

fix:新增获取验证码接口

Roc 3 years ago
parent
commit
1485feb159

+ 82 - 92
controller/user/user.go

@@ -3,6 +3,7 @@ package user
 import (
 	"github.com/gin-gonic/gin"
 	"hongze/hongze_yb/controller/response"
+	userLogic "hongze/hongze_yb/logic/user"
 	"hongze/hongze_yb/models/request/user"
 	userResp "hongze/hongze_yb/models/response/user"
 	userService "hongze/hongze_yb/services/user"
@@ -14,12 +15,12 @@ import (
 // @Tags 用户模块
 // @Summary  用户登录
 // @Description 用户手机号/邮箱登录
-// @Security ApiKeyAuth
-// @Param Authorization	header string true "Bearer 31a165baebe6dec616b1f8f3207b4273"
+// @securityDefinitions.basic BasicAuth
+// @Param Authorization	header string true "微信登录后获取到的token"
 // @Accept  json
 // @Product json
-// @Param	request	body user.LoginReq true "type json string"
-// @Success 200 {object}	user.LoginResp
+// @Param data body user.LoginReq true "请求参数"
+// @Success 200 {object} user.LoginResp
 // @Router /user/login [post]
 func Login(c *gin.Context) {
 	var req user.LoginReq
@@ -72,91 +73,80 @@ func Login(c *gin.Context) {
 	}, c)
 }
 
-//func  GetEmailCode() {
-//	br := new(models.BaseResponse).Init()
-//	defer func() {
-//		this.Data["json"] = br
-//		this.ServeJSON()
-//	}()
-//	email := this.GetString("Email")
-//	if email == "" {
-//		br.Msg = "请输入邮箱地址"
-//		return
-//	}
-//	if !utils.ValidateEmailFormatat(email) {
-//		br.Msg = "邮箱格式错误,请重新输入"
-//		return
-//	}
-//	msgCode := utils.GetRandDigit(4)
-//	content := "尊敬的用户:</br>您好,感谢您使用弘则研究,您正在进行邮箱验证,本次请求的验证码为:" + msgCode + "(为了保障您账号的安全性,请在15分钟内完成验证。)</br>弘则研究团队 </br>2019年05月11日"
-//	title := "弘则研究登陆验证"
-//	//发送邮件
-//	result, err := utils.SendEmailByHz(title, content, email)
-//	if err != nil {
-//		br.Msg = "发送失败"
-//		br.ErrMsg = "发送失败,Err:" + err.Error()
-//		return
-//	}
-//	if result {
-//		item := new(models.MsgCode)
-//		item.OpenId = ""
-//		item.Code = msgCode
-//		item.Mobile = email
-//		item.ExpiredIn = time.Now().Add(15 * time.Minute).Unix()
-//		item.Enabled = 1
-//		item.CreatedTime = time.Now()
-//		err := models.AddMsgCode(item)
-//		if err != nil {
-//			br.Msg = "发送失败"
-//			br.ErrMsg = "发送失败,Err:" + err.Error()
-//			return
-//		}
-//		br.Msg = "发送成功"
-//	} else {
-//		br.Msg = "发送失败"
-//	}
-//	br.Ret = 200
-//	br.Success = true
-//}
-//
-//func GetSmsCode() {
-//	br := new(models.BaseResponse).Init()
-//	defer func() {
-//		this.Data["json"] = br
-//		this.ServeJSON()
-//	}()
-//	mobile := this.GetString("Mobile")
-//	if mobile == "" {
-//		br.Msg = "请输入手机号"
-//		return
-//	}
-//	areaNum := this.GetString("AreaNum")
-//	msgCode := utils.GetRandDigit(4)
-//	var result bool
-//	if areaNum == "86" || areaNum == "" || areaNum == "0" {
-//		result = services.SendSmsCode(mobile, msgCode)
-//	} else {
-//		result = services.SendSmsCodeGj(mobile, msgCode, areaNum)
-//	}
-//	//发送成功
-//	if result {
-//		item := new(models.MsgCode)
-//		item.OpenId = ""
-//		item.Code = msgCode
-//		item.Mobile = mobile
-//		item.ExpiredIn = time.Now().Add(15 * time.Minute).Unix()
-//		item.Enabled = 1
-//		item.CreatedTime = time.Now()
-//		err := models.AddMsgCode(item)
-//		if err != nil {
-//			br.Msg = "发送失败"
-//			br.ErrMsg = "发送失败,Err:" + err.Error()
-//			return
-//		}
-//		br.Msg = "发送成功"
-//	} else {
-//		br.Msg = "发送失败"
-//	}
-//	br.Ret = 200
-//	br.Success = true
-//}
+// GetSmsCode 获取短信验证码接口
+// @Tags 用户模块
+// @Summary  获取短信验证码
+// @Description 获取短信验证码接口
+// @securityDefinitions.basic BasicAuth
+// @Param Authorization	header string true "微信登录后获取到的token"
+// @Param mobile	query string true "手机号"
+// @Param area_num	query string true "手机国际区号(中国大陆:86)"
+// @Accept  json
+// @Product json
+// @Success 200 {string} string 获取验证码成功
+// @Failure 200 {string} string 手机号不能为空,请输入手机号
+// @Router /user/get_sms_code [get]
+func GetSmsCode(c *gin.Context) {
+	userInfo := userService.GetInfoByClaims(c)
+	openId := userInfo.OpenID
+	if openId == "" {
+		response.Fail("参数异常", c)
+		return
+	}
+
+	mobile := c.DefaultQuery("mobile", "")
+	areaNum := c.DefaultQuery("area_num", "")
+
+	err, errMsg := userLogic.SendSmsCode(openId, mobile, areaNum)
+	if err != nil {
+		if errMsg != "" {
+			errMsg = "获取验证码失败"
+		}
+		response.Fail(errMsg, c)
+		return
+	}
+
+	response.Ok("获取验证码成功", c)
+}
+
+// GetEmailCode 获取邮箱验证码接口
+// @Tags 用户模块
+// @Summary  获取邮箱验证码
+// @Description 获取邮箱验证码
+// @securityDefinitions.basic BasicAuth
+// @Param Authorization	header string true "微信登录后获取到的token"
+// @Param email	query string true "电子邮箱账号"
+// @Accept  json
+// @Product json
+// @Success 200 {string} string 获取验证码成功
+// @Failure 200 {string} string 请输入邮箱地址
+// @Router /user/get_email_code [get]
+func GetEmailCode(c *gin.Context) {
+	userInfo := userService.GetInfoByClaims(c)
+	openId := userInfo.OpenID
+	if openId == "" {
+		response.Fail("参数异常", c)
+		return
+	}
+
+	email := c.DefaultQuery("email", "")
+	if email == "" {
+		response.Fail("请输入邮箱地址", c)
+		return
+	}
+	if !utils.ValidateEmailFormatat(email) {
+		response.Fail("邮箱格式错误,请重新输入", c)
+		return
+	}
+
+	err, errMsg := userLogic.SendEmailCode(openId, email)
+	if err != nil {
+		if errMsg != "" {
+			errMsg = "获取验证码失败"
+		}
+		response.Fail(errMsg, c)
+		return
+	}
+
+	response.Ok("获取验证码成功", c)
+}

+ 9 - 0
controller/wechat/wechat.go

@@ -36,6 +36,15 @@ func GetUserSession(c *gin.Context) {
 	response.OkData("获取成功", userInfo, c)
 }
 
+// Login 微信登录
+// @Tags 微信相关接口
+// @Summary  微信登录
+// @Description 微信登录
+// @Accept  json
+// @Product json
+// @Param code query string true "微信code"
+// @Success 200 {object} response.LoginResp
+// @Router /wechat/login [get]
 func Login(c *gin.Context) {
 	//code, _ := c.GetQuery("code")
 	code := c.DefaultQuery("code", "")

+ 2 - 1
init_serve/redis.go

@@ -2,6 +2,7 @@ package init_serve
 
 import (
 	"context"
+	"fmt"
 	"github.com/go-redis/redis/v8"
 	"hongze/hongze_yb/global"
 )
@@ -19,7 +20,7 @@ func Redis() {
 		global.LOG.Error("redis 链接失败:", err)
 		panic("redis 链接失败:" + err.Error())
 	} else {
-		global.LOG.Info("redis 链接成功,ping response:", pong)
+		fmt.Println("redis 链接成功,ping response:", pong)
 	}
 
 	//全局赋值redis链接

+ 76 - 0
logic/user/user.go

@@ -0,0 +1,76 @@
+package user
+
+import (
+	"errors"
+	"hongze/hongze_yb/models/tables/rddp/msg_code"
+	"hongze/hongze_yb/services"
+	"hongze/hongze_yb/utils"
+	"time"
+)
+
+// SendSmsCode 发送手机短信
+func SendSmsCode(openid, mobile, areaNum string) (err error, errMsg string) {
+	if mobile == "" {
+		err = errors.New("请输入手机号")
+		return
+	}
+	msgCode := utils.GetRandDigit(4)
+	var result bool
+	if areaNum == "86" || areaNum == "" || areaNum == "0" {
+		//国内的短信
+		result = services.SendSmsCode(mobile, msgCode)
+	} else {
+		//国际短信
+		result = services.SendSmsCodeGj(mobile, msgCode, areaNum)
+	}
+	//发送成功
+	if result {
+		item := &msg_code.MsgCode{
+			OpenID:          openid,
+			Mobile:          mobile,
+			Code:            msgCode,
+			ExpiredIn:       time.Now().Add(15 * time.Minute).Unix(),
+			Enabled:         1,
+			CreatedTime:     time.Time{},
+			LastUpdatedTime: time.Time{},
+		}
+		err = item.Create()
+	} else {
+		err = errors.New("发送失败,Err:" + err.Error())
+	}
+	return
+}
+
+// SendEmailCode 发送邮件
+func SendEmailCode(openid, email string) (err error, errMsg string) {
+	if email == "" {
+		err = errors.New("请输入邮箱地址")
+		return
+	}
+	if !utils.ValidateEmailFormatat(email) {
+		err = errors.New("邮箱格式错误,请重新输入")
+		return
+	}
+	msgCode := utils.GetRandDigit(4)
+	content := "尊敬的用户:</br>您好,感谢您使用弘则研究,您正在进行邮箱验证,本次请求的验证码为:" + msgCode + "(为了保障您账号的安全性,请在15分钟内完成验证。)</br>弘则研究团队 </br>" + time.Now().Format(utils.FormatDateCN)
+	title := "弘则研究登陆验证"
+	//发送邮件
+	result, err := services.SendEmailByHz(title, content, email)
+
+	if result {
+		item := &msg_code.MsgCode{
+			OpenID:          openid,
+			Mobile:          email,
+			Code:            msgCode,
+			ExpiredIn:       time.Now().Add(15 * time.Minute).Unix(),
+			Enabled:         1,
+			CreatedTime:     time.Time{},
+			LastUpdatedTime: time.Time{},
+		}
+		err = item.Create()
+	} else {
+		err = errors.New("发送失败,Err:" + err.Error())
+	}
+
+	return
+}

+ 14 - 0
main.go

@@ -2,6 +2,20 @@ package main
 
 import "hongze/hongze_yb/core"
 
+// @title 弘则研报API接口文档
+// @version 1.0
+// @description 这是弘则研报API接口文档
+// @termsOfService https://www.hzinsights.com/
+
+// @contact.name www.hzinsights.com/
+// @contact.url https://www.hzinsights.com/
+// @contact.email pyan@hzinsights.com
+
+// @license.name Apache 2.0
+// @license.url http://www.apache.org/licenses/LICENSE-2.0.html
+
+// @host 127.0.0.1:8607
+// @BasePath /
 func main() {
 	core.RunServe()
 }

+ 4 - 0
middleware/cors.go

@@ -1,6 +1,7 @@
 package middleware
 
 import (
+	"fmt"
 	"github.com/gin-gonic/gin"
 	"net/http"
 )
@@ -9,12 +10,15 @@ import (
 func Cors() gin.HandlerFunc {
 	return func(c *gin.Context) {
 		method := c.Request.Method
+
 		c.Header("Access-Control-Allow-Origin", "*")
+		//c.Header("Access-Control-Allow-Origin", c.Request.Referer())
 		c.Header("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token, Authorization, Token,X-Token,X-User-Id\"")
 		c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS,DELETE,PUT")
 		c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type")
 		c.Header("Access-Control-Allow-Credentials", "true")
 
+		fmt.Println("method:", method)
 		// 放行所有OPTIONS方法
 		if method == "OPTIONS" {
 			c.AbortWithStatus(http.StatusNoContent)

+ 2 - 1
middleware/recover.go

@@ -5,6 +5,7 @@ import (
 	"github.com/gin-gonic/gin"
 	"hongze/hongze_yb/controller/response"
 	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/services"
 	"hongze/hongze_yb/utils"
 	"net/http"
 	"runtime"
@@ -38,7 +39,7 @@ func Recover() gin.HandlerFunc {
 				fmt.Println("stack:", stack)
 				response.Custom(http.StatusInternalServerError, "系统异常", c)
 				//c.JSON(http.StatusInternalServerError, Err)
-				go utils.SendEmail(utils.APPNAME+"崩了"+time.Now().Format("2006-01-02 15:04:05"), stack, utils.EmailSendToUsers)
+				go services.SendEmail(utils.APPNAME+"崩了"+time.Now().Format("2006-01-02 15:04:05"), stack, utils.EmailSendToUsers)
 				return
 			}
 		}()

+ 68 - 0
models/tables/chart_permission/chart_permission.go

@@ -0,0 +1,68 @@
+package chart_permission
+
+import "time"
+
+// ChartPermission 报告权限表
+type ChartPermission struct {
+	ChartPermissionID   uint64    `gorm:"primaryKey;column:chart_permission_id;type:bigint(20) unsigned;not null" json:"-"`                  // 主键
+	ChartPermissionName string    `gorm:"column:chart_permission_name;type:varchar(20)" json:"chartPermissionName"`                          // 名称
+	PermissionName      string    `gorm:"column:permission_name;type:varchar(50);default:''" json:"permissionName"`                          // 权限名
+	Sort                int       `gorm:"column:sort;type:int(10);default:1" json:"sort"`                                                    // 排序
+	Enabled             int8      `gorm:"column:enabled;type:tinyint(1);default:1" json:"enabled"`                                           // 是否可用
+	CreatedTime         time.Time `gorm:"index:created_time;column:created_time;type:datetime;default:CURRENT_TIMESTAMP" json:"createdTime"` // 创建时间
+	LastUpdatedTime     time.Time `gorm:"index:last_updated_time;column:last_updated_time;type:timestamp;not null;default:CURRENT_TIMESTAMP" json:"lastUpdatedTime"`
+	TeleconferenceSort  int       `gorm:"column:teleconference_sort;type:int(4);default:0" json:"teleconferenceSort"` // 电话会类型排序
+	Remark              string    `gorm:"column:remark;type:varchar(30)" json:"remark"`
+	ClassifyName        string    `gorm:"column:classify_name;type:varchar(50)" json:"classifyName"`
+	ProductName         string    `gorm:"column:product_name;type:varchar(50);default:''" json:"productName"`
+	ProductID           int       `gorm:"column:product_id;type:int(11);default:0" json:"productId"`
+	ImageURL            string    `gorm:"column:image_url;type:varchar(255)" json:"imageUrl"`                                  // 图片地址
+	ShowType            int8      `gorm:"column:show_type;type:tinyint(4);default:0" json:"showType"`                          // 1:查研观向小程序展示
+	IsOther             int8      `gorm:"column:is_other;type:tinyint(2);not null;default:0" json:"isOther"`                   // 是否是其他,用于查研观向小程序后台展示
+	IsReport            int8      `gorm:"index:is_report;column:is_report;type:tinyint(4);not null;default:0" json:"isReport"` // 是否是报告,用于查研观向小程序前台报告展示
+	CygxAuth            int8      `gorm:"column:cygx_auth;type:tinyint(4);not null;default:0" json:"cygxAuth"`                 // 是否是权限,用于查研观向小程序前台权限校验
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *ChartPermission) TableName() string {
+	return "chart_permission"
+}
+
+// ChartPermissionColumns get sql column name.获取数据库列名
+var ChartPermissionColumns = struct {
+	ChartPermissionID   string
+	ChartPermissionName string
+	PermissionName      string
+	Sort                string
+	Enabled             string
+	CreatedTime         string
+	LastUpdatedTime     string
+	TeleconferenceSort  string
+	Remark              string
+	ClassifyName        string
+	ProductName         string
+	ProductID           string
+	ImageURL            string
+	ShowType            string
+	IsOther             string
+	IsReport            string
+	CygxAuth            string
+}{
+	ChartPermissionID:   "chart_permission_id",
+	ChartPermissionName: "chart_permission_name",
+	PermissionName:      "permission_name",
+	Sort:                "sort",
+	Enabled:             "enabled",
+	CreatedTime:         "created_time",
+	LastUpdatedTime:     "last_updated_time",
+	TeleconferenceSort:  "teleconference_sort",
+	Remark:              "remark",
+	ClassifyName:        "classify_name",
+	ProductName:         "product_name",
+	ProductID:           "product_id",
+	ImageURL:            "image_url",
+	ShowType:            "show_type",
+	IsOther:             "is_other",
+	IsReport:            "is_report",
+	CygxAuth:            "cygx_auth",
+}

+ 110 - 0
models/tables/company/company.go

@@ -0,0 +1,110 @@
+package company
+
+import "time"
+
+// Company 客户表
+type Company struct {
+	CompanyID       uint64    `gorm:"primaryKey;column:company_id;type:bigint(20) unsigned;not null" json:"-"`                           // 客户id
+	CompanyName     string    `gorm:"index:company_name;column:company_name;type:varchar(100)" json:"companyName"`                       // 客户名称
+	CreditCode      string    `gorm:"column:credit_code;type:varchar(30)" json:"creditCode"`                                             // 社会统一信用码
+	CompanyCode     string    `gorm:"index:company_code;column:company_code;type:varchar(32)" json:"companyCode"`                        // 客户编码
+	Sort            int       `gorm:"column:sort;type:int(10);default:1" json:"sort"`                                                    // 优先级
+	IsFeeCustomer   int8      `gorm:"column:is_fee_customer;type:tinyint(1)" json:"isFeeCustomer"`                                       // 是否付费用户
+	Country         string    `gorm:"column:country;type:varchar(20)" json:"country"`                                                    // 国家编码
+	ProvinceID      int64     `gorm:"index:province_id;column:province_id;type:bigint(20)" json:"provinceId"`                            // 省id
+	CityID          int64     `gorm:"index:city_id;column:city_id;type:bigint(20)" json:"cityId"`                                        // 市id
+	Address         string    `gorm:"column:address;type:varchar(512)" json:"address"`                                                   // 详细地址
+	Type            int       `gorm:"column:type;type:int(10);default:1" json:"type"`                                                    // 客户标签,1:付费客户,2:试用客户,3:流失客户,4:潜在客户,5:永续
+	Enabled         int8      `gorm:"index:enabled;column:enabled;type:tinyint(1);default:1" json:"enabled"`                             // 用户状态
+	CreatedTime     time.Time `gorm:"index:created_time;column:created_time;type:datetime;default:CURRENT_TIMESTAMP" json:"createdTime"` // 创建时间
+	LastUpdatedTime time.Time `gorm:"index:last_updated_time;column:last_updated_time;type:timestamp;not null;default:CURRENT_TIMESTAMP" json:"lastUpdatedTime"`
+	Seller          string    `gorm:"column:seller;type:varchar(200)" json:"seller"`                            // 销售员
+	SellsID         int64     `gorm:"index:idx_sells_id;column:sells_id;type:bigint(20)" json:"sellsId"`        // 销售员id
+	CompanyBelong   string    `gorm:"column:company_belong;type:varchar(30);default:ficc" json:"companyBelong"` // 客户所属,ficc:ficc客户,public_offering:公募客户,partner:合作伙伴
+	StartDate       time.Time `gorm:"column:start_date;type:date" json:"startDate"`                             // 合同开始日期
+	EndDate         time.Time `gorm:"column:end_date;type:date" json:"endDate"`                                 // 合同结束日期
+	LoseReason      string    `gorm:"column:lose_reason;type:varchar(1024);default:''" json:"loseReason"`       // 流失原因
+	LastType        int       `gorm:"column:last_type;type:int(10)" json:"lastType"`                            // 原客户标签
+	LossTime        time.Time `gorm:"column:loss_time;type:datetime;not null" json:"lossTime"`                  // 流失时间
+	FirstStartDate  time.Time `gorm:"column:first_start_date;type:date" json:"firstStartDate"`                  // 首次设置为试用客户开始时间
+	FirstEndDate    time.Time `gorm:"column:first_end_date;type:date" json:"firstEndDate"`                      // 首次设置为试用客户结束时间
+	DateType        int       `gorm:"column:date_type;type:int(11);default:0" json:"dateType"`
+	Remark          string    `gorm:"column:remark;type:varchar(255)" json:"remark"`                               // 备注
+	Province        string    `gorm:"column:province;type:varchar(100);default:''" json:"province"`                // 省
+	City            string    `gorm:"column:city;type:varchar(100);default:''" json:"city"`                        // 市
+	IsVip           int8      `gorm:"column:is_vip;type:tinyint(4)" json:"isVip"`                                  // 0:普通用户,1:大客户
+	RegionType      string    `gorm:"column:region_type;type:varchar(30);default:''" json:"regionType"`            // 国内,海外
+	OpenCompanyCode string    `gorm:"column:open_company_code;type:varchar(64);default:''" json:"openCompanyCode"` // 开放给第三方的客户编码,不让第三方定位我们的客户信息
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *Company) TableName() string {
+	return "company"
+}
+
+// CompanyColumns get sql column name.获取数据库列名
+var CompanyColumns = struct {
+	CompanyID       string
+	CompanyName     string
+	CreditCode      string
+	CompanyCode     string
+	Sort            string
+	IsFeeCustomer   string
+	Country         string
+	ProvinceID      string
+	CityID          string
+	Address         string
+	Type            string
+	Enabled         string
+	CreatedTime     string
+	LastUpdatedTime string
+	Seller          string
+	SellsID         string
+	CompanyBelong   string
+	StartDate       string
+	EndDate         string
+	LoseReason      string
+	LastType        string
+	LossTime        string
+	FirstStartDate  string
+	FirstEndDate    string
+	DateType        string
+	Remark          string
+	Province        string
+	City            string
+	IsVip           string
+	RegionType      string
+	OpenCompanyCode string
+}{
+	CompanyID:       "company_id",
+	CompanyName:     "company_name",
+	CreditCode:      "credit_code",
+	CompanyCode:     "company_code",
+	Sort:            "sort",
+	IsFeeCustomer:   "is_fee_customer",
+	Country:         "country",
+	ProvinceID:      "province_id",
+	CityID:          "city_id",
+	Address:         "address",
+	Type:            "type",
+	Enabled:         "enabled",
+	CreatedTime:     "created_time",
+	LastUpdatedTime: "last_updated_time",
+	Seller:          "seller",
+	SellsID:         "sells_id",
+	CompanyBelong:   "company_belong",
+	StartDate:       "start_date",
+	EndDate:         "end_date",
+	LoseReason:      "lose_reason",
+	LastType:        "last_type",
+	LossTime:        "loss_time",
+	FirstStartDate:  "first_start_date",
+	FirstEndDate:    "first_end_date",
+	DateType:        "date_type",
+	Remark:          "remark",
+	Province:        "province",
+	City:            "city",
+	IsVip:           "is_vip",
+	RegionType:      "region_type",
+	OpenCompanyCode: "open_company_code",
+}

+ 122 - 0
models/tables/company_product/company_product.go

@@ -0,0 +1,122 @@
+package company_product
+
+import "time"
+
+// CompanyProduct [...]
+type CompanyProduct struct {
+	CompanyProductID int       `gorm:"primaryKey;column:company_product_id;type:int(11);not null" json:"-"`
+	CompanyID        int       `gorm:"uniqueIndex:idx_company_id_product_id;column:company_id;type:int(11);default:0" json:"companyId"` // 客户id
+	ProductID        int       `gorm:"uniqueIndex:idx_company_id_product_id;column:product_id;type:int(11);default:0" json:"productId"` // 产品id
+	ProductName      string    `gorm:"column:product_name;type:varchar(30);default:''" json:"productName"`
+	CompanyName      string    `gorm:"column:company_name;type:varchar(100);default:''" json:"companyName"`                   // 客户名称
+	Source           string    `gorm:"column:source;type:varchar(100);default:''" json:"source"`                              // 来源
+	Reasons          string    `gorm:"column:reasons;type:varchar(255);default:''" json:"reasons"`                            // 新增理由
+	Status           string    `gorm:"column:status;type:enum('试用','永续','冻结','流失','正式','潜在')" json:"status"`                  // 客户状态
+	IndustryID       int       `gorm:"column:industry_id;type:int(11)" json:"industryId"`                                     // 行业id
+	IndustryName     string    `gorm:"column:industry_name;type:varchar(50);default:''" json:"industryName"`                  // 行业名称
+	SellerID         int       `gorm:"column:seller_id;type:int(11);default:0" json:"sellerId"`                               // 所属销售id
+	SellerName       string    `gorm:"column:seller_name;type:varchar(50);default:''" json:"sellerName"`                      // 所属销售名称
+	GroupID          int       `gorm:"column:group_id;type:int(11);default:0" json:"groupId"`                                 // 所属销售分组id
+	DepartmentID     int       `gorm:"column:department_id;type:int(11);default:0" json:"departmentId"`                       // 所属销售部门id
+	IsSuspend        int8      `gorm:"primaryKey;column:is_suspend;type:tinyint(4);not null;default:0" json:"-"`              // 1:暂停,0:启用
+	SuspendTime      time.Time `gorm:"column:suspend_time;type:datetime" json:"suspendTime"`                                  // 暂停/启用时间
+	TryOutTime       time.Time `gorm:"column:try_out_time;type:datetime" json:"tryOutTime"`                                   // 正式转试用时间
+	RenewalReason    string    `gorm:"column:renewal_reason;type:varchar(255);default:''" json:"renewalReason"`               // 正式转试用后的续约情况说明
+	FreezeTime       time.Time `gorm:"column:freeze_time;type:datetime" json:"freezeTime"`                                    // 冻结时间
+	FreezeReason     string    `gorm:"column:freeze_reason;type:varchar(255);default:''" json:"freezeReason"`                 // 冻结理由
+	Remark           string    `gorm:"column:remark;type:varchar(255);default:''" json:"remark"`                              // 备注信息
+	StartDate        time.Time `gorm:"column:start_date;type:date" json:"startDate"`                                          // 开始日期
+	EndDate          time.Time `gorm:"column:end_date;type:date" json:"endDate"`                                              // 结束日期
+	ContractEndDate  time.Time `gorm:"index:idx_contract_end_date;column:contract_end_date;type:date" json:"contractEndDate"` // 合同结束日期
+	CreateTime       time.Time `gorm:"column:create_time;type:datetime" json:"createTime"`                                    // 创建时间
+	ModifyTime       time.Time `gorm:"column:modify_time;type:datetime" json:"modifyTime"`                                    // 修改时间
+	LoseReason       string    `gorm:"column:lose_reason;type:varchar(255);default:''" json:"loseReason"`                     // 流失原因
+	LossTime         time.Time `gorm:"column:loss_time;type:datetime" json:"lossTime"`                                        // 流失时间
+	ApproveStatus    string    `gorm:"column:approve_status;type:enum('待审批','已审批','驳回','已撤回')" json:"approveStatus"`          // 审批状态
+	CompanyType      string    `gorm:"column:company_type;type:varchar(20);default:''" json:"companyType"`                    // 客户类型:ficc,权益,合作伙伴
+	FreezeStartDate  time.Time `gorm:"column:freeze_start_date;type:date" json:"freezeStartDate"`                             // 冻结开始日期
+	FreezeEndDate    time.Time `gorm:"column:freeze_end_date;type:date" json:"freezeEndDate"`                                 // 冻结结束日期
+	CustomType       int8      `gorm:"column:custom_type;type:tinyint(4);default:0" json:"customType"`                        // 1:合作伙伴,2:公募,3:私募
+	FormalTime       time.Time `gorm:"column:formal_time;type:datetime" json:"formalTime"`                                    // 转正时间
+	OpenCode         string    `gorm:"column:open_code;type:varchar(64);default:''" json:"openCode"`                          // 开放给第三方的编码,不让第三方定位我们的客户信息
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *CompanyProduct) TableName() string {
+	return "company_product"
+}
+
+// CompanyProductColumns get sql column name.获取数据库列名
+var CompanyProductColumns = struct {
+	CompanyProductID string
+	CompanyID        string
+	ProductID        string
+	ProductName      string
+	CompanyName      string
+	Source           string
+	Reasons          string
+	Status           string
+	IndustryID       string
+	IndustryName     string
+	SellerID         string
+	SellerName       string
+	GroupID          string
+	DepartmentID     string
+	IsSuspend        string
+	SuspendTime      string
+	TryOutTime       string
+	RenewalReason    string
+	FreezeTime       string
+	FreezeReason     string
+	Remark           string
+	StartDate        string
+	EndDate          string
+	ContractEndDate  string
+	CreateTime       string
+	ModifyTime       string
+	LoseReason       string
+	LossTime         string
+	ApproveStatus    string
+	CompanyType      string
+	FreezeStartDate  string
+	FreezeEndDate    string
+	CustomType       string
+	FormalTime       string
+	OpenCode         string
+}{
+	CompanyProductID: "company_product_id",
+	CompanyID:        "company_id",
+	ProductID:        "product_id",
+	ProductName:      "product_name",
+	CompanyName:      "company_name",
+	Source:           "source",
+	Reasons:          "reasons",
+	Status:           "status",
+	IndustryID:       "industry_id",
+	IndustryName:     "industry_name",
+	SellerID:         "seller_id",
+	SellerName:       "seller_name",
+	GroupID:          "group_id",
+	DepartmentID:     "department_id",
+	IsSuspend:        "is_suspend",
+	SuspendTime:      "suspend_time",
+	TryOutTime:       "try_out_time",
+	RenewalReason:    "renewal_reason",
+	FreezeTime:       "freeze_time",
+	FreezeReason:     "freeze_reason",
+	Remark:           "remark",
+	StartDate:        "start_date",
+	EndDate:          "end_date",
+	ContractEndDate:  "contract_end_date",
+	CreateTime:       "create_time",
+	ModifyTime:       "modify_time",
+	LoseReason:       "lose_reason",
+	LossTime:         "loss_time",
+	ApproveStatus:    "approve_status",
+	CompanyType:      "company_type",
+	FreezeStartDate:  "freeze_start_date",
+	FreezeEndDate:    "freeze_end_date",
+	CustomType:       "custom_type",
+	FormalTime:       "formal_time",
+	OpenCode:         "open_code",
+}

+ 56 - 0
models/tables/company_report_permission/company_report_permission.go

@@ -0,0 +1,56 @@
+package company_report_permission
+
+import "time"
+
+// CompanyReportPermission 客户权限表
+type CompanyReportPermission struct {
+	CompanyReportPermissionID uint64    `gorm:"primaryKey;column:company_report_permission_id;type:bigint(20) unsigned;not null" json:"-"`         // 主键
+	CompanyID                 int64     `gorm:"uniqueIndex:uni_key;column:company_id;type:bigint(20);default:0" json:"companyId"`                  // 客户id
+	ReportPermissionID        int64     `gorm:"column:report_permission_id;type:bigint(20)" json:"reportPermissionId"`                             // 报告权限id
+	CreatedTime               time.Time `gorm:"index:created_time;column:created_time;type:datetime;default:CURRENT_TIMESTAMP" json:"createdTime"` // 创建时间
+	LastUpdatedTime           time.Time `gorm:"index:last_updated_time;column:last_updated_time;type:timestamp;not null;default:CURRENT_TIMESTAMP" json:"lastUpdatedTime"`
+	ChartPermissionID         int       `gorm:"uniqueIndex:uni_key;column:chart_permission_id;type:int(11);default:0" json:"chartPermissionId"` // 大分类ID
+	StartDate                 time.Time `gorm:"column:start_date;type:date" json:"startDate"`                                                   // 权限开始日期
+	EndDate                   time.Time `gorm:"column:end_date;type:date" json:"endDate"`                                                       // 权限结束日期
+	ProductID                 int       `gorm:"index:idx_product_id;column:product_id;type:int(11);default:0" json:"productId"`                 // 产品id
+	ProductName               string    `gorm:"column:product_name;type:varchar(20);default:''" json:"productName"`                             // 产品名称
+	ModifyTime                time.Time `gorm:"column:modify_time;type:datetime" json:"modifyTime"`                                             // 修改时间
+	CompanyContractID         int       `gorm:"column:company_contract_id;type:int(11);default:0" json:"companyContractId"`                     // 合同id
+	Status                    string    `gorm:"column:status;type:enum('正式','试用','关闭','永续','潜在')" json:"status"`
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *CompanyReportPermission) TableName() string {
+	return "company_report_permission"
+}
+
+// CompanyReportPermissionColumns get sql column name.获取数据库列名
+var CompanyReportPermissionColumns = struct {
+	CompanyReportPermissionID string
+	CompanyID                 string
+	ReportPermissionID        string
+	CreatedTime               string
+	LastUpdatedTime           string
+	ChartPermissionID         string
+	StartDate                 string
+	EndDate                   string
+	ProductID                 string
+	ProductName               string
+	ModifyTime                string
+	CompanyContractID         string
+	Status                    string
+}{
+	CompanyReportPermissionID: "company_report_permission_id",
+	CompanyID:                 "company_id",
+	ReportPermissionID:        "report_permission_id",
+	CreatedTime:               "created_time",
+	LastUpdatedTime:           "last_updated_time",
+	ChartPermissionID:         "chart_permission_id",
+	StartDate:                 "start_date",
+	EndDate:                   "end_date",
+	ProductID:                 "product_id",
+	ProductName:               "product_name",
+	ModifyTime:                "modify_time",
+	CompanyContractID:         "company_contract_id",
+	Status:                    "status",
+}

+ 24 - 0
models/tables/company_report_permission/query.go

@@ -0,0 +1,24 @@
+package company_report_permission
+
+import (
+	"errors"
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/utils"
+)
+
+// GetListByCompany2ProductId 根据
+func GetListByCompany2ProductId(companyId, productId int) (list []*CompanyReportPermission, err error) {
+	err = global.DEFAULT_MYSQL.Where("company_id = ? and product_id = ?", companyId, productId).Find(&list).Error
+	return
+}
+
+// GetByWhereMap 根据查询条件map获取信息
+func GetByWhereMap(where map[string]interface{}) (list []*CompanyReportPermission, err error) {
+	cond, whereVal, buildErr := utils.WhereBuild(where)
+	if buildErr != nil {
+		err = errors.New("系统异常,生成查询语句失败")
+		return
+	}
+	err = global.DEFAULT_MYSQL.Where(cond, whereVal...).Find(&list).Error
+	return
+}

+ 9 - 0
models/tables/rddp/msg_code/create.go

@@ -0,0 +1,9 @@
+package msg_code
+
+import "hongze/hongze_yb/models/tables/rddp"
+
+//  Create 新增记录
+func (msgCode *MsgCode) Create() (err error) {
+	err = rddp.GetDb().Create(msgCode).Error
+	return
+}

+ 5 - 1
routers/user.go

@@ -9,5 +9,9 @@ import (
 func InitUser(r *gin.Engine) {
 	rGroup := r.Group("user").Use(middleware.TokenNoLogin())
 
-	rGroup.POST("/login", user.Login)
+	{
+		rGroup.POST("/login", user.Login)
+		rGroup.GET("/get_sms_code", user.GetSmsCode)
+		rGroup.GET("/get_email_code", user.GetEmailCode)
+	}
 }

+ 27 - 0
services/company/permission.go

@@ -0,0 +1,27 @@
+package company
+
+import (
+	"hongze/hongze_yb/models/tables/company_report_permission"
+)
+
+// GetValidPermissionByCompany2ProductId 根据客户id和产品id获取有效的权限列表
+func GetValidPermissionByCompany2ProductId(companyId, productId int) (list []*company_report_permission.CompanyReportPermission, err error) {
+	where := make(map[string]interface{})
+	where["company_id ="] = companyId
+	where["product_id ="] = productId
+	where["status in"] = []string{"正式", "试用", "永续"}
+	list, err = company_report_permission.GetByWhereMap(where)
+	return
+}
+
+// GetValidPermissionIdListByCompany2ProductId 根据客户id和产品id获取有效的权限id列表
+func GetValidPermissionIdListByCompany2ProductId(companyId, productId int) (list []int, err error) {
+	companyReportPermissionList, err := GetValidPermissionByCompany2ProductId(companyId, productId)
+	if err != nil {
+		return
+	}
+	for _, v := range companyReportPermissionList {
+		list = append(list, v.ChartPermissionID)
+	}
+	return
+}

+ 29 - 2
services/email.go

@@ -1,9 +1,10 @@
-package utils
+package services
 
 import (
 	"fmt"
 	"gopkg.in/gomail.v2"
 	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/utils"
 	"strings"
 )
 
@@ -26,7 +27,7 @@ func SendEmail(title, content string, touser string) bool {
 	m := gomail.NewMessage()
 	m.SetHeader("From", "317699326@qq.com ")
 	m.SetHeader("To", arr...)
-	m.SetHeader("Subject", title+" "+GetRandString(16))
+	m.SetHeader("Subject", title+" "+utils.GetRandString(16))
 	m.SetBody("text/html", content)
 	d := gomail.NewDialer("smtp.qq.com", 587, "317699326@qq.com", "oqdypwfcvruwcbea")
 	if err := d.DialAndSend(m); err != nil {
@@ -34,3 +35,29 @@ func SendEmail(title, content string, touser string) bool {
 	}
 	return true
 }
+
+//发送邮件
+func SendEmailByHz(title, content string, touser string) (result bool, err error) {
+	var arr []string
+	sub := strings.Index(touser, ";")
+	if sub >= 0 {
+		spArr := strings.Split(touser, ";")
+		for _, v := range spArr {
+			arr = append(arr, v)
+		}
+	} else {
+		arr = append(arr, touser)
+	}
+	m := gomail.NewMessage()
+	m.SetHeader("From", "public@hzinsights.com")
+	m.SetHeader("To", arr...)
+	m.SetHeader("Subject", title)
+	m.SetBody("text/html", content)
+	d := gomail.NewDialer("smtp.mxhichina.com", 465, "public@hzinsights.com", "Hzinsights2018")
+	if err := d.DialAndSend(m); err != nil {
+		result = false
+		return result, err
+	}
+	result = true
+	return
+}

+ 118 - 0
services/sms.go

@@ -0,0 +1,118 @@
+package services
+
+import (
+	"encoding/json"
+	"fmt"
+	"hongze/hongze_yb/utils"
+	"io/ioutil"
+	"net/http"
+	"net/url"
+)
+
+// SendSmsCode 发送国内短信
+func SendSmsCode(mobile, vcode string) bool {
+	flag := false
+	tplId := "65692"
+	result, err := sendSms(mobile, tplId, vcode)
+	if err != nil {
+		fmt.Println("发送短信失败")
+		return false
+	}
+	fmt.Println("result", string(result))
+	var netReturn map[string]interface{}
+	err = json.Unmarshal(result, &netReturn)
+	if err != nil {
+		go SendEmail("短信验证码发送失败", "err:"+err.Error()+" result"+string(result), utils.EmailSendToUsers)
+		flag = false
+	}
+	if netReturn["error_code"].(float64) == 0 {
+		fmt.Printf("接口返回result字段是:\r\n%v", netReturn["result"])
+		flag = true
+	} else {
+		go SendEmail("短信验证码发送失败", " result"+string(result), utils.EmailSendToUsers)
+		flag = false
+	}
+	return flag
+}
+
+// sendSms 发送国内短信
+func sendSms(mobile, tplId, code string) (rs []byte, err error) {
+	var Url *url.URL
+	apiURL := "http://v.juhe.cn/sms/send"
+	//初始化参数
+	param := url.Values{}
+	//配置请求参数,方法内部已处理urlencode问题,中文参数可以直接传参
+	param.Set("mobile", mobile)            //接受短信的用户手机号码
+	param.Set("tpl_id", tplId)             //您申请的短信模板ID,根据实际情况修改
+	param.Set("tpl_value", "#code#="+code) //您设置的模板变量,根据实际情况
+	param.Set("key", utils.JhGnAppKey)     //应用APPKEY(应用详细页查询)
+
+	Url, err = url.Parse(apiURL)
+	if err != nil {
+		fmt.Printf("解析url错误:\r\n%v", err)
+		return nil, err
+	}
+	//如果参数中有中文参数,这个方法会进行URLEncode
+	Url.RawQuery = param.Encode()
+	resp, err := http.Get(Url.String())
+	if err != nil {
+		fmt.Println("err:", err)
+		return nil, err
+	}
+	defer resp.Body.Close()
+	return ioutil.ReadAll(resp.Body)
+}
+
+// SendSmsCodeGj 发送国际短信
+func SendSmsCodeGj(mobile, vcode, areaNum string) bool {
+	flag := false
+	result, err := sendSmsGj(mobile, vcode, areaNum)
+	if err != nil {
+		fmt.Println("发送短信失败")
+		return false
+	}
+	fmt.Println("result", string(result))
+	var netReturn map[string]interface{}
+	err = json.Unmarshal(result, &netReturn)
+	if err != nil {
+		go SendEmail("短信验证码发送失败", "err:"+err.Error()+" result"+string(result), utils.EmailSendToUsers)
+		flag = false
+	}
+	if netReturn["error_code"].(float64) == 0 {
+		fmt.Printf("接口返回result字段是:\r\n%v", netReturn["result"])
+		flag = true
+	} else {
+		go SendEmail("短信验证码发送失败", " result"+string(result), utils.EmailSendToUsers)
+		flag = false
+	}
+	return flag
+}
+
+// sendSmsGj 发送国际短信
+func sendSmsGj(mobile, code, areaNum string) (rs []byte, err error) {
+	var Url *url.URL
+	apiURL := "http://v.juhe.cn/smsInternational/send.php"
+	//初始化参数
+	param := url.Values{}
+	//配置请求参数,方法内部已处理urlencode问题,中文参数可以直接传参
+	param.Set("mobile", mobile)           //接受短信的用户手机号码
+	param.Set("tplId", "10054")           //您申请的短信模板ID,根据实际情况修改
+	param.Set("tplValue", "#code#="+code) //您设置的模板变量,根据实际情况
+	param.Set("key", utils.JhGjAppKey)    //应用APPKEY(应用详细页查询)
+	param.Set("areaNum", areaNum)         //应用APPKEY(应用详细页查询)
+
+	Url, err = url.Parse(apiURL)
+	if err != nil {
+		fmt.Printf("解析url错误:\r\n%v", err)
+		return nil, err
+	}
+	//如果参数中有中文参数,这个方法会进行URLEncode
+	Url.RawQuery = param.Encode()
+	resp, err := http.Get(Url.String())
+	if err != nil {
+		fmt.Println("err:", err)
+		return nil, err
+	}
+	defer resp.Body.Close()
+	return ioutil.ReadAll(resp.Body)
+}

+ 10 - 0
utils/constants.go

@@ -4,6 +4,7 @@ package utils
 const (
 	FormatTime            = "15:04:05"                //时间格式
 	FormatDate            = "2006-01-02"              //日期格式
+	FormatDateCN          = "2006年01月02日"             //日期格式(中文)
 	FormatDateUnSpace     = "20060102"                //日期格式
 	FormatDateTime        = "2006-01-02 15:04:05"     //完整时间格式
 	HlbFormatDateTime     = "2006-01-02_15:04:05.999" //完整时间格式
@@ -26,3 +27,12 @@ const (
 	//EmailSendToUsers = "glji@hzinsights.com;pyan@hzinsights.com;cxzhang@hzinsights.com"
 	EmailSendToUsers = "pyan@hzinsights.com"
 )
+
+//聚合短信
+var (
+	JhGnTplId = "65692" //聚合国内模板编码
+	JhGjTplId = "10054" //聚合国内模板编码
+
+	JhGnAppKey = "4c8504c49dd335e99cfd7b6a3a9e2415" //聚合国内AppKey
+	JhGjAppKey = "3326ad2c1047a4cd92ace153e6044ca3"
+)