目录

application
assembler
UserReq.go
UserRsp.go
dto
MessageResult.go
UserDTO.go
services
UserService.go domain
aggregates
Member.go
models
IModel.go
UserAttrs.go
UserLogAttrs.go
UserLogModel.go
UserModel.go
repos
IUserRepo.go
services
UserLoginService.go
valueobjs
UserExtra.go
infrastructure
dao
UserLogRepo.go
UserRepo.go
utils
SysUtil.go
interfaces
configs
UserServiceConfig.go
controllers
UserController.go
main.go

main.go

package main

import (
"dbTest/srcddd/interfaces/configs"
"dbTest/srcddd/interfaces/controllers"
"github.com/shenyisyn/goft-gin/goft"
) func main(){
goft.Ignite().
Config(configs.NewUserServiceConfig()).
Mount("v1",controllers.NewUserController()).
Launch()
}

application\services\UserService.go

package services

import (
"dbTest/srcddd/application/assembler"
"dbTest/srcddd/application/dto"
"dbTest/srcddd/domain/repos"
"dbTest/srcddd/domain/valueobjs"
) type UserService struct {
AssUserReq *assembler.UserReq
AssUserRsp *assembler.UserRsp
UserRepo repos.IUserRepo `inject:"-"`
UserLogRepo repos.IUserLogRepo `inject:"-"`
}
func(this *UserService) GetSimpleUserInfo(req *dto.SimpleUserReq) *dto.SimpleUserInfo {
userModel:=this.AssUserReq.D2M_UserModel(req) //DTO对象转为实体
userModel.UserId = 101
userModel.UserName = "test"
userModel.UserPwd = "123"
extra := &valueobjs.UserExtra{UserCity: "test"}
userModel.Extra = extra
//this.UserRepo.FindById(userModel)
return this.AssUserRsp.M2D_SimpleUserInfo(userModel)
//member:=aggregates.NewMember(userModel,this.UserRepo,this.UserLogRepo)
//return this.AssUserRsp.M2D_SimpleUserInfo(member.QueryUser().User) }

application\assembler\UserReq.go

package assembler

import (
"dbTest/srcddd/application/dto"
"dbTest/srcddd/domain/models"
"github.com/go-playground/validator/v10"
) type UserReq struct {
//v *validator.Validate
} func(this *UserReq) D2M_UserModel(dto *dto.SimpleUserReq) *models.UserModel {
validate := validator.New()
err := validate.Struct(dto)
if err != nil {
panic(err.Error())
}
return models.NewUserModel(
models.WithUserID(dto.Id),
)
}

application\assembler\UserRsp.go

package assembler

import (
"dbTest/srcddd/application/dto"
"dbTest/srcddd/domain/aggregates"
"dbTest/srcddd/domain/models"
) type UserRsp struct { } func(this *UserRsp) M2D_SimpleUserInfo(user *models.UserModel) *dto.SimpleUserInfo {
simpleUser := &dto.SimpleUserInfo{}
simpleUser.Id = user.UserId
simpleUser.Name = user.UserName
simpleUser.City = user.Extra.UserCity
return simpleUser
} func(this *UserRsp) M2D_UserLogs(logs []*models.UserLogModel) (ret []dto.UserLog){
return
} func(this *UserRsp) M2D_UserInfo(mem *aggregates.Member) *dto.UserInfo {
userInfo := &dto.UserInfo{}
userInfo.Id = mem.User.UserId
userInfo.Logs = this.M2D_UserLogs(mem.GetLogs())
return userInfo
}

application\dto\MessageResult.go

package dto

type MessageResult struct {
Result interface{} `json:"result"`
Message string `json:"message"`
Code int `json:"code"`
}

application\dto\UserDTO.go

package dto

import "time"

// mark 输入
type(
SimpleUserReq struct {
Id int `uri:"id" binding:"required,min=100"`
}
) // 输出
type ( SimpleUserInfo struct {
Id int `json:"id"`
Name string `json:"name"`
City string `json:"city"`
} UserLog struct {
Id int `json:"id"`
Log string `json:"log"`
Date time.Time `json:"name"`
} UserInfo struct {
Id int `json:"id"`
Name string `json:"name"`
City string `json:"city"`
Phone string `json:"phone"`
Logs []UserLog `json:"logs"`
})

interfaces\configs\UserServiceConfig.go

package configs

import (
"dbTest/srcddd/application/assembler"
"dbTest/srcddd/application/services"
) type UserServiceConfig struct { } func NewUserServiceConfig() *UserServiceConfig {
return &UserServiceConfig{}
} func(*UserServiceConfig) UserService() *services.UserService {
return &services.UserService{
AssUserReq: &assembler.UserReq{},
AssUserRsp: &assembler.UserRsp{},
}
}

interfaces\controllers\UserController.go

package controllers

import (
"dbTest/srcddd/application/dto"
"dbTest/srcddd/application/services"
"github.com/gin-gonic/gin"
"github.com/shenyisyn/goft-gin/goft"
) type UserController struct {
UserSvr *services.UserService `inject:"-"`
} func NewUserController() *UserController {
return &UserController{}
} //GET /users/123
func(this *UserController) UserDetail(ctx *gin.Context) goft.Json {
simpleUserReq := &dto.SimpleUserReq{}
ctx.ShouldBindUri(simpleUserReq)
return this.UserSvr.GetSimpleUserInfo(simpleUserReq)
} func(this *UserController) Build(goft *goft.Goft) {
goft.Handle("GET","/users/:id",this.UserDetail)
} func(*UserController) Name() string {
return "UserController"
}

domain\aggregates\Member.go

package aggregates

import (
"dbTest/srcddd/domain/models"
"dbTest/srcddd/domain/repos"
) //会员聚合 ----会员: 会员+日志 type Member struct {
User *models.UserModel // 聚合根
Log *models.UserLogModel
userRepo repos.IUserRepo
userLogRepo repos.IUserLogRepo
} func NewMember(user *models.UserModel, userRepo repos.IUserRepo, userLogRepo repos.IUserLogRepo) *Member {
return &Member{User: user, userRepo: userRepo, userLogRepo: userLogRepo}
} func NewMemberByName(name string, userRepo repos.IUserRepo, userLogRepo repos.IUserLogRepo) *Member {
user := userRepo.FindByName(name)
return &Member{User: user, userRepo: userRepo, userLogRepo: userLogRepo}
} func(this *Member)Create() error{
err := this.userRepo.SaveUser(this.User)
if err != nil {
return err
}
this.Log = models.NewUserLogModel(
this.User.UserName,
models.WithUserLogType(models.UserLog_Create),
models.WithUserLogComment("add new user" + this.User.UserName),
)
return this.userLogRepo.SaveLog(this.Log)
} func(this *Member) GetLogs() (ret []*models.UserLogModel) {
return
}

