目录

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"

srcddd的更多相关文章

随机推荐

  1. day01-GUI坦克大战01

    JavaGUI-坦克大战 1.Java绘图坐标体系 坐标体系介绍:下图说明了一个Java坐标体系.坐标原点位于左上角,以像素为单位.在Java坐标体系中,第一个是x坐标,表示当前位置为水平方向,距离坐 ...

  2. linux 运维有趣的实用工具

    1.实时监控磁盘 IO-IOTop IOTop 命令是专门显示硬盘 IO 的命令, 界面风格类似 top 命令. [root@localhost ~]# yum -y install iotop` 2 ...

  3. Linux查看文件内容和压缩文件命令

    查看文件内容 一些重要的目录: /usr/share/    帮助文档.说明文档/var/log/       日志/var/run/       运行中程序/var/tmp       临时文件 根 ...

  4. HTTPS安全加固配置最佳实践指南

    转载自:https://www.bilibili.com/read/cv16067729?spm_id_from=333.999.0.0 0x02 HTTPS安全加固指南 描述: 当你的网站上了 HT ...

  5. 第六章:Django 综合篇

    前面五章,已经将Django最主要的五大系统介绍完毕,除了这些主要章节,还有很多比较重要的内容,比如开发流程相关.安全.本地化与国际化.常见工具和一些框架核心功能.这些内容的篇幅都不大,但整合起来也是 ...

  6. 第六章:Django 综合篇 - 8:信号 signal

    django自带一套信号机制来帮助我们在框架的不同位置之间传递信息.也就是说,当某一事件发生时,信号系统可以允许一个或多个发送者(senders)将通知或信号(signals)发送给一组接受者(rec ...

  7. 修改因python是3版本导致的yum问题

    问题原因: 系统自带的python出来的是2版本,但是因为某些原因,比如安装使用ElartAlert,导致执行python出来的是3版本. 此时执行yum相关的命令,会报错,具体错误信息如下: [ro ...

  8. Java开发学习(三十六)----SpringBoot三种配置文件解析

    一. 配置文件格式 我们现在启动服务器默认的端口号是 8080,访问路径可以书写为 http://localhost:8080/books/1 在线上环境我们还是希望将端口号改为 80,这样在访问的时 ...

  9. 《Go 精进之路》 读书笔记 (第一次更新)

    <Go 精进之路> 读书笔记.简要记录自己打五角星的部分,方便复习巩固.目前看到p120 Go 语言遵从的设计哲学为组合 垂直组合:类型嵌入,快速让一个类型复用其他类型已经实现的能力,实现 ...

  10. 第 46 届 ICPC 国际大学生程序设计竞赛亚洲区域赛(沈阳)

    有时候,很简单的模板题,可能有人没有做出来,(特指 I ),到时候一定要把所有的题目全部看一遍 目录 B 题解 E F 题解 H I 题解&代码 J B 输入样例 3 2 1 2 1 2 3 ...