srcddd
目录
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的更多相关文章
随机推荐
- 从零教你使用MindStudio进行Pytorch离线推理全流程
摘要:MindStudio的是一套基于华为自研昇腾AI处理器开发的AI全栈开发工具平台,该IDE上功能很多,涵盖面广,可以进行包括网络模型训练.移植.应用开发.推理运行及自定义算子开发等多种任务. 本 ...
- ABC266.
D 设 \(f_{t,p}\) 代表在 \(t\) 时间点时人在 \(p\) 点的最大收益,在这一步他可以 \(p\) 增加,不动,\(p\) 减少.于是得出状态转移方程:\(f_{t,p} = \m ...
- C++ 初识函数模板
1. 前言 什么是函数模板? 理解什么是函数模板,须先搞清楚为什么需要函数模板. 如果现在有一个需求,要求编写一个求 2 个数字中最小数字的函数,这 2 个数字可以是 int类型,可以是 float ...
- 邮箱的代理发送Send as权限不生效
邮箱的代理发送Sendas权限不生效 最近,有需求为用户添加其它邮箱的代理发送Sendas权限.在Exchange的管理单元里添加完毕后,发现没有效果,客户端提示你没有权限以用户的名义发送邮件 ...
- 云原生之旅 - 2)Docker 容器化你的应用
前言 上文中我们用Golang写了一个HTTP server,本篇文章我们讲述如何容器化这个应用,为后续部署到kubernetes 做准备. 关键词:Docker, Containerization, ...
- MySQL配置不当导致Sonarqube出错的一次经历:Packet for query is too large (16990374 > 13421568)
公司里部署了Jenkins + Sonarqube对项目代码进行构建和代码质量扫描. 某个大型项目报告项目构建失败.进jenkins看,该项目构建日志中的报错信息是这样的: 通过错误堆栈中的信息可以判 ...
- Winsw将jar包部署为windows服务
1. 下载Winsw https://github.com/winsw/winsw/releases 下载winsw官网上的xml文件和.exe文件 2. 编辑配置文件 创建一个文件夹demo,将所需 ...
- 1_JavaWeb引言
JavaEE平台 (Java Platform Enterprise Edition) Web进阶核心知识 part1: 数据库应用与JDBC MySQL, SQL语言, JDBC, 三层架构, 连接 ...
- java设计模式之七大原则
java设计模式 以下内容为本人的学习笔记,如需要转载,请声明原文链接 https://www.cnblogs.com/lyh1024/p/16724932.html 设计模式 1.设计模式的目的 ...
- PAT (Basic Level) Practice 1011 A+B 和 C 分数 15
给定区间 [−231,231] 内的 3 个整数 A.B 和 C,请判断 A+B 是否大于 C. 输入格式: 输入第 1 行给出正整数 T (≤10),是测试用例的个数.随后给出 T 组测试用例,每组 ...