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的更多相关文章
随机推荐
- 报错:①Tog goal specified requires a project to execute but there is no POM in this directory......②说类HelloWorld是公共的, 应在名为 HelloWorld.java 的文件中声明 public class HelloWorld......
在运行Maven的命令时,在DOS窗口里面必须把目录切换到项目的根部,要不然命令是找不到目的地. 下图是错误示范,项目在Demo02这个目录里,就必须将目录切换到Demo02下,否则DOS窗口只有飘红 ...
- Makefile 文件的编写
目录 目录 Makefile 编写规则 Makefile 编写规则 生成的目标文件:依赖文件 生成目标文件所需执行的动作(注:命令行前需加Tab推进) 例: VPATH=inc src main:ma ...
- 离线方式安装高可用RKE2 (版本: v1.22.13+rke2r1)记录
说明: 想要了解RKE2可以到官网(https://docs.rke2.io 或 https://docs.rancher.cn/docs/rke2/_index/)看最新资料 用官网给出的离线安装( ...
- 小结event.target与this
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...
- Nginx location总结
最近操作Nginx.conf 的location部分,发现了一个巨坑,在这做个记录 当我用一下配置时 location = / { root /usr/share/nginx/html; index ...
- Windows编程之线程
本笔记整理自:<Windows核心编程(第五版)> 目录 何为线程 线程的开始和结束 创建线程 终止线程 线程运行时的调度和线程优先级 挂起(暂停).恢复与睡眠 挂起 恢复 睡眠 线程切换 ...
- day03-3私聊功能
多用户即时通讯系统03 4.编码实现02 4.4功能实现-私聊功能实现 4.4.1思路分析 客户端 - 发送者: 用户在控制台输入信息,客户端接收内容 将消息构建成Messgae对象,通过对应的soc ...
- [题解] Codeforces Global Round 22 1738 A B C D E F 题解
很久没rated打过cf的比赛了,这次打得还行,至少进前100了 点我看题 A. Glory Addicts 把类型0的数放进数组a里,类型1的数放进数组b里.如果\(|a|=|b|\),你可以把所有 ...
- Python 实现Tracert追踪TTL值
Tracert 命令跟踪路由原理是IP路由每经过一个路由节点TTL值会减一,假设TTL值=0时数据包还没有到达目标主机,那么该路由则会回复给目标主机一个数据包不可达,由此我们就可以获取到目标主机的IP ...
- 源码随想 String -> SoftReference
源码随想 String -> SoftReference 2021年7月27日 15:38:14 今天实习时看 String的源码,发现其中的一个构造方法 public String(byte ...