nisbos


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 &amp;&amp; valueList.size()&gt;0 &amp;&amp; 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 = &quot;&quot;;</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包含无效信息:&quot;sortType&quot;:&quot;desc&quot;,&quot;sortName&quot;:&quot;uuid&quot;,&quot;mapCondition&quot;:{}</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>

页面列表

ITEM_HTML