Przeglądaj źródła

添加使用ds的demo

yjp 1 rok temu
rodzic
commit
84614ba385
50 zmienionych plików z 2150 dodań i 10 usunięć
  1. 14 3
      go.mod
  2. 36 7
      go.sum
  3. 90 0
      project/server_ds/application/application.go
  4. 117 0
      project/server_ds/application/domain/class/entity.go
  5. 12 0
      project/server_ds/application/domain/class/info.go
  6. 41 0
      project/server_ds/application/domain/class/request_params.go
  7. 110 0
      project/server_ds/application/domain/family/entity.go
  8. 12 0
      project/server_ds/application/domain/family/info.go
  9. 47 0
      project/server_ds/application/domain/family/request_params.go
  10. 66 0
      project/server_ds/application/domain/hobby/entity.go
  11. 16 0
      project/server_ds/application/domain/hobby/request_params.go
  12. 94 0
      project/server_ds/application/domain/identity/entity.go
  13. 11 0
      project/server_ds/application/domain/identity/info.go
  14. 38 0
      project/server_ds/application/domain/identity/request_params.go
  15. 97 0
      project/server_ds/application/domain/student/entity.go
  16. 11 0
      project/server_ds/application/domain/student/info.go
  17. 75 0
      project/server_ds/application/domain/student/request_params.go
  18. 60 0
      project/server_ds/application/service/class.go
  19. 38 0
      project/server_ds/application/service/class_and_student.go
  20. 25 0
      project/server_ds/application/service/configuration.go
  21. 36 0
      project/server_ds/application/service/family.go
  22. 36 0
      project/server_ds/application/service/identity.go
  23. 25 0
      project/server_ds/application/service/operate_log.go
  24. 27 0
      project/server_ds/application/service/service.go
  25. 23 0
      project/server_ds/application/service/sql_executor.go
  26. 36 0
      project/server_ds/application/service/student.go
  27. 39 0
      project/server_ds/application/service/student_and_family.go
  28. 37 0
      project/server_ds/application/service/student_and_hobby.go
  29. 37 0
      project/server_ds/application/service/student_and_identity.go
  30. 58 0
      project/server_ds/application/service/version.go
  31. 71 0
      project/server_ds/config/config.go
  32. 22 0
      project/server_ds/deployment/config/config.yaml
  33. 20 0
      project/server_ds/deployment/data_service/base.yaml
  34. 9 0
      project/server_ds/deployment/data_service/create_data_containers.ps1
  35. 10 0
      project/server_ds/deployment/data_service/create_data_containers.sh
  36. 30 0
      project/server_ds/deployment/data_service/data_containers/class.yaml
  37. 23 0
      project/server_ds/deployment/data_service/data_containers/configuration.yaml
  38. 35 0
      project/server_ds/deployment/data_service/data_containers/family.yaml
  39. 25 0
      project/server_ds/deployment/data_service/data_containers/identity.yaml
  40. 41 0
      project/server_ds/deployment/data_service/data_containers/operate_log.yaml
  41. 20 0
      project/server_ds/deployment/data_service/data_containers/sql_executor.yaml
  42. 35 0
      project/server_ds/deployment/data_service/data_containers/student.yaml
  43. 16 0
      project/server_ds/deployment/data_service/data_containers/student_and_hobby.yaml
  44. 16 0
      project/server_ds/deployment/data_service/data_containers/student_and_identity.yaml
  45. 9 0
      project/server_ds/deployment/data_service/delete_data_containers.ps1
  46. 10 0
      project/server_ds/deployment/data_service/delete_data_containers.sh
  47. 105 0
      project/server_ds/main.go
  48. 83 0
      project/server_ds/test/configuration_test.go
  49. 186 0
      project/server_ds/test/tool_kit.go
  50. 20 0
      project/server_ds/test/version_test.go

+ 14 - 3
go.mod

