<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel> 
    <title>WISINA.BLOG</title> 
    <link>http://wisina.top</link> <description>
      博客知识分享，欢迎交流学习
    </description> 
    <copyright>
      鑫惜源2020-2026
    </copyright> 
    <lastBuildDate>
      2020-04-26 00:39:00
    </lastBuildDate> 
    <item> 
      <title>3-服务器</title> <description><![CDATA[ <p>
            <span style="line-height:2;font-size:16px;">1.【推荐】高并发服务器建议调小 TCP 协议的 time_wait 超时时间。</span>
          </p>
          <p>
          <span style="line-height:2;font-size:16px;">说明：操作系统默认 240 秒后，才会关闭处于 time_wait 状态的连接，在高并发访问下，服务器端会因为处于 time_wait 的连接数太多，可能无法建立新的连接，所以需要在服务器上调小此等待值。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">正例：在 linux 服务器上请通过变更/etc/sysctl.conf 文件去修改该缺省值（秒）：</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">net.ipv4.tcp_fin_timeout = 30</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">2.【推荐】调大服务器所支持的最大文件句柄数（File Descriptor，简写为 fd）。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：主流操作系统的设计是将 TCP/UDP 连接采用与文件一样的方式去管理，即一个连接对应于一个 fd。主流的 linux 服务器默认所支持最大 fd 数量为 1024，当并发连接数很大时很</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">容易因为 fd 不足而出现“open too many files”错误，导致新的连接无法建立。 建议将 linux</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">服务器所支持的最大句柄数调高数倍（与服务器的内存数量相关）。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">3.【推荐】给 JVM 环境参数设置-XX:+HeapDumpOnOutOfMemoryError 参数，让 JVM 碰到 OOM 场景时输出 dump 信息。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：OOM 的发生是有概率的，甚至相隔数月才出现一例，出错时的堆内信息对解决问题非常有帮助。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">4.【推荐】在线上生产环境，JVM 的 Xms 和 Xmx 设置一样大小的内存容量，避免在 GC 后调整堆大小带来的压力。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">5.【参考】服务器内部重定向使用 forward；外部重定向地址使用 URL 拼装工具类来生成，否则会带来 URL 维护不一致的问题和潜在的安全风险。</span>
        </p>
        <p>
          <br />
        </p>
        ]]>
      </description> 
      <link>http://wisina.top/index.php?m=blog&amp;f=view&amp;t=xml&amp;articleID=23</link> <category>
        工程结构
      </category> 
      <pubDate>
        2020-04-26 00:39:00 +0800
      </pubDate> 
    </item> 
    <item> 
      <title>2-二方库依赖</title> <description><![CDATA[ <p>
            <span style="line-height:2;font-size:16px;">1.【强制】定义 GAV 遵从以下规则：</span>
          </p>
          <p>
          <span style="line-height:2;font-size:16px;">1）GroupID 格式：com.{公司/BU }.业务线 [.子业务线]，最多 4 级。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：{公司/BU} 例如：alibaba/taobao/tmall/aliexpress 等 BU 一级；子业务线可选。正例：com.taobao.jstorm 或 com.alibaba.dubbo.register</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">2）ArtifactID 格式：产品线名-模块名。语义不重复不遗漏，先到中央仓库去查证一下。正例：dubbo-client / fastjson-api / jstorm-tool</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">3）Version：详细规定参考下方。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">2.【强制】二方库版本号命名方式：主版本号.次版本号.修订号</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">1）主版本号：产品方向改变，或者大规模 API 不兼容，或者架构不兼容升级。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">2）次版本号：保持相对兼容性，增加主要功能特性，影响范围极小的 API 不兼容修改。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">3）修订号：保持完全兼容性，修复 BUG、新增次要功能特性等。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：注意起始版本号必须为：1.0.0，而不是 0.0.1 正式发布的类库必须先去中央仓库进行查证，使版本号有延续性，正式版本号不允许覆盖升级。如当前版本：1.3.3，那么下一个合理的版本号：1.3.4 或 1.4.0 或 2.0.0</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">3.【强制】线上应用不要依赖 SNAPSHOT 版本（安全包除外）。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：不依赖 SNAPSHOT 版本是保证应用发布的幂等性。另外，也可以加快编译时的打包构建。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">4.【强制】二方库的新增或升级，保持除功能点之外的其它 jar 包仲裁结果不变。如果有改变， 必须明确评估和验证，建议进行 dependency:resolve 前后信息比对，如果仲裁结果完全不一致，那么通过 dependency:tree 命令，找出差异点，进行&lt;excludes&gt;排除 jar 包。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">5.【强制】二方库里可以定义枚举类型，参数可以使用枚举类型，但是接口返回值不允许使用枚举类型或者包含枚举类型的 POJO 对象。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">6.【强制】依赖于一个二方库群时，必须定义一个统一的版本变量，避免版本号不一致。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：依赖 springframework-core,-context,-beans，它们都是同一个版本，可以定义一个变量来保存版本：${spring.version}，定义依赖的时候，引用该版本。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">7.【强制】禁止在子项目的 pom 依赖中出现相同的 GroupId，相同的 ArtifactId，但是不同的Version。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：在本地调试时会使用各子项目指定的版本号，但是合并成一个 war，只能有一个版本号出现在最后的 lib 目录中。可能出现线下调试是正确的，发布到线上却出故障的问题。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">8.【推荐】所有 pom 文件中的依赖声明放在&lt;dependencies&gt;语句块中，所有版本仲裁放在</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">&lt;dependencyManagement&gt;语句块中。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：&lt;dependencyManagement&gt;里只是声明版本，并不实现引入，因此子项目需要显式的声明依赖，version 和 scope 都读取自父 pom。而&lt;dependencies&gt;所有声明在主 pom 的</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">&lt;dependencies&gt;里的依赖都会自动引入，并默认被所有的子项目继承。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">9.【推荐】二方库不要有配置项，最低限度不要再增加配置项。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">10.【参考】为避免应用二方库的依赖冲突问题，二方库发布者应当遵循以下原则：</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">1）精简可控原则。移除一切不必要的 API 和依赖，只包含 Service API、必要的领域模型对象、Utils 类、常量、枚举等。如果依赖其它二方库，尽量是 provided 引入，让二方库使用者去依赖具体版本号；无 log 具体实现，只依赖日志框架。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">2）稳定可追溯原则。每个版本的变化应该被记录，二方库由谁维护，源码在哪里，都需要能方便查到。除非用户主动升级版本，否则公共二方库的行为不应该发生变化。</span>
        </p>
        ]]>
      </description> 
      <link>http://wisina.top/index.php?m=blog&amp;f=view&amp;t=xml&amp;articleID=22</link> <category>
        工程结构
      </category> 
      <pubDate>
        2020-04-26 00:38:00 +0800
      </pubDate> 
    </item> 
    <item> 
      <title>1-应用分层</title> <description><![CDATA[ <p>
            <span style="line-height:2;font-size:16px;">1.【推荐】图中默认上层依赖于下层，箭头关系表示可直接依赖，如：开放接口层可以依赖于</span>
          </p>
          <p>
          <span style="line-height:2;font-size:16px;">Web 层，也可以直接依赖于 Service 层，依此类推：</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">开放接口层：可直接封装 Service 方法暴露成 RPC 接口；通过 Web 封装成 http 接口；进行网关安全控制、流量控制等。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">终端显示层：各个端的模板渲染并执行显示的层。当前主要是 velocity 渲染，JS 渲染，</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">JSP 渲染，移动端展示等。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">Web 层：主要是对访问控制进行转发，各类基本参数校验，或者不复用的业务简单处理等。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">Service 层：相对具体的业务逻辑服务层。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">Manager 层：通用业务处理层，它有如下特征：</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">1）对第三方平台封装的层，预处理返回结果及转化异常信息；</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">2）对 Service 层通用能力的下沉，如缓存方案、中间件通用处理；</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">3）与 DAO 层交互，对多个 DAO 的组合复用。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">DAO 层：数据访问层，与底层 MySQL、Oracle、Hbase 等进行数据交互。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">外部接口或第三方平台：包括其它部门 RPC 开放接口，基础平台，其它公司的 HTTP 接口。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">2.【参考】 （分层异常处理规约）在 DAO 层，产生的异常类型有很多，无法用细粒度的异常进行 catch，使用 catch(Exception e)方式，并 throw new DAOException(e)，不需要打印日志，因为日志在 Manager/Service 层一定需要捕获并打印到日志文件中去，如果同台服务器再打日志，浪费性能和存储。在 Service 层出现异常时，必须记录出错日志到磁盘，尽可能带上参数信息，相当于保护案发现场。如果 Manager 层与 Service 同机部署，日志方式与 DAO 层处理一致，如果是单独部署，则采用与 Service 一致的处理方式。Web 层绝不应该继续往上抛异常，因为已经处于顶层，如果意识到这个异常将导致页面无法正常渲染，那么就应该直接</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">跳转到友好错误页面，加上用户容易理解的错误提示信息。开放接口层要将异常处理成错误码和错误信息方式返回。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">3.【参考】分层领域模型规约：</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">DO（Data Object）：此对象与数据库表结构一一对应，通过 DAO 层向上传输数据源对象。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">DTO（Data Transfer Object）：数据传输对象，Service 或 Manager 向外传输的对象。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">BO（Business Object）：业务对象，由 Service 层输出的封装业务逻辑的对象。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">AO（Application Object）：应用对象，在 Web 层与 Service 层之间抽象的复用对象模型， 极为贴近展示层，复用度不高。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">VO（View Object）：显示层对象，通常是 Web 向模板渲染引擎层传输的对象。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">Query：数据查询对象，各层接收上层的查询请求。注意超过 2 个参数的查询封装，禁止使用 Map 类来传输。</span>
        </p>
        ]]>
      </description> 
      <link>http://wisina.top/index.php?m=blog&amp;f=view&amp;t=xml&amp;articleID=21</link> <category>
        工程结构
      </category> 
      <pubDate>
        2020-04-26 00:37:00 +0800
      </pubDate> 
    </item> 
    <item> 
      <title>4-ORM映射</title> <description><![CDATA[ <p>
            <span style="line-height:2;font-size:16px;">1.【强制】在表查询中，一律不要使用 * 作为查询的字段列表，需要哪些字段必须明确写明。说明：1）增加查询分析器解析成本。2）增减字段容易与 resultMap 配置不一致。3）无用字段增加网络消耗，尤其是 text 类型的字段。</span>
          </p>
          <p>
          <span style="line-height:2;font-size:16px;">2.【强制】POJO 类的布尔属性不能加 is，而数据库字段必须加 is_，要求在 resultMap 中进行字段与属性之间的映射。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：参见定义 POJO 类以及数据库字段定义规定，在&lt;resultMap&gt;中增加映射，是必须的。在 MyBatis Generator 生成的代码中，需要进行对应的修改。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">3.【强制】不要用 resultClass 当返回参数，即使所有类属性名与数据库字段一一对应，也需要定义；反过来，每一个表也必然有一个 POJO 类与之对应。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：配置映射关系，使字段与 DO 类解耦，方便维护。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">4.【强制】sql.xml 配置参数使用：#{}，#param# 不要使用${} 此种方式容易出现 SQL 注入。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">5.【强制】iBATIS 自带的 queryForList(String statementName,int start,int size)不推荐使用。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：其实现方式是在数据库取到statementName 对应的SQL 语句的所有记录，再通过subList</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">取 start,size 的子集合。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">正例：Map&lt;String, Object&gt; map = new HashMap&lt;&gt;(); map.put("start", start);</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">map.put("size", size);</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">6.【强制】不允许直接拿 HashMap 与 Hashtable 作为查询结果集的输出。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：resultClass=”Hashtable”，会置入字段名和属性值，但是值的类型不可控。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">7.【强制】更新数据表记录时，必须同时更新记录对应的 gmt_modified 字段值为当前时间。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">8.【推荐】不要写一个大而全的数据更新接口。传入为 POJO 类，不管是不是自己的目标更新字段，都进行 update table set c1=value1,c2=value2,c3=value3; 这是不对的。执行 SQL 时，不要更新无改动的字段，一是易出错；二是效率低；三是增加 binlog 存储。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">9.【参考】@Transactional 事务不要滥用。事务会影响数据库的 QPS，另外使用事务的地方需要考虑各方面的回滚方案，包括缓存回滚、搜索引擎回滚、消息补偿、统计修正等。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">10.【参考】&lt;isEqual&gt;中的 compareValue 是与属性值对比的常量，一般是数字，表示相等时带上此条件；&lt;isNotEmpty&gt;表示不为空且不为 null 时执行；&lt;isNotNull&gt;表示不为 null 值时执行。</span>
        </p>
        <p>
          <br />
        </p>
        ]]>
      </description> 
      <link>http://wisina.top/index.php?m=blog&amp;f=view&amp;t=xml&amp;articleID=20</link> <category>
        MySQL
      </category> 
      <pubDate>
        2020-04-26 00:31:00 +0800
      </pubDate> 
    </item> 
    <item> 
      <title>3-SQL语句</title> <description><![CDATA[ <p>
            <span style="line-height:2;font-size:16px;">1.【强制】不要使用 count(列名)或 count(常量)来替代 count(*)，count(*)是 SQL92 定义的标准统计行数的语法，跟数据库无关，跟 NULL 和非 NULL 无关。</span>
          </p>
          <p>
          <span style="line-height:2;font-size:16px;">说明：count(*)会统计值为 NULL 的行，而 count(列名)不会统计此列为 NULL 值的行。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">2.【强制】count(distinct col) 计算该列除 NULL 之外的不重复行数，注意 count(distinct col1, col2) 如果其中一列全为 NULL，那么即使另一列有不同的值，也返回为 0。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">3.【强制】当某一列的值全是 NULL 时，count(col)的返回结果为 0，但 sum(col)的返回结果为NULL，因此使用 sum()时需注意 NPE 问题。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">正例：可以使用如下方式来避免 sum 的 NPE 问题：SELECT IF(ISNULL(SUM(g)),0,SUM(g)) FROM table;</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">4.【强制】使用 ISNULL()来判断是否为 NULL 值。说明：NULL 与任何值的直接比较都为 NULL。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">1）NULL&lt;&gt;NULL 的返回结果是 NULL，而不是 false。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">2）NULL=NULL 的返回结果是 NULL，而不是 true。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">3）NULL&lt;&gt;1 的返回结果是 NULL，而不是 true。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">5.【强制】在代码中写分页查询逻辑时，若 count 为 0 应直接返回，避免执行后面的分页语句。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">6.【强制】不得使用外键与级联，一切外键概念必须在应用层解决。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：以学生和成绩的关系为例，学生表中的 student_id 是主键，那么成绩表中的 student_id 则为外键。如果更新学生表中的 student_id，同时触发成绩表中的 student_id 更新，即为级联更新。外键与级联更新适用于单机低并发，不适合分布式、高并发集群；级联更新是强阻塞，存在数据库更新风暴的风险；外键影响数据库的插入速度。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">7.【强制】禁止使用存储过程，存储过程难以调试和扩展，更没有移植性。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">8.【强制】数据订正（特别是删除、修改记录操作）时，要先 select，避免出现误删除，确认无误才能执行更新语句。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">9.【推荐】in 操作能避免则避免，若实在避免不了，需要仔细评估 in 后边的集合元素数量，控制在 1000 个之内。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">10.【参考】如果有国际化需要，所有的字符存储与表示，均以 utf-8 编码，注意字符统计函数的区别。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">SELECT LENGTH("轻松工作")； 返回为 12</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">SELECT CHARACTER_LENGTH("轻松工作")； 返回为 4</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">如果需要存储表情，那么选择 utf8mb4 来进行存储，注意它与 utf-8 编码的区别。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">11.【参考】TRUNCATE TABLE 比 DELETE 速度快，且使用的系统和事务日志资源少，但 TRUNCATE</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">无事务且不触发 trigger，有可能造成事故，故不建议在开发代码中使用此语句。说明：TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同。</span>
        </p>
        ]]>
      </description> 
      <link>http://wisina.top/index.php?m=blog&amp;f=view&amp;t=xml&amp;articleID=19</link> <category>
        MySQL
      </category> 
      <pubDate>
        2020-04-26 00:30:00 +0800
      </pubDate> 
    </item> 
    <item> 
      <title>2-索引规约</title> <description><![CDATA[ <p>
            <span style="font-size:16px;line-height:2;">1.【强制】业务上具有唯一特性的字段，即使是多个字段的组合，也必须建成唯一索引。</span>
          </p>
          <p>
          <span style="font-size:16px;line-height:2;">说明：不要以为唯一索引影响了 insert 速度，这个速度损耗可以忽略，但提高查找速度是明显的；另外，即使在应用层做了非常完善的校验控制，只要没有唯一索引，根据墨菲定律，必然有脏数据产生。</span>
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">2.【强制】超过三个表禁止 join。需要 join 的字段，数据类型必须绝对一致；多表关联查询时， 保证被关联的字段需要有索引。</span>
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">说明：即使双表 join 也要注意表索引、SQL 性能。</span>
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">3.【强制】在 varchar 字段上建立索引时，必须指定索引长度，没必要对全字段建立索引，根据实际文本区分度决定索引长度即可。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">说明：索引的长度与区分度是一对矛盾体，一般对字符串类型数据，长度为 20 的索引，区分度会高达 90%以上，可以使用 count(distinct left(列名, 索引长度))/count(*)的区分度来确定。</span>
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">4.【强制】页面搜索严禁左模糊或者全模糊，如果需要请走搜索引擎来解决。</span>
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">说明：索引文件具有 B-Tree 的最左前缀匹配特性，如果左边的值未确定，那么无法使用此索引。</span>
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">5.【推荐】如果有 order by 的场景，请注意利用索引的有序性。order by 最后的字段是组合索引的一部分，并且放在索引组合顺序的最后，避免出现 file_sort 的情况，影响查询性能。正例：where a=? and b=? order by c; 索引：a_b_c</span>
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">反例：索引中有范围查找，那么索引有序性无法利用，如：WHERE a&gt;10 ORDER BY b; 索引</span>
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">a_b 无法排序。</span>
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">6.【推荐】利用覆盖索引来进行查询操作，避免回表。</span>
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">说明：如果一本书需要知道第 11 章是什么标题，会翻开第 11 章对应的那一页吗？目录浏览一下就好，这个目录就是起到覆盖索引的作用。</span>
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">正例：能够建立索引的种类分为主键索引、唯一索引、普通索引三种，而覆盖索引只是一种查询的一种效果，用 explain 的结果，extra 列会出现：using index。</span>
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">7.【推荐】利用延迟关联或者子查询优化超多分页场景。</span>
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">说明：MySQL 并不是跳过 offset 行，而是取 offset+N 行，然后返回放弃前 offset 行，返回N 行，那当 offset 特别大的时候，效率就非常的低下，要么控制返回的总页数，要么对超过特定阈值的页数进行 SQL 改写。</span>
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">正例：先快速定位需要获取的 id 段，然后再关联：</span>
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">SELECT a.* FROM 表 1 a, (select id from 表 1 where 条件 LIMIT 100000,20 ) b where a.id=b.id</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">8.【推荐】SQL 性能优化的目标：至少要达到 range 级别，要求是 ref 级别，如果可以是 consts</span>
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">最好。说明：</span>
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">1）consts 单表中最多只有一个匹配行（主键或者唯一索引），在优化阶段即可读取到数据。</span>
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">2）ref 指的是使用普通的索引（normal index）。</span>
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">3）range 对索引进行范围检索。</span>
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">反例：explain 表的结果，type=index，索引物理文件全扫描，速度非常慢，这个 index 级别比较 range 还低，与全表扫描是小巫见大巫。</span>
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">9.【推荐】建组合索引的时候，区分度最高的在最左边。</span>
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">正例：如果 where a=? and b=? ，如果a 列的几乎接近于唯一值，那么只需要单建 idx_a</span>
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">索引即可。</span>
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">说明：存在非等号和等号混合时，在建索引时，请把等号条件的列前置。如：where c&gt;? and d=? 那么即使 c 的区分度更高，也必须把 d 放在索引的最前列，即索引 idx_d_c。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">10.【推荐】防止因字段类型不同造成的隐式转换，导致索引失效。</span>
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">11.【参考】创建索引时避免有如下极端误解：</span>
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">1）宁滥勿缺。认为一个查询就需要建一个索引。</span>
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">2）宁缺勿滥。认为索引会消耗空间、严重拖慢更新和新增速度。</span>
        </p>
        <p>
          <span style="font-size:16px;line-height:2;">3）抵制惟一索引。认为业务的惟一性一律需要在应用层通过“先查后插”方式解决。</span>
        </p>
        ]]>
      </description> 
      <link>http://wisina.top/index.php?m=blog&amp;f=view&amp;t=xml&amp;articleID=18</link> <category>
        MySQL
      </category> 
      <pubDate>
        2020-04-26 00:27:00 +0800
      </pubDate> 
    </item> 
    <item> 
      <title>1-建表规约</title> <description><![CDATA[ <p class="MsoBodyText" style="margin-left:0.0000pt;">
            <span style="line-height:2;font-size:16px;">&nbsp;</span>
            <span style="font-size:16px;">1. 【强制】表达是与否概念的字段，必须使用 is_xxx 的方式命名，数据类型是 unsigned tinyint</span> 
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">（1 表示是，0 表示否）。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：任何字段如果为非负数，必须是 unsigned。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">注意：POJO 类中的任何布尔类型的变量，都不要加 is 前缀，所以，需要在&lt;resultMap&gt;设置从 is_xxx 到 Xxx 的映射关系。数据库表示是与否的值，使用 tinyint 类型，坚持 is_xxx 的命名方式是为了明确其取值含义与取值范围。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">正例：表达逻辑删除的字段名 is_deleted，1 表示删除，0 表示未删除。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">2. 【强制】表名、字段名必须使用小写字母或数字，禁止出现数字开头，禁止两个下划线中间只出现数字。数据库字段名的修改代价很大，因为无法进行预发布，所以字段名称需要慎重考虑。说明：MySQL 在 Windows 下不区分大小写，但在 Linux 下默认是区分大小写。因此，数据库名、表名、字段名，都不允许出现任何大写字母，避免节外生枝。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">正例：aliyun_admin，rdc_config，level3_name 反例：AliyunAdmin，rdcConfig，level_3_name</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">3. 【强制】表名不使用复数名词。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：表名应该仅仅表示表里面的实体内容，不应该表示实体数量，对应于 DO 类名也是单数形式，符合表达习惯。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">4. 【强制】禁用保留字，如 desc、range、match、delayed 等，请参考 MySQL 官方保留字。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">5. 【强制】主键索引名为 pk_字段名；唯一索引名为 uk_字段名；普通索引名则为 idx_字段名。说明：pk_ 即 primary key；uk_ 即 unique key；idx_ 即 index 的简称。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">6. 【强制】小数类型为 decimal，禁止使用 float 和 double。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：float 和 double 在存储的时候，存在精度损失的问题，很可能在值的比较时，得到不正确的结果。如果存储的数据范围超过 decimal 的范围，建议将数据拆成整数和小数分开存储。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">7. 【强制】如果存储的字符串长度几乎相等，使用 char 定长字符串类型。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">8. 【强制】varchar 是可变长字符串，不预先分配存储空间，长度不要超过 5000，如果存储长度大于此值，定义字段类型为 text，独立出来一张表，用主键来对应，避免影响其它字段索引效率。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">9. 【强制】表必备三字段：id, gmt_create, gmt_modified。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：其中 id 必为主键，类型为 bigint unsigned、单表时自增、步长为 1。gmt_create, gmt_modified 的类型均为 datetime 类型，前者现在时表示主动创建，后者过去分词表示被动更新。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">10. 【推荐】表的命名最好是加上“业务名称_表的作用”。 正例：alipay_task / force_project / trade_config</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">11. 【推荐】库名与应用名称尽量一致。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">12. 【推荐】如果修改字段含义或对字段表示的状态追加时，需要及时更新字段注释。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">13. 【推荐】字段允许适当冗余，以提高查询性能，但必须考虑数据一致。冗余字段应遵循：</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">1） 不是频繁修改的字段。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">2） 不是 varchar 超长字段，更不能是 text 字段。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">正例：商品类目名称使用频率高，字段长度短，名称基本一成不变，可在相关联的表中冗余存储类目名称，避免关联查询。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">14. 【推荐】单表行数超过 500 万行或者单表容量超过 2GB，才推荐进行分库分表。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：如果预计三年后的数据量根本达不到这个级别，请不要在创建表时就分库分表。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <br />
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">15. 【参考】合适的字符存储长度，不但节约数据库表空间、节约索引存储，更重要的是提升检索速度。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">正例：如下表，其中无符号值可以避免误存负数，且扩大了表示范围。</span>
        </p>
        <p>
          <br />
        </p>
        <table class="MsoNormalTable" border="1" cellspacing="0" style="border:none;"> 
          <tbody> 
            <tr> 
              <td width="88" valign="top" style="background:#E4E4E4;"> 
                <p class="15" align="center" style="margin-left:21.6000pt;text-align:center;">
                  <span style="font-family:宋体;font-size:10.5pt;">对象</span>
                  <span style="font-family:宋体;font-size:10.5000pt;"></span>
                </p> 
              </td> 
              <td width="110" valign="top" style="background:#E4E4E4;"> 
                <p class="15" style="margin-left:20.4500pt;">
                  <span style="font-family:宋体;font-size:10.5pt;">年龄区间</span>
                  <span style="font-family:宋体;font-size:10.5000pt;"></span>
                </p> 
              </td> 
              <td width="136" valign="top" style="background:#E4E4E4;"> 
                <p class="15" align="center" style="margin-left:39.6000pt;text-align:center;">
                  <span style="font-family:宋体;font-size:10.5pt;">类型</span>
                  <span style="font-family:宋体;font-size:10.5000pt;"></span>
                </p> 
              </td> 
              <td width="44" valign="top" style="background:#E4E4E4;"> 
                <p class="15" align="center" style="margin-left:5.1000pt;text-align:center;">
                  <span style="font-family:宋体;font-size:10.5pt;">字节</span>
                  <span style="font-family:宋体;font-size:10.5000pt;"></span>
                </p> 
              </td> 
              <td width="190" valign="top" style="background:#E4E4E4;"> 
                <p class="15" align="center" style="margin-left:49.3500pt;text-align:center;">
                  <span style="font-family:宋体;font-size:10.5pt;">表示范围</span>
                  <span style="font-family:宋体;font-size:10.5000pt;"></span>
                </p> 
              </td> 
            </tr> 
            <tr> 
              <td width="88" valign="top"> 
                <p class="15">
                  <span style="font-family:宋体;font-size:8.0000pt;">&nbsp;</span>
                </p> 
                <p class="15" style="margin-left:8.8500pt;">
                  <span style="font-family:宋体;font-size:7.5pt;">人</span>
                  <span style="font-family:宋体;font-size:7.5000pt;"></span>
                </p> 
              </td> 
              <td width="110" valign="top"> 
                <p class="15">
                  <span style="font-family:宋体;font-size:8.0000pt;">&nbsp;</span>
                </p> 
                <p class="15" style="margin-left:8.9500pt;">
                  <span style="font-family:&quot;font-size:7.5pt;">150</span>
                  <span style="font-family:&quot;font-size:7.5pt;">&nbsp;</span>
                  <span style="font-family:宋体;font-size:7.5pt;">岁之内</span>
                  <span style="font-family:宋体;font-size:7.5000pt;"></span>
                </p> 
              </td> 
              <td width="136" valign="top"> 
                <p class="15">
                  <span style="font-family:宋体;font-size:9.0000pt;">&nbsp;</span>
                </p> 
                <p class="15" style="margin-left:8.8000pt;">
                  <span style="font-family:&quot;font-size:7.5pt;">tinyint unsigned</span>
                  <span style="font-family:'Courier New';font-size:7.5000pt;"></span>
                </p> 
              </td> 
              <td width="44" valign="top"> 
                <p class="15">
                  <span style="font-family:宋体;font-size:9.0000pt;">&nbsp;</span>
                </p> 
                <p class="15" align="center" style="margin-left:0.3000pt;text-align:center;">
                  <span style="font-family:&quot;font-size:7.5pt;">1</span>
                  <span style="font-family:'Courier New';font-size:7.5000pt;"></span>
                </p> 
              </td> 
              <td width="190" valign="top"> 
                <p class="15">
                  <span style="font-family:宋体;font-size:8.0000pt;">&nbsp;</span>
                </p> 
                <p class="15" style="margin-left:8.9000pt;">
                  <span style="font-family:宋体;font-size:7.5pt;">无符号值：</span>
                  <span style="font-family:&quot;font-size:7.5pt;">0</span>
                  <span style="font-family:&quot;font-size:7.5pt;">&nbsp;</span>
                  <span style="font-family:宋体;font-size:7.5pt;">到 </span>
                  <span style="font-family:&quot;font-size:7.5pt;">255</span>
                  <span style="font-family:'Courier New';font-size:7.5000pt;"></span>
                </p> 
              </td> 
            </tr> 
            <tr> 
              <td width="88" valign="top"> 
                <p class="15">
                  <span style="font-family:宋体;font-size:8.0000pt;">&nbsp;</span>
                </p> 
                <p class="15" style="margin-left:8.8500pt;">
                  <span style="font-family:宋体;font-size:7.5pt;">龟</span>
                  <span style="font-family:宋体;font-size:7.5000pt;"></span>
                </p> 
              </td> 
              <td width="110" valign="top"> 
                <p class="15">
                  <span style="font-family:宋体;font-size:8.0000pt;">&nbsp;</span>
                </p> 
                <p class="15" style="margin-left:8.9500pt;">
                  <span style="font-family:宋体;font-size:7.5pt;">数百岁</span>
                  <span style="font-family:宋体;font-size:7.5000pt;"></span>
                </p> 
              </td> 
              <td width="136" valign="top"> 
                <p class="15">
                  <span style="font-family:宋体;font-size:9.0000pt;">&nbsp;</span>
                </p> 
                <p class="15" style="margin-left:8.8000pt;">
                  <span style="font-family:&quot;font-size:7.5pt;">smallint unsigned</span>
                  <span style="font-family:'Courier New';font-size:7.5000pt;"></span>
                </p> 
              </td> 
              <td width="44" valign="top"> 
                <p class="15">
                  <span style="font-family:宋体;font-size:9.0000pt;">&nbsp;</span>
                </p> 
                <p class="15" align="center" style="margin-left:0.3000pt;text-align:center;">
                  <span style="font-family:&quot;font-size:7.5pt;">2</span>
                  <span style="font-family:'Courier New';font-size:7.5000pt;"></span>
                </p> 
              </td> 
              <td width="190" valign="top"> 
                <p class="15">
                  <span style="font-family:宋体;font-size:8.0000pt;">&nbsp;</span>
                </p> 
                <p class="15" style="margin-left:8.9000pt;">
                  <span style="font-family:宋体;font-size:7.5pt;">无符号值：</span>
                  <span style="font-family:&quot;font-size:7.5pt;">0</span>
                  <span style="font-family:&quot;font-size:7.5pt;">&nbsp;</span>
                  <span style="font-family:宋体;font-size:7.5pt;">到 </span>
                  <span style="font-family:&quot;font-size:7.5pt;">65535</span>
                  <span style="font-family:'Courier New';font-size:7.5000pt;"></span>
                </p> 
              </td> 
            </tr> 
            <tr> 
              <td width="88" valign="top"> 
                <p class="15">
                  <span style="font-family:宋体;font-size:8.0000pt;">&nbsp;</span>
                </p> 
                <p class="15" style="margin-left:8.8500pt;">
                  <span style="font-family:宋体;font-size:7.5pt;">恐龙化石</span>
                  <span style="font-family:宋体;font-size:7.5000pt;"></span>
                </p> 
              </td> 
              <td width="110" valign="top"> 
                <p class="15">
                  <span style="font-family:宋体;font-size:8.0000pt;">&nbsp;</span>
                </p> 
                <p class="15" style="margin-left:8.9500pt;">
                  <span style="font-family:宋体;font-size:7.5pt;">数千万年</span>
                  <span style="font-family:宋体;font-size:7.5000pt;"></span>
                </p> 
              </td> 
              <td width="136" valign="top"> 
                <p class="15">
                  <span style="font-family:宋体;font-size:9.0000pt;">&nbsp;</span>
                </p> 
                <p class="15" style="margin-left:8.8000pt;">
                  <span style="font-family:&quot;font-size:7.5pt;">int unsigned</span>
                  <span style="font-family:'Courier New';font-size:7.5000pt;"></span>
                </p> 
              </td> 
              <td width="44" valign="top"> 
                <p class="15">
                  <span style="font-family:宋体;font-size:9.0000pt;">&nbsp;</span>
                </p> 
                <p class="15" align="center" style="margin-left:0.3000pt;text-align:center;">
                  <span style="font-family:&quot;font-size:7.5pt;">4</span>
                  <span style="font-family:'Courier New';font-size:7.5000pt;"></span>
                </p> 
              </td> 
              <td width="190" valign="top"> 
                <p class="15">
                  <span style="font-family:宋体;font-size:8.0000pt;">&nbsp;</span>
                </p> 
                <p class="15" style="margin-left:8.9000pt;">
                  <span style="font-family:宋体;font-size:7.5pt;">无符号值：</span>
                  <span style="font-family:&quot;font-size:7.5pt;">0</span>
                  <span style="font-family:&quot;font-size:7.5pt;">&nbsp;</span>
                  <span style="font-family:宋体;font-size:7.5pt;">到约 </span>
                  <span style="font-family:&quot;font-size:7.5pt;">42.9</span>
                  <span style="font-family:&quot;font-size:7.5pt;">&nbsp;</span>
                  <span style="font-family:宋体;font-size:7.5pt;">亿</span>
                  <span style="font-family:宋体;font-size:7.5000pt;"></span>
                </p> 
              </td> 
            </tr> 
            <tr> 
              <td width="88" valign="top"> 
                <p class="15">
                  <span style="font-family:宋体;font-size:8.0000pt;">&nbsp;</span>
                </p> 
                <p class="15" style="margin-left:8.8500pt;">
                  <span style="font-family:宋体;font-size:7.5pt;">太阳</span>
                  <span style="font-family:宋体;font-size:7.5000pt;"></span>
                </p> 
              </td> 
              <td width="110" valign="top"> 
                <p class="15">
                  <span style="font-family:宋体;font-size:8.0000pt;">&nbsp;</span>
                </p> 
                <p class="15" style="margin-left:8.9500pt;">
                  <span style="font-family:宋体;font-size:7.5pt;">约 </span>
                  <span style="font-family:&quot;font-size:7.5pt;">50</span>
                  <span style="font-family:&quot;font-size:7.5pt;">&nbsp;</span>
                  <span style="font-family:宋体;font-size:7.5pt;">亿年</span>
                  <span style="font-family:宋体;font-size:7.5000pt;"></span>
                </p> 
              </td> 
              <td width="136" valign="top"> 
                <p class="15">
                  <span style="font-family:宋体;font-size:9.0000pt;">&nbsp;</span>
                </p> 
                <p class="15" style="margin-left:8.8000pt;">
                  <span style="font-family:&quot;font-size:7.5pt;">bigint unsigned</span>
                  <span style="font-family:'Courier New';font-size:7.5000pt;"></span>
                </p> 
              </td> 
              <td width="44" valign="top"> 
                <p class="15">
                  <span style="font-family:宋体;font-size:9.0000pt;">&nbsp;</span>
                </p> 
                <p class="15" align="center" style="margin-left:0.3000pt;text-align:center;">
                  <span style="font-family:&quot;font-size:7.5pt;">8</span>
                  <span style="font-family:'Courier New';font-size:7.5000pt;"></span>
                </p> 
              </td> 
              <td width="190" valign="top"> 
                <p class="15">
                  <span style="font-family:宋体;font-size:8.0000pt;">&nbsp;</span>
                </p> 
                <p class="15" style="margin-left:8.9000pt;">
                  <span style="font-family:宋体;font-size:7.5pt;">无符号值：</span>
                  <span style="font-family:&quot;font-size:7.5pt;">0</span>
                  <span style="font-family:&quot;font-size:7.5pt;">&nbsp;</span>
                  <span style="font-family:宋体;font-size:7.5pt;">到约 </span>
                  <span style="font-family:&quot;font-size:7.5pt;">10</span>
                  <span style="font-family:&quot;font-size:7.5pt;">&nbsp;</span>
                  <span style="font-family:宋体;font-size:7.5pt;">的 </span>
                  <span style="font-family:&quot;font-size:7.5pt;">19</span>
                  <span style="font-family:&quot;font-size:7.5pt;">&nbsp;</span>
                  <span style="font-family:宋体;font-size:7.5pt;">次方</span>
                  <span style="font-family:宋体;font-size:7.5000pt;"></span>
                </p> 
              </td> 
            </tr> 
          </tbody>
        </table>
        ]]>
      </description> 
      <link>http://wisina.top/index.php?m=blog&amp;f=view&amp;t=xml&amp;articleID=17</link> <category>
        MySQL
      </category> 
      <pubDate>
        2020-04-26 00:23:00 +0800
      </pubDate> 
    </item> 
    <item> 
      <title>4-安全规约</title> <description><![CDATA[ <p>
            <span style="line-height:2;font-size:16px;">1.【强制】隶属于用户个人的页面或者功能必须进行权限控制校验。</span>
          </p>
          <p>
          <span style="line-height:2;font-size:16px;">说明：防止没有做水平权限校验就可随意访问、修改、删除别人的数据，比如查看他人的私信内容、修改他人的订单。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">2.【强制】用户敏感数据禁止直接展示，必须对展示数据进行脱敏。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：中国大陆个人手机号码显示为:158****9119，隐藏中间 4 位，防止隐私泄露。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">3.【强制】用户输入的 SQL 参数严格使用参数绑定或者 METADATA 字段值限定，防止 SQL 注入， 禁止字符串拼接 SQL 访问数据库。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">4.【强制】用户请求传入的任何参数必须做有效性验证。说明：忽略参数校验可能导致：</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">page size 过大导致内存溢出</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">恶意 order by 导致数据库慢查询</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">任意重定向</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">SQL 注入</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">反序列化注入</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">正则输入源串拒绝服务 ReDoS</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：Java 代码用正则来验证客户端的输入，有些正则写法验证普通用户输入没有问题， 但是如果攻击人员使用的是特殊构造的字符串来验证，有可能导致死循环的结果。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">5.【强制】禁止向 HTML 页面输出未经安全过滤或未正确转义的用户数据。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">6.【强制】表单、AJAX 提交必须执行 CSRF 安全验证。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：CSRF(Cross-site request forgery)跨站请求伪造是一类常见编程漏洞。对于存在CSRF 漏洞的应用/网站，攻击者可以事先构造好 URL，只要受害者用户一访问，后台便在用户不知情的情况下对数据库中用户参数进行相应修改。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">7.【强制】在使用平台资源，譬如短信、邮件、电话、下单、支付，必须实现正确的防重放的机制，如数量限制、疲劳度控制、验证码校验，避免被滥刷而导致资损。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：如注册时发送验证码到手机，如果没有限制次数和频率，那么可以利用此功能骚扰到其它用户，并造成短信平台资源浪费。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">【推荐】发贴、评论、发送即时消息等用户生成内容的场景必须实现防刷、文本内容违禁词过滤等风控策略。</span>
        </p>
        ]]>
      </description> 
      <link>http://wisina.top/index.php?m=blog&amp;f=view&amp;t=xml&amp;articleID=16</link> <category>
        开发手册
      </category> 
      <pubDate>
        2020-04-26 00:16:00 +0800
      </pubDate> 
    </item> 
    <item> 
      <title>3-单元测试</title> <description><![CDATA[ <p>
            <span style="line-height:2;font-size:16px;">1.【强制】好的单元测试必须遵守 AIR 原则。</span>
          </p>
          <p>
          <span style="line-height:2;font-size:16px;">说明：单元测试在线上运行时，感觉像空气（AIR）一样并不存在，但在测试质量的保障上， 却是非常关键的。好的单元测试宏观上来说，具有自动化、独立性、可重复执行的特点。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">A：Automatic（自动化）</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">I：Independent（独立性）</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">R：Repeatable（可重复）</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">2.【强制】单元测试应该是全自动执行的，并且非交互式的。测试用例通常是被定期执行的，执行过程必须完全自动化才有意义。输出结果需要人工检查的测试不是一个好的单元测试。单元测试中不准使用 System.out 来进行人肉验证，必须使用 assert 来验证。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">3.【强制】保持单元测试的独立性。为了保证单元测试稳定可靠且便于维护，单元测试用例之间决不能互相调用，也不能依赖执行的先后次序。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">反例：method2 需要依赖 method1 的执行，将执行结果作为 method2 的输入。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">4.【强制】单元测试是可以重复执行的，不能受到外界环境的影响。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：单元测试通常会被放到持续集成中，每次有代码 check in 时单元测试都会被执行。如果单测对外部环境（网络、服务、中间件等）有依赖，容易导致持续集成机制的不可用。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">正例：为了不受外界环境影响，要求设计代码时就把 SUT 的依赖改成注入，在测试时用 spring</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">这样的 DI 框架注入一个本地（内存）实现或者 Mock 实现。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">5.【强制】对于单元测试，要保证测试粒度足够小，有助于精确定位问题。单测粒度至多是类级别，一般是方法级别。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：只有测试粒度小才能在出错时尽快定位到出错位置。单测不负责检查跨类或者跨系统的交互逻辑，那是集成测试的领域。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">6.【强制】核心业务、核心应用、核心模块的增量代码确保单元测试通过。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：新增代码及时补充单元测试，如果新增代码影响了原有单元测试，请及时修正。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">7.【强制】单元测试代码必须写在如下工程目录：src/test/java，不允许写在业务代码目录下。说明：源码构建时会跳过此目录，而单元测试框架默认是扫描此目录。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">8.【推荐】单元测试的基本目标：语句覆盖率达到 70%；核心模块的语句覆盖率和分支覆盖率都要达到 100%</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：在工程规约的应用分层中提到的 DAO 层，Manager 层，可重用度高的 Service，都应该进行单元测试。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">9.【推荐】编写单元测试代码遵守 BCDE 原则，以保证被测试模块的交付质量。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">B：Border，边界值测试，包括循环边界、特殊取值、特殊时间点、数据顺序等。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">C：Correct，正确的输入，并得到预期的结果。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">D：Design，与设计文档相结合，来编写单元测试。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">E：Error，强制错误信息输入（如：非法数据、异常流程、非业务允许输入等），并得到预期的结果。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">10.【推荐】对于数据库相关的查询，更新，删除等操作，不能假设数据库里的数据是存在的， 或者直接操作数据库把数据插入进去，请使用程序插入或者导入数据的方式来准备数据。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">反例：删除某一行数据的单元测试，在数据库中，先直接手动增加一行作为删除目标，但是这一行新增数据并不符合业务插入规则，导致测试结果异常。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">11.【推荐】和数据库相关的单元测试，可以设定自动回滚机制，不给数据库造成脏数据。或者对单元测试产生的数据有明确的前后缀标识。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">正例：在 RDC 内部单元测试中，使用 RDC_UNIT_TEST_的前缀标识数据。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">12.【推荐】对于不可测的代码建议做必要的重构，使代码变得可测，避免为了达到测试要求而书写不规范测试代码。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">13.【推荐】在设计评审阶段，开发人员需要和测试人员一起确定单元测试范围，单元测试最好覆盖所有测试用例。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">14.【推荐】单元测试作为一种质量保障手段，不建议项目发布后补充单元测试用例，建议在项目提测前完成单元测试。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">15.【参考】为了更方便地进行单元测试，业务代码应避免以下情况：</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">构造方法中做的事情过多。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">存在过多的全局变量和静态方法。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">存在过多的外部依赖。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">存在过多的条件语句。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：多层条件语句建议使用卫语句、策略模式、状态模式等方式重构。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">16.【参考】不要对单元测试存在如下误解：</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">那是测试同学干的事情。本文是开发手册，凡是本文内容都是与开发同学强相关的。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">单元测试代码是多余的。系统的整体功能与各单元部件的测试正常与否是强相关的。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">单元测试代码不需要维护。一年半载后，那么单元测试几乎处于废弃状态。</span>
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">单元测试与线上故障没有辩证关系。好的单元测试能够最大限度地规避线上故障。</span>
        </p>
        ]]>
      </description> 
      <link>http://wisina.top/index.php?m=blog&amp;f=view&amp;t=xml&amp;articleID=15</link> <category>
        开发手册
      </category> 
      <pubDate>
        2020-04-26 00:13:00 +0800
      </pubDate> 
    </item> 
    <item> 
      <title>2-日志规约</title> <description><![CDATA[ <p>
            <span style="line-height:2;font-size:16px;">1. 【强制】应用中不可直接使用日志系统（Log4j、Logback）中的 API，而应依赖使用日志框架SLF4J 中的 API，使用门面模式的日志框架，有利于维护和各个类的日志处理方式统一。</span>
          </p>
          <p><br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">import org.slf4j.Logger;</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">import org.slf4j.LoggerFactory;</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">private static final Logger logger = LoggerFactory.getLogger(Abc.class);</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">2. 【强制】日志文件至少保存 15 天，因为有些异常具备以“周”为频次发生的特点。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">3. 【强制】应用中的扩展日志（如打点、临时监控、访问日志等）命名方式：</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">appName_logType_logName.log。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">logType:日志类型，如 stats/monitor/access 等；logName:日志描述。这种命名的好处： 通过文件名就可知道日志文件属于什么应用，什么类型，什么目的，也有利于归类查找。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">正例：mppserver 应用中单独监控时区转换异常，如：</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">mppserver_monitor_timeZoneConvert.log</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：推荐对日志进行分类，如将错误日志和业务日志分开存放，便于开发人员查看，也便于通过日志对系统进行及时监控。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">4. 【强制】对 trace/debug/info 级别的日志输出，必须使用条件输出形式或者使用占位符的方式。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：logger.debug("Processing trade with id: " + id + " and symbol: " + symbol); 如果日志级别是 warn，上述日志不会打印，但是会执行字符串拼接操作，如果 symbol 是对象，会执行 toString()方法，浪费了系统资源，执行了上述操作，最终日志却没有打印。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">正例：（条件）建设采用如下方式</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">if (logger.isDebugEnabled()) {</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">logger.debug("Processing trade with id: " + id + " and symbol: " + symbol);</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">}</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">正例：（占位符）</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">5. 【强制】避免重复打印日志，浪费磁盘空间，务必在 log4j.xml 中设置 additivity=false。正例：&lt;logger name="com.taobao.dubbo.config" additivity="false"&gt;</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">6. 【强制】异常信息应该包括两类信息：案发现场信息和异常堆栈信息。如果不处理，那么通过关键字 throws 往上抛出。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">正例：logger.error(各类参数或者对象 toString() + "_" + e.getMessage(), e);</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">7. 【推荐】谨慎地记录日志。生产环境禁止输出 debug 日志；有选择地输出 info 日志；如果使用 warn 来记录刚上线时的业务行为信息，一定要注意日志输出量的问题，避免把服务器磁盘撑爆，并记得及时删除这些观察日志。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：大量地输出无效日志，不利于系统性能提升，也不利于快速定位错误点。记录日志时请思考：这些日志真的有人看吗？看到这条日志你能做什么？能不能给问题排查带来好处？</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">8. 【推荐】可以使用 warn 日志级别来记录用户输入参数错误的情况，避免用户投诉时，无所适从。如非必要，请不要在此场景打出 error 级别，避免频繁报警。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">说明：注意日志输出的级别，error 级别只记录系统逻辑出错、异常或者重要的错误信息。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">9. 【推荐】尽量用英文来描述日志错误信息，如果日志中的错误信息用英文描述不清楚的话使用中文描述即可，否则容易产生歧义。国际化团队或海外部署的服务器由于字符集问题，【强制】</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <span style="line-height:2;font-size:16px;">使用全英文来注释和描述日志错误信息。</span>
        </p>
        <p>
          <br />
        </p>
        <p>
          <br />
        </p>
        ]]>
      </description> 
      <link>http://wisina.top/index.php?m=blog&amp;f=view&amp;t=xml&amp;articleID=14</link> <category>
        开发手册
      </category> 
      <pubDate>
        2020-04-26 00:01:00 +0800
      </pubDate> 
    </item> 
    <item> 
      <title>1-编程规约</title> <description><![CDATA[ <div class="Section0"> <h1>
              <b>(</b>
              <b>一</b>
              <b>) </b>
            <b>命名风格</b>
            <b></b>
          </h1> 
          <p class="17" style="text-indent:-18pt;">
            1.&nbsp;【强制】代码中的命名均不能以下划线或美元符号开始，也不能以下划线或美元符号结束。
            <span>反</span> 
            <span>例</span> 
            <span>：</span>_name /&nbsp;name / $name / name_ / name$ / name
            <u>&nbsp;</u>
            <u> </u>
          </p> 
          <p class="17" style="text-indent:-17.8pt;">
            2.&nbsp;【强制】代码中的命名严禁使用拼音与英文混合的方式，更不允许直接使用中文的方式。
          </p> 
          <p class="MsoBodyText" style="margin-left:41.2500pt;">
            说明：正确的英文拼写和语法可以让阅读者易于理解，避免歧义。注意，即使纯拼音命名方式也要避免采用。
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            正例：alibaba / taobao / youku / hangzhou 等国际通用的名称，可视同英文。反例：DaZhePromotion [打折] / getPingfenByName() [评分] / int 
            <span>某变量</span> = 3
          </p> 
          <p class="17" style="text-indent:-18pt;">
            3.&nbsp;
            <span>【强制】类名使用</span> UpperCamelCase&nbsp;风格，但以下情形例外：DO&nbsp;/&nbsp;BO&nbsp;/&nbsp;DTO&nbsp;/&nbsp;VO&nbsp;/&nbsp;AO&nbsp;/ PO&nbsp;/&nbsp;UID&nbsp;等。
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            正例：MarcoPolo&nbsp;/&nbsp;UserDO&nbsp;/&nbsp;XmlService&nbsp;/&nbsp;TcpUdpDeal&nbsp;/&nbsp;TaPromotion
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            反例：macroPolo&nbsp;/&nbsp;UserDo&nbsp;/&nbsp;XMLService&nbsp;/&nbsp;TCPUDPDeal&nbsp;/&nbsp;TAPromotion
          </p> 
          <p class="17" style="text-indent:-18pt;">
            4.&nbsp;
            <span>【强制】方法名、参数名、成员变量、局部变量都统一使用</span> lowerCamelCase&nbsp;风格，必须遵从驼峰形式。
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            <span>正例：</span> localValue / getHttpMessage() / inputUserId
          </p> 
          <p class="17" style="text-indent:-18pt;">
            5.&nbsp;【强制】常量命名全部大写，单词间用下划线隔开，力求语义表达完整清楚，不要嫌名字长。正例：MAX_STOCK_COUNT
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            反例：MAX_COUNT
          </p> 
          <p class="17" style="text-indent:-18pt;">
            6.&nbsp;
            <span>【强制】抽象类命名使用</span> Abstract&nbsp;
            <span>或</span> Base&nbsp;开头；
            <span>异常类命名使用</span> Exception&nbsp;结尾；测试类
            <span>命名以它要测试的类的名称开始，以</span> Test&nbsp;结尾。
          </p> 
          <p class="17" style="text-indent:-18pt;">
            7.&nbsp;【强制】类型与中括号紧挨相连来表示数组。正例：
            <span>定义整形数组</span> int[]&nbsp;arrayDemo;
          </p> 
          <p class="MsoBodyText">
            反例：
            <span>在</span> main 
            <span>参数中，使用</span> String args[]来定义。
          </p> 
          <p class="17" style="text-indent:-18pt;">
            8.&nbsp;【强制】POJO&nbsp;
            <span>类中布尔类型的变量，都不要加</span> is&nbsp;前缀，否则部分框架解析会引起序列化错误。反例：
            <span>定义为基本数据类型</span> Boolean&nbsp;isDeleted&nbsp;
            <span>的属性，它的方法也是</span> isDeleted()，RPC
          </p>
        </div>
        <br />
        <div class="Section1"> 
          <p class="MsoBodyText">
            <span>框架在反向解析的时候，</span>“误以为”对应的属性名称是 deleted，导致属性获取不到，进而抛出异常。
          </p> 
          <p class="17" style="text-indent:-18pt;">
            9.&nbsp;【强制】包名统一使用小写，点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式，但是类名如果有复数含义，类名可以使用复数形式。
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            正例：
            <span>应用工具类包名为</span> com.alibaba.ai.util
            <span>、类名为</span> MessageUtils（
            <span>此规则参考</span> spring
          </p> 
          <p class="MsoBodyText">
            的框架结构）
          </p> 
          <p class="MsoBodyText" style="margin-left:0.0000pt;">
            &nbsp;
          </p> 
          <p class="17" style="text-indent:-24.05pt;">
            10.&nbsp;【强制】杜绝完全不规范的缩写，避免望文不知义。
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            反例：AbstractClass“缩写”命名成 AbsClass；condition“缩写”命名成 condi，此类随意缩写严重降低了代码的可阅读性。
          </p> 
          <p class="17" style="text-indent:-18pt;">
            11.&nbsp;【推荐】为了达到代码自解释的目标，任何自定义编程元素在命名时，使用尽量完整的单词组合来表达其意。
          </p> 
          <p class="MsoBodyText">
            正例：
            <span>在</span> JDK 中，表达原子更新的类名为：AtomicReferenceFieldUpdater。反例：
            <span>变量</span> int a 的随意命名方式。
          </p> 
          <p class="17" style="text-indent:-18pt;">
            12.&nbsp;【推荐】如果模块、接口、类、方法使用了设计模式，在命名时需体现出具体模式。说明：将设计模式体现在名字中，有利于阅读者快速理解架构设计理念。
          </p> 
          <p class="MsoNormal" style="margin-left:80.6pt;text-indent:-39pt;">
            正例：public class OrderFactory; public class LoginProxy;
          </p> 
          <p class="MsoNormal" style="margin-left:81.2pt;text-indent:0pt;">
            public class ResourceObserver;
          </p> 
          <p class="17" align="justify" style="margin-left:41.6000pt;text-indent:-18.0000pt;text-align:justify;">
            13.&nbsp;【推荐】接口类中的方法和属性不要加任何修饰符号（public&nbsp;也不要加），保持代码的简洁
            <span>性，并加上有效的</span> Javadoc&nbsp;注释。尽量不要在接口里定义变量，如果一定要定义变量，肯定是与接口方法相关，并且是整个应用的基础常量。
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            正例：
            <span>接口方法签名</span> void commit();
          </p> 
          <p class="MsoNormal" style="margin-left:80pt;text-indent:0pt;">
            <span>接口基础常量</span> String COMPANY = "alibaba";
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            反例：
            <span>接口方法定义</span> public abstract void f();
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            说明：JDK8&nbsp;
            <span>中接口允许有默认实现，那么这个</span> default&nbsp;方法，是对所有实现类都有价值的默认实现。
          </p> 
          <p class="17" style="text-indent:-24.05pt;">
            14.&nbsp;接口和实现类的命名有两套规则：
          </p> 
          <p class="17" style="text-indent:7.2pt;">
            1）&nbsp;
            <span>【强制】对于</span> Service&nbsp;
            <span>和</span> DAO&nbsp;
            <span>类，基于</span> SOA&nbsp;的理念，暴露出来的服务一定是接口，内部
            <span>的实现类用</span> Impl&nbsp;的后缀与接口区别。
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            正例：CacheServiceImpl&nbsp;
            <span>实现</span> CacheService&nbsp;接口。
          </p> 
          <p class="17" style="text-indent:7.2pt;">
            2）&nbsp;【推荐】如果是形容能力的接口名称，取对应的形容词为接口名（通常是–able&nbsp;的形式
            <span>）</span> 。正例：AbstractTranslator&nbsp;
            <span>实现</span> Translatable&nbsp;接口。
          </p>
        </div>
        <br />
        <div class="Section2"> 
          <p class="17" style="text-indent:-18pt;">
            15.&nbsp;
            <span>【参考】枚举类名建议带上</span> Enum&nbsp;后缀，枚举成员名称需要全大写，单词间用下划线隔开。说明：枚举其实就是特殊的类，域成员均为常量，且构造方法被默认强制是私有。
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            正例：
            <span>枚举名字为</span> ProcessStatusEnum&nbsp;的成员名称：SUCCESS / UNKNOWN_REASON。
          </p> 
          <p class="17" style="text-indent:-24.05pt;">
            16.&nbsp;【参考】各层命名规约：
          </p> 
          <p class="17" style="text-indent:-19.95pt;">
            A)&nbsp;Service/DAO&nbsp;层方法命名规约
          </p> 
          <p class="17" style="text-indent:-23.8pt;">
            1）&nbsp;
            <span>获取单个对象的方法用</span> get&nbsp;做前缀。
          </p> 
          <p class="17" style="text-indent:-23.8pt;">
            2）&nbsp;
            <span>获取多个对象的方法用</span> list&nbsp;做前缀，复数形式结尾如：listObjects。
          </p> 
          <p class="17" style="text-indent:0pt;">
            3）&nbsp;
            <span>获取统计值的方法用</span> count&nbsp;做前缀。4）&nbsp;
            <span>插入的方法用</span> save/insert&nbsp;做前缀。5）&nbsp;
            <span>删除的方法用</span> remove/delete&nbsp;做前缀。6）&nbsp;
            <span>修改的方法用</span> update&nbsp;做前缀。
          </p> 
          <p class="17" style="text-indent:-18.75pt;">
            B)&nbsp;领域模型命名规约
          </p> 
          <p class="17" style="text-indent:-23.8pt;">
            1）&nbsp;数据对象：xxxDO，xxx&nbsp;即为数据表名。
          </p> 
          <p class="17" style="text-indent:-23.8pt;">
            2）&nbsp;数据传输对象：xxxDTO，xxx&nbsp;为业务领域相关的名称。
          </p> 
          <p class="17" style="text-indent:-23.8pt;">
            3）&nbsp;展示对象：xxxVO，xxx&nbsp;一般为网页名称。
          </p> 
          <p class="17" style="text-indent:-23.8pt;">
            4）&nbsp;POJO&nbsp;
            <span>是</span> DO/DTO/BO/VO&nbsp;
            <span>的统称，禁止命名成</span> xxxPOJO。
          </p> 
          <p class="MsoBodyText" style="margin-left:0.0000pt;">
            &nbsp;
          </p> 
          <h1>
            <b>(</b>
            <b>二</b>
            <b>) </b>
            <b>常量定义</b>
            <b></b>
          </h1> 
          <p class="17" style="text-indent:-24pt;">
            1.&nbsp;【强制】不允许任何魔法值（即未经预先定义的常量）直接出现在代码中。反例：String&nbsp;key = "Id#taobao_"&nbsp;+ tradeId;
          </p> 
          <p class="MsoNormal" style="margin-left:82.4pt;text-indent:0pt;">
            cache.put(key, value);
          </p> 
          <p class="17" style="text-indent:-18.05pt;">
            2.&nbsp;
            <span>【强制】在</span> long&nbsp;
            <span>或者</span> Long&nbsp;
            <span>赋值时，数值后使用大写的</span> L
            <span>，不能是小写的</span> l，小写容易跟数字
          </p> 
          <p class="MsoBodyText">
            1&nbsp;混淆，造成误解。
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            说明：Long a = 2l; 
            <span>写的是数字的</span> 21
            <span>，还是</span> Long&nbsp;
            <span>型的</span> 2?
          </p> 
          <p class="17" style="text-indent:-17.8pt;">
            3.&nbsp;【推荐】不要使用一个常量类维护所有常量，要按常量功能进行归类，分开维护。
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:-0.4pt;">
            说明：大而全的常量类，杂乱无章，使用查找功能才能定位到修改的常量，不利于理解和维护。正例：
            <span>缓存相关常量放在类</span> CacheConsts&nbsp;下；
            <span>系统配置相关常量放在类</span> ConfigConsts&nbsp;下。
          </p> 
          <p class="17" style="text-indent:-18pt;">
            4.&nbsp;【推荐】常量的复用层次有五层：跨应用共享常量、应用内共享常量、子工程内共享常量、包内共享常量、类内共享常量。
          </p> 
          <p class="17" style="text-indent:-23.8pt;">
            1）&nbsp;
            <span>跨应用共享常量：放置在二方库中，通常是</span> client.jar&nbsp;
            <span>中的</span> constant&nbsp;目录下。
          </p> 
          <p class="17" style="text-indent:-23.8pt;">
            2）&nbsp;
            <span>应用内共享常量：放置在一方库中，通常是子模块中的</span> constant&nbsp;目录下。
          </p> 
          <p class="MsoBodyText" style="margin-left:65.6000pt;">
            反例：易懂变量也要统一定义成应用内共享常量，两位攻城师在两个类中分别定义了表示
          </p> 
          <p class="MsoBodyText">
            “是”的变量：
          </p> 
          <p class="MsoNormal" style="margin-left:89.6pt;text-indent:0pt;">
            <span>类</span> A&nbsp;中：public static final String YES = "yes";
          </p>
        </div>
        <br />
        <div class="Section3"> 
          <p class="MsoNormal" style="margin-left:89.6pt;text-indent:0pt;">
            <span>类</span> B 
            <span>中</span> 
            <span>：</span>public static final String YES = "y"; A.YES.equals(B.YES)
            <span>，预期是</span> true
            <span>，但实际返回为</span> false，导致线上问题。
          </p> 
          <p class="17" style="text-indent:-23.8pt;">
            3）&nbsp;
            <span>子工程内部共享常量：即在当前子工程的</span> constant&nbsp;目录下。
          </p> 
          <p class="17" style="text-indent:-23.8pt;">
            4）&nbsp;
            <span>包内共享常量：即在当前包下单独的</span> constant&nbsp;目录下。
          </p> 
          <p class="17" style="text-indent:-23.8pt;">
            5）&nbsp;
            <span>类内共享常量：直接在类内部</span> private&nbsp;static&nbsp;final&nbsp;定义。
          </p> 
          <p class="17" style="text-indent:-17.8pt;">
            5.&nbsp;【推荐】
            <span>如果变量值仅在一个固定范围内变化用</span> enum&nbsp;类型来定义。
          </p> 
          <p class="MsoBodyText" style="margin-left:41.2500pt;">
            说明：
            <span>如果存在名称之外的延伸属性应使用</span> enum 类型，下面正例中的数字就是延伸信息，表示一年中的第几个季节。
          </p> 
          <p class="MsoBodyText" style="margin-left:41.2500pt;">
            正例：
          </p> 
          <p class="MsoNormal" style="margin-left:59.5pt;text-indent:0pt;">
            public enum SeasonEnum {
          </p> 
          <p class="MsoBodyText" style="margin-left:0.0000pt;">
            &nbsp;
          </p> 
          <p class="MsoBodyText" style="margin-left:0.0000pt;">
            &nbsp;
          </p> 
          <h1>
            <b>(</b>
            <b>三</b>
            <b>) </b>
            <b>代码格式</b>
            <b></b>
          </h1> 
          <p class="17" style="text-indent:-18pt;">
            1.&nbsp;【强制】大括号的使用约定。如果是大括号内为空，则简洁地写成{}即可，不需要换行；如果是非空代码块则：
          </p> 
          <p class="17" style="text-indent:-23.8pt;">
            1）&nbsp;左大括号前不换行。
          </p> 
          <p class="17" style="text-indent:-23.8pt;">
            2）&nbsp;左大括号后换行。
          </p> 
          <p class="17" style="text-indent:-23.8pt;">
            3）&nbsp;右大括号前换行。
          </p> 
          <p class="17" style="text-indent:-23.8pt;">
            4）&nbsp;
            <span>右大括号后还有</span> else&nbsp;等代码则不换行；表示终止的右大括号后必须换行。
          </p> 
          <p class="17" style="text-indent:-17.8pt;">
            2.&nbsp;
            <img width="27" height="25" src="file://C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml12376\wps5.png" />【强制】左小括号和字符之间不出现空格；
            <span>同样，右小括号和字符之间也不出现空格；而左大括号前需要空格。详见第</span> 5&nbsp;条下方正例提示。
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            反例：if&nbsp;(
            <span>空格</span> a&nbsp;== b&nbsp;空格)
          </p> 
          <p class="17" style="text-indent:-18.05pt;">
            3.&nbsp;【强制】if/for/while/switch/do&nbsp;等保留字与括号之间都必须加空格。
          </p> 
          <p class="17" style="text-indent:-18.05pt;">
            4.&nbsp;【强制】任何二目、三目运算符的左右两边都需要加一个空格。
          </p> 
          <p class="MsoBodyText">
            说明：运算符包括赋值运算符=
            <span>、逻辑运算符</span>&amp;&amp;、加减乘除符号等。
          </p> 
          <p class="17" style="text-indent:-17.8pt;">
            5.&nbsp;
            <span>【强制】采用</span> 4&nbsp;
            <span>个空格缩进，禁止使用</span> tab&nbsp;字符。
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            说明：
            <span>如果使用</span> tab&nbsp;
            <span>缩进，必须设置</span> 1&nbsp;
            <span>个</span> tab&nbsp;
            <span>为</span> 4&nbsp;个空格。IDEA&nbsp;
            <span>设置</span> tab&nbsp;
            <span>为</span> 4&nbsp;
            <span>个空格时，</span> 
            <span>请勿勾选</span> Use tab character
            <span>；而在</span> eclipse&nbsp;
            <span>中，必须勾选</span> insert spaces for tabs。
          </p>
        </div>
        <br />
        <div class="Section4"> 
          <p class="MsoBodyText">
            <span>正例：</span> （
            <span>涉及</span> 1-5&nbsp;点）
          </p> 
          <p class="MsoNormal" style="margin-left:59.6pt;text-indent:0pt;">
            public static void main(String[] args) {
          </p> 
          <p class="MsoBodyText" style="margin-left:0.0000pt;">
            &nbsp;
          </p> 
          <p class="MsoNormal" style="margin-left:77.6pt;text-indent:0pt;">
            // 
            <span>缩进</span> 4&nbsp;个空格
          </p> 
          <p class="MsoNormal" style="margin-left:77.6pt;text-indent:0pt;">
            String say =&nbsp;"hello";
          </p> 
          <p class="MsoNormal" style="margin-left:77.6pt;text-indent:0pt;">
            // 运算符的左右必须有一个空格
          </p> 
          <p class="MsoNormal" style="margin-left:77.6pt;text-indent:0pt;">
            int flag =&nbsp;0;
          </p> 
          <p class="MsoNormal" style="margin-left:77.6pt;text-indent:0pt;">
            // 
            <span>关键词</span> if&nbsp;
            <span>与括号之间必须有一个空格，括号内的</span> f&nbsp;与左括号，0&nbsp;与右括号不需要空格
          </p> 
          <p class="MsoNormal" style="margin-left:95.6pt;text-indent:-18pt;">
            if (flag == 0) { System.out.println(say);
          </p> 
          <p class="MsoNormal" style="margin-left:77.6pt;text-indent:0pt;">
            }
          </p> 
          <p class="MsoBodyText" style="margin-left:0.0000pt;">
            &nbsp;
          </p> 
          <p class="MsoNormal" style="margin-left:77.6pt;text-indent:0pt;">
            // 左大括号前加空格且不换行；左大括号后换行
          </p> 
          <p class="MsoNormal" style="margin-left:95.6pt;text-indent:-18pt;">
            if (flag == 1) { System.out.println("world");
          </p> 
          <p class="MsoNormal" style="margin-left:77.6pt;text-indent:0pt;">
            // 
            <span>右大括号前换行，右大括号后有</span> else，不用换行
          </p> 
          <p class="MsoNormal" style="margin-left:77.6pt;text-indent:0pt;">
            } else {
          </p> 
          <p class="MsoNormal" style="margin-left:95.6pt;text-indent:0pt;">
            System.out.println("ok");
          </p> 
          <p class="MsoNormal" style="margin-left:77.6pt;text-indent:0pt;">
            // 在右大括号后直接结束，则必须换行
          </p> 
          <p class="MsoNormal" style="margin-left:77.6pt;text-indent:0pt;">
            }
          </p> 
          <p class="MsoNormal" style="margin-left:59.6pt;text-indent:0pt;">
            }
          </p> 
          <p class="MsoBodyText" style="margin-left:0.0000pt;">
            &nbsp;
          </p> 
          <p class="17" style="text-indent:-17.8pt;">
            6.&nbsp;【强制】注释的双斜线与注释内容之间有且仅有一个空格。正例：
          </p> 
          <p class="MsoNormal" style="margin-left:51.45pt;text-indent:0pt;">
            // 这是示例注释，请注意在双斜线之后有一个空格
          </p> 
          <p class="MsoNormal" style="margin-left:51.45pt;text-indent:0pt;">
            String ygb = new String();
          </p> 
          <p class="MsoBodyText" style="margin-left:0.0000pt;">
            &nbsp;
          </p> 
          <p class="17" style="text-indent:-24pt;">
            7.&nbsp;
            <span>【强制】单行字符数限制不超过</span> 120&nbsp;
            <span>个，超出需要换行，换行时遵循如下原则：</span> 1）&nbsp;
            <span>第二行相对第一行缩进</span> 4&nbsp;个空格，从第三行开始，不再继续缩进，参考示例。2）&nbsp;运算符与下文一起换行。
          </p> 
          <p class="17" style="text-indent:-23.8pt;">
            3）&nbsp;方法调用的点符号与下文一起换行。
          </p> 
          <p class="17" style="text-indent:-23.8pt;">
            4）&nbsp;方法调用中的多个参数需要换行时，在逗号后进行。
          </p> 
          <p class="17" style="text-indent:7.2pt;">
            5）&nbsp;在括号前不要换行，见反例。正例：
          </p> 
          <p class="MsoNormal" style="margin-left:59.6pt;text-indent:0pt;">
            StringBuffer sb = new&nbsp;StringBuffer();
          </p> 
          <p class="MsoNormal" style="margin-left:59.6pt;text-indent:0pt;">
            // 
            <span>超过</span> 120&nbsp;
            <span>个字符的情况下，换行缩进</span> 4&nbsp;个空格，点号和方法名称一起换行
          </p> 
          <p class="MsoNormal" style="margin-left:59.6pt;text-indent:0pt;">
            sb.append("zi").append("xin")...
          </p> 
          <p class="MsoNormal" style="margin-left:77.6pt;text-indent:0pt;">
            .append("huang")...
          </p> 
          <p class="MsoNormal" style="margin-left:77.6pt;text-indent:0pt;">
            .append("huang")...
          </p> 
          <p class="MsoNormal" style="margin-left:77.6pt;text-indent:0pt;">
            .append("huang");
          </p> 
          <p class="MsoBodyText" style="margin-left:0.0000pt;">
            &nbsp;
          </p> 
          <p class="MsoBodyText">
            反例：
          </p> 
          <p class="MsoNormal" style="margin-left:59.6pt;text-indent:0pt;">
            StringBuffer sb = new&nbsp;StringBuffer();
          </p> 
          <p class="MsoNormal" style="margin-left:59.6pt;text-indent:0pt;">
            //&nbsp;
            <span>超过</span> 120&nbsp;个字符的情况下，不要在括号前换行
          </p> 
          <p class="MsoNormal" style="margin-left:77.6pt;text-indent:-18pt;">
            sb.append("zi").append("xin")...append ("huang");
          </p> 
          <p class="MsoNormal" style="margin-left:59.6pt;text-indent:0pt;">
            // 
            <span>参数很多的方法调用可能超过</span> 120&nbsp;个字符，不要在逗号前换行
          </p> 
          <p class="MsoNormal" style="margin-left:64.15pt;text-indent:0pt;">
            method(args1, args2, args3,&nbsp;...
          </p> 
          <p class="MsoNormal" style="margin-left:77.6pt;text-indent:0pt;">
            , argsX);
          </p>
        </div>
        <br />
        <div class="Section5"> 
          <p class="17" style="text-indent:-17.8pt;">
            8.&nbsp;【强制】方法参数在定义和传入时，多个参数逗号后边必须加空格。正例：
            <span>下例中实参的</span> args1，后边必须要有一个空格。
          </p> 
          <p class="MsoNormal" style="margin-left:77.6pt;text-indent:0pt;">
            method(args1, args2, args3);
          </p> 
          <p class="MsoBodyText" style="margin-left:0.0000pt;">
            &nbsp;
          </p> 
          <p class="17" style="text-indent:-18pt;">
            9.&nbsp;【强制】IDE&nbsp;
            <span>的</span> text&nbsp;file&nbsp;encoding&nbsp;
            <span>设置为</span> UTF-8; IDE&nbsp;
            <span>中文件的换行符使用</span> Unix&nbsp;
            <span>格式，</span> 
            <span>不要使用</span> Windows&nbsp;格式。
          </p> 
          <p class="17" style="text-indent:-24.15pt;">
            10.&nbsp;
            <span>【推荐】单个方法的总行数不超过</span> 80&nbsp;行。
          </p> 
          <p class="MsoBodyText" style="margin-left:41.2500pt;">
            说明：包括方法签名、结束右大括号、方法内代码、注释、空行、回车及任何不可见字符的总
            <span>行数不超过</span> 80 行。
          </p> 
          <p class="MsoBodyText">
            正例：代码逻辑分清红花和绿叶，个性和共性，绿叶逻辑单独出来成为额外方法，使主干代码更加清晰；共性逻辑抽取成为共性方法，便于复用和维护。
          </p> 
          <p class="17" style="text-indent:-17.8pt;">
            11.&nbsp;【推荐】没有必要增加若干空格来使某一行的字符与上一行对应位置的字符对齐。正例：
          </p> 
          <p class="MsoNormal" style="margin-left:59.6pt;text-indent:0pt;">
            int one = 1; long two = 2L;
          </p> 
          <p class="MsoNormal" style="margin-left:59.6pt;text-indent:0pt;">
            float three =&nbsp;3F;
          </p> 
          <p class="MsoNormal" style="margin-left:59.6pt;text-indent:0pt;">
            StringBuffer sb = new&nbsp;StringBuffer();
          </p> 
          <p class="MsoBodyText">
            说明：
            <span>增加</span> sb&nbsp;
            <span>这个变量，如果需要对齐，则给</span> a、b、c&nbsp;都要增加几个空格，在变量比较多的情况下，是非常累赘的事情。
          </p> 
          <p class="17" style="text-indent:-18pt;">
            12.&nbsp;【推荐】不同逻辑、不同语义、不同业务的代码之间插入一个空行分隔开来以提升可读性。说明：任何情形，没有必要插入多个空行进行隔开。
          </p> 
          <h1>
            <b>(</b>
            <b>四</b>
            <b>) </b>
            <b>OOP</b>
            <b>&nbsp;</b>
            <b>规约</b>
            <b></b>
          </h1> 
          <p class="17" style="text-indent:-18pt;">
            1.&nbsp;【强制】避免通过一个类的对象引用访问此类的静态变量或静态方法，无谓增加编译器解析成本，直接用类名来访问即可。
          </p> 
          <p class="17" style="text-indent:-18.05pt;">
            2.&nbsp;
            <span>【强制】所有的覆写方法，必须加</span>@Override&nbsp;注解。
          </p> 
          <p class="MsoNormal" align="justify" style="margin-left:41.6000pt;text-indent:0.0000pt;text-align:justify;">
            说明：getObject()
            <span>与</span> get0bject()
            <span>的问题。一个是字母的</span> O
            <span>，一个是数字的</span> 0，加@Override 可以准确判断是否覆盖成功。另外，如果在抽象类中对方法签名进行修改，其实现类会马上编译报错。
          </p> 
          <p class="17" align="justify" style="margin-left:41.2500pt;text-indent:-17.8000pt;text-align:justify;">
            3.&nbsp;
            <span>【强制】相同参数类型，相同业务含义，才可以使用</span> Java&nbsp;
            <span>的可变参数，避免使用</span> Object。说明：可变参数必须放置在参数列表的最后。（提倡同学们尽量不用可变参数编程）
          </p> 
          <p class="MsoNormal" align="justify" style="margin-left:41.2500pt;text-indent:0.0000pt;text-align:justify;">
            正例：public List&lt;User&gt; listUsers(String type, Long... ids) {...}
          </p> 
          <p class="MsoBodyText" style="margin-left:0.0000pt;">
            &nbsp;
          </p> 
          <p class="17" style="text-indent:-18pt;">
            4.&nbsp;【强制】外部正在调用或者二方库依赖的接口，不允许修改方法签名，避免对接口调用方产生
            <span>影响。接口过时必须加</span>@Deprecated&nbsp;注解，并清晰地说明采用的新接口或者新服务是什么。
          </p> 
          <p class="17" style="text-indent:-18.05pt;">
            5.&nbsp;【强制】不能使用过时的类或方法。
          </p> 
          <p class="MsoNormal" align="justify" style="margin-left:41.6000pt;text-indent:0.0000pt;text-align:justify;">
            说明：java.net.URLDecoder 
            <span>中的方法</span> decode(String&nbsp;encodeStr) 这个方法已经过时，应
          </p>
        </div>
        <br />
        <div class="Section6"> 
          <p class="MsoNormal" align="justify" style="margin-left:41.6000pt;text-indent:0.0000pt;text-align:justify;">
            <span>该使用双参数</span> decode(String&nbsp;source, String&nbsp;encode)
            <span>。接口提供方既然明确是过时接口，</span> 
            <span>那么有义务同时提供新的接口</span>；作为调用方来说，有义务去考证过时方法的新实现是什么。
          </p> 
          <p class="17" align="justify" style="margin-left:41.6000pt;text-indent:-18.0500pt;text-align:justify;">
            6.&nbsp;【强制】Object&nbsp;
            <span>的</span> equals&nbsp;方法容易抛空指针异常，应使用常量或确定有值的对象来调用
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            equals。
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            正例："test".equals(object); 反例：object.equals("test");
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            说明：
            <span>推荐使用</span> java.util.Objects#equals（JDK7&nbsp;引入的工具类）
          </p> 
          <p class="17" align="justify" style="margin-left:41.6000pt;text-indent:-18.0000pt;text-align:justify;">
            7.&nbsp;【强制】所有的相同类型的包装类对象之间值的比较
            <span>，全部使用</span> equals&nbsp;方法比较。说明：
            <span>对于</span> Integer&nbsp;var&nbsp;= ? 在-128&nbsp;
            <span>至</span> 127&nbsp;范围内的赋值，Integer&nbsp;对象是在
          </p> 
          <p class="MsoNormal" align="justify" style="margin-left:41.6000pt;text-indent:0.0000pt;text-align:justify;">
            IntegerCache.cache&nbsp;
            <span>产生，会复用已有对象，这个区间内的</span> Integer&nbsp;值可以直接使用==进行
            <span>判断，但是这个区间之外的所有数据，都会在堆上产生，并不会复用已有对象，这是一个大坑，</span> 
            <span>推荐使用</span> equals&nbsp;方法进行判断。
          </p> 
          <p class="17" align="justify" style="margin-left:41.6000pt;text-indent:-18.0500pt;text-align:justify;">
            8.&nbsp;关于基本数据类型与包装数据类型的使用标准如下：
          </p> 
          <p class="17" style="text-indent:-23.8pt;">
            1）&nbsp;
            <span>【强制】所有的</span> POJO&nbsp;类属性必须使用包装数据类型。
          </p> 
          <p class="17" style="text-indent:-23.8pt;">
            2）&nbsp;【强制】RPC&nbsp;方法的返回值和参数必须使用包装数据类型。
          </p> 
          <p class="17" style="text-indent:-23.8pt;">
            3）&nbsp;【推荐】所有的局部变量使用基本数据类型。
          </p> 
          <p class="MsoBodyText" style="margin-left:48.8000pt;">
            说明：POJO&nbsp;类属性没有初值是提醒使用者在需要使用时，必须自己显式地进行赋值，任何
          </p> 
          <p class="MsoBodyText">
            NPE&nbsp;问题，或者入库检查，都由使用者来保证。
          </p> 
          <p class="MsoBodyText" style="text-indent:7.2000pt;">
            正例：
            <span>数据库的查询结果可能是</span> null
            <span>，因为自动拆箱，用基本数据类型接收有</span> NPE&nbsp;风险。反例：
            <span>比如显示成交总额涨跌情况，即正负</span> x%，x&nbsp;
            <span>为基本数据类型，调用的</span> RPC&nbsp;服务，调用
            <span>不成功时，返回的是默认值，页面显示为</span> 0%，这是不合理的，应该显示成中划线。所以包装
            <span>数据类型的</span> null&nbsp;值，能够表示额外的信息，如：远程调用失败，异常退出。
          </p> 
          <p class="17" style="text-indent:-18.05pt;">
            9.&nbsp;
            <span>【强制】定义</span> DO/DTO/VO&nbsp;
            <span>等</span> POJO&nbsp;类时，不要设定任何属性默认值。
          </p> 
          <p class="MsoNormal" align="justify" style="margin-left:41.6000pt;text-indent:0.0000pt;text-align:justify;">
            反例：POJO&nbsp;
            <span>类的</span> gmtCreate&nbsp;
            <span>默认值为</span> new&nbsp;Date()，但是这个属性在数据提取时并没有置入具体值，在更新其它字段时又附带更新了此字段，导致创建时间被修改成当前时间。
          </p> 
          <p class="17" style="text-indent:-18pt;">
            10.&nbsp;
            <span>【强制】序列化类新增属性时，请不要修改</span> serialVersionUID&nbsp;字段，避免反序列失败；如
            <span>果完全不兼容升级，避免反序列化混乱，那么请修改</span> serialVersionUID&nbsp;值。
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            说明：
            <span>注意</span> serialVersionUID&nbsp;不一致会抛出序列化运行时异常。
          </p> 
          <p class="17" style="text-indent:-24.05pt;">
            11.&nbsp;
            <span>【强制】构造方法里面禁止加入任何业务逻辑，如果有初始化逻辑，请放在</span> init&nbsp;方法中。
          </p> 
          <p class="17" style="text-indent:-24.05pt;">
            12.&nbsp;【强制】POJO&nbsp;
            <span>类必须写</span> toString&nbsp;
            <span>方法。使用</span> IDE&nbsp;中的工具：source&gt; generate&nbsp;toString
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            <span>时，如果继承了另一个</span> POJO&nbsp;
            <span>类，注意在前面加一下</span> super.toString。
          </p> 
          <p class="MsoNormal" align="justify" style="margin-left:41.6000pt;text-indent:0.0000pt;text-align:justify;">
            说明：
            <span>在方法执行抛出异常时，可以直接调用</span> POJO&nbsp;
            <span>的</span> toString()方法打印其属性值，便于排查问题。
          </p>
        </div>
        <br />
        <div class="Section7"> 
          <p class="17" style="text-indent:-18pt;">
            13.&nbsp;
            <span>【强制】禁止在</span> POJO&nbsp;
            <span>类中，同时存在对应属性</span> xxx&nbsp;
            <span>的</span> isXxx()
            <span>和</span> getXxx()方法。说明：
            <span>框架在调用属性</span> xxx&nbsp;的提取方法时，并不能确定哪个方法一定是被优先调用到。
          </p> 
          <p class="17" style="text-indent:-18pt;">
            14.&nbsp;
            <span>【推荐】使用索引访问用</span> String&nbsp;
            <span>的</span> split&nbsp;方法得到的数组时，需做最后一个分隔符后有无
            <span>内容的检查，否则会有抛</span> IndexOutOfBoundsException&nbsp;的风险。
          </p> 
          <p class="MsoBodyText" style="margin-left:41.2500pt;">
            说明：
          </p> 
          <p class="MsoNormal" style="margin-left:59.6pt;text-indent:0pt;">
            String str =&nbsp;"a,b,c,,";
          </p> 
          <p class="MsoNormal" style="margin-left:59.6pt;text-indent:0pt;">
            String[] ary =&nbsp;str.split(",");
          </p> 
          <p class="MsoNormal" style="margin-left:59.6pt;text-indent:0pt;">
            // 
            <span>预</span> 
            <span>期</span> 
            <span>大</span> 
            <span>于</span> 3
            <span>，</span> 
            <span>结</span> 
            <span>果</span> 
            <span>是</span> 3 System.out.println(ary.length);
          </p> 
          <p class="17" style="text-indent:-18pt;">
            15.&nbsp;
            <span>【推荐】当一个类有多个构造方法，或者多个同名方法，这些方法应该按顺序放置在一起，</span> 
            <span>便于阅读，此条规则优先于第</span> 16&nbsp;条规则。
          </p> 
          <p class="17" style="text-indent:-24.05pt;">
            16.&nbsp;
            <span>【推荐】</span> 
            <span>类内方法定义的顺序依次是：公有方法或保护方法</span> &gt; 
            <span>私有方法</span> &gt; getter/setter
          </p> 
          <p class="MsoBodyText">
            方法。
          </p> 
          <p class="MsoBodyText" align="justify" style="text-align:justify;">
            说明：公有方法是类的调用者和维护者最关心的方法，首屏展示最好；保护方法虽然只是子类关心，也可能是“模板设计模式”下的核心方法；而私有方法外部一般不需要特别关心，是一个黑盒实现；
            <span>因为承载的信息价值较低，所有</span> Service&nbsp;
            <span>和</span> DAO&nbsp;
            <span>的</span> getter/setter&nbsp;方法放在类体最后。
          </p> 
          <p class="17" style="text-indent:-24.15pt;">
            17.&nbsp;【推荐】setter&nbsp;方法中，参数名称与类成员变量名称一致，this.
            <span>成员名</span> = 参数名。在
          </p> 
          <p class="MsoNormal" style="margin-left:41.25pt;text-indent:0pt;">
            getter/setter&nbsp;方法中，不要增加业务逻辑，增加排查问题的难度。反例：
          </p> 
          <p class="MsoNormal" style="margin-left:82.15pt;text-indent:-22.6pt;">
            public Integer getData()&nbsp;{ if (condition) {
          </p> 
          <p class="MsoNormal" style="margin-left:100.15pt;text-indent:0pt;">
            return this.data +&nbsp;100;
          </p> 
          <p class="MsoNormal" style="margin-left:82.15pt;text-indent:0pt;">
            } else {
          </p> 
          <p class="MsoNormal" style="margin-left:100.15pt;text-indent:0pt;">
            return this.data -&nbsp;100;
          </p> 
          <p class="MsoNormal" style="margin-left:82.15pt;text-indent:0pt;">
            }
          </p> 
          <p class="MsoNormal" style="margin-left:64.15pt;text-indent:0pt;">
            }
          </p> 
          <p class="MsoBodyText" style="margin-left:0.0000pt;">
            &nbsp;
          </p> 
          <p class="17" style="text-indent:-17.8pt;">
            18.&nbsp;
            <span>【推荐】循环体内，字符串的连接方式，使用</span> StringBuilder&nbsp;
            <span>的</span> append&nbsp;方法进行扩展。说明：
            <span>下例中，反编译出的字节码文件显示每次循环都会</span> new&nbsp;
            <span>出一个</span> StringBuilder&nbsp;
            <span>对象，</span> 
            <span>然后进行</span> append&nbsp;
            <span>操作，最后通过</span> toString&nbsp;
            <span>方法返回</span> String&nbsp;对象，造成内存资源浪费。&nbsp;
            <span>反例：</span>
          </p> 
          <p class="MsoNormal" style="margin-left:59.6pt;text-indent:0pt;">
            String str =&nbsp;"start";
          </p> 
          <p class="MsoNormal" style="margin-left:82.15pt;text-indent:-22.6pt;">
            for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;100;&nbsp;i++)&nbsp;{ str = str +&nbsp;"hello";
          </p> 
          <p class="MsoNormal" style="margin-left:59.5pt;text-indent:0pt;">
            }
          </p> 
          <p class="MsoBodyText" style="margin-left:0.0000pt;">
            &nbsp;
          </p> 
          <p class="17" style="text-indent:-24.15pt;">
            19.&nbsp;【推荐】final&nbsp;
            <span>可以声明类、成员变量、方法、以及本地变量，下列情况使用</span> final&nbsp;关键字：
          </p> 
          <p class="17" style="text-indent:-25.25pt;">
            1）&nbsp;不允许被继承的类，如：String&nbsp;类。
          </p> 
          <p class="17" style="text-indent:-25.25pt;">
            2）&nbsp;不允许修改引用的域对象。
          </p> 
          <p class="17" style="text-indent:-25.25pt;">
            3）&nbsp;不允许被重写的方法，如：POJO&nbsp;类的setter&nbsp;方法。
          </p>
        </div>
        <br />
        <div class="Section8"> 
          <p class="17" style="text-indent:-25.25pt;">
            4）&nbsp;不允许运行过程中重新赋值的局部变量。
          </p> 
          <p class="17" style="text-indent:7.2pt;">
            5）&nbsp;
            <span>避免上下文重复使用一个变量，使用</span> final&nbsp;描述可以强制重新定义一个变量，方便更好地进行重构。
          </p> 
          <p class="MsoBodyText" style="margin-left:0.0000pt;">
            &nbsp;
          </p> 
          <p class="17" style="text-indent:-24.05pt;">
            20.&nbsp;
            <span>【推荐】慎用</span> Object&nbsp;
            <span>的</span> clone&nbsp;方法来拷贝对象。
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            说明：
            <span>对象的</span> clone&nbsp;
            <span>方法默认是浅拷贝，若想实现深拷贝需要重写</span> clone&nbsp;方法实现域对象的深度遍历式拷贝。
          </p> 
          <p class="17" style="text-indent:-24.05pt;">
            21.&nbsp;【推荐】类成员与方法访问控制从严：
          </p> 
          <p class="17" style="text-indent:-23.8pt;">
            1）&nbsp;
            <span>如果不允许外部直接通过</span> new&nbsp;
            <span>来创建对象，那么构造方法必须是</span> private。
          </p> 
          <p class="17" style="text-indent:-23.8pt;">
            2）&nbsp;
            <span>工具类不允许有</span> public&nbsp;
            <span>或</span> default&nbsp;构造方法。
          </p> 
          <p class="17" style="text-indent:0pt;">
            3）&nbsp;
            <span>类非</span> static&nbsp;
            <span>成员变量并且与子类共享，必须是</span> protected。4）&nbsp;
            <span>类非</span> static&nbsp;
            <span>成员变量并且仅在本类使用，必须是</span> private。5）&nbsp;
            <span>类</span> static&nbsp;
            <span>成员变量如果仅在本类使用，必须是</span> private。6）&nbsp;
            <span>若是</span> static&nbsp;
            <span>成员变量，考虑是否为</span> final。
          </p> 
          <p class="17" style="text-indent:-23.8pt;">
            7）&nbsp;
            <span>类成员方法只供类内部调用，必须是</span> private。
          </p> 
          <p class="17" style="text-indent:-23.8pt;">
            8）&nbsp;
            <span>类成员方法只对继承类公开，那么限制为</span> protected。
          </p> 
          <p class="MsoBodyText">
            说明：任何类、方法、参数、变量，严控访问范围。过于宽泛的访问范围，不利于模块解耦。
            <span>思考：如果是一个</span> private&nbsp;
            <span>的方法，想删除就删除，可是一个</span> public&nbsp;
            <span>的</span> service&nbsp;成员方法或成员变量，删除一下，不得手心冒点汗吗？变量像自己的小孩，尽量在自己的视线内，变量作用域太大，无限制的到处跑，那么你会担心的。
          </p> 
          <p class="MsoBodyText" style="margin-left:0.0000pt;">
            &nbsp;
          </p> 
          <h1>
            <b>(</b>
            <b>五</b>
            <b>) </b>
            <b>集合处理</b>
            <b></b>
          </h1> 
          <p class="17" style="text-indent:-18.05pt;">
            1.&nbsp;
            <span>【强制】关于</span> hashCode&nbsp;
            <span>和</span> equals&nbsp;的处理，遵循如下规则：
          </p> 
          <p class="17" style="text-indent:-26.45pt;">
            1）&nbsp;
            <span>只要重写</span> equals
            <span>，就必须重写</span> hashCode。
          </p> 
          <p class="17" style="text-indent:0pt;">
            2）&nbsp;
            <span>因为</span> Set&nbsp;
            <span>存储的是不重复的对象，依据</span> hashCode&nbsp;
            <span>和</span> equals&nbsp;
            <span>进行判断，所以</span> Set&nbsp;存储的对象必须重写这两个方法。
          </p> 
          <p class="17" style="text-indent:-26.45pt;">
            3）&nbsp;
            <span>如果自定义对象作为</span> Map&nbsp;
            <span>的键，那么必须重写</span> hashCode&nbsp;
            <span>和</span> equals。
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            说明：String&nbsp;重写了hashCode&nbsp;
            <span>和</span> equals&nbsp;
            <span>方法，所以我们可以非常愉快地使用</span> String&nbsp;对象
            <span>作为</span> key&nbsp;来使用。
          </p> 
          <p class="17" style="text-indent:-18pt;">
            2.&nbsp;【强制】ArrayList&nbsp;的subList&nbsp;结果不可强转成ArrayList，否则会抛出ClassCastException
            <span>异常，即</span> java.util.RandomAccessSubList&nbsp;cannot&nbsp;be&nbsp;cast&nbsp;to&nbsp;java.util.ArrayList。说明：subList&nbsp;
            <span>返回的是</span> ArrayList&nbsp;
            <span>的内部类</span> SubList
            <span>，并不是</span> ArrayList&nbsp;
            <span>而是</span> ArrayList
            <span>的一个视图，对于</span> SubList&nbsp;子列表的所有操作最终会反映到原列表上。
          </p> 
          <p class="17" style="text-indent:-18pt;">
            3.&nbsp;
            <span>【强制】在</span> subList&nbsp;场景中，高度注意对原集合元素的增加或删除，均会导致子列表的遍历、
            <span>增加、删除产生</span> ConcurrentModificationException&nbsp;异常。
          </p>
        </div>
        <br />
        <div class="Section9"> 
          <p class="17" style="text-indent:-17.8pt;">
            4.&nbsp;
            <span>【强制】使用集合转数组的方法，必须使用集合的</span> toArray(T[] array)，传入的是类型完全
            <span>一样的数组，大小就是</span> list.size()。
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            说明：
            <span>使用</span> toArray&nbsp;带参方法，入参分配的数组空间不够大时，toArray&nbsp;方法内部将重新分配内存空间，并返回新数组地址；如果数组元素个数大于实际所需，下标为[ list.size() ] 
            <span>的数组元素将被置为</span> null，其它数组元素保持原值，因此最好将方法入参数组大小定义与集合元素个数一致。
          </p> 
          <p class="MsoBodyText">
            正例：
          </p> 
          <p class="MsoNormal" style="margin-left:59.6pt;text-indent:0pt;">
            List&lt;String&gt; list = new ArrayList&lt;String&gt;(2); list.add("guan");
          </p> 
          <p class="MsoNormal" style="margin-left:59.6pt;text-indent:0pt;">
            list.add("bao");
          </p> 
          <p class="MsoNormal" style="margin-left:59.5pt;text-indent:0.1pt;">
            String[] array = new String[list.size()]; array = list.toArray(array);
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            反例：
            <span>直接使用</span> toArray&nbsp;
            <span>无参方法存在问题，此方法返回值只能是</span> Object[]类，若强转其它
            <span>类型数组将出现</span> ClassCastException&nbsp;错误。
          </p> 
          <p class="17" style="text-indent:-18pt;">
            5.&nbsp;
            <span>【强制】使用工具类</span> Arrays.asList()把数组转换成集合时，不能使用其修改集合相关的方
            <span>法，它的</span> add/remove/clear&nbsp;
            <span>方法会抛出</span> UnsupportedOperationException&nbsp;异常。
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            说明：asList&nbsp;
            <span>的返回对象是一个</span> Arrays&nbsp;内部类，并没有实现集合的修改方法。Arrays.asList体现的是适配器模式，只是转换接口，后台的数据仍是数组。
          </p> 
          <p class="MsoNormal" style="margin-left:59.7pt;text-indent:0pt;">
            String[] str = new String[] { "you", "wu" }; List list = Arrays.asList(str);
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            第一种情况：list.add("yangguanbao"); 运行时异常。
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            第二种情况：str[0] = "gujin"; 
            <span>那么</span> list.get(0)也会随之修改。
          </p> 
          <p class="17" style="text-indent:-18pt;">
            6.&nbsp;【强制】泛型通配符&lt;? extends&nbsp;T&gt;
            <span>来接收返回的数据，此写法的泛型集合不能使用</span> add&nbsp;方法，而&lt;? super&nbsp;T&gt;
            <span>不能使用</span> get&nbsp;方法，作为接口调用赋值时易出错。
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            说明：
            <span>扩展说一下</span> PECS(Producer&nbsp;Extends&nbsp;Consumer&nbsp;Super)原则：第一、频繁往外读取内容的，适合用&lt;? extends&nbsp;T&gt;。第二、经常往里插入的，适合用&lt;? super&nbsp;T&gt;。
          </p> 
          <p class="17" style="text-indent:-17.8pt;">
            7.&nbsp;
            <span>【强制】不要在</span> foreach&nbsp;循环里进行元素的remove/add&nbsp;操作。remove&nbsp;
            <span>元素请使用</span> Iterator
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:-0.4pt;">
            <span>方式，如果并发操作，需要对</span> Iterator&nbsp;对象加锁。正例：
          </p> 
          <p class="MsoNormal" style="margin-left:59.6pt;text-indent:0pt;">
            List&lt;String&gt;&nbsp;list&nbsp;=&nbsp;new&nbsp;ArrayList&lt;&gt;(); list.add("1");
          </p> 
          <p class="MsoNormal" style="margin-left:59.6pt;text-indent:0pt;">
            list.add("2");
          </p> 
          <p class="MsoNormal" style="margin-left:59.6pt;text-indent:0pt;">
            Iterator&lt;String&gt; iterator =&nbsp;list.iterator(); while (iterator.hasNext()) {
          </p> 
          <p class="MsoNormal" style="margin-left:82.15pt;text-indent:0pt;">
            String item = iterator.next(); if (删除元素的条件) {
          </p> 
          <p class="MsoNormal" style="margin-left:104.6pt;text-indent:0pt;">
            iterator.remove();
          </p> 
          <p class="MsoNormal" style="margin-left:82.15pt;text-indent:0pt;">
            }
          </p> 
          <p class="MsoNormal" style="margin-left:59.25pt;text-indent:0pt;">
            }
          </p>
        </div>
        <br />
        <div class="Section10"> 
          <p class="MsoBodyText" style="margin-left:35.6000pt;">
            反例：
          </p> 
          <p class="MsoNormal" style="margin-left:82.15pt;text-indent:-22.6pt;">
            for (String item : list) { if ("1".equals(item))&nbsp;{
          </p> 
          <p class="MsoNormal" style="margin-left:104.6pt;text-indent:0pt;">
            list.remove(item);
          </p> 
          <p class="MsoNormal" style="margin-left:82.15pt;text-indent:0pt;">
            }
          </p> 
          <p class="MsoNormal" style="margin-left:59.6pt;text-indent:0pt;">
            }
          </p> 
          <p class="MsoBodyText">
            说明：以上代码的执行结果肯定会出乎大家的意料，那么试一下把“1”换成“2”，会是同样的结果吗？
          </p> 
          <p class="MsoBodyText" style="margin-left:0.0000pt;">
            &nbsp;
          </p> 
          <p class="17" style="text-indent:-17.8pt;">
            8.&nbsp;
            <span>【强制】在</span> JDK7&nbsp;版本及以上，Comparator&nbsp;
            <span>实现类要满足如下三个条件，不然</span> Arrays.sort
            <span>，</span> Collections.sort&nbsp;
            <span>会报</span> IllegalArgumentException&nbsp;异常。
          </p> 
          <p class="MsoBodyText" style="margin-left:41.2500pt;">
            说明：三个条件如下
          </p> 
          <p class="17" style="text-indent:-23.8pt;">
            1）&nbsp;x，y&nbsp;
            <span>的比较结果和</span> y，x&nbsp;的比较结果相反。
          </p> 
          <p class="17" style="text-indent:-23.8pt;">
            2）&nbsp;x&gt;y，y&gt;z，则x&gt;z。
          </p> 
          <p class="17" style="text-indent:-23.8pt;">
            3）&nbsp;x=y，则x，z&nbsp;
            <span>比较结果和</span> y，z&nbsp;比较结果相同。
          </p> 
          <p class="MsoBodyText" style="margin-left:41.2500pt;">
            反例：下例中没有处理相等的情况，实际使用中可能会出现异常：
          </p> 
          <p class="MsoNormal" style="margin-left:59.6pt;text-indent:0pt;">
            new Comparator&lt;Student&gt;() {
          </p> 
          <p class="MsoNormal" style="margin-left:77.6pt;text-indent:0pt;">
            @Override
          </p> 
          <p class="MsoNormal" style="margin-left:100.15pt;text-indent:-22.6pt;">
            public&nbsp;int&nbsp;compare(Student&nbsp;o1,&nbsp;Student&nbsp;o2)&nbsp;{ return&nbsp;o1.getId()&nbsp;&gt;&nbsp;o2.getId()&nbsp;?&nbsp;1&nbsp;:&nbsp;-1;
          </p> 
          <p class="MsoNormal" style="margin-left:77.6pt;text-indent:0pt;">
            }
          </p> 
          <p class="MsoNormal" style="margin-left:59.6pt;text-indent:0pt;">
            };
          </p> 
          <p class="MsoBodyText" style="margin-left:0.0000pt;">
            &nbsp;
          </p> 
          <p class="17" style="text-indent:-18.15pt;">
            9.&nbsp; 
            <span>【推荐】集合泛型定义时，在</span> JDK7&nbsp;
            <span>及以上，使用</span> diamond&nbsp;语法或全省略。说明：
            <span>菱形泛型，即</span> diamond，直接使用&lt;&gt;来指代前边已经指定的类型。
          </p> 
          <p class="MsoBodyText">
            正例：
          </p> 
          <p class="MsoNormal" style="margin-left:59.6pt;text-indent:0pt;">
            //&nbsp;&lt;&gt; diamond&nbsp;方式
          </p> 
          <p class="MsoNormal" style="margin-left:59.6pt;text-indent:0pt;">
            HashMap&lt;String, String&gt; userCache = new HashMap&lt;&gt;(16);
          </p> 
          <p class="MsoNormal" style="margin-left:59.6pt;text-indent:0pt;">
            // 全省略方式
          </p> 
          <p class="MsoNormal" style="margin-left:59.6pt;text-indent:0pt;">
            ArrayList&lt;User&gt; users = new&nbsp;ArrayList(10);
          </p> 
          <p class="MsoBodyText" style="margin-left:0.0000pt;">
            &nbsp;
          </p> 
          <p class="17" align="justify" style="margin-left:47.6000pt;text-indent:-24.1500pt;text-align:justify;">
            10.&nbsp;【推荐】集合初始化时，指定集合初始值大小。
          </p> 
          <p class="MsoNormal" align="justify" style="margin-left:41.2500pt;text-indent:0.0000pt;text-align:justify;">
            说明：HashMap&nbsp;
            <span>使用</span> HashMap(int initialCapacity) 初始化。
          </p> 
          <p class="MsoNormal" style="margin-left:41.25pt;text-indent:0pt;">
            正例：initialCapacity&nbsp;= (
            <span>需要存储的元素个数</span> /&nbsp;负载因子)&nbsp;+&nbsp;1。注意负载因子（
            <span>即</span> loader factor）
            <span>默认为</span> 0.75，
            <span>如果暂时无法确定初始值大小，请设置为</span> 16（即默认值）。
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            反例：HashMap&nbsp;
            <span>需要放置</span> 1024&nbsp;个元素，由于没有设置容量初始大小，随着元素不断增加，容
            <span>量</span> 7 次被迫扩大，resize&nbsp;
            <span>需要重建</span> hash&nbsp;表，严重影响性能。
          </p> 
          <p class="17" align="justify" style="margin-left:47.6000pt;text-indent:-24.0500pt;text-align:justify;">
            11.&nbsp;
            <span>【推荐】使用</span> entrySet&nbsp;
            <span>遍历</span> Map&nbsp;类集合KV
            <span>，而不是</span> keySet&nbsp;方式进行遍历。
          </p> 
          <p class="MsoNormal" align="justify" style="margin-left:41.6000pt;text-indent:0.0000pt;text-align:justify;">
            说明：keySet&nbsp;
            <span>其实是遍历了</span> 2&nbsp;
            <span>次，一次是转为</span> Iterator&nbsp;
            <span>对象，另一次是从</span> hashMap&nbsp;中取出key&nbsp;
            <span>所对应的</span> value
            <span>。而</span> entrySet&nbsp;
            <span>只是遍历了一次就把</span> key&nbsp;
            <span>和</span> value&nbsp;
            <span>都放到了</span> entry&nbsp;中，效
            <span>率更高。如果是</span> JDK8
            <span>，使用</span> Map.foreach&nbsp;方法。
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            正例：values()
            <span>返回的是</span> V&nbsp;值集合，是一个list&nbsp;集合对象；keySet()
            <span>返回的是</span> K&nbsp;值集合，是
            <span>一个</span> Set&nbsp;集合对象；entrySet()
            <span>返回的是</span> K-V&nbsp;值组合集合。
          </p>
        </div>
        <br />
        <div class="Section11"> 
          <p class="17" style="text-indent:-24.05pt;">
            12.&nbsp;
            <span>【推荐】高度注意</span> Map&nbsp;
            <span>类集合</span> K/V&nbsp;
            <span>能不能存储</span> null&nbsp;值的情况，如下表格：
          </p> 
          <p class="MsoBodyText" style="margin-left:0.0000pt;">
            &nbsp;
          </p> 
          <table class="MsoNormalTable" border="1" cellspacing="0" style="border:none;"> 
            <tbody> 
              <tr> 
                <td width="146" valign="top"> 
                  <p class="15" style="margin-left:8.8500pt;">
                    <b>
                    <span style="font-family:微软雅黑;font-size:10pt;">集合类</span></b>
                    <b>
                    <span style="font-family:微软雅黑;font-size:10pt;"></span></b>
                  </p> 
                </td> 
                <td width="103" valign="top"> 
                  <p class="15" style="margin-left:8.8000pt;">
                    <b>
                    <span style="font-family:&quot;font-size:10pt;">Key</span></b>
                    <b>
                    <span style="font-family:&quot;font-size:10pt;"></span></b>
                  </p> 
                </td> 
                <td width="103" valign="top"> 
                  <p class="15" style="margin-left:8.9000pt;">
                    <b>
                    <span style="font-family:&quot;font-size:10pt;">Value</span></b>
                    <b>
                    <span style="font-family:&quot;font-size:10pt;"></span></b>
                  </p> 
                </td> 
                <td width="103" valign="top"> 
                  <p class="15" style="margin-left:8.8500pt;">
                    <b>
                    <span style="font-family:&quot;font-size:10pt;">Super</span></b>
                    <b>
                    <span style="font-family:&quot;font-size:10pt;"></span></b>
                  </p> 
                </td> 
                <td width="165" valign="top"> 
                  <p class="15" style="margin-left:8.8500pt;">
                    <b>
                    <span style="font-family:微软雅黑;font-size:10pt;">说明</span></b>
                    <b>
                    <span style="font-family:微软雅黑;font-size:10pt;"></span></b>
                  </p> 
                </td> 
              </tr> 
              <tr> 
                <td width="146" valign="top"> 
                  <p class="15" style="margin-left:8.8500pt;">
                    <span style="font-family:'Courier New';font-size:9.0000pt;">Hashtable</span>
                    <span style="font-family:'Courier New';font-size:9.0000pt;"></span>
                  </p> 
                </td> 
                <td width="103" valign="top"> 
                  <p class="15" style="margin-left:8.8000pt;">
                    <span style="font-family:宋体;color:#FF4500;font-size:9.0000pt;">不允许为 </span>
                    <span style="font-family:'Courier New';color:#FF4500;font-size:9.0000pt;">null</span>
                    <span style="font-family:'Courier New';font-size:9.0000pt;"></span>
                  </p> 
                </td> 
                <td width="103" valign="top"> 
                  <p class="15" style="margin-left:8.9000pt;">
                    <span style="font-family:宋体;color:#FF4500;font-size:9.0000pt;">不允许为 </span>
                    <span style="font-family:'Courier New';color:#FF4500;font-size:9.0000pt;">null</span>
                    <span style="font-family:'Courier New';font-size:9.0000pt;"></span>
                  </p> 
                </td> 
                <td width="103" valign="top"> 
                  <p class="15" style="margin-left:8.8500pt;">
                    <span style="font-family:'Courier New';font-size:9.0000pt;">Dictionary</span>
                    <span style="font-family:'Courier New';font-size:9.0000pt;"></span>
                  </p> 
                </td> 
                <td width="165" valign="top"> 
                  <p class="15">
                    <span style="font-family:宋体;font-size:7.0000pt;">&nbsp;</span>
                  </p> 
                  <p class="15" style="margin-left:8.8500pt;">
                    <span style="font-family:宋体;font-size:9.0000pt;">线程安全</span>
                    <span style="font-family:宋体;font-size:9.0000pt;"></span>
                  </p> 
                </td> 
              </tr> 
              <tr> 
                <td width="146" valign="top"> 
                  <p class="15" style="margin-left:8.8500pt;">
                    <span style="font-family:'Courier New';font-size:9.0000pt;">ConcurrentHashMap</span>
                    <span style="font-family:'Courier New';font-size:9.0000pt;"></span>
                  </p> 
                </td> 
                <td width="103" valign="top"> 
                  <p class="15" style="margin-left:8.8000pt;">
                    <span style="font-family:宋体;color:#FF4500;font-size:9.0000pt;">不允许为 </span>
                    <span style="font-family:'Courier New';color:#FF4500;font-size:9.0000pt;">null</span>
                    <span style="font-family:'Courier New';font-size:9.0000pt;"></span>
                  </p> 
                </td> 
                <td width="103" valign="top"> 
                  <p class="15" style="margin-left:8.9000pt;">
                    <span style="font-family:宋体;color:#FF4500;font-size:9.0000pt;">不允许为 </span>
                    <span style="font-family:'Courier New';color:#FF4500;font-size:9.0000pt;">null</span>
                    <span style="font-family:'Courier New';font-size:9.0000pt;"></span>
                  </p> 
                </td> 
                <td width="103" valign="top"> 
                  <p class="15" style="margin-left:8.8500pt;">
                    <span style="font-family:'Courier New';font-size:9.0000pt;">AbstractMap</span>
                    <span style="font-family:'Courier New';font-size:9.0000pt;"></span>
                  </p> 
                </td> 
                <td width="165" valign="top"> 
                  <p class="15" style="margin-left:8.8500pt;">
                    <span style="font-family:宋体;font-size:9.0000pt;">锁分段技术（</span>
                    <span style="font-family:'Courier New';font-size:9.0000pt;">JDK8:CAS</span>
                    <span style="font-family:宋体;font-size:9.0000pt;">）</span>
                    <span style="font-family:宋体;font-size:9.0000pt;"></span>
                  </p> 
                </td> 
              </tr> 
              <tr> 
                <td width="146" valign="top"> 
                  <p class="15" style="margin-left:8.8500pt;">
                    <span style="font-family:'Courier New';font-size:9.0000pt;">TreeMap</span>
                    <span style="font-family:'Courier New';font-size:9.0000pt;"></span>
                  </p> 
                </td> 
                <td width="103" valign="top"> 
                  <p class="15" style="margin-left:8.8000pt;">
                    <span style="font-family:宋体;color:#FF0000;font-size:9.0000pt;">不允许为 </span>
                    <span style="font-family:'Courier New';color:#FF0000;font-size:9.0000pt;">null</span>
                    <span style="font-family:'Courier New';font-size:9.0000pt;"></span>
                  </p> 
                </td> 
                <td width="103" valign="top"> 
                  <p class="15" style="margin-left:8.9000pt;">
                    <span style="font-family:宋体;color:#0000FF;font-size:9.0000pt;">允许为 </span>
                    <span style="font-family:'Courier New';color:#0000FF;font-size:9.0000pt;">null</span>
                    <span style="font-family:'Courier New';font-size:9.0000pt;"></span>
                  </p> 
                </td> 
                <td width="103" valign="top"> 
                  <p class="15" style="margin-left:8.8500pt;">
                    <span style="font-family:'Courier New';font-size:9.0000pt;">AbstractMap</span>
                    <span style="font-family:'Courier New';font-size:9.0000pt;"></span>
                  </p> 
                </td> 
                <td width="165" valign="top"> 
                  <p class="15">
                    <span style="font-family:宋体;font-size:7.0000pt;">&nbsp;</span>
                  </p> 
                  <p class="15" style="margin-left:8.8500pt;">
                    <span style="font-family:宋体;font-size:9.0000pt;">线程不安全</span>
                    <span style="font-family:宋体;font-size:9.0000pt;"></span>
                  </p> 
                </td> 
              </tr> 
              <tr> 
                <td width="146" valign="top"> 
                  <p class="15" style="margin-left:8.8500pt;">
                    <span style="font-family:'Courier New';font-size:9.0000pt;">HashMap</span>
                    <span style="font-family:'Courier New';font-size:9.0000pt;"></span>
                  </p> 
                </td> 
                <td width="103" valign="top"> 
                  <p class="15" style="margin-left:8.8000pt;">
                    <span style="font-family:宋体;color:#0000FF;font-size:9.0000pt;">允许为 </span>
                    <span style="font-family:'Courier New';color:#0000FF;font-size:9.0000pt;">null</span>
                    <span style="font-family:'Courier New';font-size:9.0000pt;"></span>
                  </p> 
                </td> 
                <td width="103" valign="top"> 
                  <p class="15" style="margin-left:8.9000pt;">
                    <span style="font-family:宋体;color:#0000FF;font-size:9.0000pt;">允许为 </span>
                    <span style="font-family:'Courier New';color:#0000FF;font-size:9.0000pt;">null</span>
                    <span style="font-family:'Courier New';font-size:9.0000pt;"></span>
                  </p> 
                </td> 
                <td width="103" valign="top"> 
                  <p class="15" style="margin-left:8.8500pt;">
                    <span style="font-family:'Courier New';font-size:9.0000pt;">AbstractMap</span>
                    <span style="font-family:'Courier New';font-size:9.0000pt;"></span>
                  </p> 
                </td> 
                <td width="165" valign="top"> 
                  <p class="15">
                    <span style="font-family:宋体;font-size:7.0000pt;">&nbsp;</span>
                  </p> 
                  <p class="15" style="margin-left:8.8500pt;">
                    <span style="font-family:宋体;font-size:9.0000pt;">线程不安全</span>
                    <span style="font-family:宋体;font-size:9.0000pt;"></span>
                  </p> 
                </td> 
              </tr> 
            </tbody> 
          </table> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            <span>反例：</span> 
            <span>由于</span> HashMap&nbsp;
            <span>的干扰，很多人认为</span> ConcurrentHashMap&nbsp;
            <span>是可以置入</span> null&nbsp;
            <span>值，而事实上，</span> 
            <span>存储</span> null&nbsp;
            <span>值时会抛出</span> NPE&nbsp;异常。
          </p> 
          <p class="17" style="text-indent:-18pt;">
            13.&nbsp;【参考】合理利用好集合的有序性(sort)和稳定性(order)，避免集合的无序性(unsort)和不稳定性(unorder)带来的负面影响。
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            说明：有序性是指遍历的结果是按某种比较规则依次排列的。稳定性指集合每次遍历的元素次序是一定的。如：ArrayList&nbsp;
            <span>是</span> order/unsort；HashMap&nbsp;
            <span>是</span> unorder/unsort；TreeSet&nbsp;是order/sort。
          </p> 
          <p class="17" style="text-indent:-24.05pt;">
            14.&nbsp;
            <span>【参考】利用</span> Set&nbsp;
            <span>元素唯一的特性，可以快速对一个集合进行去重操作，避免使用</span> List&nbsp;的
          </p> 
          <p class="MsoNormal" style="margin-left:41.6pt;text-indent:0pt;">
            contains&nbsp;方法进行遍历、对比、去重操作。
          </p> 
          <p class="MsoBodyText" style="margin-left:0.0000pt;">
            &nbsp;
          </p> 
          <p class="MsoBodyText" style="margin-left:0.0000pt;">
            &nbsp;
          </p> 
          <h1>
            <b>(</b>
            <b>六</b>
            <b>) </b>
            <b>并发处理</b>
            <b></b>
          </h1> 
          <p class="17" style="text-indent:-18pt;">
            1.&nbsp;【强制】获取单例对象需要保证线程安全，其中的方法也要保证线程安全。说明：资源驱动类、工具类、单例工厂类都需要注意。
          </p> 
          <p class="17" style="text-indent:-17.8pt;">
            2.&nbsp;【强制】创建线程或线程池时请指定有意义的线程名称，方便出错时回溯。正例：
          </p> 
          <p class="MsoNormal" style="margin-left:77.6pt;text-indent:-18pt;">
            public class TimerTaskThread extends Thread { public TimerTaskThread() {
          </p> 
          <p class="MsoNormal" style="margin-left:100.15pt;text-indent:0pt;">
            super.setName("TimerTaskThread");
          </p> 
          <p class="MsoNormal" style="margin-left:100.15pt;text-indent:0pt;">
            ...
          </p> 
          <p class="MsoNormal" style="margin-left:77.6pt;text-indent:0pt;">
            }
          </p> 
          <p class="MsoNormal" style="margin-left:59.7pt;text-indent:0pt;">
            }
          </p> 
          <p class="MsoBodyText" style="margin-left:0.0000pt;">
            &nbsp;
          </p> 
          <p class="17" style="text-indent:-18.05pt;">
            3.&nbsp;【强制】线程资源必须通过线程池提供，不允许在应用中自行显式创建线程。
          </p> 
          <p class="MsoBodyText" align="justify" style="text-align:justify;">
            说明：使用线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源的开销，解决资源不足的问题。如果不使用线程池，有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。
          </p>
        </div>
        <br />
        <div class="Section12"> 
          <p class="17" style="text-indent:-17.8pt;">
            4.&nbsp;
            <span>【强制】线程池不允许使用</span> Executors&nbsp;
            <span>去创建，而是通过</span> ThreadPoolExecutor&nbsp;的方式，这样的处理方式让写的同学更加明确线程池的运行规则，规避资源耗尽的风险。
          </p> 
          <p class="MsoNormal" style="margin-left:41.25pt;text-indent:0pt;">
            说明：Executors&nbsp;返回的线程池对象的弊端如下：
          </p> 
          <p class="17" style="text-indent:-18.8pt;">
            1）&nbsp;FixedThreadPool&nbsp;
            <span>和</span> SingleThreadPool:
          </p> 
          <p class="MsoNormal" style="margin-left:65.6pt;text-indent:0pt;">
            <span>允许的请求队列长度为</span> Integer.MAX_VALUE
            <span>，可能会堆积大量的请求，从而导致</span> OOM。
          </p> 
          <p class="17" style="text-indent:-18.8pt;">
            2）&nbsp;CachedThreadPool&nbsp;
            <span>和</span> ScheduledThreadPool:
          </p> 
          <p class="MsoNormal" style="margin-left:65.6pt;text-indent:0pt;">
            <span>允许的创建线程数量为</span> Integer.MAX_VALUE
            <span>，可能会创建大量的线程，从而导致</span> OOM。
          </p> 
          <p class="17" style="text-indent:-17.8pt;">
            5.&nbsp;【强制】SimpleDateFormat&nbsp;
            <span>是线程不安全的类，一般不要定义为</span> static&nbsp;变量，如果定义为
          </p> 
          <p class="MsoNormal" style="margin-left:41.25pt;text-indent:0pt;">
            static
            <span>，必须加锁，或者使用</span> DateUtils&nbsp;工具类。
          </p> 
          <p class="MsoNormal" style="margin-left:41.25pt;text-indent:0pt;">
            正例：
            <span>注意线程安全，使用</span> DateUtils。亦推荐如下处理：
          </p> 
          <p class="MsoNormal" style="margin-left:59.6pt;text-indent:0pt;">
            private static final ThreadLocal&lt;DateFormat&gt; df = new ThreadLocal&lt;DateFormat&gt;() {
          </p> 
          <p class="MsoNormal" style="margin-left:82.15pt;text-indent:0pt;">
            @Override
          </p> 
          <p class="MsoNormal" style="margin-left:82.15pt;text-indent:0pt;">
            protected DateFormat initialValue()&nbsp;{
          </p> 
          <p class="MsoNormal" style="margin-left:104.6pt;text-indent:0pt;">
            return new SimpleDateFormat("yyyy-MM-dd");
          </p> 
          <p class="MsoNormal" style="margin-left:82.15pt;text-indent:0pt;">
            }
          </p> 
          <p class="MsoNormal" style="margin-left:64.15pt;text-indent:0pt;">
            };
          </p> 
          <p class="MsoNormal" align="justify" style="margin-left:41.6000pt;text-indent:0.0000pt;text-align:justify;">
            说明：
            <span>如果是</span> JDK8&nbsp;
            <span>的应用，可以使用</span> Instant&nbsp;
            <span>代替</span> Date，LocalDateTime&nbsp;
            <span>代替</span> Calendar
            <span>，</span> DateTimeFormatter&nbsp;
            <span>代替</span> SimpleDateFormat，官方给出的解释：simple&nbsp;beautiful&nbsp;strong immutable&nbsp;thread-safe。
          </p> 
          <p class="17" align="justify" style="margin-left:41.2500pt;text-indent:-17.8000pt;text-align:justify;">
            6.&nbsp;【强制】高并发时，同步调用应该去考量锁的性能损耗。能用无锁数据结构，就不要用锁；能锁区块，就不要锁整个方法体；能用对象锁，就不要用类锁。
          </p> 
          <p class="MsoBodyText" align="justify" style="text-align:justify;">
            说明：
            <span>尽可能使加锁的代码块工作量尽可能的小，避免在锁代码块中调用</span> RPC 方法。
          </p> 
          <p class="MsoBodyText" style="margin-left:0.0000pt;">
            &nbsp;
          </p> 
          <p class="17" align="justify" style="margin-left:41.6000pt;text-indent:-18.0000pt;text-align:justify;">
            7.&nbsp;【强制】对多个资源、数据库表、对象同时加锁时，需要保持一致的加锁顺序，否则可能会造成死锁。
          </p> 
          <p class="MsoBodyText" align="justify" style="text-align:justify;">
            说明：
            <span>线程一需要对表</span> A、B、C&nbsp;依次全部加锁后才可以进行更新操作，那么线程二的加锁顺序
            <span>也必须是</span> A、B、C，否则可能出现死锁。
          </p> 
          <p class="17" align="justify" style="margin-left:41.6000pt;text-indent:-18.0000pt;text-align:justify;">
            8.&nbsp;【强制】并发修改同一记录时，避免更新丢失，需要加锁。要么在应用层加锁，要么在缓存加
            <span>锁，要么在数据库层使用乐观锁，使用</span> version&nbsp;作为更新依据。
          </p> 
          <p class="MsoBodyText" align="justify" style="text-align:justify;">
            说明：
            <span>如果每次访问冲突概率小于</span> 20%，推荐使用乐观锁，否则使用悲观锁。乐观锁的重试次
            <span>数不得小于</span> 3&nbsp;次。
          </p> 
          <p class="17" align="justify" style="margin-left:41.6000pt;text-indent:-18.0000pt;text-align:justify;">
            9.&nbsp;【强制】多线程并行处理定时任务时，Timer&nbsp;
            <span>运行多个</span> TimeTask&nbsp;时，只要其中之一没有捕获
            <span>抛出的异常，其它任务便会自动终止运行，使用</span> ScheduledExecutorService&nbsp;则没有这个问题。
          </p> 
          <p class="17" align="justify" style="margin-left:41.6000pt;text-indent:-18.0000pt;text-align:justify;">
            10.&nbsp;
            <span>【推荐】使用</span> CountDownLatch&nbsp;
            <span>进行异步转同步操作，每个线程退出前必须调用</span> countDown 
            <span>方法，线程执行代码注意</span> catch&nbsp;
            <span>异常，确保</span> countDown&nbsp;方法被执行到，避免主线程无法执行
            <span>至</span> await&nbsp;方法，直到超时才返回结果。
          </p> 
          <p class="MsoNormal" align="justify" style="margin-left:41.6000pt;text-indent:0.0000pt;text-align:justify;">
            说明：
            <span>注意，子线程抛出异常堆栈，不能在主线程</span> try-catch&nbsp;到。
          </p>
        </div>
        <br />
        <div class="Section13"> 
          <p class="17" style="text-indent:-24.05pt;">
            11.&nbsp;
            <span>【推荐】避免</span> Random&nbsp;实例被多线程使用，虽然共享该实例是线程安全的，但会因竞争同一
          </p> 
          <p class="17" style="text-indent:-24.05pt;">
            <br />
          </p> 
          <p class]]>
          </description> 
          <link>http://wisina.top/index.php?m=blog&amp;f=view&amp;t=xml&amp;articleID=13</link> <category>
            开发手册
          </category> 
          <pubDate>
            2020-04-25 23:33:00 +0800
          </pubDate> 
        </item> 
        <item> 
          <title>明天还是明天</title> <description><![CDATA[ 明天还是明天]]>
          </description> 
          <link>http://wisina.top/index.php?m=article&amp;f=view&amp;t=xml&amp;articleID=12</link> <category>
            一二三
          </category> 
          <pubDate>
            2014-10-08 17:44:00 +0800
          </pubDate> 
        </item> 
        <item> 
          <title>关于我们</title> <description><![CDATA[ 这好]]>
          </description> 
          <link>http://wisina.top/index.php?m=page&amp;f=view&amp;t=xml&amp;articleID=11</link> <category>
            11
          </category> 
          <pubDate>
            2014-10-08 14:38:00 +0800
          </pubDate> 
        </item> 
        <item> 
          <title>推荐空间</title> <description><![CDATA[ <p>我们不推荐大家使用iis + php的空间，存在诸多问题。下面列出的空间都是经过我们测试的，可以选购。
              </p>
              <h4>首先推荐：
                <a href="http://www.chanzhi.net">云蝉知</a>
              </h4>
              <p>云蝉知是蝉知团队运营的免费建站服务，不需要备案，不需要维护，简单方便。
            </p>
            <h4>
              推荐2：
              <a href="http://www.londit.com/aff/d3djY3NzQGdtYWlsLmNvbQ==">浪点云主机</a>：
            </h4>
            <p>
              浪点云主机服务器在香港，不需要备案，linux + apache + php环境，经过我们测试可以流畅运行蝉知系统，也支持伪静态。价格也比较实惠。想自己安装，自己维护的朋友可以选择。
              <a href="http://www.londit.com/aff/d3djY3NzQGdtYWlsLmNvbQ==">点击此链接购买：</a>
            </p>
            <p>
              <br />
            </p>
            <p>
              附：大家有什么推荐的空间也都可以联系我们进行评测。
            </p>
            ]]>
          </description> 
          <link>http://wisina.top/index.php?m=page&amp;f=view&amp;t=xml&amp;articleID=2</link> <category>
            蝉知动态
          </category> 
          <pubDate>
            2014-08-25 14:17:00 +0800
          </pubDate> 
        </item> 
        <item> 
          <title>安全升级，蝉知2.5.2发布</title> <description><![CDATA[ <h4>一、修改记录
              </h4>
              <ol>
                <li>新增防xss跨站攻击处理</li>
                <li>优化后台区块管理操作体验</li>
              <li>修复通过字段可进行sql注入的漏洞</li>
              <li>修复产品数据结构bug</li>
              <li>修复繁体版安装失败bug</li>
              <li>修复论坛帖子隐藏显示bug</li>
            </ol>
            <h4>
              二、下载地址
            </h4>
            源码包： 
            <a href="http://dl.xirangit.com/eps/2.5/chanzhiEPS.2.5.2.zip">http://dl.xirangit.com/eps/2.5/chanzhiEPS.2.5.2.zip</a> <h4>
              三、安装和升级文档
            </h4>
            安装文档：
            <a href="http://www.chanzhi.org/book/chanzhieps/5.html">http://www.chanzhi.org/book/chanzhieps/5.html</a><br />
            升级文档：
            <a href="http://www.chanzhi.org/book/chanzhieps/68.html">http://www.chanzhi.org/book/chanzhieps/68.html</a><br />
            <h4>
              四、演示
            </h4>
            前台演示：
            <a href="http://demo.chanzhi.org">http://demo.chanzhi.org</a><br />
            <p>
              后台演示：
              <a href="http://demo.chanzhi.org/chanzhiadmin.php">http://demo.chanzhi.org/chanzhiadmin.php</a>
            </p>
            ]]>
          </description> 
          <link>http://wisina.top/index.php?m=article&amp;f=view&amp;t=xml&amp;articleID=1</link> <category>
            蝉知动态
          </category> 
          <pubDate>
            2014-08-21 13:55:00 +0800
          </pubDate> 
        </item> 
        <item> 
          <title>多处改进，蝉知2.5.1正式版发布</title> <description><![CDATA[ <div class="text-danger">本次升级修复了两个安全漏洞，建议大家及时更新。
              </div>
              <h4>一、2.5.1修改记录
              </h4>
              <ol>
                <li>文章详情页面最后编辑放在页尾</li>
                <li>调整了后台区块设置颜色的界面</li>
              <li>二维码图片设置默认的宽度和高度</li>
              <li>处理留言和回复的时候，把留言或者评论的内容显示在回复框里面</li>
              <li>修复开放登录的图片地址</li>
              <li>手册文章的评论没有显示手册的查看链接</li>
              <li>调整php源码区块的样式</li>
              <li>zui里面的弹出框里面的"好的"改为"确定"</li>
              <li>布局页面的操作统一改为图标按钮</li>
              <li>跳转页面需要加placeholder，提示用户输入链接</li>
              <li>关注我们改为区块实现，样式调整</li>
              <li>检查ie11下面的兼容性问题</li>
              <li>php源码的ok文件提示不要放在文本框架里面</li>
              <li>全局样式菜单直接改成全局样式增加代码高亮</li>
              <li>如果站点类型是博客的话，把网站首页的链接去掉可以支持小图标</li>
              <li>产品的摘要改为简介</li>
              <li>类目管理放到类目的最下面</li>
              <li>类目维护后面增加x按钮，可以删除</li>
              <li>调整论坛帖子转移的逻辑</li>
              <li>调整上传模板页面的的样式</li>
              <li>源代码区块改为html源代码，设置选项，直接语法高亮</li>
              <li>新闻，产品列表的删除放在最后面</li>
              <li>把IE6提示代码放到js里加载，同时简化提示内容</li>
              <li>修复火狐下面导航错位问题</li>
              <li>解决后台文章管理模块，左边栏 类目浏览 如果文章类目过多会被遮盖，且无法向下滚动的问题</li>
            </ol>
            <h4>
              二、下载地址
            </h4>
            源码包： 
            <a href="http://dl.xirangit.com/eps/2.5/chanzhiEPS.2.5.1.zip">http://dl.xirangit.com/eps/2.5/chanzhiEPS.2.5.1.zip</a> <h4>
              三、安装和升级文档
            </h4>
            安装文档：
            <a href="http://www.chanzhi.org/book/chanzhieps/5.html">http://www.chanzhi.org/book/chanzhieps/5.html</a><br />
            升级文档：
            <a href="http://www.chanzhi.org/book/chanzhieps/68.html">http://www.chanzhi.org/book/chanzhieps/68.html</a><br />
            <h4>
              四、演示
            </h4>
            前台演示：
            <a href="">http://demo.chanzhi.org</a><br />
            <p>
              后台演示：
              <a href="/chanzhiadmin.php">http://demo.chanzhi.org/chanzhiadmin.php</a>
            </p>
            <h4>
              五、新功能截图
            </h4>
            <p>
              <br />
            </p>
            <p>
              区块颜色自定义预览
            </p>
            <p>
              <img class="card" src="http://www.chanzhi.org/data/upload/201408/f_612657d0b55bc2041168d5dc5e130b7f.jpg" alt="" />
            </p>
            <p>
              区块颜色自定义
            </p>
            <p>
              <img class="card" src="http://www.chanzhi.org/data/upload/201408/f_cbc7faa692abdbd2ddc70a471603d00d.jpg" alt="" />
            </p>
            <p>
              代码高亮
            </p>
            <p>
              <img class="card" src="http://www.chanzhi.org/data/upload/201408/f_3df23e03df90e34cc826e2e6ca2ac857.jpg" alt="" />
            </p>
            <p>
              关于我们页面区块设置
            </p>
            <p>
              <img class="card" src="http://www.chanzhi.org/data/upload/201408/f_7d0a448e87f61db219f7f06372f79683.jpg" alt="" />
            </p>
            <p>
              <img class="card" src="http://www.chanzhi.org/data/upload/201408/f_df8a18eb7d0b23ee46eea14d70d7eff5.jpg" alt="" />
            </p>
            ]]>
          </description> 
          <link>http://wisina.top/index.php?m=article&amp;f=view&amp;t=xml&amp;articleID=4</link> <category>
            蝉知动态
          </category> 
          <pubDate>
            2014-08-19 15:15:00 +0800
          </pubDate> 
        </item> 
        <item> 
          <title>蝉知企业门户2.5beta版本发布</title> <description><![CDATA[ <h4>一、2.5修改记录
              </h4>
              <p>1、实现模板和主题风格的概念<br />
                2、将前台的模板文件独立出来<br />
                3、实现模板的导入功能<br />
                4、模板体系可以定义支持的区块和布局列表<br />
                5、增加插件管理机制<br />
                6、后台布局的区块、导航、手册等列表页面的排序改为拖动排序 <br />
                7、增加php源代码区块<br />
                8、源代码区块增加代码编辑器<br />
                9、区块增加更多颜色的配置<br />
                10、自定义区块也支持更多链接<br />
                11、公司简介区块还原更多链接<br />
                12、留言、评论支持回复功能<br />
                13、留言、评论列表显示所有回复<br />
                14、发表评论的时候可以选择是否接收邮件通知<br />
                15、评论被回复的时候，发送邮件通知评论作者<br />
                16、后台留言和评论通过之后也可以删除<br />
                17、设置产品的价格货币单位使用符号<br />
                18、调整没有任何参数的产品的详情页面<br />
                19、产品简介添加编辑器<br />
                20、用户可以直接定义一个全局的样式<br />
                21、调整手机版本下面幻灯的显示样式<br />
                22、登录注册的代码不应当出现在文档开始的地方<br />
                23、编辑手册的时候，记住当时点击的锚点<br />
                24、将文章详情页面底部的空白标签去掉<br />
                25、博客、论坛、手册功能关闭的时候，站点地图不显示这些模块<br />
                26、重新调整论坛的主题转移功能<br />
                27、类目维护页面增加添加按钮，可以新增一个类目框<br />
                28、类目、文章、主题可以是一个链接，当浏览该类目时，跳转到其他的链接地址<br />
                29、后台的主题、帖子、留言的删除改用zui里面的对话框<br />
                30、修改ie6的检查提示方式<br />
                31、二维码只有打开的时候再请求<br />
                32、图片浏览只能后台才可以使用，前台不能使用<br />
                33、日志文件增加.php扩展名<br />
                34、附件目录、system目录每个都创建空白的index.php文件<br />
                35、升级的时候去掉ok文件的检查<br />
                36、手册文章显示最后更新时间<br />
                37、后台的文章、博客、产品列表增加图片链接<br />
                38、调整帖子详情附件上传的表单样式<br />
                39、调整后台的文章、博客、产品等模块点开的附件上传表单修改样式<br />
                40、升级到2.5的时候，将之前的日志文件删除掉<br />
                41、备案信息增加链接<br />
                42、幻灯的链接应当指定是否是新开窗口<br />
                43、调整ie11下载附件的逻辑<br />
                44、后台的用户检索可以模糊检索<br />
                45、公司联系方式增加公司网址<br />
                46、处理QQ登录相关报错
              </p>
              <h4>二、下载地址
              </h4>
              源码包：
              <a href="http://dl.xirangit.com/eps/2.5/chanzhiEPS.2.5.beta.zip">http://dl.xirangit.com/eps/2.5/chanzhiEPS.2.5.beta.zip</a><br />
            <h4>
              三、安装和升级文档
            </h4>
            安装文档：
            <a href="http://www.chanzhi.org/book/chanzhieps/5.html">http://www.chanzhi.org/book/chanzhieps/5.html</a><br />
            升级文档：
            <a href="http://www.chanzhi.org/book/chanzhieps/68.html">http://www.chanzhi.org/book/chanzhieps/68.html</a><br />
            <h4>
              四、演示
            </h4>
            前台演示：
            <a href="http://demo.chanzhi.org">http://demo.chanzhi.org</a><br />
            <p>
              后台演示：
              <a href="http://demo.chanzhi.org/chanzhiadmin.php">http://demo.chanzhi.org/chanzhiadmin.php</a>
            </p>
            <h4>
              五、功能截图
            </h4>
            <h5>
              1.评论留言可重复回复
            </h5>
            <p class="card">
              <img src="http://www.chanzhi.org/data/upload/201408/f_968ab3b123324b54b320474c18831d80.png" alt="" />
            </p>
            <h5>
              2.可以拖拽排序
            </h5>
            <p class="card">
              <img src="http://www.chanzhi.org/data/upload/201408/f_421c572e99cb6d806874bfce45bd3f8d.png" alt="" />
            </p>
            <p class="card">
              <img src="http://www.chanzhi.org/data/upload/201408/f_e6ae3162b920498fe9daca5701cc87de.png" alt="" />
            </p>
            <h5>
              3.模板设置
            </h5>
            <p class="card">
              <img src="http://www.chanzhi.org/data/upload/201408/f_db80a5a9766e874e41d726174b0df05c.png" alt="" />
            </p>
            <h5>
              4.代码编辑器
            </h5>
            <p class="card">
              <img src="http://www.chanzhi.org/data/upload/201408/f_8e536ec6c0c4857b4cef62af88c81cde.png" alt="" />
            </p>
            ]]>
          </description> 
          <link>http://wisina.top/index.php?m=article&amp;f=view&amp;t=xml&amp;articleID=5</link> <category>
            蝉知动态
          </category> 
          <pubDate>
            2014-08-06 11:10:00 +0800
          </pubDate> 
        </item> 
        <item> 
          <title>蝉知企业门户2.4正式版发布</title> <description><![CDATA[ <h4>一、2.4修改记录
              </h4>
              <p>后台博客、产品、文章列表增加按照类目浏览功能<br />
                解决新版本的火狐二级导航错位问题<br />
                优化产品列表和详情页面的样式<br />
                论坛版块描述支持html标签显示<br />
                修复幻灯片删除第一个链接按钮后无法保存的bug<br />
                处理部分面包屑里面的类目地址bug
              </p>
              <p>解决部分图标无法显示bug<br />
                调整对话框的默认样式<br />
                区块增加更多链接<br />
                优化编辑区块操作体验，编辑后停留在编辑页面<br />
                调整文章的来源字段类型和显示效果<br />
                <span>前端</span>优化：代码把ie8相关的js脚本打包成一个ie8.js<br />
                前端优化：将treeview.js和treeview.css打包到all.css和all.js中<br />
                将前台每个列表页面默认记录数改成从配置项获取<br />
                附件列表不再显示编辑器上传的图片<br />
                优化评论和留言列表的样式<br />
                去掉论坛主题里面p标记的margin<br />
                调整蝉知系统默认的字体大小<br />
                修改布局的区域名称使之更容易理解<br />
                zui里面去掉p标记的margin<br />
                减少布局中列与列之间的间距<br />
                导航设置默认折叠起来<br />
                版块编辑器增加源代码标签<br />
                版块的描述字段长度调成text类型。<br />
                解决编辑器上传附件使用现有的图片时，缩略图地址错误的bug<br />
                调整前台首页友情链接的样式<br />
                留言和评论增加需要审核之后才会显示的提示。<br />
                幻灯功能优化：
                <span>优化了后台管理界面</span>，排序不再需要手动点击保存排序按钮，<br />
              解决通过之前评论时，留言也会被通过的bug<br />
              后台删除主题或者回帖的时候添加确认提示<br />
              前台主题的维护选项增加转移功能<br />
              增加logo删除功能
            </p>
            <p>
              <span style="color:inherit;font-size:14px;font-weight:bold;line-height:1.1;"><br /></span>
            </p>
            <p>
              <span style="color:inherit;font-size:14px;font-weight:bold;line-height:1.1;">二、下载地址</span>
            </p>
            源码包：
            <a href="http://dl.xirangit.com/eps/2.4/chanzhiEPS.2.4.zip">http://dl.xirangit.com/eps/2.4/chanzhiEPS.2.4.zip</a><br />
            <h4>
              三、安装和升级文档
            </h4>
            安装文档：
            <a href="http://www.chanzhi.org/book/chanzhieps/5.html">http://www.chanzhi.org/book/chanzhieps/5.html</a><br />
            升级文档：
            <a href="http://www.chanzhi.org/book/chanzhieps/68.html">http://www.chanzhi.org/book/chanzhieps/68.html</a><br />
            <h4>
              四、演示
            </h4>
            前台演示：
            <a href="http://demo.chanzhi.org">http://demo.chanzhi.org</a><br />
            <p>
              后台演示：
              <a href="http://demo.chanzhi.org/chanzhiadmin.php">http://demo.chanzhi.org/chanzhiadmin.php</a>
            </p>
            <h4>
              五、功能截图
            </h4>
            <p>
              <img src="http://www.chanzhi.org/data/upload/201406/f_88e288f0d4db03b1124f0915d1d7f85c.png" alt="" class="card" />
            </p>
            <p>
              <img src="http://www.chanzhi.org/data/upload/201406/f_fbd7d140a337affb0618f17131548a8a.png" alt="" class="card" />
            </p>
            <p>
              <img src="http://www.chanzhi.org/data/upload/201406/f_b36c0d33a50a44804463e5f8cab37182.png" alt="" class="card" />
            </p>
            <p>
              <img src="http://www.chanzhi.org/data/upload/201406/f_27bcc27d111ebb12904cd19ab5e7b206.png" alt="" class="card" />
            </p>
            ]]>
          </description> 
          <link>http://wisina.top/index.php?m=article&amp;f=view&amp;t=xml&amp;articleID=6</link> <category>
            蝉知动态
          </category> 
          <pubDate>
            2014-06-25 14:10:00 +0800
          </pubDate> 
        </item> 
        <item> 
          <title>ZUI文档更新</title> <description><![CDATA[ <p>大家好就，在我们团队浩浩同学的努力下，zui文档的整理工作已经初步完成，zui发布以来大家一直都比较关注，很多朋友催我们更新文档，这次终于可以给大家一个比较完善的手册。请大家到
                <span style="line-height:1.428571429;">zui文档的官方地址：</span>
                <span style="line-height:1.428571429;">
              <a href="http://devel.cnezsoft.com/page/zui.html">http://devel.cnezsoft.com/page/zui.html</a></span>
              <span style="line-height:1.428571429;">查看。</span>
            </p>
            <p>
              <span style="line-height:1.428571429;">
              <img src="http://www.chanzhi.org/data/upload/201406/f_d81b3cd8361b97c639574b9184d2050d.jpg" alt="" /><br />
              <br /></span>
            </p>
            <p>
              <span style="line-height:1.428571429;">
              <img src="http://www.chanzhi.org/data/upload/201406/f_9b835d5e180020bb9aadffdefddfa4dc.jpg" alt="" /><br /></span>
            </p>
            <p>
              <br />
            </p>
            <p>
              <span style="background-color:#FAFAFA;color:#19751A;font-size:18px;font-weight:bold;line-height:1.1;">PS:ZUI构建于众多优秀的开源项目之上</span>
            </p>
            <p>
              <span style="background-color:#FAFAFA;color:#19751A;font-size:18px;font-weight:bold;line-height:1.1;"><br /></span>
            </p>
            <div class="col-md-3 col-sm-4" style="font-size:14px;text-align:center;background-color:#FAFAFA;">
              <a href="http://necolas.github.io/normalize.css/" class="card">
              <strong class="card-heading">normalize</strong></a>
            </div>
            <div class="col-md-3 col-sm-4" style="font-size:14px;text-align:center;background-color:#FAFAFA;">
              <a href="http://jquery.com/" class="card">
              <strong class="card-heading">jQuery</strong></a>
            </div>
            <div class="col-md-3 col-sm-4" style="font-size:14px;text-align:center;background-color:#FAFAFA;">
              <a href="http://getbootstrap.com/" class="card">
              <strong class="card-heading">Bootstrap</strong></a>
            </div>
            <div class="col-md-3 col-sm-4" style="font-size:14px;text-align:center;background-color:#FAFAFA;">
              <a href="http://kindeditor.net/" class="card">
              <strong class="card-heading">kindeditor</strong></a>
            </div>
            <div class="col-md-3 col-sm-4" style="font-size:14px;text-align:center;background-color:#FAFAFA;">
              <a href="http://harvesthq.github.io/chosen/" class="card">
              <strong class="card-heading">Chosen</strong></a>
            </div>
            <div class="col-md-3 col-sm-4" style="font-size:14px;text-align:center;background-color:#FAFAFA;">
              <a href="http://www.malot.fr/bootstrap-datetimepicker" class="card">
              <strong class="card-heading">Datetime picker</strong></a>
            </div>
            <div class="col-md-3 col-sm-4" style="font-size:14px;text-align:center;background-color:#FAFAFA;">
              <a href="http://lesscss.org/" class="card">
              <strong class="card-heading">Less</strong></a>
            </div>
            <div class="col-md-3 col-sm-4" style="font-size:14px;text-align:center;background-color:#FAFAFA;">
              <a href="http://fortawesome.github.io/Font-Awesome/" class="card">
              <strong class="card-heading">FontAwesome</strong></a>
            </div>
            <div class="col-md-3 col-sm-4" style="font-size:14px;text-align:center;background-color:#FAFAFA;">
              <a href="https://code.google.com/p/google-code-prettify/" class="card">
              <strong class="card-heading">google code prettify</strong></a>
            </div>
            <br />
            <p>
              <br />
            </p>
            <p>
              <br />
            </p>
            <p>
              <br />
            </p>
            <p>
              <br />
            </p>
            <p>
              <br />
            </p>
            <p>
              <br />
            </p>
            <p>
              <br />
            </p>
            <p>
              <br />
            </p>
            <p>
              <br />
            </p>
            <p>
              <br />
            </p>
            <p>
              <strong>向他们致谢！</strong>
            </p>
            ]]>
          </description> 
          <link>http://wisina.top/index.php?m=article&amp;f=view&amp;t=xml&amp;articleID=3</link> <category>
            蝉知动态
          </category> 
          <pubDate>
            2014-06-09 14:30:00 +0800
          </pubDate> 
        </item> 
        <item> 
          <title>蝉知企业门户2.3正式版发布</title> <description><![CDATA[ <h4>提示：
              </h4>
              <p>1、这次升级我们修改了
                <span>蝉知系统版权</span>，请大家仔细阅读。
              </p>
              <p>     蝉知系统版权： 
              <a href="http://www.chanzhi.org/book/chanzhieps/58_license.html">http://www.chanzhi.org/book/chanzhieps/58_license.html</a>
            </p>
            <p>
              2、后台站点设置添加了首页关键字，首页标题算法改为首页关键字+站点名称，升级后需要大家根据需要重新设置一下。
            </p>
            <h4>
              一、2.3修改记录
            </h4>
            <ol>
              <li>
              <span style="line-height:1.428571429;">博客页面应当增加对所有页面区块的支持</span></li>
              <li>
              <span style="line-height:1.428571429;">解决文章详情页面微博推广按钮不删除验证代码就不能显示问题</span></li>
              <li>
              <span style="line-height:1.428571429;">解决宽屏主题登录注册按钮不显示问题</span></li>
              <li>
              <span style="line-height:1.428571429;">解决部署在二级目录时微信的接入地址的bug </span></li>
              <li>
              <span style="line-height:1.428571429;">解决后台的用户列表中重复显示的bug </span></li>
              <li>
              <span style="line-height:1.428571429;">修复新浪会员链接</span></li>
              <li>
              <span style="line-height:1.428571429;">单页可以控制页面的布局</span></li>
              <li>
              <span style="line-height:1.428571429;">优化时间显示，去除00:00的显示</span></li>
              <li>
              <span style="line-height:1.428571429;">文章的来源增加翻译选项</span></li>
              <li>
              <span style="line-height:1.428571429;">二维码的图片缩小了一些</span></li>
              <li>
              <span style="line-height:1.428571429;">后台设置开放登录的图标用亮色的</span></li>
              <li>
              <span style="line-height:1.428571429;">删除zepto.js文件</span></li>
              <li>
              <span style="line-height:1.428571429;">调整蝉知默认的字体的大小</span></li>
              <li>
              <span style="line-height:1.428571429;">留言的图标采用亮色的</span></li>
              <li>
              <span style="line-height:1.428571429;">增加检查更新的功能</span></li>
              <li>
              <span style="line-height:1.428571429;">安装升级界面添加蝉知协议</span></li>
              <li>论坛版块和博客类目的别名不能使用数字</li>
              <li>
              <span style="line-height:1.428571429;">论坛后台的回帖链接应当新开页面</span></li>
              <li>
              <span style="line-height:1.428571429;">个人中心我的主题里面，最新回帖显示真实姓名</span></li>
              <li>
              <span style="line-height:1.428571429;">论坛发贴的时候，判断所属版块是否存在且可读</span></li>
              <li>
              <span style="line-height:1.428571429;">论坛版块列表页面的版主显示真实姓名</span></li>
              <li>
              <span style="line-height:1.428571429;">管理员或者版主身份在前台显示的时候应当给予标识</span></li>
              <li>
              <span style="line-height:1.428571429;">论坛增加帖子转移功能</span></li>
              <li>
              <span style="line-height:1.428571429;">后台单独增加一个首页关键词的设置</span></li>
              <li>
              <span style="line-height:1.428571429;">升级程序需要处理之前的站点描述信息，将html标签去掉</span></li>
              <li>
              <span style="line-height:1.428571429;">产品购买链接新窗口打开</span></li>
              <li>
              <span style="line-height:1.428571429;">提供了iis下面的重写规则</span></li>
              <li>
              <span style="line-height:1.428571429;">头部区域的logo，站点口号，登录注册也用区块显示</span></li>
              <li>
              <span style="line-height:1.428571429;">整理英语下面的翻译</span></li>
              <li>
              <span style="line-height:1.428571429;">首页布局调整，使之能显示最新产品</span></li>
              <li>
              <span style="line-height:1.428571429;">编辑器里面的图片库，文件库可以从我们附件表里面选择</span></li>
              <li>
              <span style="line-height:1.428571429;">对于禁用的会员，希望后台可以增加解除禁用功能</span></li>
              <li>
              <span style="line-height:1.428571429;">公司简介区块更多链接放在标题右侧</span></li>
              <li>
              <span style="line-height:1.428571429;">文章列表显示的条目数可自己设置。</span></li>
              <li>
              <span style="line-height:1.428571429;">站点增加类型设置，可以选择企业门户或者个人门户</span></li>
              <li>
              <span style="line-height:1.428571429;">幻灯文字和图片给予提示</span></li>
              <li>
              <span style="line-height:1.428571429;">幻灯可以有多个按钮</span></li>
              <li>
              <span style="line-height:1.428571429;">每一个幻灯都可以指定文字的颜色和背景色</span></li>
              <li>
              <span style="line-height:1.428571429;">幻灯可以使用纯色来实现</span></li>
              <li>
              <span style="line-height:1.428571429;">实现产品自定义属性功能</span></li>
              <li>
              <span style="line-height:1.428571429;">解决一键安装包qq开放登录的问题</span></li>
            </ol>
            <h4>
              二、下载地址
            </h4>
            <p>
              源码包：
              <a href="http://dl.xirangit.com/eps/2.3/chanzhiEPS.2.3.zip">http://dl.xirangit.com/eps/2.3/chanzhiEPS.2.3.zip</a>
            </p>
            <h4>
              三、安装和升级文档
            </h4>
            <p>
              安装文档：
              <a href="http://www.chanzhi.org/book/chanzhieps/5.html">http://www.chanzhi.org/book/chanzhieps/5.html</a>
            </p>
            <p>
              升级文档：
              <a href="http://www.chanzhi.org/book/chanzhieps/68.html">http://www.chanzhi.org/book/chanzhieps/68.html</a>
            </p>
            <h4>
              四、演示
            </h4>
            <p>
              前台演示：
              <a href="http://demo.chanzhi.org/">http://demo.chanzhi.org</a>
            </p>
            <p>
              后台演示：
              <a href="http://demo.chanzhi.org/chanzhiadmin.php">http://demo.chanzhi.org/chanzhiadmin.php</a>
            </p>
            <h4>
              五、功能截图
            </h4>
            <p>
              <img src="http://www.chanzhi.org/data/upload/201405/f_621601c6a91fdeaf4d0ae19ad6407191.gif" alt="" />
            </p>
            <p>
              <img src="http://www.chanzhi.org/data/upload/201405/f_630c95eeafa23d91cd7cbf61635d263f.gif" alt="" />
            </p>
            ]]>
          </description> 
          <link>http://wisina.top/index.php?m=article&amp;f=view&amp;t=xml&amp;articleID=7</link> <category>
            蝉知动态
          </category> 
          <pubDate>
            2014-05-16 10:10:00 +0800
          </pubDate> 
        </item> 
        <item> 
          <title>蝉知企业门户2.2.1版本发布</title> <description><![CDATA[ <h4>一、2.2.1修改记录
              </h4>
              <p>  1 调整评论页面的文案。
              </p>
                2 联系我们页面增加二维码展示。<br />
                3 密码错误触发锁定次数增加到5次，禁用时间缩短到3分钟。<br />
                4 博客列表评论按钮添加链接。 <br />
                5 会员管理页面添加微博和qq会员的显示。<br />
                6 修改在线QQ的连接。<br />
              <p>  7 把oauth类的get方法去掉file_get_contents方式，只用CURL方式。
              </p>
              <p>  8 解决php magic_quotes_gpc 打开时中文内容存储失败的bug。 
              </p>
              <p>
                <span style="color:inherit;font-size:16px;font-weight:bold;line-height:1.1;"><br /></span>
              </p>
              <p>
              <span style="color:inherit;font-size:16px;font-weight:bold;line-height:1.1;">二、下载地址</span>
            </p>
            <p>
              <span style="font-size:14px;line-height:1.428571429;">源码包：</span>
              <a href="http://dl.xirangit.com/eps/2.2/chanzhiEPS.2.2.1.zip">http://dl.xirangit.com/eps/2.2/chanzhiEPS.2.2.1.zip</a>
            </p>
            <p>
              安装包：
              <a href="http://dl.xirangit.com/eps/2.2/chanzhiEPS.2.2.1.exe">http://dl.xirangit.com/eps/2.2/chanzhiEPS.2.2.1.exe</a>
            </p>
            <p>
              <br />
            </p>
            <p>
              <span style="color:inherit;font-size:16px;font-weight:bold;line-height:1.1;">三、安装和升级文档  </span>
            </p>
            <p>
              安装文档：
              <a href="http://www.chanzhi.org/book/chanzhieps/5.html">http://www.chanzhi.org/book/chanzhieps/5.html</a>
            </p>
            <p>
              升级文档：
              <a href="http://www.chanzhi.org/book/chanzhieps/68.html">http://www.chanzhi.org/book/chanzhieps/68.html</a>
            </p>
            <p>
              <br />
            </p>
            <p>
              前台演示：
              <a href="http://demo.chanzhi.org/">http://demo.chanzhi.org</a>
            </p>
            <p>
              后台演示：
              <a href="http://demo.chanzhi.org/chanzhiadmin.php">http://demo.chanzhi.org/chanzhiadmin.php</a>
            </p>
            ]]>
          </description> 
          <link>http://wisina.top/index.php?m=article&amp;f=view&amp;t=xml&amp;articleID=8</link> <category>
            蝉知动态
          </category> 
          <pubDate>
            2014-04-01 10:40:00 +0800
          </pubDate> 
        </item> 
        <item> 
          <title>蝉知企业门户2.2版本发布，全面集成微信！</title> <description><![CDATA[ <p>大家好，蝉知企业门户系统2.2正式版正式发布了！该版本全面集成了微信公众号平台，包括：公众号接入、公众号菜单定义、关键字自动回复设置、二维码显示、粉丝消息获取和回复、粉丝管理。另外还添加了新的宽屏主题、重新组成后台反馈相关的功能，使用更加方便。
              </p>
              <h4>一、修改记录
              </h4>
              <ol>
                <li>
                <span style="line-height:1.428571429;">后台设置logo页面调整</span></li>
                <li>
                <span style="line-height:1.428571429;">论坛帖子用户信息调整</span></li>
                <li>
                <span style="line-height:1.428571429;">调整反馈，将留言、评论、主题、回帖，将其集中在一起。</span></li>
                <li>
                <span style="line-height:1.428571429;">添加微信公众号接入功能</span></li>
                <li>
                <span style="line-height:1.428571429;">添加公众号会员查看功能</span></li>
                <li>
                <span style="line-height:1.428571429;">添加公众号消息管理功能</span></li>
                <li>
                <span style="line-height:1.428571429;">添加公众号菜单、关键字、订阅回复、默认回复的管理功能</span></li>
                <li>
                <span style="line-height:1.428571429;">新增宽屏主题</span></li>
                <li>
                <span style="line-height:1.428571429;">前台添加微信公众号和手机访问二维码显示</span></li>
                <li>
                <span style="line-height:1.428571429;">禁止百度自动转码</span>
                <span style="line-height:1.428571429;">。</span><br /></li>
              </ol>
              <h4 style="color:#333333;">二、新特性截图
              </h4>
              <p><br />
              </p>
              <p>
                <strong>2.1 前台显示微信公众号的二维码以及当前网址的二维码。</strong>
                <strong><br /></strong>
              </p>
              <p>
                <strong>
                <img src="http://www.chanzhi.org/data/upload/201403/f_0f4feaade60a500a295320cf7f57b7b2.jpg" alt="" /></strong>
                <strong><br /></strong>
              </p>
              <p>
                <strong><br /></strong>
              </p>
              <p>
                <strong>2.2 后台的微信功能设置</strong>
                <strong><br /></strong>
              </p>
              <p>
                <strong>
                <img src="http://www.chanzhi.org/data/upload/201403/f_6fd64ba21b03ee7a1b4b2cdb019ef7bd.jpg" alt="" /><br /></strong>
              </p>
              <p>
                <strong><br /></strong>
              </p>
              <p>
                <strong>2.3 微信界面截图</strong>
              </p>
              <p>
                <strong>
                <img src="http://www.chanzhi.org/data/upload/201403/f_e1aa3a6106f7f37395d42e637254091a.jpg" alt="" /><br /></strong>
              </p>
              <h4 style="color:#333333;">三、下载地址
              </h4>
              <p>源码包：
                <a href="http://dl.xirangit.com/eps/2.2/chanzhiEPS.2.2.zip">http://dl.xirangit.com/eps/2.2/chanzhiEPS.2.2.zip</a>
              </p>
              <p>安装包：
                <a href="http://dl.xirangit.com/eps/2.2/chanzhiEPS.2.2.exe">http://dl.xirangit.com/eps/2.2/chanzhiEPS.2.2.exe</a>
              </p>
              <p><br />
              </p>
              <p>
                <span style="color:inherit;font-size:16px;font-weight:bold;line-height:1.1;">四、安装和升级文档  </span>
              </p>
              <p>安装文档：
                <a href="http://www.chanzhi.org/book/chanzhieps/5.html">http://www.chanzhi.org/book/chanzhieps/5.html</a>
              </p>
              <p>升级文档：
                <a href="http://www.chanzhi.org/book/chanzhieps/68.html">http://www.chanzhi.org/book/chanzhieps/68.html</a>
              </p>
              <p><br />
              </p>
              <p>前台演示：
                <a href="http://demo.chanzhi.org/">http://demo.chanzhi.org</a>
              </p>
              <p>后台演示：
                <a href="http://demo.chanzhi.org/chanzhiadmin.php">http://demo.chanzhi.org/chanzhiadmin.php</a>
              </p>
              <p><br />
              </p>
              <p>
                <span style="color:inherit;font-size:16px;font-weight:bold;line-height:1.1;">五、蝉知系统微信集成手册</span>
              </p>
              <p>
                <span style="color:inherit;font-size:16px;font-weight:bold;line-height:1.1;"><br /></span>
              </p>
              <p>蝉知系统微信集成手册：
                <a href="http://www.chanzhi.org/book/weixin.html">http://www.chanzhi.org/book/weixin.html</a>
              </p>
              ]]>
            </description> 
            <link>http://wisina.top/index.php?m=article&amp;f=view&amp;t=xml&amp;articleID=9</link> <category>蝉知动态
            </category> 
            <pubDate>2014-03-24 16:00:00 +0800
            </pubDate> 
          </item> 
          <item> 
            <title>蝉知企业门户系统2.1正式版发布</title> <description><![CDATA[ <h4 style="color:#333333;">一、2.1修改记录
                </h4>
                <ol>
                  <li>区块增加图标设置功能</li>
                  <li>布局设置增加区块宽度设置功能</li>
                <li>触屏设备访问时幻灯片增加拖动支持</li>
                <li>
                <span style="line-height:1.428571429;">论坛帖子最后编辑者改为真实姓名</span></li>
                <li>
                <span style="line-height:1.428571429;">关于我们页面使用区块把联系我们放在右侧</span></li>
                <li>
                <span style="line-height:1.428571429;">批量维护手册章节的时候添加发布时间</span></li>
                <li>
                <span style="line-height:1.428571429;">编辑手册文章的时候增加发布时间的字段</span></li>
                <li>
                <span style="line-height:1.428571429;">重新调整h1-h6标签的字体大小</span></li>
                <li>
                <span style="line-height:1.428571429;">解决置顶帖子用户姓名问题</span></li>
                <li>
                <span style="line-height:1.428571429;">修改版权提示的格式</span></li>
                <li>
                <span style="line-height:1.428571429;">修复分页的bug</span></li>
                <li>
                <span style="line-height:1.428571429;">幻灯排序在ie10下面有问题。</span></li>
                <li>
                <span style="line-height:1.428571429;">修复ie10下面蓝色风格的问题</span></li>
                <li>
                <span style="line-height:1.428571429;">精简文章详情页面的上一篇下一篇的导航文字</span></li>
                <li>
                <span style="line-height:1.428571429;">调整留言页面回复内容的缩进和字体大小</span></li>
                <li>
                <span style="line-height:1.428571429;">优化移动版本头尾的处理</span></li>
                <li>
                <span style="line-height:1.428571429;">管理员身份回帖的时候应当使用全编辑器</span></li>
                <li>
                <span style="line-height:1.428571429;">论坛帖子发贴框的宽度调整。把只读放在后面。</span></li>
                <li>
                <span style="line-height:1.428571429;">调整论坛列表页面各列的宽度</span></li>
                <li>
                <span style="line-height:1.428571429;">以管理员身份发表评论或者留言，默认状态为通过。</span></li>
                <li>
                <span style="line-height:1.428571429;">后台管理员回复一篇评论或留言之后，默认将其状态改为通过</span></li>
                <li>
                <span style="line-height:1.428571429;">修改邮箱默认配置，将腾讯邮箱默认改为465 </span></li>
                <li>
                <span style="line-height:1.428571429;">如果发贴用户已被删除，帖子列表页面的最后回复取用户名</span></li>
                <li>
                <span style="line-height:1.428571429;">论坛出现版主的地方也都显示真实姓名</span></li>
                <li>
                <span style="line-height:1.428571429;">将user模块的getRealName()方法改为getRealNamePairs()</span></li>
                <li>
                <span style="line-height:1.428571429;">调整模拟的alert和confirm框的样式</span></li>
                <li>
                <span style="line-height:1.428571429;">论坛帖子列表的时候显示用户的真实姓名</span></li>
                <li>
                <span style="line-height:1.428571429;">留言者区分是否是登录用户</span></li>
                <li>
                <span style="line-height:1.428571429;">论坛的板块设置提示需要二级板块</span></li>
                <li>
                <span style="line-height:1.428571429;">区块首页底部的命名改为中部。</span></li>
                <li>
                <span style="line-height:1.428571429;">调整文章，产品无类目时的交互方式</span></li>
                <li>
                <span style="line-height:1.428571429;">重置密码功能把resetKey，resetTime合成一个字段</span></li>
                <li>
                <span style="line-height:1.428571429;">论坛控制图片大小</span></li>
              </ol>
              <h4 style="color:#333333;">
                二、手机访问截图
              </h4>
              <p>
                <img src="http://www.chanzhi.org/data/upload/201403/f_59e4b4d8216516649c97804813b14af2.jpg" alt="" title="" height="540" width="304" />
                <img src="http://www.chanzhi.org/data/upload/201403/f_702d92775d4dcdd983e5be1d998d566b.jpg" alt="" title="" height="540" width="304" />
              </p>
              <p>
                <img src="http://www.chanzhi.org/data/upload/201403/f_4ca0b9700f909cabc75ecc00f60ee7a0.jpg" alt="" title="" height="540" width="304" />
                <img src="http://www.chanzhi.org/data/upload/201403/f_0831fb8306a661c9ab6cb1a87d16b5ba.jpg" alt="" title="" height="540" width="304" />
                <img src="http://www.chanzhi.org/data/upload/201403/f_dfa6504be3a605561262e18d4d5eb63f.png" alt="" title="" height="540" width="304" />
              </p>
              <h4 style="color:#333333;">
                三、下载地址
              </h4>
              <p>
                源码包：
                <a href="http://dl.xirangit.com/eps/2.1/chanzhiEPS.2.1.zip">http://dl.xirangit.com/eps/2.1/chanzhiEPS.2.1.zip</a><br />
                安装包：
                <a href="http://dl.xirangit.com/eps/2.1/chanzhiEPS.2.1.exe">http://dl.xirangit.com/eps/2.1/chanzhiEPS.2.1.exe</a>
              </p>
              <h4 style="color:#333333;">
                四、安装和升级文档  
              </h4>
              <p>
                安装文档：
                <a href="http://www.chanzhi.org/book/chanzhieps/5.html">http://www.chanzhi.org/book/chanzhieps/5.html</a><br />
                升级文档：
                <a href="http://www.chanzhi.org/book/chanzhieps/68.html">http://www.chanzhi.org/book/chanzhieps/68.html</a><br />
                前台演示：
                <a href="http://demo.chanzhi.org/">http://demo.chanzhi.org</a>
              </p>
              <p>
                后台演示：
                <a href="http://demo.chanzhi.org/chanzhiadmin.php">http://demo.chanzhi.org/chanzhiadmin.php</a>
              </p>
              ]]>
            </description> 
            <link>http://wisina.top/index.php?m=article&amp;f=view&amp;t=xml&amp;articleID=10</link> <category>
              蝉知动态
            </category> 
            <pubDate>
              2014-03-03 09:50:00 +0800
            </pubDate> 
          </item> 
          <item> 
            <title>演示商品一</title> <description><![CDATA[ <p>云蝉知在线(以下简称云蝉知)是由青岛息壤网络信息有限公司(以下简称青岛息壤)提供的在线建站服务。若您申请云蝉知帐户并使用相应服务，您必须先同意此协议：
                </p>
                <h4>一、服务条款的确认和接纳<br />
                </h4>
                (1) 您必须是能够承担相应法律责任的公司或个人。若您不具备此资格，不能使用云蝉知提供的服务。<br />
                <p>(2) 当您使用服务时，您需阅读并且同意
                  <a href="http://www.chanzhi.net/book/chanzhieps/58_license.html">《蝉知企业门户系统授权协议》</a>；
                </p>
                <p>
                <span>(3) 当您使用服务时，您需知晓并且同意此《云蝉知在线使用协议》； </span>
              </p>
              (4) 此协议在必要时将进行修改，更新后会以明显的方式通知到用户。 <br />
              <p>
                (5) 若您继续使用系统提供的服务，则表明您接受新的协议。
              </p>
              <h4>
                二、服务内容<br />
              </h4>
              <p>
                (1) 此协议所述服务仅在云蝉知网站内有效。云蝉知网站是指http://www.chanzhi.net及其所属网页；
              </p>
              (2) 云蝉知有权根据实际情况自主调整服务内容。<br />
              <h4>
                三、帐户<br />
              </h4>
              (1) 使用云蝉知服务之前，您必须在云蝉知网站上面注册一个合法的帐号，并如实填写所有资料。如因资料不全而无法及时通知到您而造成的一切损失，青岛息壤不承担任何责任。<br />
              (2) 您应当妥善保管自己的账户和密码，避免丢失，更不能让他人使用。若因此造成损失，青岛息壤不负任何法律责任；<br />
              (3) 您在使用云蝉知服务时必须遵守相关法律法规。青岛息壤对帐户使用服务所产生的与其他公司或者个人的纠纷不负法律责任；<br />
              (4) 云蝉知网站有权对恶意帐户中止服务，且无需特别通知；<h4>
                四、费用<br />
              </h4>
              <p>
                (1) 在您正式使用云蝉知服务之前，您需要自己申请域名。<br />
                (2) 云蝉知现在为大家提供免费服务，免费用户可以创建三个站点。每个站点可使用100M空间(包括附件、图片和数据库），每个月10GB流量。如果超出存储空间或者流量，云蝉知网站有权对该站点的访问进行限制。<br />
                (3) 云蝉知后续会提供功能更强的收费版本，收费标准届时会在云蝉知网站公布。云蝉知保留对收费模式和具体金额调整的权利，涉及收费服务，将至提前30天的时间通过电子邮件的形式通知帐户。
              </p>
              <h4>
                五、服务终止
              </h4>
              <p>
                有下列情形之一的，云蝉知网站有权随时暂停、终止、取消或拒绝帐户服务。<br />
                <br />
                (1) 帐户违反了此协议或已在约定范围内的任一条款；<br />
                (2) 根据此协议相关说明而终止服务；<br />
                (3) 利用云蝉知网站的发布功能滥发重复信息；<br />
                (4) 未经请求或授权向云蝉知网站帐户发送大量与业务不相关的信息；<br />
                (5) 冒用其他企业的名义发布商业信息，进行商业活动；<br />
                (6) 攻击云蝉知网站的数据、网络或服务；
              </p>
              <p>
                (7) 盗用他人在云蝉知网站上的帐户名和密码。<br />
                <br />
                以下信息是严格禁止并绝对终止帐户服务，同时不退回购买费用的：<br />
                <br />
                (1) 有关宗教、种族或性别的贬损言辞；<br />
                (2) 骚扰、滥用或威胁其他帐户；<br />
                (3) 侵犯任何第三方著作权、专利、商标、商业秘密或其它专有权利、发表权或隐私权的信息；<br />
                (4) 其它任何违反互联网相关法律法规的信息。
              </p>
              <h4>
                六、云蝉知用户的权利和义务
              </h4>
              <p>
                (1) 云蝉知服务生效后，帐户就可享受相应服务内容；<br />
                (2) 云蝉知用户在使用云蝉知网站提供的相应服务时，必须保证遵守当地及中国有关法律法规的规定；<br />
                不得利用该网站进行任何非法活动；遵守所有与使用该网站有关的协议、规定、程序和惯例；<br />
                (3) 云蝉知用户对输入数据的准确性、可靠性、合法性、适用性等负责；
              </p>
              <h4>
                七、云蝉知的权利和义务<br />
              </h4>
              <p>
                (1) 云蝉知尽最大努力来保证服务的正常访问以及数据的备份。<br />
                (2) 云蝉知为收费用户提供相应的咨询、技术支持等服务。
              </p>
              <p>
                (3)对于因不可抗力造成的服务中断、链接受阻或其他缺陷(包括但不限于自然灾害、社会事件以及因网站所具有的特殊性质而产生的包括系统崩溃、数据丢失、黑客攻击、电信部门技术调整导致的影响、政府管制而造成的暂时性关闭在内的任何影响网络正常运营的因素)，云蝉知网站不承担任何责任，但将尽力减少因此而给会员造成的损失和影响；<br />
                (4) 云蝉知网站对用户因使用云蝉知服务而造成的损失不负法律责任。不论什么情况下对用户因使用云蝉知服务而造成的直接、间接、偶尔的、特殊的惩罚性的损害或其他一切损害概不负法律责任；<br />
                (5) 如因云蝉知原因，造成服务的不正常中断，青岛息壤不承担任何责任，青岛息壤也不承担由此致使会员蒙受的其它方面的连带损失；
              </p>
              <h4>
                八、隐私与保密<br />
              </h4>
              <p>
                (1) 您注册时所填写的个人信息仅限于青岛息壤与您之间联系使用，青岛息壤不得将其用于商业目的。<br />
                (2) 您通过云蝉知产生的任何数据都属于您所有。除非您主动要求我们协助您排查问题，否则青岛息壤的所有员工无权查看、编辑、复制、删除您的任数据。
              </p>
              <h4>
                九、最终解释权<br />
              </h4>
              <p>
                青岛息壤网络信息有限公司对云蝉知保有所有活动、限制等的最终解释权。
              </p>
              ]]>
            </description> 
            <link>http://wisina.top/index.php?m=product&amp;f=view&amp;t=xml&amp;productID=2</link> <category>
              蝉知
            </category> 
            <pubDate>
              2014-08-25 15:06:50 +0800
            </pubDate> 
          </item> 
          <item> 
            <title>演示商品二</title> <description><![CDATA[ <h4>关于蝉知企业门户系统(chanzhiEPS)
                </h4>
                <p>蝉知企业门户系统是由业内资深开发团队开发的一款专向企业营销使用的企业门户系统，企业使用蝉知系统可以非常方便地搭建一个专业的企业营销网站，进行宣传，开展业务，服务客户。蝉知系统内置了文章、产品、论坛、评论、会员、博客、帮助等功能，同时还可以和微信进行集成绑定。功能丰富实用，后台操作简洁方便。蝉知系统还内置了搜索引擎优化必备的功能，比如关键词，摘要，站点地图，友好路径等，使用蝉知系统可以非常方便的搭建对搜索引擎友好的网站。
                </p>
                <p>
                  <strong>为什么</strong>
                  <strong>叫做</strong>
                <strong>蝉知？</strong>
                <strong><br /></strong> 
              </p>
              <p>
                蝉是中国传统的吉祥物之一，象征着闻达和财富，非常符合企业作为盈利组织的特点。所以我们为这套系统起名为蝉知，希望通过这款开源免费的系统可以帮助众多的中小企业快速方面的建立自己的企业网站，进行宣传营销。
              </p>
              <p>
                <strong>为什么</strong>
                <strong>来</strong>
                <strong>做</strong>
                <strong>蝉知？</strong> 
              </p>
              <p>
                蝉知团队还有其他的开源产品，我们在维护自己的产品的时候，也存在这样的需求：我们需要一个网站来对产品进行宣传，能够给用户提供技术支持，方便用户下载等等。我们也曾经想用市面上的其他cms系统来搭建，但后来发现要做大量的改动定制，还不如自己写一个。所以我们在四年多的时间里面一点点的完善自己的产品网站。与此同时我们在和客户接触的时候，发现企业的网站大都不敢恭维：技术陈旧、载入速度缓慢、不利于seo、后台晦涩难懂。于是我们就产生了做一个企业门户系统来解决这个问题的想法，于是就是了蝉知这个产品。
              </p>
              <h4>
                <strong>为什么以开源的方式来发布？</strong> 
              </h4>
              <p>
                蝉知源代码完全开放，不限制商用。我们之所以坚持以开源的方式来发布蝉知系统，是因为我们坚信开放才是正道。只有开放的系统才更具有生命力，用户使用起来才更加放心。
              </p>
              <p>
                <strong>为什么选择蝉知门户系统来搭建企业网站？</strong> 
              </p>
              <p>
                现在做一个企业营销网站可以有很多选择，比如使用国外开源的wordpress, dupal, jommla等。国内的有dedecms, phpcms等cms系统。还有很多在线建站的公司。如果费用充足的话，可以选择建站公司来做（建站公司也是使用上述的这些系统来帮你搭建，比较坑）。那么蝉知系统和这些系统相比有什么特点呢？
                <strong><br /></strong> 
              </p>
              <p>
                <strong>1. 首先，我们是专门做企业营销网站。</strong> 
              </p>
              <ul>
                <li>现在做网站，都是在cms系统上面改。而蝉知系统是专门面向企业营销网站的，所以功能更具有针对性。我们内置了文章、产品、会员、论坛、评论、帮助、博客等诸多功能，完全可以应对企业营销网站的各种需求。</li>
                <li>蝉知系统特别重视搜索引擎优化，内置了关键词管理、摘要、站点地图等功能。同时只要环境支持url重写，就可以生成搜索引擎非常喜欢的路径结构，比如/news/123.html这样的路径。</li>
                <li>蝉知系统后续会内置基本的统计数据，哪怕网站只有一个用户访问，也要让您清清楚楚的知道网站有人在访问。这样网站不再是死的的网站。</li>
              </ul>
              <p>
                <strong>2. 其次，</strong>
                <strong>蝉知</strong>
                <strong>系统</strong>
                <strong>是</strong>
                <strong>真正</strong>
                <strong>的</strong>
                <strong>开源</strong>
                <strong>免费</strong> 
              </p>
              <ul>
                <li>蝉知系统是目前唯一开源免费的企业门户系统。</li>
                <li>蝉知系统以LGPL协议发布，代码完全开放，是真正的开源。（有很多号称开源的cms系统，其实都是假的。)</li>
                <li>蝉知系统不限制商用，也不会为了推我们后续的一些收费功能或者服务故意的在产品中做很多限制。<br /></li>
              </ul>
              <p>
                <strong>3. 蝉知系统技术先进，注重用户体验</strong> 
              </p>
              <ul>
                <li>蝉知系统使用自主开发的框架搭建，架构更加合理。</li>
                <li>内置完善的扩展机制，方便企业后续的二次开发。蝉知系统的首要定位是帮助企业解决营销问题，当营销问题解决之后，企业会考虑在蝉知系统上搭建自己的业务系统，比如报名、订单之类的业务。这时候在蝉知系统基础上进行二次开发是非常容易的事情。</li>
                <li>蝉知团队不断的学习业内先进的设计理念，给大家提供简洁方便的产品。</li>
              </ul>
              <p>
                <strong>4. </strong>
                <strong>使用</strong>
                <strong>支持</strong>
                <strong>有</strong>
                <strong>保障</strong> 
              </p>
              <ul>
                <li>别人做开源，也许只是兴趣。而我们做开源，是专职在做，以正规的公司形式来运作。</li>
                <li>我们有将近十年的开源软件开发和维护经验，对开源软件的后续开发、支持有丰富的经验。</li>
                <li>我们团队和系统足够开放，后续我们会着手打造一个面向企业营销市场的小生态系统，吸引第三方的设计师、网站建设公司参与。</li>
              </ul>
              <p>
                so，不要再犹豫，新时代做企业营销，首选蝉知门户系统，靠谱！
              </p>
              ]]>
            </description> 
            <link>http://wisina.top/index.php?m=product&amp;f=view&amp;t=xml&amp;productID=1</link> <category>
              蝉知
            </category> 
            <pubDate>
              2014-08-25 14:31:29 +0800
            </pubDate> 
          </item> 
        </channel>
      </rss>