domain\models\IModel.go

package models

import "fmt"

type IModel interface {
ToString() string
} type Model struct {
Id int
Name string //实体名称
} func(this *Model) SetName(name string) {
this.Name = name
} func(this *Model) SetId(id int) {
this.Id = id
} func(this *Model) ToString() string {
return fmt.Sprintf("Entity is:%s,id is %d", this.Name, this.Id)
}

domain\models\UserAttrs.go

package models

import "dbTest/srcddd/domain/valueobjs"

type UserAttrFunc func(model *UserModel)
type UserAttrFuncs []UserAttrFunc func WithUserID(id int) UserAttrFunc {
return func(u *UserModel) {
u.UserId = id
}
} func WithUserName(name string) UserAttrFunc {
return func(u *UserModel) {
u.UserName = name
}
} func WithUserPass(pass string) UserAttrFunc {
return func(u *UserModel) {
u.UserPwd = pass
}
} func WithUserExtra(extra *valueobjs.UserExtra) UserAttrFunc {
return func(u *UserModel) {
u.Extra = extra
}
} func(this UserAttrFuncs) apply(u *UserModel) {
for _,f := range this {
f(u)
}
}

domain\models\UserLogAttrs.go

package models

import "dbTest/srcddd/domain/valueobjs"

type UserAttrFunc func(model *UserModel)
type UserAttrFuncs []UserAttrFunc func WithUserID(id int) UserAttrFunc {
return func(u *UserModel) {
u.UserId = id
}
} func WithUserName(name string) UserAttrFunc {
return func(u *UserModel) {
u.UserName = name
}
} func WithUserPass(pass string) UserAttrFunc {
return func(u *UserModel) {
u.UserPwd = pass
}
} func WithUserExtra(extra *valueobjs.UserExtra) UserAttrFunc {
return func(u *UserModel) {
u.Extra = extra
}
} func(this UserAttrFuncs) apply(u *UserModel) {
for _,f := range this {
f(u)
}
}

domain\models\UserLogAttrs.go

package models

type UserLogAttrFunc func(model *UserLogModel)
type UserLogAttrFuncs []UserLogAttrFunc func WithUserLogType(logType uint8) UserLogAttrFunc {
return func(u *UserLogModel) {
u.LogType = logType
}
} func WithUserLogComment(comment string) UserLogAttrFunc {
return func(u *UserLogModel) {
u.LogComment = comment
}
} func(this UserLogAttrFuncs) apply(u *UserLogModel) {
for _,f := range this {
f(u)
}
}

domain\models\UserLogModel.go

package models

import "time"

