From 2dedc3c346178643267d3cfd574d151d227ff7b0 Mon Sep 17 00:00:00 2001 From: weibogao <45678072+cryptowizard0@users.noreply.github.com> Date: Thu, 30 Nov 2023 16:10:11 +0800 Subject: [PATCH 1/4] Modifyed Readme, adding subfolders for golang and java --- README.md | 229 +----------------- golang/README_en.md | 218 +++++++++++++++++ golang/README_zh.md | 222 +++++++++++++++++ {project => golang/project}/.drone.yml | 0 {project => golang/project}/Dockerfile | 0 {project => golang/project}/cmd/demo/main.go | 0 {project => golang/project}/demo/api.go | 0 {project => golang/project}/demo/demo.go | 0 {project => golang/project}/demo/error.go | 0 {project => golang/project}/demo/jobs.go | 0 {project => golang/project}/demo/schema/db.go | 0 {project => golang/project}/demo/wdb.go | 0 {project => golang/project}/example/demo.go | 0 {project => golang/project}/go.mod | 0 {project => golang/project}/test.sh | 0 java/README_en.md | 1 + java/README_zh.md | 0 17 files changed, 449 insertions(+), 221 deletions(-) create mode 100644 golang/README_en.md create mode 100644 golang/README_zh.md rename {project => golang/project}/.drone.yml (100%) rename {project => golang/project}/Dockerfile (100%) rename {project => golang/project}/cmd/demo/main.go (100%) rename {project => golang/project}/demo/api.go (100%) rename {project => golang/project}/demo/demo.go (100%) rename {project => golang/project}/demo/error.go (100%) rename {project => golang/project}/demo/jobs.go (100%) rename {project => golang/project}/demo/schema/db.go (100%) rename {project => golang/project}/demo/wdb.go (100%) rename {project => golang/project}/example/demo.go (100%) rename {project => golang/project}/go.mod (100%) rename {project => golang/project}/test.sh (100%) create mode 100644 java/README_en.md create mode 100644 java/README_zh.md diff --git a/README.md b/README.md index 3aad86a..a76512a 100644 --- a/README.md +++ b/README.md @@ -1,221 +1,8 @@ -## 项目结构 -``` -- cmd - - demo - - main.go // demo 项目启动入口 -- demo - - schema // type 声明 - - db.go // db 相关的 type 声明 - - api.go // api response type 声明 - - error.go // error 信息 - - other.go // 其他模块对应的 type 声明 - - api.go // restful 接口实现 - - demo.go // 入口函数 - - jobs.go // 定时任务实现 - - wdb.go // 关系型数据库读写方法实现 - - cache.go // 缓存 - - other.go // 独立的处理方法 -- example // 用例 - - xxx.go -- .drone.yml // ci/cd 配置文件 -- Dockerfile -- README.md // demo 项目 readme -- mod.go -- Makefile // make all, make test -- test.sh -``` -[project-example](./project) -### 基准 -- 每个 package 独立可用,对外接口尽量简洁,最好具备复用性 -- package 文件夹名称和里面的入口文件命名一致 -- 入口文件不宜有太多编码 -- 应将外部函数放在入口文件,业务自顶向下实现,入口能表现 package 的核心功能 -- 入口文件一般包含三个外部函数,分别是:New(), Run(), Close() -- 提交代码之前必须运行 make all 和 make test 并通过之后才能提交 -- 命名风格参考之前的项目进行统一 -- cmd/main.go 中监听 signals 信号之后必须要调用 CLose() 进行安全退出 - -## 通用三方库 -- cli: github.com/urfave/cli -- api: github.com/gin-gonic/gin -- job: github.com/go-co-op/gocron -- log: github.com/inconshreveable/log15 -- test: github.com/stretchr/testify -- json: github.com/tidwall/gjson -- http-cli: gopkg.in/h2non/gentleman.v2 -- decimal library: github.com/shopspring/decimal -- ethereumRPC: github.com/everFinance/ethrpc -- ethereumSDK: github.com/everFinance/goether -- arweaveSDK: github.com/everFinance/goar -- web-framework: github.com/gin-gonic/gin -- redis-cli: github.com/go-redis/redis -- mysql-cli: gorm.io/gorm - -## 日志 -### 封装 -``` -func NewLog(serverName string) log15.Logger { - lg := log15.New("module", serverName) - - // 默认的 logger handle - h := lg.GetHandler() - // 集成 sentry 的 logger handle - sentryHandle := log15.FuncHandler(func(r *log15.Record) error { - if r.Lvl == log15.LvlError { - msg := string(log15.JsonFormat().Format(r)) - go func(m string) { - sentry.CaptureMessage(m) - }(msg) - } - return nil - }) - - lg.SetHandler(log15.MultiHandler(h, sentryHandle)) - - return lg -} -``` -### 使用 -``` -var log = NewLog("demo") - -log.Info(msg, "var1",var1,"var2",var2) -log.Debug(msg, "var1",var1,"var2",var2) -log.Warn(msg, "var1",var1,"var2",var2) -log.Error(msg, "err",err,"var1",var1) -``` -### 使用规范 -#### 内容简洁 -日志 msg 必须简洁明确,不相干数据严重干扰日志分析。比如在打印 tx 日志中,不要输出 tx 所有字段,只需要打印需要的字段。 -#### 重复输出 -在开发过程中,经常出现日志打印重复的情况。比如如下: -``` -func A() { - err := b() - if err != nil { - log.Error("b() failed","err",err) - - } - -} - -func b() error { - _, err := strconv.Atoi("111") - if err != nil { - log.Error("strconv.Atoi("111")","err",err) - return err - } - return nil -} - -``` -b() 中打印过 err msg,但是 A() 中又会打印一次 b() 返回的error, 所以出现了重复打印的情况。这种情况严重干扰对日志的分析。 -正确的做法是在 b() 中不打印,只要在最外层调用函数中打印。 -#### 正确使用日志级别 -在 log5 中主要使用到 Debug, Info, Warn, Error 这四个级别来打印日志。 -1. Debug 使用场景 - 代码调试、输出关键信息用于判断程序状态。 -2. Info 使用场景 - 程序启动打印初始化数据信息、关键状态正常改变之后的信息输出。 -3. Warn 使用场景 - 对系统整体运行影响不大但是不可忽略的错误,需要通过 warn 级别输出。比如读取外部服务的定时任务某次读取失败的情况。 -4. Error 使用场景 - 服务出现 Error 并影响服务正常运行都必须使用 Error 级别输出。 - -#### error 信息声明 -error 信息统一在 error.go 中声明,命名方式为蛇形命名法,如: -``` -var ERR_INVALID_SIGNATURE = "err_invalid_signature" -``` - -## 编码规范 -参考 [Uber-go 规范](https://github.com/xxjwxc/uber_go_guide_cn#uber-go-%E8%AF%AD%E8%A8%80%E7%BC%96%E7%A0%81%E8%A7%84%E8%8C%83) - -### 补充 -- 在 demo.go 中原则上只实现三个方法 New(), Run(), Close() -- 在 **.go 文件中,只有需要被其他文件调用的方法首字符才大写。 -- 文件中 public 方法统一写在 private 方法之前。 - ```go - AA(){} - BB(){} - aa(){} - bb(){} - ``` -- 方法命令必须为驼峰,并且必须简洁 - ```go - bad: - UpdateBlockChainStableBlock(){} - Good: - UpdateStableBlock(){} - ``` -- 相同属性的传参写到一起,返回值如此 - ```go - AA(ethRpc, moonRpc, cfxRpc string, db *Db) {} - ``` -- 存在 error 返回值,error 写在返回值最后一位 - ```go - AA(ethRpc, moonRpc, cfxRpc string, db *Db) (string,int,error) {} - ``` -- 函数参数避免指针类型。如果是 slice, map 传参之前可以 copy 一份 -- 避免使用多重 if- else if -else, 请替换成 switch -- 不要使用闭包,因为你没法控制闭包中调用的外部变量是如何变化 - ``` - bad: - for i:=0; i <10; i ++ { - go func() { - t.Log(i) // 闭包中的 i 会随着 for 循环改变,最后打印的都是 10 - }() - } - good: - for i:=0; i <10; i ++ { - go func(i int) { // 通过确定性的传参 - t.Log(i) - }(i) - } - ``` -- 使用 locker.Lock() 之后必须立即声明 defer locker.Unlocker() - ```go - bad: - func AA() { - locker.Lock() - ... - locker.UnLock() - } - - good: - func AA() { - locker.Lock() - defer locker.UnLock() - ... - } - ``` -- 尽量避免使用 init() 函数,因为加载 init() 函数中路径不可控,并且 init() 中逻辑不显式调用执行。请把 init() 中的处理放在 demo.go/New() 或者 Run() 中。 -- 使用 slice 或者 map,请在 make 的时候指定 cap, 这样 append 的时候会更高效以及节省代码运行时开辟的内存空间。 - ```go - tokenList := make([]severSchema.TokenInfo, 0, 50) - ``` -- 正常情况下不会使用到缓冲 channel, 如果必须要使用缓冲 channel, 请备注好为什么 cap 设置为该值。 -- 需要重命名 import package 的时候需要遵循就近原则,本模块的不需要重命名,名字冲突的其他模块命名需要加上模块名。 - ```go - import ( - confSchema "github.com/everFinance/everpay/config/schema" // config 模块 - paySchema "github.com/everFinance/everpay/pay/schema" // pay 模块 - "github.com/everFinance/everpay/server/schema" // 同一模块 - ) - ``` -- api 返回结果必须使用 struct 形式 - ```go - bad: - c.JSON(http.StatusOK, gin.H{ - "total": total, - "txs": txs, - }) - - good: - c.JSON(http.StatusOK, schema.RespTxs{ - Total: total, - Txs: txs, - }) - ``` -- 代码中声明整数类型都使用 int64 ---- +# Permadao Coding Guidelines +## golang +- [golang 规范 中文](./golang/README_zh.md) +- [golang Coding Guidelines EN](./golang/README_en.md) + +## Java +- [Java 规范 中文](./java/README_zh.md) +- [Java Coding Guidelines EN](./java/README_en.md) \ No newline at end of file diff --git a/golang/README_en.md b/golang/README_en.md new file mode 100644 index 0000000..6c3a68e --- /dev/null +++ b/golang/README_en.md @@ -0,0 +1,218 @@ +# Golang Code Guidelines +## Project Structure +``` +- cmd + - demo + - main.go // Entry point for the demo project +- demo + - schema // Type declarations + - db.go // Type declarations related to the database + - api.go // Type declarations for API responses + - error.go // Error messages + - other.go // Type declarations for other modules + - api.go // Implementation of RESTful interfaces + - demo.go // Entry function + - jobs.go // Implementation of scheduled tasks + - wdb.go // Implementation of relational database read/write methods + - cache.go // Cache + - other.go // Independent processing methods +- example // Examples + - xxx.go +- .drone.yml // CI/CD configuration file +- Dockerfile +- README.md // Readme for the demo project +- mod.go +- Makefile // make all, make test +- test.sh + +``` +[project-example](./project) +### Benchmarks +- Each package should be independently usable, with externally facing interfaces kept concise and ideally reusable. +- Package folder names should match the names of their entry files. +- Entry files should not be overly complex. +- External functions should be placed in entry files, with business logic implemented from top to bottom, showcasing the core functionality of the package. +- Entry files generally include three external functions: New(), Run(), and Close(). +- Before committing code, run make all and make test, ensuring they pass before submission. +- Follow the naming style established in previous projects for consistency. +- In cmd/main.go, after listening for signals, it's mandatory to call Close() for a safe exit. + +## Common Third-party Libraries +- cli: github.com/urfave/cli +- api: github.com/gin-gonic/gin +- job: github.com/go-co-op/gocron +- log: github.com/inconshreveable/log15 +- test: github.com/stretchr/testify +- json: github.com/tidwall/gjson +- http-cli: gopkg.in/h2non/gentleman.v2 +- decimal library: github.com/shopspring/decimal +- ethereumRPC: github.com/everFinance/ethrpc +- ethereumSDK: github.com/everFinance/goether +- arweaveSDK: github.com/everFinance/goar +- web-framework: github.com/gin-gonic/gin +- redis-cli: github.com/go-redis/redis +- mysql-cli: gorm.io/gorm + +## Logging +### Packing +``` +func NewLog(serverName string) log15.Logger { + lg := log15.New("module", serverName) + + // Default logger handle + h := lg.GetHandler() + // Sentry integrated logger handle + sentryHandle := log15.FuncHandler(func(r *log15.Record) error { + if r.Lvl == log15.LvlError { + msg := string(log15.JsonFormat().Format(r)) + go func(m string) { + sentry.CaptureMessage(m) + }(msg) + } + return nil + }) + + lg.SetHandler(log15.MultiHandler(h, sentryHandle)) + + return lg +} +``` +### Usage +``` +var log = NewLog("demo") + +log.Info(msg, "var1",var1,"var2",var2) +log.Debug(msg, "var1",var1,"var2",var2) +log.Warn(msg, "var1",var1,"var2",var2) +log.Error(msg, "err",err,"var1",var1) +``` +### Usage Guidelines +#### Keep Content Concise +Log messages must be concise and clear, avoiding irrelevant data that can significantly interfere with log analysis. For example, when logging transaction details, only print the necessary fields. +#### Avoid Duplicate Output +It's common to encounter duplicate log prints. For example: +``` +func A() { + err := b() + if err != nil { + log.Error("b() failed","err",err) + + } + +} + +func b() error { + _, err := strconv.Atoi("111") + if err != nil { + log.Error("strconv.Atoi("111")","err",err) + return err + } + return nil +} + +``` +In this case, the error message is printed both in function A and function b, leading to unnecessary duplication. It's preferable to only log at the outermost function. +#### Use the Correct Log Levels +In log15, use Debug, Info, Warn, and Error for logging. +1. Debug: Code debugging, outputting key information for program state judgment. +2. Info: Print initialization data information when the program starts, and output information after key state changes. +3. Warn: For errors that do not significantly impact the overall system operation but cannot be ignored, output through the warn level. For example, a periodic task reading from an external service fails for a specific iteration. +4. Error: Any error affecting service operation must be output at the Error level. + +#### Declare Error Information +Error information should be declared uniformly in error.go, using snake_case naming convention: +``` +var ERR_INVALID_SIGNATURE = "err_invalid_signature" +``` + +## Coding Guidelines +Refer to [Uber-go](https://github.com/xxjwxc/uber_go_guide_cn#uber-go-%E8%AF%AD%E8%A8%80%E7%BC%96%E7%A0%81%E8%A7%84%E8%8C%83) + +### Additional Points +- In demo.go, implement only three methods: New(), Run(), and Close() as a principle. +- In .go files, only methods that need to be called by other files should have an uppercase first character. +- Public methods in files should be written before private methods. + ```go + AA(){} + BB(){} + aa(){} + bb(){} + ``` +- Method names should follow camelCase and be concise. + ```go + bad: + UpdateBlockChainStableBlock(){} + Good: + UpdateStableBlock(){} + ``` +- Group parameters with the same properties together, and return values accordingly. + ```go + AA(ethRpc, moonRpc, cfxRpc string, db *Db) {} + ``` +- If an error is returned, place the error at the end of the return values. + ```go + AA(ethRpc, moonRpc, cfxRpc string, db *Db) (string,int,error) {} + ``` +- Avoid using pointer types for function parameters. If it's a slice or map, consider copying before passing. +- Avoid using nested if-else structures; replace them with switch statements. +- Avoid using closures since you cannot control how external variables called in closures change. + ``` + bad: + for i:=0; i <10; i ++ { + go func() { + t.Log(i) // The 'i' in the closure changes with the for loop, and the final print is always 10. + }() + } + good: + for i:=0; i <10; i ++ { + go func(i int) { // Use deterministic parameter passing + t.Log(i) + }(i) + } + ``` +- When using `locker.Lock()`, immediately `defer locker.Unlock()` + ```go + bad: + func AA() { + locker.Lock() + ... + locker.UnLock() + } + + good: + func AA() { + locker.Lock() + defer locker.UnLock() + ... + } + ``` +- Avoid using init() functions, as the loading order of init() functions is uncontrollable, and the logic in init() is not explicitly invoked. Place the logic in demo.go/New() or Run() instead. +- When using slices or maps, specify the capacity during make to make append more efficient and save memory space during runtime. + ```go + tokenList := make([]severSchema.TokenInfo, 0, 50) + ``` +- Normally, avoid using buffered channels. If a buffered channel is necessary, provide a comment - explaining why the capacity is set to that value. +When renaming imported packages, follow the principle of proximity. No need to rename within the same module, but other modules with naming conflicts should include the module name. + ```go + import ( + confSchema "github.com/everFinance/everpay/config/schema" // config package + paySchema "github.com/everFinance/everpay/pay/schema" // pay package + "github.com/everFinance/everpay/server/schema" // current package + ) + ``` +- API response results must use the struct form. + ```go + bad: + c.JSON(http.StatusOK, gin.H{ + "total": total, + "txs": txs, + }) + + good: + c.JSON(http.StatusOK, schema.RespTxs{ + Total: total, + Txs: txs, + }) + ``` +- Declare integer types in code using int64. + diff --git a/golang/README_zh.md b/golang/README_zh.md new file mode 100644 index 0000000..0444710 --- /dev/null +++ b/golang/README_zh.md @@ -0,0 +1,222 @@ +# Golang 代码规范 +## 项目结构 +``` +- cmd + - demo + - main.go // demo 项目启动入口 +- demo + - schema // type 声明 + - db.go // db 相关的 type 声明 + - api.go // api response type 声明 + - error.go // error 信息 + - other.go // 其他模块对应的 type 声明 + - api.go // restful 接口实现 + - demo.go // 入口函数 + - jobs.go // 定时任务实现 + - wdb.go // 关系型数据库读写方法实现 + - cache.go // 缓存 + - other.go // 独立的处理方法 +- example // 用例 + - xxx.go +- .drone.yml // ci/cd 配置文件 +- Dockerfile +- README.md // demo 项目 readme +- mod.go +- Makefile // make all, make test +- test.sh +``` +[project-example](./project) +### 基准 +- 每个 package 独立可用,对外接口尽量简洁,最好具备复用性 +- package 文件夹名称和里面的入口文件命名一致 +- 入口文件不宜有太多编码 +- 应将外部函数放在入口文件,业务自顶向下实现,入口能表现 package 的核心功能 +- 入口文件一般包含三个外部函数,分别是:New(), Run(), Close() +- 提交代码之前必须运行 make all 和 make test 并通过之后才能提交 +- 命名风格参考之前的项目进行统一 +- cmd/main.go 中监听 signals 信号之后必须要调用 CLose() 进行安全退出 + +## 通用三方库 +- cli: github.com/urfave/cli +- api: github.com/gin-gonic/gin +- job: github.com/go-co-op/gocron +- log: github.com/inconshreveable/log15 +- test: github.com/stretchr/testify +- json: github.com/tidwall/gjson +- http-cli: gopkg.in/h2non/gentleman.v2 +- decimal library: github.com/shopspring/decimal +- ethereumRPC: github.com/everFinance/ethrpc +- ethereumSDK: github.com/everFinance/goether +- arweaveSDK: github.com/everFinance/goar +- web-framework: github.com/gin-gonic/gin +- redis-cli: github.com/go-redis/redis +- mysql-cli: gorm.io/gorm + +## 日志 +### 封装 +``` +func NewLog(serverName string) log15.Logger { + lg := log15.New("module", serverName) + + // 默认的 logger handle + h := lg.GetHandler() + // 集成 sentry 的 logger handle + sentryHandle := log15.FuncHandler(func(r *log15.Record) error { + if r.Lvl == log15.LvlError { + msg := string(log15.JsonFormat().Format(r)) + go func(m string) { + sentry.CaptureMessage(m) + }(msg) + } + return nil + }) + + lg.SetHandler(log15.MultiHandler(h, sentryHandle)) + + return lg +} +``` +### 使用 +``` +var log = NewLog("demo") + +log.Info(msg, "var1",var1,"var2",var2) +log.Debug(msg, "var1",var1,"var2",var2) +log.Warn(msg, "var1",var1,"var2",var2) +log.Error(msg, "err",err,"var1",var1) +``` +### 使用规范 +#### 内容简洁 +日志 msg 必须简洁明确,不相干数据严重干扰日志分析。比如在打印 tx 日志中,不要输出 tx 所有字段,只需要打印需要的字段。 +#### 重复输出 +在开发过程中,经常出现日志打印重复的情况。比如如下: +``` +func A() { + err := b() + if err != nil { + log.Error("b() failed","err",err) + + } + +} + +func b() error { + _, err := strconv.Atoi("111") + if err != nil { + log.Error("strconv.Atoi("111")","err",err) + return err + } + return nil +} + +``` +b() 中打印过 err msg,但是 A() 中又会打印一次 b() 返回的error, 所以出现了重复打印的情况。这种情况严重干扰对日志的分析。 +正确的做法是在 b() 中不打印,只要在最外层调用函数中打印。 +#### 正确使用日志级别 +在 log5 中主要使用到 Debug, Info, Warn, Error 这四个级别来打印日志。 +1. Debug 使用场景 + 代码调试、输出关键信息用于判断程序状态。 +2. Info 使用场景 + 程序启动打印初始化数据信息、关键状态正常改变之后的信息输出。 +3. Warn 使用场景 + 对系统整体运行影响不大但是不可忽略的错误,需要通过 warn 级别输出。比如读取外部服务的定时任务某次读取失败的情况。 +4. Error 使用场景 + 服务出现 Error 并影响服务正常运行都必须使用 Error 级别输出。 + +#### error 信息声明 +error 信息统一在 error.go 中声明,命名方式为蛇形命名法,如: +``` +var ERR_INVALID_SIGNATURE = "err_invalid_signature" +``` + +## 编码规范 +参考 [Uber-go 规范](https://github.com/xxjwxc/uber_go_guide_cn#uber-go-%E8%AF%AD%E8%A8%80%E7%BC%96%E7%A0%81%E8%A7%84%E8%8C%83) + +### 补充 +- 在 demo.go 中原则上只实现三个方法 New(), Run(), Close() +- 在 **.go 文件中,只有需要被其他文件调用的方法首字符才大写。 +- 文件中 public 方法统一写在 private 方法之前。 + ```go + AA(){} + BB(){} + aa(){} + bb(){} + ``` +- 方法命令必须为驼峰,并且必须简洁 + ```go + bad: + UpdateBlockChainStableBlock(){} + Good: + UpdateStableBlock(){} + ``` +- 相同属性的传参写到一起,返回值如此 + ```go + AA(ethRpc, moonRpc, cfxRpc string, db *Db) {} + ``` +- 存在 error 返回值,error 写在返回值最后一位 + ```go + AA(ethRpc, moonRpc, cfxRpc string, db *Db) (string,int,error) {} + ``` +- 函数参数避免指针类型。如果是 slice, map 传参之前可以 copy 一份 +- 避免使用多重 if- else if -else, 请替换成 switch +- 不要使用闭包,因为你没法控制闭包中调用的外部变量是如何变化 + ``` + bad: + for i:=0; i <10; i ++ { + go func() { + t.Log(i) // 闭包中的 i 会随着 for 循环改变,最后打印的都是 10 + }() + } + good: + for i:=0; i <10; i ++ { + go func(i int) { // 通过确定性的传参 + t.Log(i) + }(i) + } + ``` +- 使用 locker.Lock() 之后必须立即声明 defer locker.Unlocker() + ```go + bad: + func AA() { + locker.Lock() + ... + locker.UnLock() + } + + good: + func AA() { + locker.Lock() + defer locker.UnLock() + ... + } + ``` +- 尽量避免使用 init() 函数,因为加载 init() 函数中路径不可控,并且 init() 中逻辑不显式调用执行。请把 init() 中的处理放在 demo.go/New() 或者 Run() 中。 +- 使用 slice 或者 map,请在 make 的时候指定 cap, 这样 append 的时候会更高效以及节省代码运行时开辟的内存空间。 + ```go + tokenList := make([]severSchema.TokenInfo, 0, 50) + ``` +- 正常情况下不会使用到缓冲 channel, 如果必须要使用缓冲 channel, 请备注好为什么 cap 设置为该值。 +- 需要重命名 import package 的时候需要遵循就近原则,本模块的不需要重命名,名字冲突的其他模块命名需要加上模块名。 + ```go + import ( + confSchema "github.com/everFinance/everpay/config/schema" // config 模块 + paySchema "github.com/everFinance/everpay/pay/schema" // pay 模块 + "github.com/everFinance/everpay/server/schema" // 同一模块 + ) + ``` +- api 返回结果必须使用 struct 形式 + ```go + bad: + c.JSON(http.StatusOK, gin.H{ + "total": total, + "txs": txs, + }) + + good: + c.JSON(http.StatusOK, schema.RespTxs{ + Total: total, + Txs: txs, + }) + ``` +- 代码中声明整数类型都使用 int64 +--- diff --git a/project/.drone.yml b/golang/project/.drone.yml similarity index 100% rename from project/.drone.yml rename to golang/project/.drone.yml diff --git a/project/Dockerfile b/golang/project/Dockerfile similarity index 100% rename from project/Dockerfile rename to golang/project/Dockerfile diff --git a/project/cmd/demo/main.go b/golang/project/cmd/demo/main.go similarity index 100% rename from project/cmd/demo/main.go rename to golang/project/cmd/demo/main.go diff --git a/project/demo/api.go b/golang/project/demo/api.go similarity index 100% rename from project/demo/api.go rename to golang/project/demo/api.go diff --git a/project/demo/demo.go b/golang/project/demo/demo.go similarity index 100% rename from project/demo/demo.go rename to golang/project/demo/demo.go diff --git a/project/demo/error.go b/golang/project/demo/error.go similarity index 100% rename from project/demo/error.go rename to golang/project/demo/error.go diff --git a/project/demo/jobs.go b/golang/project/demo/jobs.go similarity index 100% rename from project/demo/jobs.go rename to golang/project/demo/jobs.go diff --git a/project/demo/schema/db.go b/golang/project/demo/schema/db.go similarity index 100% rename from project/demo/schema/db.go rename to golang/project/demo/schema/db.go diff --git a/project/demo/wdb.go b/golang/project/demo/wdb.go similarity index 100% rename from project/demo/wdb.go rename to golang/project/demo/wdb.go diff --git a/project/example/demo.go b/golang/project/example/demo.go similarity index 100% rename from project/example/demo.go rename to golang/project/example/demo.go diff --git a/project/go.mod b/golang/project/go.mod similarity index 100% rename from project/go.mod rename to golang/project/go.mod diff --git a/project/test.sh b/golang/project/test.sh similarity index 100% rename from project/test.sh rename to golang/project/test.sh diff --git a/java/README_en.md b/java/README_en.md new file mode 100644 index 0000000..0549644 --- /dev/null +++ b/java/README_en.md @@ -0,0 +1 @@ +# Java Code Guidelines \ No newline at end of file diff --git a/java/README_zh.md b/java/README_zh.md new file mode 100644 index 0000000..e69de29 From 3164605dff035fc8c12a23c41a87389fe08042a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cshiwenwy=E2=80=9D?= Date: Mon, 4 Dec 2023 00:31:08 +0800 Subject: [PATCH 2/4] java codeing style guide --- java/README_en.md | 161 +++++++++++++++++- java/README_zh.md | 157 +++++++++++++++++ java/demo/.gitignore | 33 ++++ java/demo/pom.xml | 86 ++++++++++ .../com/example/demo/DemoApplication.java | 19 +++ .../com/example/demo/config/DemoConfig.java | 9 + .../demo/controller/StudentController.java | 40 +++++ .../com/example/demo/entity/StudentDO.java | 58 +++++++ .../java/com/example/demo/enums/DemoEnum.java | 8 + .../example/demo/mapper/StudentMapper.java | 12 ++ .../java/com/example/demo/model/Student.java | 58 +++++++ .../example/demo/service/StudentService.java | 12 ++ .../demo/service/impl/StudentServiceImpl.java | 37 ++++ .../java/com/example/demo/utils/DemoUtil.java | 8 + .../java/com/example/demo/vo/StudentVO.java | 57 +++++++ .../src/main/resources/application.properties | 41 +++++ java/demo/src/main/resources/data.sql | 3 + .../main/resources/mappers/StudentMapper.xml | 16 ++ java/demo/src/main/resources/schema.sql | 8 + .../demo/src/main/resources/static/index.html | 6 + .../example/demo/DemoApplicationTests.java | 13 ++ java/img.png | Bin 0 -> 121754 bytes 22 files changed, 841 insertions(+), 1 deletion(-) create mode 100644 java/demo/.gitignore create mode 100644 java/demo/pom.xml create mode 100644 java/demo/src/main/java/com/example/demo/DemoApplication.java create mode 100644 java/demo/src/main/java/com/example/demo/config/DemoConfig.java create mode 100644 java/demo/src/main/java/com/example/demo/controller/StudentController.java create mode 100644 java/demo/src/main/java/com/example/demo/entity/StudentDO.java create mode 100644 java/demo/src/main/java/com/example/demo/enums/DemoEnum.java create mode 100644 java/demo/src/main/java/com/example/demo/mapper/StudentMapper.java create mode 100644 java/demo/src/main/java/com/example/demo/model/Student.java create mode 100644 java/demo/src/main/java/com/example/demo/service/StudentService.java create mode 100644 java/demo/src/main/java/com/example/demo/service/impl/StudentServiceImpl.java create mode 100644 java/demo/src/main/java/com/example/demo/utils/DemoUtil.java create mode 100644 java/demo/src/main/java/com/example/demo/vo/StudentVO.java create mode 100644 java/demo/src/main/resources/application.properties create mode 100644 java/demo/src/main/resources/data.sql create mode 100644 java/demo/src/main/resources/mappers/StudentMapper.xml create mode 100644 java/demo/src/main/resources/schema.sql create mode 100644 java/demo/src/main/resources/static/index.html create mode 100644 java/demo/src/test/java/com/example/demo/DemoApplicationTests.java create mode 100644 java/img.png diff --git a/java/README_en.md b/java/README_en.md index 0549644..1fd528c 100644 --- a/java/README_en.md +++ b/java/README_en.md @@ -1 +1,160 @@ -# Java Code Guidelines \ No newline at end of file +# java Code Guidelines +## Project Structure +``` +/project-root + /src + /main + /java + /com + /example + /demo + DemoApplication.java // spring boot entry point + /config // Configuration information + DemoConfig.java + /controller // Store controller class + StudentController.java + /service // Storage service class + StudentService.java + /mapper // Stores data access interfaces + StudentMapper.java + /entity // Stores table data objects + StudentDO.java + /model // Stores the data model classes + Student.java + /vo // Store view objects + StudentVO.java + /utils // Storage utility class + DemoUtil.java + /enums // Store enumeration class + DemoEnum.java + /resources + application.properties + + /test // Store test code + /java + /com + /example + /controller + SampleControllerTest.java + /service + SampleServiceTest.java + /target // Build output directory + README.md // Documentation of the project + .gitignore // Git ignores file configuration + pom.xml // Maven project configuration file +``` +[demo](./demo) + +If it is a small entrepreneurial project, we recommend using the single application in the demo or even serverless, lambda. For large java projects, we recommend the cola architecture shown in the following figure + +![img.png](img.png) + +### Benchmarks +- Hierarchical architecture, as shown in the figure above, the upper layer depends on the lower layer, and the lower layer shields the processing details of the upper layer, and each layer performs its own duties and separates the concerns +- Don't add entities if you don't have to. Domain model has high requirements for design ability, and if it is not used well, a wrong abstraction is better than no abstraction +- Do not rely on SNAPSHOT versions for online applications +- When relying on a two-square library, a uniform version variable must be defined to avoid inconsistent version numbers +- Keep code styles consistent within the same project +- During system design, the system should rely on abstract classes and interfaces as much as possible according to the dependency inversion principle, which is conducive to expansion and maintenance + +## Common Third-party Libraries +- Application development framework: spring boot +- Scheduled task: quartz、elastic job、spring task scheduling +- log: log4j、logback、log4j2 +- test: junit、testng、mockito、spring test +- arweave sdk: arseedingsdk4j-sdk +- ethereum sdk: web3j +- json: jackson、gson、fastjson +- data source: druid、c3p0 +- http: OkHttp、Apache HttpClient +- redis: jedis、redisson + +## log +The application cannot directly use the API in the log system (Log4j, Logback), but should rely on the API in the log framework SLF4J, and use the log framework in the facade mode, which is conducive to maintenance and the unity of log processing methods of each class + +```agsl +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +private static final Logger logger = LoggerFactory.getLogger(Test.class); +``` + +### 使用 +```agsl +private static final Logger logger = LoggerFactory.getLogger(Test.class); + +// debug level +logger.debug("Processing trade with id: {} and symbol: {}", id, symbol); + +// info level +logger.info("Processing trade with id: {} and symbol: {}", id, symbol); + +// warn level +logger.warn("Processing trade with id: {} and symbol: {}", id, symbol); + +// error level +logger.error(msg + "_" + e.getMessage(), e); +``` + +### Usage specification +* All log files are saved for at least 15 days, because some exceptions have a "weekly" frequency +* For log output at the trace/debug level, you must enable and disable the log level +```agsl +if (logger.isDebugEnabled()) { + logger.debug("Current ID is: {} and name is: {}", id, getName()); +} +``` +* Avoid wasting disk space by printing logs repeatedly +* Exception information should include two types of information: crime scene information and exception stack information +* debug level logs cannot be output in the production environment. Output info level logs selectively +* The warn level log can be used to record user input parameter errors to avoid user complaints +* Try to describe log error messages in English + +#### Use log levels correctly +In java, common log levels are from low to high: trace、debug、info、warn、error、fatal +1. trace: The lowest level log is used to track the execution of the program. In general, it is only used in the debugging phase to output some detailed debugging information. + +2. debug: Output debugging information to help developers locate problems. In production environments, the debug level is generally not recommended because of the large amount of log output. + +3. info: info logs are used to output important running information, such as program startup information and the results of critical operations. Info logs are used in production environments to monitor the running status of programs. + +4. warn: Warning information indicates that there may be a potential problem in the program, but it does not affect the normal running of the program. For example, if the parameters of a method do not meet expectations, the program can continue to execute. + +5. error: Output an error message indicating that a recoverable error occurred in the program. When an error occurs in the program. Generally, logs of the error level are recorded and handled accordingly. + +6. fatal: Logs of the highest level are used to output fatal error messages. When an unrecoverable error occurs in the program, a fatal level log is logged and the execution of the program is terminated. + +In actual applications, you can set the log level as required. Normally, the development environment can be set to debug level and the production environment can be set to info level to avoid excessive log output + +## Coding Guidelines + +Refer to [alibaba java coding guidelines](https://github.com/alibaba/Alibaba-Java-Coding-Guidelines) + +alibaba java coding guidelines written very detailed, here to write some daily development often encounter the situation + +### Naming style + +- None of the names in the code can start with an underscore or dollar sign, nor can they end with an underscore or dollar sign +- The naming in the code is strictly forbidden to use the combination of pinyin and English, and it is not allowed to directly use the Chinese way +- The class name uses the UpperCamelCase style except for the following cases: DO/BO/DTO/VO/AO/PO, and so on +- Method names, parameter names, member variables, and local variables use the lowerCamelCase style and must follow the hump form +- Constant names are all uppercase, words are separated by underscores, and the semantic expression is complete and clear, and the name is not too long +- The name of an Abstract class starts with abstract or Base; Exception class names end with exception; A Test class name starts with the name of the class it is testing and ends with test +- Package names are all lowercase, with one and only one natural English word between dot separators. Package names are singular, but class names can be plural if they have plural meanings + + +### Security protocol +- The pages or functions that belong to the user must be checked for permission control +- Sensitive user data is not allowed to be displayed directly, and display data must be desensitized +- SQL parameters entered by users are strictly limited by parameter binding or METADATA field values, preventing SQL injection +- The user requests that any parameters passed in must be validated + +### Database design +- Table name Field names must use lowercase characters or numbers; Do not start with a digit or have only a digit between two underscores +- Disable reserved words, such as desc, range, match, and delayed +- Primary key index name pk_ field name; Unique index name uk_ field name; The common index name is the idx_ field name +- The decimal type is decimal. float and double are prohibited +- varchar is a variable length character string with a maximum length of 5000. If the stored length exceeds this value, use text and list it independently +- Three required fields in the table are id, create_time, update_time +- Do not use count(column name) or count(constant) instead of count(*), count(*) is the syntax for the standard count of rows defined in SQL92, independent of the database, NULL and non-null +- If all the values in a column are NULL, count(col) returns 0, but sum(col) returns NULL. Therefore, pay attention to NPE problems when using sum() + If the -in operation can be avoided, avoid it. If it cannot be avoided, carefully evaluate the number of set elements behind the in operation and control it within 1000 \ No newline at end of file diff --git a/java/README_zh.md b/java/README_zh.md index e69de29..ca9a079 100644 --- a/java/README_zh.md +++ b/java/README_zh.md @@ -0,0 +1,157 @@ +# java 代码规范 +## 项目结构 +``` +/project-root + /src + /main + /java + /com + /example + /demo + DemoApplication.java // spring boot 启动入口 + /config // 配置信息 + DemoConfig.java + /controller // 存放控制器类 + StudentController.java + /service // 存放服务类 + StudentService.java + /mapper // 存放数据访问接口 + StudentMapper.java + /entity // 存放数据表对象 + StudentDO.java + /model // 存放数据模型类 + Student.java + /vo // 存放展示对象 + StudentVO.java + /utils // 存放工具类 + DemoUtil.java + /enums // 存放枚举类 + DemoEnum.java + /resources + application.properties + + /test // 存放测试代码 + /java + /com + /example + /controller + SampleControllerTest.java + /service + SampleServiceTest.java + /target // 构建输出目录 + README.md // 项目的说明文档 + .gitignore // Git忽略文件配置 + pom.xml // Maven项目配置文件 +``` +[demo](./demo) + +如果是小型创业项目, 我们建议使用demo中的单体应用甚至serverless、lambda. 如果是大型java项目,我们建议下图中的cola架构(alibaba) + +![img.png](img.png) + +### 基准 +- 分层架构,如上图,上层依赖下层,下层对上层屏蔽处理细节,每一层各司其职,分离关注点 +- 如无必要勿增实体. 领域模型对设计能力要求很高,没把握用好,一个错误的抽象还不如不抽象 +- 线上应用不要依赖 SNAPSHOT 版本 +- 依赖于一个二方库群时,必须定义一个统一的版本变量,避免版本号不一致 +- 同一个项目中代码风格保持一致 +- 系统设计时,根据依赖倒置原则,尽量依赖抽象类与接口,有利于扩展与维护 + +## 通用三方库 +- 应用开发框架: spring boot +- 定时任务: quartz、elastic job、spring task scheduling +- 日志: log4j、logback、log4j2 +- 测试: junit、testng、mockito、spring test +- arweave sdk: arseedingsdk4j-sdk +- ethereum sdk: web3j +- json: jackson、gson、fastjson +- 数据源: druid、c3p0 +- http: OkHttp、Apache HttpClient +- redis: jedis、redisson + +## 日志 +应用中不可直接使用日志系统(Log4j、Logback)中的 API,而应依赖使用日志框架 SLF4J 中的 API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一 + +```agsl +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +private static final Logger logger = LoggerFactory.getLogger(Test.class); +``` + +### 使用 +```agsl +private static final Logger logger = LoggerFactory.getLogger(Test.class); + +// debug level +logger.debug("Processing trade with id: {} and symbol: {}", id, symbol); + +// info level +logger.info("Processing trade with id: {} and symbol: {}", id, symbol); + +// warn level +logger.warn("Processing trade with id: {} and symbol: {}", id, symbol); + +// error level +logger.error(msg + "_" + e.getMessage(), e); +``` + +### 使用规范 +* 所有日志文件至少保存 15 天,因为有些异常具备以“周”为频次发生的特点 +* 对于 trace/debug 级别的日志输出,必须进行日志级别的开关判断 +```agsl +if (logger.isDebugEnabled()) { + logger.debug("Current ID is: {} and name is: {}", id, getName()); +} +``` +* 避免重复打印日志,浪费磁盘空间 +* 异常信息应该包括两类信息: 案发现场信息和异常堆栈信息 +* 生产环境禁止输出 debug 日志; 有选择地输出 info 日志 +* 可以使用 warn 日志级别来记录用户输入参数错误的情况,避免用户投诉时,无所适从 +* 尽量用英文来描述日志错误信息 + +#### 正确使用日志级别 +在java中,常见的日志级别由低到高分别是trace、debug、info、warn、error和fatal +1. trace: 最低级别的日志,用于追踪程序的执行过程. 一般情况下,只在调试阶段使用,用于输出一些详细的调试信息. + +2. debug: 用于输出调试信息,帮助开发人员定位问题. 在生产环境中,一般不建议使用debug级别,因为会产生大量的日志输出. + +3. info: 用于输出一些重要的运行信息,如程序启动信息,关键操作的结果等. info级别的日志通常在生产环境中使用,用于监控程序的运行状态. + +4. warn: 用于输出一些警告信息,表示程序可能存在潜在的问题,但不会影响程序的正常运行. 比如,某个方法的参数不符合预期,但程序仍然可以继续执行. + +5. error: 用于输出错误信息,表示程序发生了可恢复的错误. 当程序出现错误时.一般会记录error级别的日志,并进行相应的处理. + +6. fatal: 最高级别的日志,用于输出致命错误信息. 当程序发生无法恢复的错误时,会记录fatal级别的日志,并终止程序的执行. + +在实际应用中,可以根据具体需求设置日志级别。通常情况下,开发环境可以设置为debug级别,生产环境可以设置为info级别,以避免产生过多的日志输出 + +## 编码规范 +参考 [阿里巴巴java开发规范](https://github.com/alibaba/Alibaba-Java-Coding-Guidelines) + +阿里巴巴java开发规范写的非常详细,这里写一些日常开发经常碰到的情况 + +### 命名风格 +- 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束 +- 代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式 +- 类名使用UpperCamelCase风格,但以下情形例外:DO / BO / DTO / VO / AO / PO等 +- 方法名、参数名、成员变量、局部变量都统一使用lowerCamelCase风格,必须遵从驼峰形式 +- 常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长 +- 抽象类命名使用Abstract或Base开头;异常类命名使用Exception结尾;测试类命名以它要测试的类名开始,以Test结尾 +- 包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式 + +### 安全规约 +- 隶属于用户个人的页面或者功能必须进行权限控制校验 +- 用户敏感数据禁止直接展示,必须对展示数据进行脱敏 +- 用户输入的 SQL 参数严格使用参数绑定或者 METADATA 字段值限定,防止 SQL 注入 +- 用户请求传入的任何参数必须做有效性验证 + +### 数据库设计 +- 表名字段名必须使用小写字符或数字;禁止出现数字开头,禁止两个下划线之间只有数字 +- 禁用保留字,如desc、range、match、delayed等 +- 主键索引名为 pk_字段名;唯一索引名为 uk_字段名;普通索引名则为 idx_字段名 +- 小数类型为decimal,禁止使用float和double +- varchar为变长字符串,长度不要超过5000,如果存储长度超过该值,使用text,并独立表出来 +- 表必备三字段:id, create_time, update_time +- 不要使用count(列名)或count(常量)来替代count(*),count(*)是SQL92定义的标 准统计行数的语法,跟数据库无关,跟NULL和非 NULL无关 +- 当某一列的值全是NULL时,count(col)的返回结果为0,但 sum(col)的返回结果为 NULL,因此使用sum()时需注意NPE问题 +- in操作能避免则避免,若实在避免不了,需要仔细评估 in后边的集合元素数量,控制在1000个之内 \ No newline at end of file diff --git a/java/demo/.gitignore b/java/demo/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/java/demo/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/java/demo/pom.xml b/java/demo/pom.xml new file mode 100644 index 0000000..cb918ac --- /dev/null +++ b/java/demo/pom.xml @@ -0,0 +1,86 @@ + + + 4.0.0 + com.example + demo + 0.0.1-SNAPSHOT + demo + Demo project for Spring Boot + + 1.8 + UTF-8 + UTF-8 + 2.6.13 + + + + org.springframework.boot + spring-boot-starter-quartz + + + org.springframework.boot + spring-boot-starter-web + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.2.2 + + + + com.h2database + h2 + runtime + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 1.8 + 1.8 + UTF-8 + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + com.example.demo.DemoApplication + true + + + + repackage + + repackage + + + + + + + + diff --git a/java/demo/src/main/java/com/example/demo/DemoApplication.java b/java/demo/src/main/java/com/example/demo/DemoApplication.java new file mode 100644 index 0000000..18ef7fa --- /dev/null +++ b/java/demo/src/main/java/com/example/demo/DemoApplication.java @@ -0,0 +1,19 @@ +package com.example.demo; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@SpringBootApplication +@EnableTransactionManagement +@MapperScan("com.example.demo.mapper") +@ComponentScan("com.example.demo") +public class DemoApplication { + + public static void main(String[] args) { + SpringApplication.run(DemoApplication.class, args); + } + +} diff --git a/java/demo/src/main/java/com/example/demo/config/DemoConfig.java b/java/demo/src/main/java/com/example/demo/config/DemoConfig.java new file mode 100644 index 0000000..a8b30e3 --- /dev/null +++ b/java/demo/src/main/java/com/example/demo/config/DemoConfig.java @@ -0,0 +1,9 @@ +package com.example.demo.config; + +/** + * @author shiwen.wy + * @date 2023/12/3 22:05 + */ +public class DemoConfig { + // TODO +} diff --git a/java/demo/src/main/java/com/example/demo/controller/StudentController.java b/java/demo/src/main/java/com/example/demo/controller/StudentController.java new file mode 100644 index 0000000..5543d1e --- /dev/null +++ b/java/demo/src/main/java/com/example/demo/controller/StudentController.java @@ -0,0 +1,40 @@ +package com.example.demo.controller; + +import com.example.demo.model.Student; +import com.example.demo.service.StudentService; +import com.example.demo.vo.StudentVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @author shiwen.wy + * @date 2023/12/3 21:33 + */ +@Controller +public class StudentController { + + @Autowired + private StudentService studentService; + @RequestMapping(value = "/student/{id}", method = RequestMethod.GET) + @ResponseBody + public StudentVO queryStudent(@PathVariable("id") String id) { + Student student = studentService.getStudent(Long.parseLong(id)); + return convertToVO(student); + } + + private StudentVO convertToVO(Student student) { + if (student == null) { + return null; + } + StudentVO vo = new StudentVO(); + vo.setId(student.getId()); + vo.setName(student.getName()); + vo.setAge(student.getAge()); + vo.setScore(student.getScore()); + return vo; + } +} diff --git a/java/demo/src/main/java/com/example/demo/entity/StudentDO.java b/java/demo/src/main/java/com/example/demo/entity/StudentDO.java new file mode 100644 index 0000000..4fbc93a --- /dev/null +++ b/java/demo/src/main/java/com/example/demo/entity/StudentDO.java @@ -0,0 +1,58 @@ +package com.example.demo.entity; + +import java.io.Serializable; + +/** + * @author shiwen.wy + * @date 2023/12/3 21:24 + */ +public class StudentDO implements Serializable { + private static final long serialVersionUID = + -2334705325988480016L; + + private long id; + + private String name; + + private int age; + + private int score; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public int getScore() { + return score; + } + + public void setScore(int score) { + this.score = score; + } + + @Override + public String toString() { + return "StudentDO{" + "id=" + id + ", name='" + name + '\'' + ", age=" + + age + ", score=" + score + '}'; + } +} diff --git a/java/demo/src/main/java/com/example/demo/enums/DemoEnum.java b/java/demo/src/main/java/com/example/demo/enums/DemoEnum.java new file mode 100644 index 0000000..1436e4f --- /dev/null +++ b/java/demo/src/main/java/com/example/demo/enums/DemoEnum.java @@ -0,0 +1,8 @@ +package com.example.demo.enums; + +/** + * @author shiwen.wy + * @date 2023/12/3 22:30 + */ +public enum DemoEnum { +} diff --git a/java/demo/src/main/java/com/example/demo/mapper/StudentMapper.java b/java/demo/src/main/java/com/example/demo/mapper/StudentMapper.java new file mode 100644 index 0000000..143acc7 --- /dev/null +++ b/java/demo/src/main/java/com/example/demo/mapper/StudentMapper.java @@ -0,0 +1,12 @@ +package com.example.demo.mapper; + +import com.example.demo.entity.StudentDO; + +/** + * @author shiwen.wy + * @date 2023/12/3 21:38 + */ +public interface StudentMapper { + + StudentDO getById(long id); +} diff --git a/java/demo/src/main/java/com/example/demo/model/Student.java b/java/demo/src/main/java/com/example/demo/model/Student.java new file mode 100644 index 0000000..c2a17d5 --- /dev/null +++ b/java/demo/src/main/java/com/example/demo/model/Student.java @@ -0,0 +1,58 @@ +package com.example.demo.model; + +import java.io.Serializable; + +/** + * @author shiwen.wy + * @date 2023/12/3 21:46 + */ +public class Student implements Serializable { + private static final long serialVersionUID = -3272421320600950226L; + + private long id; + + private String name; + + private int age; + + private int score; + + public boolean hasPassed() { + if (score >=60) { + return true; + } + return false; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public int getScore() { + return score; + } + + public void setScore(int score) { + this.score = score; + } +} diff --git a/java/demo/src/main/java/com/example/demo/service/StudentService.java b/java/demo/src/main/java/com/example/demo/service/StudentService.java new file mode 100644 index 0000000..2835085 --- /dev/null +++ b/java/demo/src/main/java/com/example/demo/service/StudentService.java @@ -0,0 +1,12 @@ +package com.example.demo.service; + +import com.example.demo.model.Student; + +/** + * @author shiwen.wy + * @date 2023/12/3 21:45 + */ +public interface StudentService { + + Student getStudent(long id); +} diff --git a/java/demo/src/main/java/com/example/demo/service/impl/StudentServiceImpl.java b/java/demo/src/main/java/com/example/demo/service/impl/StudentServiceImpl.java new file mode 100644 index 0000000..bd8fae8 --- /dev/null +++ b/java/demo/src/main/java/com/example/demo/service/impl/StudentServiceImpl.java @@ -0,0 +1,37 @@ +package com.example.demo.service.impl; + +import com.example.demo.entity.StudentDO; +import com.example.demo.mapper.StudentMapper; +import com.example.demo.model.Student; +import com.example.demo.service.StudentService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author shiwen.wy + * @date 2023/12/3 21:49 + */ +@Service +public class StudentServiceImpl implements StudentService { + + @Autowired + private StudentMapper studentMapper; + + @Override + public Student getStudent(long id) { + StudentDO studentDO = studentMapper.getById(id); + return convertToDomain(studentDO); + } + + private Student convertToDomain(StudentDO studentDO) { + if (studentDO == null) { + return null; + } + Student student = new Student(); + student.setAge(studentDO.getAge()); + student.setId(studentDO.getId()); + student.setName(studentDO.getName()); + student.setScore(studentDO.getScore()); + return student; + } +} diff --git a/java/demo/src/main/java/com/example/demo/utils/DemoUtil.java b/java/demo/src/main/java/com/example/demo/utils/DemoUtil.java new file mode 100644 index 0000000..602c9d7 --- /dev/null +++ b/java/demo/src/main/java/com/example/demo/utils/DemoUtil.java @@ -0,0 +1,8 @@ +package com.example.demo.utils; + +/** + * @author shiwen.wy + * @date 2023/12/3 22:30 + */ +public class DemoUtil { +} diff --git a/java/demo/src/main/java/com/example/demo/vo/StudentVO.java b/java/demo/src/main/java/com/example/demo/vo/StudentVO.java new file mode 100644 index 0000000..a9c3fdb --- /dev/null +++ b/java/demo/src/main/java/com/example/demo/vo/StudentVO.java @@ -0,0 +1,57 @@ +package com.example.demo.vo; + +import java.io.Serializable; + +/** + * @author shiwen.wy + * @date 2023/12/3 21:34 + */ +public class StudentVO implements Serializable { + private static final long serialVersionUID = -5867299542194532786L; + + private long id; + + private String name; + + private int age; + + private int score; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public int getScore() { + return score; + } + + public void setScore(int score) { + this.score = score; + } + + @Override + public String toString() { + return "StudentVO{" + "id=" + id + ", name='" + name + '\'' + ", age=" + + age + ", score=" + score + '}'; + } +} diff --git a/java/demo/src/main/resources/application.properties b/java/demo/src/main/resources/application.properties new file mode 100644 index 0000000..ab9c20c --- /dev/null +++ b/java/demo/src/main/resources/application.properties @@ -0,0 +1,41 @@ + +# ??????????MyBatis?? +# ??Mybatis?Mapper?? +mybatis.mapper-locations=classpath:mappers/*xml +# ??Mybatis????? +mybatis.type-aliases-package=com.example.demo.entity +mybatis.configuration.map-underscore-to-camel-case=true + +# ???? WEB ???? +server.port=8082 + + +#************H2 Begin**************** +# ????MySql???? +spring.datasource.schema=classpath:schema.sql +# ?????MySql????? +spring.datasource.data=classpath:data.sql + +#remote visit +spring.h2.console.settings.web-allow-others=true +# console url?Spring???????? http://127.0.0.1:8080/h2-console ????? +spring.h2.console.path=/h2-console + +# default true??????????????????????????? http://www.h2database.com/html/tutorial.html?highlight=Mac&search=mac#firstFound +spring.h2.console.enabled=true +spring.h2.console.settings.trace=true + +# ??????????? file????????? +spring.datasource.url=jdbc:h2:file:~/test +# ??????????????? +spring.datasource.username=san +spring.datasource.password= +# ??Driver???Driver??????? +spring.datasource.driver-class-name=org.h2.Driver + + + + + + + diff --git a/java/demo/src/main/resources/data.sql b/java/demo/src/main/resources/data.sql new file mode 100644 index 0000000..4687bc3 --- /dev/null +++ b/java/demo/src/main/resources/data.sql @@ -0,0 +1,3 @@ +INSERT INTO `student` VALUES ('0', '张三', 11, 90); +INSERT INTO `student` VALUES ('1', '少杰', 12, 89); +INSERT INTO `student` VALUES ('10', '赵子龙', 10, 87); \ No newline at end of file diff --git a/java/demo/src/main/resources/mappers/StudentMapper.xml b/java/demo/src/main/resources/mappers/StudentMapper.xml new file mode 100644 index 0000000..11e8ef8 --- /dev/null +++ b/java/demo/src/main/resources/mappers/StudentMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/java/demo/src/main/resources/schema.sql b/java/demo/src/main/resources/schema.sql new file mode 100644 index 0000000..da19258 --- /dev/null +++ b/java/demo/src/main/resources/schema.sql @@ -0,0 +1,8 @@ +DROP TABLE IF EXISTS `student`; +CREATE TABLE `student` +( + `id` int(225), + `name` varchar(225), + `age` int(11), + `score` int(11) +); \ No newline at end of file diff --git a/java/demo/src/main/resources/static/index.html b/java/demo/src/main/resources/static/index.html new file mode 100644 index 0000000..e2d94a2 --- /dev/null +++ b/java/demo/src/main/resources/static/index.html @@ -0,0 +1,6 @@ + + +

