jomoo-mall问题梳理
<h1>代码</h1>
<ol>
<li>
<p>常量命名用大写字母,单词间用下划线隔开,注意单词正确拼写</p>
<blockquote>
<p><font color=green>正例:</font>FAIL / PARAM_NULL
<font color=red>反例:</font>FIAL / PARAMNULL</p>
</blockquote>
</li>
<li>
<p>类命名使用UpperCamelCase风格(驼峰形式,首字母大写)</p>
<blockquote>
<p><font color=green>正例:</font>C2FOrderModel
<font color=red>反例:</font>c2fOrderModel</p>
</blockquote>
</li>
<li>
<p>方法、参数、变量命名使用lowerCamelCase风格(驼峰形式,首字母小写)</p>
<blockquote>
<p><font color=green>正例:</font>String payType
<font color=red>反例:</font>String PayType</p>
</blockquote>
</li>
<li>
<p>字段字典定义需统一,项目有的使用枚举设置,也有的使用常量设置</p>
<pre><code class="language-java">public static final String STATE_YES = "1";
public static final String STATE_NO = "2";</code></pre>
<pre><code class="language-java">public enum BankEnum {
GSBANK("1", "中国工商银行"),
ZSBANK("2","招商银行"),
}</code></pre>
</li>
<li>
<p>枚举的使用规范最好统一,比如有时候value表示值,而有时候又表示键名,状态码如果数字是不是应该使用int整型</p>
<pre><code class="language-java">
public enum BankEnum {
GSBANK("1", "中国工商银行"),
ZSBANK("2","招商银行"),
NYBANK("3", "中国农业银行"),
JSBANK("4", "中国建设银行"),
ZGBANK("5", "中国银行"),
JTBANK("6", "交通银行"),
MSBANK("7", "中国民生银行"),
ZXBANK("8", "中信银行"),
GDBANK("9", "中国光大银行"),
XYBANK("10", "兴业银行");
private String key = "";
private String value = "";
private BankEnum(String key, String value) {
this.key = key;
this.value = value;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}```
```java
public enum OntrialOrderStatusEnum {
WAITSTOREAUDIT("等待商户审核", "1"),
STOREAUDITNOPASS("申请失败", "2"),
WAITPAY("等待付款", "3"),
WAITPLEDGE("等待支付定金", "4"),
WAITPAYLAST("等待支付尾款", "5"),
WAITSHIP("等待卖家发货", "6"),
PREPARESHIP("卖家备货中", "7"),
SHIPPING("卖家已发货", "8"),
WAITFILLREPORT("待填写试用报告", "9"),
REPORTWAITAUDIT("试用报告待审核", "10"),
REPORTPASS("试用报告审核通过", "11"),
REPORTNOPASS("试用报告审核不通过", "12"),
ORDERSUCCESS("交易成功", "13"),
ORDERFAIL("交易关闭", "14"),;
String value = "";
String name = "";
private OntrialOrderStatusEnum(String name, String value) {
this.name = name;
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}```</code></pre>
</li>
<li>
<p>避免使用Apache BeanUtils进行属性copy</p>
<blockquote>
<p>Apache BeanUtils的copyProperties的效率不高,可以使用Spring BeanUtils</p>
</blockquote>
</li>
<li>
<p>通过类名来访问常量</p>
<pre><code class="language-java">
public int getNoValueSize() {
if(valueList!=null && valueList.size()>0 && this.NO.equals(type)){
return valueList.size()-1;
}
return noValueSize;
}```</code></pre>
</li>
<li>
<p>注意SimpleDateFormat线程不安全</p>
<blockquote>
<p>DateUtil中使用SimpleDateFormat作为常量,当并发执行时会出现线程安全问题,可以考虑使用ThreadLocal来避免线程不安全问题</p>
</blockquote>
</li>
<li>
<p>注意空字符串与空的使用,定义字符串不需要都初始化一个空字符串</p>
<blockquote>
<p><font color=green>正例:</font>String str = null;
<font color=red>反例:</font>String str = "";</p>
</blockquote>
</li>
<li>
<p>注意可能引起空指针异常,有的代码没有对可能空进行处理,尤其是控制器代码和接口入口代码</p>
<blockquote>
<p>对象使用前可以增加!=null判断</p>
</blockquote>
</li>
<li>涉及到对接第三方系统的代码,应该说明所应的整体业务流程和对接情况</li>
</ol>
<h1>框架</h1>
<ol>
<li>
<p>POJO类参数避免使用基础数据类型、设置初始值,它影响到Dao层对model属性的判断(查询使用QueryModel,而QueryModel继承了表model,当需要判断参数是否传递就无从下手)</p>
<pre><code class="language-java">
// 生成结算单日期
private String fzDate = "";
// 分账备注
private String fzNote = "";
/* 店铺评价状态 初始值:0,待评价:1,已评价:2*/
private String commentState = "0";
/* 是否已经全晒单:0-未全晒单;1-已全晒单*/
private String showPicState = "0";
/* 是否已经全评论:0-未全评论;1-已全评论*/
private String appraiseState = "0";
/* 试用报告是否填写:0-未填写;1-已填写*/
private String ontrialReportState = "0";
/* 试用报告是否审核:0-未审核;1-审核通过;2-审核不通过*/
private String ontrialReportAuditState = "0";```</code></pre>
</li>
<li>
<p>数据模型基类最好不要包含那么多跟表无关的东西,调用接口返回时就会带上这些信息且浪费资源</p>
<blockquote>
<p>接口返回JSON包含无效信息:"sortType":"desc","sortName":"uuid","mapCondition":{}</p>
</blockquote>
</li>
<li>
<p>没有统一的异常捕获处理,当需要判断业务</p>
<blockquote>
<p>比如service层可以抛出业务异常,统一捕获响应前端需要的数据和错误信息</p>
</blockquote>
</li>
<li>
<p>代码位置应该清晰,基础的service、dao、entity最好跟业务代码隔离放到不同的大目录,controller的包过于混乱,最好按业务分类而不是表分类</p>
</li>
<li>
<p>Properties文件杂乱,当我需要放一个配置不知道应该写在哪个文件</p>
</li>
<li>
<p>应该统一日志框架,项目同时使用logback和log4j</p>
</li>
<li>
<p>Dao层数据库操作实现类所有方法都应该有对应的实现,即使已经在缓存类中实现了</p>
</li>
<li>制定文件存储规则及对应的访问说明</li>
</ol>
<blockquote>
<p>当前系统目前有两个文件存储方式,MogileFS和Ftp,应该说明应该什么场景使用哪个</p>
</blockquote>
<h1>接口</h1>
<ol>
<li>
<p>用户信息不是根据登录token来获取,仅仅是根据前端传递,一旦知道数据的加密方式,用户的登录变得毫无意义,可以随便操作其他用户的数据</p>
</li>
<li>
<p>接口的token校验没有统一处理,而是在每个接口函数上加校验代码</p>
</li>
<li>
<p>响应数据格式统一</p>
<blockquote>
<p>应规定:</p>
<ul>
<li>分页参数名(如页码、页数、总行数)</li>
<li>字段是放到根位置还是包装到如data下</li>
<li>列表数据参数名</li>
<li>空值要不要返回,如果要是返回空还是空串</li>
</ul>
</blockquote>
</li>
<li>分页请求时,应规定页码是从0还是1开始,如果是0或者无效页码应该返回错误还是其他</li>
</ol>
<h1>后台前端</h1>
<ol>
<li>
<p>主框架可以使用iframe方式,当前使用单页方式,每次打开页面都要加载一次菜单而且慢</p>
</li>
<li>
<p>应做常用功能的范例供开发者去参考,保证输出的用户体验一致</p>
<blockquote>
<p>比如:按钮的颜色、常用按钮所使用的字体图标、异步处理时是否有加载动画</p>
</blockquote>
</li>
<li>第三方插件应该统一存储目录,现在存在相同资源存在于多个目录</li>
</ol>
<h1>数据库</h1>
<ol>
<li>
<p>日期类型的字段为啥使用varchar?</p>
</li>
<li>
<p>字段的长度很随意,最好根据业务需求去设置</p>
<blockquote>
<p>比如所有字符类型基本用varchar(255)</p>
</blockquote>
</li>
<li>表的关联关系、字段的约束最好设置,保证数据的可靠性
<blockquote>
<p>测试环境就存在很多脏数据,影响对BUG的判断</p>
</blockquote></li>
</ol>