@@ -3,8 +3,8 @@ module baize-demo
 go 1.22.3
 
 require (
-	git.sxidc.com/go-framework/baize v0.11.19
-	git.sxidc.com/go-tools/utils v1.5.15
+	git.sxidc.com/go-framework/baize v0.11.23
+	git.sxidc.com/go-tools/utils v1.5.23
 	git.sxidc.com/service-supports/fslog v0.5.9
 	git.sxidc.com/service-supports/scm-sdk v0.1.0
 	github.com/pkg/errors v0.9.1
@@ -14,6 +14,10 @@ require (
 )
 
 require (
+	git.sxidc.com/go-tools/api_binding v1.3.23 // indirect
+	git.sxidc.com/service-supports/ds-sdk v0.10.7 // indirect
+	git.sxidc.com/service-supports/fserr v0.3.2 // indirect
+	git.sxidc.com/service-supports/websocket v1.3.1 // indirect
 	github.com/Masterminds/goutils v1.1.1 // indirect
 	github.com/Masterminds/semver/v3 v3.2.0 // indirect
 	github.com/Masterminds/sprig/v3 v3.2.3 // indirect
@@ -26,6 +30,7 @@ require (
 	github.com/davecgh/go-spew v1.1.1 // indirect
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect
 	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
+	github.com/fatih/structs v1.1.0 // indirect
 	github.com/gabriel-vasile/mimetype v1.4.3 // indirect
 	github.com/gin-contrib/sse v0.1.0 // indirect
 	github.com/gin-gonic/gin v1.10.0 // indirect
@@ -34,8 +39,10 @@ require (
 	github.com/go-playground/validator/v10 v10.20.0 // indirect
 	github.com/go-resty/resty/v2 v2.11.0 // indirect
 	github.com/goccy/go-json v0.10.2 // indirect
-	github.com/google/go-cmp v0.6.0 // indirect
+	github.com/gogo/protobuf v1.3.0 // indirect
+	github.com/golang/protobuf v1.5.4 // indirect
 	github.com/google/uuid v1.6.0 // indirect
+	github.com/gorilla/websocket v1.5.0 // indirect
 	github.com/huandu/xstrings v1.3.3 // indirect
 	github.com/iancoleman/strcase v0.3.0 // indirect
 	github.com/imdario/mergo v0.3.11 // indirect
@@ -52,6 +59,8 @@ require (
 	github.com/mitchellh/reflectwalk v1.0.0 // indirect
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 	github.com/modern-go/reflect2 v1.0.2 // indirect
+	github.com/mwitkow/go-proto-validators v0.3.2 // indirect
+	github.com/olahol/melody v1.2.1 // indirect
 	github.com/pelletier/go-toml/v2 v2.2.2 // indirect
 	github.com/pmezard/go-difflib v1.0.0 // indirect
 	github.com/redis/go-redis/v9 v9.4.0 // indirect
@@ -69,6 +78,8 @@ require (
 	golang.org/x/net v0.25.0 // indirect
 	golang.org/x/sys v0.20.0 // indirect
 	golang.org/x/text v0.15.0 // indirect
+	google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect
+	google.golang.org/grpc v1.64.0 // indirect
 	google.golang.org/protobuf v1.34.1 // indirect
 	gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
 	gorm.io/driver/postgres v1.5.7 // indirect

+ 36 - 7
go.sum

@@ -1,11 +1,19 @@
-git.sxidc.com/go-framework/baize v0.11.19 h1:qeSh8jkO4yQEX97U/4qnhm7Tszk9DVhMwr4Si/xRfBU=
-git.sxidc.com/go-framework/baize v0.11.19/go.mod h1:xE4XwsvwSO8tR5j8BaVZUTngU+HLNICHwdl5x1LULa0=
-git.sxidc.com/go-tools/utils v1.5.15 h1:7xs/EM8XZyKycrSSHcPZ6wvyYs+v8uWQ7ZmPP/fHyFI=
-git.sxidc.com/go-tools/utils v1.5.15/go.mod h1:fkobAXFpOMTvkZ82TQXWcpsayePcyk/MS5TN6GTlRDg=
+git.sxidc.com/go-framework/baize v0.11.23 h1:ZSTNTLviwWHob6ovbHkm4iwBU/t3zxwh6hcnLTtgRmE=
+git.sxidc.com/go-framework/baize v0.11.23/go.mod h1:NrSdxbD+c0mOCPhH+xOGVZsDAxO2cEQhPYQwXfNF61k=
+git.sxidc.com/go-tools/api_binding v1.3.23 h1:vgCdYq09aiw7Vs9JeOR0OZLOjezbHugQ/3ABeakvD4g=
+git.sxidc.com/go-tools/api_binding v1.3.23/go.mod h1:SmUnRrMtODonLzWmWCGQN9uAB2TjH8g5yEKFnp4rEgU=
+git.sxidc.com/go-tools/utils v1.5.23 h1:Kbcj+EafFVssRa6i1jnILi+LddLWMDtyvRzuV26C6fU=
+git.sxidc.com/go-tools/utils v1.5.23/go.mod h1:uTDb6QK5JZzK5+Fzsfeng7TwmnRDZiTY6JLYxIX94Qw=
+git.sxidc.com/service-supports/ds-sdk v0.10.7 h1:Ok552Pom8g50Fsrb/OWyIhB6axuPp5hS1wcJtTZu1JU=
+git.sxidc.com/service-supports/ds-sdk v0.10.7/go.mod h1:NtuKH9TDWGlgvhXKN2eGP69X0HrG3nK8VB0Tu3Ko7Hg=
+git.sxidc.com/service-supports/fserr v0.3.2 h1:5/FCr8o2jd1kNsp5tH/ADjB9fr091JZXMMZ15ZvNZzs=
+git.sxidc.com/service-supports/fserr v0.3.2/go.mod h1:W54RoA71mfex+zARuH/iMnQPMnBXQ23qXXOkwUh2sVQ=
 git.sxidc.com/service-supports/fslog v0.5.9 h1:q2XIK2o/fk/qmByy4x5kKLC+k7kolT5LrXHcWRSffXQ=
 git.sxidc.com/service-supports/fslog v0.5.9/go.mod h1:/m03ATmmOle75qtEgvEw8a1+Dcg6iHp08M1bGFXJTBU=
 git.sxidc.com/service-supports/scm-sdk v0.1.0 h1:198qs/XxffOrHioKEWXyPfsQLoO3E8Ifj4idOWJxIe0=
 git.sxidc.com/service-supports/scm-sdk v0.1.0/go.mod h1:F0DLFok92zElZZRxJujSk6KmRoVGN8bkrbXFdq19uwI=
+git.sxidc.com/service-supports/websocket v1.3.1 h1:1mRfUwvpg0QA2JVKVMK8YJ/B33HFpDhY9srqroIuNGc=
+git.sxidc.com/service-supports/websocket v1.3.1/go.mod h1:YqEZXkN8ZFzUp01tDlekgIJJ0Yz+67d6eTXyA0ZIkgM=
 github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
 github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
 github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g=
@@ -35,6 +43,8 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumC
 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
+github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
+github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
 github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0=
 github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
 github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
@@ -53,6 +63,11 @@ github.com/go-resty/resty/v2 v2.11.0 h1:i7jMfNOJYMp69lq7qozJP+bjgzfAzeOhuGlyDrqx
 github.com/go-resty/resty/v2 v2.11.0/go.mod h1:iiP/OpA0CkcL3IGt1O0+/SIItFUbkkyw5BGXiVdTu+A=
 github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
 github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/gogo/protobuf v1.3.0 h1:G8O7TerXerS4F6sx9OV7/nRfJdnXgHZu/S/7F2SN+UE=
+github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
+github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
 github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
 github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
@@ -61,6 +76,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
 github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g=
 github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k=
+github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
+github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
 github.com/huandu/xstrings v1.3.3 h1:/Gcsuc1x8JVbJ9/rlye4xZnVAbEkGauT8lbebqcQws4=
 github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
 github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=
@@ -81,12 +98,14 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr
 github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
 github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
 github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM=
 github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
 github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
-github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
-github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
 github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
@@ -102,6 +121,10 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
 github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/mwitkow/go-proto-validators v0.3.2 h1:qRlmpTzm2pstMKKzTdvwPCF5QfBNURSlAgN/R+qbKos=
+github.com/mwitkow/go-proto-validators v0.3.2/go.mod h1:ej0Qp0qMgHN/KtDyUt+Q1/tA7a5VarXUOUxD+oeD30w=
+github.com/olahol/melody v1.2.1 h1:xdwRkzHxf+B0w4TKbGpUSSkV516ZucQZJIWLztOWICQ=
+github.com/olahol/melody v1.2.1/go.mod h1:GgkTl6Y7yWj/HtfD48Q5vLKPVoZOH+Qqgfa7CvJgJM4=
 github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
 github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -202,10 +225,15 @@ golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
 golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
 golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
 golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=
+google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY=
+google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg=
 google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=
 google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -214,8 +242,9 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV
 gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
 gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
 gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

+ 90 - 0
project/server_ds/application/application.go

@@ -0,0 +1,90 @@
+package application
+
+import (
+	"baize-demo/project/server/application/service"
+	"baize-demo/project/server/config"
+	"git.sxidc.com/go-framework/baize"
+	"git.sxidc.com/go-framework/baize/framework/core/api"
+	"git.sxidc.com/go-framework/baize/framework/core/application"
+	"net/http"
+)
+
+var appInstance *application.App
+
+func NewApp() {
+	if appInstance != nil {
+		return
+	}
+
+	appInstance = baize.NewApplication(config.GetConfig().ApplicationConfig)
+
+	// 注册Router
+	appInstance.Api().PrefixRouter().RegisterVersionedRouter("v1")
+
+	err := appInstance.Infrastructure().LocalCache().Set("version", "v1.0.0", 5)
+	if err != nil {
+		panic(err)
+	}
+
+	err = appInstance.Infrastructure().RedisCache().Set("version", "v1.0.0", 5)
+	if err != nil {
+		panic(err)
+	}
+}
+
+func DestroyApp() {
+	if appInstance == nil {
+		return
+	}
+
+	err := appInstance.Infrastructure().RedisCache().Clear()
+	if err != nil {
+		panic(err)
+	}
+
+	err = appInstance.Infrastructure().LocalCache().Clear()
+	if err != nil {
+		panic(err)
+	}
+
+	baize.DestroyApplication(appInstance)
+	appInstance = nil
+}
+
+func Start() error {
+	// 初始化服务
+	for _, svc := range service.RegisteredServices {
+		err := svc.Init(appInstance)
+		if err != nil {
+			return err
+		}
+	}
+
+	err := appInstance.Start()
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func Finish() error {
+	err := appInstance.Finish()
+	if err != nil {
+		return err
+	}
+
+	// 销毁服务
+	for _, svc := range service.RegisteredServices {
+		err := svc.Destroy()
+		if err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
+
+func ServerHttpForTest(w http.ResponseWriter, req *http.Request) {
+	appInstance.Api().RootRouter().(*api.RootRouter).ServerHttp(w, req)
+}

+ 117 - 0
project/server_ds/application/domain/class/entity.go

@@ -0,0 +1,117 @@
+package class
+
+import (
+	"git.sxidc.com/go-framework/baize/convenient/domain/operate_log"
+	"git.sxidc.com/go-framework/baize/framework/core/domain"
+	"git.sxidc.com/go-framework/baize/framework/core/domain/entity"
+	"git.sxidc.com/go-framework/baize/framework/core/tag/check"
+	"git.sxidc.com/go-tools/utils/strutils"
+	"github.com/pkg/errors"
+)
+
+const (
+	FieldName       = "Name"
+	FieldStudentNum = "StudentNum"
+)
+
+var (
+	ColumnName       = domain.ColumnName(FieldName)
+	ColumnStudentNum = domain.ColumnName(FieldStudentNum)
+)
+
+var fieldMap = map[string]string{
+	FieldName:       "班名",
+	FieldStudentNum: "学生数量",
+}
+
+type Entity struct {
+	entity.Base
+	Name       string   `sqlmapping:"column:name" sqlresult:"column:name" check:"required,lte=128"`
+	StudentNum int      `sqlmapping:"column:student_num;updateClear;" sqlresult:"column:student_num"`
+	StudentIDs []string `sqlmapping:"-" sqlresult:"-"`
+	entity.TimeFields
+}
+
+func (e *Entity) DomainCNName() string {
+	return "班级"
+}
+
+func (e *Entity) DomainCamelName() string {
+	return "Class"
+}
+
+func (e *Entity) ForCreate() error {
+	checkResult := check.Struct(e, fieldMap)
+
+	err := entity.CheckFieldIDResult(checkResult)
+	if err != nil {
+		return err
+	}
+
+	err = domain.CheckField(checkResult, e.DomainCNName(), FieldName)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (e *Entity) ForDelete() error {
+	checkResult := check.Struct(e, fieldMap)
+
+	err := entity.CheckFieldIDResult(checkResult)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (e *Entity) ForUpdate() error {
+	checkResult := check.Struct(e, fieldMap)
+
+	err := entity.CheckFieldIDResult(checkResult)
+	if err != nil {
+		return err
+	}
+
+	err = e.checkUpdateFields(checkResult)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (e *Entity) ObjectInfo() operate_log.ObjectInfo {
+	return operate_log.ObjectInfo{
+		Resource:   e.DomainCamelName(),
+		ResourceID: e.ID,
+	}
+}
+
+func (e *Entity) OperatorInfo() operate_log.OperatorInfo {
+	return operate_log.OperatorInfo{}
+}
+
+func (e *Entity) LogContent() map[string]any {
+	return map[string]any{
+		"name":        e.Name,
+		"student_num": e.StudentNum,
+	}
+}
+
+func (e *Entity) checkUpdateFields(checkResult check.Result) error {
+	if strutils.AllBlank(e.Name) {
+		return errors.New(e.DomainCNName() + "没有传递需要更新的字段")
+	}
+
+	if strutils.IsStringNotEmpty(e.Name) {
+		err := domain.CheckField(checkResult, e.DomainCNName(), FieldName)
+		if err != nil {
+			return err
+		}
+	}
+
+	return nil
+}

+ 12 - 0
project/server_ds/application/domain/class/info.go

@@ -0,0 +1,12 @@
+package class
+
+import (
+	"git.sxidc.com/go-framework/baize/framework/core/application"
+)
+
+type Info struct {
+	application.InfoIDField
+	Name       string `json:"name" sqlresult:"column:name"`
+	StudentNum int    `json:"studentNum" sqlresult:"column:student_num"`
+	application.InfoTimeFields
+}

+ 41 - 0
project/server_ds/application/domain/class/request_params.go

@@ -0,0 +1,41 @@
+package class
+
+import (
+	"git.sxidc.com/go-framework/baize/framework/core/api/request"
+)
+
+type (
+	CreateClassJsonBody struct {
+		Name       string `json:"name" binding:"required" assign:"toField:Name"`
+		StudentNum int    `json:"studentNum" binding:"required" assign:"toField:StudentNum"`
+	}
+
+	DeleteClassQueryParams struct {
+		request.IDQueryParam
+	}
+
+	UpdateClassJsonBody struct {
+		request.IDJsonBody
+		Name       string `json:"name" assign:"toField:Name"`
+		StudentNum int    `json:"studentNum" assign:"toField:StudentNum"`
+	}
+
+	GetClassesQueryParams struct {
+		request.BaseQueryParams
+		Name       string `form:"name" assign:"toField:Name"`
+		StudentNum int    `form:"studentNum" assign:"toField:StudentNum"`
+	}
+
+	GetClassByIDQueryParams struct {
+		request.IDQueryParam
+	}
+
+	UpdateStudentsOfClassJsonBody struct {
+		request.IDJsonBody
+		StudentIDs []string `json:"studentIds" assign:"toField:StudentIDs"`
+	}
+
+	QueryStudentsOfClassQueryParams struct {
+		request.BaseQueryWithIDParams
+	}
+)

+ 110 - 0
project/server_ds/application/domain/family/entity.go

@@ -0,0 +1,110 @@
+package family
+
+import (
+	"git.sxidc.com/go-framework/baize/framework/core/domain"
+	"git.sxidc.com/go-framework/baize/framework/core/domain/entity"
+	"git.sxidc.com/go-framework/baize/framework/core/tag/check"
+	"git.sxidc.com/go-tools/utils/strutils"
+	"github.com/pkg/errors"
+)
+
+const (
+	FieldFather = "Father"
+	FieldMother = "Mother"
+)
+
+var (
+	ColumnFather = domain.ColumnName(FieldFather)
+	ColumnMother = domain.ColumnName(FieldMother)
+)
+
+var fieldMap = map[string]string{
+	FieldFather: "父亲姓名",
+	FieldMother: "母亲姓名",
+}
+
+type Entity struct {
+	entity.Base
+	Father    string `sqlmapping:"column:father" sqlresult:"column:father" check:"required,lte=128"`
+	Mother    string `sqlmapping:"column:mother" sqlresult:"column:mother" check:"required,lte=128"`
+	StudentID string `sqlmapping:"column:student_id" sqlresult:"column:student_id" check:"required,eq=32"`
+	entity.TimeFields
+}
+
+func (e *Entity) DomainCNName() string {
+	return "家庭"
+}
+
+func (e *Entity) DomainCamelName() string {
+	return "Family"
+}
+
+func (e *Entity) ForCreate() error {
+	checkResult := check.Struct(e, fieldMap)
+
+	err := entity.CheckFieldIDResult(checkResult)
+	if err != nil {
+		return err
+	}
+
+	err = domain.CheckField(checkResult, e.DomainCNName(), FieldFather)
+	if err != nil {
+		return err
+	}
+
+	err = domain.CheckField(checkResult, e.DomainCNName(), FieldMother)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (e *Entity) ForDelete() error {
+	checkResult := check.Struct(e, fieldMap)
+
+	err := entity.CheckFieldIDResult(checkResult)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (e *Entity) ForUpdate() error {
+	checkResult := check.Struct(e, fieldMap)
+
+	err := entity.CheckFieldIDResult(checkResult)
+	if err != nil {
+		return err
+	}
+
+	err = e.checkUpdateFields(checkResult)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (e *Entity) checkUpdateFields(checkResult check.Result) error {
+	if strutils.AllBlank(e.Father, e.Mother) {
+		return errors.New(e.DomainCNName() + "没有传递需要更新的字段")
+	}
+
+	if strutils.IsStringNotEmpty(e.Father) {
+		err := domain.CheckField(checkResult, e.DomainCNName(), FieldFather)
+		if err != nil {
+			return err
+		}
+	}
+
+	if strutils.IsStringNotEmpty(e.Mother) {
+		err := domain.CheckField(checkResult, e.DomainCNName(), FieldMother)
+		if err != nil {
+			return err
+		}
+	}
+
+	return nil
+}

+ 12 - 0
project/server_ds/application/domain/family/info.go

@@ -0,0 +1,12 @@
+package family
+
+import (
+	"git.sxidc.com/go-framework/baize/framework/core/application"
+)
+
+type Info struct {
+	application.InfoIDField
+	Father string `json:"father" sqlresult:"column:father"`
+	Mother string `json:"mother" sqlresult:"column:mother"`
+	application.InfoTimeFields
+}

+ 47 - 0
project/server_ds/application/domain/family/request_params.go

@@ -0,0 +1,47 @@
+package family
+
+import (
+	"git.sxidc.com/go-framework/baize/framework/core/api/request"
+)
+
+type (
+	CreateFamilyJsonBody struct {
+		Father string `json:"father" binding:"required" assign:"toField:Father"`
+		Mother string `json:"mother" binding:"required" assign:"toField:Mother"`
+	}
+
+	DeleteFamilyQueryParams struct {
+		request.IDQueryParam
+	}
+
+	UpdateFamilyJsonBody struct {
+		request.IDJsonBody
+		Father string `json:"father" assign:"toField:Father"`
+		Mother string `json:"mother" assign:"toField:Mother"`
+	}
+
+	GetFamiliesQueryParams struct {
+		request.BaseQueryParams
+		Father string `form:"father" assign:"toField:Father"`
+		Mother string `form:"mother" assign:"toField:Mother"`
+	}
+
+	GetFamilyByIDQueryParams struct {
+		request.IDQueryParam
+	}
+
+	UpdateStudentOfFamilyJsonBody struct {
+		request.IDJsonBody
+		StudentID string `json:"studentId" assign:"toField:StudentID"`
+	}
+
+	QueryStudentOfFamilyQueryParams struct {
+		request.IDQueryParam
+	}
+
+	QueryFamilyWithStudentQueryParams struct {
+		request.BaseQueryParams
+		Father string `form:"father" assign:"toField:Father"`
+		Mother string `form:"mother" assign:"toField:Mother"`
+	}
+)

+ 66 - 0
project/server_ds/application/domain/hobby/entity.go

@@ -0,0 +1,66 @@
+package hobby
+
+import (
+	"git.sxidc.com/go-framework/baize/framework/core/domain/entity"
+	"git.sxidc.com/go-framework/baize/framework/core/tag/check"
+	"git.sxidc.com/go-tools/utils/strutils"
+)
+
+type Entity struct {
+	ID         string   `sqlmapping:"-" sqlresult:"-" check:"required,len=32"`
+	StudentIDs []string `sqlmapping:"-" sqlresult:"-"`
+}
+
+func (e *Entity) DBSchema() string {
+	return ""
+}
+
+func (e *Entity) GenerateID() error {
+	e.ID = strutils.SimpleUUID()
+	return nil
+}
+
+func (e *Entity) GetID() string {
+	return e.ID
+}
+
+func (e *Entity) DomainCNName() string {
+	return "爱好"
+}
+
+func (e *Entity) DomainCamelName() string {
+	return "Hobby"
+}
+
+func (e *Entity) ForCreate() error {
+	err := e.CheckFieldID()
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (e *Entity) ForDelete() error {
+	return e.CheckFieldID()
+}
+
+func (e *Entity) ForUpdate() error {
+	err := e.CheckFieldID()
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (e *Entity) CheckFieldID() error {
+	checkResult := check.Struct(e, map[string]string{entity.FieldID: e.DomainCNName() + "ID"})
+
+	err := entity.CheckFieldIDResult(checkResult)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}

+ 16 - 0
project/server_ds/application/domain/hobby/request_params.go

@@ -0,0 +1,16 @@
+package hobby
+
+import (
+	"git.sxidc.com/go-framework/baize/framework/core/api/request"
+)
+
+type (
+	UpdateStudentsOfHobbyJsonBody struct {
+		request.IDJsonBody
+		StudentIDs []string `json:"studentIds" assign:"toField:StudentIDs"`
+	}
+
+	QueryStudentsOfHobbyQueryParams struct {
+		request.BaseQueryWithIDParams
+	}
+)

+ 94 - 0
project/server_ds/application/domain/identity/entity.go

@@ -0,0 +1,94 @@
+package identity
+
+import (
+	"git.sxidc.com/go-framework/baize/framework/core/domain"
+	"git.sxidc.com/go-framework/baize/framework/core/domain/entity"
+	"git.sxidc.com/go-framework/baize/framework/core/tag/check"
+	"git.sxidc.com/go-tools/utils/strutils"
+	"github.com/pkg/errors"
+)
+
+const (
+	FieldName = "Name"
+)
+
+var (
+	ColumnName = domain.ColumnName(FieldName)
+)
+
+var fieldMap = map[string]string{
+	FieldName: "身份名称",
+}
+
+type Entity struct {
+	entity.Base
+	Name       string   `sqlmapping:"column:name" sqlresult:"column:name" check:"required,lte=128"`
+	StudentIDs []string `sqlmapping:"-" sqlresult:"-"`
+	entity.TimeFields
+}
+
+func (e *Entity) DomainCNName() string {
+	return "身份"
+}
+
+func (e *Entity) DomainCamelName() string {
+	return "Identity"
+}
+
+func (e *Entity) ForCreate() error {
+	checkResult := check.Struct(e, fieldMap)
+
+	err := entity.CheckFieldIDResult(checkResult)
+	if err != nil {
+		return err
+	}
+
+	err = domain.CheckField(checkResult, e.DomainCNName(), FieldName)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (e *Entity) ForDelete() error {
+	checkResult := check.Struct(e, fieldMap)
+
+	err := entity.CheckFieldIDResult(checkResult)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (e *Entity) ForUpdate() error {
+	checkResult := check.Struct(e, fieldMap)
+
+	err := entity.CheckFieldIDResult(checkResult)
+	if err != nil {
+		return err
+	}
+
+	err = e.checkUpdateFields(checkResult)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (e *Entity) checkUpdateFields(checkResult check.Result) error {
+	if strutils.AllBlank(e.Name) {
+		return errors.New(e.DomainCNName() + "没有传递需要更新的字段")
+	}
+
+	if strutils.IsStringNotEmpty(e.Name) {
+		err := domain.CheckField(checkResult, e.DomainCNName(), FieldName)
+		if err != nil {
+			return err
+		}
+	}
+
+	return nil
+}

+ 11 - 0
project/server_ds/application/domain/identity/info.go

@@ -0,0 +1,11 @@
+package identity
+
+import (
+	"git.sxidc.com/go-framework/baize/framework/core/application"
+)
+
+type Info struct {
+	application.InfoIDField
+	Name string `json:"name" sqlresult:"column:name"`
+	application.InfoTimeFields
+}

+ 38 - 0
project/server_ds/application/domain/identity/request_params.go

@@ -0,0 +1,38 @@
+package identity
+
+import (
+	"git.sxidc.com/go-framework/baize/framework/core/api/request"
+)
+
+type (
+	CreateIdentityJsonBody struct {
+		Name string `json:"name" binding:"required" assign:"toField:Name"`
+	}
+
+	DeleteIdentityQueryParams struct {
+		request.IDQueryParam
+	}
+
+	UpdateIdentityJsonBody struct {
+		request.IDJsonBody
+		Name string `json:"name" assign:"toField:Name"`
+	}
+
+	GetIdentitiesQueryParams struct {
+		request.BaseQueryParams
+		Name string `form:"name" assign:"toField:Name"`
+	}
+
+	GetIdentityByIDQueryParams struct {
+		request.IDQueryParam
+	}
+
+	UpdateStudentsOfIdentityJsonBody struct {
+		request.IDJsonBody
+		StudentIDs []string `json:"studentIds" assign:"toField:StudentIDs"`
+	}
+
+	QueryStudentsOfIdentityQueryParams struct {
+		request.BaseQueryWithIDParams
+	}
+)

+ 97 - 0
project/server_ds/application/domain/student/entity.go

@@ -0,0 +1,97 @@
+package student
+
+import (
+	"git.sxidc.com/go-framework/baize/framework/core/domain"
+	"git.sxidc.com/go-framework/baize/framework/core/domain/entity"
+	"git.sxidc.com/go-framework/baize/framework/core/tag/check"
+	"git.sxidc.com/go-tools/utils/strutils"
+	"github.com/pkg/errors"
+)
+
+const (
+	FieldName = "Name"
+)
+
+var (
+	ColumnName = domain.ColumnName(FieldName)
+)
+
+var fieldMap = map[string]string{
+	FieldName: "学生姓名",
+}
+
+type Entity struct {
+	entity.Base
+	Name        string   `sqlmapping:"column:name" sqlresult:"column:name" check:"required,lte=128"`
+	FamilyID    string   `sqlmapping:"column:family_id" sqlresult:"column:family_id" check:"required,len=32"`
+	ClassID     string   `sqlmapping:"column:class_id" sqlresult:"column:class_id" check:"required,len=32"`
+	IdentityIDs []string `sqlmapping:"-" sqlresult:"-"`
+	HobbyIDs    []string `sqlmapping:"-" sqlresult:"-"`
+	entity.TimeFields
+}
+
+func (e *Entity) DomainCNName() string {
+	return "学生"
+}
+
+func (e *Entity) DomainCamelName() string {
+	return "Student"
+}
+
+func (e *Entity) ForCreate() error {
+	checkResult := check.Struct(e, fieldMap)
+
+	err := entity.CheckFieldIDResult(checkResult)
+	if err != nil {
+		return err
+	}
+
+	err = domain.CheckField(checkResult, e.DomainCNName(), FieldName)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (e *Entity) ForDelete() error {
+	checkResult := check.Struct(e, fieldMap)
+
+	err := entity.CheckFieldIDResult(checkResult)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (e *Entity) ForUpdate() error {
+	checkResult := check.Struct(e, fieldMap)
+
+	err := entity.CheckFieldIDResult(checkResult)
+	if err != nil {
+		return err
+	}
+
+	err = e.checkUpdateFields(checkResult)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (e *Entity) checkUpdateFields(checkResult check.Result) error {
+	if strutils.AllBlank(e.Name) {
+		return errors.New(e.DomainCNName() + "没有传递需要更新的字段")
+	}
+
+	if strutils.IsStringNotEmpty(e.Name) {
+		err := domain.CheckField(checkResult, e.DomainCNName(), FieldName)
+		if err != nil {
+			return err
+		}
+	}
+
+	return nil
+}

+ 11 - 0
project/server_ds/application/domain/student/info.go

@@ -0,0 +1,11 @@
+package student
+
+import (
+	"git.sxidc.com/go-framework/baize/framework/core/application"
+)
+
+type Info struct {
+	application.InfoIDField
+	Name string `json:"name" sqlresult:"column:name"`
+	application.InfoTimeFields
+}

+ 75 - 0
project/server_ds/application/domain/student/request_params.go

@@ -0,0 +1,75 @@
+package student
+
+import (
+	"git.sxidc.com/go-framework/baize/framework/core/api/request"
+)
+
+type (
+	CreateStudentJsonBody struct {
+		Name string `json:"name" binding:"required" assign:"toField:Name"`
+	}
+
+	DeleteStudentQueryParams struct {
+		request.IDQueryParam
+	}
+
+	UpdateStudentJsonBody struct {
+		request.IDJsonBody
+		Name string `json:"name" assign:"toField:Name"`
+	}
+
+	GetStudentsQueryParams struct {
+		request.BaseQueryParams
+		Name string `form:"name" assign:"toField:Name"`
+	}
+
+	GetStudentByIDQueryParams struct {
+		request.IDQueryParam
+	}
+
+	UpdateFamilyOfStudentJsonBody struct {
+		request.IDJsonBody
+		FamilyID string `json:"familyId" assign:"toField:FamilyID"`
+	}
+
+	QueryFamilyOfStudentQueryParams struct {
+		request.IDQueryParam
+	}
+
+	QueryStudentWithFamilyQueryParams struct {
+		request.BaseQueryParams
+		Name string `form:"name" assign:"toField:Name"`
+	}
+
+	UpdateIdentitiesOfStudentJsonBody struct {
+		request.IDJsonBody
+		IdentityIDs []string `json:"identityIds" assign:"toField:IdentityIDs"`
+	}
+
+	QueryIdentitiesOfStudentQueryParams struct {
+		request.BaseQueryWithIDParams
+	}
+
+	UpdateHobbiesOfStudentJsonBody struct {
+		request.IDJsonBody
+		HobbyIDs []string `json:"hobbyIds" assign:"toField:HobbyIDs"`
+	}
+
+	QueryHobbiesOfStudentQueryParams struct {
+		request.BaseQueryWithIDParams
+	}
+
+	UpdateClassOfStudentJsonBody struct {
+		request.IDJsonBody
+		ClassID string `json:"classId" assign:"toField:ClassID"`
+	}
+
+	QueryClassOfStudentQueryParams struct {
+		request.BaseQueryWithIDParams
+	}
+
+	QueryStudentWithClassQueryParams struct {
+		request.BaseQueryParams
+		Name string `form:"name" assign:"toField:Name"`
+	}
+)

+ 60 - 0
project/server_ds/application/service/class.go

@@ -0,0 +1,60 @@
+package service
+
+import (
+	"baize-demo/project/server/application/domain/class"
+	"git.sxidc.com/go-framework/baize/convenient/domain/operate_log"
+	"git.sxidc.com/go-framework/baize/convenient/entity_crud"
+	"git.sxidc.com/go-framework/baize/framework/binding"
+	"git.sxidc.com/go-framework/baize/framework/core/api"
+	"git.sxidc.com/go-framework/baize/framework/core/application"
+	"git.sxidc.com/go-framework/baize/framework/core/domain"
+	"git.sxidc.com/go-framework/baize/framework/core/domain/entity"
+	"git.sxidc.com/go-framework/baize/framework/core/infrastructure"
+	"git.sxidc.com/go-framework/baize/framework/core/infrastructure/database"
+	"git.sxidc.com/service-supports/fslog"
+)
+
+var classService = &ClassService{}
+
+type ClassService struct{}
+
+func (svc *ClassService) Init(appInstance *application.App) error {
+	svc.v1(appInstance)
+	return nil
+}
+
+func (svc *ClassService) Destroy() error {
+	return nil
+}
+
+func (svc *ClassService) v1(appInstance *application.App) {
+	v1Binder := binding.NewBinder(appInstance.ChooseRouter(api.RouterPrefix, "v1"), appInstance.Infrastructure())
+
+	entity_crud.BindSimple[class.Info](v1Binder, &entity_crud.Simple[class.Info]{
+		Entity:             &class.Entity{},
+		Schema:             dbSchema,
+		CreateJsonBody:     &class.CreateClassJsonBody{},
+		DeleteQueryParams:  &class.DeleteClassQueryParams{},
+		UpdateJsonBody:     &class.UpdateClassJsonBody{},
+		QueryQueryParams:   &class.GetClassesQueryParams{},
+		GetByIDQueryParams: &class.GetClassByIDQueryParams{},
+	}, entity_crud.WithCreateCallbacks(&entity_crud.CreateCallbacks{
+		After: func(c *api.Context, e entity.Entity, prepared map[string]any, i *infrastructure.Infrastructure, tx database.Executor) error {
+			go func() {
+				classEntity, err := domain.ToConcrete[*class.Entity](e)
+				if err != nil {
+					fslog.Error(err)
+					return
+				}
+
+				err = operate_log.WriteLog(i.DBExecutor(), dbSchema, "create", classEntity)
+				if err != nil {
+					fslog.Error(err)
+					return
+				}
+			}()
+
+			return nil
+		},
+	}))
+}

+ 38 - 0
project/server_ds/application/service/class_and_student.go

@@ -0,0 +1,38 @@
+package service
+
+import (
+	"baize-demo/project/server/application/domain/class"
+	"baize-demo/project/server/application/domain/student"
+	"git.sxidc.com/go-framework/baize/convenient/relation/one2many"
+	"git.sxidc.com/go-framework/baize/framework/binding"
+	"git.sxidc.com/go-framework/baize/framework/core/api"
+	"git.sxidc.com/go-framework/baize/framework/core/application"
+)
+
+var classAndStudentService = &ClassAndStudentService{}
+
+type ClassAndStudentService struct{}
+
+func (svc *ClassAndStudentService) Init(appInstance *application.App) error {
+	svc.v1(appInstance)
+	return nil
+}
+
+func (svc *ClassAndStudentService) Destroy() error {
+	return nil
+}
+
+func (svc *ClassAndStudentService) v1(appInstance *application.App) {
+	v1Binder := binding.NewBinder(appInstance.ChooseRouter(api.RouterPrefix, "v1"), appInstance.Infrastructure())
+
+	one2many.BindSimple(v1Binder, &one2many.Simple[class.Info, student.Info]{
+		Left:                          &class.Entity{},
+		Right:                         &student.Entity{},
+		Schema:                        dbSchema,
+		LeftUpdateJsonBody:            &class.UpdateStudentsOfClassJsonBody{},
+		LeftQueryQueryParams:          &class.QueryStudentsOfClassQueryParams{},
+		RightUpdateJsonBody:           &student.UpdateClassOfStudentJsonBody{},
+		RightQueryQueryParams:         &student.QueryClassOfStudentQueryParams{},
+		RightQueryWithLeftQueryParams: &student.QueryStudentWithClassQueryParams{},
+	})
+}

+ 25 - 0
project/server_ds/application/service/configuration.go

@@ -0,0 +1,25 @@
+package service
+
+import (
+	"git.sxidc.com/go-framework/baize/convenient/domain/configuration"
+	"git.sxidc.com/go-framework/baize/framework/core/application"
+)
+
+var configurationService = &ConfigurationService{}
+
+type ConfigurationService struct{}
+
+func (svc *ConfigurationService) Init(appInstance *application.App) error {
+	svc.prefixRoot(appInstance)
+	return nil
+}
+
+func (svc *ConfigurationService) Destroy() error {
+	return nil
+}
+
+func (svc *ConfigurationService) prefixRoot(appInstance *application.App) {
+	configuration.Bind(appInstance, &configuration.Simple{
+		Schema: dbSchema,
+	})
+}

+ 36 - 0
project/server_ds/application/service/family.go

@@ -0,0 +1,36 @@
+package service
+
+import (
+	"baize-demo/project/server/application/domain/family"
+	"git.sxidc.com/go-framework/baize/convenient/entity_crud"
+	"git.sxidc.com/go-framework/baize/framework/binding"
+	"git.sxidc.com/go-framework/baize/framework/core/api"
+	"git.sxidc.com/go-framework/baize/framework/core/application"
+)
+
+var familyService = &FamilyService{}
+
+type FamilyService struct{}
+
+func (svc *FamilyService) Init(appInstance *application.App) error {
+	svc.v1(appInstance)
+	return nil
+}
+
+func (svc *FamilyService) Destroy() error {
+	return nil
+}
+
+func (svc *FamilyService) v1(appInstance *application.App) {
+	v1Binder := binding.NewBinder(appInstance.ChooseRouter(api.RouterPrefix, "v1"), appInstance.Infrastructure())
+
+	entity_crud.BindSimple[family.Info](v1Binder, &entity_crud.Simple[family.Info]{
+		Entity:             &family.Entity{},
+		Schema:             dbSchema,
+		CreateJsonBody:     &family.CreateFamilyJsonBody{},
+		DeleteQueryParams:  &family.DeleteFamilyQueryParams{},
+		UpdateJsonBody:     &family.UpdateFamilyJsonBody{},
+		QueryQueryParams:   &family.GetFamiliesQueryParams{},
+		GetByIDQueryParams: &family.GetFamilyByIDQueryParams{},
+	})
+}

+ 36 - 0
project/server_ds/application/service/identity.go

@@ -0,0 +1,36 @@
+package service
+
+import (
+	"baize-demo/project/server/application/domain/identity"
+	"git.sxidc.com/go-framework/baize/convenient/entity_crud"
+	"git.sxidc.com/go-framework/baize/framework/binding"
+	"git.sxidc.com/go-framework/baize/framework/core/api"
+	"git.sxidc.com/go-framework/baize/framework/core/application"
+)
+
+var identityService = &IdentityService{}
+
+type IdentityService struct{}
+
+func (svc *IdentityService) Init(appInstance *application.App) error {
+	svc.v1(appInstance)
+	return nil
+}
+
+func (svc *IdentityService) Destroy() error {
+	return nil
+}
+
+func (svc *IdentityService) v1(appInstance *application.App) {
+	v1Binder := binding.NewBinder(appInstance.ChooseRouter(api.RouterPrefix, "v1"), appInstance.Infrastructure())
+
+	entity_crud.BindSimple[identity.Info](v1Binder, &entity_crud.Simple[identity.Info]{
+		Entity:             &identity.Entity{},
+		Schema:             dbSchema,
+		CreateJsonBody:     &identity.CreateIdentityJsonBody{},
+		DeleteQueryParams:  &identity.DeleteIdentityQueryParams{},
+		UpdateJsonBody:     &identity.UpdateIdentityJsonBody{},
+		QueryQueryParams:   &identity.GetIdentitiesQueryParams{},
+		GetByIDQueryParams: &identity.GetIdentityByIDQueryParams{},
+	})
+}

+ 25 - 0
project/server_ds/application/service/operate_log.go

@@ -0,0 +1,25 @@
+package service
+
+import (
+	"git.sxidc.com/go-framework/baize/convenient/domain/operate_log"
+	"git.sxidc.com/go-framework/baize/framework/core/application"
+)
+
+var operateLogService = &OperateLogService{}
+
+type OperateLogService struct{}
+
+func (svc *OperateLogService) Init(appInstance *application.App) error {
+	svc.prefixRoot(appInstance)
+	return nil
+}
+
+func (svc *OperateLogService) Destroy() error {
+	return nil
+}
+
+func (svc *OperateLogService) prefixRoot(appInstance *application.App) {
+	operate_log.Bind(appInstance, &operate_log.Simple{
+		Schema: dbSchema,
+	})
+}

+ 27 - 0
project/server_ds/application/service/service.go

@@ -0,0 +1,27 @@
+package service
+
+import "git.sxidc.com/go-framework/baize/framework/core/application"
+
+const (
+	dbSchema = "test"
+)
+
+type Service interface {
+	Init(appInstance *application.App) error
+	Destroy() error
+}
+
+var RegisteredServices = []Service{
+	versionService,
+	configurationService,
+	sqlExecutorService,
+	operateLogService,
+	classService,
+	studentService,
+	identityService,
+	familyService,
+	classAndStudentService,
+	studentAndFamilyService,
+	studentAndIdentityService,
+	studentAndHobbyService,
+}

+ 23 - 0
project/server_ds/application/service/sql_executor.go

@@ -0,0 +1,23 @@
+package service
+
+import (
+	"git.sxidc.com/go-framework/baize/convenient/domain/sql_executor"
+	"git.sxidc.com/go-framework/baize/framework/core/application"
+)
+
+var sqlExecutorService = &SqlExecutorService{}
+
+type SqlExecutorService struct{}
+
+func (svc *SqlExecutorService) Init(appInstance *application.App) error {
+	svc.prefixRoot(appInstance)
+	return nil
+}
+
+func (svc *SqlExecutorService) Destroy() error {
+	return nil
+}
+
+func (svc *SqlExecutorService) prefixRoot(appInstance *application.App) {
+	sql_executor.Bind(appInstance, &sql_executor.Simple{Schema: dbSchema})
+}

+ 36 - 0
project/server_ds/application/service/student.go

@@ -0,0 +1,36 @@
+package service
+
+import (
+	"baize-demo/project/server/application/domain/student"
+	"git.sxidc.com/go-framework/baize/convenient/entity_crud"
+	"git.sxidc.com/go-framework/baize/framework/binding"
+	"git.sxidc.com/go-framework/baize/framework/core/api"
+	"git.sxidc.com/go-framework/baize/framework/core/application"
+)
+
+var studentService = &StudentService{}
+
+type StudentService struct{}
+
+func (svc *StudentService) Init(appInstance *application.App) error {
+	svc.v1(appInstance)
+	return nil
+}
+
+func (svc *StudentService) Destroy() error {
+	return nil
+}
+
+func (svc *StudentService) v1(appInstance *application.App) {
+	v1Binder := binding.NewBinder(appInstance.ChooseRouter(api.RouterPrefix, "v1"), appInstance.Infrastructure())
+
+	entity_crud.BindSimple[student.Info](v1Binder, &entity_crud.Simple[student.Info]{
+		Entity:             &student.Entity{},
+		Schema:             dbSchema,
+		CreateJsonBody:     &student.CreateStudentJsonBody{},
+		DeleteQueryParams:  &student.DeleteStudentQueryParams{},
+		UpdateJsonBody:     &student.UpdateStudentJsonBody{},
+		QueryQueryParams:   &student.GetStudentsQueryParams{},
+		GetByIDQueryParams: &student.GetStudentByIDQueryParams{},
+	})
+}

+ 39 - 0
project/server_ds/application/service/student_and_family.go

@@ -0,0 +1,39 @@
+package service
+
+import (
+	"baize-demo/project/server/application/domain/family"
+	"baize-demo/project/server/application/domain/student"
+	"git.sxidc.com/go-framework/baize/convenient/relation/one2one"
+	"git.sxidc.com/go-framework/baize/framework/binding"
+	"git.sxidc.com/go-framework/baize/framework/core/api"
+	"git.sxidc.com/go-framework/baize/framework/core/application"
+)
+
+var studentAndFamilyService = &StudentAndFamilyService{}
+
+type StudentAndFamilyService struct{}
+
+func (svc *StudentAndFamilyService) Init(appInstance *application.App) error {
+	svc.v1(appInstance)
+	return nil
+}
+
+func (svc *StudentAndFamilyService) Destroy() error {
+	return nil
+}
+
+func (svc *StudentAndFamilyService) v1(appInstance *application.App) {
+	v1Binder := binding.NewBinder(appInstance.ChooseRouter(api.RouterPrefix, "v1"), appInstance.Infrastructure())
+
+	one2one.BindSimple(v1Binder, &one2one.Simple[student.Info, family.Info]{
+		Left:                          &student.Entity{},
+		Right:                         &family.Entity{},
+		Schema:                        dbSchema,
+		LeftUpdateJsonBody:            &student.UpdateFamilyOfStudentJsonBody{},
+		LeftQueryQueryParams:          &student.QueryFamilyOfStudentQueryParams{},
+		LeftQueryWithRightQueryParams: &student.QueryStudentWithFamilyQueryParams{},
+		RightUpdateJsonBody:           &family.UpdateStudentOfFamilyJsonBody{},
+		RightQueryQueryParams:         &family.QueryStudentOfFamilyQueryParams{},
+		RightQueryWithLeftQueryParams: &family.QueryFamilyWithStudentQueryParams{},
+	})
+}

+ 37 - 0
project/server_ds/application/service/student_and_hobby.go

@@ -0,0 +1,37 @@
+package service
+
+import (
+	"baize-demo/project/server/application/domain/hobby"
+	"baize-demo/project/server/application/domain/student"
+	"git.sxidc.com/go-framework/baize/convenient/relation/remote"
+	"git.sxidc.com/go-framework/baize/framework/binding"
+	"git.sxidc.com/go-framework/baize/framework/core/api"
+	"git.sxidc.com/go-framework/baize/framework/core/application"
+)
+
+var studentAndHobbyService = &StudentAndHobbyService{}
+
+type StudentAndHobbyService struct{}
+
+func (svc *StudentAndHobbyService) Init(appInstance *application.App) error {
+	svc.v1(appInstance)
+	return nil
+}
+
+func (svc *StudentAndHobbyService) Destroy() error {
+	return nil
+}
+
+func (svc *StudentAndHobbyService) v1(appInstance *application.App) {
+	v1Binder := binding.NewBinder(appInstance.ChooseRouter(api.RouterPrefix, "v1"), appInstance.Infrastructure())
+
+	remote.BindSimple(v1Binder, &remote.Simple[student.Info, string]{
+		Left:                  &student.Entity{},
+		Right:                 &hobby.Entity{},
+		Schema:                dbSchema,
+		LeftUpdateJsonBody:    &student.UpdateHobbiesOfStudentJsonBody{},
+		LeftQueryQueryParams:  &student.QueryHobbiesOfStudentQueryParams{},
+		RightUpdateJsonBody:   &hobby.UpdateStudentsOfHobbyJsonBody{},
+		RightQueryQueryParams: &hobby.QueryStudentsOfHobbyQueryParams{},
+	})
+}

+ 37 - 0
project/server_ds/application/service/student_and_identity.go

@@ -0,0 +1,37 @@
+package service
+
+import (
+	"baize-demo/project/server/application/domain/identity"
+	"baize-demo/project/server/application/domain/student"
+	"git.sxidc.com/go-framework/baize/convenient/relation/many2many"
+	"git.sxidc.com/go-framework/baize/framework/binding"
+	"git.sxidc.com/go-framework/baize/framework/core/api"
+	"git.sxidc.com/go-framework/baize/framework/core/application"
+)
+
+var studentAndIdentityService = &StudentAndIdentityService{}
+
+type StudentAndIdentityService struct{}
+
+func (svc *StudentAndIdentityService) Init(appInstance *application.App) error {
+	svc.v1(appInstance)
+	return nil
+}
+
+func (svc *StudentAndIdentityService) Destroy() error {
+	return nil
+}
+
+func (svc *StudentAndIdentityService) v1(appInstance *application.App) {
+	v1Binder := binding.NewBinder(appInstance.ChooseRouter(api.RouterPrefix, "v1"), appInstance.Infrastructure())
+
+	many2many.BindSimple(v1Binder, &many2many.Simple[student.Info, identity.Info]{
+		Left:                  &student.Entity{},
+		Right:                 &identity.Entity{},
+		Schema:                dbSchema,
+		LeftUpdateJsonBody:    &student.UpdateIdentitiesOfStudentJsonBody{},
+		LeftQueryQueryParams:  &student.QueryIdentitiesOfStudentQueryParams{},
+		RightUpdateJsonBody:   &identity.UpdateStudentsOfIdentityJsonBody{},
+		RightQueryQueryParams: &identity.QueryStudentsOfIdentityQueryParams{},
+	})
+}

+ 58 - 0
project/server_ds/application/service/version.go

@@ -0,0 +1,58 @@
+package service
+
+import (
+	"git.sxidc.com/go-framework/baize/framework/binding"
+	"git.sxidc.com/go-framework/baize/framework/core/api"
+	"git.sxidc.com/go-framework/baize/framework/core/api/request"
+	"git.sxidc.com/go-framework/baize/framework/core/api/response"
+	"git.sxidc.com/go-framework/baize/framework/core/application"
+	"git.sxidc.com/go-framework/baize/framework/core/domain"
+	"git.sxidc.com/go-framework/baize/framework/core/infrastructure"
+	"git.sxidc.com/go-tools/utils/strutils"
+	"github.com/pkg/errors"
+)
+
+var versionService = &VersionService{}
+
+type VersionService struct{}
+
+func (svc *VersionService) Init(appInstance *application.App) error {
+	svc.prefixRoot(appInstance)
+	return nil
+}
+
+func (svc *VersionService) Destroy() error {
+	return nil
+}
+
+func (svc *VersionService) prefixRoot(appInstance *application.App) {
+	prefixRootBinder := binding.NewBinder(appInstance.ChooseRouter(api.RouterPrefix, ""), appInstance.Infrastructure())
+
+	binding.GetBind(prefixRootBinder, &binding.SimpleBindItem[map[string]any]{
+		Path:             "/version",
+		SendResponseFunc: response.SendMapResponse,
+		ServiceFunc: func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (map[string]any, error) {
+			localCacheVersion, err := i.LocalCache().Get("version")
+			if err != nil {
+				return nil, err
+			}
+
+			redisCacheVersion, err := i.RedisCache().Get("version")
+			if err != nil {
+				return nil, err
+			}
+
+			if localCacheVersion != redisCacheVersion {
+				return nil, errors.New("版本不一致")
+			}
+
+			if strutils.IsStringEmpty(localCacheVersion) {
+				localCacheVersion = "cache-empty-v1.0.0"
+			}
+
+			return map[string]any{
+				"version": localCacheVersion,
+			}, nil
+		},
+	})
+}

+ 71 - 0
project/server_ds/config/config.go

@@ -0,0 +1,71 @@
+package config
+
+import (
+	"fmt"
+	"git.sxidc.com/go-framework/baize/framework/core/application"
+	"git.sxidc.com/go-tools/utils/strutils"
+	"git.sxidc.com/service-supports/fslog"
+	"git.sxidc.com/service-supports/scm-sdk"
+	"os"
+)
+
+type Config struct {
+	ApplicationConfig application.Config
+}
+
+var conf Config
+
+func init() {
+	useSCMEnv := os.Getenv("USE_SCM")
+	if useSCMEnv == "true" {
+		initConfigFromSCM()
+	} else {
+		initConfigFromConfigFile()
+	}
+}
+
+func GetConfig() Config {
+	return conf
+}
+
+func initConfigFromSCM() {
+	scmBaseUrl := loadEnvOrPanic("SCM_BASE_URL")
+	scmNamespace := loadEnvOrPanic("SCM_NAMESPACE")
+	scmName := loadEnvOrPanic("SCM_NAME")
+
+	info, err := scm_sdk.GetCurrentConfiguration(scmBaseUrl, scmNamespace, scmName)
+	if err != nil {
+		fslog.Error(err)
+		panic(err)
+	}
+
+	applicationConfig, err := application.LoadFromYaml(info.Content)
+	if err != nil {
+		panic(err)
+	}
+
+	conf.ApplicationConfig = applicationConfig
+
+	fslog.Info("Load config from scm finish")
+}
+
+func initConfigFromConfigFile() {
+	configFilePath := os.Getenv("CONFIG_FILE_PATH")
+	applicationConfig, err := application.LoadFromYamlFile(configFilePath)
+	if err != nil {
+		panic(err)
+	}
+
+	conf.ApplicationConfig = applicationConfig
+
+	fmt.Println("Load config file finish")
+}
+
+func loadEnvOrPanic(envName string) string {
+	envValue := os.Getenv(envName)
+	if strutils.IsStringEmpty(envValue) {
+		panic("请配置" + envName)
+	}
+
+	return envValue
+}

+ 22 - 0
project/server_ds/deployment/config/config.yaml

@@ -0,0 +1,22 @@
+api:
+  url_prefix: /example/api
+  port: 31000
+  log_skip_paths:
+    - /example/api/version
+infrastructure:
+  database:
+    data_service:
+      # baize-demo
+      token: 8qe+uPgpQ2JWxu3lSyOx5EWC24/c+zJOxvFhvRLRTzU=
+      address: localhost
+      http_port: 10000
+      grpc_port: 10001
+      namespace: baize
+      data_source: baize
+      http_timeout_sec: 10
+  cache:
+    namespace: baize-demo
+    redis:
+      address: "localhost:30379"
+      password: "mtyzxhc"
+      db: 2

+ 20 - 0
project/server_ds/deployment/data_service/base.yaml

@@ -0,0 +1,20 @@
+kind: Namespace
+spec:
+  name: baize
+
+---
+
+kind: DataSource
+spec:
+  type: database
+  namespace: baize
+  name: baize
+  spec:
+    type: postgres
+    user_name: test
+    password: "123456"
+    address: "10.0.0.84"
+    port: "30432"
+    database: test
+    max_connections: 20
+    max_idle_connections: 5

+ 9 - 0
project/server_ds/deployment/data_service/create_data_containers.ps1

@@ -0,0 +1,9 @@
+Set-Location  $(Split-Path $MyInvocation.MyCommand.Path -Parent)
+
+datactl.exe apply -f base.yaml
+
+foreach ($file in $(Get-ChildItem -Path ".\data_containers")) {
+    if ($file.GetType() -eq [System.IO.FileInfo]) {
+        datactl.exe apply -f $file.FullName
+    }
+}

+ 10 - 0
project/server_ds/deployment/data_service/create_data_containers.sh

@@ -0,0 +1,10 @@
+#!/bin/bash
+cd "$(dirname "$0")" || exit 1
+
+datactl apply -f base.yaml
+
+for file in ./data_containers/*; do
+	if [ -f "$file" ]; then
+		datactl apply -f "$file"
+	fi
+done

+ 30 - 0
project/server_ds/deployment/data_service/data_containers/class.yaml

@@ -0,0 +1,30 @@
+kind: DataContainer
+spec:
+  namespace: baize
+  data_source: baize
+  name: test.classes
+  spec:
+    table_name: test.classes
+    columns:
+      - name: id
+        type: varchar(32)
+        comment: id
+        primary_key: true
+      - name: name
+        type: varchar(128)
+        comment: 班名
+        not_null: true
+        index: true
+      - name: student_num
+        type: integer
+        comment: 学生数量
+        not_null: true
+        index: true
+      - name: created_time
+        type: "timestamp with time zone"
+        comment: 创建时间
+        not_null: true
+      - name: last_updated_time
+        type: "timestamp with time zone"
+        comment: 最近更新时间
+        not_null: true

+ 23 - 0
project/server_ds/deployment/data_service/data_containers/configuration.yaml

@@ -0,0 +1,23 @@
+kind: DataContainer
+spec:
+  namespace: baize
+  data_source: baize
+  name: test.configurations
+  spec:
+    table_name: test.configurations
+    columns:
+      - name: scope
+        type: varchar(256)
+        comment: 范围
+        not_null: true
+        primary_key: true
+      - name: group
+        type: varchar(256)
+        comment: 组
+        not_null: true
+        primary_key: true
+      - name: value
+        type: varchar(256)
+        comment: 值
+        not_null: true
+        index: true

+ 35 - 0
project/server_ds/deployment/data_service/data_containers/family.yaml

@@ -0,0 +1,35 @@
+kind: DataContainer
+spec:
+  namespace: baize
+  data_source: baize
+  name: test.families
+  spec:
+    table_name: test.families
+    columns:
+      - name: id
+        type: varchar(32)
+        comment: id
+        primary_key: true
+      - name: father
+        type: varchar(128)
+        comment: 父亲姓名
+        not_null: true
+        index: true
+      - name: mother
+        type: varchar(128)
+        comment: 母亲姓名
+        not_null: true
+        index: true
+      - name: student_id
+        type: varchar(32)
+        comment: 家庭ID
+        not_null: true
+        index: true
+      - name: created_time
+        type: "timestamp with time zone"
+        comment: 创建时间
+        not_null: true
+      - name: last_updated_time
+        type: "timestamp with time zone"
+        comment: 最近更新时间
+        not_null: true

+ 25 - 0
project/server_ds/deployment/data_service/data_containers/identity.yaml

@@ -0,0 +1,25 @@
+kind: DataContainer
+spec:
+  namespace: baize
+  data_source: baize
+  name: test.identities
+  spec:
+    table_name: test.identities
+    columns:
+      - name: id
+        type: varchar(32)
+        comment: id
+        primary_key: true
+      - name: name
+        type: varchar(128)
+        comment: 名称
+        not_null: true
+        index: true
+      - name: created_time
+        type: "timestamp with time zone"
+        comment: 创建时间
+        not_null: true
+      - name: last_updated_time
+        type: "timestamp with time zone"
+        comment: 最近更新时间
+        not_null: true

+ 41 - 0
project/server_ds/deployment/data_service/data_containers/operate_log.yaml

@@ -0,0 +1,41 @@
+kind: DataContainer
+spec:
+  namespace: baize
+  data_source: baize
+  name: test.operate_logs
+  spec:
+    table_name: test.operate_logs
+    columns:
+      - name: resource
+        type: varchar(256)
+        comment: 资源名称
+        index: true
+        not_null: true
+      - name: resource_id
+        type: varchar(256)
+        comment: 资源名称
+        index: true
+        not_null: true
+      - name: operate
+        type: varchar(256)
+        comment: 操作
+        index: true
+        not_null: true
+      - name: operator_id
+        type: varchar(256)
+        comment: 操作者ID
+        index: true
+        not_null: true
+      - name: operator_name
+        type: varchar(256)
+        comment: 操作者
+        index: true
+        not_null: true
+      - name: operate_time
+        type: "timestamp with time zone"
+        comment: 操作时间
+        not_null: true
+      - name: content
+        type: text
+        comment: 日志内容
+        not_null: true

+ 20 - 0
project/server_ds/deployment/data_service/data_containers/sql_executor.yaml

@@ -0,0 +1,20 @@
+kind: DataContainer
+spec:
+  namespace: baize
+  data_source: baize
+  name: test.sql_execute_logs
+  spec:
+    table_name: test.sql_execute_logs
+    columns:
+      - name: sql
+        type: text
+        comment: sql语句
+      - name: executor_id
+        type: varchar(32)
+        comment: 执行人ID
+      - name: executor_name
+        type: varchar(256)
+        comment: 执行人姓名
+      - name: executed_time
+        type: "timestamp with time zone"
+        comment: 执行时间

+ 35 - 0
project/server_ds/deployment/data_service/data_containers/student.yaml

@@ -0,0 +1,35 @@
+kind: DataContainer
+spec:
+  namespace: baize
+  data_source: baize
+  name: test.students
+  spec:
+    table_name: test.students
+    columns:
+      - name: id
+        type: varchar(32)
+        comment: id
+        primary_key: true
+      - name: name
+        type: varchar(128)
+        comment: 姓名
+        not_null: true
+        index: true
+      - name: class_id
+        type: varchar(32)
+        comment: 班级ID
+        not_null: true
+        index: true
+      - name: family_id
+        type: varchar(32)
+        comment: 家庭ID
+        not_null: true
+        index: true
+      - name: created_time
+        type: "timestamp with time zone"
+        comment: 创建时间
+        not_null: true
+      - name: last_updated_time
+        type: "timestamp with time zone"
+        comment: 最近更新时间
+        not_null: true

+ 16 - 0
project/server_ds/deployment/data_service/data_containers/student_and_hobby.yaml

@@ -0,0 +1,16 @@
+kind: DataContainer
+spec:
+  namespace: baize
+  data_source: baize
+  name: test.student_and_hobby
+  spec:
+    table_name: test.student_and_hobby
+    columns:
+      - name: student_id
+        type: varchar(32)
+        comment: id
+        primary_key: true
+      - name: hobby_id
+        type: varchar(32)
+        comment: id
+        primary_key: true

+ 16 - 0
project/server_ds/deployment/data_service/data_containers/student_and_identity.yaml

@@ -0,0 +1,16 @@
+kind: DataContainer
+spec:
+  namespace: baize
+  data_source: baize
+  name: test.student_and_identity
+  spec:
+    table_name: test.student_and_identity
+    columns:
+      - name: student_id
+        type: varchar(32)
+        comment: id
+        primary_key: true
+      - name: identity_id
+        type: varchar(32)
+        comment: id
+        primary_key: true

+ 9 - 0
project/server_ds/deployment/data_service/delete_data_containers.ps1

@@ -0,0 +1,9 @@
+Set-Location  $(Split-Path $MyInvocation.MyCommand.Path -Parent)
+
+datactl.exe apply -f base.yaml
+
+foreach ($file in $(Get-ChildItem -Path ".\data_containers")) {
+    if ($file.GetType() -eq [System.IO.FileInfo]) {
+        datactl.exe apply -f $file.FullName
+    }
+}

+ 10 - 0
project/server_ds/deployment/data_service/delete_data_containers.sh

@@ -0,0 +1,10 @@
+#!/bin/bash
+cd "$(dirname "$0")" || exit 1
+
+datactl delete -f base.yaml
+
+for file in ./data_containers/*; do
+	if [ -f "$file" ]; then
+		datactl delete -f "$file"
+	fi
+done

+ 105 - 0
project/server_ds/main.go

@@ -0,0 +1,105 @@
+package main
+
+import (
+	"baize-demo/project/server/application"
+	DEATH "github.com/vrecan/death"
+	"syscall"
+)
+
+// Version
+// curl -X GET "http://localhost:31000/example/api/version"
+
+// Configuration
+// curl -X POST -H "Content-Type: application/json" -d '{"scope": "global", "group":"test", "value":"test-value"}' "http://localhost:31000/example/api/configuration/create"
+// curl -X GET "http://localhost:31000/example/api/configuration/values?scope=global&group=test&pageNo=1&pageSize=1"
+// curl -X POST -H "Content-Type: application/json" -d '{"scope": "global", "group":"test"}' "http://localhost:31000/example/api/configuration/delete"
+
+// Class
+// curl -X POST -H "Content-Type: application/json" -d '{"name":"test", "studentNum": 10}' "http://localhost:31000/example/api/v1/class/create"
+// curl -X PUT -H "Content-Type: application/json" -d '{"id":"da0058447ca4400195c3f46394151354", "name":"test-new"}' "http://localhost:31000/example/api/v1/class/update"
+// curl -X GET "http://localhost:31000/example/api/v1/class/query?name=test-new&pageNo=1&pageSize=1"
+// curl -X GET "http://localhost:31000/example/api/v1/class/get?id=da0058447ca4400195c3f46394151354"
+// curl -X DELETE "http://localhost:31000/example/api/v1/class/delete?id=da0058447ca4400195c3f46394151354"
+// curl -X GET "http://localhost:31000/example/api/operateLog/query?resource=Class"
+
+// Student
+// curl -X POST -H "Content-Type: application/json" -d '{"name":"test"}' "http://localhost:31000/example/api/v1/student/create"
+// curl -X PUT -H "Content-Type: application/json" -d '{"id":"d9332801b46c4f0c99fdd381954313d6", "name":"test-new"}' "http://localhost:31000/example/api/v1/student/update"
+// curl -X GET "http://localhost:31000/example/api/v1/student/query?name=test-new&pageNo=1&pageSize=1"
+// curl -X GET "http://localhost:31000/example/api/v1/student/get?id=d9332801b46c4f0c99fdd381954313d6"
+// curl -X DELETE "http://localhost:31000/example/api/v1/student/delete?id=d9332801b46c4f0c99fdd381954313d6"
+
+// Family
+// curl -X POST -H "Content-Type: application/json" -d '{"father":"father", "mother": "mother"}' "http://localhost:31000/example/api/v1/family/create"
+// curl -X PUT -H "Content-Type: application/json" -d '{"id":"85ffbfbef27b42879382b47718c7a99e", "father":"new-father", "mother": "new-mother"}' "http://localhost:31000/example/api/v1/family/update"
+// curl -X GET "http://localhost:31000/example/api/v1/family/query?father=new-father&pageNo=0&pageSize=0"
+// curl -X GET "http://localhost:31000/example/api/v1/family/get?id=85ffbfbef27b42879382b47718c7a99e"
+// curl -X DELETE "http://localhost:31000/example/api/v1/family/delete?id=85ffbfbef27b42879382b47718c7a99e"
+
+// Identity
+// curl -X POST -H "Content-Type: application/json" -d '{"name":"test"}' "http://localhost:31000/example/api/v1/identity/create"
+// curl -X PUT -H "Content-Type: application/json" -d '{"id":"6e12ee71397746b8920fa94e5f229366", "name":"test-new"}' "http://localhost:31000/example/api/v1/identity/update"
+// curl -X GET "http://localhost:31000/example/api/v1/identity/query?name=test-new&pageNo=1&pageSize=1"
+// curl -X GET "http://localhost:31000/example/api/v1/identity/get?id=6e12ee71397746b8920fa94e5f229366"
+// curl -X DELETE "http://localhost:31000/example/api/v1/identity/delete?id=6e12ee71397746b8920fa94e5f229366"
+
+// Class-Student
+// curl -X POST -H "Content-Type: application/json" -d '{"id":"82f03353db3545058c135f15c9a86edb", "studentIds": ["eec8c4def70d44e1ba234c089db40d17"]}' "http://localhost:31000/example/api/v1/class/student/update"
+// curl -X GET "http://localhost:31000/example/api/v1/class/student/query?id=82f03353db3545058c135f15c9a86edb"
+
+// Student-Class
+// curl -X POST -H "Content-Type: application/json" -d '{"id":"eec8c4def70d44e1ba234c089db40d17", "classId": "82f03353db3545058c135f15c9a86edb"}' "http://localhost:31000/example/api/v1/student/class/update"
+// curl -X GET "http://localhost:31000/example/api/v1/student/class/query?id=eec8c4def70d44e1ba234c089db40d17"
+// curl -X GET "http://localhost:31000/example/api/v1/student/class/queryWith?name=test"
+
+// Student-Family
+// curl -X POST -H "Content-Type: application/json" -d '{"id":"eec8c4def70d44e1ba234c089db40d17", "familyId": "f21a273d8b144616925e3931ec2e47b5"}' "http://localhost:31000/example/api/v1/student/family/update"
+// curl -X GET "http://localhost:31000/example/api/v1/student/family/query?id=eec8c4def70d44e1ba234c089db40d17"
+// curl -X GET "http://localhost:31000/example/api/v1/student/family/queryWith?name=test"
+
+// Family-Student
+// curl -X POST -H "Content-Type: application/json" -d '{"id":"f21a273d8b144616925e3931ec2e47b5", "studentId": "eec8c4def70d44e1ba234c089db40d17"}' "http://localhost:31000/example/api/v1/family/student/update"
+// curl -X GET "http://localhost:31000/example/api/v1/family/student/query?id=f21a273d8b144616925e3931ec2e47b5"
+// curl -X GET "http://localhost:31000/example/api/v1/family/student/queryWith?father=father"
+
+// Student-Identity
+// curl -X POST -H "Content-Type: application/json" -d '{"id":"eec8c4def70d44e1ba234c089db40d17", "identityIds": ["a36d5c24f5214e7fa4c3e92f2f73ec1f"]}' "http://localhost:31000/example/api/v1/student/identity/update"
+// curl -X GET "http://localhost:31000/example/api/v1/student/identity/query?id=eec8c4def70d44e1ba234c089db40d17"
+
+// Identity-Student
+// curl -X POST -H "Content-Type: application/json" -d '{"id":"a36d5c24f5214e7fa4c3e92f2f73ec1f", "studentIds": ["eec8c4def70d44e1ba234c089db40d17"]}' "http://localhost:31000/example/api/v1/identity/student/update"
+// curl -X GET "http://localhost:31000/example/api/v1/identity/student/query?id=a36d5c24f5214e7fa4c3e92f2f73ec1f"
+
+// Student-Hobby
+// curl -X POST -H "Content-Type: application/json" -d '{"id":"eec8c4def70d44e1ba234c089db40d17", "hobbyIds": ["42b305bb292c4082a3e91a2967f11111"]}' "http://localhost:31000/example/api/v1/student/hobby/update"
+// curl -X GET "http://localhost:31000/example/api/v1/student/hobby/query?id=eec8c4def70d44e1ba234c089db40d17"
+
+// Hobby-Student
+// curl -X POST -H "Content-Type: application/json" -d '{"id":"42b305bb292c4082a3e91a2967f11111", "studentIds": ["eec8c4def70d44e1ba234c089db40d17"]}' "http://localhost:31000/example/api/v1/hobby/student/update"
+// curl -X GET "http://localhost:31000/example/api/v1/hobby/student/query?id=42b305bb292c4082a3e91a2967f11111"
+
+// Sql Executor
+// curl -X POST -H 'Content-Type: application/json' -d '{"sql": "SELECT * FROM test.sql_execute_logs", "executorId": "guest-00254b4a7102429db35e6edc8e", "executorName": "test"}' "http://localhost:31000/example/api/sql/execute"
+// curl -X GET "http://localhost:31000/example/api/sql/execute/log?sql=SELECT&executorId=guest-00254b4a7102429db35e6edc8e&executorName=te&startExecuteTime=2024-05-30%2012:03:45"
+
+func main() {
+	application.NewApp()
+	defer application.DestroyApp()
+
+	go func() {
+		err := application.Start()
+		if err != nil {
+			panic(err)
+		}
+	}()
+
+	defer func() {
+		err := application.Finish()
+		if err != nil {
+			panic(err)
+		}
+	}()
+
+	death := DEATH.NewDeath(syscall.SIGINT, syscall.SIGTERM)
+	_ = death.WaitForDeath()
+}

+ 83 - 0
project/server_ds/test/configuration_test.go

@@ -0,0 +1,83 @@
+package test
+
+import (
+	"git.sxidc.com/go-framework/baize/convenient/domain/configuration"
+	"git.sxidc.com/go-framework/baize/framework/core/api/response"
+	"git.sxidc.com/go-tools/utils/strutils"
+	"net/http"
+	"testing"
+)
+
+func TestConfiguration(t *testing.T) {
+	Init()
+	defer Destroy()
+
+	scope := strutils.SimpleUUID()
+	group := strutils.SimpleUUID()
+	value := strutils.SimpleUUID()
+
+	values := make([]string, 0)
+
+	NewToolKit(t).CreateConfiguration(scope, group, value).
+		GetConfigurationValues(scope, group, &values).
+		AssertEqual(1, len(values), "值的长度不正确").
+		AssertEqual(value, values[0], "值不正确").
+		DeleteConfiguration(scope, group).
+		GetConfigurationValues(scope, group, &values).
+		AssertEqual(0, len(values), "值的长度不正确")
+}
+
+func (toolKit *ToolKit) CreateConfiguration(scope string, group string, value string) *ToolKit {
+	msgResponse := new(response.MsgResponse)
+
+	toolKit.SetHeader("Content-Type", "application/json").
+		SetJsonBody(&configuration.AddConfigurationJsonBody{
+			Scope: scope,
+			Group: group,
+			Value: value,
+		}).
+		SetJsonResponse(msgResponse).
+		Request("/example/api/configuration/create", http.MethodPost).
+		AssertStatusCode(http.StatusOK).
+		AssertEqual(true, msgResponse.Success, msgResponse.Msg)
+
+	return toolKit
+}
+
+func (toolKit *ToolKit) DeleteConfiguration(scope string, group string) *ToolKit {
+	msgResponse := new(response.MsgResponse)
+
+	toolKit.SetHeader("Content-Type", "application/json").
+		SetJsonResponse(msgResponse).
+		SetJsonBody(&configuration.RemoveConfigurationJsonBody{
+			Scope: scope,
+			Group: group,
+		}).
+		Request("/example/api/configuration/delete", http.MethodPost).
+		AssertStatusCode(http.StatusOK).
+		AssertEqual(true, msgResponse.Success, msgResponse.Msg)
+
+	return toolKit
+}
+
+func (toolKit *ToolKit) GetConfigurationValues(scope string, group string, retValues *[]string) *ToolKit {
+	getConfigurationValuesResponse := new(struct {
+		response.MsgResponse
+		Values []string `json:"values"`
+	})
+
+	toolKit.SetHeader("Content-Type", "application/json").
+		SetJsonResponse(getConfigurationValuesResponse).
+		SetQueryParams("scope", scope).
+		SetQueryParams("group", group).
+		Request("/example/api/configuration/values", http.MethodGet).
+		AssertStatusCode(http.StatusOK).
+		AssertEqual(true, getConfigurationValuesResponse.Success, getConfigurationValuesResponse.Msg)
+
+	if retValues != nil {
+		*retValues = make([]string, 0)
+		*retValues = getConfigurationValuesResponse.Values
+	}
+
+	return toolKit
+}

+ 186 - 0
project/server_ds/test/tool_kit.go

@@ -0,0 +1,186 @@
+package test
+
+import (
+	"baize-demo/project/server/application"
+	"bytes"
+	"encoding/json"
+	"git.sxidc.com/go-tools/utils/strutils"
+	"github.com/stretchr/testify/assert"
+	"io"
+	"net/http"
+	"net/http/httptest"
+	"reflect"
+	"testing"
+	"time"
+)
+
+type ToolKit struct {
+	t *testing.T
+
+	body         io.Reader
+	header       map[string]string
+	queryParams  map[string]string
+	jsonResponse interface{}
+	token        string
+
+	responseRecorder *httptest.ResponseRecorder
+}
+
+func Init() {
+	application.NewApp()
+
+	go func() {
+		err := application.Start()
+		if err != nil {
+			panic(err)
+		}
+	}()
+
+	time.Sleep(100 * time.Millisecond)
+}
+
+func Destroy() {
+	err := application.Finish()
+	if err != nil {
+		panic(err)
+	}
+
+	application.DestroyApp()
+}
+
+func NewToolKit(t *testing.T) *ToolKit {
+	return &ToolKit{
+		t:           t,
+		header:      make(map[string]string),
+		queryParams: make(map[string]string),
+	}
+}
+
+func (toolKit *ToolKit) SetHeader(key string, value string) *ToolKit {
+	toolKit.header[key] = value
+	return toolKit
+}
+
+func (toolKit *ToolKit) SetBody(body *bytes.Buffer) *ToolKit {
+	toolKit.body = body
+	return toolKit
+}
+
+func (toolKit *ToolKit) SetQueryParams(key string, value string) *ToolKit {
+	toolKit.queryParams[key] = value
+	return toolKit
+}
+
+func (toolKit *ToolKit) SetJsonBody(body interface{}) *ToolKit {
+	jsonBody, err := json.Marshal(body)
+	if err != nil {
+		toolKit.t.Fatal("转换JSON失败")
+	}
+
+	toolKit.body = bytes.NewBuffer(jsonBody)
+
+	return toolKit
+}
+
+func (toolKit *ToolKit) SetJsonResponse(response interface{}) *ToolKit {
+	if response == nil {
+		toolKit.jsonResponse = nil
+		return toolKit
+	}
+
+	responseValue := reflect.ValueOf(response)
+	if responseValue.Kind() != reflect.Ptr {
+		toolKit.t.Fatal("JsonResponse应该传递指针类型")
+	}
+
+	toolKit.jsonResponse = response
+
+	return toolKit
+}
+
+func (toolKit *ToolKit) SetToken(token string) *ToolKit {
+	toolKit.token = token
+	return toolKit
+}
+
+func (toolKit *ToolKit) Request(url string, method string) *ToolKit {
+	if len(toolKit.queryParams) != 0 {
+		url = url + "?"
+		for key, value := range toolKit.queryParams {
+			url = url + key + "=" + value + "&"
+		}
+
+		url = url[:len(url)-1]
+
+		toolKit.queryParams = make(map[string]string)
+	}
+
+	request, err := http.NewRequest(method, url, toolKit.body)
+	if err != nil {
+		toolKit.t.Fatal("创建请求失败", err)
+	}
+
+	if len(toolKit.header) != 0 {
+		for key, value := range toolKit.header {
+			request.Header.Add(key, value)
+		}
+
+		toolKit.header = make(map[string]string)
+	}
+
+	if !strutils.IsStringEmpty(toolKit.token) {
+		request.Header.Add("Authorization", toolKit.token)
+	}
+
+	toolKit.responseRecorder = httptest.NewRecorder()
+	application.ServerHttpForTest(toolKit.responseRecorder, request)
+
+	if toolKit.responseRecorder.Code == http.StatusOK && toolKit.jsonResponse != nil {
+		responseBody, err := io.ReadAll(toolKit.responseRecorder.Body)
+		if err != nil {
+			toolKit.t.Fatal("读取响应Body失败")
+		}
+
+		err = json.Unmarshal(responseBody, toolKit.jsonResponse)
+		if err != nil {
+			toolKit.t.Fatal("转换Response失败")
+		}
+	}
+
+	return toolKit
+}
+
+func (toolKit *ToolKit) AssertStatusCode(code int) *ToolKit {
+	assert.Equal(toolKit.t, code, toolKit.responseRecorder.Code)
+	return toolKit
+}
+
+func (toolKit *ToolKit) AssertBodyEqual(body string) *ToolKit {
+	assert.Equal(toolKit.t, body, toolKit.responseRecorder.Body.String())
+	return toolKit
+}
+
+func (toolKit *ToolKit) AssertEqual(expected interface{}, actual interface{}, msgAndArgs ...interface{}) *ToolKit {
+	assert.Equal(toolKit.t, expected, actual, msgAndArgs)
+	return toolKit
+}
+
+func (toolKit *ToolKit) AssertNotEqual(expected interface{}, actual interface{}, msgAndArgs ...interface{}) *ToolKit {
+	assert.NotEqual(toolKit.t, expected, actual, msgAndArgs)
+	return toolKit
+}
+
+func (toolKit *ToolKit) AssertNotEmpty(object interface{}, msgAndArgs ...interface{}) *ToolKit {
+	assert.NotEmpty(toolKit.t, object, msgAndArgs)
+	return toolKit
+}
+
+func (toolKit *ToolKit) AssertGreaterOrEqual(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) *ToolKit {
+	assert.GreaterOrEqual(toolKit.t, e1, e2, msgAndArgs)
+	return toolKit
+}
+
+func (toolKit *ToolKit) AssertZero(e1 interface{}, msgAndArgs ...interface{}) *ToolKit {
+	assert.Zero(toolKit.t, e1, msgAndArgs)
+	return toolKit
+}

+ 20 - 0
project/server_ds/test/version_test.go

@@ -0,0 +1,20 @@
+package test
+
+import (
+	"net/http"
+	"testing"
+)
+
+func TestVersion(t *testing.T) {
+	Init()
+	defer Destroy()
+
+	versionResponse := &struct {
+		Version string `json:"version"`
+	}{}
+
+	NewToolKit(t).SetJsonResponse(versionResponse).
+		Request("/example/api/version", http.MethodGet).
+		AssertStatusCode(http.StatusOK).
+		AssertEqual(versionResponse.Version, "v1.0.0")
+}