hello word!!!

+

this is a html page

+ + \ No newline at end of file diff --git a/java/demo/src/test/java/com/example/demo/DemoApplicationTests.java b/java/demo/src/test/java/com/example/demo/DemoApplicationTests.java new file mode 100644 index 0000000..eaa9969 --- /dev/null +++ b/java/demo/src/test/java/com/example/demo/DemoApplicationTests.java @@ -0,0 +1,13 @@ +package com.example.demo; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class DemoApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/java/img.png b/java/img.png new file mode 100644 index 0000000000000000000000000000000000000000..e8332199529725ba9422d17c7b2c000b2c28e45b GIT binary patch literal 121754 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 Date: Mon, 4 Dec 2023 01:11:15 +0800 Subject: [PATCH 3/4] java codeing style guide --- java/README_en.md | 3 +++ java/README_zh.md | 3 +++ 2 files changed, 6 insertions(+) diff --git a/java/README_en.md b/java/README_en.md index 1fd528c..a8a3600 100644 --- a/java/README_en.md +++ b/java/README_en.md @@ -68,6 +68,9 @@ If it is a small entrepreneurial project, we recommend using the single applicat - data source: druid、c3p0 - http: OkHttp、Apache HttpClient - redis: jedis、redisson +- config: zookeeper、nacos、apollo +- MQ: rocketMQ、kafka +- RPC: dubbo、spring cloud ## log The application cannot directly use the API in the log system (Log4j, Logback), but should rely on the API in the log framework SLF4J, and use the log framework in the facade mode, which is conducive to maintenance and the unity of log processing methods of each class diff --git a/java/README_zh.md b/java/README_zh.md index ca9a079..8989aaf 100644 --- a/java/README_zh.md +++ b/java/README_zh.md @@ -68,6 +68,9 @@ - 数据源: druid、c3p0 - http: OkHttp、Apache HttpClient - redis: jedis、redisson +- 配置: zookeeper、nacos、apollo +- MQ: rocketMQ、kafka +- RPC: dubbo、spring cloud ## 日志 应用中不可直接使用日志系统(Log4j、Logback)中的 API,而应依赖使用日志框架 SLF4J 中的 API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一 From 9646a5f7f72c71a293dd7350e7adb2f31d48825b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cshiwenwy=E2=80=9D?= Date: Tue, 5 Dec 2023 23:03:04 +0800 Subject: [PATCH 4/4] java codeing style guide --- java/README_en.md | 32 ++++++++++++------- java/README_zh.md | 32 ++++++++++++------- .../src/main/resources/application.properties | 14 ++------ ...ionTests.java => DemoApplicationTest.java} | 2 +- 4 files changed, 44 insertions(+), 36 deletions(-) rename java/demo/src/test/java/com/example/demo/{DemoApplicationTests.java => DemoApplicationTest.java} (86%) diff --git a/java/README_en.md b/java/README_en.md index a8a3600..c0cdf85 100644 --- a/java/README_en.md +++ b/java/README_en.md @@ -49,7 +49,7 @@ If it is a small entrepreneurial project, we recommend using the single applicat ![img.png](img.png) -### Benchmarks +### Application Development Benchmarks - Hierarchical architecture, as shown in the figure above, the upper layer depends on the lower layer, and the lower layer shields the processing details of the upper layer, and each layer performs its own duties and separates the concerns - Don't add entities if you don't have to. Domain model has high requirements for design ability, and if it is not used well, a wrong abstraction is better than no abstraction - Do not rely on SNAPSHOT versions for online applications @@ -57,20 +57,28 @@ If it is a small entrepreneurial project, we recommend using the single applicat - Keep code styles consistent within the same project - During system design, the system should rely on abstract classes and interfaces as much as possible according to the dependency inversion principle, which is conducive to expansion and maintenance +### Framework Development Benchmark +- Modular design, each module is responsible for relatively independent functions, such as network is responsible for network,exception module is responsible for exception processing +- Consider scalability, abstract interfaces for important modules, provide plug-ins or SPI forms, and facilitate other developers to add extensions later +- Design robust error handling mechanisms that provide meaningful error information for easy troubleshooting +- Take into account that users may use different versions of Java and other related libraries to ensure that the framework can run properly in a variety of environments +- Write adequate unit tests and integration tests to ensure that all parts of the framework are working properly +- Provide development demo to reduce user access + ## Common Third-party Libraries - Application development framework: spring boot -- Scheduled task: quartz、elastic job、spring task scheduling -- log: log4j、logback、log4j2 -- test: junit、testng、mockito、spring test +- Scheduled task: quartz +- log: log4j2 +- test: mockito - arweave sdk: arseedingsdk4j-sdk - ethereum sdk: web3j -- json: jackson、gson、fastjson -- data source: druid、c3p0 -- http: OkHttp、Apache HttpClient -- redis: jedis、redisson -- config: zookeeper、nacos、apollo -- MQ: rocketMQ、kafka -- RPC: dubbo、spring cloud +- json: jackson +- data source: druid +- http: OkHttp +- redis: jedis +- config: nacos +- MQ: rocketMQ +- RPC: spring cloud ## log The application cannot directly use the API in the log system (Log4j, Logback), but should rely on the API in the log framework SLF4J, and use the log framework in the facade mode, which is conducive to maintenance and the unity of log processing methods of each class @@ -158,6 +166,6 @@ alibaba java coding guidelines written very detailed, here to write some daily d - The decimal type is decimal. float and double are prohibited - varchar is a variable length character string with a maximum length of 5000. If the stored length exceeds this value, use text and list it independently - Three required fields in the table are id, create_time, update_time -- Do not use count(column name) or count(constant) instead of count(*), count(*) is the syntax for the standard count of rows defined in SQL92, independent of the database, NULL and non-null +- Do not use count(column name) or count(constant) instead of count(\*), count(*) is the syntax for the standard count of rows defined in SQL92, independent of the database, NULL and non-null - If all the values in a column are NULL, count(col) returns 0, but sum(col) returns NULL. Therefore, pay attention to NPE problems when using sum() If the -in operation can be avoided, avoid it. If it cannot be avoided, carefully evaluate the number of set elements behind the in operation and control it within 1000 \ No newline at end of file diff --git a/java/README_zh.md b/java/README_zh.md index 8989aaf..3544d23 100644 --- a/java/README_zh.md +++ b/java/README_zh.md @@ -49,7 +49,7 @@ ![img.png](img.png) -### 基准 +### 应用开发基准 - 分层架构,如上图,上层依赖下层,下层对上层屏蔽处理细节,每一层各司其职,分离关注点 - 如无必要勿增实体. 领域模型对设计能力要求很高,没把握用好,一个错误的抽象还不如不抽象 - 线上应用不要依赖 SNAPSHOT 版本 @@ -57,20 +57,28 @@ - 同一个项目中代码风格保持一致 - 系统设计时,根据依赖倒置原则,尽量依赖抽象类与接口,有利于扩展与维护 +### 框架开发基准 +- 模块化设计,每个模块要负责相对独立的功能,如network专门负责网络,exception模块专门负责异常处理 +- 考虑可扩展性,对重要模块抽象接口,提供插件或者SPI的形式,方便后续其他开发者添加扩展 +- 设计健壮的错误处理机制,提供有意义的错误信息,方便用户排查问题 +- 考虑到用户可能使用不同版本的Java和其他相关库,确保框架能够在多种环境下正常运行 +- 编写充分的单元测试和集成测试,确保框架的各个部分都能正常工作 +- 提供开发demo, 减低用户使用门槛 + ## 通用三方库 - 应用开发框架: spring boot -- 定时任务: quartz、elastic job、spring task scheduling -- 日志: log4j、logback、log4j2 -- 测试: junit、testng、mockito、spring test +- 定时任务: quartz +- 日志: log4j2 +- 测试: mockito - arweave sdk: arseedingsdk4j-sdk - ethereum sdk: web3j -- json: jackson、gson、fastjson -- 数据源: druid、c3p0 -- http: OkHttp、Apache HttpClient -- redis: jedis、redisson -- 配置: zookeeper、nacos、apollo -- MQ: rocketMQ、kafka -- RPC: dubbo、spring cloud +- json: jackson +- 数据源: druid +- http: OkHttp +- redis: jedis +- 配置: nacos +- MQ: rocketMQ +- RPC: spring cloud ## 日志 应用中不可直接使用日志系统(Log4j、Logback)中的 API,而应依赖使用日志框架 SLF4J 中的 API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一 @@ -155,6 +163,6 @@ if (logger.isDebugEnabled()) { - 小数类型为decimal,禁止使用float和double - varchar为变长字符串,长度不要超过5000,如果存储长度超过该值,使用text,并独立表出来 - 表必备三字段:id, create_time, update_time -- 不要使用count(列名)或count(常量)来替代count(*),count(*)是SQL92定义的标 准统计行数的语法,跟数据库无关,跟NULL和非 NULL无关 +- 不要使用count(列名)或count(常量)来替代count(\*),count(*)是SQL92定义的标 准统计行数的语法,跟数据库无关,跟NULL和非 NULL无关 - 当某一列的值全是NULL时,count(col)的返回结果为0,但 sum(col)的返回结果为 NULL,因此使用sum()时需注意NPE问题 - in操作能避免则避免,若实在避免不了,需要仔细评估 in后边的集合元素数量,控制在1000个之内 \ No newline at end of file diff --git a/java/demo/src/main/resources/application.properties b/java/demo/src/main/resources/application.properties index ab9c20c..26b605c 100644 --- a/java/demo/src/main/resources/application.properties +++ b/java/demo/src/main/resources/application.properties @@ -1,36 +1,28 @@ -# ??????????MyBatis?? -# ??Mybatis?Mapper?? mybatis.mapper-locations=classpath:mappers/*xml -# ??Mybatis????? mybatis.type-aliases-package=com.example.demo.entity mybatis.configuration.map-underscore-to-camel-case=true -# ???? WEB ???? server.port=8082 #************H2 Begin**************** -# ????MySql???? spring.datasource.schema=classpath:schema.sql -# ?????MySql????? spring.datasource.data=classpath:data.sql #remote visit spring.h2.console.settings.web-allow-others=true -# console url?Spring???????? http://127.0.0.1:8080/h2-console ????? +# console url http://127.0.0.1:8082/h2-console spring.h2.console.path=/h2-console -# default true??????????????????????????? http://www.h2database.com/html/tutorial.html?highlight=Mac&search=mac#firstFound + spring.h2.console.enabled=true spring.h2.console.settings.trace=true -# ??????????? file????????? + spring.datasource.url=jdbc:h2:file:~/test -# ??????????????? spring.datasource.username=san spring.datasource.password= -# ??Driver???Driver??????? spring.datasource.driver-class-name=org.h2.Driver diff --git a/java/demo/src/test/java/com/example/demo/DemoApplicationTests.java b/java/demo/src/test/java/com/example/demo/DemoApplicationTest.java similarity index 86% rename from java/demo/src/test/java/com/example/demo/DemoApplicationTests.java rename to java/demo/src/test/java/com/example/demo/DemoApplicationTest.java index eaa9969..e06a811 100644 --- a/java/demo/src/test/java/com/example/demo/DemoApplicationTests.java +++ b/java/demo/src/test/java/com/example/demo/DemoApplicationTest.java @@ -4,7 +4,7 @@ import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest -class DemoApplicationTests { +class DemoApplicationTest { @Test void contextLoads() {