const (
UserLog_Create = 5
UserLog_Update = 6
) type UserLogModel struct {
*Model
Id int `gorm:"column(id); primary_key;auto_increment" json:"id"`
UserName string `gorm:"column(user_name);" json:"user_name" xorm:"'user_name'"`
LogType uint8 `gorm:"column(log_type);" json:"log_type" xorm:"'log_type'"`
LogComment string `gorm:"column(log_comment);" json:"log_comment" xorm:"'log_comment'"`
UpdateTime time.Time `gorm:"column(update_time);" json:"update_time" xorm:"'update_time'"`
} func NewUserLogModel(userName string, attrs ...UserLogAttrFunc) *UserLogModel {
logModel := &UserLogModel{UserName: userName}
UserLogAttrFuncs(attrs).apply(logModel)
logModel.Model = &Model{}
logModel.SetId(logModel.Id)
logModel.SetName("user log entity")
return logModel
}

domain\models\UserModel.go

package models

import (
"dbTest/srcddd/domain/valueobjs"
"dbTest/srcddd/infrastructure/utils"
) type UserModel struct {
*Model
UserId int `gorm:"column(user_id); primary_key;auto_increment" json:"user_id"`
UserName string `gorm:"column(user_name);" json:"user_name" xorm:"'user_name'"`
UserPwd string `gorm:"column(user_pwd);" json:"user_pwd" xorm:"'user_pwd'"`
Extra *valueobjs.UserExtra `gorm:"embedded"`//值对象
} func NewUserModel(attrs ...UserAttrFunc) *UserModel {
user := &UserModel{}
UserAttrFuncs(attrs).apply(user)
user.Model = &Model{}
user.SetName("user Entity")
user.SetId(user.UserId)
return user
} func(user *UserModel) BeforeSave() {
user.UserPwd = utils.Md5(user.UserPwd)
}

domain\repos\IUserRepo.go

package repos

import "dbTest/srcddd/domain/models"

type IUserRepo interface {
FindById(*models.UserModel) error
FindByName(string) *models.UserModel
SaveUser(*models.UserModel) error
UpdateUser(*models.UserModel) error
DeleteUser(*models.UserModel) error
} type IUserLogRepo interface {
FindByName(model *models.UserLogModel) error
SaveLog(model *models.UserLogModel) error
}

domain\services\UserLoginService.go

package services

import (
"dbTest/srcddd/domain/repos"
"dbTest/srcddd/infrastructure/utils"
"fmt"
) type UserLoginService struct {
userRepo repos.IUserRepo
}
func(this *UserLoginService) UserLogin(userName string,userPwd string ) (string,error) {
user:=this.userRepo.FindByName(userName)
if user.UserId>0{ //有这个用户
if user.UserPwd==utils.Md5(userPwd){
//记录登录日志
return "1000200",nil
}else{
return "1000400",fmt.Errorf("密码不正确")
}
}else{
return "1000404",fmt.Errorf("用户不存在")
}
}

domain\valueobjs\UserExtra.go

package valueobjs

type UserExtra struct {
UserPhone string `gorm:"column(user_phone);" json:"user_phone" xorm:"'user_phone'"`
UserQQ string `gorm:"column(user_qq);" json:"user_qq" xorm:"'user_qq'"`
UserCity string `gorm:"column(user_city);" json:"user_city" xorm:"'user_city'"`
} type UserExtraAttrFunc func(extra *UserExtra)
type UserExtraAttrFuncs []UserExtraAttrFunc func NewUserExtra(attrs ...UserExtraAttrFunc) *UserExtra {
userExtra := &UserExtra{}
UserExtraAttrFuncs(attrs).apply(userExtra)
return userExtra
} func WithUserPhone(phone string) UserExtraAttrFunc {
return func(u *UserExtra) {
u.UserPhone = phone
}
} func WithUserQQ(qq string) UserExtraAttrFunc {
return func(u *UserExtra) {
u.UserQQ = qq
}
} func WithUserCity(city string) UserExtraAttrFunc {
return func(u *UserExtra) {
u.UserCity = city
}
} func(this UserExtraAttrFuncs) apply(u *UserExtra) {
for _,f := range this {
f(u)
}
}

infrastructure\dao\UserLogRepo.go

package dao

import (
"dbTest/srcddd/domain/models"
"dbTest/srcddd/domain/repos"
"github.com/jinzhu/gorm"
) type UserLogRepo struct {
db *gorm.DB
} func NewUserLogRepo() *UserLogRepo {
return &UserLogRepo{}
} var _ repos.IUserLogRepo = &UserLogRepo{} func (u UserLogRepo) FindByName(model *models.UserLogModel) error {
panic("implement me")
} func (u UserLogRepo) SaveLog(model *models.UserLogModel) error {
panic("implement me")
}

infrastructure\dao\UserRepo.go

package dao

