zoukankan      html  css  js  c++  java
  • 项目反思

    数据库:
    1.表里记录createTime/updateTime/creator/updator
    2.数据库自带插入时间和更新时间功能,create_time 自动插入,update_time 自动更新时间。貌似用项目传输时间更好,避免服务器和数据时间不统一等问题。
    3.LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
    4.在mybatis配置文件中不能有parameterMap,应该是parameterType
    5.SQL条件查询中:防止某些list为空,查询所有记录的问题
    7.重要的数据。记录操作历史,操作人
    8.统一常用数据库字段:命名,值(男女,是否删除)等。
    9.使用datetime,不适用timestamp,时间由程序传过去,而不是使用数据库方法。
    10.尽量创建关联关系表,不要通过分隔符将多个数据存储在一个字段里。
    11.尽量采用单表查询,减少联合查询,降低数据库IO。
    12.批量插入/更新时使用批量语句,不要循环插入。
    13.多个表数据更新/插入时,一定要考虑是否需要事务。
    14.查出来的数据一般要有排序,可以按主键或创建时间排序等
    15.自动分页:通过分页拦截器进行分页操作,返回分页的封装对象。
    16.不推荐使用外键。
    17.修复valid脏数据的方法。现将值为0的数据设置为3,然后修复值为1的数据为0.再将值为3的数据统一改成
    18.@Param("vo") 定义xml中属性名称
    19.XML的SQL中,避免出现list的子项中的item名字,跟其他字段相同。
    20.XML中判断list的值是否为null,是否为空集合。


    代码:
    1.对单独记录进行操作的时候,一定要验证当前记录的状态,避免误操作多次单击。一般方法有两种,forupdate和redis。forupdate需要加过期时间。
    2.某些字段唯一的(如手机号),在保存前一定要验证手机号是否存在,并且数据库字段设置字段唯一
    3.事务处理:@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Exception.class, timeout = 10)
    4.枚举:有获取列表的方法;获取code值尽量简单,常比较,避免出错。
    5.BeanMapper.copy():DozerBeanMapper dozer = new DozerBeanMapper(); dozer.map(source, destinationObject);
    6.登录时将信息缓存到redis中,退出登录时,将登录信息从redis中删除。
    7.cookie登录(App端携带header),拦截器去缓存中验证是否有登录信息。
    8.DTO对象以及返回对象,都需要实现Serializable接口。
    9.dubbo 接口一般返回封装好的对象。方便以后修改结构,而不用修改接口参数。
    10.提供前端接口返回值,一般是封装成一个对象。所有返回结果都封装在ResponseDTO T data(返回数据)/int rc(return code)/String msg(返回信息)
    11.自动分页:通过分页拦截器进行分页操作,返回分页的封装对象。
    12.常用公共类放到一个jar包里
    13.一般为了不破坏实体类和数据库表一一对应的接口,我们会新建一个DTO(Data Transfer Object)作为前后端的传输对象。DTO实体类中加入一些冗余的字段。例如:cityName等。
    14.通过spring配置加载一些properties文件,在java代码中通过 @Value("${oss.accessKeyId}")的形式直接注入属性值
    <!-- 配置文件加载 -->
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="order" value="1"/>
    <property name="ignoreUnresolvablePlaceholders" value="true"/>
    <property name="locations">
    <list>
    <value>classpath:server.properties</value>
    </list>
    </property>
    </bean>
    15.代码自动生成工具
    16.Amber、postmain模拟测试工具
    17.密码加密
    18.工具类
    19.枚举类
    20.记录操作历史记录:例如记录一个状态的变迁历史
    21.自定义异常,封装要返回的内容
    22.通过ThreadLocal传递当前用户主键
    23.详细的注释
    24.通过继承,继承一些封装好的方法。例如:返回值 success("添加新用户成功",count);
    25.通过日志文件,将日志记录内容,精确到方法的位置。
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    <pattern>[%thread] %-5level %d{yyyy-MM-dd HH:mm:ss.SSS} %logger{5}.%M[%L] - %msg%n</pattern>
    </encoder>
    26.记录操作历史记录
    27.编写默认回复给前台的代码,通过继承等方式,避免每次新写。
    28.版本升级提示,换行。可以在文本中换行完毕后,直接粘贴进去
    29.pom.xml某些依赖文件提示missing,可能需要加仓库地址
    30.只做逻辑删除,不做物理删除,使用valid标识,默认0无效。
    31.json格式传递复合对象(@RequestBody EmployeeDTO employeeDTO)
    32.一个tomcat部署一个应用,部署到ROOT
    33.指定堆内存大小配置-Xms512m –Xmx512m
    34.内网dev/test所有tomcat打开远程调试端口
    35.dubbo接口有变化时,需要升级api版本号,开发前提前约定版本号,deploy到maven私服。(目前内部系统不强制要求,但对外提供接口系统必须区分版本号)
    36.远程调试功能
    37.前端按钮被单击后,应该置灰,防止多次点击。后端要验证是否重复提交。forupdate 或 redis
    38.完善的注释
    39.分布式系统事务,请求先落地,通过status标识请求状态,单一系统内保证事务。异常状态处理人工介入。
    40.适当的冗余字段
    41.改动原有接口时,一定要确保以前功能正常工作。修改数据库时,应该考虑对原代码的影响。
    42.服务器部署环境:开发,测试,公测,生产
    43.项目结构:app,web,erp
    44.灰度上线:连接生产数据库,但只对内部人员提供服务
    45.配置文件profile保存:aliyun,test,dev,dev1,dev2……
    46.版本管理:master,dev,新功能,bug修复,上线打tag


    日志:
    1.敏感数据打***,身份证/银行卡号/密码
    2.统一使用slf4j+logback。线上日志统一 /home/car-league/logs/项目/info.log+error.log
    3.未知异常记录堆栈信息方便调试;已知异常(自定义异常,密码错误等)记录异常信息即可。
    4.日志记录,记录当前用户的主键,方便以后查看日志。记录所有入参和出参数。
    5.日志编辑器:private static Logger logger = LoggerFactory.getLogger(EmployeeController.class);

  • 相关阅读:
    魅族Flyme OS使用小技巧
    Android应用里面调用Google Earth应用
    关于连接网络时抛出“android.os.NetworkOnMainThreadException”异常问题
    《深入理解计算机系统》实验一 —Data Lab
    《深入理解计算机系统》(CSAPP)读书笔记 —— 第一章 计算机系统漫游
    使用 VB.NET 封装 Javascript 常用功能(这是在asp.net中的)
    Net线程问题解答
    线程同步
    利用辅助线程更新用户界面UI
    FFMPEG参数说明
  • 原文地址:https://www.cnblogs.com/Jtianlin/p/5741597.html
Copyright © 2011-2022 走看看