diff --git a/app/api/admin/api/order.go b/app/api/admin/api/order.go new file mode 100644 index 0000000..6922c70 --- /dev/null +++ b/app/api/admin/api/order.go @@ -0,0 +1,38 @@ +package api + +import ( + "SciencesServer/app/api/admin/controller/order" + "SciencesServer/app/basic/api" + "SciencesServer/app/session" + "github.com/gin-gonic/gin" +) + +type Order struct{} + +func (*Order) Instance(c *gin.Context) { + form := &struct { + OrderNo string `json:"order_no" form:"order_no"` + Name string `json:"name" form:"name"` + Mobile string `json:"mobile" form:"mobile"` + Status string `json:"status" form:"status"` + api.PageForm + }{} + if err := api.Bind(form)(c); err != nil { + api.APIFailure(err.(error))(c) + return + } + data, err := order.NewInstance()(api.GetSession()(c).(*session.Admin)).Index(form.OrderNo, form.Name, form.Name, + form.Status, form.Page, form.PageSize) + api.APIResponse(err, data)(c) +} + +func (*Order) Detail(c *gin.Context) { + form := new(api.IDStringForm) + + if err := api.Bind(form)(c); err != nil { + api.APIFailure(err.(error))(c) + return + } + data, err := order.NewInstance()(api.GetSession()(c).(*session.Admin)).Detail(form.Convert()) + api.APIResponse(err, data)(c) +} diff --git a/app/api/admin/api/service.go b/app/api/admin/api/service.go index 71a737b..d08cf61 100644 --- a/app/api/admin/api/service.go +++ b/app/api/admin/api/service.go @@ -201,8 +201,9 @@ func (*Service) SolutionCaseKindForm(c *gin.Context) { form := &struct { api.IDStringForm api.TenantIDStringForm - Mode int `json:"mode" form:"mode" binding:"required"` - Title string `json:"title" form:"title" binding:"required"` + Mode int `json:"mode" form:"mode" binding:"required"` + Title string `json:"title" form:"title" binding:"required"` + Description string `json:"description" form:"description" binding:"required"` api.ImageForm Sort int `json:"sort" form:"sort"` }{} @@ -212,7 +213,7 @@ func (*Service) SolutionCaseKindForm(c *gin.Context) { } err := service.NewSolutionCase()(api.GetSession()(c).(*session.Admin)).KindForm(&service.SolutionCaseKindParams{ ID: form.IDStringForm.Convert(), TenantID: form.TenantIDStringForm.Convert(), Mode: form.Mode, - Image: form.FilterImageURL(), Title: form.Title, Sort: form.Sort, + Description: form.Description, Image: form.FilterImageURL(), Title: form.Title, Sort: form.Sort, }) api.APIResponse(err)(c) } diff --git a/app/api/admin/controller/manage/company.go b/app/api/admin/controller/manage/company.go index 36bb94a..f32f2fc 100644 --- a/app/api/admin/controller/manage/company.go +++ b/app/api/admin/controller/manage/company.go @@ -97,7 +97,7 @@ func (c *Company) Form(params *BasicParams, other *config.IdentityForCompany) er if params.ID > 0 { mManageCompany.ID = params.ID - isExist, err := model2.FirstField(mManageCompany.ManageCompany, []string{"id", "name", "code", "tenant_id", "created_at"}) + isExist, err := model2.FirstField(mManageCompany.ManageCompany, []string{"id", "name", "code", "tenant_id", "examine_status", "created_at"}) if err != nil { return err diff --git a/app/api/admin/controller/manage/expert.go b/app/api/admin/controller/manage/expert.go index 270c1c4..d204dba 100644 --- a/app/api/admin/controller/manage/expert.go +++ b/app/api/admin/controller/manage/expert.go @@ -5,10 +5,12 @@ import ( "SciencesServer/app/basic/config" "SciencesServer/app/basic/controller" model2 "SciencesServer/app/common/model" + "SciencesServer/app/service" "SciencesServer/app/session" config2 "SciencesServer/config" "SciencesServer/utils" "errors" + "strings" "time" ) @@ -136,7 +138,7 @@ func (c *Expert) Form(params *BasicParams, other *config.IdentityForExpert) erro if params.ID > 0 { mManageExpert.ID = params.ID - isExist, err := model2.FirstField(mManageExpert.ManageExpert, []string{"id", "name", "mobile", "tenant_id", "created_at"}) + isExist, err := model2.FirstField(mManageExpert.ManageExpert, []string{"id", "name", "mobile", "tenant_id", "examine_status", "created_at"}) if err != nil { return err @@ -158,6 +160,7 @@ func (c *Expert) Form(params *BasicParams, other *config.IdentityForExpert) erro } } mManageExpert.TenantID = c.TenantID + mManageExpert.Name = params.Name mManageExpert.ResearchID = other.ConvertResearch() mManageExpert.LaboratoryID = other.ConvertLaboratory() mManageExpert.Image.Image = params.Image @@ -179,11 +182,26 @@ func (c *Expert) Form(params *BasicParams, other *config.IdentityForExpert) erro if c.TenantID <= 0 { mManageExpert.TenantID = params.TenantID } + _industrys := make([]string, 0) + + for _, v := range params.Industrys { + _industrys = append(_industrys, config.GetIndustryInfo(v, "-", "-").Value) + } + manage := service.NewESManage( + service.WithManageIdentity(config.TenantUserIdentityForExpert), + service.WithManageIndustry(strings.Join(_industrys, ";")), + service.WithManageKeyword(strings.Join(params.Keywords, ";")), + ) if mManageExpert.ID > 0 { - return model2.Updates(mManageExpert.ManageExpert, mManageExpert.ManageExpert) + if err := model2.Updates(mManageExpert.ManageExpert, mManageExpert.ManageExpert); err != nil { + return err + } + if mManageExpert.ExamineStatus == model2.ExamineStatusForAgree { + _ = manage.Update() + } + return nil } // 查询手机号码是否在当前租户下是否已经注册了 - mManageExpert.Name = params.Name mManageExpert.Mobile = params.Mobile mManageExpert.ExamineStatus = model2.ExamineStatusForAgree mManageExpert.ExamineRemark = "主动创建,无需审核" @@ -194,7 +212,13 @@ func (c *Expert) Form(params *BasicParams, other *config.IdentityForExpert) erro } else if isExist { return errors.New("操作错误,已存在相同手机号码") } - return model2.Create(mManageExpert.ManageExpert) + if err := model2.Create(mManageExpert.ManageExpert); err != nil { + return err + } + service.WithManageID(mManageExpert.ID)(manage) + service.WithManageTitle(params.Name)(manage) + + return manage.Create() } // Patent 专利信息 diff --git a/app/api/admin/controller/manage/laboratory.go b/app/api/admin/controller/manage/laboratory.go index 2121d26..a9283bb 100644 --- a/app/api/admin/controller/manage/laboratory.go +++ b/app/api/admin/controller/manage/laboratory.go @@ -119,7 +119,7 @@ func (c *Laboratory) Form(params *BasicParams, other *config.IdentityForLaborato if params.ID > 0 { mManageLaboratory.ID = params.ID - isExist, err := model2.FirstField(mManageLaboratory.ManageLaboratory, []string{"id", "name", "code", "tenant_id", "created_at"}) + isExist, err := model2.FirstField(mManageLaboratory.ManageLaboratory, []string{"id", "name", "code", "tenant_id", "examine_status", "created_at"}) if err != nil { return err diff --git a/app/api/admin/controller/manage/research.go b/app/api/admin/controller/manage/research.go index bb9daff..217100c 100644 --- a/app/api/admin/controller/manage/research.go +++ b/app/api/admin/controller/manage/research.go @@ -128,7 +128,7 @@ func (c *Research) Form(params *BasicParams, other *config.IdentityForResearch) if params.ID > 0 { mManageResearch.ID = params.ID - isExist, err := model2.FirstField(mManageResearch.ManageResearch, []string{"id", "name", "code", "tenant_id", "created_at"}) + isExist, err := model2.FirstField(mManageResearch.ManageResearch, []string{"id", "name", "code", "tenant_id", "examine_status", "created_at"}) if err != nil { return err diff --git a/app/api/admin/controller/order/instance.go b/app/api/admin/controller/order/instance.go new file mode 100644 index 0000000..1921894 --- /dev/null +++ b/app/api/admin/controller/order/instance.go @@ -0,0 +1,99 @@ +package order + +import ( + "SciencesServer/app/api/admin/model" + "SciencesServer/app/basic/controller" + model2 "SciencesServer/app/common/model" + "SciencesServer/app/session" + "SciencesServer/utils" + "errors" +) + +type Instance struct { + *session.Admin +} + +type InstanceHandle func(session *session.Admin) *Instance + +type ( + // InstanceInfo 订单信息 + InstanceInfo struct { + ID string `json:"id"` + *model.OrderInstanceInfo + } + // InstanceDetail 订单详细信息 + InstanceDetail struct { + ID string `json:"id"` + *model.OrderInstanceInfo + Params *model2.OrderInstanceParams `json:"params"` + } + // InstancePageInfo 订单分页信息 + InstancePageInfo struct { + *controller.ReturnPages + Amount float64 `json:"amount"` + } +) + +// Index 首页信息 +func (c *Instance) Index(orderNo, name, mobile, status string, page, pageSize int) (*InstancePageInfo, error) { + mOrderInstance := model.NewOrderInstance() + + var count int64 + + where := make([]*model2.ModelWhere, 0) + + if orderNo != "" { + where = append(where, model2.NewWhereLike("o.order_no", orderNo)) + } + if name != "" { + where = append(where, model2.NewWhereLike("u.name", name)) + } + if mobile != "" { + where = append(where, model2.NewWhereLike("u.mobile", mobile)) + } + if status != "" { + where = append(where, model2.NewWhereLike("o.status", utils.StringToInt(status))) + } + var amount float64 + + out, err := mOrderInstance.Orders(page, pageSize, &count, &amount) + + if err != nil { + return nil, err + } + list := make([]*InstanceInfo, 0) + + for _, v := range out { + list = append(list, &InstanceInfo{ + ID: v.GetEncodeID(), OrderInstanceInfo: v, + }) + } + return &InstancePageInfo{ + ReturnPages: &controller.ReturnPages{Data: list, Count: count}, + Amount: amount, + }, nil +} + +// Detail 详细信息 +func (c *Instance) Detail(id uint64) (*InstanceDetail, error) { + mOrderInstance := model.NewOrderInstance() + + out, err := mOrderInstance.Detail(id) + + if err != nil { + return nil, err + } else if out.ID <= 0 { + return nil, errors.New("操作错误,订单信息不存在或已被删除") + } + return &InstanceDetail{ + ID: mOrderInstance.GetEncodeID(), + OrderInstanceInfo: out, + Params: out.GetParamsAttribute(), + }, nil +} + +func NewInstance() InstanceHandle { + return func(session *session.Admin) *Instance { + return &Instance{session} + } +} diff --git a/app/api/admin/controller/service/solution_case.go b/app/api/admin/controller/service/solution_case.go index 921ee70..561482e 100644 --- a/app/api/admin/controller/service/solution_case.go +++ b/app/api/admin/controller/service/solution_case.go @@ -50,10 +50,10 @@ type ( } // SolutionCaseKindParams 案例分类参数信息 SolutionCaseKindParams struct { - ID, TenantID uint64 - Mode int - Title, Image string - Sort int + ID, TenantID uint64 + Mode int + Title, Image, Description string + Sort int } ) @@ -260,7 +260,8 @@ func (c *SolutionCase) KindForm(params *SolutionCaseKindParams) error { if params.ID > 0 { mServiceSolutionCaseKind.ID = params.ID - isExist, err := model2.FirstField(mServiceSolutionCaseKind.ServiceSolutionCaseKind, []string{"id", "tenant_id", "created_at"}) + isExist, err := model2.FirstField(mServiceSolutionCaseKind.ServiceSolutionCaseKind, + []string{"id", "tenant_id", "created_at"}) if err != nil { return err @@ -274,6 +275,7 @@ func (c *SolutionCase) KindForm(params *SolutionCaseKindParams) error { mServiceSolutionCaseKind.Mode = model2.ServiceSolutionCaseMode(params.Mode) mServiceSolutionCaseKind.Title = params.Title mServiceSolutionCaseKind.Image.Image = params.Image + mServiceSolutionCaseKind.Description = params.Description mServiceSolutionCaseKind.Sort = params.Sort if mServiceSolutionCaseKind.ID > 0 { diff --git a/app/api/admin/controller/sys/banner_test.go b/app/api/admin/controller/sys/banner_test.go index cd7b7fa..065bbad 100644 --- a/app/api/admin/controller/sys/banner_test.go +++ b/app/api/admin/controller/sys/banner_test.go @@ -8,13 +8,8 @@ import ( func TestNewBanner(t *testing.T) { banner := new(Banner) out := []string{ - "首页banner", - "登录注册", + "首页>1>首页", "解决方案>中小型企业", - "解决方案>大型企业", - "找专家>专家列表", - "找专家>专家列表1", - "找专家>专家列表>专家详情", } _out := banner.filter(out, ">") t.Log(_out) diff --git a/app/api/admin/controller/technology/patent.go b/app/api/admin/controller/technology/patent.go index c3d03c1..face4df 100644 --- a/app/api/admin/controller/technology/patent.go +++ b/app/api/admin/controller/technology/patent.go @@ -248,7 +248,7 @@ func (c *Patent) Filter(applyName, inventor string) (*PatentFilterInfo, error) { experts := make([]*model2.ManageExpert, 0) - if err = model2.ScanFields(mManageExpert.ManageExpert, &experts, []string{"id", "uid", "name", "mobile"}, + if err = model2.ScanFields(mManageExpert.ManageExpert, &experts, []string{"id", "name", "mobile"}, &model2.ModelWhereOrder{ Where: model2.NewWhere("name", inventor), }, &model2.ModelWhereOrder{ @@ -288,7 +288,7 @@ func (c *Patent) Delete(id uint64) error { mTechnologyPatent := model.NewTechnologyPatent() mTechnologyPatent.ID = id - isExist, err := model2.FirstField(mTechnologyPatent.TechnologyPatent, []string{"id", "uid", "tenant_id"}) + isExist, err := model2.FirstField(mTechnologyPatent.TechnologyPatent, []string{"id"}) if err != nil { return err diff --git a/app/api/admin/model/order_instance.go b/app/api/admin/model/order_instance.go new file mode 100644 index 0000000..5b06531 --- /dev/null +++ b/app/api/admin/model/order_instance.go @@ -0,0 +1,61 @@ +package model + +import ( + "SciencesServer/app/common/model" + "SciencesServer/serve/orm" + "fmt" +) + +type OrderInstance struct { + *model.OrderInstance +} + +// OrderInstanceInfo 订单信息 +type OrderInstanceInfo struct { + *model.OrderInstance + Name string `json:"name"` + Mobile string `json:"mobile"` +} + +// Orders 订单信息 +func (m *OrderInstance) Orders(page, pageSize int, count *int64, amount *float64, where ...*model.ModelWhere) ([]*OrderInstanceInfo, error) { + db := orm.GetDB().Table(m.TableName()+" AS o"). + Select("o.*", "u.name", "u.mobile"). + Joins(fmt.Sprintf("LEFT JOIN %s AS u ON o.uid = u.uuid", model.NewUserInstance().TableName())). + Where("o.is_deleted = ?", model.DeleteStatusForNot) + + if len(where) > 0 { + for _, v := range where { + db = db.Where(v.Condition, v.Value) + } + } + out := make([]*OrderInstanceInfo, 0) + + if err := db.Count(count).Error; err != nil { + return nil, err + } + + if err := db.Order("o.id " + model.OrderModeToDesc).Offset((page - 1) * pageSize).Limit(pageSize).Scan(&out).Error; err != nil { + return nil, err + } + return out, nil +} + +// Detail 订单信息 +func (m *OrderInstance) Detail(id uint64) (*OrderInstanceInfo, error) { + db := orm.GetDB().Table(m.TableName()+" AS o"). + Select("o.*", "u.name", "u.mobile"). + Joins(fmt.Sprintf("LEFT JOIN %s AS u ON o.uid = u.uuid", model.NewUserInstance().TableName())). + Where("o.id = ?", id) + + out := new(OrderInstanceInfo) + + if err := db.Scan(&out).Error; err != nil { + return nil, err + } + return out, nil +} + +func NewOrderInstance() *OrderInstance { + return &OrderInstance{model.NewOrderInstance()} +} diff --git a/app/api/enterprise/api/payment.go b/app/api/enterprise/api/payment.go deleted file mode 100644 index 778f64e..0000000 --- a/app/api/enterprise/api/payment.go +++ /dev/null @@ -1 +0,0 @@ -package api diff --git a/app/api/enterprise/api/technology.go b/app/api/enterprise/api/technology.go index 6fdfbbd..5cf6fcd 100644 --- a/app/api/enterprise/api/technology.go +++ b/app/api/enterprise/api/technology.go @@ -116,8 +116,9 @@ type ( } // achievementForm 成果参数 achievementForm struct { - Mode int `json:"mode" form:"mode" binding:"required"` - Title string `json:"title" form:"title" binding:"required"` + Mode int `json:"mode" form:"mode" binding:"required"` + Title string `json:"title" form:"title" binding:"required"` + Description string `json:"description" form:"description" binding:"required"` api.ImageForm File string `json:"file" form:"file" binding:"required"` Industrys []string `json:"industrys" form:"industrys"` @@ -732,7 +733,7 @@ func (*Technology) AchievementAdd(c *gin.Context) { err := technology2.NewAchievement()(api.GetSession()(c).(*session.Enterprise), api.GetTenantID()(c).(uint64)). Form(&technology2.AchievementParams{Mode: form.Mode, Title: form.Title, Image: form.FilterImageURL(), File: form.FilterFile(), - Introduce: form.Introduce, Industrys: form.Industrys, + Description: form.Description, Introduce: form.Introduce, Industrys: form.Industrys, Maturity: form.Maturity, LeadStandard: form.LeadStandard, CooperationMode: form.CooperationMode, Customers: form.Customers, Keywords: form.Keywords, IsSubmit: form.IsSubmit, }) @@ -751,7 +752,7 @@ func (*Technology) AchievementEdit(c *gin.Context) { err := technology2.NewAchievement()(api.GetSession()(c).(*session.Enterprise), api.GetTenantID()(c).(uint64)). Form(&technology2.AchievementParams{ID: form.Convert(), Mode: form.Mode, Title: form.Title, Image: form.FilterImageURL(), File: form.FilterFile(), - Introduce: form.Introduce, Industrys: form.Industrys, + Description: form.Description, Introduce: form.Introduce, Industrys: form.Industrys, Maturity: form.Maturity, LeadStandard: form.LeadStandard, CooperationMode: form.CooperationMode, Customers: form.Customers, Keywords: form.Keywords, IsSubmit: form.IsSubmit, }) diff --git a/app/api/enterprise/api/user.go b/app/api/enterprise/api/user.go index 93cd186..dc32bf8 100644 --- a/app/api/enterprise/api/user.go +++ b/app/api/enterprise/api/user.go @@ -173,6 +173,8 @@ func (*User) ConsumeDelete(c *gin.Context) { api.APIResponse(err)(c) } +// 提现管理 + func (*User) Withdrawal(c *gin.Context) { form := &struct { Status int `json:"status" form:"status"` diff --git a/app/api/enterprise/controller/account/instance.go b/app/api/enterprise/controller/account/instance.go index b31d955..a0820a4 100644 --- a/app/api/enterprise/controller/account/instance.go +++ b/app/api/enterprise/controller/account/instance.go @@ -22,7 +22,7 @@ type ( InstanceLoginParams struct { UID uint64 Avatar, Name, Mobile string - Vip model2.UserInstanceVipKind + Vip uint64 VipStatus bool VipDeadline time.Time Currency float64 diff --git a/app/api/enterprise/controller/config/instance.go b/app/api/enterprise/controller/config/instance.go deleted file mode 100644 index d912156..0000000 --- a/app/api/enterprise/controller/config/instance.go +++ /dev/null @@ -1 +0,0 @@ -package config diff --git a/app/api/enterprise/controller/sys/instance.go b/app/api/enterprise/controller/sys/instance.go new file mode 100644 index 0000000..96e89f9 --- /dev/null +++ b/app/api/enterprise/controller/sys/instance.go @@ -0,0 +1 @@ +package sys diff --git a/app/api/enterprise/controller/sys/vip.go b/app/api/enterprise/controller/sys/vip.go new file mode 100644 index 0000000..4e9f57d --- /dev/null +++ b/app/api/enterprise/controller/sys/vip.go @@ -0,0 +1,54 @@ +package sys + +import ( + "SciencesServer/app/api/enterprise/model" + model2 "SciencesServer/app/common/model" + "SciencesServer/app/session" +) + +type Vip struct { + *session.Enterprise +} + +type VipHandle func(session *session.Enterprise) *Vip + +type ( + // VipInfo 会员信息 + VipInfo struct { + ID string `json:"id"` + *model2.SysVip + } + // VipInstance 会员首页信息 + VipInstance struct { + Data []*VipInfo `json:"data"` + Functions map[int]string `json:"functions"` + } +) + +// Instance 首页信息 +func (c *Vip) Instance() (*VipInstance, error) { + mSysVip := model.NewSysVip() + + out := make([]*model2.SysVip, 0) + + if err := model2.Scan(mSysVip.SysVip, &out); err != nil { + return nil, err + } + data := make([]*VipInfo, 0) + + for _, v := range out { + data = append(data, &VipInfo{ + ID: v.GetEncodeID(), SysVip: v, + }) + } + return &VipInstance{ + Data: data, + Functions: mSysVip.GetFunctions(), + }, nil +} + +func NewVip() VipHandle { + return func(session *session.Enterprise) *Vip { + return &Vip{session} + } +} diff --git a/app/api/enterprise/controller/technology/achievement.go b/app/api/enterprise/controller/technology/achievement.go index 1d69c02..33d8651 100644 --- a/app/api/enterprise/controller/technology/achievement.go +++ b/app/api/enterprise/controller/technology/achievement.go @@ -45,7 +45,7 @@ type ( // AchievementParams 成果参数信息 AchievementParams struct { ID uint64 - Title, Image, File, Introduce, Source string + Title, Image, File, Introduce, Description string Mode, Maturity, LeadStandard, CooperationMode int // 技术成熟度 领先标准 合作模式 Industrys, Customers, Keywords []string // 所属客户 关键词 IsSubmit int // 是否提交审核 @@ -177,7 +177,7 @@ func (c *Achievement) Form(params *AchievementParams) error { mTechnologyAchievement.CooperationMode = config.TechnologyCooperationMode(params.CooperationMode) mTechnologyAchievement.SetKeywordAttribute(params.Keywords) mTechnologyAchievement.Introduce = params.Introduce - mTechnologyAchievement.Source = params.Source + mTechnologyAchievement.Description = params.Description if mTechnologyAchievement.ID > 0 { mTechnologyAchievement.Status = model2.TechnologyStatusKindForExamining diff --git a/app/api/enterprise/controller/user/vip.go b/app/api/enterprise/controller/user/vip.go new file mode 100644 index 0000000..c4bd24c --- /dev/null +++ b/app/api/enterprise/controller/user/vip.go @@ -0,0 +1,68 @@ +package user + +import ( + "SciencesServer/app/api/enterprise/model" + "SciencesServer/app/basic/controller" + model2 "SciencesServer/app/common/model" + "SciencesServer/app/session" + "SciencesServer/lib" + "errors" + "time" +) + +type Vip struct { + *session.Enterprise +} + +type VipHandle func(session *session.Enterprise) *Vip + +// Open 开通会员 +func (c *Vip) Open(id uint64) (*controller.ReturnPayment, error) { + mSysVip := model.NewSysVip() + mSysVip.ID = id + + isExist, err := model2.FirstField(mSysVip.SysVip, []string{"id", "level", "effect_time", "price", "is_disabled"}) + + if err != nil { + return nil, err + } else if !isExist { + return nil, errors.New("操作错误,会员信息不存在或已删除") + } else if mSysVip.IsDeleted > 0 { + return nil, errors.New("操作错误,当前会员不允许开通") + } + // 查询用户会员信息 + mUserInstance := model.NewUserInstance() + + if _, err = model2.FirstField(mUserInstance.UserInstance, []string{"id", "vip", "vip_deadline"}, + model2.NewWhere("uuid", c.UID)); err != nil { + return nil, err + } + // 会员状态有效期内,不可降级 + if mUserInstance.VipStatus() { + mSysVip2 := model.NewSysVip() + mSysVip2.ID = mUserInstance.Vip + + if isExist, err = model2.FirstField(mSysVip2.SysVip, []string{"id", "level"}); err != nil { + return nil, err + } else if isExist && mSysVip2.Level > mSysVip.Level { + return nil, errors.New("操作错误,会员有效期间内不可以降级") + } + } + mOrderInstance := model.NewOrderInstance() + mOrderInstance.UID = c.UID + mOrderInstance.OrderNo = lib.OrderNo() + mOrderInstance.Amount = mSysVip.Price + mOrderInstance.SetParamsAttribute(model2.OrderInstanceParamsKindForVIP, &model2.OrderInstanceParamsForVip{ + ID: mSysVip.ID, EffectTime: mSysVip.EffectTime, + }) + return &controller.ReturnPayment{ + Auth: mOrderInstance.GetEncodeID(), + Timestamp: time.Now().Unix(), + }, nil +} + +func NewVip() VipHandle { + return func(session *session.Enterprise) *Vip { + return &Vip{session} + } +} diff --git a/app/api/enterprise/model/sys_vip.go b/app/api/enterprise/model/sys_vip.go new file mode 100644 index 0000000..5aaba9b --- /dev/null +++ b/app/api/enterprise/model/sys_vip.go @@ -0,0 +1,11 @@ +package model + +import "SciencesServer/app/common/model" + +type SysVip struct { + *model.SysVip +} + +func NewSysVip() *SysVip { + return &SysVip{model.NewSysVip()} +} diff --git a/app/api/website/api/payment.go b/app/api/website/api/payment.go new file mode 100644 index 0000000..154bf87 --- /dev/null +++ b/app/api/website/api/payment.go @@ -0,0 +1,19 @@ +package api + +import ( + "SciencesServer/app/api/website/controller/payment" + "SciencesServer/app/basic/api" + "SciencesServer/app/session" + "github.com/gin-gonic/gin" +) + +// Payment 支付管理 +type Payment struct{} + +func (*Payment) Launch(c *gin.Context) { + payment.NewInstance()(api.GetSession()(c).(*session.Enterprise)).Launch(0) +} + +func (*Payment) Callback(c *gin.Context) { + +} diff --git a/app/api/website/controller/payment/activity.go b/app/api/website/controller/payment/activity.go new file mode 100644 index 0000000..d2f32d7 --- /dev/null +++ b/app/api/website/controller/payment/activity.go @@ -0,0 +1,46 @@ +package payment + +import ( + "SciencesServer/app/api/website/model" + model2 "SciencesServer/app/common/model" + "gorm.io/gorm" +) + +type Activity struct { + uid, activityID uint64 + identity int +} + +type ActivityCallback func(uid, activityID uint64, identity int) *Activity + +func (c *Activity) grant(tx *gorm.DB) error { + var count int64 + + mActivityJoin := model.NewActivityJoin() + + err := model2.Count(mActivityJoin.ActivityJoin, &count, model2.NewWhere("uid", c.uid), + model2.NewWhere("activity_id", c.activityID), + model2.NewWhere("identity", c.identity), + model2.NewWhere("status", model2.ActivityJoinStatusForSuccess)) + + if err != nil { + return err + } else if count > 0 { + return nil + } + mActivityJoin.UID = c.uid + mActivityJoin.ActivityID = c.activityID + mActivityJoin.Identity = c.identity + mActivityJoin.Status = model2.ActivityJoinStatusForSuccess + return model2.Create(mActivityJoin.ActivityJoin, tx) +} + +func NewActivity() ActivityCallback { + return func(uid, activityID uint64, identity int) *Activity { + return &Activity{ + uid: uid, + activityID: activityID, + identity: identity, + } + } +} diff --git a/app/api/website/controller/payment/instance.go b/app/api/website/controller/payment/instance.go new file mode 100644 index 0000000..8ceef64 --- /dev/null +++ b/app/api/website/controller/payment/instance.go @@ -0,0 +1,115 @@ +package payment + +import ( + "SciencesServer/app/api/website/model" + model2 "SciencesServer/app/common/model" + "SciencesServer/app/session" + "SciencesServer/serve/orm" + "errors" + "gorm.io/gorm" + "time" +) + +// Instance 支付管理 +type Instance struct { + *session.Enterprise +} + +type IInstance interface { + grant(tx *gorm.DB) error +} + +type InstanceHandle func(session *session.Enterprise) *Instance + +type InstanceGrant struct { + tx *gorm.DB + uid uint64 + params *model2.OrderInstanceParams +} + +// handle 发放操作 +func (c *InstanceGrant) handle() error { + var _handle IInstance + + if c.params.Kind == model2.OrderInstanceParamsKindForActivity { + data := c.params.Data.(*model2.OrderInstanceParamsForActivity) + _handle = NewActivity()(c.uid, data.ID, data.Identity) + } else if c.params.Kind == model2.OrderInstanceParamsKindForVIP { + data := c.params.Data.(*model2.OrderInstanceParamsForVip) + _handle = NewVip()(c.uid, data.ID, data.EffectTime) + } + if _handle != nil { + return _handle.grant(c.tx) + } + return nil +} + +// Launch 支付发起 +func (c *Instance) Launch(id uint64) (interface{}, error) { + mOrderInstance := model.NewOrderInstance() + mOrderInstance.ID = id + + isExist, err := model2.FirstField(mOrderInstance.OrderInstance, []string{"id", "order_no", "amount", "status"}) + + if err != nil { + return nil, err + } else if !isExist { + return nil, errors.New("操作错误,订单信息不存在或已被删除") + } else if mOrderInstance.Status != model2.OrderInstanceStatusForInit { + return nil, errors.New("操作错误,当前订单状态不允许支付") + } + // 保存日志 + mOrderLog := model.NewOrderLog() + mOrderLog.UID = c.UID + mOrderLog.OrderID = id + + if err = model2.Create(mOrderLog.OrderLog); err != nil { + return nil, err + } + // 返回第三方支付接口参数 + return nil, nil +} + +// Callback 支付回调 +func (c *Instance) Callback(orderNo string) error { + mOrderInstance := model.NewOrderInstance() + isExist, err := model2.FirstField(mOrderInstance.OrderInstance, []string{"id", "uid", "amount", "params", "status"}, + model2.NewWhere("order_no", orderNo)) + + if err != nil { + return err + } else if !isExist { + return errors.New("订单信息不存在或已被删除") + } else if mOrderInstance.OrderInstance.Status != model2.OrderInstanceStatusForInit { + // 状态异常 + return errors.New("状态异常,不允许支付") + } + now := time.Now() + + // 更改订单状态为已支付 + if err = model2.Updates(mOrderInstance.OrderInstance, map[string]interface{}{ + "status": model2.OrderInstanceStatusForPaid, "updated_at": now, + }); err != nil { + return nil + } + return orm.GetDB().Transaction(func(tx *gorm.DB) error { + // 发放操作 + if err = (&InstanceGrant{ + tx: tx, uid: mOrderInstance.UID, params: mOrderInstance.GetParamsAttribute(), + }).handle(); err != nil { + return err + } + if err = model2.Updates(mOrderInstance.OrderInstance, map[string]interface{}{ + "status": model2.OrderInstanceStatusForComplete, "updated_at": now, + }, tx); err != nil { + return err + } + return nil + }) +} + +func NewInstance() InstanceHandle { + return func(session *session.Enterprise) *Instance { + return &Instance{session} + } +} diff --git a/app/api/website/controller/payment/vip.go b/app/api/website/controller/payment/vip.go new file mode 100644 index 0000000..41f7917 --- /dev/null +++ b/app/api/website/controller/payment/vip.go @@ -0,0 +1,49 @@ +package payment + +import ( + "SciencesServer/app/api/website/model" + model2 "SciencesServer/app/common/model" + "gorm.io/gorm" + "time" +) + +// Vip 会员信息 +type Vip struct { + uid, vipID uint64 + effectTime int +} + +type VipCallback func(uid, vipID uint64, effectTime int) *Vip + +func (c *Vip) grant(tx *gorm.DB) error { + mUserInstance := model.NewUserInstance() + + isExist, err := model2.FirstField(mUserInstance.UserInstance, []string{"id", "vip", "vip_deadline"}, + model2.NewWhere("uuid", c.uid)) + + if err != nil { + return err + } else if isExist { + if mUserInstance.VipStatus() { + mUserInstance.Vip = c.vipID + mUserInstance.VipDeadline = mUserInstance.VipDeadline.AddDate(0, c.effectTime, 0) + } else { + mUserInstance.Vip = c.vipID + mUserInstance.VipDeadline = time.Now().AddDate(0, c.effectTime, 0) + } + if err = model2.Updates(mUserInstance.UserInstance, map[string]interface{}{ + "vip": mUserInstance.Vip, "vip_deadline": mUserInstance.VipDeadline, "updated_at": time.Now(), + }, tx); err != nil { + return err + } + } + return nil +} + +func NewVip() VipCallback { + return func(uid, vipID uint64, effectTime int) *Vip { + return &Vip{ + uid: uid, vipID: vipID, effectTime: effectTime, + } + } +} diff --git a/app/api/website/controller/search/achievement.go b/app/api/website/controller/search/achievement.go index 404002d..790edb1 100644 --- a/app/api/website/controller/search/achievement.go +++ b/app/api/website/controller/search/achievement.go @@ -13,9 +13,12 @@ type ( AchievementInfo struct { ID string `json:"id"` *model.TechnologyAchievementInfo - Customers []string `json:"customers"` - Industrys []string `json:"industrys"` - Keywords []string `json:"keywords"` + ModeTitle string `json:"mode_title"` + MaturityTitle string `json:"maturity_title"` + CooperationModeTitle string `json:"cooperation_mode_title"` + Customers []string `json:"customers"` + Industrys []string `json:"industrys"` + Keywords []string `json:"keywords"` } ) @@ -63,7 +66,9 @@ func achievementSearch(page, pageSize int, keyword, industry string, params map[ list = append(list, &AchievementInfo{ ID: v.GetEncodeID(), TechnologyAchievementInfo: v, Customers: v.GetCustomerAttribute(), - Industrys: _industrys, Keywords: v.GetKeywordAttribute(), + ModeTitle: v.GetModeTitle(), MaturityTitle: config.GetTechnologyMaturityTitle(v.Maturity), + CooperationModeTitle: config.GetTechnologyCooperationModeTitle(v.CooperationMode), + Industrys: _industrys, Keywords: v.GetKeywordAttribute(), }) } return &controller.ReturnPages{Data: list, Count: count}, nil diff --git a/app/api/website/controller/service/solution_case.go b/app/api/website/controller/service/solution_case.go index 09568f8..4a7162b 100644 --- a/app/api/website/controller/service/solution_case.go +++ b/app/api/website/controller/service/solution_case.go @@ -67,6 +67,9 @@ func (c *SolutionCase) Instance(mode int) ([]*SolutionCaseInfo, error) { Image: (&model2.Image{Image: v.DetailImage}).Analysis(config.SystemConfig[config.SysImageDomain]), Description: v.DetailDescription, } + if v.DetailID <= 0 { + continue + } for _, val := range ret { if v.ID == val.MarkID { val.Children = append(val.Children, detail) diff --git a/app/api/website/controller/sys/banner.go b/app/api/website/controller/sys/banner.go index 41e3ac6..70ab26d 100644 --- a/app/api/website/controller/sys/banner.go +++ b/app/api/website/controller/sys/banner.go @@ -24,6 +24,8 @@ func (c *Banner) Instance(key string) (*BannerInfo, error) { "key": key, "local": key, }); err != nil { return nil, err + } else if mSysBanner.ID <= 0 { + return nil, nil } return &BannerInfo{ ID: mSysBanner.GetEncodeID(), diff --git a/app/api/website/controller/technology/achievement.go b/app/api/website/controller/technology/achievement.go index d9ac3d7..3b06a49 100644 --- a/app/api/website/controller/technology/achievement.go +++ b/app/api/website/controller/technology/achievement.go @@ -21,16 +21,19 @@ type AchievementHandle func(session *session.Enterprise) *Achievement type ( // AchievementInfo 技术成果信息 AchievementInfo struct { - ID string `json:"id"` - Title string `json:"title"` - Image string `json:"image"` - Industrys []string `json:"industrys"` - Customers []string `json:"customers"` - Maturity config2.TechnologyMaturity `json:"maturity"` - CooperationMode config2.TechnologyCooperationMode `json:"cooperation_mode"` - Keywords []string `json:"keywords"` - VisitCount int `json:"visit_count"` - CollectCount int `json:"collect_count"` + ID string `json:"id"` + Title string `json:"title"` + ModeTitle string `json:"mode_title"` + Image string `json:"image"` + Industrys []string `json:"industrys"` + Customers []string `json:"customers"` + Maturity config2.TechnologyMaturity `json:"maturity"` + MaturityTitle string `json:"maturity_title"` + CooperationMode config2.TechnologyCooperationMode `json:"cooperation_mode"` + CooperationModeTitle string `json:"cooperation_mode_title"` + Keywords []string `json:"keywords"` + VisitCount int `json:"visit_count"` + CollectCount int `json:"collect_count"` } // AchievementDetailInfo 技术成果详细信息 AchievementDetailInfo struct { @@ -63,16 +66,19 @@ func (c *Achievement) Instance(title, industry string, page, pageSize int) (*con for _, v := range out { list = append(list, &AchievementInfo{ - ID: v.GetEncodeID(), - Title: v.Title, - Image: v.Image.Analysis(config.SystemConfig[config.SysImageDomain]), - Industrys: v.GetIndustryAttribute(), - Customers: v.GetCustomerAttribute(), - Maturity: v.Maturity, - CooperationMode: v.CooperationMode, - Keywords: v.GetKeywordAttribute(), - VisitCount: v.VisitCount, - CollectCount: v.CollectCount, + ID: v.GetEncodeID(), + Title: v.Title, + ModeTitle: v.GetModeTitle(), + Image: v.Image.Analysis(config.SystemConfig[config.SysImageDomain]), + Industrys: v.GetIndustryAttribute(), + Customers: v.GetCustomerAttribute(), + Maturity: v.Maturity, + MaturityTitle: config2.GetTechnologyMaturityTitle(v.Maturity), + CooperationMode: v.CooperationMode, + CooperationModeTitle: config2.GetTechnologyCooperationModeTitle(v.CooperationMode), + Keywords: v.GetKeywordAttribute(), + VisitCount: v.VisitCount, + CollectCount: v.CollectCount, }) } return &controller.ReturnPages{Data: list, Count: count}, nil @@ -86,7 +92,7 @@ func (c *Achievement) Detail(id uint64) (*AchievementDetailInfo, error) { if err != nil { return nil, err - } else if out.ID <= 0 { + } else if out == nil || out.ID <= 0 { return nil, errors.New("操作错误,成果信息不存在或已被删除") } //var uid uint64 = 0 @@ -105,16 +111,19 @@ func (c *Achievement) Detail(id uint64) (*AchievementDetailInfo, error) { return &AchievementDetailInfo{ AchievementInfo: AchievementInfo{ - ID: out.GetEncodeID(), - Title: out.Title, - Image: out.Image.Analysis(config.SystemConfig[config.SysImageDomain]), - Industrys: out.GetIndustryAttribute(), - Customers: out.GetCustomerAttribute(), - Maturity: out.Maturity, - CooperationMode: out.CooperationMode, - Keywords: out.GetKeywordAttribute(), - VisitCount: out.VisitCount, - CollectCount: out.CollectCount, + ID: out.GetEncodeID(), + Title: out.Title, + ModeTitle: out.GetModeTitle(), + Image: out.Image.Analysis(config.SystemConfig[config.SysImageDomain]), + Industrys: out.GetIndustryAttribute(), + Customers: out.GetCustomerAttribute(), + Maturity: out.Maturity, + MaturityTitle: config2.GetTechnologyMaturityTitle(out.Maturity), + CooperationMode: out.CooperationMode, + CooperationModeTitle: config2.GetTechnologyCooperationModeTitle(out.CooperationMode), + Keywords: out.GetKeywordAttribute(), + VisitCount: out.VisitCount, + CollectCount: out.CollectCount, }, Introduce: out.Introduce, }, nil diff --git a/app/api/website/model/order_instance.go b/app/api/website/model/order_instance.go new file mode 100644 index 0000000..25297e4 --- /dev/null +++ b/app/api/website/model/order_instance.go @@ -0,0 +1,11 @@ +package model + +import "SciencesServer/app/common/model" + +type OrderInstance struct { + *model.OrderInstance +} + +func NewOrderInstance() *OrderInstance { + return &OrderInstance{model.NewOrderInstance()} +} diff --git a/app/api/website/model/order_log.go b/app/api/website/model/order_log.go new file mode 100644 index 0000000..54eac48 --- /dev/null +++ b/app/api/website/model/order_log.go @@ -0,0 +1,11 @@ +package model + +import "SciencesServer/app/common/model" + +type OrderLog struct { + *model.OrderLog +} + +func NewOrderLog() *OrderLog { + return &OrderLog{model.NewOrderLog()} +} diff --git a/app/api/website/model/user_instance.go b/app/api/website/model/user_instance.go new file mode 100644 index 0000000..cb31ace --- /dev/null +++ b/app/api/website/model/user_instance.go @@ -0,0 +1,11 @@ +package model + +import "SciencesServer/app/common/model" + +type UserInstance struct { + *model.UserInstance +} + +func NewUserInstance() *UserInstance { + return &UserInstance{model.NewUserInstance()} +} diff --git a/app/basic/api/base.go b/app/basic/api/base.go index a40e902..375abcc 100644 --- a/app/basic/api/base.go +++ b/app/basic/api/base.go @@ -35,7 +35,7 @@ func GetTenantID() ApiHandle { value := c.GetHeader(config.ContentForTenantID) if value == "" { - return uint64(0) + return uint64(1) } return utils.StringToUnit64(value) } diff --git a/app/basic/controller/basic.go b/app/basic/controller/basic.go index 5408feb..f147527 100644 --- a/app/basic/controller/basic.go +++ b/app/basic/controller/basic.go @@ -5,3 +5,9 @@ type ReturnPages struct { Data interface{} `json:"data"` Count int64 `json:"count"` } + +// ReturnPayment 充值数据 +type ReturnPayment struct { + Auth string `json:"auth"` + Timestamp int64 `json:"timestamp"` +} diff --git a/app/common/migrate/instance.go b/app/common/migrate/instance.go index 4b3757c..433bf23 100644 --- a/app/common/migrate/instance.go +++ b/app/common/migrate/instance.go @@ -116,6 +116,7 @@ func (this *Instance) Handle() { } return out }}, + &synchronized{iModel: model.NewSysVip()}, &synchronized{iModel: model.NewSysNavigation()}, &synchronized{iModel: model.NewSysAbout()}, &synchronized{iModel: model.NewSysBanner()}, &synchronized{iModel: model.NewSysAgreement()}, // 日志管理 diff --git a/app/common/model/order_instance.go b/app/common/model/order_instance.go index 710ca2e..7683724 100644 --- a/app/common/model/order_instance.go +++ b/app/common/model/order_instance.go @@ -2,6 +2,9 @@ package model import "encoding/json" +type IOrderInstance interface { +} + // OrderInstance 订单数据模型 type OrderInstance struct { Model @@ -29,12 +32,22 @@ type OrderInstanceParamsKind int const ( // OrderInstanceParamsKindForActivity 活动信息 OrderInstanceParamsKindForActivity OrderInstanceParamsKind = iota + 1e2 + 1 + // OrderInstanceParamsKindForVIP 会员信息 + OrderInstanceParamsKindForVIP ) -// OrderInstanceParamsForActivity 订单活动参数 -type OrderInstanceParamsForActivity struct { - ID uint64 `json:"id"` -} +type ( + // OrderInstanceParamsForActivity 订单活动参数 + OrderInstanceParamsForActivity struct { + ID uint64 `json:"id"` + Identity int `json:"identity"` + } + // OrderInstanceParamsForVip 会员参数 + OrderInstanceParamsForVip struct { + ID uint64 `json:"id"` + EffectTime int `json:"effect_time"` // 有效时长,月 + } +) // OrderInstanceStatus 订单状态 type OrderInstanceStatus int @@ -56,7 +69,7 @@ func (m *OrderInstance) TableName() string { return "order_instance" } -func (m *OrderInstance) SetParamsAttribute(kind OrderInstanceParamsKind, data interface{}) { +func (m *OrderInstance) SetParamsAttribute(kind OrderInstanceParamsKind, data IOrderInstance) { value := &OrderInstanceParams{Kind: kind, Data: data} _bytes, _ := json.Marshal(value) m.Params = string(_bytes) diff --git a/app/common/model/service_solution_case_kind.go b/app/common/model/service_solution_case_kind.go index 5a79590..0ecb92e 100644 --- a/app/common/model/service_solution_case_kind.go +++ b/app/common/model/service_solution_case_kind.go @@ -6,8 +6,9 @@ type ServiceSolutionCaseKind struct { ModelTenant Title string `gorm:"column:title;type:varchar(100);default:'';comment:标题" json:"title"` Image - Mode ServiceSolutionCaseMode `gorm:"column:mode;type:tinyint(3);default:0;comment:方案模式" json:"mode"` - Sort int `gorm:"column:sort;type:tinyint(3);default:0;comment:排序,数值越小,优先排序" json:"sort"` + Mode ServiceSolutionCaseMode `gorm:"column:mode;type:tinyint(3);default:0;comment:方案模式" json:"mode"` + Description string `gorm:"column:description;type:varchar(255);default:'';comment:方案描述" json:"description"` + Sort int `gorm:"column:sort;type:tinyint(3);default:0;comment:排序,数值越小,优先排序" json:"sort"` ModelDeleted ModelAt } diff --git a/app/common/model/sys_vip.go b/app/common/model/sys_vip.go new file mode 100644 index 0000000..ab0abc5 --- /dev/null +++ b/app/common/model/sys_vip.go @@ -0,0 +1,54 @@ +package model + +// SysVip 会员配置数据模型 +type SysVip struct { + Model + Level int `gorm:"column:level;tinyint(1);default:0;comment:会员等级" json:"level"` + Title string `gorm:"column:title;varchar(100);default:'';comment:会员名称" json:"title"` + Price float64 `gorm:"column:price;decimal(10,2);default:0;comment:价格" json:"price"` + EffectTime int `gorm:"column:effect_time;tinyint(3);default:0;comment:有效时长、月" json:"effect_time"` + Discount float64 `gorm:"column:discount;decimal(10,2);default:0;comment:折扣" json:"discount"` + Currency float64 `gorm:"column:currency;decimal(10,2);default:0;comment:赠送的创新币" json:"currency"` + Function int `gorm:"column:function;tinyint(3);default:0;comment:支持功能" json:"function"` + IsHidden SysVipStatus `gorm:"column:is_hidden;tinyint(1);default:0;comment:隐藏状态" json:"is_hidden"` + IsDisabled int `gorm:"column:is_disabled;tinyint(1);default:0;comment:禁用状态,不可充值" json:"is_disabled"` + ModelDeleted + ModelAt +} + +const ( + // SysVipOpenFunctionForSearch 任意检索 + SysVipOpenFunctionForSearch int = 1 << 0 + // SysVipOpenFunctionForAchievementPush 创新科技资源自动匹配推送功能 + SysVipOpenFunctionForAchievementPush int = 1 << 1 + // SysVipOpenFunctionForHighCompanyDemand 上市公司及优质客户的企业需求优先推送 + SysVipOpenFunctionForHighCompanyDemand int = 1 << 2 + // SysVipOpenFunctionForOrdinaryCompanyDemand 普通企业的需求匹配推送 + SysVipOpenFunctionForOrdinaryCompanyDemand int = 1 << 3 + // SysVipOpenFunctionForMachImport 匹配结果文件导出 + SysVipOpenFunctionForMachImport int = 1 << 4 + // SysVipOpenFunctionForOverseasDemand 海外需求推荐 + SysVipOpenFunctionForOverseasDemand int = 1 << 5 +) + +// SysVipStatus 会员状态 +type SysVipStatus int + +func (m *SysVip) TableName() string { + return "sys_vip" +} + +func (m *SysVip) GetFunctions() map[int]string { + return map[int]string{ + SysVipOpenFunctionForSearch: "任意检索", + SysVipOpenFunctionForAchievementPush: "创新科技资源自动匹配推送功能", + SysVipOpenFunctionForHighCompanyDemand: "上市公司及优质客户的企业需求优先推送", + SysVipOpenFunctionForOrdinaryCompanyDemand: "普通企业的需求匹配推送", + SysVipOpenFunctionForMachImport: "匹配结果文件导出", + SysVipOpenFunctionForOverseasDemand: "海外需求推荐", + } +} + +func NewSysVip() *SysVip { + return &SysVip{} +} diff --git a/app/common/model/technology_achievement.go b/app/common/model/technology_achievement.go index f523ab4..f042390 100644 --- a/app/common/model/technology_achievement.go +++ b/app/common/model/technology_achievement.go @@ -9,9 +9,10 @@ import ( type TechnologyAchievement struct { Model ModelTenant - UID uint64 `gorm:"column:uid;type:int;default:0;comment:用户uuid" json:"-"` - Mode TechnologyAchievementMode `gorm:"column:mode;type:tinyint(1);default:1;comment:成果模式" json:"mode"` - Title string `gorm:"column:title;type:varchar(100);default:'';comment:成果名称" json:"title"` + UID uint64 `gorm:"column:uid;type:int;default:0;comment:用户uuid" json:"-"` + Mode TechnologyAchievementMode `gorm:"column:mode;type:tinyint(1);default:1;comment:成果模式" json:"mode"` + Title string `gorm:"column:title;type:varchar(100);default:'';comment:成果名称" json:"title"` + Description string `gorm:"source:description;type:varchar(255);comment:成果描述" json:"description"` Image File string `gorm:"column:file;type:varchar(255);default:'';comment:证明材料" json:"file"` Industry string `gorm:"column:industry;type:varchar(255);default:'';comment:所属领域;行业信息" json:"-"` @@ -22,7 +23,6 @@ type TechnologyAchievement struct { Config string `gorm:"column:config;type:varchar(255);default:'';comment:配置信息" json:"config"` Keyword string `gorm:"column:keyword;type:varchar(255);default:'';comment:关键词" json:"-"` Introduce string `gorm:"column:introduce;type:text;comment:介绍描述" json:"introduce"` - Source string `gorm:"source:introduce;type:text;comment:成果来源" json:"source"` Shelf TechnologyStatus ModelDeleted @@ -50,6 +50,15 @@ func (m *TechnologyAchievement) TableName() string { return "technology_achievement" } +func (m *TechnologyAchievement) GetModeTitle() string { + if m.Mode == TechnologyAchievementModeForFree { + return "免费模式" + } else if m.Mode == TechnologyAchievementModeForCharge { + return "收费模式" + } + return "" +} + func (m *TechnologyAchievement) GetConfigAttribute() *TechnologyAchievementConfig { out := new(TechnologyAchievementConfig) _ = json.Unmarshal([]byte(m.Config), &out) diff --git a/app/common/model/user_instance.go b/app/common/model/user_instance.go index 28d2b43..0eb242d 100644 --- a/app/common/model/user_instance.go +++ b/app/common/model/user_instance.go @@ -15,11 +15,11 @@ type UserInstance struct { Name string `gorm:"column:name;type:varchar(20);default:'';comment:真实姓名" json:"name"` Mobile string `gorm:"column:mobile;index:idx_user_instance_mobile;type:varchar(15);default:'';comment:联系方式" json:"mobile"` Gender - Vip UserInstanceVipKind `gorm:"column:vip;type:tinyint(1);default:0;comment:会员状态/类型" json:"vip"` - VipDeadline time.Time `gorm:"column:vip_deadline;type:datetime;default:null;comment:会员过期时间" json:"vip_deadline"` - Identity int `gorm:"column:identity;type:int(8);default:0;comment:身份信息" json:"-"` - Password string `gorm:"column:password;type:varchar(100);default:'';comment:密码" json:"-"` - Salt string `gorm:"column:salt;type:varchar(10);default:'';comment:盐值" json:"-"` + Vip uint64 `gorm:"column:vip;type:int(11);default:0;comment:会员ID" json:"vip"` + VipDeadline time.Time `gorm:"column:vip_deadline;type:datetime;default:null;comment:会员过期时间" json:"vip_deadline"` + Identity int `gorm:"column:identity;type:int(8);default:0;comment:身份信息" json:"-"` + Password string `gorm:"column:password;type:varchar(100);default:'';comment:密码" json:"-"` + Salt string `gorm:"column:salt;type:varchar(10);default:'';comment:盐值" json:"-"` AccountStatus ModelDeleted ModelAt @@ -35,16 +35,6 @@ const ( UserInstanceSourceForWechat ) -// UserInstanceVipKind 用户会员类型 -type UserInstanceVipKind int - -const ( - // UserInstanceVipForOrdinary 普通VIP - UserInstanceVipForOrdinary UserInstanceVipKind = iota + 1 - // UserInstanceVipForSenior 高级VIP - UserInstanceVipForSenior -) - func (m *UserInstance) TableName() string { return "user_instance" } diff --git a/cmd/ctl/main.go b/cmd/ctl/main.go index 73d7cba..1cb862f 100644 --- a/cmd/ctl/main.go +++ b/cmd/ctl/main.go @@ -3,14 +3,13 @@ package main import ( "SciencesServer/cmd/ctl/command/controller" "SciencesServer/cmd/ctl/command/model" - "SciencesServer/config" "github.com/spf13/cobra" ) var rootCmd = &cobra.Command{ Use: "ctl", Long: "ctl is a command line tool for serve", - Version: *config.Version, + Version: "v1.0", } func init() { diff --git a/lib/order.go b/lib/order.go new file mode 100644 index 0000000..7891d2e --- /dev/null +++ b/lib/order.go @@ -0,0 +1,13 @@ +package lib + +import ( + "fmt" + "math/rand" + "time" +) + +// OrderNo 订单号 +func OrderNo() string { + now := time.Now() + return fmt.Sprintf("%s%d%05d", now.Format("20060102"), now.Unix(), rand.Intn(100000)) +} diff --git a/router/address.go b/router/address.go index d285999..6ae408d 100644 --- a/router/address.go +++ b/router/address.go @@ -140,6 +140,13 @@ func registerAPI(app *gin.Engine) { technologyV1.POST("/product", _api.Product) technologyV1.POST("/product/detail", _api.ProductDetail) } + // Payment 支付管理 + paymentV1 := v1.Group("/payment") + { + _api := new(api2.Payment) + paymentV1.POST("/launch", _api.Launch) + paymentV1.POST("/callback", _api.Callback) + } } // registerAdminAPI 注册API @@ -405,6 +412,13 @@ func registerAdminAPI(app *gin.Engine) { activity.POST("/apply/handle", _api.ApplyHandle) activity.POST("/apply/delete", _api.ApplyDelete) } + // Order 订单管理 + order := v1.Group("/order") + { + _api := new(api1.Order) + order.POST("", _api.Instance) + order.POST("/detail", _api.Detail) + } // Logs 日志管理 log := v1.Group("/log") { @@ -424,9 +438,11 @@ func registerEnterpriseAPI(app *gin.Engine) { apiPrefix + "/v1/account/login", apiPrefix + "/v1/account/register", apiPrefix + "/v1/account/authorize", + apiPrefix + "/v1/account/logout", apiPrefix + "/v1/account/reset/password", apiPrefix + "/v1/sms/captcha", apiPrefix + "/v1/sms/captcha/validate", + apiPrefix + "/v1/payment/callback", }...))) v1.Use(NeedAuthIdentity()) @@ -448,6 +464,7 @@ func registerEnterpriseAPI(app *gin.Engine) { smsV1.POST("/captcha", _api.Captcha) smsV1.POST("/captcha/validate", _api.CaptchaValidate) } + // Account 账号管理 accountV1 := v1.Group("/account") { diff --git a/serve/es/es_test.go b/serve/es/es_test.go index 0622a16..f324915 100644 --- a/serve/es/es_test.go +++ b/serve/es/es_test.go @@ -61,7 +61,7 @@ func TestNewInstanceUpdate(t *testing.T) { //client.Delete() src := &Student{ID: 1, Name: "Henry", Age: 28} - _, err := client.Update().Index("student").Id(fmt.Sprintf("%d", src.ID)).Doc(map[string]interface{}{ + _, err := client.Update().Index("es_achievement_index").Id(fmt.Sprintf("%d", src.ID)).Doc(map[string]interface{}{ "age": 29, }).Do(context.Background()) t.Log(err) @@ -74,7 +74,7 @@ func TestNewInstanceSearch(t *testing.T) { query := elastic.NewBoolQuery() //query.Must(elastic.NewMatchQuery("age", "27")) - service := client.Search().Index("es_achievement_index") + service := client.Search().Index("es_manage_index_2") result, err := service.Pretty(true).Query(query).Do(context.Background()) @@ -92,6 +92,15 @@ func TestNewInstanceSearch(t *testing.T) { } } +func TestNewInstanceDelete(t *testing.T) { + client := _new() + //client.Delete() + + _, err := client.Delete().Index("es_achievement_index").Id("5").Do(context.Background()) + + t.Log(err) +} + func TestNewInstance2(t *testing.T) { client := _new() @@ -101,7 +110,7 @@ func TestNewInstance2(t *testing.T) { service := client.Search(). //Index("es_patent_index") - Index("es_manage_index_2") + Index("es_achievement_index") result, err := service.From(0).Size(10). //Explain(true). diff --git a/utils/encrypt.go b/utils/encrypt.go index 4f6157e..77a2e96 100644 --- a/utils/encrypt.go +++ b/utils/encrypt.go @@ -56,10 +56,14 @@ func HashCompare(src, compare []byte) bool { } // HASHIDEncode 混淆 -func HASHIDEncode(src int) string { +func HASHIDEncode(src int, minLength ...int) string { hd := hashids.NewData() hd.Salt = salt hd.MinLength = 12 + + if len(minLength) > 0 { + hd.MinLength = minLength[0] + } h := hashids.NewWithData(hd) e, _ := h.Encode([]int{src}) return e