diff --git a/api/CrapApi.V7-2.sql b/api/CrapApi.V7-2.sql deleted file mode 100644 index ed64fc8e7..000000000 --- a/api/CrapApi.V7-2.sql +++ /dev/null @@ -1,33 +0,0 @@ -CREATE TABLE `apitest`.`project_user` ( - `id` VARCHAR(50) NOT NULL, - `status` TINYINT(4) NOT NULL DEFAULT 1, - `sequence` INT NOT NULL DEFAULT 0, - `createTime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - `projectId` VARCHAR(50) NOT NULL, - `userId` VARCHAR(50) NOT NULL, - `addModule` BIT NOT NULL DEFAULT 1 COMMENT '是否可以添加模块', - `delModule` BIT NOT NULL DEFAULT 0 COMMENT '是否可以删除模块', - `modModule` BIT NOT NULL DEFAULT 1 COMMENT '是否可是修改模块', - `addInter` BIT NOT NULL DEFAULT 1 COMMENT '是否可以添加接口', - `delInter` BIT NOT NULL DEFAULT 0 COMMENT '是否可以删除接口', - `modInter` BIT NOT NULL DEFAULT 1 COMMENT '是否可以修改接口', - `addArticle` BIT NOT NULL DEFAULT 1 COMMENT '是否可以添加文章', - `delArticle` BIT NOT NULL DEFAULT 0 COMMENT '是否可以删除文章', - `modArticle` BIT NOT NULL DEFAULT 1 COMMENT '是否可以修改文章', - `addSource` BIT NOT NULL DEFAULT 1 COMMENT '是否可以添加资源', - `delSource` BIT NOT NULL DEFAULT 0 COMMENT '是否可以删除资源', - `modSource` BIT NOT NULL DEFAULT 1 COMMENT '是否可以修改资源', - `addDict` BIT NOT NULL DEFAULT 1 COMMENT '是否可以添加数据字典', - `delDict` BIT NOT NULL DEFAULT 0 COMMENT '是否可以删除数据字典', - `modDict` BIT NOT NULL DEFAULT 1 COMMENT '是否可以修改数据字典', - `addError` BIT NOT NULL DEFAULT 1 COMMENT '是否可以添加错误码', - `delError` BIT NOT NULL DEFAULT 0 COMMENT '是否可以删除错误码', - `modError` BIT NOT NULL DEFAULT 1 COMMENT '是否可以修改错误码', - PRIMARY KEY (`id`)); - - ALTER TABLE `apitest`.`project_user` -ADD UNIQUE INDEX `project_user` (`userId` ASC, `projectId` ASC); - -ALTER TABLE `apitest`.`project_user` -ADD COLUMN `userEmail` VARCHAR(45) NULL AFTER `modDict`, -ADD COLUMN `userName` VARCHAR(50) NULL AFTER `userEmail`; \ No newline at end of file diff --git a/api/CrapApi.V7.sql b/api/CrapApi.V7.sql index 68fbde43f..a1c517342 100644 --- a/api/CrapApi.V7.sql +++ b/api/CrapApi.V7.sql @@ -1,52 +1,453 @@ -use apitest; +use api; +DROP TABLE IF EXISTS `article`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `article` ( + `id` varchar(50) NOT NULL, + `name` varchar(100) NOT NULL, + `brief` varchar(200) DEFAULT NULL, + `content` longtext NOT NULL, + `click` int(11) NOT NULL DEFAULT '0', + `type` varchar(20) NOT NULL DEFAULT 'PAGE', + `status` tinyint(4) NOT NULL DEFAULT '1', + `createTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `moduleId` varchar(50) NOT NULL DEFAULT 'top', + `mkey` varchar(20) DEFAULT NULL COMMENT 'key,唯一键,页面唯一标识', + `canDelete` tinyint(4) NOT NULL DEFAULT '1' COMMENT '是否可删除,可修key,默认可以', + `category` varchar(50) DEFAULT NULL, + `canComment` tinyint(4) NOT NULL DEFAULT '1', + `commentCount` int(11) NOT NULL DEFAULT '0', + `sequence` int(11) NOT NULL DEFAULT '0' COMMENT '排序,越大越靠前', + `markdown` text NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `mkey_UNIQUE` (`mkey`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `article` +-- + +LOCK TABLES `article` WRITE; +/*!40000 ALTER TABLE `article` DISABLE KEYS */; +INSERT INTO `article` VALUES ('02c16933-2823-458d-83a0-6d5b8b752a25','建议&留言','建议&留言:有好的建议或有新的需求,可以在此处留言','

有好的建议或有新的需求,可以在此处留言


',417,'ARTICLE',0,'2016-04-24 17:37:30','web',NULL,1,'帮助文档',0,0,1000,''),('072ccd19-7d86-49b0-9f20-163b495ab5c9','CrapApi-用户表(user)','CrapApi系统用户表结构\nroleId:角色对应的Id,roleName(冗余字段):角色名称,用于展示\nauth:权限,authName(冗余字段):权限名称,用于展示','[{\"name\":\"id\",\"type\":\"varchar(50)\",\"notNull\":\"否\",\"def\":\"无\",\"remark\":\"主键\"},{\"name\":\"userName\",\"type\":\"varchar(50)\",\"notNull\":\"否\",\"def\":\"无\",\"remark\":\"用户名\"},{\"name\":\"password\",\"type\":\"varchar(50)\",\"notNull\":\"否\",\"def\":\"无\",\"remark\":\"密码:md5处理\"},{\"name\":\"trueName\",\"type\":\"varchar(50)\",\"notNull\":\"是\",\"def\":\"无\",\"remark\":\"真实姓名\"},{\"name\":\"roleId\",\"type\":\"varchar(2014)\",\"notNull\":\"是\",\"def\":\"无\",\"remark\":\"角色id:多个角色以英文逗号分隔\"},{\"name\":\"roleName\",\"type\":\"varchar(2014)\",\"notNull\":\"是\",\"def\":\"无\",\"remark\":\"角色名称:多个角色以逗号分隔\"},{\"name\":\"auth\",\"type\":\"varchar(2014)\",\"notNull\":\"是\",\"def\":\"无\",\"remark\":\"权限:多个权限以英文逗号分隔\"},{\"name\":\"authName\",\"type\":\"varchar(2014)\",\"notNull\":\"是\",\"def\":\"无\",\"remark\":\"权限名称:多个权限以逗号分隔\"},{\"name\":\"createTime\",\"type\":\"timestamp\",\"notNull\":\"否\",\"def\":\"CURRENT_TIMESTAMP\",\"remark\":\"数据创建时间\"},{\"name\":\"status\",\"type\":\"tinyint\",\"notNull\":\"否\",\"def\":\"1\",\"remark\":\"状态(暂时未使用)\"},{\"name\":\"sequence\",\"type\":\"int\",\"notNull\":\"否\",\"def\":\"0\",\"remark\":\"排顺字段:越大越靠前\"}]',5,'DICTIONARY',0,'2016-06-06 20:19:03','9a483c5b-98cc-45da-9cdf-0d3e4c382e49',NULL,1,'',0,0,0,''),('07bdc59d-e407-4ef0-8ff7-bf86449e7efd','用户表,存储用户信息','样例表:用户表,存储用户信息用户表,存储用户信息用户表,存储用户信息','[{\"name\":\"TEST1\",\"type\":\"varchar\",\"notNull\":\"false\",\"def\":\"默认\",\"remark\":\"默认\"}]',278,'DICTIONARY',0,'2016-04-03 22:52:41','9a483c5b-98cc-45da-9cdf-0d3e4c382e49',NULL,1,'',1,0,0,''),('08a54f08-6189-479d-8c44-2d99d96950a6','http头部如何对缓存的控制','','



使用缓存的目的就是在于减少计算,IO,网络等时间,可以快速的返回,特别是流量比较大的时候,可以节约很多服务器带宽和压力。

一个请求从缓存的方面来说,有三个过程。

本地检查缓存是否过期

Expires,http 1.0版本定义的response头部,定义过期时间,如果本地时间发现超过过期时间,就会向服务器请求,进行文件新鲜度检测。但是会有一个问题,就是本地的操作系统时间可能偏差比较大,导致缓存时间过长或者永远都缓存不了。

Cache-control: max-age,http 1.1 版本定义的response头部,就是为了解决操作系统时间与服务器时间相差太大问题。文件缓存存活时间,请求完毕的时候,会记录本地的时间。再次请求的时候,此时时间减去最初记录时间,如果时间大于max-age,就会进行文件新鲜度检测。  

服务器检测文件新鲜度

本地缓存过期,缓存和服务器文件可能一样,也有可能不一样。如果一样的话,就没有必要返回内容。如果不一样,就返回内容,就相当于一次新的请求。

怎么判断文件是否一致呢?现在的做法通过文件生成时间或者对文件进行MD5值计算。

Last-Modified,文件生成时间或者最后修改时间。下一次请求的头部,添加If-Modified-Since,值是上次respone头部的Last-Modified值,和服务器进行对比,如果一样的话,直接返回304,数据内容为空。【这里也会存在一个问题,如果文件定期更新,但是文件内容不更新,岂不是白白耗费流量。】

Etag , 服务器端对文件计算出来的一个值。下一次请求的头部,添加If-None-Match,和服务器进行对比,如果一样的话,直接返回304,数据内容为空。

服务器返回数据内容   

相当于一次新的请求,状态是200.

通过输出4个头部,来控制缓存,减少压力,不仅可以节省服务器和宽带资源,对用户的体验提升也是非常有帮组的。

整体上,可以看到可能出现的情况。200(from cache,无请求),304(仅仅是头部交换,没有response body返回),200(一次完整的请求,包含response body)。



',21,'ARTICLE',0,'2016-04-24 19:04:43','web',NULL,1,'技术文档',0,0,0,''),('19dc3d5c7-ff3d-4dff-ad72-2212869cd92a','项目部署','CrapApi接口管理项目中的pdf导出功能目前只支持windows服务器,在linux服务器上部署导出的pdf无法显示中文\n\n如你更好的解决方案(html转pdf),可点击“联系我”或加群讨论\n\n建议部署环境:jre7及以上、tomcat7及以上','


1.下载编译后的文件直接部署(CrapApi.V2 或 从github上获取源码自己编译



2.手动部署至tomcat

在tomcat/conf/server.xml <Engin> </Engine>节点中添加一下配置信息
<Host name="域名或ip"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="访问路径" docBase="文件地址" debug="0" reloadable="true" crossContext="true" ></Context>
</Host>
域名或ip,如:api.crap.cn
访问路径:如:crapapi 或不填,如填写crapapi则对应的访问地址为http://api.crap.cn/crapapi 不填则为http://api.crap.cn
文件地址:解压后的crapApi地址,如D:/CrapApi



3.下载源码自己编译(见:项目二次开发指南


',559,'ARTICLE',0,'2016-04-08 09:51:53','web',NULL,1,'帮助文档',1,0,100,''),('1c425363-a628-4206-b1d7-554fe7f9d2fb','test','test','

test

',0,'ARTICLE',0,'2016-08-26 10:28:56','web',NULL,1,'test',0,0,0,''),('1e32fcaa-2d90-4598-9d61-db711fffe66a','CrapApi—系统设置表(setting)','用于存储系统相关设置:logo、密钥、域名、站点颜色、站点宽度、是否需要验证码....','[{\"name\":\"id\",\"type\":\"varchar(50)\",\"notNull\":\"否\",\"def\":\"无\",\"remark\":\"主键\"},{\"name\":\"mkey\",\"type\":\"varchar(20)\",\"notNull\":\"否\",\"def\":\"无\",\"remark\":\"唯一key\"},{\"name\":\"value\",\"type\":\"varchar(100)\",\"notNull\":\"否\",\"def\":\"无\",\"remark\":\"值\"},{\"name\":\"remark\",\"type\":\"text\",\"notNull\":\"是\",\"def\":\"无\",\"remark\":\"备注\"},{\"name\":\"createTime\",\"type\":\"timestamp\",\"notNull\":\"否\",\"def\":\"CURRENT_TIMESTAMP\",\"remark\":\"创建时间\"},{\"name\":\"status\",\"type\":\"tinyint\",\"notNull\":\"否\",\"def\":\"无\",\"remark\":\"状态(暂时没用)\"},{\"name\":\"type\",\"type\":\"varchar(10)\",\"notNull\":\"否\",\"def\":\"无\",\"remark\":\"类型:图片、文字、颜色...\"},{\"name\":\"canDelete\",\"type\":\"tinyint\",\"notNull\":\"否\",\"def\":\"0\",\"remark\":\"是否可以删除:1可删除,0不可删除\"},{\"name\":\"sequence\",\"type\":\"int\",\"notNull\":\"否\",\"def\":\"0\",\"remark\":\"排序\"}]',2,'DICTIONARY',0,'2016-06-06 20:26:52','9a483c5b-98cc-45da-9cdf-0d3e4c382e49',NULL,1,'',0,0,0,''),('2595b098-4e27-4e28-8a50-7241741f7619','管理员帮助中心','支持接口pdf文件下载\n支持发布文章,文章分类\n支持自定义网站页面','

\n 感谢使用CrapApi应用接口管理系统!\n

\n

\n
\n
\n

\n

\n [CrapApi是什么] \n

\n
加入一个公司或接手一个项目,面对散落在处的word文档,也许好不容易找到了,才发现那已是陈年往事!!!Holy Crap!我勒个去!\n\n面对快速变动的需求文档,不断更迭的API接口,此时你应该考虑找一个好的接口管理系统...\n\nCrapApi:一个由anjularjs+bootstrap+springMVC搭建的免费开源的API接口管理系统(应用接口管理系统)\n
\n

\n [CrapApi能做什么]\n

\n
接口管理?数据字典管理?no no no!CrapApi功能还多着了\n1.项目管理、模块管理、接口管理、接口版本、接口拷贝、接口文档pdf下载、模块加密访问....\n2.数据字典管理、数据字典加密访问...\n3.多管理员、多权限、多角色管理,精准控制每个接口的删改权限\n4.自定义菜单、自定义网站样式,满足你的各种需求\n5.文档管理:说明文档、需求文档、技术实现文档,想怎么分类CrapApi都支持\n6.文档留言、错误码管理、接口排序... \n\n更多功能还在路上,想要什么,在此留言,统统都能满足!\n留言地址:http://api.crap.cn/web.do#/webWebPage/detail/ARTICLE/02c16933-2823-458d-83a0-6d5b8b752a25 
\n

\n [演示&帮助文档]\n

\n
演示地址:http://api.crap.cn 压缩包下载地址:http://ehsantang.github.io/CrapApi/ 帮助文档地址:http://api.crap.cn/web.do#/webWebPage/list/ARTICLE/%E5%B8%AE%E5%8A%A9%E6%96%87%E6%A1%A3 账号:super 123456 \n游客私有模块访问密码:123\nQQ技术交流群:254450938\n
\n

\n [主要技术]\n

\n
主要语言:java、js\n\n主要技术:anjularjs、bootstrap、springMVC、hibernate、maven、iconfont\n
\n

\n [系统功能]\n

\n
系统支持管理员管理、权限控制、角色管理\n\n支持多项目、多模块划分,同时支持私密项目、模块密码访问\n\n支持数据字典管理、支持数据字典密码访问\n\n支持项目错误码管理、支持接口拷贝等功能\n\n支持前端菜单自定义,支持管理员菜单自定义\n\n支持接口PDF文件导出\n\n接口支持多版本号\n\n支持自定义网站风格\n
\n

\n [相关技术介绍]\n

\n
AngularJS:Google推出的前端JS框架\n\nAngularJS诞生于2009年,由Misko Hevery等人创建,后为Google所收购。是一款优秀的前端JS框架,已经被用于Google的多款产品当中。AngularJS有着诸多特性,最为核心的是:MVVM、模块化、自动化双向数据绑定、语义化标签、依赖注入等等。\n
\n
Bootstrap:Twitter开源工具包\n\nBootstrap是Twitter推出的一个用于前端开发的开源工具包。它由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架。\n
\n
Iconfont:阿里巴巴矢量图标库\n\nIconfont-国内功能很强大且图标内容很丰富的矢量图标库,提供矢量图标下载、在线存储、格式转换等功能。阿里巴巴体验团队倾力打造,设计和前端开发的便捷工具。
\n

\n [常见问题]\n

\n
    \n
  1. \n 管理员账号:super 123456\n
  2. \n
  3. \n 私有接口访问密码:123\n
  4. \n
  5. \n 显示样式有问题:所有测试均使用Chrome浏览器,请优先使用Chrome、Firefox、Safari浏览器访问\n
  6. \n
  7. \n 页面加载异常:项目正在不断完善,可能是文件缓存导致,请刷新浏览器重试。\n
  8. \n
  9. \n 接口PDF下载只支持在windows服务器上部署的站点,如需测试下载请前往:http://api2.crap.cn 测试
    \n
  10. \n
  11. \n 什么是【游客图形验证码】?如果开启了【游客图形验证码】,则游客在访问私密模块时不仅需要输入访问密码,而且需要输入【游客图形验证码】,开启【游客图形验证码】能有效防止暴力破解模块访问密码。\n
  12. \n
  13. \n 什么是【模块密码】?【模块密码】对后台管理没有任何影响,若为模块添加了密码,当游客访问该模块时需要输入访问密码才能浏览,【模块密码】只在当前模块有效,即子模块不能继承父模块的密码。故建议将【模块密码】设置在需要控制访问的接口所属的直接模块上。若多个模块密码一致,游客输入密码后无需再次输入,直接就可以访问。如没有开启游客图形验证码,则关闭浏览器后密码将自动失效。\n
  14. \n
  15. \n 为什么游客输入过访问密码后,再次访问依然需要再次输入访问密码?(1)系统只保留用户最后一次输入的访问密码,如果多个模块需要访问密码,则当用户交叉访问时,后一个密码将覆盖前一个密码,因此需要再次输入访问密码。\n
  16. \n
  17. \n 显示样式有问题?所有测试均使用Chrome浏览器,请优先使用Chrome、Firefox、Safari浏览器访问\n
  18. \n
  19. \n GitHub地址:https://github.com/EhsanTang/CrapApi\n
  20. \n
  21. \n QQ技术交流群:254450938\n
  22. \n
',796,'PAGE',0,'2016-04-08 00:22:32','web','ADMINHELP',0,'',1,0,0,''),('304384cf-8e4c-475a-9a7b-6a7c14177d18','CrapApi—接口表(interfa)','接口表','[{\"name\":\"id\",\"type\":\"varchar(50)\",\"notNull\":\"否\",\"def\":\"无\",\"remark\":\"主键\"},{\"name\":\"url\",\"type\":\"varchar(100)\",\"notNull\":\"否\",\"def\":\"无\",\"remark\":\"地址\"},{\"name\":\"method\",\"type\":\"varchar(30)\",\"notNull\":\"否\",\"def\":\"无\",\"remark\":\"请求方法\"},{\"name\":\"param\",\"type\":\"text\",\"notNull\":\"是\",\"def\":\"无\",\"remark\":\"请求参数:json格式存储\"},{\"name\":\"requestExam\",\"type\":\"text\",\"notNull\":\"是\",\"def\":\"无\",\"remark\":\"请求样例\"},{\"name\":\"responseParam\",\"type\":\"text\",\"notNull\":\"是\",\"def\":\"无\",\"remark\":\"返回参数:json格式存储\"},{\"name\":\"errorList\",\"type\":\"text\",\"notNull\":\"是\",\"def\":\"无\",\"remark\":\"错误列表\"},{\"name\":\"trueExam\",\"type\":\"text\",\"notNull\":\"是\",\"def\":\"无\",\"remark\":\"正确返回样例\"},{\"name\":\"falseExam\",\"type\":\"text\",\"notNull\":\"是\",\"def\":\"无\",\"remark\":\"错误返回样例\"},{\"name\":\"status\",\"type\":\"tinyint\",\"notNull\":\"否\",\"def\":\"1\",\"remark\":\"状态\"},{\"name\":\"moduleId\",\"type\":\"varchar(50)\",\"notNull\":\"否\",\"def\":\"无\",\"remark\":\"模块ID\"},{\"name\":\"interfaceName\",\"type\":\"varchar(100)\",\"notNull\":\"否\",\"def\":\"无\",\"remark\":\"接口名\"},{\"name\":\"remark\",\"type\":\"text\",\"notNull\":\"是\",\"def\":\"无\",\"remark\":\"备注\"},{\"name\":\"errors\",\"type\":\"text\",\"notNull\":\"是\",\"def\":\"无\",\"remark\":\"错误信息:json格式\"},{\"name\":\"updateBy\",\"type\":\"varchar(100)\",\"notNull\":\"是\",\"def\":\"无\",\"remark\":\"更新人\"},{\"name\":\"updateTime\",\"type\":\"timestamp\",\"notNull\":\"否\",\"def\":\"CURRENT_TIMESTAMP\",\"remark\":\"更新时间\"},{\"name\":\"createTime\",\"type\":\"timestamp\",\"notNull\":\"否\",\"def\":\"CURRENT_TIMESTAMP\",\"remark\":\"创建时间\"},{\"name\":\"version\",\"type\":\"varchar(20)\",\"notNull\":\"否\",\"def\":\"CURRENT_TIMESTAMP\",\"remark\":\"版本号\"},{\"name\":\"sequence\",\"type\":\"int\",\"notNull\":\"否\",\"def\":\"0\",\"remark\":\"排序:排序,越大越靠前\"}]',9,'DICTIONARY',0,'2016-06-06 21:10:17','9a483c5b-98cc-45da-9cdf-0d3e4c382e49',NULL,1,'',0,0,66,''),('34ca2c74-bea7-4eb9-92c0-0ae33373c03a','V3版本新增功能','','

1. 文章密码访问

2. 接口新增put、delete、trace、head、options类型

3. 新增在线调试功能

4. 修改密码:点击右上角用户名

\"\"/

5. 文章编辑新增kindeditor编辑器,支持图片上传、附件上传

6. 修复退出账号bug

7. 文章添加标题搜索

8. 接口修改、删除记录日志,恢复至指定节点

9. 接口、模块移动至其他模块

10. 自定义网站字体

11. Lucene全文搜索



V2升级成V3,请执行相应sql脚本:https://github.com/EhsanTang/CrapApi/tree/master/api

',49,'ARTICLE',0,'2016-05-20 11:18:27','web',NULL,1,'帮助文档',0,0,0,''),('377d6580-657f-420b-88fd-d7d239f05cb5','帮助中心','接口PDF下载只支持在windows服务器上部署的站点\n如需测试下载请前往:http://api2.crap.cn 测试','

感谢使用CrapApi应用接口管理系统!


[CrapApi是什么]

加入一个公司或接手一个项目,面对散落在处的word文档,也许好不容易找到了,才发现那已是陈年往事!!!Holy Crap!我勒个去!

面对快速变动的需求文档,不断更迭的API接口,此时你应该考虑找一个好的接口管理系统...

CrapApi:一个由anjularjs+bootstrap+springMVC搭建的免费开源的API接口管理系统(应用接口管理系统)

[CrapApi能做什么]

接口管理?数据字典管理?no no no!CrapApi功能还多着了
1.项目管理、模块管理、接口管理、接口版本、接口拷贝、接口文档pdf下载、模块加密访问....
2.数据字典管理、数据字典加密访问...
3.多管理员、多权限、多角色管理,精准控制每个接口的删改权限
4.自定义菜单、自定义网站样式,满足你的各种需求
5.文档管理:说明文档、需求文档、技术实现文档,想怎么分类CrapApi都支持
6.文档留言、错误码管理、接口排序...

更多功能还在路上,想要什么,在此留言,统统都能满足!
留言地址:http://api.crap.cn/web.do#/webWebPage/detail/ARTICLE/02c16933-2823-458d-83a0-6d5b8b752a25

[演示&帮助文档]

演示地址:http://api.crap.cn

压缩包下载地址:http://ehsantang.github.io/CrapApi/

帮助文档地址:http://api.crap.cn/web.do#/webWebPage/list/ARTICLE/%E5%B8%AE%E5%8A%A9%E6%96%87%E6%A1%A3

账号:super 123456
游客私有模块访问密码:123
QQ技术交流群:254450938

[主要技术]

主要语言:java、js

主要技术:anjularjs、bootstrap、springMVC、hibernate、maven、iconfont

[系统功能]

系统支持管理员管理、权限控制、角色管理

支持多项目、多模块划分,同时支持私密项目、模块密码访问

支持数据字典管理、支持数据字典密码访问

支持项目错误码管理、支持接口拷贝等功能

支持前端菜单自定义,支持管理员菜单自定义

支持接口PDF文件导出

接口支持多版本号

支持自定义网站风格

[相关技术介绍]

AngularJS:Google推出的前端JS框架

AngularJS诞生于2009年,由Misko Hevery等人创建,后为Google所收购。是一款优秀的前端JS框架,已经被用于Google的多款产品当中。AngularJS有着诸多特性,最为核心的是:MVVM、模块化、自动化双向数据绑定、语义化标签、依赖注入等等。
Bootstrap:Twitter开源工具包

Bootstrap是Twitter推出的一个用于前端开发的开源工具包。它由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架。
Iconfont:阿里巴巴矢量图标库

Iconfont-国内功能很强大且图标内容很丰富的矢量图标库,提供矢量图标下载、在线存储、格式转换等功能。阿里巴巴体验团队倾力打造,设计和前端开发的便捷工具。

[常见问题]

  1. 管理员账号:super 123456
  2. 私有接口访问密码:123
  3. 显示样式有问题:所有测试均使用Chrome浏览器,请优先使用Chrome、Firefox、Safari、IE9及以上浏览器访问
  4. 页面加载异常:项目正在不断完善,可能是文件缓存导致,请刷新浏览器重试。
  5. 接口PDF下载只支持在windows服务器上部署的站点,如需测试下载请前往:http://api2.crap.cn 测试
  6. GitHub地址:https://github.com/EhsanTang/CrapApi
  7. QQ技术交流群:254450938
',4085,'PAGE',0,'2016-04-08 00:13:09','web','WELCOME',0,'',1,0,0,''),('395b13aa-920c-4697-b95e-8d8c00342001','天气预报接口','气象数据开放接口是中国气象局面向网络媒体、手机厂商、第三方气象服务机构等用户,\n通过web方式提供气象数据服务的官方载体。随着气象数据开放平台的逐渐完善,\n会面向广大用户提供更为丰富全面的气象数据,从而满足不同用户的不同需求。','

气象数据开放平台:http://openweather.weather.com.cn/Home/Package/index.html

1.常规气象数据接口

2.基础气象数据接口


直接通过气象局调用以上两个接口现阶段免费,未来可能需要收费,需要注册账号并完善资料后才能调用

目前气象局对外公开的直接可调用的接口如下:


国外天气预报接口:https://www.wunderground.com/weather/api

城市代码可直接通过气象局官网查询,地址:http://openweather.weather.com.cn/Home/Help/area.html

',288,'ARTICLE',0,'2016-04-08 23:01:18','web',NULL,1,'常用接口',1,0,0,''),('426abac0-8b5a-494b-940e-9727025ac1e7','WebP 探寻之路','','
前言

不管是 PC 还是移动端,图片一直是流量大头,以苹果公司 Retina 产品为代表的高 PPI 屏对图片的质量提出了更高的要求,如何保证在图片的精细度不降低的前提下缩小图片体积,成为了一个有价值且值得探索的事情。


但如今对于 JPEG、PNG 和 GIF 这些图片格式的优化几乎已经达到了极致, 若想改变现状开辟新局面,便要有釜底抽薪的胆量和气魄,而 Google 给了我们一个新选择:WebP


对 WebP 的研究缘起于手机 QQ 原创表情商城,由于表情包体积较大,在 2G/3G
的网络环境下加载较慢。同事小贝恰好因为 2013 Google I/O Event 了解到了
WebP,于是我们便一起开始了没羞没躁的技术预研,期待在原创表情图片的质量与体积之间寻找最美的平衡。


\"WebP


今年 WebP 图片格式得到越来越多的关注,很多团队也开始布道,前阵子的前端圈“走进腾讯互娱前端技术专场”也有相关专题。借此热潮,在这里把上一年的探索过程以及今年 WebP 新的发展一同分享出来,同时也期待更多的人将其应用于实际业务中。


什么是 WebP?


WebP(发音 weppy,项目主页),
是一种支持有损压缩和无损压缩的图片文件格式,派生自图像编码格式 VP8。根据 Google 的测试,无损压缩后的 WebP 比 PNG 文件少了
 45% 的文件大小,即使这些 PNG 文件经过其他压缩工具压缩之后,WebP 还是可以减少 28% 的文件大小。


2010 年发布的 WebP 已经不算是新鲜事物了,在 Google 的明星产品如
Youtube、Gmail、Google Play 中都可以看到 WebP 的身影,而 Chrome 网上商店甚至已完全使用了
WebP。国外公司如 Facebook、ebay 和国内公司如腾讯、淘宝、美团等也早已尝鲜。目前 WebP
也在我厂很多的项目中得到应用,如腾讯新闻客户端、腾讯网、QQ空间等,同时也有一些针对 WebP 的图片格式转换工具,如 智图iSparta 等。


\"WebP

(Google 已和正在部署的 WebP 的产品)


可喜的是,直到今年,Google 对 WebP 依旧投入了持续的热情,2014 年的 Google I/O Event 中也出现了两个介绍 WebP 应用的视频。WebP 已大量应用于全球流量消耗最多的 Google 产品中,你还有理由拒绝它吗?


\"WebP



WebP 的优势



上面只是简单介绍了这种图片格式的背景和应用,不过 “talk is cheap”,这种格式优势在哪里?除了压缩效果极好,图片质量能否得到保障?这需要更理性客观的数据:


这里列举一个简单的测试:对比 PNG 原图、PNG 无损压缩、PNG 转 WebP(无损)、PNG 转 WebP(有损)的压缩效果。更多测试查看这里(请用 Chrome 浏览器打开)


\"WebP


可以得出结论:


 

WebP 的优势体现在它具有更优的图像数据压缩算法,能带来更小的图片体积,而且拥有肉眼识别无差异的图像质量;同时具备了无损和有损的压缩模式、Alpha 透明以及动画的特性,在 JPEG 和 PNG 上的转化效果都非常优秀、稳定和统一。


科技博客 Gig‍‍‍aOM 曾报道:YouTube 的视频略缩图采用 WebP 格式后,网页加载速度提升了 10%;谷歌的 Chrome
 网上应用商店采用 WebP 格式图片后,每天可以节省几 TB 的带宽,页面平均加载时间大约减少 1/3;Google+ 移动应用采用 WebP
 图片格式后,每天节省了 50TB 数据存储空间。



兼容性与可用性



现在问题来了:WebP 的支持度和兼容性如何?


根据对目前国内浏览器占比与 WebP 的兼容性
析,大约有 50% 以上的国内用户可以直接体验到 WebP,如果你的网站以图片为主,或者你的产品基于 Chromium
内核,建议体验尝试。假如你打算在 App 中使用 WebP,除了 Android4.0 以上提供的原生支持外,其他版本以及 iOS
都可以直接使用官方提供的解析库(AndroidiOS )。


为了验证 WebP 图片格式的业务可行性,我们从流畅度、解码耗时、CPU 使用、内存占用几个维度进行的分析,在开发同学们的帮助下得到了非常宝贵的测试数据:


测试一:AndroidQQ 下 PNG 和 WebP 各指标对比。

测试环境:AndroidQQ、Galaxy Nexus、Android4.2.2 系统

测试对象:WebP、PNG

测试数据(部分):


\"WebP


测试结论:


测试二:iPhoneQQ 下 PNG 和 WebP 各指标对比。

测试环境:iPhoneQQ、iPhone4、iOS5.1.1 系统

测试对象:WebP、PNG

测试数据(部分):


\"WebP


测试结论



可见除了 WebP 在解码时间与 PNG 有较明显差异(毫秒级别)之外,总体使用体验和 PNG 基本无差异。同时也需要明确,移动设备的发展迅猛,硬件升级快,上一年的表现也许在今年又有了明显的提升。所以,在 App 中使用 WebP 基本没有技术阻碍。



对原创表情商城的技术指导



在验证了业务可行性之后,WebP 又激发了我们对另外一些方向的思考:既然它表现如此优秀,能否进一步摸清其“秉性”,得到一些能在未来使用中遵循的指导方案?


于是,为了更深入了解 WebP 特性,我们针对原创表情项目 “不同的表情图片,如何获得 WebP 的最佳压缩效率” 问题继续展开探究,主要从图片规格、色彩数(颜色数量)、参数配置几个维度进行:


探索一:图片规格


通过阅读文献了解到 WebP 使用的是 Fancy 采样算法,既然是采样算法必然有采样区块,而 JPEG 的采样区块是 8*8,对于原始图片的长宽不是 8 的倍数,都需要先补成 8 的倍数,使其能一块块的处理,所以对于 8 的整数倍的图片,压缩会更高效。


那么 WebP 的采样区块会是多少?我们在其他因素保持不变的前提下改变图片规格,选取了 200*200
附近多个规格值,得到了一些数据。将数据可视化之后可以看到凡是以 16*16
倍数(160*160、176*176、192*192、256*256)为规格的图片,有损压缩的比例都明显大于以 4*4 或 8*8
的倍数为规格的图片。


\"WebP



结论:原创表情可以考虑使用 “16n*16n” 的规格。目前原创表情选择的是 200*200 的规格大小,实际上选择 256*256 或者 192*192 能获得更高的 WebP 压缩效率,量级在千分之几。



探索二:色彩数


在 JPEG 和 PNG 格式的选择经验上可以知道,对于色彩复杂的图片,一般使用 JPEG
 格式,而对于色彩单一的图片,使用 PNG 格式。可见色彩数会影响图片的压缩效果。于是我们通过 Photoshop
中的色阶分离功能调整表情图片的色彩数,在其他因素保持不变的前提下对比不同色彩数对于 WebP 有损无损压缩的影响。


\"WebP



可见,在色彩数相对较少的前提下,无损压缩的效果要优于有损压缩;而色彩数很多时,有损压缩效果要优于无损压缩,这个分界点在 256±100 之间。


结论:建议原创表情尽量控制颜色数在 256 色以内,采用无损压缩性价比最高。


 


探索三:色温、渐变与杂色、直线与直线、描边


\"WebP



随后又从色温、渐变与杂色、直线曲线、是否需要描边上进行了分析,最后的结论即:



 


探索四:压缩配置


为了得到无损压缩和有损压缩的最佳压缩配置,我们通过对 900 张表情图片进行不同压缩配置的测试(大部分表情图片的色彩数都在 256 色以上),得到下面的数据:


\"WebP


压缩参数说明:



可以发现,无损压缩表现很稳定,压缩质量越高,压缩效果也越好。而有损压缩在压缩质量设置为 75 以上之后,压缩效果反而减弱,甚至压缩后的图片体积会大于压缩前的体积。所以得出以下结论:




最终,得出了一个正反面案例,从技术角度分析不同的表情图标的优劣(强调一下是“技术角度”,这里列举的表情都很赞 ^_^)。


\"WebP



动态 WebP 初探



了解完静态 WebP,下面再了解一下动态 WebP(Animated WebP):2013
 年 11 月 21 日,Animated WebP 终于取得进展,并在 Chrome32 Beta 中得到了支持。目前 Animated
WebP 支持将 GIF 直接转换成 Animated WebP,或者将多张 WebP 图片组合成 Animated WebP。与传统的 GIF
 图比较,Animated WebP 的优势在于:




假如你在使用 Chrome32 以上的浏览器,可以点这里体验


\"WebP


但新兴的事物必然存在不足的地方,Animated WebP 存在的问题:



根据自己实际的测试,发现 Animated WebP 的压缩效果较不稳定,在默认压缩配置下达不到 Google 官方提供的示例效果。但 Animated WebP 依然有很多值得期待的空间,值得继续关注。


综合技术方案


对于不同场景下 WebP 的使用,我们总结了一些解决方案,如下:


1、若使用场景是浏览器,可以:


2、若使用场景是 App,可以:


3、转换工具:



iSparta 是我们组针对 WebP 和 APNG 两种新型图片格式的转化而开发的一款桌面应用,直接图片批量转换为 WebP,同时提供多种参数配置,欢迎体验。


\"WebP




参考文献



http://en.wikipedia.org/wiki/WebP

https://developers.google.com/speed/webp/

http://tech.qq.com/a/20140721/074637.htm

http://faso.me/slides/2014/webp/

http://www.webpagetest.org/video/compare.php?tests=141121_3W_JT7,141121_6Q_JSM

                          
腾讯ISUX (https://isux.tencent.com/introduction-of-webp.html)

                        


                    

                                    



',117,'ARTICLE',0,'2016-05-18 11:14:59','web',NULL,1,'技术文档',0,0,0,''),('521dd1c8-e2ff-49c8-a9e7-6e72a6cb6e27','CrapApi数据修改记录及恢复设计','CrapApi为多管理员系统,存在其他管理员误操作等情况导致数据丢失,因此考虑添加修改日志记录及恢复功能','

表设计log:

id主键
modelClass数据对应的class类
modelName前端展示的名称:如接口、菜单....
type操作类型:删除、修改
content操作之前的json数据
user操作人
remark备注
createTime时间


设计思路:

1、删除、修改之前将原有数据记录log表

2、恢复数据:最高管理员拥有恢复数据的权限

',15,'ARTICLE',0,'2016-06-05 13:39:21','web',NULL,1,'帮助文档',0,0,0,''),('5cc2867b-d4b6-417b-a99c-c069641c491e','用户行为分析研究之数据采集','用户行为分析,是指在获得网站访问量基本数据的情况下,对有关数据进行统计、分析,从中发现用户访问网站的规律,并将这些规律与网络营销策略等相结合,从而发现目前网络营销活动中可能存在的问题,并为进一步修正或重新制定网络营销策略提供依据。','

\n 用户行为分析对于商业网站非常重要,而对于大型网站而言,网站响应速度是网站是否优秀一个重要衡量标准。怎样在保证网站响应速度的同时采集到用户的相关数据对于一个系统来说是具有挑战性的。\n

\n

\n
\n

\n

\n 日志记录的作用:\n

\n

\n 1. 转化率计算:通过分析到访人数、注册人数、下单人数统计转化率\n

\n

\n 2. 系统性能优化:通过访问记录,着重优化高并发的页面\n

\n

\n 3. 黑客攻击防范:通过接口访问记录和日志访问记录,分析记录,建立黑名单机制,防止恶意攻击行为\n

\n

\n 4. 用户行为分析、商业活动统计:大v转发后的阅读量、二次转发率,消息推送阅读数.....\n

\n

\n
\n

\n

\n 采集系统之服务端搭建:\n

\n

\n 本地开发我就搭建一个apache服务器。服务器的开发非常简单,只要修改下apache下的conf文件(注意:我的开发平台是window7),代码如下:\n

\n
\n
<IfModule log_config_module> LogFormat \"%h %l %u %t [%{%Y-%m-%d %T}t] \\\"%r\\\" [%q] [%U] %>s %b \\\"%{Referer}i\\\" \\\"%{User-Agent}i\\\"\" combined\n LogFormat \"%h %l %u %t [%{%Y-%m-%d %T}t] \\\"%r\\\" [%q] [%U] %>s %b\" common <IfModule logio_module> # You need to enable mod_logio.c to use %I and %O\n LogFormat \"%h %l %u %t [%{%Y-%m-%d %T}t] \\\"%r\\\" [%q] [%U] %>s %b \\\"%{Referer}i\\\" \\\"%{User-Agent}i\\\" %I %O\" combinedio </IfModule>   
\n
\n

\n 在htdocs文件夹里添加如下文件:\n

\n

\n 1) a.gif(1*1像素的透明文件)\n

\n

\n
\n

\n

\n 启动apache服务器,我们在浏览器录入如下地址: http://127.0.0.1/a.gif?name=sharpxiajun&msg=test\n

\n

\n 在logs文件夹里找到2012_06_26.access.log文件,打开文件,我们会看到如下日志:\n

\n
127.0.0.1 - - [26/Jun/2012:11:37:07 +0800] [2012-06-26 11:37:07] \"GET /a.gif?name=sharpxiajun&msg=test HTTP/1.1\" [?name=sharpxiajun&msg=test] [/a.gif] 200 43
\n

\n
\n

\n

\n 采集系统之客户端:\n

\n

\n 采集系统的核心还是客户端的采集脚本,通过js脚本获取相关信息,用户访问页面时,通过js发起一个请求,访问http://xxxx/a.gif\n

\n

\n
\n

\n

\n 参考资料:用户行为分析研究之数据采集.pdf \n

',34,'ARTICLE',0,'2016-06-04 01:19:51','web',NULL,1,'技术文档',0,0,66,''),('63864a72-ab64-4350-a3d7-d25d5bfc88bf','手机号码归属地查询接口大全(七种)','淘宝、拍拍、财付通、百付宝等手机号码查询接口','

淘宝网
API地址: http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443
参数:
tel:手机号码
返回:JSON


拍拍
API地址: http://virtual.paipai.com/extinfo/GetMobileProductInfo?mobile=15850781443&amount=10000&callname=getPhoneNumInfoExtCallback
参数:
mobile:手机号码
callname:回调函数
amount:未知(必须)
返回:JSON


财付通
API地址: http://life.tenpay.com/cgi-bin/mobile/MobileQueryAttribution.cgi?chgmobile=15850781443
参数:
chgmobile:手机号码
返回:xml


百付宝
API地址: https://www.baifubao.com/callback?cmd=1059&callback=phone&phone=15850781443
参数:
phone:手机号码
callback:回调函数
cmd:未知(必须)
返回:JSON


115
API地址: http://cz.115.com/?ct=index&ac=get_mobile_local&callback=jsonp1333962541001&mobile=15850781443
参数:
mobile:手机号码
callback:回调函数
返回:JSON

有道api接口
接口地址:http://www.youdao.com/smartresult-xml/search.s?type=mobile&q=13892101112
参数说明:
type : 参数手机归属地固定为mobile
q : 手机号码
返回XML格式:
或者
http://www.youdao.com/smartresult-xml/search.s?jsFlag=true&type=mobile&q=手机号码
返回JSON格式:
fYodaoCallBack(1, {‘product’:\'mobile’,\'phonenum’:’13892101112′,’location’:\'陕西 延安’} , ”);


096.me api接口
查询手机号码归属地:
http://www.096.me/api.php?phone=手机号&mode={txt,xml}
举例:http://www.096.me/api.php?phone=13892101111&mode=txt
返回:
13892101111||陕西延安移动全球通卡 ||吉凶参半,惟赖勇气,贯彻力行,始可成功 吉带凶||
举例:http://www.096.me/api.php?phone=13892101111&mode=xml
返回:
13892101111 陕西延安移动全球通卡 吉凶参半,惟赖勇气,贯彻力行,始可成功 吉带凶

',437,'ARTICLE',0,'2016-04-10 23:34:31','web',NULL,1,'常用接口',1,0,0,''),('67aacf66-1e15-457e-ace3-64c264930ee9','自定义网站色调、宽度、字体','系统支持自定义网站主色调、字体、网站显示宽度等','

1. 使用最高权限账号登录,点击系统设置

\"\"/

2.点击修改按钮,选着颜色后点击提交,刷新页面设置即可生效

\"\"/

3.字体选择

使用最高管理员登陆系统,选中“网站字体”并点击编辑,进入如下图所示页面,在该页面中系统内置了4中字体,你可以点击【选着字体】按钮直接选择字体,也可在输入框输入字体样式。

',110,'ARTICLE',0,'2016-04-29 16:51:58','web',NULL,1,'帮助文档',0,0,98,''),('6da62aab-638b-49d8-8dce-13f31169cd23','常见问题','','

1. 如何上传本地图片?

2. 接口访问密码,文章访问密码,数据字典访问密码设置

     接口、数据字典密码设置在所属模块上,文章访问密码定义在文章详情中

',32,'ARTICLE',0,'2016-05-15 23:33:26','web',NULL,1,'帮助文档',0,0,0,''),('74987b7c-54bc-4043-aa6b-de949303b2a0','联系我','联系我','

联系我

QQ群:254450938

',277,'PAGE',0,'2016-04-08 01:46:49','web','CONTACT',1,'',1,0,0,''),('75422949-daa1-409c-a215-bd34f225e802','HTTPDNS成为移动互联网的标配–原因与原理解析','DNS,作用就是将域名解析成IP。一个DNS查询,先从本地缓存查找,\n如果没有或者已经过期,就从DNS服务器查询,\n如果客户端没有主动设置DNS服务器,一般是从服务商DNS服务器上查找。这就出现了不可控。','

DNS劫持

一些小服务商以及小地方的服务商非常喜欢干这个事情。根据腾讯给出的数据,DNS劫持率7%,恶意劫持率2%。网速给的劫持率是10-15%。

  1.  把你的域名解析到竞争对手那里,然后哭死都不知道,为什么流量下降了。
  2.  在你的代码当中,插入广告或者追踪代码。这就是为什么在淘宝或者百度搜索一下东西,很快就有人联系你。
  3.  下载APK文件的时候,替换你的文件,下载一个其他应用或者山寨应用。
  4.  打开一个页面,先跳转到广告联盟,然后跳转到这个页面。无缘无故多花广告钱,以及对运营的误导


智能DNS策略失效

智能DNS,就是为了调度用户访问策略,但是这些因素会导致智能DNS策略失效。

  1.  小运营商,没有DNS服务器,直接调用别的服务商,导致服务商识别错误,直接跨网传输,速度大大下降。
  2.  服务商多长NAT,实际IP,获得不了,结果没有就近访问。
  3.  一些运营商将IP设置到开卡地,即使漫游到其他地方,结果也是没有就近访问。


Http DNS 原理

客户端请求一个接口,例如http://154.58.*.*/dns?domain=www.api.crap.cn&client=xiaomi&screen=1024*960&gps=137,35&…等一些参数。服务器根据参数,给出最优的ip或者IP列表。APP就通过IP访问,不使用域名。


HTTP DNS 负载均衡

返回IP列表,客户端可以依靠策略,进行负载均衡。

  1.  客户端随机选取IP
  2.  客户端轮询使用IP


HTTP DNS缓存与更新

可以使用HTTP header进行方式进行缓存,参考这篇文章《http头部如何对缓存的控制》。也可以客户端自己设置过期时间,过期去服务端端拉取。


HTTP DNS不可用

两种解决方式

  1.  继续使用缓存
  2.  使用最初的DNS解析


IP不可用

HTTP DNS给的IP地址,发现不可用。

  1.  重试一定的次数,不成功换下一个IP。
  2.  下一个IP也不可用,继续换下一个。


但是这样会造成下面一个问题。


雪崩

部分服务器不可用的时候,结果压力都转到其他可用的服务器上面,导致最后所有的服务器都不可用。

  1.  服务不可用的时候,随机加延时,分散压力。
  2.  重试一定次数的时候,就不继续重试,宁愿部分不可用,不能让所有的人不可用。


网站是否可用

浏览器都是通过域名访问,当然一些用户不可感知的服务,可以使用IP访问。

',20,'ARTICLE',0,'2016-04-24 13:55:46','web',NULL,1,'技术文档',0,0,0,''),('9385500e-5dc2-4433-8a4b-47158620ef36','CrapApi接口管理系统菜单设置','CrapApi系统菜单目前分为后台菜单、前端菜单、底部菜单、顶部菜单、友情链接五大类,\n其中后台菜单、前端菜单、顶部菜单支持二级菜单','

1.菜单分类

CrapApi系统菜单目前分为后台菜单、前端菜单、底部菜单、顶部菜单、友情链接五大类,其中后台菜单、前端菜单、顶部菜单支持二级菜单

后台菜单:后台菜单是管理员菜单,不同权限、角色可以个性化定制不同菜单,后台管理菜单只支持二级菜单,即使一级菜单设置了超链接,也不可点击,拥有【超级管理员】权限的账号等候后即使没有配置任何菜单,任然可以看到如图一的默认菜单,非【超级管理员】的普通管理员需要设置后台菜单

前端菜单:前端菜单是游客访问网站看到的主菜单(左侧菜单),该菜单也只支持二级分类,即使一级菜单设置了超链接,也不可点击

底部菜单:底部菜单在游客访问网站时的底部显示(倒数第二排),底部菜单只持此一级菜单,二级菜单不显示

顶部菜单:顶部菜单在游客访问网站是的顶部,支持一级和二级(没有二级一级可点击,如果有二级菜单,一级菜超链接无效)

友情链接:友情链接在游客访问网站的底部,至支持一次菜单,二级菜单不显示

\"\"/

\"\"/

2. 菜单修改

进入后台,点击菜单管理,超级管理员和拥有权限的普通管理员可以看到菜单对应的【修改】【删除】【查看子菜单】,点击修改即可修改对应的菜单,默认进入显示的是【前端菜单】,可以在菜单列表的右上根据类型或菜单名搜索菜单,如下图:在【类型】栏点击输入框即可选着类型,链接可以自己输入,也可点击【选着地址】按钮进行选择。

在链接下拉选着中,显示了站内通用的地址,主要包括【后台链接】(后台管理员相关的链接)和【前端链接】(游客相关的链接)两种类型,其中包括:前后台模块列表页面,前后台接口列表页面,前端文章分类页面,后台菜单分类列表页面,文章分类列表页面,网站页面等,一级菜单必须选择类型,二级菜单不需要选择类型

\"\"/

3.菜单图标设置

后台一级菜单,前端一级菜单支持显示图标,类容为:<i class="iconfont">&#xxxxx;<i>,红色部分请根据需要显示的图标填写,目前支持的图标及对应的代码如下:

\"\"/

CSDN文章地址:http://blog.csdn.net/torrytang/article/details/51147823

',84,'ARTICLE',0,'2016-04-11 23:47:35','web',NULL,1,'帮助文档',1,0,96,''),('a6716dfc-0a0b-4c6f-932c-faf7b50a61b8','131','12312','

123213

',2,'ARTICLE',0,'2016-04-10 17:21:34','web',NULL,1,'13213',1,0,0,''),('adac2618-f9b8-4990-9979-0f402b1b765f','CrapApi—网站页面表(webPage)','网站页面表:用于存储网站页面(说明、联系地址、欢迎页等静态页面)、文章(帮助文档、技术文章...)、数据字典...','[{\"name\":\"id\",\"type\":\"varchar(50)\",\"notNull\":\"否\",\"def\":\"无\",\"remark\":\"主键\"},{\"name\":\"name\",\"type\":\"varchar(100)\",\"notNull\":\"否\",\"def\":\"无\",\"remark\":\"标题\"},{\"name\":\"brief\",\"type\":\"varchar(200)\",\"notNull\":\"是\",\"def\":\"无\",\"remark\":\"简介\"},{\"name\":\"content\",\"type\":\"text\",\"notNull\":\"否\",\"def\":\"无\",\"remark\":\"内容\"},{\"name\":\"click\",\"type\":\"int\",\"notNull\":\"否\",\"def\":\"0\",\"remark\":\"点击量\"},{\"name\":\"type\",\"type\":\"varchar(20)\",\"notNull\":\"否\",\"def\":\"PAGE\",\"remark\":\"类型:数据字典、文章、页面...\"},{\"name\":\"status\",\"type\":\"tinyint\",\"notNull\":\"否\",\"def\":\"1\",\"remark\":\"状态(暂时没用)\"},{\"name\":\"createTime\",\"type\":\"timestamp\",\"notNull\":\"否\",\"def\":\"CURRENT_TIMESTAMP\",\"remark\":\"创建时间\"},{\"name\":\"moduleId\",\"type\":\"varchar(50)\",\"notNull\":\"是\",\"def\":\"无\",\"remark\":\"模块(当类型为数据字典时需要)\"},{\"name\":\"mkey\",\"type\":\"varchar(20)\",\"notNull\":\"是\",\"def\":\"无\",\"remark\":\"唯一键,页面唯一标识\"},{\"name\":\"canDelete\",\"type\":\"tinyint\",\"notNull\":\"否\",\"def\":\"1\",\"remark\":\"是否可删除,可修key,默认可以\"},{\"name\":\"category\",\"type\":\"varchar(50)\",\"notNull\":\"是\",\"def\":\"无\",\"remark\":\"类目\"},{\"name\":\"canComment\",\"type\":\"tinyint\",\"notNull\":\"否\",\"def\":\"1\",\"remark\":\"是否可以评论\"},{\"name\":\"commentCount\",\"type\":\"int\",\"notNull\":\"否\",\"def\":\"0\",\"remark\":\"评论数量\"},{\"name\":\"sequence\",\"type\":\"int\",\"notNull\":\"否\",\"def\":\"0\",\"remark\":\"排序:排序,越大越靠前\"},{\"name\":\"password\",\"type\":\"varchar(45)\",\"notNull\":\"否\",\"def\":\"空串\",\"remark\":\"密码:当类型为文章时\"}]',1,'DICTIONARY',0,'2016-06-06 20:48:34','9a483c5b-98cc-45da-9cdf-0d3e4c382e49',NULL,1,'',0,0,0,''),('b90c5f0b-d90e-4a5b-9eed-d6c0def89119','网站安全:哈希加盐','大多数的web开发者都会遇到设计用户账号系统的需求。\n一些大公司的用户数据库泄露事件也时有发生,所以我们必须采取一些措施来保护用户的密码,\n即使网站被攻破的情况下也不会造成较大的危害。','

0x01 重要提醒


如果你打算自己写一段代码来进行密码hash,那么赶紧停下吧。这样太容易犯错了。这个提醒适用于每一个人,不要自己写密码的hash算法 !关于保存密码的问题已经有了成熟的方案,那就是使用phpass或者本文提供的源码。

0x02 什么是hash


Hash算法是一种单向的函数。它可以把任意数量的数据转换成固定长度的“指纹”,这个过程是不可逆的。而且只要输入发生改变,哪怕只有一个bit,输出的hash值也会有很大不同。这种特性恰好合适用来用来保存密码。因为我们希望使用一种不可逆的算法来加密保存的密码,同时又需要在用户登陆的时候验证密码是否正确。

在一个使用hash的账号系统中,用户注册和认证的大致流程如下:

1. 用户创建自己的账号
2. 用户密码经过hash操作之后存储在数据库中。没有任何明文的密码存储在服务器的硬盘上。
3. 用户登陆的时候,将用户输入的密码进行hash操作后与数据库里保存的密码hash值进行对比。
4. 如果hash值完全一样,则认为用户输入的密码是正确的。否则就认为用户输入了无效的密码。
5. 每次用户尝试登陆的时候就重复步骤3和步骤4。

在步骤4的时候不要告诉用户是账号还是密码错了。只需要显示一个通用的提示,比如账号或密码不正确就可以了。这样可以防止攻击者枚举有效的用户名。

还需要注意的是用来保护密码的hash函数跟数据结构课上见过的hash函数不完全一样。比如实现hash表的hash函数设计的目的是快速,但是不够安全。只有加密hash函数(cryptographic hash functions)可以用来进行密码的hash。这样的函数有SHA256, SHA512, RipeMD, WHIRLPOOL等。

一个常见的观念就是密码经过hash之后存储就安全了。这显然是不正确的。有很多方式可以快速的从hash恢复明文的密码。还记得那些md5破解网站吧,只需要提交一个hash,不到一秒钟就能知道结果。显然,单纯的对密码进行hash还是远远达不到我们的安全需求。下一部分先讨论一下破解密码hash,获取明文常见的手段。

0x03 如何破解hash


字典和暴力破解攻击(Dictionary and Brute Force Attacks)

最常见的破解hash手段就是猜测密码。然后对每一个可能的密码进行hash,对比需要破解的hash和猜测的密码hash值,如果两个值一样,那么之前猜测的密码就是正确的密码明文。猜测密码攻击常用的方式就是字典攻击和暴力攻击。

Dictionary Attack

Trying apple : failed
Trying blueberry : failed
Trying justinbeiber : failed
...
Trying letmein : failed
Trying s3cr3t : success!

字典攻击是将常用的密码,单词,短语和其他可能用来做密码的字符串放到一个文件中,然后对文件中的每一个词进行hash,将这些hash与需要破解的密码hash比较。这种方式的成功率取决于密码字典的大小以及字典的是否合适。

Brute Force Attack

Trying aaaa : failed
Trying aaab : failed
Trying aaac : failed
...
Trying acdb : failed
Trying acdc : success!

暴力攻击就是对于给定的密码长度,尝试每一种可能的字符组合。这种方式需要花费大量的计算机时间。但是理论上只要时间足够,最后密码一定能够破解出来。只是如果密码太长,破解花费的时间就会大到无法承受。

目前没有方式可以阻止字典攻击和暴力攻击。只能想办法让它们变的低效。如果你的密码hash系统设计的是安全的,那么破解hash唯一的方式就是进行字典或者暴力攻击了。

彩虹表 (Rainbow Tables)

彩虹表是一种使用空间换取时间的技术。跟查表破解很相似。只是它牺牲了一些破解时间来达到更小的存储空间的目的。因为彩虹表使用的存储空间更小,所以单位空间就可以存储更多的hash。彩虹表已经能够破解8位长度的任意md5hash。彩虹表具体的原理可以参考http://www.project-rainbowcrack.com/

下一章节我们会讨论一种叫做“盐”(salting)的技术。通过这种技术可以让查表和彩虹表的方式无法破解hash。

0x04 加盐(Adding Salt)




hash("hello")                    = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
hash("hello" + "QxLUF1bgIAdeQX") = 9e209040c863f84a31e719795b2577523954739fe5ed3b58a75cff2127075ed1
hash("hello" + "bv5PehSMfV11Cd") = d1d3ec2e6f20fd420d50e2642992841d8338a314b8ea157c9e18477aaef226ab
hash("hello" + "YYLmfY6IehjZMQ") = a49670c3c18b9e079b9cfaf51634f563dc8ae3070db2c4a8544305df1b60f007


查表和彩虹表的方式之所以有效是因为每一个密码的都是通过同样的方式来进行hash的。如果两个用户使用了同样的密码,那么一定他们的密码hash也一定相同。我们可以通过让每一个hash随机化,同一个密码hash两次,得到的不同的hash来避免这种攻击。

具体的操作就是给密码加一个随即的前缀或者后缀,然后再进行hash。这个随即的后缀或者前缀成为“盐”。正如上面给出的例子一样,通过加盐,相同的密码每次hash都是完全不一样的字符串了。检查用户输入的密码是否正确的时候,我们也还需要这个盐,所以盐一般都是跟hash一起保存在数据库里,或者作为hash字符串的一部分。

盐不需要保密,只要盐是随机的话,查表,彩虹表都会失效。因为攻击者无法事先知道盐是什么,也就没有办法预先计算出查询表和彩虹表。如果每个用户都是使用了不同的盐,那么反向查表攻击也没法成功。

下一节,我们会介绍一些盐的常见的错误实现。

0x05 错误的方式:短的盐和盐的复用


最常见的错误实现就是一个盐在多个hash中使用或者使用的盐很短。

盐的复用(Salt Reuse)

不管是将盐硬编码在程序里还是随机一次生成的,在每一个密码hash里使用相同的盐会使这种防御方法失效。因为相同的密码hash两次得到的结果还是相同的。攻击者就可以使用反向查表的方式进行字典和暴力攻击。只要在对字典中每一个密码进行hash之前加上这个固定的盐就可以了。如果是流行的程序的使用了硬编码的盐,那么也可能出现针对这种程序的这个盐的查询表和彩虹表,从而实现快速破解hash。

用户每次创建或者修改密码一定要使用一个新的随机的盐

短的盐

如果盐的位数太短的话,攻击者也可以预先制作针对所有可能的盐的查询表。比如,3位ASCII字符的盐,一共有95x95x95 = 857,375种可能性。看起来好像很多。假如每一个盐制作一个1MB的包含常见密码的查询表,857,375个盐才是837GB。现在买个1TB的硬盘都只要几百块而已。

基于同样的理由,千万不要用用户名做为盐。虽然对于每一个用户来说用户名可能是不同的,但是用户名是可预测的,并不是完全随机的。攻击者完全可以用常见的用户名作为盐来制作查询表和彩虹表破解hash。

根据一些经验得出来的规则就是盐的大小要跟hash函数的输出一致。比如,SHA256的输出是256bits(32bytes),盐的长度也应该是32个字节的随机数据。

0x07 hash碰撞(Hash Collisions)


因为hash函数是将任意数量的数据映射成一个固定长度的字符串,所以一定存在不同的输入经过hash之后变成相同的字符串的情况。加密hash函数(Cryptographic hash function)在设计的时候希望使这种碰撞攻击实现起来成本难以置信的高。但时不时的就有密码学家发现快速实现hash碰撞的方法。最近的一个例子就是MD5,它的碰撞攻击已经实现了。

碰撞攻击是找到另外一个跟原密码不一样,但是具有相同hash的字符串。但是,即使在相对弱的hash算法,比如MD5,要实现碰撞攻击也需要大量的算力(computing power),所以在实际使用中偶然出现hash碰撞的情况几乎不太可能。一个使用加盐MD5的密码hash在实际使用中跟使用其他算法比如SHA256一样安全。不过如果可以的话,使用更安全的hash函数,比如SHA256, SHA512, RipeMD, WHIRLPOOL等是更好的选择。

0x08 正确的方式:如何恰当的进行hash


这部分会详细讨论如何恰当的进行密码hash。第一个章节是最基础的,这章节的内容是必须的。后面一个章节是阐述如何继续增强安全性,让hash破解变得异常困难。

基础:使用加盐hash

我们已经知道恶意黑客可以通过查表和彩虹表的方式快速的获得hash对应的明文密码,我们也知道了通过使用随机的盐可以解决这个问题。但是我们怎么生成盐,怎么在hash的过程中使用盐呢?

盐要使用密码学上可靠安全的伪随机数生成器(Cryptographically Secure Pseudo-Random Number Generator (CSPRNG))来产生。CSPRNG跟普通的伪随机数生成器比如C语言中的rand(),有很大不同。正如它的名字说明的那样,CSPRNG提供一个高标准的随机数,是完全无法预测的。我们不希望我们的盐能够被预测到,所以一定要使用CSPRNG。下表提供了一些常用语言中的CSPRNG。

PlatformCSPRNG
PHPmcrypt_create_iv, openssl_random_pseudo_bytes
Javajava.security.SecureRandom
Dot NET (C#, VB)System.Security.Cryptography.RNGCryptoServiceProvider
RubySecureRandom
Pythonos.urandom
PerlMath::Random::Secure
C/C++ (Windows API)CryptGenRandom
Any language on GNU/Linux or UnixRead from /dev/random or /dev/urandom

每一个用户,每一个密码都要使用不同的盐。用户每次创建账户或者修改密码都要使用一个新的随机盐。永远不要重复使用盐。盐的长度要足够,一个经验规则就是盐的至少要跟hash函数输出的长度一致。盐应该跟hash一起存储在用户信息表里。

存储一个密码:

1. 使用CSPRNG生成一个长的随机盐。
2. 将密码和盐拼接在一起,使用标准的加密hash函数比如SHA256进行hash
3. 将盐和hash记录在用户数据库中

验证一个密码:

1. 从数据库中取出用户的盐和hash
2. 将用户输入的密码和盐按相同方式拼接在一起,使用相同的hash函数进行hash
3. 比较计算出的hash跟存储的hash是否相同。如果相同则密码正确。反之则密码错误。



我应该使用什么hash算法

可以使用

  1. 本文最后介绍的代码
  2. OpenWall的Portable PHP password hashing framework
  3. 经过充分测试的加密hash函数,比如SHA256, SHA512, RipeMD, WHIRLPOOL, SHA3等
  4. 设计良好的key扩展hash算法,比如PBKDF2bcryptscrypt
  5. crypt的安全版本。($2y$, $5$, $6$)

不要使用

  1. 过时的hash函数,比如MD5,SHA1
  2. crypt的不安全版本。($1$, $2$, $2x$, $3$)
  3. 任何自己设计的算法。

尽管MD5和SHA1并没有密码学方面的攻击导致它们生成的hash很容易被破解,但是它们年代很古老了,通常都认为(可能有一些不恰当)它们不合适用来进行密码的存储。所以我不推荐使用它们。对于这个规则有个例外就是PBKDF2,它使用SHA1作为它的基础算法。

当用户忘记密码的时候我应该怎样让他们重置

在我个人看来现在外面广泛使用的密码重置机制都是不安全的,如果你有很高的安全需求,比如重要的加密服务,那么不要让用户重置他们的密码。

大多数网站使用绑定的email来进行密码找回。通过生成一个随机的只使用一次的token,这个token必须跟账户绑定,然后把密码重置的链接发送到用户邮箱中。当用户点击密码重置链接的时候,提示他们输入新的密码。需要注意token一定要绑定到用户以免攻击者使用发送给自己的token来修改别人的密码。

token一定要设置成15分钟后或者使用一次后作废。当用户登陆或者请求了一个新的token的时候,之前发送的token都作废也是不错的主意。如果token不失效的话,那么就可以用来永久控制这个账户了。Email(SMTP)是明文传输的协议,而互联网上可能有很多恶意的路由器记录email流量。并且用户的email账号也可能被盗。使token尽可能快的失效可以降低上面提到的这些风险。

用户可能尝试去修改token,所以不要在token里存储任何账户信息。token应该是一个不能被预测的随机的二进制块(binary blob),仅仅用来进行识别的一条记录。

永远不要通过email发送用户的新密码。记得用户重置密码的时候要重新生成盐,不要使用之前旧密码使用的盐。


如果攻击者获取了数据库权限,他不能直接替换hash登陆任意账户么

当然,不过如果他已经或得了数据库权限,很可能已经可以获得服务器上的所有信息了。所以没有什么必要去修改hash登陆别人账户。进行密码hash的目的不是保护网站不被入侵,而是如果入侵发生了,可以更好的保护用户的密码。

在SQL注入攻击中,保护hash不被替换的方式使用两个用户不同权限的用户连接数据库。一个具有写权限,另外一个只具有只读的权限。

为什么需要一些特别的算法比如HMAC,而不是直接把密码和加密key拼接在一起

(这部分讲一些密码学的原理,翻译的不好请见谅)

hash函数,比如MD5,SHA1,SHA2使用了Merkle–Damgård construction,这导致算法可能长度扩展攻击(length extension attacks)。意思就是说给定一个hash H(X),攻击者可以在不知道X的情况下,可以找到一个H(pad(X)+Y)的值,Y是个其他的字符串。pad(X)是hash函数使用的填充函数(padding function)。

这就意味者,对于hash H(key + message),攻击者可以计算 H(pad(key + message) + extension),并不需要知道加密key。如果这个hash是用在消息认证过程中,使用key为了避免消息被修改。这样的话这个系统就可能失效了,因为攻击者掌握了一个有效的基于 message+extension的hash。

这种攻击对于如何快速破解hash还不是很清楚。但是,基于一些风险的考虑,不建议使用单纯的hash函数进行加密key的hash。也许一个聪明的密码学家一天就可以找到使用这种攻击快速破解hash的方法。所以记得使用HMAC。

盐应该拼在密码的前面还是后面

这个不重要。选择一个并且保持风格一致就行了。实际中,把盐放在前面更常见一点。

原文地址:http://drops.wooyun.org/papers/1066



',118,'ARTICLE',0,'2016-05-09 13:24:44','web',NULL,1,'技术文档',0,0,0,''),('b9af8a1c-31b6-4c2c-afb6-255555f2d5ad','Redis缓存技术&分布式锁','随着网站访问量不断增加,数据库将无法承担数据访问压力,除了常用的数据库主从分离,分表分库技术\n缓存技术的使用能带来显著的效果','

1 什么是redis 

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。


2 性能怎么样

Redis是一个高性能的key-value内存数据库。官方性能测试结果:
set操作每秒110000次,get操作每秒81000次。


3 可不可以存对象

和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作。

 

4 Redis优势

异常快速:Redis的速度非常快,每秒能执行约11万集合,每秒约81000+条记录。

支持丰富的数据类型:Redis支持最大多数开发人员已经知道像列表,集合,有序集合,散列数据类型。这使得它非常容易解决各种各样的问题,因为我们知道哪些问题是可以处理通过它的数据类型更好。

操作都是原子性:所有Redis操作是原子的,这保证了如果两个客户端同时访问的Redis服务器将获得更新后的值。

多功能实用工具:Redis是一个多实用的工具,可以在多个用例如缓存,消息,队列使用(Redis原生支持发布/订阅),任何短暂的数据,应用程序,如Web应用程序会话,网页命中计数等。


5 java并发分布式锁


Redis有一系列的命令,特点是以NX结尾,NX是Not eXists的缩写,如SETNX命令就应该理解为:SET if Not eXists。这系列的命令非常有用,这里讲使用SETNX来实现分布式锁。 

用SETNX实现分布式锁 
利用SETNX非常简单地实现分布式锁。例如:某客户端要获得一个名字foo的锁,客户端使用下面的命令进行获取: 
SETNX lock.foo <current Unix time + lock timeout + 1> 
    - 如返回1,则该客户端获得锁,把lock.foo的键值设置为时间值表示该键已被锁定,该客户端最后可以通过DEL lock.foo来释放该锁。
    - 如返回0,表明该锁已被其他客户端取得,这时我们可以先返回或进行重试等对方完成或等待锁超时。


解决死锁 
上面的锁定逻辑有一个问题:如果一个持有锁的客户端失败或崩溃了不能释放锁,该怎么解决?我们可以通过锁的键对应的时间戳来判断这种情况是否发生了,如果当前的时间已经大于lock.foo的值,说明该锁已失效,可以被重新使用。 

发生这种情况时,可不能简单的通过DEL来删除锁,然后再SETNX一次,当多个客户端检测到锁超时后都会尝试去释放它,这里就可能出现一个竞态条件,让我们模拟一下这个场景: 

C0操作超时了,但它还持有着锁,C1和C2读取lock.foo检查时间戳,先后发现超时了。 
C1 发送DEL lock.foo 
C1 发送SETNX lock.foo 并且成功了。 
C2 发送DEL lock.foo 
C2 发送SETNX lock.foo 并且成功了。 
这样一来,C1,C2都拿到了锁!问题大了! 

幸好这种问题是可以避免的,让我们来看看C3这个客户端是怎样做的: 

C3发送SETNX lock.foo 想要获得锁,由于C0还持有锁,所以Redis返回给C3一个0 
C3发送GET lock.foo 以检查锁是否超时了,如果没超时,则等待或重试。 
反之,如果已超时,C3通过下面的操作来尝试获得锁: 
GETSET lock.foo <current Unix time + lock timeout + 1> 
通过GETSET,C3拿到的时间戳如果仍然是超时的,那就说明,C3如愿以偿拿到锁了。 
如果在C3之前,有个叫C4的客户端比C3快一步执行了上面的操作,那么C3拿到的时间戳是个未超时的值,这时,C3没有如期获得锁,需要再次等待或重试。留意一下,尽管C3没拿到锁,但它改写了C4设置的锁的超时值,不过这一点非常微小的误差带来的影响可以忽略不计。 

注意:为了让分布式锁的算法更稳键些,持有锁的客户端在解锁之前应该再检查一次自己的锁是否已经超时,再去做DEL操作,因为可能客户端因为某个耗时的操作而挂起,操作完的时候锁因为超时已经被别人获得,这时就不必解锁了。 

示例伪代码 
根据上面的代码,我写了一小段Fake代码来描述使用分布式锁的全过程: 
# get lock 
lock = 0 
while lock != 1: 
    timestamp = current Unix time + lock timeout + 1 
    lock = SETNX lock.foo timestamp 
    if lock == 1 or (now() > (GET lock.foo) and now() > (GETSET lock.foo timestamp)): 
        break; 
    else: 
        sleep(10ms) 

# do your job 
do_job() 

# release 
if now() < GET lock.foo: 
    DEL lock.foo 
是的,要想这段逻辑可以重用,使用python的你马上就想到了Decorator,而用Java的你是不是也想到了那谁?AOP + annotation?行,怎样舒服怎样用吧,别重复代码就行。 

java之jedis实现 
expireMsecs 锁持有超时,防止线程在入锁以后,无限的执行下去,让锁无法释放 
timeoutMsecs 锁等待超时,防止线程饥饿,永远没有入锁执行代码的机会 

Java代码  \"收藏代码\"
  1. /** 
  2.  * Acquire lock. 
  3.  *  
  4.  * @param jedis 
  5.  * @return true if lock is acquired, false acquire timeouted 
  6.  * @throws InterruptedException 
  7.  *             in case of thread interruption 
  8.  */  
  9. public synchronized boolean acquire(Jedis jedis) throws InterruptedException {  
  10.     int timeout = timeoutMsecs;  
  11.     while (timeout >= 0) {  
  12.         long expires = System.currentTimeMillis() + expireMsecs + 1;  
  13.         String expiresStr = String.valueOf(expires); //锁到期时间  
  14.   
  15.         if (jedis.setnx(lockKey, expiresStr) == 1) {  
  16.             // lock acquired  
  17.             locked = true;  
  18.             return true;  
  19.         }  
  20.   
  21.         String currentValueStr = jedis.get(lockKey); //redis里的时间  
  22.         if (currentValueStr != null && Long.parseLong(currentValueStr) < System.currentTimeMillis()) {  
  23.             //判断是否为空,不为空的情况下,如果被其他线程设置了值,则第二个条件判断是过不去的  
  24.             // lock is expired  
  25.   
  26.             String oldValueStr = jedis.getSet(lockKey, expiresStr);  
  27.             //获取上一个锁到期时间,并设置现在的锁到期时间,  
  28.             //只有一个线程才能获取上一个线上的设置时间,因为jedis.getSet是同步的  
  29.             if (oldValueStr != null && oldValueStr.equals(currentValueStr)) {  
  30.                 //如过这个时候,多个线程恰好都到了这里,但是只有一个线程的设置值和当前值相同,他才有权利获取锁  
  31.                 // lock acquired  
  32.                 locked = true;  
  33.                 return true;  
  34.             }  
  35.         }  
  36.         timeout -= 100;  
  37.         Thread.sleep(100);  
  38.     }  
  39.     return false;  
  40. }  



',52,'ARTICLE',0,'2016-05-02 22:24:59','web',NULL,1,'技术文档',0,0,0,''),('bd3fbc06-ef88-43d3-bf5b-1631c854efcd','项目二次开发环境搭建','CrapApi接口管理系统,是一个基于maven构建的javaweb项目\n文章将以eclipse作为开发工具进行项目搭建介绍\n本开源项目源代码托管于GitHub\n开发环境:jre7及以上、tomcat7及以上\nmysql 5.6及以上','

构建准备:

  1. 下载eclipse开发工具
  2. 安装git插件(用于从github获取源码)
  3. 安装maven插件(本项目是基于maven构建的)
  4. GitHub源码仓库地址:https://github.com/EhsanTang/CrapApi.git
  5. 安装mysql数据库,本项目使用springMVC+hibernate开发,你也可以使用其他数据库(使用其它数据库请修改连接池等信息)
  6. 最高管理员账号:admin 123456

开始导入项目:

  1. 安装好插件后关闭eclipse并重新打开
  2. 部署数据库(mysql),数据库脚本地址:https://github.com/EhsanTang/CrapApi/tree/master/api (CrapApi.V1.sql 为基础数据库,后续数据库改动将以 CrapApi_DataBase_Change_xxxx-xx.xx.sql 发布,导入数据库时请按时间循序依次执行sql脚本,CrapApi.V1.sql 最先执行)
  3. 导入项目后修改数据库配置,配置文件见项目目录:CrapApi/api/src/main/resources/jdbc.properties
  4. 导入项目






            5.修改log4j日志文件输入地址:根据开发系统或部署的系统,修改日志文件输出地址(下图为mac日志输出地址)


问题:

1.点击next即可导入项目,导入项目后如果项目报错,请查看文章:http://blog.csdn.net/torrytang/article/details/51072468

2.导入数据库报错:

(1)数据库版本过低:升级mysql数据库 (5.6及以上)

(2)导入的客户端不支持某些语法:删除脚本中无用注解

(3)打开脚本,分步执行脚本,修改报错的脚本语法

3.java.lang.ClassNotFoundException:cn.crap.utils.MyListener

 (1)修改jdk版本(1.7及以上,setting文件),修改web version 版本至2.5 ——其他用户提供的解决方案



',421,'ARTICLE',0,'2016-04-08 09:26:13','web',NULL,1,'帮助文档',1,0,999,''),('c1197771-2588-4950-a766-7fdad27e1340','CrapApi—评论表(comment)','文章等评论','[{\"name\":\"id\",\"type\":\"varchar(50)\",\"notNull\":\"否\",\"def\":\"无\",\"remark\":\"主键\"},{\"name\":\"webpageId\",\"type\":\"varchar(50)\",\"notNull\":\"否\",\"def\":\"无\",\"remark\":\"网站页面ID\"},{\"name\":\"content\",\"type\":\"varchar(200)\",\"notNull\":\"否\",\"def\":\"无\",\"remark\":\"评论类容\"},{\"name\":\"userId\",\"type\":\"varchar(50)\",\"notNull\":\"是\",\"def\":\"无\",\"remark\":\"用户ID(暂时没用)\"},{\"name\":\"parentId\",\"type\":\"varchar(50)\",\"notNull\":\"是\",\"def\":\"无\",\"remark\":\"父评论(暂时没用)\"},{\"name\":\"status\",\"type\":\"tinyint\",\"notNull\":\"否\",\"def\":\"1\",\"remark\":\"状态\"},{\"name\":\"createTime\",\"type\":\"timestamp\",\"notNull\":\"否\",\"def\":\"CURRENT_TIMESTAMP\",\"remark\":\"创建时间\"},{\"name\":\"sequence\",\"type\":\"int\",\"notNull\":\"否\",\"def\":\"0\",\"remark\":\"排序,越大越靠前\"}]',1,'DICTIONARY',0,'2016-06-06 21:00:48','9a483c5b-98cc-45da-9cdf-0d3e4c382e49',NULL,1,'',0,0,0,''),('c6f2c7f8-1aa3-4691-a279-6b42688b1bee','CrapApi—日志记录表(log)','日志记录表:用于记录接口、模块、系统设置等修改记录,用于系统恢复使用','[{\"name\":\"id\",\"type\":\"varchar(50)\",\"notNull\":\"否\",\"def\":\"无\",\"remark\":\"主键\"},{\"name\":\"status\",\"type\":\"tinyint\",\"notNull\":\"否\",\"def\":\"1\",\"remark\":\"状态(暂时没用)\"},{\"name\":\"createTime\",\"type\":\"timestamp\",\"notNull\":\"否\",\"def\":\"CURRENT_TIMESTAMP\",\"remark\":\"创建时间\"},{\"name\":\"sequence\",\"type\":\"int\",\"notNull\":\"否\",\"def\":\"0\",\"remark\":\"排序,越大越靠前\"},{\"name\":\"modelClass\",\"type\":\"varchar(50)\",\"notNull\":\"否\",\"def\":\"无\",\"remark\":\"模型(表对应的class类)\"},{\"name\":\"modelName\",\"type\":\"varchar(50)\",\"notNull\":\"否\",\"def\":\"无\",\"remark\":\"模型显示名称\"},{\"name\":\"type\",\"type\":\"varchar(20)\",\"notNull\":\"否\",\"def\":\"无\",\"remark\":\"类型:修改、删除\"},{\"name\":\"updateBy\",\"type\":\"varchar(50)\",\"notNull\":\"否\",\"def\":\"无\",\"remark\":\"更新人\"},{\"name\":\"remark\",\"type\":\"varchar(100)\",\"notNull\":\"否\",\"def\":\"无\",\"remark\":\"备注\"},{\"name\":\"content\",\"type\":\"text\",\"notNull\":\"否\",\"def\":\"无\",\"remark\":\"数据修改前的json串\"}]',2,'DICTIONARY',0,'2016-06-06 20:56:42','9a483c5b-98cc-45da-9cdf-0d3e4c382e49',NULL,1,'',0,0,2,''),('c81d6b32-1c77-4c5d-ba85-a941201aac3d','CrapApi—搜索设计','CrapApi Lucene搜索设计,默认采用数据库搜索,当开启Lucene搜索后则使用Lucene搜索','

CrapApi搜索采用面向接口的设计模式,任何搜索方式只要实现 ISearchService 接口即可。

ISearchService接口中的抽象方法:

/**
* 根据关键词、分页信息查询
* @param keyword
* @param page
* @return
*/
List search(String keyword, Page page);

/**
* 删除索引文件
* @param searchDto
* @return
*/
boolean delete(SearchDto searchDto);

/**
* 更新索引文件
* @param searchDto
* @return
*/
boolean update(SearchDto searchDto);

/**
* 添加索引文件
* @param searchDto
* @return
*/
boolean add(SearchDto searchDto);

SearchDto 为搜索的业务类,任何需要纳入搜索范围的数据只要将对象转换为SearchDto即可调用搜索接口实现添加、删除、修改索引:

public class SearchDto {

 private String id;// 主键,不参与分词搜索

 private String title;

 private String type;// 接口,文章等,不参与分词

 private String url;// 相对路径:web.do#/webInterfaceDetail,不参与分词搜索

 private String content;// 参与搜索的类容:简介、备注、参数等的组合 或 搜索到的结果(高亮显示)

 private String version;// 不参与分词搜索

 private String modelName;

 private String createTime;// 时间,不参与分词搜索
 ...

}

CrapApi 系统默认已经实现了LuceneSearchService:

@Service("dataBaseSearch")
public class LuceneSearchService implements ISearchService{
@Autowired
private IInterfaceService interfaceService;
...
}

如需使用其他搜索方法(如Lucene)替换默认数据库搜索,只需要创建一个搜索类实现ISearchService接口,然后修改IndexController注解中的name即可。

@Resource(name="luceneSearch")
 private ISearchService searchServer;

需要实现的搜索的类,只需要在添加、修改、删除接口中将对象转换为SearchDto,然后调用ISearchService中对应的添加、修改、删除接口即可。


',5,'ARTICLE',0,'2016-06-07 03:40:44','web',NULL,1,'帮助文档',0,0,0,''),('caf57cfe-7e88-4eba-9972-8b5734ae5a51','CrapApi-模块表(module)','CrapApi模块表:一级模块为项目,模块可以无限级嵌套','[{\"name\":\"id\",\"type\":\"varchar(50)\",\"notNull\":\"否\",\"def\":\"无\",\"remark\":\"主键\"},{\"name\":\"moduleName\",\"type\":\"varchar(100)\",\"notNull\":\"否\",\"def\":\"无\",\"remark\":\"模块名\"},{\"name\":\"parentId\",\"type\":\"varchar(50)\",\"notNull\":\"是\",\"def\":\"无\",\"remark\":\"父模块\"},{\"name\":\"createTime\",\"type\":\"timestamp\",\"notNull\":\"否\",\"def\":\"CURRENT_TIMESTAMP\",\"remark\":\"创建时间\"},{\"name\":\"status\",\"type\":\"tinyint\",\"notNull\":\"否\",\"def\":\"1\",\"remark\":\"状态(暂时没用)\"},{\"name\":\"password\",\"type\":\"varchar(20)\",\"notNull\":\"是\",\"def\":\"无\",\"remark\":\"密码:有密码则该模块下接口、数据字典、子模块均需要输入密码才能访问\"},{\"name\":\"sequence\",\"type\":\"int\",\"notNull\":\"否\",\"def\":\"0\",\"remark\":\"排序\"}]',4,'DICTIONARY',0,'2016-06-06 20:35:14','9a483c5b-98cc-45da-9cdf-0d3e4c382e49',NULL,1,'',0,0,2,''),('d3d671f7-bf7d-4168-b3b1-ffa353dc4fc3','Redis分布式缓存设计与实现','原创文章,转载请注明出处','
概述

随着系统负载原来越大,单台reids已无法满足系统负载、安全等要求。本设计目标在于加大Redis服务吞吐量,支持动态扩展reids集群,支持自定义每台reids服务器负载、支持宕机请求自动转移。


1. 集群配置

集群通过xml文件配置,在系统初始化时,根据配置的集群数量动态生成对应大小的redis连接池数组pools[n]。根据配置顺序,第一个服务器对应的连接池为pools[0]

注意:pools[0]为默认连接池,如自增计数器等可指定存储至0号机器。

 <redisPoolConfig>

        <!-- 0台:存储购物车等不能清空的数据,不参加散列 -->

      <redis>

           <redisIp>xx.xx.xx.xxx</redisIp>

           <redisPort>6379</redisPort>

      </redis>

      <!-- 1台:mget等批量获取,不能分散存储的数据,不参加散列 -->

      <redis>

           <redisIp> xx.xx.xx.xxx</redisIp>

           <redisPort>6379</redisPort>

      </redis>

      <!-- 散列存储数据机器 2台至n-->

      <redis>

           <redisIp> xx.xx.xx.xxx</redisIp>

           <redisPort>6379</redisPort>

      </redis>

      <redis>

           <redisIp> xx.xx.xx.xxx</redisIp>

           <redisPort>6379</redisPort>

      </redis>

      </redisPoolConfig>


2.负载均衡配置

由于各机器性能等不一致,因此需要支持根据机器性能配置redis服务器负载,1<index<redis服务器数量(第0台存储购物车等不能清空的数据,第一台存储不能分散存储的数据,第0台、第1台不参与散列)。配置如下:

<redisPoolLoad>

        <!-- index=n 表示映射至 redisPoolConfig中第n-1个服务器,1<n<redis数量(第0,1台不参与散列) -->

      <redis index="2"></redis>

      <redis index="3"></redis>

      <redis index="2"></redis>

      <redis index="3"></redis>

      <redis index="2"></redis>

      <redis index="3"></redis>

      <redis index="2"></redis>

      <redis index="3"></redis>

      <redis index="2"></redis>

      <redis index="3"></redis>

      <redis index="2"></redis>

      <redis index="3"></redis>

      <redis index="2"></redis>

      <redis index="3"></redis>

      <redis index="2"></redis>

      <redis index="3"></redis>

      </redisPoolLoad>

注意:1<n<reids服务器数量

根据上面的配置文件动态生成一个大小为k的映射数组,mapped[k]kredisLoad中的子节点数)。mapped[3]=1,表示当hashcode=3时(hashcode由待存储数据的主键计算而来,详情见【Redis选择】),对应数据存储至1redis服务器。

 

3.Redis选择

private static Jedis getRedis(String key) {

      int hashcode = Math.abs(key.hashCode()%K);//kredis映射数组mapped的大小

      int redisIndex = mapped[hashcode]; //mappedredis映射数组

      return pool[redisIndex].getResource();

}

注:其它特殊要求的可直接存储至0号默认机器(如:存储的key为二进制,未登录用户的购物车数据,自增计数器)


4.Redis节点宕机处理

当发现有reids宕机时,可将该hashcode+1,映射至其它节点,代码如下: hashcode = Math.abs(  (key.hashCode()+1)   %K);

由于根据hashcode得出的映射为虚拟节点,同一台redis有多个虚拟节点,因此宕机的reids数据可以分散至其它redis服务器,不会出现雪崩情况(mapped虚拟节点越多,redis负载越均衡)


5.特殊数据不参加散列处理

在系统设计中,可能有特殊数据不能随机散列,如:未登录用户购物车数据(该数据不能随意删除)、批量数据(使用mget批量获取的数据)等。

解决方案:不能散列的数据的key以特殊字符串开头,如:redis0_ ,redis1_ 。reids0_开头的数据直接存储在0号机器,不参与散列。


',139,'ARTICLE',0,'2016-05-06 14:46:51','web',NULL,1,'技术文档',0,0,0,''),('df5a3e43-86c1-4a4d-b13c-4bff249c1d35','CrapApi.V2项目结构&数据加载流程','','

项目结构如下图所示:


1.存储数据库连接配置,spring配置,错误码,log4j等配置文件

2.存储网站js、cs、html、img等静态资源

3.存储第三方框架:bootstrap、angularjs等

4.后台相关html页面

5.前端相关html页面

6.后台相关jsp页面

7.后台、前台相关jsp子页面面:被主页面引用

8.前端相关jsp页面


系统主要采用html静态页面,但是由于后台主页、前台主页初始化时需要读取数据库相关配置:css、title、log、角色、权限,因此部分页面采用jsp

后台主页:下图6中的index.jsp

前台主页面:下图8中的index.jsp


前端数据加载流程:


1.第一访问网站:加载前端主页index.jsp ——》通过angularjs异步加载数据——》angularjs将json数据渲染至页面

2.点击超链接——》通过angularjs路由异步加载指定的html页面(局部刷新)——》通过angularjs异步加载数据——》angularjs将json数据渲染至页面


路由文件:下图2/js/router.js 主要负责解析超链接,并加载指定的html子页面,html页面加载后,将根据该页面配置的 ng-controller 调用controllers.js

数据加载:下图2/jscontrollers.js 通过js异步访问后台接口,获取相应的数据

\"\"/

',89,'ARTICLE',0,'2016-05-15 23:17:25','web',NULL,1,'帮助文档',0,0,998,''),('e22fb662-dd63-48d9-8821-92e438fe0634','添加测试表','添加测试表添加测试表添加测试表','[{\"name\":\"test\",\"type\":\"test\",\"notNull\":\"false\",\"def\":\"\",\"remark\":\"测试\"}]',7,'DICTIONARY',0,'2016-08-26 08:41:14','9a483c5b-98cc-45da-9cdf-0d3e4c382e49',NULL,1,'',0,0,10,''),('e254357c-12c2-4799-a64e-d3dc9c829e1c','CrapApi接口版本号','','

前提条件:

1.多个接口同属于一个模块

2.多个接口名相同


相同接口不同版本号前端显示:

\"\"/

\"\"/

',76,'ARTICLE',0,'2016-04-28 19:14:38','web',NULL,1,'帮助文档',0,0,97,''),('e5e1ae40-0088-42bf-82ba-6dc9aef62f4e','添加项目、模块、接口帮助文档','CrapApi支持多个项目,一个项目中支持n个模块,一个模块中支持n个模块或n个接口','

1. 在【项目&模块&接口管理】菜单中,默认显示的为项目列表,在当前页面可以无限制添加项目,以及对项目进行修改。

2. V2版本一个项目中可以有n个模块或n个接口,但模块和接口不能同时存在,即加入项目下已经有模块了,则【添加接口】的按钮将会隐藏,如果项目下已经有接口了,则【添加模块】的按钮将会隐藏。

3. 模块中添加子模块和接口的规则同项目下添加模块和接口一致。


V3版本删除了接口、模块不能同时存在的限制


',118,'ARTICLE',0,'2016-05-15 13:17:54','web',NULL,1,'帮助文档',0,0,99,''),('e91561bb-cc67-4c15-9b55-977439d3fe0b','分布式 RPC 框架','','

RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样。

RPC 可基于 HTTP 或 TCP 协议,Web Service 就是基于 HTTP 协议的 RPC,它具有良好的跨平台性,但其性能却不如基于 TCP 协议的 RPC。会两方面会直接影响 RPC 的性能,一是传输方式,二是序列化。

众所周知,TCP 是传输层协议,HTTP 是应用层协议,而传输层较应用层更加底层,在数据传输方面,越底层越快,因此,在一般情况下,TCP 一定比 HTTP 快。就序列化而言,Java 提供了默认的序列化方式,但在高并发的情况下,这种方式将会带来一些性能上的瓶颈,于是市面上出现了一系列优秀的序列化框架,比如:Protobuf、Kryo、Hessian、Jackson 等,它们可以取代 Java 默认的序列化,从而提供更高效的性能。

为了支持高并发,传统的阻塞式 IO 显然不太合适,因此我们需要异步的 IO,即 NIO。Java 提供了 NIO 的解决方案,Java 7 也提供了更优秀的 NIO.2 支持,用 Java 实现 NIO 并不是遥不可及的事情,只是需要我们熟悉 NIO 的技术细节。

我们需要将服务部署在分布式环境下的不同节点上,通过服务注册的方式,让客户端来自动发现当前可用的服务,并调用这些服务。这需要一种服务注册表(Service Registry)的组件,让它来注册分布式环境下所有的服务地址(包括:主机名与端口号)。

应用、服务、服务注册表之间的关系见下图:

\"系统架构\"/



',58,'ARTICLE',0,'2016-05-03 11:08:20','web',NULL,1,'技术文档',0,0,0,''),('e978ef17-3eae-4864-810a-699d1e39a804','docker 下配置 CrapApi API 文档管理系统','原文地址:https://www.zzzzy.com/201605204048.html','

前段时间,为公司的项目找可以布署的API文档管理系统,但是一直没有找到好用的。后来随便用了一款比较渣的在线文档(个人开发的也就这样了)。再后来,ThinkPHP的公司也上线了在线文档管理平台(看云),还挺不错的,但是免费的私有项目只有一个额度。

最近,发现了一款叫 CrapApi 的 java 文档管理系统,看起来也挺不错的。于是,折腾了下,终于布署成功了(作为一名PHPer,对于布署tomcat、Java环境之类的,真心是难搞)。接着,又用docker来尝试搭建一个,也终于折腾成功了。

大家可以参观下:https://doc.ocms.cc

用了 mysql 和 tomcat:7 两个镜像,

应 CrapApi 作者的提议,我就弄了这个教程,让大家可以更方便地搭建 Api 管理平台。

安装流程

1、 新建几个文件夹来存放对应的数据信息:

1
2
mkdir -p /data/tomcat/database #存放mysql 容器生成的 data 文件。为了数据的安全,不建议直接使用容器存放数据
mkdir -p /data/tomcat/webapps #存放项目代码的文件夹

2、 获取 Crapapi 安装包(已编译的文件包)

进入 webapps,执行 curl -O http://filecache.zzzzy.com/CrapApi.V2.zip 解压(unzip)文件夹后,生成带网站源码的文件夹:CrapApi
3、在 /data/tomcat/webapps 下

1) 新建文件 host.xml 存放项目的路径配置信息,内容如下:

1
<Context path="" docBase="/usr/local/tomcat/webapps/CrapApi" debug="0" reloadable="false" crossContext="true"/>

2) 新建 host.sh 向 server.xml 追加 host 及代替tomcat自带启动的命令行:

1
2
sed -i \'/autoDeploy/r /usr/local/tomcat/webapps/host.xml\' /usr/local/tomcat/conf/server.xml
/usr/local/tomcat/bin/catalina.sh run

4、编辑 /data/tomcat/webapps/CrapApi/WEB-INF/classes/jdbc.properties 数据库信息,内容如下:

1
2
3
4
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://mysql:3306/api?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=YOUR_SET_PASSWORD

——
以上为准备工作,配置完成后按下面方式处理

首发于:https://www.zzzzy.com/201605204048.html
1、从 hub.docker.com pull两个镜像:mysql 和 tomcat7.0

1
2
docker pull mysql
docker pull tomcat:7.0

2、安装 MySQL 容器:

1
2
3
4
docker run -d --name crap-mysql \\
-v /data/tomcat/database:/var/lib/mysql \\
-e MYSQL_ROOT_PASSWORD=YOUR_SET_PASSWORD \\
mysql

3、 进入/data/tomcat/database [要先创建MySQL容器后,才可以把数据fetch下来]

1
2
3
4
5
  1.下载 CrapApi 数据库(方式1)(下载官方提供的)
curl -O http://filecache.zzzzy.com/1463672696_CrapApi.sql.tar.gz
解压得到一系列的.sql文件
  2.下载 CrapApi 数据库(方式2)(下载我将上述数据整合好的)
curl -o crapapi.v2.sql http://filecache.zzzzy.com/1463708106_crapapi.v2.sql

4、 进入MySQL容器:

1
2
3
4
5
6
7
8
9
10
docker exec -it crap-mysql /bin/bash
 
1) 进入 /var/lib/mysql
2) 连接数据库
mysql -uroot -pYOUR_SET_PASSWORD
3) 创建数据库,并导入数据
create database api;
use api;
方式1:首先要先导CrapApi.V1.sql,再按日期从旧到新导入其它的数据库
方式2:直接导入方式2下载的整个包: source crapapi.v2.sql

5、执行安装 tomcat 容器:

1
2
3
4
5
6
7
docker run -d \\
--name crap-tomcat \\
-p 32001:8080 \\
-v /data/tomcat/webapps:/usr/local/tomcat/webapps \\
--link crap-mysql:mysql \\
tomcat:7.0 \\
/bin/bash /usr/local/tomcat/webapps/host.sh

注意事项:
1.YOUR_SET_PASSWORD 为你自己将要设置的MySQL密码
2.第5步安装tomcat容器时,指定端口是为了重启时,端口不会变换
3.可以再配合nginx,反代容器的端口,并绑定域名。若如此,建议安装tomcat时指定内网才可以访问容器的端口-p 127.0.0.1:32001:8080

原文地址:https://www.zzzzy.com/201605204048.html





',55,'ARTICLE',0,'2016-05-18 11:00:15','web',NULL,1,'帮助文档',0,0,0,''),('f0229c53-1580-4b74-be0c-365b1fd4966d','中文乱码问题','','


',71,'ARTICLE',0,'2016-04-20 15:35:37','web',NULL,1,'帮助文档',0,0,95,''),('f6ab9a9a-b47a-462c-b344-d32dc75c90eb','多线程并发——重排序','重排序是指编译器和处理器为了优化程序性能而对指令顺序进行重新排序的一种手段','

数据依赖性

如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。数据依赖分下列三种类型:

名称代码示例说明
写后读a = 1;b = a;写一个变量之后,再读这个位置。
写后写a = 1;a = 2;写一个变量之后,再写这个变量。
读后写a = b;b = 1;读一个变量之后,再写这个变量。

上面三种情况,只要重排序两个操作的执行顺序,程序的执行结果将会被改变。

前面提到过,编译器和处理器可能会对操作做重排序。编译器和处理器在重排序时,会遵守数据依赖性,编译器和处理器不会改变存在数据依赖关系的两个操作的执行顺序。

注意,这里所说的数据依赖性仅针对单个处理器中执行的指令序列和单个线程中执行的操作,不同处理器之间和不同线程之间的数据依赖性不被编译器和处理器考虑。

as-if-serial语义

as-if-serial语义的意思指:不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不能被改变。编译器,runtime 和处理器都必须遵守as-if-serial语义。

为了遵守as-if-serial语义,编译器和处理器不会对存在数据依赖关系的操作做重排序,因为这种重排序会改变执行结果。但是,如果操作之间不存在数据依赖关系,这些操作可能被编译器和处理器重排序。为了具体说明,请看下面计算圆面积的代码示例:

double pi  = 3.14;    //A
double r = 1.0; //B
double area = pi * r * r; //C

上面三个操作的数据依赖关系如下图所示:

\"\"/

如上图所示,A和C之间存在数据依赖关系,同时B和C之间也存在数据依赖关系。因此在最终执行的指令序列中,C不能被重排序到A和B的前面(C排到A和B的前面,程序的结果将会被改变)。但A和B之间没有数据依赖关系,编译器和处理器可以重排序A和B之间的执行顺序。下图是该程序的两种执行顺序:

\"\"/

as-if-serial语义把单线程程序保护了起来,遵守as-if-serial语义的编译器,runtime 和处理器共同为编写单线程程序的程序员创建了一个幻觉:单线程程序是按程序的顺序来执行的。as-if-serial语义使单线程程序员无需担心重排序会干扰他们,也无需担心内存可见性问题。

程序顺序规则

根据happens- before的程序顺序规则,上面计算圆的面积的示例代码存在三个happens- before关系:

  1. A happens- before B;
  2. B happens- before C;
  3. A happens- before C;

这里的第3个happens- before关系,是根据happens- before的传递性推导出来的。

这里A happens- before B,但实际执行时B却可以排在A之前执行(看上面的重排序后的执行顺序)。在第一章提到过,如果A happens- before B,JMM并不要求A一定要在B之前执行。JMM仅仅要求前一个操作(执行的结果)对后一个操作可见,且前一个操作按顺序排在第二个操作之前。这里操作A的执行结果不需要对操作B可见;而且重排序操作A和操作B后的执行结果,与操作A和操作B按happens- before顺序执行的结果一致。在这种情况下,JMM会认为这种重排序并不非法(not illegal),JMM允许这种重排序。

在计算机中,软件技术和硬件技术有一个共同的目标:在不改变程序执行结果的前提下,尽可能的开发并行度。编译器和处理器遵从这一目标,从happens- before的定义我们可以看出,JMM同样遵从这一目标。

重排序对多线程的影响

现在让我们来看看,重排序是否会改变多线程程序的执行结果。请看下面的示例代码:

class ReorderExample {
int a = 0;
boolean flag = false;

public void writer() {
    a = 1; //1
    flag = true; //2
}

Public void reader() {
    if (flag) { //3
        int i = a * a; //4
        ……
    }
}
}

flag变量是个标记,用来标识变量a是否已被写入。这里假设有两个线程A和B,A首先执行writer()方法,随后B线程接着执行reader()方法。线程B在执行操作4时,能否看到线程A在操作1对共享变量a的写入?

答案是:不一定能看到。

由于操作1和操作2没有数据依赖关系,编译器和处理器可以对这两个操作重排序;同样,操作3和操作4没有数据依赖关系,编译器和处理器也可以对这两个操作重排序。让我们先来看看,当操作1和操作2重排序时,可能会产生什么效果?请看下面的程序执行时序图:

\"\"/

如上图所示,操作1和操作2做了重排序。程序执行时,线程A首先写标记变量flag,随后线程B读这个变量。由于条件判断为真,线程B将读取变量a。此时,变量a还根本没有被线程A写入,在这里多线程程序的语义被重排序破坏了!

※注:本文统一用红色的虚箭线表示错误的读操作,用绿色的虚箭线表示正确的读操作。

下面再让我们看看,当操作3和操作4重排序时会产生什么效果(借助这个重排序,可以顺便说明控制依赖性)。下面是操作3和操作4重排序后,程序的执行时序图:

\"\"/

在程序中,操作3和操作4存在控制依赖关系。当代码中存在控制依赖性时,会影响指令序列执行的并行度。为此,编译器和处理器会采用猜测(Speculation)执行来克服控制相关性对并行度的影响。以处理器的猜测执行为例,执行线程B的处理器可以提前读取并计算a*a,然后把计算结果临时保存到一个名为重排序缓冲(reorder buffer ROB)的硬件缓存中。当接下来操作3的条件判断为真时,就把该计算结果写入变量i中。

从图中我们可以看出,猜测执行实质上对操作3和4做了重排序。重排序在这里破坏了多线程程序的语义!

在单线程程序中,对存在控制依赖的操作重排序,不会改变执行结果(这也是as-if-serial语义允许对存在控制依赖的操作做重排序的原因);但在多线程程序中,对存在控制依赖的操作重排序,可能会改变程序的执行结果。



',4,'ARTICLE',0,'2016-06-06 19:54:13','web',NULL,1,'技术文档',0,0,10,''); +/*!40000 ALTER TABLE `article` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `comment` +-- + +DROP TABLE IF EXISTS `comment`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `comment` ( + `id` varchar(50) NOT NULL, + `articleId` varchar(50) NOT NULL, + `content` varchar(200) NOT NULL, + `userId` varchar(50) DEFAULT NULL, + `parentId` varchar(50) DEFAULT NULL, + `status` tinyint(4) NOT NULL DEFAULT '1', + `createTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `sequence` int(11) NOT NULL DEFAULT '0' COMMENT '排序,越大越靠前', + `reply` varchar(200) NOT NULL DEFAULT '', + `updateTime` timestamp NOT NULL DEFAULT '2015-12-31 01:40:00', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `comment` +-- + +LOCK TABLES `comment` WRITE; +/*!40000 ALTER TABLE `comment` DISABLE KEYS */; +INSERT INTO `comment` VALUES ('03c72a44-984e-4fed-95e8-aad4cbb4dc5e','02c16933-2823-458d-83a0-6d5b8b752a25','接口那个入参和出参能否支持对象','','',0,'2016-06-01 11:02:11',0,'','2015-12-31 01:40:00'),('0cd6b002-b1c1-427d-8f61-672229cd0fbf','63864a72-ab64-4350-a3d7-d25d5bfc88bf','挺不错的','','',0,'2016-04-18 23:38:35',0,'','2015-12-31 01:40:00'),('0dbecb02-3b83-412a-92da-cb124ba30994','bd3fbc06-ef88-43d3-bf5b-1631c854efcd','赞一个!','','',0,'2016-04-15 23:14:44',0,'','2015-12-31 01:40:00'),('1d1dd678-a117-4597-a4bb-691fc591c36c','02c16933-2823-458d-83a0-6d5b8b752a25','改成php的','','',0,'2016-05-10 11:17:50',0,'','2015-12-31 01:40:00'),('1fcbd422-e855-43c2-880d-1e7044f2011d','02c16933-2823-458d-83a0-6d5b8b752a25','多文本编辑器支持:MarkDown,UEditor 等','','',0,'2016-05-18 11:47:47',0,'','2015-12-31 01:40:00'),('23e7b950-171e-44b8-81e4-e4f52bf5323f','63864a72-ab64-4350-a3d7-d25d5bfc88bf','貌似很不错的样子','','',0,'2016-06-05 15:55:53',0,'','2015-12-31 01:40:00'),('277607bb-2c5a-4366-8706-bd044f9f1408','02c16933-2823-458d-83a0-6d5b8b752a25','@作者你好\n能不能搞一个,把页面上字体抽出来,搞个列表,弄成可配置的字体,个人觉得字体可以在优化一下,或者每个人自己配自己,这样会更美~','','',0,'2016-06-06 14:50:45',0,'','2015-12-31 01:40:00'),('2a981a91-69ba-4b67-87e6-fe0e1c3d97d4','02c16933-2823-458d-83a0-6d5b8b752a25','请求方式添加put和delete等','','',0,'2016-05-16 23:09:13',0,'','2015-12-31 01:40:00'),('2c987a66-3674-4110-b17d-fe42a6dbffe8','02c16933-2823-458d-83a0-6d5b8b752a25','为什么下载下来的压缩包没法看啊,我想问这个主界面是哪个html','','',0,'2016-05-07 17:09:08',0,'','2015-12-31 01:40:00'),('33d38c63-29df-4338-807d-4be61c252210','02c16933-2823-458d-83a0-6d5b8b752a25','就是把选定的模块或接口移动到某个模块下面','','',0,'2016-06-06 11:35:45',0,'','2015-12-31 01:40:00'),('383df8f8-9f70-402b-9edb-27655502593b','9385500e-5dc2-4433-8a4b-47158620ef36','棒棒绑','','',0,'2016-05-03 09:32:11',0,'','2015-12-31 01:40:00'),('49046053-a976-4707-b0ab-99604350ba2e','02c16933-2823-458d-83a0-6d5b8b752a25','似乎没有在线调试功能','','',0,'2016-05-01 17:33:48',0,'','2015-12-31 01:40:00'),('64d24c94-0c4c-4425-b083-fda096f96ea9','02c16933-2823-458d-83a0-6d5b8b752a25','不错!','','',0,'2016-05-07 09:16:44',0,'','2015-12-31 01:40:00'),('70516d1e-8aa8-4b4b-8e9a-3bb982a5831c','02c16933-2823-458d-83a0-6d5b8b752a25','管理员密码添加邮件找回','','',0,'2016-05-16 20:21:45',0,'','2015-12-31 01:40:00'),('7348e87e-2790-498b-bc65-32606620e0ff','02c16933-2823-458d-83a0-6d5b8b752a25','你好牛牛~,目前下来都挺好,小BUG哈,数据字典编辑项目的时候,字段内容都不在了。。。又得重新添加一遍。。。浏览器:firefox,@window23@126.com','','',0,'2016-05-16 11:20:24',0,'','2015-12-31 01:40:00'),('785f803c-3a99-4d8a-a97d-00a5ee23cc5d','02c16933-2823-458d-83a0-6d5b8b752a25','添加接口版本功能,方便以后管理同一接口和查看这个接口的历史版本','','',0,'2016-04-24 17:41:25',0,'','2015-12-31 01:40:00'),('866a5ca9-193a-457e-92fb-f0dcd7ee5460','02c16933-2823-458d-83a0-6d5b8b752a25','有mybatis版本吗 为什么不用mybatis呢?','','',0,'2016-06-01 16:02:55',0,'','2015-12-31 01:40:00'),('8f922251-e2e9-4383-97e1-62fbd1970439','02c16933-2823-458d-83a0-6d5b8b752a25','但是如果F12把页面调试打开,再点击注销,是可以正常完成注销流程的,感觉比较奇怪,暂未找到原因。','','',0,'2016-05-29 14:09:09',0,'','2015-12-31 01:40:00'),('910a9dc8-026e-46f6-8bee-9ff50b76e812','02c16933-2823-458d-83a0-6d5b8b752a25','你好,一个小问题,用户登录以后,点击注销,session没有被清除,用户名还在页面上,显示登录状态,但点击注销已无反应,需要刷新页面,才能完成注销刷新。','','',0,'2016-05-29 14:07:02',0,'','2015-12-31 01:40:00'),('95030ef4-a8ef-4f4a-aeda-7d6a63e91842','d3d671f7-bf7d-4168-b3b1-ffa353dc4fc3','不错。','','',0,'2016-05-16 10:21:06',0,'','2015-12-31 01:40:00'),('97595764-6b73-43de-b8e9-670f1b4c428a','02c16933-2823-458d-83a0-6d5b8b752a25','如果能够api或者文档有历史记录和恢复到某一版本就最好了','','',0,'2016-06-04 22:43:39',0,'','2015-12-31 01:40:00'),('a721b7d2-a301-42f6-985d-f833e4623d7a','02c16933-2823-458d-83a0-6d5b8b752a25','超级管理员登录后台修改颜色等配置后,没有返回按钮,返回前一页,只能通过点击系统设置返回到上个页面。\n希望增加返回按钮。','','',0,'2016-06-06 14:27:23',0,'','2015-12-31 01:40:00'),('a975a3ac-ee8b-4727-ac2d-6fe7d062fe2b','63864a72-ab64-4350-a3d7-d25d5bfc88bf','不错','','',0,'2016-05-25 09:40:27',0,'','2015-12-31 01:40:00'),('aa9d75cc-89c8-4949-bb42-167198634263','02c16933-2823-458d-83a0-6d5b8b752a25','类似淘宝RAP的mockjs的功能','','',0,'2016-05-23 11:05:33',0,'','2015-12-31 01:40:00'),('aab52b59-9df5-4821-abcc-15177a89ac45','02c16933-2823-458d-83a0-6d5b8b752a25','api 搜索功能不能用,搜索会报错','','',0,'2016-05-15 15:57:32',0,'','2015-12-31 01:40:00'),('b142bd01-1c77-487b-bd16-edf979b8b31d','02c16933-2823-458d-83a0-6d5b8b752a25','1.在接口列表的地方可以添加升序降序,这样以后同一个类型的接口在后面添加的可以调整到这个类型后面','','',0,'2016-04-24 17:40:22',0,'','2015-12-31 01:40:00'),('b288cf57-c9bf-46a5-9266-8a931149964d','02c16933-2823-458d-83a0-6d5b8b752a25','1.pdf导出有问题,无法详细显示接口的内容\n2.整个项目的权限控制架构比较混乱,我已经无法分清楚前端和后台菜单了,建议对功能权限做个整理,用户登录拥有角色权限,角色控制菜单,菜单控制访问\n3.挺不错的项目,希望能做得更加强大','','',0,'2016-06-01 15:32:41',0,'','2015-12-31 01:40:00'),('c4667deb-1a03-4d26-a8fa-7875ef482533','02c16933-2823-458d-83a0-6d5b8b752a25','建议给个详细部署文档,还有就是二次开发的编译环境。\n这样能很快部署了 。\n很好的项目,不希望一开始部署就困难重重就没兴趣了。','','',0,'2016-05-10 12:46:14',0,'','2015-12-31 01:40:00'),('c85b8b31-9c90-47bb-8335-df8f2f810b51','bd3fbc06-ef88-43d3-bf5b-1631c854efcd','nb!','','',0,'2016-05-03 19:35:03',0,'','2015-12-31 01:40:00'),('ce8771bc-f1bd-4f71-86ae-f71e4530eb97','02c16933-2823-458d-83a0-6d5b8b752a25','建议module和interface表加上order字段,初始值设置为其自增id, 可交换order进行排序,关于排序的想法. khahux@gmail.com','','',0,'2016-04-24 17:42:43',0,'','2015-12-31 01:40:00'),('cfffae60-3ade-4db1-bad3-cf97c7d7fc63','b9af8a1c-31b6-4c2c-afb6-255555f2d5ad','很好的东东','','',0,'2016-05-18 18:00:31',0,'','2015-12-31 01:40:00'),('d4214ec6-e7fb-40a6-b4d9-e30df76b2331','e91561bb-cc67-4c15-9b55-977439d3fe0b','RPC普及不错,有基于NIO的简单实现更完美。','','',0,'2016-05-04 18:02:00',0,'','2015-12-31 01:40:00'),('d5d94038-0c55-438a-b7ab-2c0fffde6b07','02c16933-2823-458d-83a0-6d5b8b752a25','接口地址添加前缀:如http://api.crap.cn 不然修改域名后所有接口都需要改动','','',0,'2016-05-16 14:18:03',0,'','2015-12-31 01:40:00'),('e11061b8-80ec-424b-a611-0e67837c0436','02c16933-2823-458d-83a0-6d5b8b752a25','希望该项目提供对oracle数据库支持','','',0,'2016-04-27 11:02:57',0,'','2015-12-31 01:40:00'),('e9b4e206-4518-4363-9f2b-71c537f9d6b0','02c16933-2823-458d-83a0-6d5b8b752a25','建议添加lucene全文检索,在线调试','','',0,'2016-05-16 23:23:52',0,'','2015-12-31 01:40:00'),('ed30a3aa-3bec-4c55-914d-fceff2acc5de','02c16933-2823-458d-83a0-6d5b8b752a25','文章能否增加标题搜索','','',0,'2016-06-01 11:03:26',0,'','2015-12-31 01:40:00'),('f0e2b158-b9f8-4603-8df8-798370912f4e','02c16933-2823-458d-83a0-6d5b8b752a25','@ALL 感谢各位提出的问题,一下问题已经修复:搜索报错已经修复、部署文档已经完善、项目结构已经提供帮助文档、版本管理已经添加、排序功能以及添加、系统已经在firefox、chrome、ie9及以上、Safari等主流浏览器上经过测试、图片验证码在centos系统jdk1.8中报错','','',0,'2016-05-15 23:27:41',0,'','2015-12-31 01:40:00'),('f7b7f345-ba27-4d27-b7c6-bb97100061a7','02c16933-2823-458d-83a0-6d5b8b752a25','文章管理类目category字段是不是偷懒了啊,我看了好久在哪里录入,最后才发现居然使用的select distinct category from WebPage','','',0,'2016-06-01 16:33:13',0,'','2015-12-31 01:40:00'),('fa900aa8-f6ee-4dcd-80d8-df6e5809822b','02c16933-2823-458d-83a0-6d5b8b752a25','确实不错','','',0,'2016-05-14 18:06:27',0,'','2015-12-31 01:40:00'),('fd76f1eb-a3e2-4ff8-9b13-d5938749d7e0','02c16933-2823-458d-83a0-6d5b8b752a25','能否能让用户自己修改密码','','',0,'2016-06-01 11:00:32',0,'','2015-12-31 01:40:00'); +/*!40000 ALTER TABLE `comment` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `error` +-- + +DROP TABLE IF EXISTS `error`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `error` ( + `id` varchar(50) NOT NULL COMMENT '主键', + `errorCode` varchar(50) NOT NULL COMMENT '错误码编码', + `errorMsg` varchar(128) NOT NULL COMMENT '错误码描述', + `moduleId` varchar(50) NOT NULL, + `createTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态', + `sequence` int(11) NOT NULL DEFAULT '0' COMMENT '排序,越大越靠前', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `error` +-- + +LOCK TABLES `error` WRITE; +/*!40000 ALTER TABLE `error` DISABLE KEYS */; +INSERT INTO `error` VALUES ('0008a40d-b79c-4579-a9f9-f0a04dba1403','205013','获取收获地址出错','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('00743df0-a358-4dd1-8856-dbdeb1f78633','281007','红包不存在','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('00932ac3-1b4d-4b27-8a54-46ae2c907ab5','210001','确认收货已超过15天,不能发起售后','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('0173ac20-bb4d-4704-8a85-1077dc9b84d0','000007','活动尚未开始,申请失败!','62bde6e0-988b-475f-bfdf-76203455ec57','2016-03-30 12:14:20',1,0),('0185f80b-a467-49c3-bd96-27c6797be0f4','220001','F码无效,请核对后重新输入','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('02107ca6-f855-490c-85f2-94e1cbdf17a3','208109','验证码错误','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('0a5f7843-cbc1-4ca6-85ae-b47bf1d4bc4d','208121','不是有效的手机号','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('0a826872-7e77-4ed5-afc2-c1ddf6b44272','240007','体验码已作废','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('0b4e412f-e09f-4bd8-8738-be79aa089f74','205014','保存订单异常','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('17a69314-a708-45de-88d4-2ee6b345860a','212008','订单不属于指定的商家','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('18d18226-43eb-47d6-98e3-b773dd32ed8b','220002','F码已失效','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('193625e6-a881-4152-b659-fc08193b8ffa','212002','订单不存在。','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('1a040af7-8474-4fe1-8703-8594ad69a44e','208123','输入的手机号为空','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('1d9a8ff9-9e3c-4ceb-a7b6-f21b2deca21b','0000686','测试','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-05-21 14:58:56',0,0),('1de575fb-706b-4b9f-95c8-f6c77865e6dd','210002','所有商品都已退货,不能再发起退货','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('1e01a3dd-1711-44ab-8481-3f15c57cdcde','000012','抱歉,您所选择的试用商品已被抢完,去看看其他活动吧~','62bde6e0-988b-475f-bfdf-76203455ec57','2016-03-30 12:14:20',1,0),('1e85c7e3-9ee9-4884-8c4f-061a2ad0e8ad','205004','当前用户操作不合法','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('1f60abf1-698a-4612-acde-021358376175','205006','商家未设置包装信息','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('1f6745e4-3a11-4a7a-8080-4c8d5d457c10','208126','获取用户信息失败','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('2069622d-579e-460e-89c0-dcfaa924fc82','281014','趣分期兑换uid为空','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('249f00da-9465-41e0-97b9-18ac6e9075f6','208106','输入的密码和原密码相同','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('26622971-152d-4b31-9ba3-0710ce8e2850','205007','删除指定商品失败','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('275be2d3-c3a3-4a0e-8abc-9045033913cc','200005','Unsupported http request Method','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('2ce29eaf-f32f-48da-b719-0f85467d9a27','2222','2222','62bde6e0-988b-475f-bfdf-76203455ec57','2016-04-23 09:50:14',0,0),('2d12aef3-99f4-4d21-bf78-25eb0b2ced82','205003','商品添加至购物车失败','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('2ece77ba-acdd-4abe-a159-c7ed2038fe83','281012','趣分期兑换码已使用','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('303e8413-6cfd-4c42-999f-103cbc14d038','205015','未找到待支付的订单','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('3154701e-7edc-42b7-b8ce-79a96b2d84cf','211001','提现税额计算错误。','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('3217a006-ae47-4992-bf0f-7c6e207c35df','123','123','62bde6e0-988b-475f-bfdf-76203455ec57','2016-04-24 16:07:10',0,0),('3380cef1-432e-4d18-a556-c4b4abd7c279','281013','趣分期兑换码无效','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('37af2829-4d38-42ba-bb95-964d5b3aff47','210003','此商品有正在处理中未完成的退货申请','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('39bdddf8-f491-42e1-8c84-3f55ded2a43c','281005','红包使用中','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('416a5375-9dc7-46d6-b8cc-6af4d28ead39','281010','趣分期兑换码长度错误','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('4521bab8-65f0-4e74-9029-e606cc3b3097','210010','使用红包的商品,退款金额与最大可退金额不匹配','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('47f19229-a789-418e-b499-a32a3bf107da','200002','接口参数错误','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('4ab0a03f-ba31-4458-bf95-6e268ae99af0','240005','该体验码只能购买指定商品,请核查后再使用','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('4b5d2c59-b001-439f-9b39-152030637cfd','205009','更新购物车商品包装信息失败','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('4bd6ef55-262e-4e36-8fa7-995200ca8399','208103','该账户名不存在','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('4c56df46-8059-406c-8e07-5730ceca1a9e','210008','退款已完成','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('4e7b9210-c43b-40f3-aac7-f8e25688c38a','1111','1111','b10aca13-1dfe-499f-9259-f8a36d0eb7c6','2016-08-26 10:13:14',0,0),('51857555-c405-4739-ad92-910696ac1d24','208104','您输入的密码和账户名不匹配,请重新输入','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('57b12e4d-4130-4a01-ab35-5ca2d356ecd8','212003','订单状态不是待付款。','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('590db662-1035-4b9c-85c8-5c002e679747','212005','无效的链接。','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('5d232003-0991-40f0-b955-62a8cee30313','205002','用户未登录','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('5d3b33e4-e61a-4cb3-932b-a90e8d929ca4','220004','F码不能重复使用','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('62fbdfb8-f7d2-42ca-881f-e137af8a248d','240004','不能使用体验码','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('69db4154-de80-4974-8c73-79f98be0e601','208101','用户名已经被注册','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('6d6c4b2a-c03f-44c1-a66d-9ae3cd9d9531','208124','不存在输入idcard的账户','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('6ed2fea8-9836-43d4-b2f8-e6f83e56ede0','270001','签名验证不通过','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('70165dce-92d2-489c-a5af-efbbab08c78e','281011','趣分期兑换码已过期','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('720934d6-59f8-46d8-8a4a-28a9653e1353','000003','API接口异常错误','62bde6e0-988b-475f-bfdf-76203455ec57','2016-03-30 12:14:20',1,0),('7d2a5131-af7d-48a8-a78b-b4a194c5602f','200008','网络异常,请稍后重试','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('7e6783db-f61b-4841-94d7-5f5733f392b5','270002','不是小米订单无需处理','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('7ee682f9-54da-4363-88e0-7ada8c445e4b','205010','购物车信息已经发生变化,请确认订单是否已经提交,或重新刷新','de2055f4-656a-495b-85dd-6591922bdf5d','2016-03-30 12:14:20',1,0),('805bb8d3-5bf7-44a3-855d-5966d0ddf0fa','240002','很遗憾,该体验码已过期','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('82e675b4-0c11-414d-8640-91ddead4f3b1','000001','系统未知错误','62bde6e0-988b-475f-bfdf-76203455ec57','2016-03-30 12:14:20',1,0),('8507a333-d404-4665-87ae-81553747c777','000010','已被抢光|商品太热门啦,瞬间就被抢光啦~','62bde6e0-988b-475f-bfdf-76203455ec57','2016-03-30 12:14:20',1,0),('8a875a4d-80de-4158-b27c-8d3734847a69','281008','红包同步至小米失败','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('8c4e3635-4434-45cd-ae45-85ae06634d7d','205011','消费积分密码输入错误','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('8d656621-610c-4f10-aba6-a34fd1c93fbf','208125','授权失败,请稍后重试','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('8e0f53f3-f830-43bc-9b21-429a21ca6c6f','210006','未找到对应的受理单','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('8f685f9d-de83-4bf3-b7d1-15b2eda60720','240001','体验码不存在,请重新输入','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('913a5960-37d2-48a3-a33b-35c8c74da786','208122','输入的验证码错误','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('91b8d2f4-3561-40b5-837c-47793a34a8c0','210005','订单不存在','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('92d5c8de-ce8a-4d68-8241-c63f1bd178ba','208100','请正确输入您的手机号码','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('95ec015a-1e7b-418f-9027-dbe556e22a75','205012','输入积分超出您所拥有积分','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('97a83455-a014-470d-a844-d7b638ade5e2','212006','订单金额不匹配。','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('97b85c51-3e42-4825-aa05-d29e8f527ecb','000008','任务完成|小伙伴们太给力了,砍价任务已经完成啦~','62bde6e0-988b-475f-bfdf-76203455ec57','2016-03-30 12:14:20',1,0),('9a554aca-b136-4ac7-9413-bbf748c03646','212001','订单状态不一致。','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('9be00150-2ebf-46a6-bc33-346bd71ccc85','205018','减库存失败','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('a123a0db-d06b-4be3-a33b-e08777b64e7c','206004','输入的样例ID不是眼镜品类。','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('a1d7ba85-b365-428e-9d18-31be64aac13b','281009','红包和体验码不能同时使用','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('a35204cb-f40f-4765-9d80-e777cea478e0','240003','体验码已被使用,不能重复使用','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('a45a841d-3f1f-4704-b3f8-b8c4118cb9b7','208128','用户表绑定手机号或小米用户表绑定原有用户出错','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('a53c9cfe-b7cb-4ffe-be0e-29cbe94b84b1','200009','not have right','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('a882eb92-e398-4d66-b872-5f7b87b19ec1','000016','抱歉|API网络异常~','62bde6e0-988b-475f-bfdf-76203455ec57','2016-03-30 12:14:20',1,0),('a8e0bac1-2877-46f4-af4c-4e8d2bf2a092','208105','密码格式错误','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('aa4ddfdf-45e3-40d6-8788-38a49ff3f898','200000','Invalid tokenggg','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('abfa084b-517c-4d90-a392-380e5457d2e9','000014','调取接口,创建订单失败!','62bde6e0-988b-475f-bfdf-76203455ec57','2016-03-30 12:14:20',1,0),('b26cee4a-0855-4450-b44a-aba5ccb122bc','208116','更改密码失败','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('b9bcf9ac-3929-4d3e-9c40-8e5a8a61da65','281004','红包已过期','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('bb491747-3c7a-4ce5-bdbc-de66d5716b3b','205005','添加商品至购物车前更新购物车操作状态失败','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('bcdf9fa5-1bea-45df-bd65-b8424fda29a4','281006','红包已作废','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('bec06964-c15e-4c7e-b070-105de698ff23','210009','退款单已关闭','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('c0b52782-9fda-4859-93ad-f752c40f3853','000006','已被抢光|商品太热门啦,瞬间就被抢光啦~','62bde6e0-988b-475f-bfdf-76203455ec57','2016-03-30 12:14:20',1,0),('c17a360a-4d78-4302-8016-f4319fb5d2dd','100001','抱歉,微信请求失败~','62bde6e0-988b-475f-bfdf-76203455ec57','2016-03-30 12:14:20',1,0),('c53d5bf3-3a33-41fb-aafa-3e7b9804b923','281015','templateId为空123','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('c66a966c-1561-413d-ae80-4d00cb6242b0','205019','增加库存失败','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('c72a7dd0-a3e1-4172-9898-74ea3cc65206','250012','插入数据失败','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('cce84c9f-1423-4fe3-b3fc-c0017f116dc5','205017','此商品部分材料库存不足','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('cf4e5872-35c5-4a15-a5cb-7e3f36fd8d21','208118','注册失败','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('d05d5b11-b794-42bf-a52a-42cb30cf33d7','260002','赔偿单必须是赔款失败状态','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('d2d545cb-276b-43b7-b32a-4b93026eb34a','000015','抱歉,当前试用活动已结束,去看看其他活动吧~','62bde6e0-988b-475f-bfdf-76203455ec57','2016-03-30 12:14:20',1,0),('d2d7e8b7-d649-4d82-b5c5-8e9562ad8f2c','200010','生成token失败','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('dac0a59e-1136-4f15-9af5-4aa802e8b1f3','281001','红包活动已过期','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('dc2c1eef-1ba4-4059-85c9-8ed28f579f07','208102','系统异常错误。','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('de4eee77-3b5e-4a99-bc96-b69cbf28cd22','260001','赔偿单必须是未申请状态','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('def6f8fd-569f-479d-8b6b-69bc0427963b','000009','已被抢光|当前活动已结束,感谢参与~','62bde6e0-988b-475f-bfdf-76203455ec57','2016-03-30 12:14:20',1,0),('e209640c-3de9-4e68-bb53-e144318e19fe','230001','商品已被抢光。','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('e561cf42-9d87-441d-bcad-c975d2486742','212009','汽车限量购校验未通过','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('e6c3e35b-9cec-459e-90e9-5a01129b5d9f','210007','商家同意退款,等待退款','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('e8befe32-68e2-43e2-96a9-1b6494c26f1c','220003','F码已失效','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('eb71ac41-9cac-436b-9867-4d68e61a9109','240008','体验码已锁定','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('ec2a3cd4-375d-412d-b456-bd00b72ab12a','205001','当前用户不合法','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('ed5b7808-e5a2-4adc-b669-a800308e59e1','205008','更新购物车商品数量失败','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('f010f479-00f0-4991-b091-3071086a71e7','100002','解析微信请求失败~','62bde6e0-988b-475f-bfdf-76203455ec57','2016-03-30 12:14:20',1,0),('f1ce26cd-ea6b-4e77-9c65-1499fcb24e78','000004','您已砍过|您已经帮Ta砍过一次咯~','de2055f4-656a-495b-85dd-6591922bdf5d','2016-03-30 12:14:20',1,0),('f21bcb0b-f5c6-4611-9ade-5728909385bd','000011','试用单状态有误,操作失败!','62bde6e0-988b-475f-bfdf-76203455ec57','2016-03-30 12:14:20',1,0),('f238f75d-52a9-486b-baa2-7d70e31f5466','250011','该手机号已预约过该品类','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('f6b3c360-4143-4393-8db0-905f21b85474','212007','订单金额小于等于0。','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('f8637659-051f-4663-b1a9-c4c7f7e69961','281002','该用户已申请过此活动。','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('fa13cd7f-3dd9-4aba-af62-394814c943b0','210004','退款总金额必须大于0','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('fa8be73f-8110-41aa-a5f3-4f1243ab68be','240006','该体验码只能购买指定商品,请核查后再使用','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('fc547387-7858-4fcc-b0d1-6c9f6aeb3bb5','000005','很抱歉,您已参与试用活动,在此活动结束后您可再次参与其它活动!','62bde6e0-988b-475f-bfdf-76203455ec57','2016-03-30 12:14:20',1,0),('fc56cbde-32fc-44d5-bd07-ca94f06e4c28','281003','红包已使用','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('fd1efbe0-5d30-4a3e-813e-8cabcf5bc2ed','200007','处理过程中出现异常','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0),('fd863656-3cd0-4dc7-b315-abb343bf850b','212004','订单已被支付。','9e6596c1-9fda-4cd2-b20a-1cce7e572a65','2016-03-30 12:14:20',1,0); +/*!40000 ALTER TABLE `error` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `interface` +-- + +DROP TABLE IF EXISTS `interface`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `interface` ( + `id` varchar(50) NOT NULL COMMENT '主键', + `url` varchar(200) NOT NULL COMMENT 'api链接', + `method` varchar(30) NOT NULL COMMENT ' 请求方式', + `param` text COMMENT '参数列表', + `requestExam` text COMMENT '请求示例', + `responseParam` text COMMENT '返回参数说明', + `errorList` text COMMENT '接口错误码列表', + `trueExam` text COMMENT '正确返回示例', + `falseExam` text COMMENT '错误返回示例', + `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '是否可用;0不可用;1可用;-1 删除', + `moduleId` varchar(50) NOT NULL COMMENT '所属模块ID', + `interfaceName` varchar(100) NOT NULL COMMENT '接口名', + `remark` text, + `errors` text COMMENT '错误码、错误码信息', + `updateBy` varchar(100) DEFAULT NULL, + `updateTime` timestamp NOT NULL DEFAULT '2015-12-30 17:40:00', + `createTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `version` varchar(20) NOT NULL DEFAULT '1.0' COMMENT '版本号', + `sequence` int(11) NOT NULL DEFAULT '0' COMMENT '排序,越大越靠前', + `header` text, + `fullUrl` varchar(255) NOT NULL DEFAULT '', + `monitorType` int(11) NOT NULL DEFAULT '0' COMMENT '监控类型,多选:\nNetwork("网络异常",1),Include("包含指定字符串",2),NotInclude("不包含指定字符串",3),NotEqual("不等于指定字符串",4); \n', + `monitorText` varchar(500) NOT NULL DEFAULT '' COMMENT '监控比较内容', + `monitorEmails` varchar(200) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `Index_fullUrl` (`fullUrl`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `interface` +-- + +LOCK TABLES `interface` WRITE; +/*!40000 ALTER TABLE `interface` DISABLE KEYS */; +INSERT INTO `interface` VALUES ('16e1afe6-cdd4-4846-a4aa-0e7ba830ea5b','http://127.0.0.1','GET,','form=[]','请求地址:http://127.0.0.1\r\n请求头:\r\n请求参数:\r\n UserName=xxxx\r\n password=xxxx\r\n','[]','205007,281007,281009,281010,281012,281013,281014,281015,','{\n \"status\":1,\n \"errorCode\":0,\n \"errorMessage\":null,\n \"actionData\":[\n {\n \"signal\":{\n \"signalId\":1,\n \"signalAddress\":\"udp://@:1234\",\n \"addTime\":\"\",\n \"signalName\":\"cctv1\",\n \"status\":1,\n \"restartFlag\":0,\n \"restartTime\":0,\n \"deleteFlag\":0,\n \"cmdContent\":\"ffmpeg -i *in* -c:v libx264 -c:a aac -strict -2 -f hls *outM3u8*\",\n \"statusFlag\":1\n }\n }\n ]\n}\n','{}',1,'063578aa-785f-42b8-bd1b-e3061ef45a2f','用户登录','

测试接口

','[{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"281007\",\"errorMsg\":\"红包不存在\",\"id\":\"00743df0-a358-4dd1-8856-dbdeb1f78633\",\"logRemark\":\"\",\"moduleId\":\"9e6596c1-9fda-4cd2-b20a-1cce7e572a65\",\"moduleName\":\"示例项目\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"281014\",\"errorMsg\":\"趣分期兑换uid为空\",\"id\":\"2069622d-579e-460e-89c0-dcfaa924fc82\",\"logRemark\":\"\",\"moduleId\":\"9e6596c1-9fda-4cd2-b20a-1cce7e572a65\",\"moduleName\":\"示例项目\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"205007\",\"errorMsg\":\"删除指定商品失败\",\"id\":\"26622971-152d-4b31-9ba3-0710ce8e2850\",\"logRemark\":\"\",\"moduleId\":\"9e6596c1-9fda-4cd2-b20a-1cce7e572a65\",\"moduleName\":\"示例项目\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"281012\",\"errorMsg\":\"趣分期兑换码已使用\",\"id\":\"2ece77ba-acdd-4abe-a159-c7ed2038fe83\",\"logRemark\":\"\",\"moduleId\":\"9e6596c1-9fda-4cd2-b20a-1cce7e572a65\",\"moduleName\":\"示例项目\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"281013\",\"errorMsg\":\"趣分期兑换码无效\",\"id\":\"3380cef1-432e-4d18-a556-c4b4abd7c279\",\"logRemark\":\"\",\"moduleId\":\"9e6596c1-9fda-4cd2-b20a-1cce7e572a65\",\"moduleName\":\"示例项目\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"281010\",\"errorMsg\":\"趣分期兑换码长度错误\",\"id\":\"416a5375-9dc7-46d6-b8cc-6af4d28ead39\",\"logRemark\":\"\",\"moduleId\":\"9e6596c1-9fda-4cd2-b20a-1cce7e572a65\",\"moduleName\":\"示例项目\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"281009\",\"errorMsg\":\"红包和体验码不能同时使用\",\"id\":\"a1d7ba85-b365-428e-9d18-31be64aac13b\",\"logRemark\":\"\",\"moduleId\":\"9e6596c1-9fda-4cd2-b20a-1cce7e572a65\",\"moduleName\":\"示例项目\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"281015\",\"errorMsg\":\"templateId为空123\",\"id\":\"c53d5bf3-3a33-41fb-aafa-3e7b9804b923\",\"logRemark\":\"\",\"moduleId\":\"9e6596c1-9fda-4cd2-b20a-1cce7e572a65\",\"moduleName\":\"示例项目\",\"sequence\":0,\"status\":1}]','userName:admin | trueName:超级管理员','2016-06-09 17:40:00','2016-05-25 08:50:35','1.0',0,'[]','http://127.0.0.1',0,'',''),('2e4c0946-61d7-4a63-bb3f-4bf5b3279f4d','http://xxx/activityOrder/8/list.do','post and get','form=[{\"name\":\"activity_id\",\"necessary\":\"true\",\"type\":\"long\",\"parameterType\":\"HEADER\",\"remark\":\"试用活动id\"},{\"name\":\"page\",\"necessary\":\"false\",\"type\":\"int\",\"parameterType\":\"HEADER\",\"remark\":\"页码 如果为空,则返回第一页的数据\"},{\"name\":\"pageSize\",\"necessary\":\"false\",\"type\":\"int\",\"parameterType\":\"HEADER\",\"remark\":\"每页显示的数量,如果pageSize为空,则不分页,一次选择所有数据\"},{\"name\":\"555\",\"necessary\":\"true\",\"type\":\"5\",\"parameterType\":\"HEADER\",\"remark\":\"555\"}]','请求地址:http://xxx/activityOrder/8/list.do\r\n请求头:\r\n activity_id=xxxx\r\n page=xxxx\r\n pageSize=xxxx\r\n 555=xxxx\r\n请求参数:\r\n','[{\"name\":\"page\",\"type\":\"对象\",\"remark\":\"分页信息\"},{\"name\":\"testList\",\"type\":\"数组\",\"remark\":\"试用单列表\"},{\"name\":\"55\",\"type\":\"55\",\"remark\":\"555\"}]','000001,','{\n \"data\": {\n \"testList\": [\n {\n \"submitTime\": 1456803171000, \n \"userId\": 1253817, \n \"userImg\": \"\", \n \"userName\": \"Ehsan\"\n }, \n {\n \"submitTime\": 1456891539000, \n \"userId\": 1253817, \n \"userImg\": \"\", \n \"userName\": \"Ehsan\"\n }, \n {\n \"submitTime\": 1457170074000, \n \"userId\": 1927601, \n \"userImg\": \"\", \n \"userName\": \"2927602\"\n }, \n {\n \"submitTime\": 1457171696000, \n \"userId\": 1772231, \n \"userImg\": \"\", \n \"userName\": \"snail-阿蒲\"\n }, \n {\n \"submitTime\": 1457184651000, \n \"userId\": 389, \n \"userImg\": \"\", \n \"userName\": \"路上有你\"\n }, \n {\n \"submitTime\": 1457185381000, \n \"userId\": 4352, \n \"userImg\": \"\", \n \"userName\": \"夜月星空\"\n }, \n {\n \"submitTime\": 1457417579000, \n \"userId\": 1772231, \n \"userImg\": \"\", \n \"userName\": \"snail-阿蒲\"\n }, \n {\n \"submitTime\": 1457422208000, \n \"userId\": 1927601, \n \"userImg\": \"\", \n \"userName\": \"EhsanTang\"\n }, \n {\n \"submitTime\": 1458013122000, \n \"userId\": 1927601, \n \"userImg\": \"\", \n \"userName\": \"EhsanTang\"\n }\n ], \n \"testNum\": 9\n }, \n \"error\": null, \n \"page\": {\n \"allRow\": 15, \n \"currentPage\": 1, \n \"size\": 1000, \n \"start\": 0, \n \"totalPage\": 1\n }, \n \"success\": 1\n}','{\n \"data\": null, \n \"error\": {\n \"code\": \"000001\", \n \"data\": null, \n \"message\": \"xxxxxxx\"\n }, \n \"page\": null, \n \"success\": 0\n}',1,'063578aa-785f-42b8-bd1b-e3061ef45a2f','查询某试用活动已经获得试用资格的试用单','查看当某活动的试用单列表(已经砍价成功,并且已经提交了订单)','[]','userName:admin | trueName:超级管理员','2016-06-09 17:40:00','2016-03-30 12:12:51','1.0',0,'[]','http://xxx/activityOrder/8/list.do',0,'',''),('2f475ebf-2d34-4f52-8bc7-8eb10a153014','http://xxx/product/info/render3.do','post and get','form=[{\"name\":\"renderParams\",\"necessary\":\"true\",\"type\":\"String\",\"remark\":\"渲染参数\"}]','请求地址:http://xxx/product/info/render3.do\r\n请求头:\r\n请求参数:\r\n renderParams=xxxx\r\n','[{\"name\":\"CannotChangeMaterials\",\"type\":\"String\",\"remark\":\"被关联的面与材料(不可修改的面+材料)\"},{\"name\":\"sudata\",\"type\":\"String\",\"remark\":\"商品信息\"},{\"name\":\"sizeList\",\"type\":\"String\",\"remark\":\"尺码列表\"},{\"name\":\"NotShowComponents\",\"type\":\"String\",\"remark\":\"不可定制面的集合\"}]','200008,200009,200010,205001,205002,','{\n \"success\":1,\n \"data\":[\n {\n \"suId\":\"1253\",\n \"suCode\":\"157416\",\n \"skuCode\":null,\n \"modelId\":12587\n }\n ],\n \"error\":null\n}\n','{\n \"success\":1,\n \"data\":[\n {\n \"suId\":\"1253\",\n \"suCode\":\"157416\",\n \"skuCode\":null,\n \"modelId\":12587\n }\n ],\n \"error\":null\n}\n',1,'189d073c-b4ea-4e50-a1c1-f66ec1da1dd4','获取购物车列表数据集','不可定制面是不需要在用户的定制面列表里面出现','[{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"205002\",\"errorMsg\":\"用户未登录\",\"id\":\"5d232003-0991-40f0-b955-62a8cee30313\",\"logRemark\":\"\",\"moduleId\":\"9e6596c1-9fda-4cd2-b20a-1cce7e572a65\",\"moduleName\":\"示例项目\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"200008\",\"errorMsg\":\"网络异常,请稍后重试\",\"id\":\"7d2a5131-af7d-48a8-a78b-b4a194c5602f\",\"logRemark\":\"\",\"moduleId\":\"9e6596c1-9fda-4cd2-b20a-1cce7e572a65\",\"moduleName\":\"示例项目\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"200009\",\"errorMsg\":\"not have right\",\"id\":\"a53c9cfe-b7cb-4ffe-be0e-29cbe94b84b1\",\"logRemark\":\"\",\"moduleId\":\"9e6596c1-9fda-4cd2-b20a-1cce7e572a65\",\"moduleName\":\"示例项目\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"200010\",\"errorMsg\":\"生成token失败\",\"id\":\"d2d7e8b7-d649-4d82-b5c5-8e9562ad8f2c\",\"logRemark\":\"\",\"moduleId\":\"9e6596c1-9fda-4cd2-b20a-1cce7e572a65\",\"moduleName\":\"示例项目\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"205001\",\"errorMsg\":\"当前用户不合法\",\"id\":\"ec2a3cd4-375d-412d-b456-bd00b72ab12a\",\"logRemark\":\"\",\"moduleId\":\"9e6596c1-9fda-4cd2-b20a-1cce7e572a65\",\"moduleName\":\"示例项目\",\"sequence\":0,\"status\":1}]','userName:admin | trueName:超级管理员','2016-06-09 17:39:00','2016-04-28 19:06:24','1.0',0,'[]','http://xxx/product/info/render3.do',0,'',''),('33b7c942-fd71-4559-a126-c658b55cc700','http://1111123213','post','form=[{\"name\":\"1\",\"necessary\":\"1\",\"type\":\"1\",\"parameterType\":\"\",\"remark\":\"1\"}]','请求地址:http://1111123213\r\n请求头:\r\n请求参数:\r\n 1=xxxx\r\n','[]','','','',0,'c8b0ec41-e6b9-4f36-b986-963fa44715a9','sfdfs','

sdfdsf

sdfdsfsdfsd

','[]','userName:super | trueName:测试用户','2016-05-25 11:17:00','2016-05-25 11:17:35','1.0',0,'[]','http://1111123213',0,'',''),('476679d6-bbbf-4f6a-9157-cf9090fb710a','http://tcc.taobao.com/cc/json/mobile_tel_segment.htm','POST,GET,','form=[{\"name\":\"tel\",\"necessary\":\"true\",\"type\":\"String\",\"parameterType\":\"PARAMETER\",\"remark\":\"手机号码\"}]','请求地址:aa\r\n请求头:\r\n请求参数:\r\n tel=xxxx\r\n','[{\"name\":\"__GetZoneResult_\",\"type\":\"Json\",\"remark\":\"返回归属地信息\"}]','000001,000012,','{\n \"mts\":\"1585078\",\n \"province\":\"江苏\",\n \"catName\":\"中国移动\",\n \"telString\":\"15850781443\",\n \"areaVid\":\"30511\",\n \"ispVid\":\"3236139\",\n \"carrier\":\"江苏移动\"\n}\n','',1,'62bde6e0-988b-475f-bfdf-76203455ec57','淘宝查询手机归属地','','[{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"000012\",\"errorMsg\":\"抱歉,您所选择的试用商品已被抢完,去看看其他活动吧~\",\"id\":\"1e01a3dd-1711-44ab-8481-3f15c57cdcde\",\"logRemark\":\"\",\"moduleId\":\"62bde6e0-988b-475f-bfdf-76203455ec57\",\"moduleName\":\"常用免费常用接口\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"000001\",\"errorMsg\":\"系统未知错误\",\"id\":\"82e675b4-0c11-414d-8640-91ddead4f3b1\",\"logRemark\":\"\",\"moduleId\":\"62bde6e0-988b-475f-bfdf-76203455ec57\",\"moduleName\":\"常用免费常用接口\",\"sequence\":0,\"status\":1}]','userName:admin | trueName:超级管理员','2016-06-09 17:39:00','2016-04-12 14:56:02','1.0',0,'[]','http://tcc.taobao.com/cc/json/mobile_tel_segment.htm',0,'',''),('579ead79-4ff3-4b74-b70c-676db4618be4','https://tcc.taobao.com/cc/json/mobile_tel_segment.html','POST,GET,','form=[{\"name\":\"tel\",\"necessary\":\"true\",\"type\":\"String\",\"parameterType\":\"PARAMETER\",\"remark\":\"手机号码\"}]','请求地址:https://tcc.taobao.com/cc/json/mobile_tel_segment.htm\r\n请求头:\r\n请求参数:\r\n tel=xxxx\r\n','[{\"name\":\"__GetZoneResult_\",\"type\":\"Json\",\"remark\":\"返回归属地信息\"}]','','{\n \"mts\":\"1585078\",\n \"province\":\"江苏\",\n \"catName\":\"中国移动\",\n \"telString\":\"15850781443\",\n \"areaVid\":\"30511\",\n \"ispVid\":\"3236139\",\n \"carrier\":\"江苏移动\"\n}\n','',1,'62bde6e0-988b-475f-bfdf-76203455ec57','淘宝查询手机归属地','','[]','userName:admin | trueName:超级管理员','2016-06-09 17:39:00','2016-04-10 23:38:11','1.0',0,'[]','https://tcc.taobao.com/cc/json/mobile_tel_segment.html',0,'',''),('61c3ff83-f3d4-45bd-8b0a-7e67e21d6cf5','http://11232132','POST,','form=[]','请求地址:\r\n','[]','','{\"Msg\":\"获取成功\",\"Success\":true,\"Data\":{\"Id\":\"c6544f4637ed45ef8dd61eb1a1098bee\",\"FreeDiagnosis\":0,\"ImageTextConsult\":1,\"AttentionNotice\":1,\"AutoSetPatient\":1,\"IsOpenSound\":1,\"IsOpenVibration\":1,\"CardDiagnosisNum\":6}}','',0,'c8b0ec41-e6b9-4f36-b986-963fa44715a9','配置','','[]','userName:super | trueName:测试用户','2016-06-04 20:54:00','2016-05-25 11:19:50','1.0',0,'[]','http://11232132',0,'',''),('6cd58bc6-edb9-46b8-9d4f-0b3cdef10a2d','http://xxx/product/info/render2.do','post and get','form=[{\"name\":\"renderParams\",\"necessary\":\"true\",\"type\":\"String\",\"parameterType\":\"undefined\",\"remark\":\"渲染参数\"},{\"name\":\"userid\",\"necessary\":\"true\",\"type\":\"int\",\"parameterType\":\"PARAMETER\",\"remark\":\"用户id\"}]','请求地址:http://xxx/product/info/render2.do\r\n请求头:\r\n请求参数:\r\n renderParams=xxxx\r\n userid=xxxx\r\n','[{\"name\":\"CannotChangeMaterials\",\"type\":\"String\",\"remark\":\"被关联的面与材料(不可修改的面+材料)\"},{\"name\":\"sudata\",\"type\":\"String\",\"remark\":\"商品信息\"},{\"name\":\"sizeList\",\"type\":\"String\",\"remark\":\"尺码列表\"},{\"name\":\"NotShowComponents\",\"type\":\"String\",\"remark\":\"不可定制面的集合\"}]','200008,200009,200010,205001,205002,','{\n \"success\":1,\n \"data\":[\n {\n \"suId\":\"1253\",\n \"suCode\":\"157416\",\n \"skuCode\":null,\n \"modelId\":12587\n }\n ],\n \"error\":null\n}','{\n \"success\":1,\n \"data\":[\n {\n \"suId\":\"1253\",\n \"suCode\":\"157416\",\n \"skuCode\":null,\n \"modelId\":12587\n }\n ],\n \"error\":null\n}',1,'189d073c-b4ea-4e50-a1c1-f66ec1da1dd4','获取购物车列表数据集','不可定制面是不需要在用户的定制面列表里面出现','[{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"205002\",\"errorMsg\":\"用户未登录\",\"id\":\"5d232003-0991-40f0-b955-62a8cee30313\",\"logRemark\":\"\",\"moduleId\":\"9e6596c1-9fda-4cd2-b20a-1cce7e572a65\",\"moduleName\":\"示例项目\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"200008\",\"errorMsg\":\"网络异常,请稍后重试\",\"id\":\"7d2a5131-af7d-48a8-a78b-b4a194c5602f\",\"logRemark\":\"\",\"moduleId\":\"9e6596c1-9fda-4cd2-b20a-1cce7e572a65\",\"moduleName\":\"示例项目\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"200009\",\"errorMsg\":\"not have right\",\"id\":\"a53c9cfe-b7cb-4ffe-be0e-29cbe94b84b1\",\"logRemark\":\"\",\"moduleId\":\"9e6596c1-9fda-4cd2-b20a-1cce7e572a65\",\"moduleName\":\"示例项目\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"200010\",\"errorMsg\":\"生成token失败\",\"id\":\"d2d7e8b7-d649-4d82-b5c5-8e9562ad8f2c\",\"logRemark\":\"\",\"moduleId\":\"9e6596c1-9fda-4cd2-b20a-1cce7e572a65\",\"moduleName\":\"示例项目\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"205001\",\"errorMsg\":\"当前用户不合法\",\"id\":\"ec2a3cd4-375d-412d-b456-bd00b72ab12a\",\"logRemark\":\"\",\"moduleId\":\"9e6596c1-9fda-4cd2-b20a-1cce7e572a65\",\"moduleName\":\"示例项目\",\"sequence\":0,\"status\":1}]','userName:admin | trueName:超级管理员','2016-06-09 17:39:00','2016-04-28 19:05:56','3.0',0,'[]','http://xxx/product/info/render2.do',0,'',''),('71597b65-bffb-462d-9f0d-6898ff03c8b3','http://xxx/activity/productSizedetail.do','post and get','form=[{\"name\":\"activity_id\",\"necessary\":\"true\",\"type\":\"long\",\"parameterType\":\"PARAMETER\",\"remark\":\"试用活动id\"}]','请求地址:http://xxx/activity/productSizedetail.do\r\n请求头:\r\n请求参数:\r\n activity_id=xxxx\r\n','[{\"name\":\"success\",\"type\":\"int\",\"remark\":\"是否成功:1成功,0失败\"},{\"name\":\"sizeDetail\",\"type\":\"对象\",\"remark\":\"规格、su、库存信息\"}]','000001,','{\n \"success\": 1, \n \"data\": {\n \"sizeDetail\": [\n {\n \"specs\": [\n {\n \"goods_size\": \"红色\", \n \"name\": \"颜色\"\n }, \n {\n \"goods_size\": \"35\", \n \"name\": \"尺码\"\n }\n ], \n \"storeNum\": 19, \n \"suId\": \"1300155001000001011\"\n }, \n {\n \"specs\": [\n {\n \"goods_size\": \"白色\", \n \"name\": \"颜色\"\n }, \n {\n \"goods_size\": \"36\", \n \"name\": \"尺码\"\n }\n ], \n \"storeNum\": 12, \n \"suId\": \"1300155001000002021\"\n }, \n {\n \"specs\": [\n {\n \"goods_size\": \"黑色\", \n \"name\": \"颜色\"\n }, \n {\n \"goods_size\": \"37\", \n \"name\": \"尺码\"\n }\n ], \n \"storeNum\": 0, \n \"suId\": \"1300155001000003031\"\n }\n ]\n }\n}','{\n \"data\": null, \n \"error\": {\n \"code\": \"000001\", \n \"data\": null, \n \"message\": \"活动不存在\"\n }, \n \"page\": null, \n \"success\": 0\n}',1,'cf9f682a-fd76-4ab5-9300-9210164ae2ea','试用活动详情页获取sizeDetail(规格、su、库存信息)','根据活动id查询活动对应的商品的规格信息及su、库存信息','[{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"000001\",\"errorId\":\"82e675b4-0c11-414d-8640-91ddead4f3b1\",\"errorMsg\":\"系统未知错误\",\"moduleId\":\"62bde6e0-988b-475f-bfdf-76203455ec57\",\"moduleName\":\"试用ptapi\",\"status\":1}]','userName:super | trueName:测试用户','2016-04-02 14:04:46','2016-03-30 12:12:51','1.0',0,'[]','http://xxx/activity/productSizedetail.do',0,'',''),('72e3354d-38ac-4de6-a5e9-0595bc97642b','/{test}/v12.do','POST,GET,PUT,','form=[{\"name\":\"uid\",\"necessary\":\"true\",\"type\":\"int\",\"def\":\"89\",\"remark\":\"3324\",\"inUrl\":\"false\"},{\"name\":\"test\",\"necessary\":\"true\",\"type\":\"String\",\"def\":\"aaa\",\"remark\":\"4535\",\"inUrl\":\"true\"}]','请求地址:http://api.crap1.cn/aaa/v1.do\r\n请求头:\r\n uid=45\r\n token=3dfefgeagceltenm2\r\n请求参数:\r\n uid=89\r\n','[{\"name\":\"success\",\"type\":\"int\",\"remark\":\"1:成功\"}]','000004,205010,','{\n \"success\":1\n}\n','{\n \"success\":1\n}\n',1,'dfeda26d-8766-431f-9b90-f6e9f2947b25','CrapApi接口1-form表单参数、路径参数','

接口说明,接口说明,接口说明,接口说明

','[{\"createTime\":\"2016-03-31 20:14:20.0\",\"errorCode\":\"205010\",\"errorMsg\":\"购物车信息已经发生变化,请确认订单是否已经提交,或重新刷新\",\"id\":\"7ee682f9-54da-4363-88e0-7ada8c445e4b\",\"logRemark\":\"\",\"moduleId\":\"de2055f4-656a-495b-85dd-6591922bdf5d\",\"moduleName\":\"CrapApi\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-03-31 20:14:20.0\",\"errorCode\":\"000004\",\"errorMsg\":\"您已砍过|您已经帮Ta砍过一次咯~\",\"id\":\"f1ce26cd-ea6b-4e77-9c65-1499fcb24e78\",\"logRemark\":\"\",\"moduleId\":\"de2055f4-656a-495b-85dd-6591922bdf5d\",\"moduleName\":\"CrapApi\",\"sequence\":0,\"status\":1}]','userName:admin | trueName:超级管理员','2016-08-26 09:41:00','2016-08-26 09:33:47','V1.0',99,'[{\"name\":\"uid\",\"necessary\":\"true\",\"type\":\"int\",\"def\":\"45\",\"remark\":\"用户ID\"},{\"name\":\"token\",\"necessary\":\"true\",\"type\":\"String\",\"def\":\"3dfefgeagceltenm2\",\"remark\":\"\"}]','http://api.crap1.cn/{test}/v12.do',0,'',''),('751021c3-1ef8-4440-b921-6b4f6f910c29','/{test}/v1.do','POST,GET,PUT,','form=[{\"name\":\"uid\",\"necessary\":\"true\",\"type\":\"int\",\"def\":\"89\",\"remark\":\"3324\",\"inUrl\":\"false\"},{\"name\":\"test\",\"necessary\":\"true\",\"type\":\"String\",\"def\":\"aaa\",\"remark\":\"4535\",\"inUrl\":\"true\"}]','请求地址:http://api.crap1.cn/aaa/v1.do\r\n请求头:\r\n uid=45\r\n token=3dfefgeagceltenm2\r\n请求参数:\r\n uid=89\r\n','[{\"name\":\"success\",\"type\":\"int\",\"remark\":\"1:成功\"}]','','{\n \"success\":1\n}\n','{\n \"success\":1\n}\n',1,'de2055f4-656a-495b-85dd-6591922bdf5d','CrapApi接口1-form表单参数、路径参数','

接口说明,接口说明,接口说明,接口说明

','[]','userName:admin | trueName:超级管理员','2016-08-26 09:33:00','2016-08-26 09:33:47','V1.0',100,'[{\"name\":\"uid\",\"necessary\":\"true\",\"type\":\"int\",\"def\":\"45\",\"remark\":\"用户ID\"},{\"name\":\"token\",\"necessary\":\"true\",\"type\":\"String\",\"def\":\"3dfefgeagceltenm2\",\"remark\":\"\"}]','http://api.crap1.cn/{test}/v1.do',0,'',''),('8f94ad2f-0094-4daf-ad05-b19ea672e594','test/dd333.do','POST,GET,DELETE,','{\"test\":\"xxx\"}','请求地址:http://api.crap1.cntest/dd.do\r\n请求头:\r\n请求参数:\r\n{\"test\":\"xxx\"}','[{\"name\":\"success\",\"type\":\"int\",\"remark\":\"1:成功\"}]','000004,205010,','{\n \"success\":1\n}\n','{\n \"success\":1\n}',1,'5c52ebf8-58ac-447c-9b40-5744dad44fd4','CrapApi接口1-自定义参数参数','

dddddd

','[{\"createTime\":\"2016-03-31 20:14:20.0\",\"errorCode\":\"205010\",\"errorMsg\":\"购物车信息已经发生变化,请确认订单是否已经提交,或重新刷新\",\"id\":\"7ee682f9-54da-4363-88e0-7ada8c445e4b\",\"logRemark\":\"\",\"moduleId\":\"de2055f4-656a-495b-85dd-6591922bdf5d\",\"moduleName\":\"CrapApi\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-03-31 20:14:20.0\",\"errorCode\":\"000004\",\"errorMsg\":\"您已砍过|您已经帮Ta砍过一次咯~\",\"id\":\"f1ce26cd-ea6b-4e77-9c65-1499fcb24e78\",\"logRemark\":\"\",\"moduleId\":\"de2055f4-656a-495b-85dd-6591922bdf5d\",\"moduleName\":\"CrapApi\",\"sequence\":0,\"status\":1}]','userName:admin | trueName:超级管理员','2016-08-26 09:40:00','2016-08-26 09:35:59','V1.0',100,'[]','test/dd333.do',0,'',''),('955db6b9-c42c-4e84-8a16-891d0944e4da','http://xxx/product/getSuId.do','post and get','form=[{\"name\":\"spec_ids\",\"necessary\":\"true\",\"type\":\"String\",\"parameterType\":\"HEADER\",\"remark\":\"规格id集合:{“1”,”2”}\"},{\"name\":\"product_id\",\"necessary\":\"true\",\"type\":\"long\",\"parameterType\":\"undefined\",\"remark\":\"商品id\"}]','请求地址:http://xxx/product/getSuId.do\r\n请求头:\r\n spec_ids=xxxx\r\n请求参数:\r\n product_id=xxxx\r\n','[{\"name\":\"succeed\",\"type\":\"int\",\"remark\":\"是否成功:1成功,0失败\"}]','000001,','{\n succeed:1,//是否成功\n data{\n suId,//售卖单元Id\n }\n}','{\n \"data\": null,\n \"error\": {\n \"code\": \"000001\",\n \"data\": null,\n \"message\": \"xxxx\"\n },\n \"page\": null,\n \"success\": 0\n}',0,'f86d375e-d1db-4eeb-84fa-9e9def04fc6d','根据规格、商品id查询SU','主键按照排序spec_order排序\n通过产品product_id和spec_md5从SU表查询唯一的SuId','[{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"000001\",\"errorId\":\"82e675b4-0c11-414d-8640-91ddead4f3b1\",\"errorMsg\":\"系统未知错误\",\"moduleId\":\"62bde6e0-988b-475f-bfdf-76203455ec57\",\"moduleName\":\"试用ptapi\",\"status\":1}]','userName:super | trueName:测试用户','2016-04-02 14:04:46','2016-03-30 12:12:51','1.0',0,'[]','http://xxx/product/getSuId.do',0,'',''),('98f6f8cd-8562-46a7-9915-aa0572246277','http://192.168.1.201:30016/Home/GetSysConfig','POST,','form=[]','请求地址:\r\n','[]','','{\"Msg\":\"获取成功\",\"Success\":true,\"Data\":{\"Id\":\"c6544f4637ed45ef8dd61eb1a1098bee\",\"FreeDiagnosis\":0,\"ImageTextConsult\":1,\"AttentionNotice\":1,\"AutoSetPatient\":1,\"IsOpenSound\":1,\"IsOpenVibration\":1,\"CardDiagnosisNum\":6}}','',0,'c8b0ec41-e6b9-4f36-b986-963fa44715a9','配置','','[]','userName:super | trueName:测试用户','2016-05-25 09:19:00','2016-05-25 09:18:51','',0,'[]','http://192.168.1.201:30016/Home/GetSysConfig',0,'',''),('9c62ae94-ee1e-4fcf-ac8e-d5d9a97769ac','test/dd.do','POST,GET,DELETE,','{\"test\":\"xxx\"}','请求地址:http://api.crap1.cntest/dd.do\r\n请求头:\r\n请求参数:\r\n{\"test\":\"xxx\"}','[{\"name\":\"success\",\"type\":\"int\",\"remark\":\"1:成功\"}]','000004,205010,','{\n \"success\":1\n}\n','{\n \"success\":1\n}',1,'de2055f4-656a-495b-85dd-6591922bdf5d','CrapApi接口1-自定义参数参数','

dddddd

','[{\"createTime\":\"2016-03-31 20:14:20.0\",\"errorCode\":\"205010\",\"errorMsg\":\"购物车信息已经发生变化,请确认订单是否已经提交,或重新刷新\",\"id\":\"7ee682f9-54da-4363-88e0-7ada8c445e4b\",\"logRemark\":\"\",\"moduleId\":\"de2055f4-656a-495b-85dd-6591922bdf5d\",\"moduleName\":\"CrapApi\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-03-31 20:14:20.0\",\"errorCode\":\"000004\",\"errorMsg\":\"您已砍过|您已经帮Ta砍过一次咯~\",\"id\":\"f1ce26cd-ea6b-4e77-9c65-1499fcb24e78\",\"logRemark\":\"\",\"moduleId\":\"de2055f4-656a-495b-85dd-6591922bdf5d\",\"moduleName\":\"CrapApi\",\"sequence\":0,\"status\":1}]','userName:test | trueName:123','2016-08-26 10:22:00','2016-08-26 09:35:59','V1.0',100,'[]','http://api.crap1.cntest/dd.do',0,'',''),('a21003af-b510-4051-8dbb-88e7cec95a00','test','GET,PUT,','form=[]','请求地址:test\r\n请求头:\r\n test=ttt\r\n请求参数:\r\n','[]','1111,','','',1,'b10aca13-1dfe-499f-9259-f8a36d0eb7c6','接口1','','[{\"createTime\":\"2016-08-27 18:13:14.0\",\"errorCode\":\"1111\",\"errorMsg\":\"1111\",\"id\":\"4e7b9210-c43b-40f3-aac7-f8e25688c38a\",\"logRemark\":\"\",\"moduleId\":\"b10aca13-1dfe-499f-9259-f8a36d0eb7c6\",\"moduleName\":\"我的项目1\",\"sequence\":0,\"status\":0}]','userName:test@crap.cn | trueName:null','2016-08-26 10:13:00','2016-08-26 10:13:02','233',0,'[{\"name\":\"test\",\"necessary\":\"true\",\"type\":\"ttt\",\"def\":\"ttt\",\"remark\":\"ttt\"}]','test',0,'',''),('a55a7e8d-7069-4c85-9c09-cdb45fe99099','/{test}/v122.do','POST,GET,PUT,','form=[{\"name\":\"uid\",\"necessary\":\"true\",\"type\":\"int\",\"def\":\"89\",\"remark\":\"3324\",\"inUrl\":\"false\"},{\"name\":\"test\",\"necessary\":\"true\",\"type\":\"String\",\"def\":\"aaa\",\"remark\":\"4535\",\"inUrl\":\"true\"}]','请求地址:http://api.crap1.cn/aaa/v1.do\r\n请求头:\r\n uid=45\r\n token=3dfefgeagceltenm2\r\n请求参数:\r\n uid=89\r\n','[{\"name\":\"success\",\"type\":\"int\",\"remark\":\"1:成功\"}]','205010,','{\n \"success\":1\n}\n','{\n \"success\":1\n}\n',1,'dfeda26d-8766-431f-9b90-f6e9f2947b25','CrapApi接口1-form表单参数、路径参数','

接口说明,接口说明,接口说明,接口说明

','[{\"createTime\":\"2016-03-31 20:14:20.0\",\"errorCode\":\"205010\",\"errorMsg\":\"购物车信息已经发生变化,请确认订单是否已经提交,或重新刷新\",\"id\":\"7ee682f9-54da-4363-88e0-7ada8c445e4b\",\"logRemark\":\"\",\"moduleId\":\"de2055f4-656a-495b-85dd-6591922bdf5d\",\"moduleName\":\"CrapApi\",\"sequence\":0,\"status\":1}]','userName:admin | trueName:超级管理员','2016-08-26 09:42:00','2016-08-26 09:33:47','V2.0',100,'[{\"name\":\"uid\",\"necessary\":\"true\",\"type\":\"int\",\"def\":\"45\",\"remark\":\"用户ID\"},{\"name\":\"token\",\"necessary\":\"true\",\"type\":\"String\",\"def\":\"3dfefgeagceltenm2\",\"remark\":\"\"}]','http://api.crap1.cn/{test}/v122.do',0,'',''),('ae91e6f2-ec51-4080-bcc5-baa16b50de7e','http://ip.taobao.com/service/getIpInfo.php','POST,GET,','form=[{\"name\":\"ip\",\"necessary\":\"true\",\"type\":\"String\",\"def\":\"87.98.78.99\",\"parameterType\":\"PARAMETER\",\"remark\":\"ip地址\"}]','请求地址:http://ip.taobao.com/service/getIpInfo.php\n请求头:\n请求参数:\n ip=106.39.68.165','[{\"name\":\"code\",\"type\":\"int\",\"remark\":\"code的值的含义为,0:成功,1:失败\"}]','','{\n \"code\":0,\n \"data\":{\n \"ip\":\"210.75.225.254\",\n \"country\":\"中国\",\n \"area\":\"华北\",\n \"region\":\"北京市\",\n \"city\":\"北京市\",\n \"county\":\"\",\n \"isp\":\"电信\",\n \"country_id\":\"86\",\n \"area_id\":\"100000\",\n \"region_id\":\"110000\",\n \"city_id\":\"110000\",\n \"county_id\":\"-1\",\n \"isp_id\":\"100017\"\n }\n}\n','',1,'62bde6e0-988b-475f-bfdf-76203455ec57','淘宝IP归属地查询','','[]','userName:admin | trueName:超级管理员','2016-06-09 17:39:00','2016-04-10 23:43:21','1.0',0,'[]','http://ip.taobao.com/service/getIpInfo.php',0,'',''),('b2b35faf-36ad-4efb-b6f7-bccafc75fc5f','11112132132','POST,GET,','form=[{\"name\":\"userId\",\"necessary\":\"true\",\"type\":\"Long\",\"def\":\"无\",\"parameterType\":\"PARAMETER\",\"remark\":\"\"}]','请求地址:11112132132\r\n请求头:\r\n请求参数:\r\n =xxxx\r\n','[{\"name\":\"code\",\"type\":\"string\",\"remark\":\"\"},{\"name\":\"msg\",\"type\":\"string\",\"remark\":\"\"},{\"name\":\"data\",\"type\":\"string\",\"remark\":\"\"},{\"name\":\"data.a\",\"type\":\"String\",\"remark\":\"\"},{\"name\":\"data.b\",\"type\":\"\",\"remark\":\"\"}]','','','',1,'189d073c-b4ea-4e50-a1c1-f66ec1da1dd4','bac','','[]','userName:admin | trueName:超级管理员','2016-06-09 17:39:00','2016-05-23 10:34:49','1',0,'[]','11112132132',0,'',''),('b89bc4dc-92ab-47be-b29e-f32d87c7b9e0','http://api.map.baidu.com/telematics/v3/weather','POST,GET,','form=[{\"name\":\"location\",\"necessary\":\"true\",\"type\":\"String\",\"parameterType\":\"PARAMETER\",\"remark\":\"输入城市名或经纬度,城市名称如:北京或者131,经纬度格式为lng,lat坐标如: location=116.305145,39.982368\"},{\"name\":\"output\",\"necessary\":\"false\",\"type\":\"String\",\"parameterType\":\"PARAMETER\",\"remark\":\"输出的数据格式,默认为xml格式,当output设置为’json’时,输出的为json格式的数据;\"},{\"name\":\"coord_type\",\"necessary\":\"false\",\"type\":\"String\",\"parameterType\":\"PARAMETER\",\"remark\":\"请求参数坐标类型,默认为gcj02经纬度坐标。允许的值为bd09ll、bd09mc、gcj02、wgs84。bd09ll表示百度经纬度坐标,bd09mc表示百度墨卡托坐标,gcj02表示经过国测局加密的坐标。wgs84表示gps获取的坐标。\"},{\"name\":\"ak\",\"necessary\":\"true\",\"type\":\"String\",\"parameterType\":\"PARAMETER\",\"remark\":\"百度ak,需要申请\"}]','请求地址:http://api.map.baidu.com/telematics/v3/weather\r\n请求头:\r\n请求参数:\r\n location=xxxx\r\n output=xxxx\r\n coord_type=xxxx\r\n ak=xxxx\r\n','[{\"name\":\"currentCity\",\"type\":\"String\",\"remark\":\"当前城市\"},{\"name\":\"status\",\"type\":\"String\",\"remark\":\"返回结果状态信息\"},{\"name\":\"date\",\"type\":\"String\",\"remark\":\"当前时间\"},{\"name\":\"results\",\"type\":\"String\",\"remark\":\"天气预报信息\"}]','000001,000002,000003,000004,000005,000006,000007,000008,000009,000010,','{\n \"error\":0,\n \"status\":\"success\",\n \"date\":\"2014-05-03\",\n \"results\":[\n {\n \"currentCity\":\"北京\",\n \"weather_data\":[\n {\n \"date\":\"周六(今天, 实时:22℃)\",\n \"dayPictureUrl\":\"http://api.map.baidu.com/images/weather/day/leizhenyu.png\",\n \"nightPictureUrl\":\"http://api.map.baidu.com/images/weather/night/duoyun.png\",\n \"weather\":\"雷阵雨转多云\",\n \"wind\":\"北风5-6级\",\n \"temperature\":\"24 ~ 11℃\"\n },\n {\n \"date\":\"周日\",\n \"dayPictureUrl\":\"http://api.map.baidu.com/images/weather/day/duoyun.png\",\n \"nightPictureUrl\":\"http://api.map.baidu.com/images/weather/night/qing.png\",\n \"weather\":\"多云转晴\",\n \"wind\":\"北风4-5级\",\n \"temperature\":\"19 ~ 8℃\"\n },\n {\n \"date\":\"周一\",\n \"dayPictureUrl\":\"http://api.map.baidu.com/images/weather/day/qing.png\",\n \"nightPictureUrl\":\"http://api.map.baidu.com/images/weather/night/qing.png\",\n \"weather\":\"晴\",\n \"wind\":\"微风\",\n \"temperature\":\"21 ~ 9℃\"\n },\n {\n \"date\":\"周二\",\n \"dayPictureUrl\":\"http://api.map.baidu.com/images/weather/day/duoyun.png\",\n \"nightPictureUrl\":\"http://api.map.baidu.com/images/weather/night/qing.png\",\n \"weather\":\"多云转晴\",\n \"wind\":\"微风\",\n \"temperature\":\"21 ~ 10℃\"\n }\n ]\n }\n ]\n}\n','',1,'62bde6e0-988b-475f-bfdf-76203455ec57','百度天气预报接口','


','[{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"000007\",\"errorMsg\":\"活动尚未开始,申请失败!\",\"id\":\"0173ac20-bb4d-4704-8a85-1077dc9b84d0\",\"logRemark\":\"\",\"moduleId\":\"62bde6e0-988b-475f-bfdf-76203455ec57\",\"moduleName\":\"常用免费常用接口\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"000002\",\"errorMsg\":\"授权验证失败\",\"id\":\"3c692a35-19c3-48d4-b2c7-e854208963c2\",\"logRemark\":\"\",\"moduleId\":\"62bde6e0-988b-475f-bfdf-76203455ec57\",\"moduleName\":\"常用免费常用接口\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"000003\",\"errorMsg\":\"API接口异常错误\",\"id\":\"720934d6-59f8-46d8-8a4a-28a9653e1353\",\"logRemark\":\"\",\"moduleId\":\"62bde6e0-988b-475f-bfdf-76203455ec57\",\"moduleName\":\"常用免费常用接口\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"000001\",\"errorMsg\":\"系统未知错误\",\"id\":\"82e675b4-0c11-414d-8640-91ddead4f3b1\",\"logRemark\":\"\",\"moduleId\":\"62bde6e0-988b-475f-bfdf-76203455ec57\",\"moduleName\":\"常用免费常用接口\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"000010\",\"errorMsg\":\"已被抢光|商品太热门啦,瞬间就被抢光啦~\",\"id\":\"8507a333-d404-4665-87ae-81553747c777\",\"logRemark\":\"\",\"moduleId\":\"62bde6e0-988b-475f-bfdf-76203455ec57\",\"moduleName\":\"常用免费常用接口\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"000008\",\"errorMsg\":\"任务完成|小伙伴们太给力了,砍价任务已经完成啦~\",\"id\":\"97b85c51-3e42-4825-aa05-d29e8f527ecb\",\"logRemark\":\"\",\"moduleId\":\"62bde6e0-988b-475f-bfdf-76203455ec57\",\"moduleName\":\"常用免费常用接口\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"000006\",\"errorMsg\":\"已被抢光|商品太热门啦,瞬间就被抢光啦~\",\"id\":\"c0b52782-9fda-4859-93ad-f752c40f3853\",\"logRemark\":\"\",\"moduleId\":\"62bde6e0-988b-475f-bfdf-76203455ec57\",\"moduleName\":\"常用免费常用接口\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"000009\",\"errorMsg\":\"已被抢光|当前活动已结束,感谢参与~\",\"id\":\"def6f8fd-569f-479d-8b6b-69bc0427963b\",\"logRemark\":\"\",\"moduleId\":\"62bde6e0-988b-475f-bfdf-76203455ec57\",\"moduleName\":\"常用免费常用接口\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"000005\",\"errorMsg\":\"很抱歉,您已参与试用活动,在此活动结束后您可再次参与其它活动!\",\"id\":\"fc547387-7858-4fcc-b0d1-6c9f6aeb3bb5\",\"logRemark\":\"\",\"moduleId\":\"62bde6e0-988b-475f-bfdf-76203455ec57\",\"moduleName\":\"常用免费常用接口\",\"sequence\":0,\"status\":1}]','userName:admin | trueName:超级管理员','2016-06-09 17:39:00','2016-04-08 23:23:56','1.0',0,'[]','http://api.map.baidu.com/telematics/v3/weather',0,'',''),('c10427b4-0d88-4af2-a79c-551a798b8d4c','http://baidu.com','post and get','form=[{\"name\":\"activity_report _id\",\"necessary\":\"true\",\"type\":\"long\",\"parameterType\":\"HEADER\",\"remark\":\"试用报告id\"}]','请求地址:http://xxxx/activityReport/detail.do\r\n请求头:\r\n activity_report _id=xxxx\r\n请求参数:\r\n','[{\"name\":\"success\",\"type\":\"int\",\"remark\":\"是否成功:1成功,0失败\"},{\"name\":\"data\",\"type\":\"对象\",\"remark\":\"试用报告详情\"}]','000001,','{\n \"data\":{\n \"repAuthor\":\"路上有你\",\n \"repContent\":\"

323

\",\n \"repId\":114,\n \"repImg\":\"http://img.biyao.com/files/data0/bytry/5e8187b706314eb98d2d1be27a10e221.png\",\n \"repTitle\":\"123\",\n \"userImg\":\"http://img.biyao.com/files/data0/2015/01/25/14/avatar/big/ebdb6c79-52ce-4c7b-bd68-f71ea4bd9563.jpg\"\n },\n \"error\":null,\n \"page\":null,\n \"success\":1\n}\n','{\n \"data\":null,\n \"error\":{\n \"code\":\"000001\",\n \"data\":null,\n \"message\":\"xxxxx\"\n },\n \"page\":null,\n \"success\":0\n}',1,'cf9f682a-fd76-4ab5-9300-9210164ae2ea','试用报告详情-【拷贝】','根据试用报告id查询试用报告详情','[{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"000001\",\"errorId\":\"82e675b4-0c11-414d-8640-91ddead4f3b1\",\"errorMsg\":\"系统未知错误\",\"moduleId\":\"62bde6e0-988b-475f-bfdf-76203455ec57\",\"moduleName\":\"试用ptapi\",\"status\":1}]','userName:super | trueName:测试用户','2016-04-02 06:56:00','2016-04-04 17:21:42','1.0',0,'[]','http://baidu.com',0,'',''),('e472bec4-f230-42f0-988a-544153ae919d','http://www.so.d/dsdf','post and get','form=[{\"name\":\"renderParams\",\"necessary\":\"true\",\"type\":\"String\",\"def\":\"\",\"parameterType\":\"undefined\",\"remark\":\"渲染参数\"},{\"name\":\"userid\",\"necessary\":\"true\",\"type\":\"int\",\"def\":\"\",\"parameterType\":\"PARAMETER\",\"remark\":\"用户id\"}]','请求地址:http://xxx/product/info/render2.do\r\n请求头:\r\n请求参数:\r\n renderParams=xxxx\r\n userid=xxxx\r\n','[{\"name\":\"CannotChangeMaterials\",\"type\":\"String\",\"remark\":\"被关联的面与材料(不可修改的面+材料)\"},{\"name\":\"sudata\",\"type\":\"String\",\"remark\":\"商品信息\"},{\"name\":\"sizeList\",\"type\":\"String\",\"remark\":\"尺码列表\"},{\"name\":\"NotShowComponents\",\"type\":\"String\",\"remark\":\"不可定制面的集合\"}]','200008,200009,200010,205001,205002,','{\n \"success\":1,\n \"data\":[\n {\n \"suId\":\"1253\",\n \"suCode\":\"157416\",\n \"skuCode\":null,\n \"modelId\":12587\n }\n ],\n \"error\":null\n}','{\n \"success\":1,\n \"data\":[\n {\n \"suId\":\"1253\",\n \"suCode\":\"157416\",\n \"skuCode\":null,\n \"modelId\":12587\n }\n ],\n \"error\":null\n}',1,'189d073c-b4ea-4e50-a1c1-f66ec1da1dd4','获取购物车列表数据集','不可定制面是不需要在用户的定制面列表里面出现','[{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"205002\",\"errorMsg\":\"用户未登录\",\"id\":\"5d232003-0991-40f0-b955-62a8cee30313\",\"logRemark\":\"\",\"moduleId\":\"9e6596c1-9fda-4cd2-b20a-1cce7e572a65\",\"moduleName\":\"示例项目\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"200008\",\"errorMsg\":\"网络异常,请稍后重试\",\"id\":\"7d2a5131-af7d-48a8-a78b-b4a194c5602f\",\"logRemark\":\"\",\"moduleId\":\"9e6596c1-9fda-4cd2-b20a-1cce7e572a65\",\"moduleName\":\"示例项目\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"200009\",\"errorMsg\":\"not have right\",\"id\":\"a53c9cfe-b7cb-4ffe-be0e-29cbe94b84b1\",\"logRemark\":\"\",\"moduleId\":\"9e6596c1-9fda-4cd2-b20a-1cce7e572a65\",\"moduleName\":\"示例项目\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"200010\",\"errorMsg\":\"生成token失败\",\"id\":\"d2d7e8b7-d649-4d82-b5c5-8e9562ad8f2c\",\"logRemark\":\"\",\"moduleId\":\"9e6596c1-9fda-4cd2-b20a-1cce7e572a65\",\"moduleName\":\"示例项目\",\"sequence\":0,\"status\":1},{\"createTime\":\"2016-04-01 12:14:20.0\",\"errorCode\":\"205001\",\"errorMsg\":\"当前用户不合法\",\"id\":\"ec2a3cd4-375d-412d-b456-bd00b72ab12a\",\"logRemark\":\"\",\"moduleId\":\"9e6596c1-9fda-4cd2-b20a-1cce7e572a65\",\"moduleName\":\"示例项目\",\"sequence\":0,\"status\":1}]','userName:admin | trueName:超级管理员','2016-06-09 17:39:00','2016-05-31 13:42:10','测试',0,'[]','http://www.so.d/dsdf',0,'',''); +/*!40000 ALTER TABLE `interface` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `log` +-- + +DROP TABLE IF EXISTS `log`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `log` ( + `id` varchar(50) NOT NULL, + `status` tinyint(4) NOT NULL DEFAULT '1', + `createTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `sequence` int(11) NOT NULL DEFAULT '0' COMMENT '排序,越大越靠前', + `modelClass` varchar(50) NOT NULL, + `modelName` varchar(50) NOT NULL, + `type` varchar(20) NOT NULL, + `updateBy` varchar(50) NOT NULL DEFAULT '' COMMENT '操作人', + `remark` varchar(100) NOT NULL, + `content` text NOT NULL, + `identy` varchar(50) NOT NULL COMMENT '数据唯一主键', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `log` +-- + +LOCK TABLES `log` WRITE; +/*!40000 ALTER TABLE `log` DISABLE KEYS */; +INSERT INTO `log` VALUES ('0ae1d8d7-e88f-4429-adac-3d6524884c7a',0,'2016-06-09 17:39:39',0,'Interface','接口','UPDATE','admin','修改:获取购物车列表数据集','{\"createTime\":\"2016-04-30 19:05:56.0\",\"errorList\":\"200008,200009,200010,205001,205002,\",\"errors\":\"[{\\\"createTime\\\":\\\"2016-04-01 12:14:20.0\\\",\\\"errorCode\\\":\\\"205002\\\",\\\"errorId\\\":\\\"5d232003-0991-40f0-b955-62a8cee30313\\\",\\\"errorMsg\\\":\\\"用户未登录\\\",\\\"moduleId\\\":\\\"9e6596c1-9fda-4cd2-b20a-1cce7e572a65\\\",\\\"moduleName\\\":\\\"示例项目\\\",\\\"sequence\\\":0,\\\"status\\\":1},{\\\"createTime\\\":\\\"2016-04-01 12:14:20.0\\\",\\\"errorCode\\\":\\\"200008\\\",\\\"errorId\\\":\\\"7d2a5131-af7d-48a8-a78b-b4a194c5602f\\\",\\\"errorMsg\\\":\\\"网络异常,请稍后重试\\\",\\\"moduleId\\\":\\\"9e6596c1-9fda-4cd2-b20a-1cce7e572a65\\\",\\\"moduleName\\\":\\\"示例项目\\\",\\\"sequence\\\":0,\\\"status\\\":1},{\\\"createTime\\\":\\\"2016-04-01 12:14:20.0\\\",\\\"errorCode\\\":\\\"200009\\\",\\\"errorId\\\":\\\"a53c9cfe-b7cb-4ffe-be0e-29cbe94b84b1\\\",\\\"errorMsg\\\":\\\"not have right\\\",\\\"moduleId\\\":\\\"9e6596c1-9fda-4cd2-b20a-1cce7e572a65\\\",\\\"moduleName\\\":\\\"示例项目\\\",\\\"sequence\\\":0,\\\"status\\\":1},{\\\"createTime\\\":\\\"2016-04-01 12:14:20.0\\\",\\\"errorCode\\\":\\\"200010\\\",\\\"errorId\\\":\\\"d2d7e8b7-d649-4d82-b5c5-8e9562ad8f2c\\\",\\\"errorMsg\\\":\\\"生成token失败\\\",\\\"moduleId\\\":\\\"9e6596c1-9fda-4cd2-b20a-1cce7e572a65\\\",\\\"moduleName\\\":\\\"示例项目\\\",\\\"sequence\\\":0,\\\"status\\\":1},{\\\"createTime\\\":\\\"2016-04-01 12:14:20.0\\\",\\\"errorCode\\\":\\\"205001\\\",\\\"errorId\\\":\\\"ec2a3cd4-375d-412d-b456-bd00b72ab12a\\\",\\\"errorMsg\\\":\\\"当前用户不合法\\\",\\\"moduleId\\\":\\\"9e6596c1-9fda-4cd2-b20a-1cce7e572a65\\\",\\\"moduleName\\\":\\\"示例项目\\\",\\\"sequence\\\":0,\\\"status\\\":1}]\",\"falseExam\":\"{\\n \\\"success\\\":1,\\n \\\"data\\\":[\\n {\\n \\\"suId\\\":\\\"1253\\\",\\n \\\"suCode\\\":\\\"157416\\\",\\n \\\"skuCode\\\":null,\\n \\\"modelId\\\":12587\\n }\\n ],\\n \\\"error\\\":null\\n}\",\"id\":\"6cd58bc6-edb9-46b8-9d4f-0b3cdef10a2d\",\"interfaceName\":\"获取购物车列表数据集\",\"logRemark\":\"获取购物车列表数据集\",\"method\":\"post and get\",\"moduleId\":\"189d073c-b4ea-4e50-a1c1-f66ec1da1dd4\",\"moduleName\":\"示例模块\",\"param\":\"[{\\\"name\\\":\\\"renderParams\\\",\\\"necessary\\\":\\\"true\\\",\\\"type\\\":\\\"String\\\",\\\"parameterType\\\":\\\"undefined\\\",\\\"remark\\\":\\\"渲染参数\\\"},{\\\"name\\\":\\\"userid\\\",\\\"necessary\\\":\\\"true\\\",\\\"type\\\":\\\"int\\\",\\\"parameterType\\\":\\\"PARAMETER\\\",\\\"remark\\\":\\\"用户id\\\"}]\",\"remark\":\"不可定制面是不需要在用户的定制面列表里面出现\",\"requestExam\":\"请求地址:http://xxx/product/info/render2.do\\r\\n请求头:\\r\\n请求参数:\\r\\n\\trenderParams=xxxx\\r\\n\\tuserid=xxxx\\r\\n\",\"responseParam\":\"[{\\\"name\\\":\\\"CannotChangeMaterials\\\",\\\"type\\\":\\\"String\\\",\\\"remark\\\":\\\"被关联的面与材料(不可修改的面+材料)\\\"},{\\\"name\\\":\\\"sudata\\\",\\\"type\\\":\\\"String\\\",\\\"remark\\\":\\\"商品信息\\\"},{\\\"name\\\":\\\"sizeList\\\",\\\"type\\\":\\\"String\\\",\\\"remark\\\":\\\"尺码列表\\\"},{\\\"name\\\":\\\"NotShowComponents\\\",\\\"type\\\":\\\"String\\\",\\\"remark\\\":\\\"不可定制面的集合\\\"}]\",\"sequence\":0,\"status\":1,\"trueExam\":\"{\\n \\\"success\\\":1,\\n \\\"data\\\":[\\n {\\n \\\"suId\\\":\\\"1253\\\",\\n \\\"suCode\\\":\\\"157416\\\",\\n \\\"skuCode\\\":null,\\n \\\"modelId\\\":12587\\n }\\n ],\\n \\\"error\\\":null\\n}\",\"updateBy\":\"userName:super | trueName:测试用户\",\"updateTime\":\"2016-05-05 14:54:00.0\",\"url\":\"http://xxx/product/info/render2.do\",\"version\":\"3.0\"}','6cd58bc6-edb9-46b8-9d4f-0b3cdef10a2d'),('1334b7b7-a21b-4abe-9447-71201b2b2b93',0,'2016-06-09 17:39:09',0,'Interface','接口','UPDATE','admin','修改:百度天气预报接口','{\"createTime\":\"2016-04-10 23:23:56.0\",\"errorList\":\"000001,000002,000003,000004,000005,000006,000007,000008,000009,000010,\",\"errors\":\"[{\\\"createTime\\\":\\\"2016-04-01 12:14:20.0\\\",\\\"errorCode\\\":\\\"000007\\\",\\\"errorId\\\":\\\"0173ac20-bb4d-4704-8a85-1077dc9b84d0\\\",\\\"errorMsg\\\":\\\"活动尚未开始,申请失败!\\\",\\\"moduleId\\\":\\\"62bde6e0-988b-475f-bfdf-76203455ec57\\\",\\\"moduleName\\\":\\\"常用免费常用接口\\\",\\\"sequence\\\":0,\\\"status\\\":1},{\\\"createTime\\\":\\\"2016-04-01 12:14:20.0\\\",\\\"errorCode\\\":\\\"000002\\\",\\\"errorId\\\":\\\"3c692a35-19c3-48d4-b2c7-e854208963c2\\\",\\\"errorMsg\\\":\\\"授权验证失败\\\",\\\"moduleId\\\":\\\"62bde6e0-988b-475f-bfdf-76203455ec57\\\",\\\"moduleName\\\":\\\"常用免费常用接口\\\",\\\"sequence\\\":0,\\\"status\\\":1},{\\\"createTime\\\":\\\"2016-04-01 12:14:20.0\\\",\\\"errorCode\\\":\\\"000003\\\",\\\"errorId\\\":\\\"720934d6-59f8-46d8-8a4a-28a9653e1353\\\",\\\"errorMsg\\\":\\\"API接口异常错误\\\",\\\"moduleId\\\":\\\"62bde6e0-988b-475f-bfdf-76203455ec57\\\",\\\"moduleName\\\":\\\"常用免费常用接口\\\",\\\"sequence\\\":0,\\\"status\\\":1},{\\\"createTime\\\":\\\"2016-04-01 12:14:20.0\\\",\\\"errorCode\\\":\\\"000001\\\",\\\"errorId\\\":\\\"82e675b4-0c11-414d-8640-91ddead4f3b1\\\",\\\"errorMsg\\\":\\\"系统未知错误\\\",\\\"moduleId\\\":\\\"62bde6e0-988b-475f-bfdf-76203455ec57\\\",\\\"moduleName\\\":\\\"常用免费常用接口\\\",\\\"sequence\\\":0,\\\"status\\\":1},{\\\"createTime\\\":\\\"2016-04-01 12:14:20.0\\\",\\\"errorCode\\\":\\\"000010\\\",\\\"errorId\\\":\\\"8507a333-d404-4665-87ae-81553747c777\\\",\\\"errorMsg\\\":\\\"已被抢光|商品太热门啦,瞬间就被抢光啦~\\\",\\\"moduleId\\\":\\\"62bde6e0-988b-475f-bfdf-76203455ec57\\\",\\\"moduleName\\\":\\\"常用免费常用接口\\\",\\\"sequence\\\":0,\\\"status\\\":1},{\\\"createTime\\\":\\\"2016-04-01 12:14:20.0\\\",\\\"errorCode\\\":\\\"000008\\\",\\\"errorId\\\":\\\"97b85c51-3e42-4825-aa05-d29e8f527ecb\\\",\\\"errorMsg\\\":\\\"任务完成|小伙伴们太给力了,砍价任务已经完成啦~\\\",\\\"moduleId\\\":\\\"62bde6e0-988b-475f-bfdf-76203455ec57\\\",\\\"moduleName\\\":\\\"常用免费常用接口\\\",\\\"sequence\\\":0,\\\"status\\\":1},{\\\"createTime\\\":\\\"2016-04-01 12:14:20.0\\\",\\\"errorCode\\\":\\\"000006\\\",\\\"errorId\\\":\\\"c0b52782-9fda-4859-93ad-f752c40f3853\\\",\\\"errorMsg\\\":\\\"已被抢光|商品太热门啦,瞬间就被抢光啦~\\\",\\\"moduleId\\\":\\\"62bde6e0-988b-475f-bfdf-76203455ec57\\\",\\\"moduleName\\\":\\\"常用免费常用接口\\\",\\\"sequence\\\":0,\\\"status\\\":1},{\\\"createTime\\\":\\\"2016-04-01 12:14:20.0\\\",\\\"errorCode\\\":\\\"000009\\\",\\\"errorId\\\":\\\"def6f8fd-569f-479d-8b6b-69bc0427963b\\\",\\\"errorMsg\\\":\\\"已被抢光|当前活动已结束,感谢参与~\\\",\\\"moduleId\\\":\\\"62bde6e0-988b-475f-bfdf-76203455ec57\\\",\\\"moduleName\\\":\\\"常用免费常用接口\\\",\\\"sequence\\\":0,\\\"status\\\":1},{\\\"createTime\\\":\\\"2016-04-01 12:14:20.0\\\",\\\"errorCode\\\":\\\"000005\\\",\\\"errorId\\\":\\\"fc547387-7858-4fcc-b0d1-6c9f6aeb3bb5\\\",\\\"errorMsg\\\":\\\"很抱歉,您已参与试用活动,在此活动结束后您可再次参与其它活动!\\\",\\\"moduleId\\\":\\\"62bde6e0-988b-475f-bfdf-76203455ec57\\\",\\\"moduleName\\\":\\\"常用免费常用接口\\\",\\\"sequence\\\":0,\\\"status\\\":1}]\",\"falseExam\":\"\",\"id\":\"b89bc4dc-92ab-47be-b29e-f32d87c7b9e0\",\"interfaceName\":\"百度天气预报接口\",\"logRemark\":\"百度天气预报接口\",\"method\":\"POST,GET,\",\"moduleId\":\"62bde6e0-988b-475f-bfdf-76203455ec57\",\"moduleName\":\"常用免费常用接口\",\"param\":\"[{\\\"name\\\":\\\"location\\\",\\\"necessary\\\":\\\"true\\\",\\\"type\\\":\\\"String\\\",\\\"parameterType\\\":\\\"PARAMETER\\\",\\\"remark\\\":\\\"输入城市名或经纬度,城市名称如:北京或者131,经纬度格式为lng,lat坐标如: location=116.305145,39.982368\\\"},{\\\"name\\\":\\\"output\\\",\\\"necessary\\\":\\\"false\\\",\\\"type\\\":\\\"String\\\",\\\"parameterType\\\":\\\"PARAMETER\\\",\\\"remark\\\":\\\"输出的数据格式,默认为xml格式,当output设置为’json’时,输出的为json格式的数据;\\\"},{\\\"name\\\":\\\"coord_type\\\",\\\"necessary\\\":\\\"false\\\",\\\"type\\\":\\\"String\\\",\\\"parameterType\\\":\\\"PARAMETER\\\",\\\"remark\\\":\\\"请求参数坐标类型,默认为gcj02经纬度坐标。允许的值为bd09ll、bd09mc、gcj02、wgs84。bd09ll表示百度经纬度坐标,bd09mc表示百度墨卡托坐标,gcj02表示经过国测局加密的坐标。wgs84表示gps获取的坐标。\\\"},{\\\"name\\\":\\\"ak\\\",\\\"necessary\\\":\\\"true\\\",\\\"type\\\":\\\"String\\\",\\\"parameterType\\\":\\\"PARAMETER\\\",\\\"remark\\\":\\\"百度ak,需要申请\\\"}]\",\"remark\":\"