import (
"dbTest/srcddd/domain/models"
"dbTest/srcddd/domain/repos"
"github.com/jinzhu/gorm"
) type UserRepo struct {
DB *gorm.DB
} func NewUserRepo() *UserRepo {
return &UserRepo{}
} var _ repos.IUserRepo = &UserRepo{} func (this *UserRepo) FindById(model *models.UserModel) error {
return this.DB.Where("user_id=?",model.Id).Error
} func (this *UserRepo) FindByName(name string) *models.UserModel{
panic("implement me")
} func (this *UserRepo) SaveUser(model *models.UserModel) error {
return nil
} func (this *UserRepo) UpdateUser(model *models.UserModel) error {
return nil
} func (this *UserRepo) DeleteUser(model *models.UserModel) error {
return nil
}

infrastructure\utils\SysUtil.go

package utils

import (
"crypto/md5"
"fmt"
) func Md5(str string) string {
return fmt.Sprintf("%X",md5.Sum([]byte(str)))
}

问题解决:

1.


//error 输入 type (
SimpleUserReq struct {
Id int `json:"id" binding:"required,min=100"`
}
) // mark 输入
type(
SimpleUserReq struct {
Id int `uri:"id" binding:"required,min=100"`
}
)

error //GET /users/123
func(this UserController) UserDetail(ctx *gin.Context) goft.Json {
simpleUserReq := &dto.SimpleUserReq{}
ctx.ShouldBindUri(simpleUserReq)
return this.UserSvr.GetSimpleUserInfo(simpleUserReq)
} mark //GET /users/123
func(this *UserController) UserDetail(ctx *gin.Context) goft.Json {
simpleUserReq := &dto.SimpleUserReq{}
ctx.ShouldBindUri(simpleUserReq)
return this.UserSvr.GetSimpleUserInfo(simpleUserReq)
}

实现1 func NewUserService() *UserService {
return &UserService{
UserRepo: dao.NewUserRepo(),
}
} usr := NewUserService()
usr.UserRepo.FindById(userModel)
//this.UserRepo.FindById(userModel) 实现2 func main(){
goft.Ignite().
Config(configs.NewUserServiceConfig(), configs.NewDBConfig(), configs.NewRepoConfig()).
Mount("v1",controllers.NewUserController()).
Launch()
} type RepoConfig struct { } func NewRepoConfig() *RepoConfig {
return &RepoConfig{}
} func(*RepoConfig) UserRepo() repos.IUserRepo{
return &dao.UserRepo{}
} type UserService struct {
AssUserReq *assembler.UserReq
AssUserRsp *assembler.UserRsp
UserRepo repos.IUserRepo `inject:"-"`
UserLogRepo repos.IUserLogRepo `inject:"-"`
} this.UserRepo.FindById(userModel) 总结:
1.大小写的问题
type UserService struct {
AssUserReq *assembler.UserReq
AssUserResp *assembler.UserResp
UserRepos repos.IUserRepos `inject:"-"`
//userRepos repos.IUserRepos `inject:"-"` error 无法被注入
UserLogRepo repos.IUserLogRepos `inject:"-"`
}
2.注入问题
`inject:"-"`
3.库的引入
"gorm.io/gorm"
or 不同
"github.com/jinzhu/gorm"

最新文章

  1. docker容器与容器云读书笔记1
  2. No zuo no die:DDD 应对具体业务场景,Domain Model 重新设计
  3. Android—Socket中关闭IO流后导致Socket关闭不能再收发数据的解决办法
  4. Git常用
  5. iOS 阶段学习第十天笔记(结构体)
  6. 大熊君说说JS与设计模式之------状态模式State
  7. 安装cuda时 提示toolkit installation failed using unsupported compiler解决方法
  8. jQuery添加删除元素
  9. vs 中无法加载项目的解决方案
  10. .NET企业轻量级开发框架(APS.NET+Spring.Net+NHibernate)
  11. apk文件解析,学习笔记
  12. iptables阻止服务器被攻击
  13. 12款 jquery轮播插件
  14. Windows Azure 上 Linux VM 中的交换空间 – 第 2 部分
  15. java 类型转换(摘自网络)
  16. ARM处理器简介
  17. 201521123025《java程序设计》第10周学习总结
  18. WPF 快捷方式
  19. 如何设置让网站禁止被爬虫收录?robots.txt
  20. 在Windows Server2016中安装SQL Server2016

热门文章

  1. 截取url后缀扩展名方法
  2. Javascript实现base64的加密解密方法
  3. KingbaseES时间函数的比较
  4. 【Vue学习笔记】—— vuex的语法 { }
  5. Linux做bond4
  6. 【前端必会】让ESLint与Prettier一起玩耍
  7. PAT (Basic Level) Practice 1026 程序运行时间 分数 15
  8. 关于Jenkins-Item-Office 365 Connector-下的多选框的参数定义
  9. acwing1782 Dynamic Rankings (整体二分)
  10. Lombok好用是好用,就是容易踩坑,这份避坑指南请查收