Full Code of hzcforever/nowcoder-project for AI

master aaf6d36983d7 cached
250 files
5.7 MB
1.5M tokens
1046 symbols
1 requests
Download .txt
Showing preview only (6,076K chars total). Download the full file or copy to clipboard to get everything.
Repository: hzcforever/nowcoder-project
Branch: master
Commit: aaf6d36983d7
Files: 250
Total size: 5.7 MB

Directory structure:
gitextract_xieu8nyq/

├── README.md
├── wenda/
│   ├── .idea/
│   │   ├── compiler.xml
│   │   ├── encodings.xml
│   │   ├── inspectionProfiles/
│   │   │   └── Project_Default.xml
│   │   ├── libraries/
│   │   │   ├── Maven__antlr_antlr_2_7_7.xml
│   │   │   ├── Maven__aopalliance_aopalliance_1_0.xml
│   │   │   ├── Maven__ch_qos_logback_logback_classic_1_1_7.xml
│   │   │   ├── Maven__ch_qos_logback_logback_core_1_1_7.xml
│   │   │   ├── Maven__com_alibaba_fastjson_1_2_13.xml
│   │   │   ├── Maven__com_fasterxml_classmate_1_1_0.xml
│   │   │   ├── Maven__com_fasterxml_jackson_core_jackson_annotations_2_6_7.xml
│   │   │   ├── Maven__com_fasterxml_jackson_core_jackson_core_2_6_7.xml
│   │   │   ├── Maven__com_fasterxml_jackson_core_jackson_databind_2_6_7.xml
│   │   │   ├── Maven__com_google_protobuf_protobuf_java_2_6_0.xml
│   │   │   ├── Maven__commons_beanutils_commons_beanutils_1_9_2.xml
│   │   │   ├── Maven__commons_chain_commons_chain_1_1.xml
│   │   │   ├── Maven__commons_collections_commons_collections_3_2_2.xml
│   │   │   ├── Maven__commons_digester_commons_digester_2_1.xml
│   │   │   ├── Maven__commons_lang_commons_lang_2_4.xml
│   │   │   ├── Maven__commons_validator_commons_validator_1_3_1.xml
│   │   │   ├── Maven__dom4j_dom4j_1_1.xml
│   │   │   ├── Maven__javax_activation_activation_1_1.xml
│   │   │   ├── Maven__javax_mail_mail_1_4_7.xml
│   │   │   ├── Maven__javax_validation_validation_api_1_1_0_Final.xml
│   │   │   ├── Maven__junit_junit_4_12.xml
│   │   │   ├── Maven__mysql_mysql_connector_java_8_0_12.xml
│   │   │   ├── Maven__org_apache_commons_commons_pool2_2_4_2.xml
│   │   │   ├── Maven__org_apache_struts_struts_core_1_3_8.xml
│   │   │   ├── Maven__org_apache_struts_struts_taglib_1_3_8.xml
│   │   │   ├── Maven__org_apache_struts_struts_tiles_1_3_8.xml
│   │   │   ├── Maven__org_apache_tomcat_embed_tomcat_embed_core_8_0_36.xml
│   │   │   ├── Maven__org_apache_tomcat_embed_tomcat_embed_el_8_0_36.xml
│   │   │   ├── Maven__org_apache_tomcat_embed_tomcat_embed_logging_juli_8_0_36.xml
│   │   │   ├── Maven__org_apache_tomcat_embed_tomcat_embed_websocket_8_0_36.xml
│   │   │   ├── Maven__org_apache_tomcat_tomcat_jdbc_8_0_36.xml
│   │   │   ├── Maven__org_apache_tomcat_tomcat_juli_8_0_36.xml
│   │   │   ├── Maven__org_apache_velocity_velocity_1_7.xml
│   │   │   ├── Maven__org_apache_velocity_velocity_tools_2_0.xml
│   │   │   ├── Maven__org_aspectj_aspectjweaver_1_8_9.xml
│   │   │   ├── Maven__org_hamcrest_hamcrest_core_1_3.xml
│   │   │   ├── Maven__org_hamcrest_hamcrest_library_1_3.xml
│   │   │   ├── Maven__org_hibernate_hibernate_validator_5_2_4_Final.xml
│   │   │   ├── Maven__org_jboss_logging_jboss_logging_3_3_0_Final.xml
│   │   │   ├── Maven__org_mockito_mockito_core_1_10_19.xml
│   │   │   ├── Maven__org_mybatis_mybatis_3_4_0.xml
│   │   │   ├── Maven__org_mybatis_mybatis_spring_1_3_0.xml
│   │   │   ├── Maven__org_mybatis_spring_boot_mybatis_spring_boot_autoconfigure_1_1_1.xml
│   │   │   ├── Maven__org_mybatis_spring_boot_mybatis_spring_boot_starter_1_1_1.xml
│   │   │   ├── Maven__org_objenesis_objenesis_2_1.xml
│   │   │   ├── Maven__org_slf4j_jcl_over_slf4j_1_7_21.xml
│   │   │   ├── Maven__org_slf4j_jul_to_slf4j_1_7_21.xml
│   │   │   ├── Maven__org_slf4j_log4j_over_slf4j_1_7_21.xml
│   │   │   ├── Maven__org_slf4j_slf4j_api_1_7_21.xml
│   │   │   ├── Maven__org_springframework_boot_spring_boot_1_3_6_RELEASE.xml
│   │   │   ├── Maven__org_springframework_boot_spring_boot_autoconfigure_1_3_6_RELEASE.xml
│   │   │   ├── Maven__org_springframework_boot_spring_boot_devtools_1_3_6_RELEASE.xml
│   │   │   ├── Maven__org_springframework_boot_spring_boot_starter_1_3_6_RELEASE.xml
│   │   │   ├── Maven__org_springframework_boot_spring_boot_starter_aop_1_3_6_RELEASE.xml
│   │   │   ├── Maven__org_springframework_boot_spring_boot_starter_jdbc_1_3_6_RELEASE.xml
│   │   │   ├── Maven__org_springframework_boot_spring_boot_starter_logging_1_3_6_RELEASE.xml
│   │   │   ├── Maven__org_springframework_boot_spring_boot_starter_test_1_3_6_RELEASE.xml
│   │   │   ├── Maven__org_springframework_boot_spring_boot_starter_tomcat_1_3_6_RELEASE.xml
│   │   │   ├── Maven__org_springframework_boot_spring_boot_starter_validation_1_3_6_RELEASE.xml
│   │   │   ├── Maven__org_springframework_boot_spring_boot_starter_velocity_1_3_6_RELEASE.xml
│   │   │   ├── Maven__org_springframework_boot_spring_boot_starter_web_1_3_6_RELEASE.xml
│   │   │   ├── Maven__org_springframework_spring_aop_4_2_7_RELEASE.xml
│   │   │   ├── Maven__org_springframework_spring_beans_4_2_7_RELEASE.xml
│   │   │   ├── Maven__org_springframework_spring_context_4_2_7_RELEASE.xml
│   │   │   ├── Maven__org_springframework_spring_context_support_4_2_7_RELEASE.xml
│   │   │   ├── Maven__org_springframework_spring_core_4_2_7_RELEASE.xml
│   │   │   ├── Maven__org_springframework_spring_expression_4_2_7_RELEASE.xml
│   │   │   ├── Maven__org_springframework_spring_jdbc_4_2_7_RELEASE.xml
│   │   │   ├── Maven__org_springframework_spring_test_4_2_7_RELEASE.xml
│   │   │   ├── Maven__org_springframework_spring_tx_4_2_7_RELEASE.xml
│   │   │   ├── Maven__org_springframework_spring_web_4_2_7_RELEASE.xml
│   │   │   ├── Maven__org_springframework_spring_webmvc_4_2_7_RELEASE.xml
│   │   │   ├── Maven__org_yaml_snakeyaml_1_16.xml
│   │   │   ├── Maven__oro_oro_2_0_8.xml
│   │   │   ├── Maven__redis_clients_jedis_2_9_0.xml
│   │   │   └── Maven__sslext_sslext_1_2_0.xml
│   │   ├── misc.xml
│   │   ├── modules.xml
│   │   └── workspace.xml
│   ├── .mvn/
│   │   └── wrapper/
│   │       ├── maven-wrapper.jar
│   │       └── maven-wrapper.properties
│   ├── mvnw
│   ├── mvnw.cmd
│   ├── pom.xml
│   ├── pyspider/
│   │   ├── conf.json
│   │   └── data/
│   │       ├── scheduler.1d
│   │       ├── scheduler.1h
│   │       └── scheduler.all
│   ├── src/
│   │   ├── main/
│   │   │   ├── java/
│   │   │   │   └── com/
│   │   │   │       └── nowcoder/
│   │   │   │           ├── WendaApplication.java
│   │   │   │           ├── aspect/
│   │   │   │           │   └── LogAspect.java
│   │   │   │           ├── async/
│   │   │   │           │   ├── EventConsumer.java
│   │   │   │           │   ├── EventHandler.java
│   │   │   │           │   ├── EventModel.java
│   │   │   │           │   ├── EventProducer.java
│   │   │   │           │   ├── EventType.java
│   │   │   │           │   └── handler/
│   │   │   │           │       ├── FeedHandler.java
│   │   │   │           │       ├── FollowHandler.java
│   │   │   │           │       ├── LikeHandler.java
│   │   │   │           │       └── LoginExceptionHandler.java
│   │   │   │           ├── configuration/
│   │   │   │           │   └── WendaWebConfiguration.java
│   │   │   │           ├── controller/
│   │   │   │           │   ├── CommentController.java
│   │   │   │           │   ├── FeedController.java
│   │   │   │           │   ├── FollowController.java
│   │   │   │           │   ├── HomeController.java
│   │   │   │           │   ├── IndexController.java
│   │   │   │           │   ├── LikeController.java
│   │   │   │           │   ├── LoginController.java
│   │   │   │           │   ├── MessageController.java
│   │   │   │           │   ├── QuestionController.java
│   │   │   │           │   └── SettingController.java
│   │   │   │           ├── dao/
│   │   │   │           │   ├── CommentDAO.java
│   │   │   │           │   ├── FeedDAO.java
│   │   │   │           │   ├── LoginTicketDAO.java
│   │   │   │           │   ├── MessageDAO.java
│   │   │   │           │   ├── QuestionDAO.java
│   │   │   │           │   └── UserDAO.java
│   │   │   │           ├── interceptor/
│   │   │   │           │   ├── LoginRequredInterceptor.java
│   │   │   │           │   └── PassportInterceptor.java
│   │   │   │           ├── model/
│   │   │   │           │   ├── Comment.java
│   │   │   │           │   ├── EntityType.java
│   │   │   │           │   ├── Feed.java
│   │   │   │           │   ├── HostHolder.java
│   │   │   │           │   ├── LoginTicket.java
│   │   │   │           │   ├── Message.java
│   │   │   │           │   ├── Question.java
│   │   │   │           │   ├── User.java
│   │   │   │           │   └── ViewObject.java
│   │   │   │           ├── service/
│   │   │   │           │   ├── CommentService.java
│   │   │   │           │   ├── FeedService.java
│   │   │   │           │   ├── FollowService.java
│   │   │   │           │   ├── LikeService.java
│   │   │   │           │   ├── LoginTicketService.java
│   │   │   │           │   ├── MessageService.java
│   │   │   │           │   ├── QuestionService.java
│   │   │   │           │   ├── SensitiveService.java
│   │   │   │           │   ├── UserService.java
│   │   │   │           │   └── WendaService.java
│   │   │   │           └── util/
│   │   │   │               ├── JedisAdapter.java
│   │   │   │               ├── MailSender.java
│   │   │   │               ├── RedisKeyUtil.java
│   │   │   │               └── WendaUtil.java
│   │   │   └── resources/
│   │   │       ├── SensitiveWords.txt
│   │   │       ├── application.properties
│   │   │       ├── com/
│   │   │       │   └── nowcoder/
│   │   │       │       └── dao/
│   │   │       │           ├── FeedDAO.xml
│   │   │       │           └── QuestionDAO.xml
│   │   │       ├── mybatis-config.xml
│   │   │       ├── static/
│   │   │       │   ├── scripts/
│   │   │       │   │   ├── base.fb262f0e.js
│   │   │       │   │   ├── common.fed5411f.js
│   │   │       │   │   ├── ga.js
│   │   │       │   │   ├── instant.e7a17de6.js
│   │   │       │   │   ├── main/
│   │   │       │   │   │   ├── base/
│   │   │       │   │   │   │   ├── base.js
│   │   │       │   │   │   │   ├── event.js
│   │   │       │   │   │   │   └── util.js
│   │   │       │   │   │   ├── component/
│   │   │       │   │   │   │   ├── component.js
│   │   │       │   │   │   │   ├── popup.js
│   │   │       │   │   │   │   ├── popupAdd.js
│   │   │       │   │   │   │   └── popupMsg.js
│   │   │       │   │   │   ├── jquery.js
│   │   │       │   │   │   ├── site/
│   │   │       │   │   │   │   ├── detail.js
│   │   │       │   │   │   │   ├── follow.js
│   │   │       │   │   │   │   ├── home.js
│   │   │       │   │   │   │   └── profile.js
│   │   │       │   │   │   └── util/
│   │   │       │   │   │       ├── action.js
│   │   │       │   │   │       └── business.js
│   │   │       │   │   ├── page-index.d7b54ac7.js
│   │   │       │   │   ├── page-main.5d4c554d.js
│   │   │       │   │   ├── richtexteditor.aa0a4005.js
│   │   │       │   │   └── vendor.ff76fbae.js
│   │   │       │   └── styles/
│   │   │       │       ├── detail.css
│   │   │       │       ├── index.css
│   │   │       │       ├── letter.css
│   │   │       │       ├── login.css
│   │   │       │       └── result.css
│   │   │       ├── templates/
│   │   │       │   ├── detail.html
│   │   │       │   ├── error.html
│   │   │       │   ├── feeds.html
│   │   │       │   ├── followees.html
│   │   │       │   ├── followers.html
│   │   │       │   ├── footer.html
│   │   │       │   ├── header.html
│   │   │       │   ├── home.html
│   │   │       │   ├── index.html
│   │   │       │   ├── js.html
│   │   │       │   ├── letter.html
│   │   │       │   ├── letterDetail.html
│   │   │       │   ├── login.html
│   │   │       │   ├── mails/
│   │   │       │   │   └── login_exception.html
│   │   │       │   ├── profile.html
│   │   │       │   └── result.html
│   │   │       └── toolbox.xml
│   │   └── test/
│   │       ├── java/
│   │       │   └── com/
│   │       │       └── nowcoder/
│   │       │           ├── InitDatabaseTests.java
│   │       │           ├── ThreadTest.java
│   │       │           └── WendaApplicationTests.java
│   │       └── resources/
│   │           └── init-schema.sql
│   ├── target/
│   │   ├── classes/
│   │   │   ├── SensitiveWords.txt
│   │   │   ├── application.properties
│   │   │   ├── com/
│   │   │   │   └── nowcoder/
│   │   │   │       └── dao/
│   │   │   │           ├── FeedDAO.xml
│   │   │   │           └── QuestionDAO.xml
│   │   │   ├── mybatis-config.xml
│   │   │   ├── static/
│   │   │   │   ├── scripts/
│   │   │   │   │   ├── base.fb262f0e.js
│   │   │   │   │   ├── common.fed5411f.js
│   │   │   │   │   ├── ga.js
│   │   │   │   │   ├── instant.e7a17de6.js
│   │   │   │   │   ├── main/
│   │   │   │   │   │   ├── base/
│   │   │   │   │   │   │   ├── base.js
│   │   │   │   │   │   │   ├── event.js
│   │   │   │   │   │   │   └── util.js
│   │   │   │   │   │   ├── component/
│   │   │   │   │   │   │   ├── component.js
│   │   │   │   │   │   │   ├── popup.js
│   │   │   │   │   │   │   ├── popupAdd.js
│   │   │   │   │   │   │   └── popupMsg.js
│   │   │   │   │   │   ├── jquery.js
│   │   │   │   │   │   ├── site/
│   │   │   │   │   │   │   ├── detail.js
│   │   │   │   │   │   │   ├── follow.js
│   │   │   │   │   │   │   ├── home.js
│   │   │   │   │   │   │   └── profile.js
│   │   │   │   │   │   └── util/
│   │   │   │   │   │       ├── action.js
│   │   │   │   │   │       └── business.js
│   │   │   │   │   ├── page-index.d7b54ac7.js
│   │   │   │   │   ├── page-main.5d4c554d.js
│   │   │   │   │   ├── richtexteditor.aa0a4005.js
│   │   │   │   │   └── vendor.ff76fbae.js
│   │   │   │   └── styles/
│   │   │   │       ├── detail.css
│   │   │   │       ├── index.css
│   │   │   │       ├── letter.css
│   │   │   │       ├── login.css
│   │   │   │       └── result.css
│   │   │   ├── templates/
│   │   │   │   ├── detail.html
│   │   │   │   ├── error.html
│   │   │   │   ├── feeds.html
│   │   │   │   ├── followees.html
│   │   │   │   ├── followers.html
│   │   │   │   ├── footer.html
│   │   │   │   ├── header.html
│   │   │   │   ├── home.html
│   │   │   │   ├── index.html
│   │   │   │   ├── js.html
│   │   │   │   ├── letter.html
│   │   │   │   ├── letterDetail.html
│   │   │   │   ├── login.html
│   │   │   │   ├── mails/
│   │   │   │   │   └── login_exception.html
│   │   │   │   ├── profile.html
│   │   │   │   └── result.html
│   │   │   └── toolbox.xml
│   │   └── test-classes/
│   │       └── init-schema.sql
│   └── wenda.iml
└── wenda.sql

================================================
FILE CONTENTS
================================================

================================================
FILE: README.md
================================================
# nowcoder问答平台

**本项目是一个基于 SpringBoot 的问答平台。数据库使用了 redis 和 mysql,实现注册登录、点赞点踩、评论站内信、Timeline 事件流等功能,同时通过一个异步消息框架来实现事件的异步处理,并使用爬虫对网站进行数据填充。**

## 目录

- [项目的基本框架及配置](#项目的基本框架及配置)
- [AOP 和 IOC](#AOP-和-IOC)
- [MySQL 和 MyBatis](#MySQL-和-MyBatis)
- [注册与登录的实现](#注册与登录的实现)
- [发表问题和敏感词过滤](#发表问题和敏感词过滤)
- [发表评论和站内信](#发表评论和站内信)
- [Redis 实现点赞和点踩功能](#Redis-实现点赞和点踩功能)
- [异步消息机制](#异步消息机制)
- [关注和粉丝列表的实现](#关注和粉丝列表的实现)
- [推拉模式下的 Feed 流](#推拉模式下的-Feed-流)
- [使用爬虫对网站进行数据填充](#使用爬虫对网站进行数据填充)
- [将项目部署到 Linux 虚拟机](#将项目部署到-Linux-虚拟机)
- [功能扩展](#功能扩展)

## 项目的基本框架及配置 ##

创建 git 仓库,本地配置 IDEA 并测试 pull 和 push。
    
创建 SpringBoot 工程,导入 web,velocity 和 aop 的包。
    
生成 maven 项目,pom.xml 包含上述依赖。
    
Controller 中使用注解配置,requestmapping,responsebody 基本可以解决请求转发以及响应内容的渲染。responsebody 自动选择 viewresolver 进行解析。

使用 pathvariable 和 requestparam 传递参数,使用 velocity 编写页面模板,注意其中的语法使用。常用 $!{} 和 ${}。
    
使用 HTTP 规范下的 httpservletrequest 和 httpservletresponse 来封装请求和相响应,使用封装好的 session 和 cookie 对象。
    
使用重定向的 redirectview 和统一异常处理器 exceptionhandler。

## AOP 和 IOC ##

IOC 解决对象实例化以及依赖传递问题,解耦。
    
AOP 解决纵向切面问题,主要实现日志和权限控制功能。
    
Aspect 实现切面,并且使用 logger 来记录日志,用该切面的切面方法来监听 Controller。

有关 Spring 框架中 IOC 容器和 AOP 动态代理的相关知识可参见 [simple-spring](https://github.com/hzcforever/simple-spring)。

## MySQL 和 MyBatis ##

使用 MySQL 创建数据库和表。
    
加入 MyBatis和 MySQL 的 maven 仓库,注意,由于现在版本的 SpringBoot 不再支持 velocity 进而导致我使用较早版本的 SpringBoot,所以这里提供一可以正常运行的版本设置。

SpringBoot 使用1.4.0,mybatis-spring-boot-starter 使用1.2.1,mysql-connector-java 使用8.0.12。
    
注意 MyBatis 的注解语法以及 xml 的配置要求,xml 要求放在 resource 中并且与 DAO 接口在相同的包路径下。
    
application.properties 增加 Spring 配置数据库链接地址。
    
两个小工具:

- ViewObject:方便传递任何数据到
- VelocityDateTool:velocity 自带工具类
    
写好静态文件 html、css 和 js,并且注意配置。

- spring.velocity.suffix=.html 保证跳转请求转发到 html 上
- spring.velocity.toolbox-config-location=toolbox.xml

## 注册与登录的实现 ##

新建数据表 login_ticket 用来存储 ticket 字段。该字段在用户登录成功时被生成并存入数据库,并被设置为 Cookie,下次用户登录时会带上这个 ticket,ticket 是随机的 UUID 字符串,有过期时间以及有效状态。

使用拦截器 interceptor 来拦截所有用户请求,判断请求中是否存在有效的 ticket,如果有就将用户信息写入 Threadlocal。所有线程的 threadlocal 都被存在一个叫做 hostholder 的实例中,根据该实例就可以在全局任意位置获取用户的信息。

该 ticket 的功能类似 Session,也是通过 Cookie 写回浏览器,浏览器请求时再通过 Cookie 传递,区别是该字段是存在数据库中的,并且可以用于移动端。

通过用户访问权限拦截器来拦截用户的越界访问,比如用户没有管理员权限就不能访问管理员页面。

数据安全性的保障手段:HTTPS 使用公钥加密私钥解密,比如支付宝的密码加密,单点登录验证,验证码机制等。

## 发表问题和敏感词过滤 ##

发布问题时检查标题和内容,防止 xss 注入,并且过滤敏感词。

防止 xss 注入直接使用 HTMLutils 的方法即可实现。

过滤敏感词首先需要建立一个字典树,并且读取一份保存敏感词的文本文件,然后初始化字典树。最后将过滤器作为一个服务,让需要过滤敏感词的服务进行调用即可。

## 发表评论和站内信 ##

首先建立表 comment 和 message 分别代表评论和站内信。

评论的逻辑是每一个问题下面都有评论,显示评论数量,具体内容,评论人等信息。

消息的逻辑是,两个用户之间发送一条消息,有一个唯一的会话 id,这个会话里可以有多条这两个用户的交互信息。通过一个用户 id 获取该用户的会话列表,再根据会话 id 再获取具体的会话内的多条消息。

逻辑清楚之后,再加上一些附加功能,比如显示未读消息数量,根据时间顺序排列会话和消息。

本节内容基本就是业务逻辑的开发,没有新增什么技术点,主要是前后端交互的逻辑比较复杂,前端的开发量也比较大。

## Redis 实现点赞和点踩功能 ##

首先了解一下 Redis 的基础知识,数据结构,Jedis 使用等。

编写list,string,hashmap,set,sortset的测试用例,熟悉 Jedis API。

开发点踩和点赞功能,在此之前根据业务封装好 Jedis 的增删改查操作,放在 util 包中。

根据需求确定 key 字段,格式是——like:实体类型:实体id 和 dislike:实体类型:实体 id。这样可以将喜欢一条新闻的人存在一个集合,不喜欢的存在另一个集合。通过统计数量可以获得点赞和点踩数。

一般点赞点踩操作是先修改 Redis 的值并获取返回值,然后再异步修改 MySQL 数据库的 likecount 数值。这样既可以保证点赞操作快速完成,也可保证数据一致性。

## 异步消息机制 ##

在之前的功能中有一些不需要实时执行的操作或者任务,我们可以把它们改造成异步消息来进行发送。

具体操作就是使用 Redis 来实现异步消息队列。代码中使用事件 Event 来包装一个事件,事件需要记录事件实体的各种信息:一个异步工具类(事件生产者 + 事件消费者 + EventHandler 接口),让以后各种事件的实现类来实现这个接口。

事件生产者一般作为一个服务,由 Controller 中的业务逻辑调用并产生一个事件,将事件序列化存入 Redis 队列中,事件消费者则通过一个线程循环获取队列里的事件,并且寻找对应的 handler 进行处理。

整个异步事件的框架开发完成,后面新加入的登录,点赞等事件都可以这么实现。

## 关注和粉丝列表的实现 ##

新增关注功能,使用 Redis 实现每一个关注对象的粉丝列表以及每一个用户的关注对象列表。通过该列表的 crud 操作可以对应获取粉丝列表和关注列表,并且实现关注和取关功能。

由于关注成功和添加粉丝成功时同一个事务里的两个操作,可以使用 Redis 的事务 multi 来包装事务并进行提交。

除此之外,关注成功或者被关注还可以通过事件机制来生成发送邮件的事件,由异步的队列处理器来完成事件响应,同样是根据 Redis 来实现。

对于粉丝列表,除了显示粉丝的基本信息之外,还要显示当前用户是否关注了这个粉丝,以便前端显示。

对于关注列表来说,如果被关注对象是用户的话,除了显示用户的基本信息之外,还要显示当前用户是被这个用户关注,以便前端显示。

## 推拉模式下的 Feed 流 ##

微博的新鲜事功能介绍:关注好友的动态(好友的点赞和发表的问题等),关注了某个问题,这些都是 feed 流的一部分。

在知乎中的 feed 流主要体现于:关注用户的评论行为,关注用户的关注问题行为。

feed 流主要分为两种,推模式和拉模式。推模式主要是把新鲜事推送给关注该用户的粉丝,本例使用 Redis 来存储某个用户接受的新鲜事 id 列表,这个信息流又称为 timeline,根据用户的唯一 key 来存储;拉模式主要是用户直接找寻自己所有关注的人,并且到数据库去查找这些关注对象的新鲜事,直接返回。

推模式主要适合粉丝较少的小用户,因为他们的粉丝量少,使用推模式产生的冗余副本也比较少,并且可以减少用户访问的压力。

拉模式主要适合大v,因为很多僵尸粉和非活跃用户根本不需要推送信息,用推模式发给这些僵尸粉或者非活跃用户就是浪费资源。所以让用户通过拉模式请求,只需要一个数据副本即可。同时如果是热点信息,这些信息也可以放在缓存,让用户首先拉取这些信息,提高查询效率。

使用 feedhandler 异步处理上述的两个事件,当事件发生时,根据事件实体进行重新包装,构造一个新鲜事,因为所有新鲜事的格式是一样的。需要包括:日期,新鲜事类型,发起者,新鲜事内容,然后把该数据存入数据库,以便用户使用 pull 模式拉出。

为了适配推送模式,此时也要把新鲜事放到该用户所有粉丝的 timeline 里,这样的话就同时实现了推和拉的操作了。

## 使用爬虫对网站进行数据填充 ##

安装 Python3.x 并且配置环境变量。同时安装 PyCharm ,安装 pip。

安装好以后,先熟悉 Python 的语法,写一些例子,比如数据类型,操作符,方法调用,以及面向对象的技术。

因为数据是要导入数据库的,所以这里安装 MySQLdb 的一个库,并且写一下连接数据库的代码,写一下简单的crud进行测试。

使用 requests 库作为解析 HTTP 请求的工具,使用 beautifulsoup 作为解析 html 代码的工具,请求之后直接使用 css 选择器匹配。即可获得内容。

当然现在我们有更方便的工具 pyspider,可以方便解析请求并且可以设置代理,伪装身份等,直接传入 url 并且写好多级的解析函数,程序便会迭代执行,直到把所有页面的内容解析出来。这里我们直接启动 pyspider 的 web 应用并且写好 Python 代码,就可以执行爬虫了。

知乎:先找到问题,再把问题下所有的回答进行爬取,最后把问题和评论一起处理。

## 将项目部署到 Linux 虚拟机

因为该项目只是个练手的 demo,没有必要买服务器,所以就打算直接部署到虚拟机上,把整个软件开发的流程过一遍。安装的是 VMware,下载的镜像是 CentOS 7 x86_64,依次安装了 JDK 1.8、Tomcat 8、MySQL 8.0 和 Redis(所有的配置过程网上博客都写得很详细,这里不加赘述)。

<div align="center"><img src="/img//vm.png" width=""/></div>

通过 Xshell 6 连接虚拟机。

把从 IDEA 编译导出的 jar 包发到虚拟机的文件夹,通过 `java -jar 文件名.jar` 将项目部署到 CentOS 上,当看到下面两个红色矩形框中的信息时,说明部署成功。

<div align="center"><img src="/img//wenda1.png" width=""/></div><br/>

<div align="center"><img src="/img//wenda2.png" width=""/></div>

在主机上通过虚拟机的 ip 和对应的端口访问网页(相关功能请自行 fork 后导入 IDEA 并启动,在这里简要贴出几张效果图以便参考):

<div align="center"><img src="/img//wenda3.png" width=""/></div><br/>

<div align="center"><img src="/img//wenda4.png" width=""/></div><br/>

<div align="center"><img src="/img//wenda5.png" width=""/></div>

## 功能扩展 ##

- 用户注册,邮箱激活流程
- 管理员后台管理
- timeline 推拉结合
- 个性化首页,timeline 更多事件
- 搜索结果排序打分
- 通过 MQ 实现解耦、异步和削峰

......




================================================
FILE: wenda/.idea/compiler.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="CompilerConfiguration">
    <annotationProcessing>
      <profile name="Maven default annotation processors profile" enabled="true">
        <sourceOutputDir name="target/generated-sources/annotations" />
        <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
        <outputRelativeToContentRoot value="true" />
        <module name="wenda" />
      </profile>
    </annotationProcessing>
    <bytecodeTargetLevel>
      <module name="wenda" target="1.8" />
    </bytecodeTargetLevel>
  </component>
</project>

================================================
FILE: wenda/.idea/encodings.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="Encoding">
    <file url="file://$PROJECT_DIR$" charset="UTF-8" />
  </component>
</project>

================================================
FILE: wenda/.idea/inspectionProfiles/Project_Default.xml
================================================
<component name="InspectionProjectProfileManager">
  <profile version="1.0">
    <option name="myName" value="Project Default" />
    <inspection_tool class="Duplicates" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
  </profile>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__antlr_antlr_2_7_7.xml
================================================
<component name="libraryTable">
  <library name="Maven: antlr:antlr:2.7.7">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/antlr/antlr/2.7.7/antlr-2.7.7.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/antlr/antlr/2.7.7/antlr-2.7.7-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/antlr/antlr/2.7.7/antlr-2.7.7-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__aopalliance_aopalliance_1_0.xml
================================================
<component name="libraryTable">
  <library name="Maven: aopalliance:aopalliance:1.0">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/aopalliance/aopalliance/1.0/aopalliance-1.0.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/aopalliance/aopalliance/1.0/aopalliance-1.0-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/aopalliance/aopalliance/1.0/aopalliance-1.0-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__ch_qos_logback_logback_classic_1_1_7.xml
================================================
<component name="libraryTable">
  <library name="Maven: ch.qos.logback:logback-classic:1.1.7">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/ch/qos/logback/logback-classic/1.1.7/logback-classic-1.1.7.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/ch/qos/logback/logback-classic/1.1.7/logback-classic-1.1.7-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/ch/qos/logback/logback-classic/1.1.7/logback-classic-1.1.7-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__ch_qos_logback_logback_core_1_1_7.xml
================================================
<component name="libraryTable">
  <library name="Maven: ch.qos.logback:logback-core:1.1.7">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/ch/qos/logback/logback-core/1.1.7/logback-core-1.1.7.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/ch/qos/logback/logback-core/1.1.7/logback-core-1.1.7-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/ch/qos/logback/logback-core/1.1.7/logback-core-1.1.7-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__com_alibaba_fastjson_1_2_13.xml
================================================
<component name="libraryTable">
  <library name="Maven: com.alibaba:fastjson:1.2.13">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/com/alibaba/fastjson/1.2.13/fastjson-1.2.13.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/com/alibaba/fastjson/1.2.13/fastjson-1.2.13-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/com/alibaba/fastjson/1.2.13/fastjson-1.2.13-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__com_fasterxml_classmate_1_1_0.xml
================================================
<component name="libraryTable">
  <library name="Maven: com.fasterxml:classmate:1.1.0">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/classmate/1.1.0/classmate-1.1.0.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/classmate/1.1.0/classmate-1.1.0-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/classmate/1.1.0/classmate-1.1.0-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_6_7.xml
================================================
<component name="libraryTable">
  <library name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.6.7">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-annotations/2.6.7/jackson-annotations-2.6.7.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-annotations/2.6.7/jackson-annotations-2.6.7-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-annotations/2.6.7/jackson-annotations-2.6.7-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_6_7.xml
================================================
<component name="libraryTable">
  <library name="Maven: com.fasterxml.jackson.core:jackson-core:2.6.7">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-core/2.6.7/jackson-core-2.6.7.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-core/2.6.7/jackson-core-2.6.7-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-core/2.6.7/jackson-core-2.6.7-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_6_7.xml
================================================
<component name="libraryTable">
  <library name="Maven: com.fasterxml.jackson.core:jackson-databind:2.6.7">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.6.7/jackson-databind-2.6.7.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.6.7/jackson-databind-2.6.7-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.6.7/jackson-databind-2.6.7-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__com_google_protobuf_protobuf_java_2_6_0.xml
================================================
<component name="libraryTable">
  <library name="Maven: com.google.protobuf:protobuf-java:2.6.0">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/com/google/protobuf/protobuf-java/2.6.0/protobuf-java-2.6.0.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/com/google/protobuf/protobuf-java/2.6.0/protobuf-java-2.6.0-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/com/google/protobuf/protobuf-java/2.6.0/protobuf-java-2.6.0-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__commons_beanutils_commons_beanutils_1_9_2.xml
================================================
<component name="libraryTable">
  <library name="Maven: commons-beanutils:commons-beanutils:1.9.2">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/commons-beanutils/commons-beanutils/1.9.2/commons-beanutils-1.9.2.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/commons-beanutils/commons-beanutils/1.9.2/commons-beanutils-1.9.2-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/commons-beanutils/commons-beanutils/1.9.2/commons-beanutils-1.9.2-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__commons_chain_commons_chain_1_1.xml
================================================
<component name="libraryTable">
  <library name="Maven: commons-chain:commons-chain:1.1">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/commons-chain/commons-chain/1.1/commons-chain-1.1.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/commons-chain/commons-chain/1.1/commons-chain-1.1-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/commons-chain/commons-chain/1.1/commons-chain-1.1-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__commons_collections_commons_collections_3_2_2.xml
================================================
<component name="libraryTable">
  <library name="Maven: commons-collections:commons-collections:3.2.2">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/commons-collections/commons-collections/3.2.2/commons-collections-3.2.2.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/commons-collections/commons-collections/3.2.2/commons-collections-3.2.2-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/commons-collections/commons-collections/3.2.2/commons-collections-3.2.2-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__commons_digester_commons_digester_2_1.xml
================================================
<component name="libraryTable">
  <library name="Maven: commons-digester:commons-digester:2.1">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/commons-digester/commons-digester/2.1/commons-digester-2.1.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/commons-digester/commons-digester/2.1/commons-digester-2.1-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/commons-digester/commons-digester/2.1/commons-digester-2.1-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__commons_lang_commons_lang_2_4.xml
================================================
<component name="libraryTable">
  <library name="Maven: commons-lang:commons-lang:2.4">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/commons-lang/commons-lang/2.4/commons-lang-2.4.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/commons-lang/commons-lang/2.4/commons-lang-2.4-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/commons-lang/commons-lang/2.4/commons-lang-2.4-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__commons_validator_commons_validator_1_3_1.xml
================================================
<component name="libraryTable">
  <library name="Maven: commons-validator:commons-validator:1.3.1">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/commons-validator/commons-validator/1.3.1/commons-validator-1.3.1.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/commons-validator/commons-validator/1.3.1/commons-validator-1.3.1-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/commons-validator/commons-validator/1.3.1/commons-validator-1.3.1-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__dom4j_dom4j_1_1.xml
================================================
<component name="libraryTable">
  <library name="Maven: dom4j:dom4j:1.1">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/dom4j/dom4j/1.1/dom4j-1.1.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/dom4j/dom4j/1.1/dom4j-1.1-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/dom4j/dom4j/1.1/dom4j-1.1-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__javax_activation_activation_1_1.xml
================================================
<component name="libraryTable">
  <library name="Maven: javax.activation:activation:1.1">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/javax/activation/activation/1.1/activation-1.1.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/javax/activation/activation/1.1/activation-1.1-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/javax/activation/activation/1.1/activation-1.1-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__javax_mail_mail_1_4_7.xml
================================================
<component name="libraryTable">
  <library name="Maven: javax.mail:mail:1.4.7">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/javax/mail/mail/1.4.7/mail-1.4.7.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/javax/mail/mail/1.4.7/mail-1.4.7-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/javax/mail/mail/1.4.7/mail-1.4.7-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__javax_validation_validation_api_1_1_0_Final.xml
================================================
<component name="libraryTable">
  <library name="Maven: javax.validation:validation-api:1.1.0.Final">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/javax/validation/validation-api/1.1.0.Final/validation-api-1.1.0.Final.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/javax/validation/validation-api/1.1.0.Final/validation-api-1.1.0.Final-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/javax/validation/validation-api/1.1.0.Final/validation-api-1.1.0.Final-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__junit_junit_4_12.xml
================================================
<component name="libraryTable">
  <library name="Maven: junit:junit:4.12">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/junit/junit/4.12/junit-4.12.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/junit/junit/4.12/junit-4.12-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/junit/junit/4.12/junit-4.12-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__mysql_mysql_connector_java_8_0_12.xml
================================================
<component name="libraryTable">
  <library name="Maven: mysql:mysql-connector-java:8.0.12">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/mysql/mysql-connector-java/8.0.12/mysql-connector-java-8.0.12.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/mysql/mysql-connector-java/8.0.12/mysql-connector-java-8.0.12-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/mysql/mysql-connector-java/8.0.12/mysql-connector-java-8.0.12-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_apache_commons_commons_pool2_2_4_2.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.apache.commons:commons-pool2:2.4.2">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/commons/commons-pool2/2.4.2/commons-pool2-2.4.2.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/commons/commons-pool2/2.4.2/commons-pool2-2.4.2-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/commons/commons-pool2/2.4.2/commons-pool2-2.4.2-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_apache_struts_struts_core_1_3_8.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.apache.struts:struts-core:1.3.8">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/struts/struts-core/1.3.8/struts-core-1.3.8.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/struts/struts-core/1.3.8/struts-core-1.3.8-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/struts/struts-core/1.3.8/struts-core-1.3.8-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_apache_struts_struts_taglib_1_3_8.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.apache.struts:struts-taglib:1.3.8">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/struts/struts-taglib/1.3.8/struts-taglib-1.3.8.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/struts/struts-taglib/1.3.8/struts-taglib-1.3.8-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/struts/struts-taglib/1.3.8/struts-taglib-1.3.8-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_apache_struts_struts_tiles_1_3_8.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.apache.struts:struts-tiles:1.3.8">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/struts/struts-tiles/1.3.8/struts-tiles-1.3.8.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/struts/struts-tiles/1.3.8/struts-tiles-1.3.8-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/struts/struts-tiles/1.3.8/struts-tiles-1.3.8-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_core_8_0_36.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.apache.tomcat.embed:tomcat-embed-core:8.0.36">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/embed/tomcat-embed-core/8.0.36/tomcat-embed-core-8.0.36.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/embed/tomcat-embed-core/8.0.36/tomcat-embed-core-8.0.36-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/embed/tomcat-embed-core/8.0.36/tomcat-embed-core-8.0.36-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_el_8_0_36.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.apache.tomcat.embed:tomcat-embed-el:8.0.36">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/embed/tomcat-embed-el/8.0.36/tomcat-embed-el-8.0.36.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/embed/tomcat-embed-el/8.0.36/tomcat-embed-el-8.0.36-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/embed/tomcat-embed-el/8.0.36/tomcat-embed-el-8.0.36-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_logging_juli_8_0_36.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.apache.tomcat.embed:tomcat-embed-logging-juli:8.0.36">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/embed/tomcat-embed-logging-juli/8.0.36/tomcat-embed-logging-juli-8.0.36.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/embed/tomcat-embed-logging-juli/8.0.36/tomcat-embed-logging-juli-8.0.36-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/embed/tomcat-embed-logging-juli/8.0.36/tomcat-embed-logging-juli-8.0.36-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_websocket_8_0_36.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:8.0.36">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/embed/tomcat-embed-websocket/8.0.36/tomcat-embed-websocket-8.0.36.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/embed/tomcat-embed-websocket/8.0.36/tomcat-embed-websocket-8.0.36-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/embed/tomcat-embed-websocket/8.0.36/tomcat-embed-websocket-8.0.36-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_apache_tomcat_tomcat_jdbc_8_0_36.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.apache.tomcat:tomcat-jdbc:8.0.36">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/tomcat-jdbc/8.0.36/tomcat-jdbc-8.0.36.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/tomcat-jdbc/8.0.36/tomcat-jdbc-8.0.36-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/tomcat-jdbc/8.0.36/tomcat-jdbc-8.0.36-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_apache_tomcat_tomcat_juli_8_0_36.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.apache.tomcat:tomcat-juli:8.0.36">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/tomcat-juli/8.0.36/tomcat-juli-8.0.36.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/tomcat-juli/8.0.36/tomcat-juli-8.0.36-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/tomcat-juli/8.0.36/tomcat-juli-8.0.36-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_apache_velocity_velocity_1_7.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.apache.velocity:velocity:1.7">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/velocity/velocity/1.7/velocity-1.7.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/velocity/velocity/1.7/velocity-1.7-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/velocity/velocity/1.7/velocity-1.7-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_apache_velocity_velocity_tools_2_0.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.apache.velocity:velocity-tools:2.0">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/velocity/velocity-tools/2.0/velocity-tools-2.0.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/velocity/velocity-tools/2.0/velocity-tools-2.0-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/apache/velocity/velocity-tools/2.0/velocity-tools-2.0-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_aspectj_aspectjweaver_1_8_9.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.aspectj:aspectjweaver:1.8.9">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/aspectj/aspectjweaver/1.8.9/aspectjweaver-1.8.9.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/aspectj/aspectjweaver/1.8.9/aspectjweaver-1.8.9-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/aspectj/aspectjweaver/1.8.9/aspectjweaver-1.8.9-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.hamcrest:hamcrest-core:1.3">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_hamcrest_hamcrest_library_1_3.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.hamcrest:hamcrest-library:1.3">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-library/1.3/hamcrest-library-1.3.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-library/1.3/hamcrest-library-1.3-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-library/1.3/hamcrest-library-1.3-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_hibernate_hibernate_validator_5_2_4_Final.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.hibernate:hibernate-validator:5.2.4.Final">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/hibernate/hibernate-validator/5.2.4.Final/hibernate-validator-5.2.4.Final.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/hibernate/hibernate-validator/5.2.4.Final/hibernate-validator-5.2.4.Final-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/hibernate/hibernate-validator/5.2.4.Final/hibernate-validator-5.2.4.Final-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_3_0_Final.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.jboss.logging:jboss-logging:3.3.0.Final">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/jboss/logging/jboss-logging/3.3.0.Final/jboss-logging-3.3.0.Final.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/jboss/logging/jboss-logging/3.3.0.Final/jboss-logging-3.3.0.Final-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/jboss/logging/jboss-logging/3.3.0.Final/jboss-logging-3.3.0.Final-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_mockito_mockito_core_1_10_19.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.mockito:mockito-core:1.10.19">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/mockito/mockito-core/1.10.19/mockito-core-1.10.19.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/mockito/mockito-core/1.10.19/mockito-core-1.10.19-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/mockito/mockito-core/1.10.19/mockito-core-1.10.19-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_mybatis_mybatis_3_4_0.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.mybatis:mybatis:3.4.0">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/mybatis/mybatis/3.4.0/mybatis-3.4.0.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/mybatis/mybatis/3.4.0/mybatis-3.4.0-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/mybatis/mybatis/3.4.0/mybatis-3.4.0-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_mybatis_mybatis_spring_1_3_0.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.mybatis:mybatis-spring:1.3.0">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/mybatis/mybatis-spring/1.3.0/mybatis-spring-1.3.0.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/mybatis/mybatis-spring/1.3.0/mybatis-spring-1.3.0-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/mybatis/mybatis-spring/1.3.0/mybatis-spring-1.3.0-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_mybatis_spring_boot_mybatis_spring_boot_autoconfigure_1_1_1.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:1.1.1">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/mybatis/spring/boot/mybatis-spring-boot-autoconfigure/1.1.1/mybatis-spring-boot-autoconfigure-1.1.1.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/mybatis/spring/boot/mybatis-spring-boot-autoconfigure/1.1.1/mybatis-spring-boot-autoconfigure-1.1.1-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/mybatis/spring/boot/mybatis-spring-boot-autoconfigure/1.1.1/mybatis-spring-boot-autoconfigure-1.1.1-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_mybatis_spring_boot_mybatis_spring_boot_starter_1_1_1.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:1.1.1">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/mybatis/spring/boot/mybatis-spring-boot-starter/1.1.1/mybatis-spring-boot-starter-1.1.1.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/mybatis/spring/boot/mybatis-spring-boot-starter/1.1.1/mybatis-spring-boot-starter-1.1.1-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/mybatis/spring/boot/mybatis-spring-boot-starter/1.1.1/mybatis-spring-boot-starter-1.1.1-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_objenesis_objenesis_2_1.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.objenesis:objenesis:2.1">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/objenesis/objenesis/2.1/objenesis-2.1.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/objenesis/objenesis/2.1/objenesis-2.1-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/objenesis/objenesis/2.1/objenesis-2.1-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_slf4j_jcl_over_slf4j_1_7_21.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.slf4j:jcl-over-slf4j:1.7.21">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/slf4j/jcl-over-slf4j/1.7.21/jcl-over-slf4j-1.7.21.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/slf4j/jcl-over-slf4j/1.7.21/jcl-over-slf4j-1.7.21-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/slf4j/jcl-over-slf4j/1.7.21/jcl-over-slf4j-1.7.21-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_slf4j_jul_to_slf4j_1_7_21.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.slf4j:jul-to-slf4j:1.7.21">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/slf4j/jul-to-slf4j/1.7.21/jul-to-slf4j-1.7.21.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/slf4j/jul-to-slf4j/1.7.21/jul-to-slf4j-1.7.21-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/slf4j/jul-to-slf4j/1.7.21/jul-to-slf4j-1.7.21-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_slf4j_log4j_over_slf4j_1_7_21.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.slf4j:log4j-over-slf4j:1.7.21">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/slf4j/log4j-over-slf4j/1.7.21/log4j-over-slf4j-1.7.21.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/slf4j/log4j-over-slf4j/1.7.21/log4j-over-slf4j-1.7.21-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/slf4j/log4j-over-slf4j/1.7.21/log4j-over-slf4j-1.7.21-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_21.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.slf4j:slf4j-api:1.7.21">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.21/slf4j-api-1.7.21.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.21/slf4j-api-1.7.21-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.21/slf4j-api-1.7.21-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_springframework_boot_spring_boot_1_3_6_RELEASE.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.springframework.boot:spring-boot:1.3.6.RELEASE">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot/1.3.6.RELEASE/spring-boot-1.3.6.RELEASE.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot/1.3.6.RELEASE/spring-boot-1.3.6.RELEASE-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot/1.3.6.RELEASE/spring-boot-1.3.6.RELEASE-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_1_3_6_RELEASE.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.springframework.boot:spring-boot-autoconfigure:1.3.6.RELEASE">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-autoconfigure/1.3.6.RELEASE/spring-boot-autoconfigure-1.3.6.RELEASE.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-autoconfigure/1.3.6.RELEASE/spring-boot-autoconfigure-1.3.6.RELEASE-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-autoconfigure/1.3.6.RELEASE/spring-boot-autoconfigure-1.3.6.RELEASE-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_springframework_boot_spring_boot_devtools_1_3_6_RELEASE.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.springframework.boot:spring-boot-devtools:1.3.6.RELEASE">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-devtools/1.3.6.RELEASE/spring-boot-devtools-1.3.6.RELEASE.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-devtools/1.3.6.RELEASE/spring-boot-devtools-1.3.6.RELEASE-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-devtools/1.3.6.RELEASE/spring-boot-devtools-1.3.6.RELEASE-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_1_3_6_RELEASE.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.springframework.boot:spring-boot-starter:1.3.6.RELEASE">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter/1.3.6.RELEASE/spring-boot-starter-1.3.6.RELEASE.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter/1.3.6.RELEASE/spring-boot-starter-1.3.6.RELEASE-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter/1.3.6.RELEASE/spring-boot-starter-1.3.6.RELEASE-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_aop_1_3_6_RELEASE.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.springframework.boot:spring-boot-starter-aop:1.3.6.RELEASE">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-aop/1.3.6.RELEASE/spring-boot-starter-aop-1.3.6.RELEASE.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-aop/1.3.6.RELEASE/spring-boot-starter-aop-1.3.6.RELEASE-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-aop/1.3.6.RELEASE/spring-boot-starter-aop-1.3.6.RELEASE-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_jdbc_1_3_6_RELEASE.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.springframework.boot:spring-boot-starter-jdbc:1.3.6.RELEASE">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-jdbc/1.3.6.RELEASE/spring-boot-starter-jdbc-1.3.6.RELEASE.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-jdbc/1.3.6.RELEASE/spring-boot-starter-jdbc-1.3.6.RELEASE-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-jdbc/1.3.6.RELEASE/spring-boot-starter-jdbc-1.3.6.RELEASE-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_1_3_6_RELEASE.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.springframework.boot:spring-boot-starter-logging:1.3.6.RELEASE">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-logging/1.3.6.RELEASE/spring-boot-starter-logging-1.3.6.RELEASE.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-logging/1.3.6.RELEASE/spring-boot-starter-logging-1.3.6.RELEASE-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-logging/1.3.6.RELEASE/spring-boot-starter-logging-1.3.6.RELEASE-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_test_1_3_6_RELEASE.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.springframework.boot:spring-boot-starter-test:1.3.6.RELEASE">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-test/1.3.6.RELEASE/spring-boot-starter-test-1.3.6.RELEASE.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-test/1.3.6.RELEASE/spring-boot-starter-test-1.3.6.RELEASE-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-test/1.3.6.RELEASE/spring-boot-starter-test-1.3.6.RELEASE-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_tomcat_1_3_6_RELEASE.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.springframework.boot:spring-boot-starter-tomcat:1.3.6.RELEASE">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-tomcat/1.3.6.RELEASE/spring-boot-starter-tomcat-1.3.6.RELEASE.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-tomcat/1.3.6.RELEASE/spring-boot-starter-tomcat-1.3.6.RELEASE-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-tomcat/1.3.6.RELEASE/spring-boot-starter-tomcat-1.3.6.RELEASE-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_validation_1_3_6_RELEASE.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.springframework.boot:spring-boot-starter-validation:1.3.6.RELEASE">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-validation/1.3.6.RELEASE/spring-boot-starter-validation-1.3.6.RELEASE.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-validation/1.3.6.RELEASE/spring-boot-starter-validation-1.3.6.RELEASE-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-validation/1.3.6.RELEASE/spring-boot-starter-validation-1.3.6.RELEASE-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_velocity_1_3_6_RELEASE.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.springframework.boot:spring-boot-starter-velocity:1.3.6.RELEASE">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-velocity/1.3.6.RELEASE/spring-boot-starter-velocity-1.3.6.RELEASE.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-velocity/1.3.6.RELEASE/spring-boot-starter-velocity-1.3.6.RELEASE-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-velocity/1.3.6.RELEASE/spring-boot-starter-velocity-1.3.6.RELEASE-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_web_1_3_6_RELEASE.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.springframework.boot:spring-boot-starter-web:1.3.6.RELEASE">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-web/1.3.6.RELEASE/spring-boot-starter-web-1.3.6.RELEASE.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-web/1.3.6.RELEASE/spring-boot-starter-web-1.3.6.RELEASE-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-web/1.3.6.RELEASE/spring-boot-starter-web-1.3.6.RELEASE-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_springframework_spring_aop_4_2_7_RELEASE.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.springframework:spring-aop:4.2.7.RELEASE">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-aop/4.2.7.RELEASE/spring-aop-4.2.7.RELEASE.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-aop/4.2.7.RELEASE/spring-aop-4.2.7.RELEASE-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-aop/4.2.7.RELEASE/spring-aop-4.2.7.RELEASE-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_springframework_spring_beans_4_2_7_RELEASE.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.springframework:spring-beans:4.2.7.RELEASE">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-beans/4.2.7.RELEASE/spring-beans-4.2.7.RELEASE.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-beans/4.2.7.RELEASE/spring-beans-4.2.7.RELEASE-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-beans/4.2.7.RELEASE/spring-beans-4.2.7.RELEASE-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_springframework_spring_context_4_2_7_RELEASE.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.springframework:spring-context:4.2.7.RELEASE">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-context/4.2.7.RELEASE/spring-context-4.2.7.RELEASE.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-context/4.2.7.RELEASE/spring-context-4.2.7.RELEASE-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-context/4.2.7.RELEASE/spring-context-4.2.7.RELEASE-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_springframework_spring_context_support_4_2_7_RELEASE.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.springframework:spring-context-support:4.2.7.RELEASE">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-context-support/4.2.7.RELEASE/spring-context-support-4.2.7.RELEASE.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-context-support/4.2.7.RELEASE/spring-context-support-4.2.7.RELEASE-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-context-support/4.2.7.RELEASE/spring-context-support-4.2.7.RELEASE-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_springframework_spring_core_4_2_7_RELEASE.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.springframework:spring-core:4.2.7.RELEASE">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-core/4.2.7.RELEASE/spring-core-4.2.7.RELEASE.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-core/4.2.7.RELEASE/spring-core-4.2.7.RELEASE-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-core/4.2.7.RELEASE/spring-core-4.2.7.RELEASE-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_springframework_spring_expression_4_2_7_RELEASE.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.springframework:spring-expression:4.2.7.RELEASE">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-expression/4.2.7.RELEASE/spring-expression-4.2.7.RELEASE.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-expression/4.2.7.RELEASE/spring-expression-4.2.7.RELEASE-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-expression/4.2.7.RELEASE/spring-expression-4.2.7.RELEASE-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_springframework_spring_jdbc_4_2_7_RELEASE.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.springframework:spring-jdbc:4.2.7.RELEASE">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-jdbc/4.2.7.RELEASE/spring-jdbc-4.2.7.RELEASE.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-jdbc/4.2.7.RELEASE/spring-jdbc-4.2.7.RELEASE-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-jdbc/4.2.7.RELEASE/spring-jdbc-4.2.7.RELEASE-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_springframework_spring_test_4_2_7_RELEASE.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.springframework:spring-test:4.2.7.RELEASE">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-test/4.2.7.RELEASE/spring-test-4.2.7.RELEASE.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-test/4.2.7.RELEASE/spring-test-4.2.7.RELEASE-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-test/4.2.7.RELEASE/spring-test-4.2.7.RELEASE-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_springframework_spring_tx_4_2_7_RELEASE.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.springframework:spring-tx:4.2.7.RELEASE">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-tx/4.2.7.RELEASE/spring-tx-4.2.7.RELEASE.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-tx/4.2.7.RELEASE/spring-tx-4.2.7.RELEASE-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-tx/4.2.7.RELEASE/spring-tx-4.2.7.RELEASE-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_springframework_spring_web_4_2_7_RELEASE.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.springframework:spring-web:4.2.7.RELEASE">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-web/4.2.7.RELEASE/spring-web-4.2.7.RELEASE.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-web/4.2.7.RELEASE/spring-web-4.2.7.RELEASE-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-web/4.2.7.RELEASE/spring-web-4.2.7.RELEASE-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_springframework_spring_webmvc_4_2_7_RELEASE.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.springframework:spring-webmvc:4.2.7.RELEASE">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-webmvc/4.2.7.RELEASE/spring-webmvc-4.2.7.RELEASE.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-webmvc/4.2.7.RELEASE/spring-webmvc-4.2.7.RELEASE-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-webmvc/4.2.7.RELEASE/spring-webmvc-4.2.7.RELEASE-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__org_yaml_snakeyaml_1_16.xml
================================================
<component name="libraryTable">
  <library name="Maven: org.yaml:snakeyaml:1.16">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/org/yaml/snakeyaml/1.16/snakeyaml-1.16.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/org/yaml/snakeyaml/1.16/snakeyaml-1.16-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/org/yaml/snakeyaml/1.16/snakeyaml-1.16-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__oro_oro_2_0_8.xml
================================================
<component name="libraryTable">
  <library name="Maven: oro:oro:2.0.8">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/oro/oro/2.0.8/oro-2.0.8.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/oro/oro/2.0.8/oro-2.0.8-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/oro/oro/2.0.8/oro-2.0.8-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__redis_clients_jedis_2_9_0.xml
================================================
<component name="libraryTable">
  <library name="Maven: redis.clients:jedis:2.9.0">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/redis/clients/jedis/2.9.0/jedis-2.9.0.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/redis/clients/jedis/2.9.0/jedis-2.9.0-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/redis/clients/jedis/2.9.0/jedis-2.9.0-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/libraries/Maven__sslext_sslext_1_2_0.xml
================================================
<component name="libraryTable">
  <library name="Maven: sslext:sslext:1.2-0">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/sslext/sslext/1.2-0/sslext-1.2-0.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/sslext/sslext/1.2-0/sslext-1.2-0-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/sslext/sslext/1.2-0/sslext-1.2-0-sources.jar!/" />
    </SOURCES>
  </library>
</component>

================================================
FILE: wenda/.idea/misc.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="MavenProjectsManager">
    <option name="originalFiles">
      <list>
        <option value="$PROJECT_DIR$/pom.xml" />
      </list>
    </option>
  </component>
  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
    <output url="file://$PROJECT_DIR$/classes" />
  </component>
</project>

================================================
FILE: wenda/.idea/modules.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ProjectModuleManager">
    <modules>
      <module fileurl="file://$PROJECT_DIR$/wenda.iml" filepath="$PROJECT_DIR$/wenda.iml" />
    </modules>
  </component>
</project>

================================================
FILE: wenda/.idea/workspace.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ChangeListManager">
    <list default="true" id="576c5a3b-01a8-4a05-bab4-cadd65481fe9" name="Default Changelist" comment="" />
    <ignored path="$PROJECT_DIR$/target/" />
    <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
    <option name="SHOW_DIALOG" value="false" />
    <option name="HIGHLIGHT_CONFLICTS" value="true" />
    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
    <option name="LAST_RESOLUTION" value="IGNORE" />
  </component>
  <component name="CodeInsightWorkspaceSettings">
    <option name="optimizeImportsOnTheFly" value="true" />
  </component>
  <component name="FUSProjectUsageTrigger">
    <session id="-1770025365">
      <usages-collector id="statistics.lifecycle.project">
        <counts>
          <entry key="project.closed" value="35" />
          <entry key="project.open.time.10" value="2" />
          <entry key="project.open.time.2" value="1" />
          <entry key="project.open.time.3" value="1" />
          <entry key="project.open.time.4" value="11" />
          <entry key="project.open.time.5" value="14" />
          <entry key="project.open.time.6" value="2" />
          <entry key="project.open.time.7" value="2" />
          <entry key="project.open.time.8" value="2" />
          <entry key="project.opened" value="35" />
        </counts>
      </usages-collector>
      <usages-collector id="statistics.file.extensions.open">
        <counts>
          <entry key="WebMvcConfigurerAdapter" value="1" />
          <entry key="class" value="1" />
          <entry key="css" value="5" />
          <entry key="html" value="81" />
          <entry key="java" value="259" />
          <entry key="js" value="30" />
          <entry key="pom" value="1" />
          <entry key="properties" value="4" />
          <entry key="txt" value="6" />
          <entry key="xml" value="15" />
        </counts>
      </usages-collector>
      <usages-collector id="statistics.file.types.open">
        <counts>
          <entry key="CLASS" value="1" />
          <entry key="CSS" value="5" />
          <entry key="HTML" value="81" />
          <entry key="JAVA" value="259" />
          <entry key="JavaScript" value="30" />
          <entry key="PLAIN_TEXT" value="6" />
          <entry key="Properties" value="4" />
          <entry key="UML" value="1" />
          <entry key="XML" value="16" />
        </counts>
      </usages-collector>
      <usages-collector id="statistics.file.extensions.edit">
        <counts>
          <entry key="html" value="277" />
          <entry key="java" value="23106" />
          <entry key="properties" value="11" />
          <entry key="txt" value="16" />
          <entry key="xml" value="220" />
        </counts>
      </usages-collector>
      <usages-collector id="statistics.file.types.edit">
        <counts>
          <entry key="HTML" value="277" />
          <entry key="JAVA" value="23106" />
          <entry key="PLAIN_TEXT" value="16" />
          <entry key="Properties" value="11" />
          <entry key="SQL" value="5" />
          <entry key="XML" value="215" />
        </counts>
      </usages-collector>
    </session>
  </component>
  <component name="FileEditorManager">
    <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
      <file pinned="false" current-in-tab="false">
        <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/dao/FeedDAO.java">
          <provider selected="true" editor-type-id="text-editor">
            <state>
              <caret line="24" column="29" selection-start-line="24" selection-start-column="29" selection-end-line="24" selection-end-column="29" />
              <folding>
                <element signature="imports" expanded="true" />
              </folding>
            </state>
          </provider>
        </entry>
      </file>
      <file pinned="false" current-in-tab="false">
        <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/service/FeedService.java">
          <provider selected="true" editor-type-id="text-editor">
            <state relative-caret-position="216">
              <caret line="14" column="49" selection-start-line="14" selection-start-column="49" selection-end-line="14" selection-end-column="49" />
              <folding>
                <element signature="imports" expanded="true" />
                <element signature="e#599#600#0" expanded="true" />
                <element signature="e#645#646#0" expanded="true" />
              </folding>
            </state>
          </provider>
        </entry>
      </file>
      <file pinned="false" current-in-tab="false">
        <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/async/handler/FeedHandler.java">
          <provider selected="true" editor-type-id="text-editor">
            <state relative-caret-position="1584">
              <caret line="80" column="74" selection-start-line="80" selection-start-column="74" selection-end-line="80" selection-end-column="74" />
            </state>
          </provider>
        </entry>
      </file>
      <file pinned="false" current-in-tab="true">
        <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/controller/FeedController.java">
          <provider selected="true" editor-type-id="text-editor">
            <state relative-caret-position="152">
              <caret line="32" column="40" selection-start-line="32" selection-start-column="40" selection-end-line="32" selection-end-column="40" />
            </state>
          </provider>
        </entry>
      </file>
    </leaf>
  </component>
  <component name="FileTemplateManagerImpl">
    <option name="RECENT_TEMPLATES">
      <list>
        <option value="HTML File" />
        <option value="Interface" />
        <option value="Class" />
      </list>
    </option>
  </component>
  <component name="FindInProjectRecents">
    <findStrings>
      <find>head</find>
      <find>注册</find>
      <find>top-nav</find>
      <find>next</find>
      <find>提问</find>
      <find>login</find>
      <find>reglo</find>
      <find>reglog</find>
      <find>wrap</find>
      <find>人赞同</find>
      <find>评论</find>
      <find>format</find>
      <find>data.</find>
      <find>followUsers</find>
    </findStrings>
  </component>
  <component name="Git.Settings">
    <option name="ROOT_SYNC" value="DONT_SYNC" />
  </component>
  <component name="IdeDocumentHistory">
    <option name="CHANGED_PATHS">
      <list>
        <option value="$PROJECT_DIR$/src/main/resources/static/scripts/main/site/detail.js" />
        <option value="$PROJECT_DIR$/src/main/resources/static/scripts/aza-0.1.1.min.js" />
        <option value="$PROJECT_DIR$/src/test/java/com/nowcoder/ThreadTest.java" />
        <option value="$PROJECT_DIR$/src/main/resources/SensitiveWords.txt" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/model/Comment.java" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/aspect/LogAspect.java" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/model/EntityType.java" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/dao/QuestionDAO.java" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/service/QuestionService.java" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/controller/CommentController.java" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/model/Message.java" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/service/UserService.java" />
        <option value="$PROJECT_DIR$/src/main/resources/templates/letterDetail.html" />
        <option value="$PROJECT_DIR$/src/main/resources/templates/letter.html" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/service/MessageService.java" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/controller/MessageController.java" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/dao/MessageDAO.java" />
        <option value="$PROJECT_DIR$/src/main/resources/static/styles/detail.css" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/service/LikeService.java" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/async/EventProducer.java" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/async/EventHandler.java" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/async/EventConsumer.java" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/async/handler/LikeHandler.java" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/controller/LikeController.java" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/async/EventModel.java" />
        <option value="$PROJECT_DIR$/pom.xml" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/async/handler/LoginExceptionHandler.java" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/controller/LoginController.java" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/util/MailSender.java" />
        <option value="$PROJECT_DIR$/src/test/java/com/nowcoder/InitDatabaseTests.java" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/async/EventType.java" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/async/handler/FollowHandler.java" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/service/FollowService.java" />
        <option value="$PROJECT_DIR$/src/main/resources/templates/profile.html" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/dao/CommentDAO.java" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/service/CommentService.java" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/controller/HomeController.java" />
        <option value="$PROJECT_DIR$/src/main/resources/templates/detail.html" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/controller/QuestionController.java" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/service/SensitiveService.java" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/dao/FeedDAO.java" />
        <option value="$PROJECT_DIR$/src/main/resources/com/nowcoder/dao/FeedDAO.xml" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/service/FeedService.java" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/util/WendaUtil.java" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/controller/FollowController.java" />
        <option value="$PROJECT_DIR$/src/main/resources/templates/feeds.html" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/model/Feed.java" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/util/RedisKeyUtil.java" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/async/handler/FeedHandler.java" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/util/JedisAdapter.java" />
        <option value="$PROJECT_DIR$/src/main/java/com/nowcoder/controller/FeedController.java" />
      </list>
    </option>
  </component>
  <component name="JsBuildToolGruntFileManager" detection-done="true" sorting="DEFINITION_ORDER" />
  <component name="JsBuildToolPackageJson" detection-done="true" sorting="DEFINITION_ORDER" />
  <component name="JsGulpfileManager">
    <detection-done>true</detection-done>
    <sorting>DEFINITION_ORDER</sorting>
  </component>
  <component name="ProjectFrameBounds" extendedState="6">
    <option name="x" value="85" />
    <option name="y" value="25" />
    <option name="width" value="1750" />
    <option name="height" value="970" />
  </component>
  <component name="ProjectInspectionProfilesVisibleTreeState">
    <entry key="Project Default">
      <profile-state>
        <expanded-state>
          <State />
          <State>
            <id>General</id>
          </State>
        </expanded-state>
        <selected-state>
          <State>
            <id>Duplicates</id>
          </State>
        </selected-state>
      </profile-state>
    </entry>
  </component>
  <component name="ProjectView">
    <navigator proportions="" version="1">
      <foldersAlwaysOnTop value="true" />
    </navigator>
    <panes>
      <pane id="PackagesPane" />
      <pane id="ProjectPane">
        <subPane>
          <expand>
            <path>
              <item name="wenda" type="b2602c69:ProjectViewProjectNode" />
              <item name="wenda" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="wenda" type="b2602c69:ProjectViewProjectNode" />
              <item name="wenda" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="wenda" type="b2602c69:ProjectViewProjectNode" />
              <item name="wenda" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="wenda" type="b2602c69:ProjectViewProjectNode" />
              <item name="wenda" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
              <item name="java" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="wenda" type="b2602c69:ProjectViewProjectNode" />
              <item name="wenda" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
              <item name="java" type="462c0819:PsiDirectoryNode" />
              <item name="nowcoder" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="wenda" type="b2602c69:ProjectViewProjectNode" />
              <item name="wenda" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
              <item name="resources" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="wenda" type="b2602c69:ProjectViewProjectNode" />
              <item name="wenda" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
              <item name="resources" type="462c0819:PsiDirectoryNode" />
              <item name="static" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="wenda" type="b2602c69:ProjectViewProjectNode" />
              <item name="wenda" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="main" type="462c0819:PsiDirectoryNode" />
              <item name="resources" type="462c0819:PsiDirectoryNode" />
              <item name="templates" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="wenda" type="b2602c69:ProjectViewProjectNode" />
              <item name="wenda" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="test" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="wenda" type="b2602c69:ProjectViewProjectNode" />
              <item name="wenda" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="test" type="462c0819:PsiDirectoryNode" />
              <item name="java" type="462c0819:PsiDirectoryNode" />
            </path>
            <path>
              <item name="wenda" type="b2602c69:ProjectViewProjectNode" />
              <item name="wenda" type="462c0819:PsiDirectoryNode" />
              <item name="src" type="462c0819:PsiDirectoryNode" />
              <item name="test" type="462c0819:PsiDirectoryNode" />
              <item name="java" type="462c0819:PsiDirectoryNode" />
              <item name="nowcoder" type="462c0819:PsiDirectoryNode" />
            </path>
          </expand>
          <select />
        </subPane>
      </pane>
      <pane id="Scope" />
    </panes>
  </component>
  <component name="PropertiesComponent">
    <property name="DefaultHtmlFileTemplate" value="HTML File" />
    <property name="RequestMappingsPanelOrder0" value="0" />
    <property name="RequestMappingsPanelOrder1" value="1" />
    <property name="RequestMappingsPanelOrder2" value="2" />
    <property name="RequestMappingsPanelWidth0" value="75" />
    <property name="RequestMappingsPanelWidth1" value="75" />
    <property name="RequestMappingsPanelWidth2" value="75" />
    <property name="WebServerToolWindowFactoryState" value="false" />
    <property name="aspect.path.notification.shown" value="true" />
    <property name="last_opened_file_path" value="$PROJECT_DIR$/pom.xml" />
    <property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
    <property name="nodejs_npm_path_reset_for_default_project" value="true" />
    <property name="project.structure.last.edited" value="Libraries" />
    <property name="project.structure.proportion" value="0.0" />
    <property name="project.structure.side.proportion" value="0.2" />
    <property name="settings.editor.selected.configurable" value="Errors" />
  </component>
  <component name="RecentsManager">
    <key name="CopyClassDialog.RECENTS_KEY">
      <recent name="com.nowcoder.async.handler" />
    </key>
    <key name="CopyFile.RECENT_KEYS">
      <recent name="E:\code\Java\wenda\src\main\resources\static\scripts\main\site" />
      <recent name="E:\code\Java\wenda\src\main\resources\com\nowcoder\dao" />
      <recent name="E:\code\Java\wenda\src\main\resources\templates" />
      <recent name="E:\code\Java\wenda\src\main\resources" />
      <recent name="E:\code\Java\wenda\src\main\java\com\nowcoder\async\handler" />
    </key>
  </component>
  <component name="RunDashboard">
    <option name="ruleStates">
      <list>
        <RuleState>
          <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
        </RuleState>
        <RuleState>
          <option name="name" value="StatusDashboardGroupingRule" />
        </RuleState>
      </list>
    </option>
  </component>
  <component name="RunManager" selected="Spring Boot.WendaApplication">
    <configuration name="JedisAdapter" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
      <option name="MAIN_CLASS_NAME" value="com.nowcoder.util.JedisAdapter" />
      <module name="wenda" />
      <extension name="coverage">
        <pattern>
          <option name="PATTERN" value="com.nowcoder.util.*" />
          <option name="ENABLED" value="true" />
        </pattern>
      </extension>
      <method v="2">
        <option name="Make" enabled="true" />
      </method>
    </configuration>
    <configuration name="SensitiveService" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
      <option name="MAIN_CLASS_NAME" value="com.nowcoder.service.SensitiveService" />
      <module name="wenda" />
      <extension name="coverage">
        <pattern>
          <option name="PATTERN" value="com.nowcoder.service.*" />
          <option name="ENABLED" value="true" />
        </pattern>
      </extension>
      <method v="2">
        <option name="Make" enabled="true" />
      </method>
    </configuration>
    <configuration name="ThreadTest" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
      <option name="MAIN_CLASS_NAME" value="com.nowcoder.ThreadTest" />
      <module name="wenda" />
      <extension name="coverage">
        <pattern>
          <option name="PATTERN" value="com.nowcoder.*" />
          <option name="ENABLED" value="true" />
        </pattern>
      </extension>
      <method v="2">
        <option name="Make" enabled="true" />
      </method>
    </configuration>
    <configuration name="InitDatabaseTests" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
      <module name="wenda" />
      <extension name="coverage">
        <pattern>
          <option name="PATTERN" value="com.nowcoder.*" />
          <option name="ENABLED" value="true" />
        </pattern>
      </extension>
      <option name="PACKAGE_NAME" value="com.nowcoder" />
      <option name="MAIN_CLASS_NAME" value="com.nowcoder.InitDatabaseTests" />
      <method v="2">
        <option name="Make" enabled="true" />
      </method>
    </configuration>
    <configuration name="InitDatabaseTests.initDatabase" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
      <module name="wenda" />
      <extension name="coverage">
        <pattern>
          <option name="PATTERN" value="com.nowcoder.*" />
          <option name="ENABLED" value="true" />
        </pattern>
      </extension>
      <option name="PACKAGE_NAME" value="com.nowcoder" />
      <option name="MAIN_CLASS_NAME" value="com.nowcoder.InitDatabaseTests" />
      <option name="METHOD_NAME" value="initDatabase" />
      <option name="TEST_OBJECT" value="method" />
      <method v="2">
        <option name="Make" enabled="true" />
      </method>
    </configuration>
    <configuration name="WendaApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
      <module name="wenda" />
      <option name="SPRING_BOOT_MAIN_CLASS" value="com.nowcoder.WendaApplication" />
      <method v="2">
        <option name="Make" enabled="true" />
      </method>
    </configuration>
    <list>
      <item itemvalue="Spring Boot.WendaApplication" />
      <item itemvalue="JUnit.InitDatabaseTests" />
      <item itemvalue="JUnit.InitDatabaseTests.initDatabase" />
      <item itemvalue="Application.SensitiveService" />
      <item itemvalue="Application.ThreadTest" />
      <item itemvalue="Application.JedisAdapter" />
    </list>
    <recent_temporary>
      <list>
        <item itemvalue="JUnit.InitDatabaseTests.initDatabase" />
        <item itemvalue="Application.JedisAdapter" />
        <item itemvalue="Application.SensitiveService" />
        <item itemvalue="Application.ThreadTest" />
        <item itemvalue="JUnit.InitDatabaseTests" />
      </list>
    </recent_temporary>
  </component>
  <component name="SvnConfiguration">
    <configuration />
  </component>
  <component name="TaskManager">
    <task active="true" id="Default" summary="Default task">
      <changelist id="576c5a3b-01a8-4a05-bab4-cadd65481fe9" name="Default Changelist" comment="" />
      <created>1538619708911</created>
      <option name="number" value="Default" />
      <option name="presentableId" value="Default" />
      <updated>1538619708911</updated>
      <workItem from="1538619711058" duration="586000" />
      <workItem from="1538620351163" duration="831000" />
      <workItem from="1538628992720" duration="181000" />
      <workItem from="1538630108094" duration="3454000" />
      <workItem from="1538658544288" duration="3539000" />
      <workItem from="1538709383169" duration="5048000" />
      <workItem from="1538893656841" duration="9231000" />
      <workItem from="1538993084835" duration="7778000" />
      <workItem from="1539076574838" duration="8601000" />
      <workItem from="1539091974584" duration="2439000" />
      <workItem from="1539096645202" duration="622000" />
      <workItem from="1539141658181" duration="15000" />
      <workItem from="1539168343013" duration="7923000" />
      <workItem from="1539261360791" duration="121000" />
      <workItem from="1539309503896" duration="612000" />
      <workItem from="1539338512654" duration="11563000" />
      <workItem from="1539411497941" duration="6257000" />
      <workItem from="1539421623838" duration="603000" />
      <workItem from="1539442540789" duration="1043000" />
      <workItem from="1539597242514" duration="7936000" />
      <workItem from="1539659381829" duration="53000" />
      <workItem from="1539758284361" duration="3112000" />
      <workItem from="1539761440706" duration="2037000" />
      <workItem from="1539852010977" duration="2076000" />
      <workItem from="1539866435899" duration="4053000" />
      <workItem from="1539928774881" duration="8928000" />
      <workItem from="1540107167186" duration="916000" />
      <workItem from="1540108656416" duration="6000" />
      <workItem from="1540190229400" duration="991000" />
      <workItem from="1540629399144" duration="256000" />
      <workItem from="1540709359497" duration="7325000" />
      <workItem from="1540720288066" duration="1300000" />
      <workItem from="1540724124264" duration="2965000" />
      <workItem from="1540987686048" duration="494000" />
      <workItem from="1542445768663" duration="285000" />
    </task>
    <servers />
  </component>
  <component name="TestHistory">
    <history-entry file="InitDatabaseTests - 2018.10.04 at 10h 26m 16s.xml">
      <configuration name="InitDatabaseTests" configurationId="JUnit" />
    </history-entry>
    <history-entry file="InitDatabaseTests - 2018.10.04 at 10h 27m 02s.xml">
      <configuration name="InitDatabaseTests" configurationId="JUnit" />
    </history-entry>
    <history-entry file="InitDatabaseTests - 2018.10.04 at 10h 29m 01s.xml">
      <configuration name="InitDatabaseTests" configurationId="JUnit" />
    </history-entry>
    <history-entry file="InitDatabaseTests - 2018.10.04 at 13h 44m 40s.xml">
      <configuration name="InitDatabaseTests" configurationId="JUnit" />
    </history-entry>
    <history-entry file="InitDatabaseTests_initDatabase - 2018.10.04 at 13h 49m 09s.xml">
      <configuration name="InitDatabaseTests.initDatabase" configurationId="JUnit" />
    </history-entry>
    <history-entry file="InitDatabaseTests_initDatabase - 2018.10.04 at 13h 55m 49s.xml">
      <configuration name="InitDatabaseTests.initDatabase" configurationId="JUnit" />
    </history-entry>
    <history-entry file="InitDatabaseTests_initDatabase - 2018.10.04 at 13h 57m 31s.xml">
      <configuration name="InitDatabaseTests.initDatabase" configurationId="JUnit" />
    </history-entry>
    <history-entry file="InitDatabaseTests_initDatabase - 2018.10.04 at 13h 59m 26s.xml">
      <configuration name="InitDatabaseTests.initDatabase" configurationId="JUnit" />
    </history-entry>
    <history-entry file="InitDatabaseTests_initDatabase - 2018.10.18 at 21h 32m 08s.xml">
      <configuration name="InitDatabaseTests.initDatabase" configurationId="JUnit" />
    </history-entry>
  </component>
  <component name="TimeTrackingManager">
    <option name="totallyTimeSpent" value="113180000" />
  </component>
  <component name="ToolWindowManager">
    <frame x="-7" y="-7" width="1550" height="838" extended-state="6" />
    <editor active="true" />
    <layout>
      <window_info content_ui="combo" id="Project" order="0" sideWeight="0.79632246" visible="true" weight="0.15817694" />
      <window_info id="Structure" order="1" side_tool="true" weight="0.25" />
      <window_info id="Web" order="2" sideWeight="0.2036775" side_tool="true" visible="true" weight="0.15817694" />
      <window_info id="Designer" order="3" />
      <window_info id="UI Designer" order="4" />
      <window_info id="Favorites" order="5" side_tool="true" />
      <window_info anchor="bottom" id="Message" order="0" />
      <window_info anchor="bottom" id="Find" order="1" />
      <window_info anchor="bottom" id="Run" order="2" weight="0.24893919" />
      <window_info anchor="bottom" id="Debug" order="3" weight="0.4" />
      <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
      <window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
      <window_info anchor="bottom" id="TODO" order="6" />
      <window_info anchor="bottom" id="Version Control" order="7" show_stripe_button="false" />
      <window_info anchor="bottom" id="Database Changes" order="8" show_stripe_button="false" />
      <window_info anchor="bottom" id="Spring" order="9" />
      <window_info anchor="bottom" id="Terminal" order="10" />
      <window_info anchor="bottom" id="Event Log" order="11" side_tool="true" />
      <window_info anchor="bottom" id="Messages" order="12" />
      <window_info anchor="bottom" id="Java Enterprise" order="13" />
      <window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" />
      <window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
      <window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
      <window_info anchor="right" id="Palette" order="3" />
      <window_info anchor="right" id="Database" order="4" />
      <window_info anchor="right" id="Bean Validation" order="5" />
      <window_info anchor="right" id="Palette&#9;" order="6" />
      <window_info anchor="right" id="Maven Projects" order="7" />
    </layout>
  </component>
  <component name="TypeScriptGeneratedFilesManager">
    <option name="version" value="1" />
  </component>
  <component name="VcsContentAnnotationSettings">
    <option name="myLimit" value="2678400000" />
  </component>
  <component name="editorHistoryManager">
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/service/LikeService.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="48">
          <caret line="11" column="30" lean-forward="true" selection-start-line="11" selection-start-column="30" selection-end-line="11" selection-end-column="30" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/async/EventHandler.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="144">
          <caret line="6" column="43" selection-start-line="6" selection-start-column="43" selection-end-line="6" selection-end-column="43" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/async/EventConsumer.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="1104">
          <caret line="61" column="54" selection-start-line="61" selection-start-column="54" selection-end-line="61" selection-end-column="54" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/resources/templates/mails/login_exception.html">
      <provider selected="true" editor-type-id="text-editor">
        <state>
          <caret column="20" lean-forward="true" selection-start-column="20" selection-end-column="20" />
        </state>
      </provider>
    </entry>
    <entry file="file://$MAVEN_REPOSITORY$/javax/mail/mail/1.4.7/mail-1.4.7.pom">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="-1152" />
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/async/handler/LoginExceptionHandler.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="210">
          <caret line="21" column="45" lean-forward="true" selection-start-line="21" selection-start-column="45" selection-end-line="21" selection-end-column="45" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/util/MailSender.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="168">
          <caret line="51" column="38" lean-forward="true" selection-start-line="51" selection-start-column="38" selection-end-line="51" selection-end-column="38" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/async/EventProducer.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="336">
          <caret line="18" column="42" selection-start-line="18" selection-start-column="42" selection-end-line="18" selection-end-column="42" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/test/java/com/nowcoder/InitDatabaseTests.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="260">
          <caret line="49" column="36" selection-start-line="49" selection-start-column="36" selection-end-line="49" selection-end-column="36" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/resources/templates/js.html">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="96">
          <caret line="4" column="74" lean-forward="true" selection-start-line="4" selection-start-column="74" selection-end-line="4" selection-end-column="74" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/aspect/LogAspect.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="318">
          <caret line="29" column="5" lean-forward="true" selection-start-line="29" selection-start-column="5" selection-end-line="29" selection-end-column="5" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/resources/templates/followers.html">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="504">
          <caret line="21" column="37" lean-forward="true" selection-start-line="21" selection-start-column="37" selection-end-line="21" selection-end-column="37" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/resources/templates/profile.html">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="368">
          <caret line="81" column="54" selection-start-line="81" selection-start-column="54" selection-end-line="81" selection-end-column="54" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/pom.xml">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="-48">
          <caret line="55" lean-forward="true" selection-start-line="55" selection-end-line="55" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/controller/LoginController.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="307">
          <caret line="75" lean-forward="true" selection-start-line="75" selection-end-line="75" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/service/CommentService.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="304">
          <caret line="28" column="46" lean-forward="true" selection-start-line="28" selection-start-column="46" selection-end-line="28" selection-end-column="46" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/service/FollowService.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="144">
          <caret line="19" column="69" selection-start-line="19" selection-start-column="69" selection-end-line="19" selection-end-column="69" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/service/SensitiveService.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="480">
          <caret line="121" column="27" lean-forward="true" selection-start-line="121" selection-start-column="27" selection-end-line="121" selection-end-column="27" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/dao/CommentDAO.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="216">
          <caret line="13" column="51" lean-forward="true" selection-start-line="13" selection-start-column="51" selection-end-line="13" selection-end-column="51" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/resources/com/nowcoder/dao/QuestionDAO.xml">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="168">
          <caret line="7" column="38" lean-forward="true" selection-start-line="7" selection-start-column="38" selection-end-line="7" selection-end-column="38" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/async/handler/LikeHandler.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="323">
          <caret line="37" column="43" selection-start-line="37" selection-start-column="43" selection-end-line="37" selection-end-column="43" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/dao/QuestionDAO.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="168">
          <caret line="20" column="13" selection-start-line="20" selection-start-column="13" selection-end-line="20" selection-end-column="13" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/service/QuestionService.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="236">
          <caret line="33" column="40" lean-forward="true" selection-start-line="33" selection-start-column="40" selection-end-line="33" selection-end-column="40" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/resources/static/scripts/main/site/detail.js">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="192">
          <caret line="8" column="36" lean-forward="true" selection-start-line="8" selection-start-column="36" selection-end-line="8" selection-end-column="36" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/controller/IndexController.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="120">
          <caret line="19" column="13" selection-start-line="19" selection-start-column="13" selection-end-line="19" selection-end-column="13" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/controller/LikeController.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="433">
          <caret line="47" column="94" selection-start-line="47" selection-start-column="94" selection-end-line="47" selection-end-column="94" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/controller/MessageController.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="-685">
          <caret line="56" column="71" lean-forward="true" selection-start-line="56" selection-start-column="71" selection-end-line="56" selection-end-column="71" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/controller/SettingController.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="144">
          <caret line="13" column="13" selection-start-line="13" selection-start-column="13" selection-end-line="13" selection-end-column="13" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/controller/QuestionController.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="360">
          <caret line="63" column="47" lean-forward="true" selection-start-line="63" selection-start-column="47" selection-end-line="63" selection-end-column="47" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/controller/CommentController.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="768">
          <caret line="46" column="32" lean-forward="true" selection-start-line="46" selection-start-column="32" selection-end-line="46" selection-end-column="32" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/util/WendaUtil.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="179">
          <caret line="26" column="5" selection-start-line="26" selection-start-column="5" selection-end-line="26" selection-end-column="5" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/controller/HomeController.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="384">
          <caret line="44" column="45" selection-start-line="44" selection-start-column="45" selection-end-line="44" selection-end-column="45" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/controller/FollowController.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="347">
          <caret line="82" column="33" lean-forward="true" selection-start-line="82" selection-start-column="33" selection-end-line="82" selection-end-column="33" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/async/handler/FollowHandler.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="107">
          <caret line="30" column="51" lean-forward="true" selection-start-line="30" selection-start-column="51" selection-end-line="30" selection-end-column="51" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/model/EntityType.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="48">
          <caret line="2" column="13" selection-start-line="2" selection-start-column="13" selection-end-line="2" selection-end-column="13" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/async/EventType.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="48">
          <caret line="2" column="24" lean-forward="true" selection-start-line="2" selection-start-column="24" selection-end-line="2" selection-end-column="24" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/async/EventModel.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="120">
          <caret line="7" column="24" lean-forward="true" selection-start-line="7" selection-start-column="24" selection-end-line="7" selection-end-column="24" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/resources/com/nowcoder/dao/FeedDAO.xml">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="408">
          <caret line="17" column="23" selection-start-line="17" selection-start-column="23" selection-end-line="17" selection-end-column="23" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/resources/templates/detail.html">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="-2088">
          <caret line="39" column="35" selection-start-line="39" selection-start-column="35" selection-end-line="39" selection-end-column="35" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/resources/templates/home.html">
      <provider selected="true" editor-type-id="text-editor" />
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/resources/templates/followees.html">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="382">
          <caret line="21" column="37" lean-forward="true" selection-start-line="21" selection-start-column="37" selection-end-line="21" selection-end-column="37" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/resources/templates/index.html">
      <provider selected="true" editor-type-id="text-editor" />
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/model/Feed.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="406">
          <caret line="56" column="65" selection-start-line="56" selection-start-column="65" selection-end-line="56" selection-end-column="65" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/resources/templates/feeds.html">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="696">
          <caret line="29" column="37" selection-start-line="29" selection-start-column="37" selection-end-line="29" selection-end-column="37" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/util/RedisKeyUtil.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="488">
          <caret line="35" column="61" selection-start-line="35" selection-start-column="61" selection-end-line="35" selection-end-column="61" />
          <folding>
            <element signature="e#1276#1277#0" expanded="true" />
            <element signature="e#1337#1338#0" expanded="true" />
          </folding>
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/util/JedisAdapter.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="190">
          <caret line="245" column="49" lean-forward="true" selection-start-line="245" selection-start-column="49" selection-end-line="245" selection-end-column="49" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/dao/FeedDAO.java">
      <provider selected="true" editor-type-id="text-editor">
        <state>
          <caret line="24" column="29" selection-start-line="24" selection-start-column="29" selection-end-line="24" selection-end-column="29" />
          <folding>
            <element signature="imports" expanded="true" />
          </folding>
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/service/FeedService.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="216">
          <caret line="14" column="49" selection-start-line="14" selection-start-column="49" selection-end-line="14" selection-end-column="49" />
          <folding>
            <element signature="imports" expanded="true" />
            <element signature="e#599#600#0" expanded="true" />
            <element signature="e#645#646#0" expanded="true" />
          </folding>
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/async/handler/FeedHandler.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="1584">
          <caret line="80" column="74" selection-start-line="80" selection-start-column="74" selection-end-line="80" selection-end-column="74" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/WendaApplication.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="192">
          <caret line="12" column="1" lean-forward="true" selection-start-line="12" selection-start-column="1" selection-end-line="12" selection-end-column="1" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/src/main/java/com/nowcoder/controller/FeedController.java">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="152">
          <caret line="32" column="40" selection-start-line="32" selection-start-column="40" selection-end-line="32" selection-end-column="40" />
        </state>
      </provider>
    </entry>
  </component>
  <component name="masterDetails">
    <states>
      <state key="ArtifactsStructureConfigurable.UI">
        <settings>
          <artifact-editor />
          <splitter-proportions>
            <option name="proportions">
              <list>
                <option value="0.2" />
              </list>
            </option>
          </splitter-proportions>
        </settings>
      </state>
      <state key="FacetStructureConfigurable.UI">
        <settings>
          <last-edited>Spring</last-edited>
          <splitter-proportions>
            <option name="proportions">
              <list>
                <option value="0.2" />
              </list>
            </option>
          </splitter-proportions>
        </settings>
      </state>
      <state key="GlobalLibrariesConfigurable.UI">
        <settings>
          <splitter-proportions>
            <option name="proportions">
              <list>
                <option value="0.2" />
              </list>
            </option>
          </splitter-proportions>
        </settings>
      </state>
      <state key="JdkListConfigurable.UI">
        <settings>
          <last-edited>1.8</last-edited>
          <splitter-proportions>
            <option name="proportions">
              <list>
                <option value="0.2" />
              </list>
            </option>
          </splitter-proportions>
        </settings>
      </state>
      <state key="ModuleStructureConfigurable.UI">
        <settings>
          <last-edited>wenda</last-edited>
          <splitter-proportions>
            <option name="proportions">
              <list>
                <option value="0.2" />
                <option value="0.6" />
              </list>
            </option>
          </splitter-proportions>
        </settings>
      </state>
      <state key="ProjectJDKs.UI">
        <settings>
          <last-edited>1.8</last-edited>
          <splitter-proportions>
            <option name="proportions">
              <list>
                <option value="0.2" />
              </list>
            </option>
          </splitter-proportions>
        </settings>
      </state>
      <state key="ProjectLibrariesConfigurable.UI">
        <settings>
          <last-edited>Maven: antlr:antlr:2.7.7</last-edited>
          <splitter-proportions>
            <option name="proportions">
              <list>
                <option value="0.2" />
              </list>
            </option>
          </splitter-proportions>
        </settings>
      </state>
    </states>
  </component>
</project>

================================================
FILE: wenda/.mvn/wrapper/maven-wrapper.properties
================================================
distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.zip


================================================
FILE: wenda/mvnw
================================================
#!/bin/sh
# ----------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
# ----------------------------------------------------------------------------

# ----------------------------------------------------------------------------
# Maven2 Start Up Batch script
#
# Required ENV vars:
# ------------------
#   JAVA_HOME - location of a JDK home dir
#
# Optional ENV vars
# -----------------
#   M2_HOME - location of maven2's installed home dir
#   MAVEN_OPTS - parameters passed to the Java VM when running Maven
#     e.g. to debug Maven itself, use
#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
# ----------------------------------------------------------------------------

if [ -z "$MAVEN_SKIP_RC" ] ; then

  if [ -f /etc/mavenrc ] ; then
    . /etc/mavenrc
  fi

  if [ -f "$HOME/.mavenrc" ] ; then
    . "$HOME/.mavenrc"
  fi

fi

# OS specific support.  $var _must_ be set to either true or false.
cygwin=false;
darwin=false;
mingw=false
case "`uname`" in
  CYGWIN*) cygwin=true ;;
  MINGW*) mingw=true;;
  Darwin*) darwin=true
           #
           # Look for the Apple JDKs first to preserve the existing behaviour, and then look
           # for the new JDKs provided by Oracle.
           #
           if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ] ; then
             #
             # Apple JDKs
             #
             export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home
           fi

           if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Java/JavaVirtualMachines/CurrentJDK ] ; then
             #
             # Apple JDKs
             #
             export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home
           fi

           if [ -z "$JAVA_HOME" ] && [ -L "/Library/Java/JavaVirtualMachines/CurrentJDK" ] ; then
             #
             # Oracle JDKs
             #
             export JAVA_HOME=/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home
           fi

           if [ -z "$JAVA_HOME" ] && [ -x "/usr/libexec/java_home" ]; then
             #
             # Apple JDKs
             #
             export JAVA_HOME=`/usr/libexec/java_home`
           fi
           ;;
esac

if [ -z "$JAVA_HOME" ] ; then
  if [ -r /etc/gentoo-release ] ; then
    JAVA_HOME=`java-config --jre-home`
  fi
fi

if [ -z "$M2_HOME" ] ; then
  ## resolve links - $0 may be a link to maven's home
  PRG="$0"

  # need this for relative symlinks
  while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
      PRG="$link"
    else
      PRG="`dirname "$PRG"`/$link"
    fi
  done

  saveddir=`pwd`

  M2_HOME=`dirname "$PRG"`/..

  # make it fully qualified
  M2_HOME=`cd "$M2_HOME" && pwd`

  cd "$saveddir"
  # echo Using m2 at $M2_HOME
fi

# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin ; then
  [ -n "$M2_HOME" ] &&
    M2_HOME=`cygpath --unix "$M2_HOME"`
  [ -n "$JAVA_HOME" ] &&
    JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
  [ -n "$CLASSPATH" ] &&
    CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
fi

# For Migwn, ensure paths are in UNIX format before anything is touched
if $mingw ; then
  [ -n "$M2_HOME" ] &&
    M2_HOME="`(cd "$M2_HOME"; pwd)`"
  [ -n "$JAVA_HOME" ] &&
    JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
  # TODO classpath?
fi

if [ -z "$JAVA_HOME" ]; then
  javaExecutable="`which javac`"
  if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
    # readlink(1) is not available as standard on Solaris 10.
    readLink=`which readlink`
    if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
      if $darwin ; then
        javaHome="`dirname \"$javaExecutable\"`"
        javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
      else
        javaExecutable="`readlink -f \"$javaExecutable\"`"
      fi
      javaHome="`dirname \"$javaExecutable\"`"
      javaHome=`expr "$javaHome" : '\(.*\)/bin'`
      JAVA_HOME="$javaHome"
      export JAVA_HOME
    fi
  fi
fi

if [ -z "$JAVACMD" ] ; then
  if [ -n "$JAVA_HOME"  ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
      # IBM's JDK on AIX uses strange locations for the executables
      JAVACMD="$JAVA_HOME/jre/sh/java"
    else
      JAVACMD="$JAVA_HOME/bin/java"
    fi
  else
    JAVACMD="`which java`"
  fi
fi

if [ ! -x "$JAVACMD" ] ; then
  echo "Error: JAVA_HOME is not defined correctly." >&2
  echo "  We cannot execute $JAVACMD" >&2
  exit 1
fi

if [ -z "$JAVA_HOME" ] ; then
  echo "Warning: JAVA_HOME environment variable is not set."
fi

CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher

# For Cygwin, switch paths to Windows format before running java
if $cygwin; then
  [ -n "$M2_HOME" ] &&
    M2_HOME=`cygpath --path --windows "$M2_HOME"`
  [ -n "$JAVA_HOME" ] &&
    JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
  [ -n "$CLASSPATH" ] &&
    CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
fi

# traverses directory structure from process work directory to filesystem root
# first directory with .mvn subdirectory is considered project base directory
find_maven_basedir() {
  local basedir=$(pwd)
  local wdir=$(pwd)
  while [ "$wdir" != '/' ] ; do
    if [ -d "$wdir"/.mvn ] ; then
      basedir=$wdir
      break
    fi
    wdir=$(cd "$wdir/.."; pwd)
  done
  echo "${basedir}"
}

# concatenates all lines of a file
concat_lines() {
  if [ -f "$1" ]; then
    echo "$(tr -s '\n' ' ' < "$1")"
  fi
}

export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)}
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"

# Provide a "standardized" way to retrieve the CLI args that will
# work with both Windows and non-Windows executions.
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
export MAVEN_CMD_LINE_ARGS

WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain

exec "$JAVACMD" \
  $MAVEN_OPTS \
  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
  "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
  ${WRAPPER_LAUNCHER} "$@"


================================================
FILE: wenda/mvnw.cmd
================================================
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements.  See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership.  The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License.  You may obtain a copy of the License at
@REM
@REM    http://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied.  See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------

@REM ----------------------------------------------------------------------------
@REM Maven2 Start Up Batch script
@REM
@REM Required ENV vars:
@REM JAVA_HOME - location of a JDK home dir
@REM
@REM Optional ENV vars
@REM M2_HOME - location of maven2's installed home dir
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
@REM     e.g. to debug Maven itself, use
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
@REM ----------------------------------------------------------------------------

@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
@echo off
@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
@if "%MAVEN_BATCH_ECHO%" == "on"  echo %MAVEN_BATCH_ECHO%

@REM set %HOME% to equivalent of $HOME
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")

@REM Execute a user defined script before this one
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
:skipRcPre

@setlocal

set ERROR_CODE=0

@REM To isolate internal variables from possible post scripts, we use another setlocal
@setlocal

@REM ==== START VALIDATION ====
if not "%JAVA_HOME%" == "" goto OkJHome

echo.
echo Error: JAVA_HOME not found in your environment. >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error

:OkJHome
if exist "%JAVA_HOME%\bin\java.exe" goto init

echo.
echo Error: JAVA_HOME is set to an invalid directory. >&2
echo JAVA_HOME = "%JAVA_HOME%" >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error

@REM ==== END VALIDATION ====

:init

set MAVEN_CMD_LINE_ARGS=%*

@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
@REM Fallback to current working directory if not found.

set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir

set EXEC_DIR=%CD%
set WDIR=%EXEC_DIR%
:findBaseDir
IF EXIST "%WDIR%"\.mvn goto baseDirFound
cd ..
IF "%WDIR%"=="%CD%" goto baseDirNotFound
set WDIR=%CD%
goto findBaseDir

:baseDirFound
set MAVEN_PROJECTBASEDIR=%WDIR%
cd "%EXEC_DIR%"
goto endDetectBaseDir

:baseDirNotFound
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
cd "%EXEC_DIR%"

:endDetectBaseDir

IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig

@setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%

:endReadAdditionalConfig

SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"

set WRAPPER_JAR="".\.mvn\wrapper\maven-wrapper.jar""
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain

%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CMD_LINE_ARGS%
if ERRORLEVEL 1 goto error
goto end

:error
set ERROR_CODE=1

:end
@endlocal & set ERROR_CODE=%ERROR_CODE%

if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
@REM check for post script, once with legacy .bat ending and once with .cmd ending
if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
:skipRcPost

@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
if "%MAVEN_BATCH_PAUSE%" == "on" pause

if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%

exit /B %ERROR_CODE%

================================================
FILE: wenda/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.nowcoder</groupId>
    <artifactId>wenda</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>wenda</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.83</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-velocity</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
            <type>jar</type>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4.7</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>


================================================
FILE: wenda/pyspider/conf.json
================================================
{
	"message_queue":"redis://127.0.0.1:6379/0",
	"webui":{
		"port":5001,
		"need-auth":true,
		"username":"root",
		"password":"150000"
	}
}

================================================
FILE: wenda/src/main/java/com/nowcoder/WendaApplication.java
================================================
package com.nowcoder;

import com.nowcoder.model.User;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class WendaApplication {

	public static void main(String[] args) {
		SpringApplication.run(WendaApplication.class, args);
	}
}


================================================
FILE: wenda/src/main/java/com/nowcoder/aspect/LogAspect.java
================================================
package com.nowcoder.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.util.Date;

@Aspect
@Component
public class LogAspect {
    private static final Logger logger = LoggerFactory.getLogger(LogAspect.class);

    @Before("execution(* com.nowcoder.controller.*Controller.*(..))")
    public void beforeMethod(JoinPoint joinPoint) {
        StringBuilder sb = new StringBuilder();
        for (Object arg : joinPoint.getArgs()) {
            sb.append("arg:" + arg.toString() + "|");
        }
        logger.info("before method:" + sb.toString());
    }

    @After("execution(* com.nowcoder.controller.IndexController.*(..))")
    public void afterMethod() {
        logger.info("after method" + new Date());
    }
}


================================================
FILE: wenda/src/main/java/com/nowcoder/async/EventConsumer.java
================================================
package com.nowcoder.async;

import com.alibaba.fastjson.JSON;
import com.nowcoder.util.JedisAdapter;
import com.nowcoder.util.RedisKeyUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class EventConsumer implements InitializingBean, ApplicationContextAware {

    private static final Logger logger = LoggerFactory.getLogger(EventConsumer.class);

    @Autowired
    JedisAdapter jedisAdapter;

    private Map<EventType, List<EventHandler>> config = new HashMap<>();
    private ApplicationContext applicationContext;

    @Override
    public void afterPropertiesSet() throws Exception {
        Map<String, EventHandler> beans = applicationContext.getBeansOfType(EventHandler.class);
        if (beans != null) {
            for (Map.Entry<String, EventHandler> entry : beans.entrySet()) {
                List<EventType> eventTypes = entry.getValue().getSupportEventTypes();

                for (EventType type : eventTypes) {
                    if (!config.containsKey(type)) {
                        config.put(type, new ArrayList<EventHandler>());
                    }
                    config.get(type).add(entry.getValue());
                }
            }
        }

        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                String key = RedisKeyUtil.getEventQueueKey();
                List<String> events = jedisAdapter.brpop(0, key);
                for (String message : events) {
                    if (message.equals(key)) {
                        continue;
                    }
                    EventModel eventModel = JSON.parseObject(message, EventModel.class);
                    if (!config.containsKey(eventModel.getType())) {
                        logger.error("不能识别的事件");
                        continue;
                    }
                    for (EventHandler handler : config.get(eventModel.getType())) {
                        handler.doHandler(eventModel);
                    }
                }
            }
        });
        thread.start();
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}


================================================
FILE: wenda/src/main/java/com/nowcoder/async/EventHandler.java
================================================
package com.nowcoder.async;

import java.util.List;

public interface EventHandler {
    void doHandler(EventModel model);
    List<EventType> getSupportEventTypes();
}


================================================
FILE: wenda/src/main/java/com/nowcoder/async/EventModel.java
================================================
package com.nowcoder.async;

import java.util.HashMap;
import java.util.Map;

public class EventModel {
    private EventType type;
    private int actorId;
    private int entityType;
    private int entityId;
    private int entityOwnerId;

    private Map<String, String> exts = new HashMap<>();

    public EventModel() {

    }

    public EventModel(EventType type) {
        this.type = type;
    }

    public EventModel setExt(String key, String value) {
        exts.put(key, value);
        return this;
    }

    public String getExt(String key) {
        return exts.get(key);
    }

    public EventType getType() {
        return type;
    }

    public EventModel setType(EventType type) {
        this.type = type;
        return this;
    }

    public int getActorId() {
        return actorId;
    }

    public EventModel setActorId(int actorId) {
        this.actorId = actorId;
        return this;
    }

    public int getEntityType() {
        return entityType;
    }

    public EventModel setEntityType(int entityType) {
        this.entityType = entityType;
        return this;
    }

    public int getEntityId() {
        return entityId;
    }

    public EventModel setEntityId(int entityId) {
        this.entityId = entityId;
        return this;
    }

    public int getEntityOwnerId() {
        return entityOwnerId;
    }

    public EventModel setEntityOwnerId(int entityOwnerId) {
        this.entityOwnerId = entityOwnerId;
        return this;
    }

    public Map<String, String> getExts() {
        return exts;
    }

    public EventModel setExts(Map<String, String> exts) {
        this.exts = exts;
        return this;
    }
}


================================================
FILE: wenda/src/main/java/com/nowcoder/async/EventProducer.java
================================================
package com.nowcoder.async;

import com.alibaba.fastjson.JSONObject;
import com.nowcoder.util.JedisAdapter;
import com.nowcoder.util.RedisKeyUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class EventProducer {

    @Autowired
    JedisAdapter jedisAdapter;

    public boolean fireEvent(EventModel eventModel) {
        try {
            String json = JSONObject.toJSONString(eventModel);
            String key = RedisKeyUtil.getEventQueueKey();
            jedisAdapter.lpush(key, json);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}


================================================
FILE: wenda/src/main/java/com/nowcoder/async/EventType.java
================================================
package com.nowcoder.async;

public enum  EventType {
    LIKE(0),
    COMMENT(1),
    LOGIN(2),
    MAIL(3),
    FOLLOW(4),
    UNFOLLOW(5);

    private int value;
    EventType(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

}


================================================
FILE: wenda/src/main/java/com/nowcoder/async/handler/FeedHandler.java
================================================
package com.nowcoder.async.handler;

import com.alibaba.fastjson.JSONObject;
import com.nowcoder.async.EventHandler;
import com.nowcoder.async.EventModel;
import com.nowcoder.async.EventType;
import com.nowcoder.model.EntityType;
import com.nowcoder.model.Feed;
import com.nowcoder.model.Question;
import com.nowcoder.model.User;
import com.nowcoder.service.*;
import com.nowcoder.util.JedisAdapter;
import com.nowcoder.util.RedisKeyUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.*;


@Component
public class FeedHandler implements EventHandler {

    @Autowired
    QuestionService questionService;

    @Autowired
    MessageService messageService;

    @Autowired
    UserService userService;

    @Autowired
    FeedService feedService;

    @Autowired
    FollowService followService;

    @Autowired
    JedisAdapter jedisAdapter;

    private String buildFeedData(EventModel model) {
        Map<String, String> map = new HashMap<>();
        User actor = userService.getUser(model.getActorId());
        if (actor == null) {
            return null;
        }
        map.put("userId", String.valueOf(actor.getId()));
        map.put("userHead", actor.getHeadUrl());
        map.put("userName", actor.getName());
        if (model.getType().equals(EventType.COMMENT) ||
                (model.getType().equals(EventType.FOLLOW) && model.getEntityType() == EntityType.ENTITY_QUESTION)) {
            Question question = questionService.selectById(model.getEntityId());
            if (question == null) {
                return null;
            }
            map.put("questionId", String.valueOf(question.getId()));
            map.put("questionTitle", question.getTitle());
            return JSONObject.toJSONString(map);
        }
        return null;
    }

    @Override
    public void doHandler(EventModel model) {
        Feed feed = new Feed();
        feed.setCreatedDate(new Date());
        feed.setUserId(model.getActorId());
        feed.setType(model.getType().getValue());
        feed.setData(buildFeedData(model));
//        feed.setData("aaa");
        if (feed.getData() == null) {
            return ;
        }
        feedService.addFeed(feed);

        //给事件的粉丝推
        List<Integer> followers = followService.getFollowers(EntityType.ENTITY_USER, model.getActorId(), Integer.MAX_VALUE);
        followers.add(0);
        for (int follower : followers) {
            String timelineKey = RedisKeyUtil.getTimelineKey(follower);
            jedisAdapter.lpush(timelineKey, String.valueOf(feed.getId()));
        }

    }

    @Override
    public List<EventType> getSupportEventTypes() {
        return Arrays.asList(new EventType[]{EventType.COMMENT, EventType.FOLLOW});
    }
}


================================================
FILE: wenda/src/main/java/com/nowcoder/async/handler/FollowHandler.java
================================================
package com.nowcoder.async.handler;

import com.nowcoder.async.EventHandler;
import com.nowcoder.async.EventModel;
import com.nowcoder.async.EventType;
import com.nowcoder.model.EntityType;
import com.nowcoder.model.Message;
import com.nowcoder.model.User;
import com.nowcoder.service.MessageService;
import com.nowcoder.service.UserService;
import com.nowcoder.util.WendaUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.Date;
import java.util.List;


@Component
public class FollowHandler implements EventHandler {
    @Autowired
    MessageService messageService;

    @Autowired
    UserService userService;

    @Override
    public void doHandler(EventModel model) {
        Message message = new Message();
        message.setFromId(WendaUtil.SYSTEM_USERID);
        message.setToId(model.getEntityOwnerId());
        message.setCreatedDate(new Date());
        User user = userService.getUser(model.getActorId());

        if (model.getEntityType() == EntityType.ENTITY_QUESTION) {
            message.setContent("用户" + user.getName()
                    + "关注了你的问题,http://127.0.0.1:8080/question/" + model.getEntityId());
        } else if (model.getEntityType() == EntityType.ENTITY_USER) {
            message.setContent("用户" + user.getName()
                    + "关注了你,http://127.0.0.1:8080/user/" + model.getActorId());
        }

        messageService.addMessage(message);
    }

    @Override
    public List<EventType> getSupportEventTypes() {
        return Arrays.asList(EventType.FOLLOW);
    }
}


================================================
FILE: wenda/src/main/java/com/nowcoder/async/handler/LikeHandler.java
================================================
package com.nowcoder.async.handler;

import com.nowcoder.async.EventHandler;
import com.nowcoder.async.EventModel;
import com.nowcoder.async.EventType;
import com.nowcoder.model.Message;
import com.nowcoder.model.User;
import com.nowcoder.service.MessageService;
import com.nowcoder.service.UserService;
import com.nowcoder.util.WendaUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.Date;
import java.util.List;


@Component
public class LikeHandler implements EventHandler {

    @Autowired
    MessageService messageService;

    @Autowired
    UserService userService;

    @Override
    public void doHandler(EventModel model) {
        Message message = new Message();
        message.setFromId(WendaUtil.SYSTEM_USERID);
        message.setToId(model.getEntityOwnerId());
        message.setCreatedDate(new Date());

        User user = userService.getUser(model.getActorId());
        message.setContent("用户" + user.getName() + "赞了你的评论," +
                "http://127.0.0.1:8080/question/" + model.getExt("questionId"));
        messageService.addMessage(message);
    }

    @Override
    public List<EventType> getSupportEventTypes() {
        return Arrays.asList(EventType.LIKE);
    }
}


================================================
FILE: wenda/src/main/java/com/nowcoder/async/handler/LoginExceptionHandler.java
================================================
package com.nowcoder.async.handler;

import com.nowcoder.async.EventHandler;
import com.nowcoder.async.EventModel;
import com.nowcoder.async.EventType;
import com.nowcoder.util.MailSender;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Component
public class LoginExceptionHandler implements EventHandler {

    @Autowired
    MailSender mailSender;

    @Override
    public void doHandler(EventModel model) {
        Map<String, Object> map = new HashMap<>();
        map.put("username", model.getExt("username"));
        mailSender.sendWithHTMLTemplate(model.getExt("email"),
                "登录IP异常", "mails/login_exception.html", map);
    }

    @Override
    public List<EventType> getSupportEventTypes() {
        return Arrays.asList(EventType.LOGIN);
    }
}


================================================
FILE: wenda/src/main/java/com/nowcoder/configuration/WendaWebConfiguration.java
================================================
package com.nowcoder.configuration;

import com.nowcoder.interceptor.LoginRequredInterceptor;
import com.nowcoder.interceptor.PassportInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Component
public class WendaWebConfiguration extends WebMvcConfigurerAdapter {

    @Autowired
    PassportInterceptor passportInterceptor;
    @Autowired
    LoginRequredInterceptor loginRequredInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(passportInterceptor);
        registry.addInterceptor(loginRequredInterceptor).addPathPatterns("/user/*"); //放在passportInterceptor之后
        super.addInterceptors(registry);
    }
}


================================================
FILE: wenda/src/main/java/com/nowcoder/controller/CommentController.java
================================================
package com.nowcoder.controller;

import com.nowcoder.model.Comment;
import com.nowcoder.model.EntityType;
import com.nowcoder.model.HostHolder;
import com.nowcoder.service.CommentService;
import com.nowcoder.service.QuestionService;
import com.nowcoder.util.WendaUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.Date;

@Controller
public class CommentController {
    private static final Logger logger = LoggerFactory.getLogger(CommentController.class);

    @Autowired
    HostHolder hostHolder;

    @Autowired
    CommentService commentService;

    @Autowired
    QuestionService questionService;

    @RequestMapping(path = {"/addComment"}, method = RequestMethod.POST)
    public String addComment(@RequestParam("questionId") int questionId,
                             @RequestParam("content") String content) {
        try {
            Comment comment = new Comment();
            comment.setContent(content);
            if (hostHolder.getUser() != null) {
                comment.setUserId(hostHolder.getUser().getId());
            } else {
                //return "redirect:/relogin";
                comment.setUserId(WendaUtil.ANONYMOUS_USERID);
            }
            comment.setCreatedDate(new Date());
            comment.setEntityId(questionId);
            comment.setEntityType(EntityType.ENTITY_QUESTION);
            commentService.addComment(comment);

            int count = commentService.getCommentCount(comment.getEntityId(), comment.getEntityType());
            questionService.updateCommentCount(comment.getEntityId(), count);
        } catch (Exception e) {
            logger.error("增加评论失败!" + e.getMessage());
        }
        return "redirect:/question/" + questionId;
    }


}


================================================
FILE: wenda/src/main/java/com/nowcoder/controller/FeedController.java
================================================
package com.nowcoder.controller;

import com.nowcoder.model.EntityType;
import com.nowcoder.model.Feed;
import com.nowcoder.model.HostHolder;
import com.nowcoder.service.FeedService;
import com.nowcoder.service.FollowService;
import com.nowcoder.util.JedisAdapter;
import com.nowcoder.util.RedisKeyUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import java.util.ArrayList;
import java.util.List;

@Controller
public class FeedController {
    @Autowired
    FeedService feedService;

    @Autowired
    HostHolder hostHolder;

    @Autowired
    FollowService followService;

    @Autowired
    JedisAdapter jedisAdapter;

    @RequestMapping(path = {"/pullfeeds"}, method = {RequestMethod.GET})
    private String getPullFeeds(Model model) {
        int localUserId = hostHolder.getUser() == null ? 0 : hostHolder.getUser().getId();
        List<Integer> followees = new ArrayList<>();
        if (localUserId != 0) {
            followees = followService.getFollowees(localUserId, EntityType.ENTITY_USER, Integer.MAX_VALUE);
        }
        List<Feed> feeds = feedService.getUserFeeds(Integer.MAX_VALUE, followees, 10);
        model.addAttribute("feeds", feeds);
        return "feeds";
    }

    @RequestMapping(path = {"/pushfeeds"}, method = {RequestMethod.GET})
    private String getPushFeeds(Model model) {
        int localUserId = hostHolder.getUser() == null ? 0 : hostHolder.getUser().getId();
        List<String> feedIds = jedisAdapter.lrange(RedisKeyUtil.getTimelineKey(localUserId), 0, 10);
        List<Feed> feeds = new ArrayList<>();
        for (String feedId : feedIds) {
            Feed feed = feedService.getById(Integer.parseInt(feedId));
            if (feed == null) {
                continue;
            }
            feeds.add(feed);
        }
        model.addAttribute("feeds", feeds);
        return "feeds";
    }
}


================================================
FILE: wenda/src/main/java/com/nowcoder/controller/FollowController.java
================================================
package com.nowcoder.controller;

import com.nowcoder.async.EventModel;
import com.nowcoder.async.EventProducer;
import com.nowcoder.async.EventType;
import com.nowcoder.model.*;
import com.nowcoder.service.CommentService;
import com.nowcoder.service.FollowService;
import com.nowcoder.service.QuestionService;
import com.nowcoder.service.UserService;
import com.nowcoder.util.WendaUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
public class FollowController {
    private static final Logger logger = LoggerFactory.getLogger(FollowController.class);

    @Autowired
    FollowService followService;

    @Autowired
    UserService userService;

    @Autowired
    HostHolder hostHolder;

    @Autowired
    EventProducer eventProducer;

    @Autowired
    QuestionService questionService;

    @Autowired
    CommentService commentService;

    @RequestMapping(path = "/followUser", method = {RequestMethod.POST, RequestMethod.GET})
    @ResponseBody
    public String follow(@RequestParam("userId") int userId) {
        if (hostHolder.getUser() == null) {
            return WendaUtil.getJSONString(999);
        }
        boolean ret = followService.follow(hostHolder.getUser().getId(), EntityType.ENTITY_USER, userId);
        eventProducer.fireEvent(new EventModel(EventType.FOLLOW)
                .setActorId(hostHolder.getUser().getId()).setEntityId(userId)
                .setEntityType(EntityType.ENTITY_USER).setEntityOwnerId(userId));
        return WendaUtil.getJSONString(ret ? 0 : 1, String.valueOf(
                followService.getFolloweeCount(hostHolder.getUser().getId(), EntityType.ENTITY_USER)));
    }

    @RequestMapping(path = "/unfollowUser", method = RequestMethod.POST)
    @ResponseBody
    public String unfollow(@RequestParam("userId") int userId) {
        if (hostHolder.getUser() == null) {
            return WendaUtil.getJSONString(999);
        }
        boolean ret = followService.unfollow(hostHolder.getUser().getId(), EntityType.ENTITY_USER, userId);
        eventProducer.fireEvent(new EventModel(EventType.UNFOLLOW)
                .setActorId(hostHolder.getUser().getId()).setEntityId(userId)
                .setEntityType(EntityType.ENTITY_USER).setEntityOwnerId(userId));
        return WendaUtil.getJSONString(ret ? 0 : 1, String.valueOf(
                followService.getFolloweeCount(hostHolder.getUser().getId(), EntityType.ENTITY_USER)));
    }

    @RequestMapping(path = {"/followQuestion"}, method = {RequestMethod.POST})
    @ResponseBody
    public String followQuestion(@RequestParam("questionId") int questionId) {
        if (hostHolder.getUser() == null) {
            return WendaUtil.getJSONString(999);
        }

        Question q = questionService.selectById(questionId);
        if (q == null) {
            return WendaUtil.getJSONString(1, "问题不存在");
        }

        boolean ret = followService.follow(hostHolder.getUser().getId(), EntityType.ENTITY_QUESTION, questionId);

        eventProducer.fireEvent(new EventModel(EventType.FOLLOW)
                .setActorId(hostHolder.getUser().getId()).setEntityId(questionId)
                .setEntityType(EntityType.ENTITY_QUESTION).setEntityOwnerId(q.getUserId()));

        Map<String, Object> info = new HashMap<>();
        info.put("headUrl", hostHolder.getUser().getHeadUrl());
        info.put("name", hostHolder.getUser().getName());
        info.put("id", hostHolder.getUser().getId());
        info.put("count", followService.getFollowerCount(EntityType.ENTITY_QUESTION, questionId));
        return WendaUtil.getJSONString(ret ? 0 : 1, info);
    }

    @RequestMapping(path = {"/unfollowQuestion"}, method = {RequestMethod.POST})
    @ResponseBody
    public String unfollowQuestion(@RequestParam("questionId") int questionId) {
        if (hostHolder.getUser() == null) {
            return WendaUtil.getJSONString(999);
        }

        Question q = questionService.selectById(questionId);
        if (q == null) {
            return WendaUtil.getJSONString(1, "问题不存在");
        }

        boolean ret = followService.unfollow(hostHolder.getUser().getId(), EntityType.ENTITY_QUESTION, questionId);

        eventProducer.fireEvent(new EventModel(EventType.UNFOLLOW)
                .setActorId(hostHolder.getUser().getId()).setEntityId(questionId)
                .setEntityType(EntityType.ENTITY_QUESTION).setEntityOwnerId(q.getUserId()));

        Map<String, Object> info = new HashMap<>();
        info.put("id", hostHolder.getUser().getId());
        info.put("count", followService.getFollowerCount(EntityType.ENTITY_QUESTION, questionId));
        return WendaUtil.getJSONString(ret ? 0 : 1, info);
    }

    @RequestMapping(path = {"/user/{uid}/followers"}, method = {RequestMethod.GET})
    public String followers(Model model, @PathVariable("uid") int userId) {
        List<Integer> followerIds = followService.getFollowers(EntityType.ENTITY_USER, userId, 0, 10);
        if (hostHolder.getUser() != null) {
            model.addAttribute("followers", getUsersInfo(hostHolder.getUser().getId(), followerIds));
        } else {
            model.addAttribute("followers", getUsersInfo(0, followerIds));
        }
        model.addAttribute("followerCount", followService.getFollowerCount(EntityType.ENTITY_USER, userId));
        model.addAttribute("curUser", userService.getUser(userId));
        return "followers";
    }

    @RequestMapping(path = {"/user/{uid}/followees"}, method = {RequestMethod.GET})
    public String followees(Model model, @PathVariable("uid") int userId) {
        List<Integer> followeeIds = followService.getFollowees(userId, EntityType.ENTITY_USER, 0, 10);

        if (hostHolder.getUser() != null) {
            model.addAttribute("followees", getUsersInfo(hostHolder.getUser().getId(), followeeIds));
        } else {
            model.addAttribute("followees", getUsersInfo(0, followeeIds));
        }
        model.addAttribute("followeeCount", followService.getFolloweeCount(userId, EntityType.ENTITY_USER));
        model.addAttribute("curUser", userService.getUser(userId));
        return "followees";
    }

    private List<ViewObject> getUsersInfo(int localUserId, List<Integer> userIds) {
        List<ViewObject> userInfos = new ArrayList<ViewObject>();
        for (Integer uid : userIds) {
            User user = userService.getUser(uid);
            if (user == null) {
                continue;
            }
            ViewObject vo = new ViewObject();
            vo.set("user", user);
            vo.set("commentCount", commentService.getUserCommentCount(uid));
            vo.set("followerCount", followService.getFollowerCount(EntityType.ENTITY_USER, uid));
            vo.set("followeeCount", followService.getFolloweeCount(uid, EntityType.ENTITY_USER));
            if (localUserId != 0) {
                vo.set("followed", followService.isFollower(localUserId, EntityType.ENTITY_USER, uid));
            } else {
                vo.set("followed", false);
            }
            userInfos.add(vo);
        }
        return userInfos;
    }
}


================================================
FILE: wenda/src/main/java/com/nowcoder/controller/HomeController.java
================================================
package com.nowcoder.controller;

import com.nowcoder.model.*;
import com.nowcoder.service.CommentService;
import com.nowcoder.service.FollowService;
import com.nowcoder.service.QuestionService;
import com.nowcoder.service.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.ArrayList;
import java.util.List;


@Controller
public class HomeController {
    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    @Autowired
    QuestionService questionService;

    @Autowired
    UserService userService;

    @Autowired
    CommentService commentService;

    @Autowired
    FollowService followService;

    @Autowired
    HostHolder hostHolder;

    private List<ViewObject> getQuestions(int userId, int offset, int limit) {
        List<Question> questionList = questionService.getLatestQuestions(userId, offset, limit);
        List<ViewObject> vos = new ArrayList<>();
        for (Question question : questionList) {
            ViewObject vo = new ViewObject();
            vo.set("question", question);
            vo.set("followCount", followService.getFollowerCount(EntityType.ENTITY_QUESTION, question.getId()));
            vo.set("user", userService.getUser(question.getUserId()));
            vos.add(vo);
        }
        return vos;
    }

    @RequestMapping(path = {"/", "/index"}, method = {RequestMethod.GET, RequestMethod.POST})
    public String index(Model model,
                        @RequestParam(value = "pop", defaultValue = "0") int pop) {
        model.addAttribute("vos", getQuestions(0, 0, 10));
        return "index";
    }

    @RequestMapping(path = {"/user/{userId}"}, method = {RequestMethod.GET, RequestMethod.POST})
    public String userIndex(Model model, @PathVariable("userId") int userId) {
        model.addAttribute("vos", getQuestions(userId, 0, 10));
        User user = userService.getUser(userId);
        ViewObject vo = new ViewObject();
        vo.set("user", user);
        vo.set("commentCount", commentService.getUserCommentCount(userId));
        vo.set("followerCount", followService.getFollowerCount(EntityType.ENTITY_USER, userId));
        vo.set("followeeCount", followService.getFolloweeCount(userId, EntityType.ENTITY_USER));
        if (hostHolder.getUser() != null) {
            vo.set("followed", followService.isFollower(hostHolder.getUser().getId(), EntityType.ENTITY_USER, userId));
        } else {
            vo.set("followed", false);
        }
        model.addAttribute("profileUser", vo);
        return "profile";
    }

}


================================================
FILE: wenda/src/main/java/com/nowcoder/controller/IndexController.java
================================================
package com.nowcoder.controller;

import com.nowcoder.model.User;
import com.nowcoder.service.WendaService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.view.RedirectView;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.*;

//@Controller
public class IndexController {
    private static final Logger logger = LoggerFactory.getLogger(IndexController.class);

    @Autowired
    WendaService wendaService;

    @RequestMapping(path = {"/", "/index"}, method = {RequestMethod.GET})
    @ResponseBody
    public String index(HttpSession httpSession) {
        logger.info("VISIT HOME");
        return wendaService.getMessage(2) + "Hello NowCoder" + httpSession.getAttribute("msg");
    }

    @RequestMapping(path = {"/profile/{groupId}/{userId}"})
    @ResponseBody
    public String profile(@PathVariable("userId") int userId,
                          @PathVariable("groupId") String groupId,
                          @RequestParam(value = "type", defaultValue = "1") int type,
                          @RequestParam(value = "key", required = false) String key) {
        return String.format("Profile Page of %s / %d, t:%d k: %s", groupId, userId, type, key);
    }

    @RequestMapping(path = {"/vm"}, method = {RequestMethod.GET})
    public String template(Model model) {
        model.addAttribute("value1", "vvvvv1");
        List<String> colors = Arrays.asList(new String[]{"RED", "GREEN", "BLUE"});
        model.addAttribute("colors", colors);

        Map<String, String> map = new HashMap<>();
        for (int i = 0; i < 4; ++i) {
            map.put(String.valueOf(i), String.valueOf(i * i));
        }
        model.addAttribute("map", map);
        model.addAttribute("user", new User("LEE"));
        return "home";
    }

    @RequestMapping(path = {"/request"}, method = {RequestMethod.GET})
    @ResponseBody
    public String request(Model model, HttpServletResponse response,
                           HttpServletRequest request,
                           HttpSession httpSession,
                          @CookieValue("JSESSIONID") String sessionId) {
        StringBuilder sb = new StringBuilder();
        sb.append("COOKIEVALUE:" + sessionId);
        Enumeration<String> headerNames = request.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            String name = headerNames.nextElement();
            sb.append(name + ":" + request.getHeader(name) + "<br>");
        }
        if (request.getCookies() != null) {
            for (Cookie cookie : request.getCookies()) {
                sb.append("Cookie:" + cookie.getName() + " value:" + cookie.getValue());
            }
        }
        sb.append(request.getMethod() + "<br>");
        sb.append(request.getQueryString() + "<br>");
        sb.append(request.getPathInfo() + "<br>");
        sb.append(request.getRequestURI() + "<br>");

        response.addHeader("nowcoderId", "hello");
        response.addCookie(new Cookie("username", "nowcoder"));

        return sb.toString();
    }

    @RequestMapping(path = {"/redirect/{code}"}, method = {RequestMethod.GET})
    public RedirectView redirect(@PathVariable("code") int code,
                                 HttpSession httpSession) {
        httpSession.setAttribute("msg", "jump from redirect");
        RedirectView red = new RedirectView("/", true);
        if (code == 301) {
            red.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
        }
        return  red;
    }

    @RequestMapping(path = {"/admin"}, method = {RequestMethod.GET})
    @ResponseBody
    public String admin(@RequestParam("key") String key) {
        if ("admin".equals(key)) {
            return "hello admin";
        }
        throw  new IllegalArgumentException("参数不对");
    }

    @ExceptionHandler()
    @ResponseBody
    public String error(Exception e) {
        return "error:" + e.getMessage();
    }
}


================================================
FILE: wenda/src/main/java/com/nowcoder/controller/LikeController.java
================================================
package com.nowcoder.controller;

import com.nowcoder.async.EventModel;
import com.nowcoder.async.EventProducer;
import com.nowcoder.async.EventType;
import com.nowcoder.model.Comment;
import com.nowcoder.model.EntityType;
import com.nowcoder.model.HostHolder;
import com.nowcoder.service.CommentService;
import com.nowcoder.service.LikeService;
import com.nowcoder.util.WendaUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class LikeController {
    private static final Logger logger = LoggerFactory.getLogger(LikeController.class);

    @Autowired
    LikeService likeService;

    @Autowired
    HostHolder hostHolder;

    @Autowired
    EventProducer eventProducer;

    @Autowired
    CommentService commentService;

    @RequestMapping(path = {"/like"}, method = RequestMethod.POST)
    @ResponseBody
    public String like(@RequestParam("commentId") int commentId) {
        if (hostHolder.getUser() == null) {
            return WendaUtil.getJSONString(999);
        }

        Comment comment = commentService.getCommentById(commentId);

        eventProducer.fireEvent(new EventModel(EventType.LIKE)
                .setActorId(hostHolder.getUser().getId()).setEntityId(commentId)
                .setEntityType(EntityType.ENTITY_COMMENT).setEntityOwnerId(comment.getUserId())
                .setExt("questionId", String.valueOf(comment.getEntityId())));


        long likeCount = likeService.like(hostHolder.getUser().getId(), EntityType.ENTITY_COMMENT, commentId);
        return WendaUtil.getJSONString(0, String.valueOf(likeCount));
    }

    @RequestMapping(path = {"/dislike"}, method = RequestMethod.POST)
    @ResponseBody
    public String dislike(@RequestParam("commentId") int commentId) {
        if (hostHolder.getUser() == null) {
            return WendaUtil.getJSONString(999);
        }
        long likeCount = likeService.disLike(hostHolder.getUser().getId(), EntityType.ENTITY_COMMENT, commentId);
        return WendaUtil.getJSONString(0, String.valueOf(likeCount));
    }
}


================================================
FILE: wenda/src/main/java/com/nowcoder/controller/LoginController.java
================================================
package com.nowcoder.controller;

import com.nowcoder.async.EventProducer;
import com.nowcoder.service.UserService;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

@Controller
public class LoginController {
    private static final Logger logger = LoggerFactory.getLogger(IndexController.class);

    @Autowired
    UserService userService;

    @Autowired
    EventProducer eventProducer;

    @RequestMapping(path = {"/reg/"}, method = RequestMethod.POST)
    public String register(Model model,
                           @RequestParam("username") String username,
                           @RequestParam("password") String password,
                           @RequestParam(value = "next", required = false) String next,
                           HttpServletResponse response) {
        try {
            Map<String, String> map = userService.register(username, password);
            if (map.containsKey("ticket")) {
                Cookie cookie = new Cookie("ticket", map.get("ticket"));
                cookie.setPath("/");
                response.addCookie(cookie);
                if (StringUtils.isNotBlank(next)) {
                    return "redirect:" + next;
                }
                return "redirect:/";
            } else {
                model.addAttribute("msg", map.get("msg"));
                return "login";
            }
        } catch (Exception e) {
            logger.error("注册异常:" + e.getMessage());
            return "login";
        }
    }

    @RequestMapping(path = {"/login/"}, method = RequestMethod.POST)
    public String login(Model model,
                        @RequestParam("username") String username,
                        @RequestParam("password") String password,
                        @RequestParam(value = "next", required = false) String next,
                        @RequestParam(value = "rememberme", defaultValue = "false") boolean rememberme,
                        HttpServletResponse response) {
        try {
            Map<String, String> map = userService.login(username, password);
            if (map.containsKey("ticket")) {
                Cookie cookie = new Cookie("ticket", map.get("ticket"));
                cookie.setPath("/");
                if (rememberme) {
                    cookie.setMaxAge(3600 * 24 * 5);
                }
                response.addCookie(cookie);

//                eventProducer.fireEvent(new EventModel(EventType.LOGIN)
//                        .setExt("username", username).setExt("email", "hzcforever@163.com")
//                        .setActorId(Integer.parseInt(map.get("userId"))));

                if (StringUtils.isNotBlank(next)) {
                    return "redirect:" + next;
                }
                return "redirect:/";
            } else {
                model.addAttribute("msg", map.get("msg"));
                return "login";
            }
        } catch (Exception e) {
            logger.error("登录异常:" + e.getMessage());
        }
        return "login";
    }

    @RequestMapping(path = {"/relogin"}, method = RequestMethod.GET)
    public String relogin(Model model, @RequestParam(value = "next", defaultValue = "", required = false) String next) {
        model.addAttribute("next", next);
        return "login";
    }

    @RequestMapping(path = {"/logout"}, method = RequestMethod.GET)
    public String logout(@CookieValue("ticket") String ticket) {
        userService.logout(ticket);
        return "redirect:/";
    }
}


================================================
FILE: wenda/src/main/java/com/nowcoder/controller/MessageController.java
================================================
package com.nowcoder.controller;

import com.nowcoder.model.HostHolder;
import com.nowcoder.model.Message;
import com.nowcoder.model.User;
import com.nowcoder.model.ViewObject;
import com.nowcoder.service.MessageService;
import com.nowcoder.service.UserService;
import com.nowcoder.util.WendaUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Controller
public class MessageController {
    private static final Logger logger = LoggerFactory.getLogger(MessageController.class);

    @Autowired
    HostHolder hostHolder;

    @Autowired
    MessageService messageService;

    @Autowired
    UserService userService;

    @RequestMapping(path = {"/msg/list"}, method = RequestMethod.GET)
    public String getConversationList(Model model) {
        if (hostHolder.getUser() == null) {
            return "redirect:/relogin";
        }
        int localUserId = hostHolder.getUser().getId();
        List<Message> conversationList = messageService.getConversationList(localUserId, 0, 10);
        List<ViewObject> conversations = new ArrayList<>();
        for (Message message : conversationList) {
            ViewObject vo = new ViewObject();
            vo.set("message", message);
            int targetId = message.getFromId() == localUserId ? message.getToId() : message.getFromId();
            vo.set("user", userService.getUser(targetId));
            vo.set("unread", messageService.getConversationUnreadCount(localUserId, message.getConversationId()));
            conversations.add(vo);
        }
        model.addAttribute("conversations", conversations);
        return "letter";
    }

    @RequestMapping(path = {"/msg/detail"}, method = RequestMethod.GET)
    public String getConversationDetail(Model model,
                                        @RequestParam("conversationId") String conversationId) {
        try {
            List<Message> messageList = messageService.getConversationDetail(conversationId, 0, 10);
            List<ViewObject> messages = new ArrayList<>();
            for (Message message : messageList) {
                messageService.updateHasRead(hostHolder.getUser().getId()); //将已查看的message改为已读
                ViewObject vo = new ViewObject();
                vo.set("message", message);
                vo.set("user", userService.getUser(message.getFromId()));
                messages.add(vo);
            }
            model.addAttribute("messages", messages);

        } catch (Exception e) {
            logger.error("获取消息详情失败!" + e.getMessage());
        }
        return "letterDetail";
    }

    @RequestMapping(path = {"/msg/addMessage"}, method = RequestMethod.POST)
    @ResponseBody
    public String addMessage(@RequestParam("toName") String toName,
                             @RequestParam("content") String content) {
        try {
            if (hostHolder.getUser() == null) {
                return WendaUtil.getJSONString(999, "未登录!");
            }
            User user = userService.selectByName(toName);
            if (user == null) {
                return WendaUtil.getJSONString(1, "用户不存在!");
            }
            Message message = new Message();
            message.setFromId(hostHolder.getUser().getId());
            message.setContent(content);
            message.setCreatedDate(new Date());
            message.setToId(user.getId());
            messageService.addMessage(message);
            return WendaUtil.getJSONString(0);
        } catch (Exception e) {
            logger.error("发送消息失败!" +e.getMessage());
            return WendaUtil.getJSONString(1, "发送消息失败!");
        }
    }
}


================================================
FILE: wenda/src/main/java/com/nowcoder/controller/QuestionController.java
================================================
package com.nowcoder.controller;

import com.nowcoder.model.*;
import com.nowcoder.service.*;
import com.nowcoder.util.WendaUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Controller
public class QuestionController {
    private static final Logger logger = LoggerFactory.getLogger(QuestionController.class);

    @Autowired
    QuestionService questionService;

    @Autowired
    UserService userService;

    @Autowired
    CommentService commentService;

    @Autowired
    HostHolder hostHolder;

    @Autowired
    LikeService likeService;

    @Autowired
    FollowService followService;

    @RequestMapping(value = "/question/add", method = RequestMethod.POST)
    @ResponseBody
    public String addQuestion(@RequestParam("title") String title,
                              @RequestParam("content") String content) {
        try {
            Question question = new Question();
            question.setTitle(title);
            question.setContent(content);
            question.setCommentCount(0);
            question.setCreatedDate(new Date());
            if (hostHolder.getUser() == null) {
//                question.setUserId(WendaUtil.ANONYMOUS_USERID);
                return WendaUtil.getJSONString(999);
            } else {
                question.setUserId(hostHolder.getUser().getId());
            }
            if (questionService.addQuestion(question) > 0) {
                return WendaUtil.getJSONString(0);
            }
        } catch (Exception e) {
            logger.error("增加提问失败," + e.getMessage());
        }
        return WendaUtil.getJSONString(1, "Failure!");
    }

    @RequestMapping(path = {"/question/{qid}"})
    public String questionDetail(Model model, @PathVariable("qid") int qid) {
        Question question = questionService.selectById(qid);
        model.addAttribute("question", question);
        model.addAttribute("user", userService.getUser(question.getUserId()));

        List<Comment> commentList = commentService.getCommentsByEntity(qid, EntityType.ENTITY_QUESTION);
        List<ViewObject> comments = new ArrayList<ViewObject>();
        for (Comment comment : commentList) {
            ViewObject vo = new ViewObject();
            vo.set("comment", comment);
            if (hostHolder.getUser() == null) {
                vo.set("liked", 0);
            } else {
                vo.set("liked", likeService.getLikeStatus(hostHolder.getUser().getId(), EntityType.ENTITY_COMMENT, comment.getId()));
            }
            vo.set("likeCount", likeService.getLikeCount(EntityType.ENTITY_COMMENT, comment.getId()));
            vo.set("user", userService.getUser(comment.getUserId()));
            comments.add(vo);
        }
        model.addAttribute("comments", comments);

        List<ViewObject> followUsers = new ArrayList<ViewObject>();
        List<Integer> users = followService.getFollowers(EntityType.ENTITY_QUESTION, qid, 20);
        for (Integer userId : users) {
            ViewObject vo = new ViewObject();
            User u = userService.getUser(userId);
            if (u == null) {
                continue;
            }
            vo.set("name", u.getName());
            vo.set("headUrl", u.getHeadUrl());
            vo.set("id", u.getId());
            followUsers.add(vo);
        }
        model.addAttribute("followUsers", followUsers);
        if (hostHolder.getUser() != null) {
            model.addAttribute("followed", followService.isFollower(hostHolder.getUser().getId(), EntityType.ENTITY_QUESTION, qid));
        } else {
            model.addAttribute("followed", false);
        }

        return "detail";
    }
}


================================================
FILE: wenda/src/main/java/com/nowcoder/controller/SettingController.java
================================================
package com.nowcoder.controller;

import com.nowcoder.service.WendaService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpSession;


@Controller
public class SettingController {
    @Autowired
    WendaService wendaService;

    @RequestMapping(path = {"/setting"}, method = {RequestMethod.GET})
    @ResponseBody
    public String setting(HttpSession httpSession) {
        return "Setting OK. " + wendaService.getMessage(1);
    }
}


================================================
FILE: wenda/src/main/java/com/nowcoder/dao/CommentDAO.java
================================================
package com.nowcoder.dao;

import com.nowcoder.model.Comment;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@Mapper
public interface CommentDAO {
    String TABLE_NAME = " comment ";
    String INSERT_FIELDS = " user_id, created_date, entity_id, entity_type, status, content ";
    String SELECT_FIELDS = " id, " + INSERT_FIELDS;

    @Insert({"insert into ", TABLE_NAME, "(", INSERT_FIELDS,
            ") values (#{userId},#{createdDate},#{entityId},#{entityType},#{status},#{content})"})
    int addComment(Comment comment);


    @Select({"select ", SELECT_FIELDS, " from", TABLE_NAME,
            "where entity_id=#{entityId} and entity_type=#{entityType} order by created_date desc"})
    List<Comment> selectCommentByEntity(@Param("entityId") int entityId, @Param("entityType") int entityType);


    @Select({"select count(id) from ", TABLE_NAME, "where entity_id=#{entityId} and entity_type=#{entityType} order by created_date desc"})
    int getCommentCount(@Param("entityId") int entityId, @Param("entityType") int entityType);


    @Select({"select count(id) from ", TABLE_NAME, "where user_id=#{userId}"})
    int getUserCommentCount(@Param("userId") int userId);

    @Select({"select ", SELECT_FIELDS, " from", TABLE_NAME, "where id=#{id}"})
    Comment getCommentById(int id);

    @Update({"update comment set status=#{status} where id=#{id}"})
    int updateStatus(@Param("id") int id, @Param("status") int status);
}


================================================
FILE: wenda/src/main/java/com/nowcoder/dao/FeedDAO.java
================================================
package com.nowcoder.dao;

import com.nowcoder.model.Feed;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@Mapper
public interface FeedDAO {
    String TABLE_NAME = " feed ";
    String INSERT_FIELDS = " user_id, data, created_date, type ";
    String SELECT_FIELDS = " id, " + INSERT_FIELDS;

    @Insert({"insert into ", TABLE_NAME, "(", INSERT_FIELDS,
            ") values (#{userId},#{data},#{createdDate},#{type})"})
    int addFeed(Feed feed);


    @Select({"select ", SELECT_FIELDS, " from ", TABLE_NAME, " where id=#{id}"})
    Feed getFeedById(int id);

    List<Feed> selectUserFeeds(@Param("maxId") int maxId,
                               @Param("userIds") List<Integer> userIds,
                               @Param("count") int count);

}


================================================
FILE: wenda/src/main/java/com/nowcoder/dao/LoginTicketDAO.java
================================================
package com.nowcoder.dao;

import com.nowcoder.model.LoginTicket;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Service;

@Service
@Mapper
public interface LoginTicketDAO {
    String TABLE_NAME = " login_ticket ";
    String INSERT_FIELDS = " user_id, expired, status, ticket ";
    String SELECT_FIELDS = " id, " + INSERT_FIELDS;

    @Insert({"insert into ", TABLE_NAME, "(", INSERT_FIELDS,
            ") values (#{userId},#{expired},#{status},#{ticket})"})
    int addTicket(LoginTicket ticket);

    @Select({"select ", SELECT_FIELDS, "from", TABLE_NAME, "where ticket = #{ticket}"})
    LoginTicket selectByTicket(String ticket);

    @Update({"update ", TABLE_NAME, "set status = #{status} where ticket = #{ticket}"})
    void updateStatus(@Param("ticket") String ticket, @Param("status") int status);
}


================================================
FILE: wenda/src/main/java/com/nowcoder/dao/MessageDAO.java
================================================
package com.nowcoder.dao;

import com.nowcoder.model.Message;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@Mapper
public interface MessageDAO {
    String TABLE_NAME = " message ";
    String INSERT_FIELDS = " from_id, to_id, content, created_date, has_read, conversation_id ";
    String SELECT_FIELDS = " id, " + INSERT_FIELDS;

    @Insert({"insert into ", TABLE_NAME, "(", INSERT_FIELDS,
            ") values (#{fromId},#{toId},#{content},#{createdDate},#{hasRead},#{conversationId})"})
    int addMessage(Message message);

    @Select({"select ", SELECT_FIELDS, " from ", TABLE_NAME,
            " where conversation_id=#{conversationId} order by created_date desc limit #{offset}, #{limit}"})
    List<Message> getConversationDetail(@Param("conversationId") String conversationId,
                                        @Param("offset") int offset,
                                        @Param("limit") int limit);

    @Select({"select ", INSERT_FIELDS, ", count(id) as id from ( select * from ", TABLE_NAME,
            " where from_id=#{userId} or to_id=#{userId} group by conversation_id, created_date desc ) " +
                    "tt group by conversation_id order by created_date desc limit #{offset}, #{limit} "})
    List<Message> getConversationList(@Param("userId") int userId,
                                      @Param("offset") int offset,
                                      @Param("limit") int limit);

    @Select({"select count(id) from ", TABLE_NAME, " where has_read=0 and to_id=#{userId} and conversation_id=#{conversationId}"})
    int getConversationUnreadCount(@Param("userId") int userId,
                                   @Param("conversationId") String conversationId);

    @Update({"update ", TABLE_NAME, " set has_read=1 where to_id=#{toId}"})
    void updateHasRead(int toId);

}


================================================
FILE: wenda/src/main/java/com/nowcoder/dao/QuestionDAO.java
================================================
package com.nowcoder.dao;

import com.nowcoder.model.Question;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@Mapper
public interface QuestionDAO {
    String TABLE_NAME = " question ";
    String INSERT_FIELDS = " title, content, created_date, user_id, comment_count ";
    String SELECT_FIELDS = " id, " + INSERT_FIELDS;

    @Insert({"insert into ", TABLE_NAME, "(", INSERT_FIELDS,
            ") values (#{title},#{content},#{createdDate},#{userId},#{commentCount})"})
    int addQuestion(Question question);

    @Select({"select ", SELECT_FIELDS, " from", TABLE_NAME, " where id=#{id}"})
    Question selectById(int id);

    List<Question> selectLatestQuestions(@Param("userId") int userId, @Param("offset") int offset,
                                         @Param("limit") int limit);

    @Update({"update ", TABLE_NAME, " set comment_count=#{commentCount} where id=#{id}"})
    int updateCommentCount(@Param("id") int id, @Param("commentCount") int commentCount);

}


================================================
FILE: wenda/src/main/java/com/nowcoder/dao/UserDAO.java
================================================
package com.nowcoder.dao;

import com.nowcoder.model.User;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Service;


@Service
@Mapper
public interface UserDAO {
    // 注意空格
    String TABLE_NAME = " user ";
    String INSERT_FIELDS = " id, name, password, salt, head_url ";
    String SELECT_FIELDS = " id, " + INSERT_FIELDS;

    @Insert({"insert into ", TABLE_NAME, "(", INSERT_FIELDS,
            ") values (#{id},#{name},#{password},#{salt},#{headUrl})"})
    int addUser(User user);

    @Select({"select ", SELECT_FIELDS, " from ", TABLE_NAME, " where id=#{id}"})
    User selectById(int id);

    @Select({"select ", SELECT_FIELDS, " from ", TABLE_NAME, " where name=#{name}"})
    User selectByName(String name);

    @Update({"update ", TABLE_NAME, " set password=#{password} where id=#{id}"})
    void updatePassword(User user);

    @Delete({"delete from ", TABLE_NAME, " where id=#{id}"})
    void deleteById(int id);
}


================================================
FILE: wenda/src/main/java/com/nowcoder/interceptor/LoginRequredInterceptor.java
================================================
package com.nowcoder.interceptor;

import com.nowcoder.model.HostHolder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class LoginRequredInterceptor implements HandlerInterceptor {

    @Autowired
    HostHolder hostHolder;

    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        if (hostHolder.getUser() == null) {
            httpServletResponse.sendRedirect("/relogin?next=" + httpServletRequest.getRequestURI());
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

    }
}


================================================
FILE: wenda/src/main/java/com/nowcoder/interceptor/PassportInterceptor.java
================================================
package com.nowcoder.interceptor;

import com.nowcoder.dao.LoginTicketDAO;
import com.nowcoder.dao.UserDAO;
import com.nowcoder.model.HostHolder;
import com.nowcoder.model.LoginTicket;
import com.nowcoder.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;

@Component
public class PassportInterceptor implements HandlerInterceptor {

    @Autowired
    LoginTicketDAO loginTicketDAO;
    @Autowired
    UserDAO userDAO;
    @Autowired
    HostHolder hostHolder;

    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        String ticket = null;
        if (httpServletRequest.getCookies() != null) {
            for (Cookie cookie : httpServletRequest.getCookies()) {
                if(cookie.getName().equals("ticket")) {
                    ticket = cookie.getValue();
                    break;
                }
            }
        }
        if (ticket != null) {
            LoginTicket loginTicket = loginTicketDAO.selectByTicket(ticket);
            if(loginTicket == null || loginTicket.getExpired().before(new Date()) || loginTicket.getStatus() != 0) {
                return true;
            }
            User user = userDAO.selectById(loginTicket.getUserId());
            hostHolder.setUser(user);
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        if(modelAndView != null) {
            modelAndView.addObject("user", hostHolder.getUser());
        }
    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        hostHolder.clear();
    }
}


================================================
FILE: wenda/src/main/java/com/nowcoder/model/Comment.java
================================================
package com.nowcoder.model;

import java.util.Date;

public class Comment {
    private int id;
    private int userId;
    private int entityId;
    private int entityType;
    private String content;
    private Date createdDate;
    private int status;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public int getEntityId() {
        return entityId;
    }

    public void setEntityId(int entityId) {
        this.entityId = entityId;
    }

    public int getEntityType() {
        return entityType;
    }

    public void setEntityType(int entityType) {
        this.entityType = entityType;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public Date getCreatedDate() {
        return createdDate;
    }

    public void setCreatedDate
Download .txt
gitextract_xieu8nyq/

├── README.md
├── wenda/
│   ├── .idea/
│   │   ├── compiler.xml
│   │   ├── encodings.xml
│   │   ├── inspectionProfiles/
│   │   │   └── Project_Default.xml
│   │   ├── libraries/
│   │   │   ├── Maven__antlr_antlr_2_7_7.xml
│   │   │   ├── Maven__aopalliance_aopalliance_1_0.xml
│   │   │   ├── Maven__ch_qos_logback_logback_classic_1_1_7.xml
│   │   │   ├── Maven__ch_qos_logback_logback_core_1_1_7.xml
│   │   │   ├── Maven__com_alibaba_fastjson_1_2_13.xml
│   │   │   ├── Maven__com_fasterxml_classmate_1_1_0.xml
│   │   │   ├── Maven__com_fasterxml_jackson_core_jackson_annotations_2_6_7.xml
│   │   │   ├── Maven__com_fasterxml_jackson_core_jackson_core_2_6_7.xml
│   │   │   ├── Maven__com_fasterxml_jackson_core_jackson_databind_2_6_7.xml
│   │   │   ├── Maven__com_google_protobuf_protobuf_java_2_6_0.xml
│   │   │   ├── Maven__commons_beanutils_commons_beanutils_1_9_2.xml
│   │   │   ├── Maven__commons_chain_commons_chain_1_1.xml
│   │   │   ├── Maven__commons_collections_commons_collections_3_2_2.xml
│   │   │   ├── Maven__commons_digester_commons_digester_2_1.xml
│   │   │   ├── Maven__commons_lang_commons_lang_2_4.xml
│   │   │   ├── Maven__commons_validator_commons_validator_1_3_1.xml
│   │   │   ├── Maven__dom4j_dom4j_1_1.xml
│   │   │   ├── Maven__javax_activation_activation_1_1.xml
│   │   │   ├── Maven__javax_mail_mail_1_4_7.xml
│   │   │   ├── Maven__javax_validation_validation_api_1_1_0_Final.xml
│   │   │   ├── Maven__junit_junit_4_12.xml
│   │   │   ├── Maven__mysql_mysql_connector_java_8_0_12.xml
│   │   │   ├── Maven__org_apache_commons_commons_pool2_2_4_2.xml
│   │   │   ├── Maven__org_apache_struts_struts_core_1_3_8.xml
│   │   │   ├── Maven__org_apache_struts_struts_taglib_1_3_8.xml
│   │   │   ├── Maven__org_apache_struts_struts_tiles_1_3_8.xml
│   │   │   ├── Maven__org_apache_tomcat_embed_tomcat_embed_core_8_0_36.xml
│   │   │   ├── Maven__org_apache_tomcat_embed_tomcat_embed_el_8_0_36.xml
│   │   │   ├── Maven__org_apache_tomcat_embed_tomcat_embed_logging_juli_8_0_36.xml
│   │   │   ├── Maven__org_apache_tomcat_embed_tomcat_embed_websocket_8_0_36.xml
│   │   │   ├── Maven__org_apache_tomcat_tomcat_jdbc_8_0_36.xml
│   │   │   ├── Maven__org_apache_tomcat_tomcat_juli_8_0_36.xml
│   │   │   ├── Maven__org_apache_velocity_velocity_1_7.xml
│   │   │   ├── Maven__org_apache_velocity_velocity_tools_2_0.xml
│   │   │   ├── Maven__org_aspectj_aspectjweaver_1_8_9.xml
│   │   │   ├── Maven__org_hamcrest_hamcrest_core_1_3.xml
│   │   │   ├── Maven__org_hamcrest_hamcrest_library_1_3.xml
│   │   │   ├── Maven__org_hibernate_hibernate_validator_5_2_4_Final.xml
│   │   │   ├── Maven__org_jboss_logging_jboss_logging_3_3_0_Final.xml
│   │   │   ├── Maven__org_mockito_mockito_core_1_10_19.xml
│   │   │   ├── Maven__org_mybatis_mybatis_3_4_0.xml
│   │   │   ├── Maven__org_mybatis_mybatis_spring_1_3_0.xml
│   │   │   ├── Maven__org_mybatis_spring_boot_mybatis_spring_boot_autoconfigure_1_1_1.xml
│   │   │   ├── Maven__org_mybatis_spring_boot_mybatis_spring_boot_starter_1_1_1.xml
│   │   │   ├── Maven__org_objenesis_objenesis_2_1.xml
│   │   │   ├── Maven__org_slf4j_jcl_over_slf4j_1_7_21.xml
│   │   │   ├── Maven__org_slf4j_jul_to_slf4j_1_7_21.xml
│   │   │   ├── Maven__org_slf4j_log4j_over_slf4j_1_7_21.xml
│   │   │   ├── Maven__org_slf4j_slf4j_api_1_7_21.xml
│   │   │   ├── Maven__org_springframework_boot_spring_boot_1_3_6_RELEASE.xml
│   │   │   ├── Maven__org_springframework_boot_spring_boot_autoconfigure_1_3_6_RELEASE.xml
│   │   │   ├── Maven__org_springframework_boot_spring_boot_devtools_1_3_6_RELEASE.xml
│   │   │   ├── Maven__org_springframework_boot_spring_boot_starter_1_3_6_RELEASE.xml
│   │   │   ├── Maven__org_springframework_boot_spring_boot_starter_aop_1_3_6_RELEASE.xml
│   │   │   ├── Maven__org_springframework_boot_spring_boot_starter_jdbc_1_3_6_RELEASE.xml
│   │   │   ├── Maven__org_springframework_boot_spring_boot_starter_logging_1_3_6_RELEASE.xml
│   │   │   ├── Maven__org_springframework_boot_spring_boot_starter_test_1_3_6_RELEASE.xml
│   │   │   ├── Maven__org_springframework_boot_spring_boot_starter_tomcat_1_3_6_RELEASE.xml
│   │   │   ├── Maven__org_springframework_boot_spring_boot_starter_validation_1_3_6_RELEASE.xml
│   │   │   ├── Maven__org_springframework_boot_spring_boot_starter_velocity_1_3_6_RELEASE.xml
│   │   │   ├── Maven__org_springframework_boot_spring_boot_starter_web_1_3_6_RELEASE.xml
│   │   │   ├── Maven__org_springframework_spring_aop_4_2_7_RELEASE.xml
│   │   │   ├── Maven__org_springframework_spring_beans_4_2_7_RELEASE.xml
│   │   │   ├── Maven__org_springframework_spring_context_4_2_7_RELEASE.xml
│   │   │   ├── Maven__org_springframework_spring_context_support_4_2_7_RELEASE.xml
│   │   │   ├── Maven__org_springframework_spring_core_4_2_7_RELEASE.xml
│   │   │   ├── Maven__org_springframework_spring_expression_4_2_7_RELEASE.xml
│   │   │   ├── Maven__org_springframework_spring_jdbc_4_2_7_RELEASE.xml
│   │   │   ├── Maven__org_springframework_spring_test_4_2_7_RELEASE.xml
│   │   │   ├── Maven__org_springframework_spring_tx_4_2_7_RELEASE.xml
│   │   │   ├── Maven__org_springframework_spring_web_4_2_7_RELEASE.xml
│   │   │   ├── Maven__org_springframework_spring_webmvc_4_2_7_RELEASE.xml
│   │   │   ├── Maven__org_yaml_snakeyaml_1_16.xml
│   │   │   ├── Maven__oro_oro_2_0_8.xml
│   │   │   ├── Maven__redis_clients_jedis_2_9_0.xml
│   │   │   └── Maven__sslext_sslext_1_2_0.xml
│   │   ├── misc.xml
│   │   ├── modules.xml
│   │   └── workspace.xml
│   ├── .mvn/
│   │   └── wrapper/
│   │       ├── maven-wrapper.jar
│   │       └── maven-wrapper.properties
│   ├── mvnw
│   ├── mvnw.cmd
│   ├── pom.xml
│   ├── pyspider/
│   │   ├── conf.json
│   │   └── data/
│   │       ├── scheduler.1d
│   │       ├── scheduler.1h
│   │       └── scheduler.all
│   ├── src/
│   │   ├── main/
│   │   │   ├── java/
│   │   │   │   └── com/
│   │   │   │       └── nowcoder/
│   │   │   │           ├── WendaApplication.java
│   │   │   │           ├── aspect/
│   │   │   │           │   └── LogAspect.java
│   │   │   │           ├── async/
│   │   │   │           │   ├── EventConsumer.java
│   │   │   │           │   ├── EventHandler.java
│   │   │   │           │   ├── EventModel.java
│   │   │   │           │   ├── EventProducer.java
│   │   │   │           │   ├── EventType.java
│   │   │   │           │   └── handler/
│   │   │   │           │       ├── FeedHandler.java
│   │   │   │           │       ├── FollowHandler.java
│   │   │   │           │       ├── LikeHandler.java
│   │   │   │           │       └── LoginExceptionHandler.java
│   │   │   │           ├── configuration/
│   │   │   │           │   └── WendaWebConfiguration.java
│   │   │   │           ├── controller/
│   │   │   │           │   ├── CommentController.java
│   │   │   │           │   ├── FeedController.java
│   │   │   │           │   ├── FollowController.java
│   │   │   │           │   ├── HomeController.java
│   │   │   │           │   ├── IndexController.java
│   │   │   │           │   ├── LikeController.java
│   │   │   │           │   ├── LoginController.java
│   │   │   │           │   ├── MessageController.java
│   │   │   │           │   ├── QuestionController.java
│   │   │   │           │   └── SettingController.java
│   │   │   │           ├── dao/
│   │   │   │           │   ├── CommentDAO.java
│   │   │   │           │   ├── FeedDAO.java
│   │   │   │           │   ├── LoginTicketDAO.java
│   │   │   │           │   ├── MessageDAO.java
│   │   │   │           │   ├── QuestionDAO.java
│   │   │   │           │   └── UserDAO.java
│   │   │   │           ├── interceptor/
│   │   │   │           │   ├── LoginRequredInterceptor.java
│   │   │   │           │   └── PassportInterceptor.java
│   │   │   │           ├── model/
│   │   │   │           │   ├── Comment.java
│   │   │   │           │   ├── EntityType.java
│   │   │   │           │   ├── Feed.java
│   │   │   │           │   ├── HostHolder.java
│   │   │   │           │   ├── LoginTicket.java
│   │   │   │           │   ├── Message.java
│   │   │   │           │   ├── Question.java
│   │   │   │           │   ├── User.java
│   │   │   │           │   └── ViewObject.java
│   │   │   │           ├── service/
│   │   │   │           │   ├── CommentService.java
│   │   │   │           │   ├── FeedService.java
│   │   │   │           │   ├── FollowService.java
│   │   │   │           │   ├── LikeService.java
│   │   │   │           │   ├── LoginTicketService.java
│   │   │   │           │   ├── MessageService.java
│   │   │   │           │   ├── QuestionService.java
│   │   │   │           │   ├── SensitiveService.java
│   │   │   │           │   ├── UserService.java
│   │   │   │           │   └── WendaService.java
│   │   │   │           └── util/
│   │   │   │               ├── JedisAdapter.java
│   │   │   │               ├── MailSender.java
│   │   │   │               ├── RedisKeyUtil.java
│   │   │   │               └── WendaUtil.java
│   │   │   └── resources/
│   │   │       ├── SensitiveWords.txt
│   │   │       ├── application.properties
│   │   │       ├── com/
│   │   │       │   └── nowcoder/
│   │   │       │       └── dao/
│   │   │       │           ├── FeedDAO.xml
│   │   │       │           └── QuestionDAO.xml
│   │   │       ├── mybatis-config.xml
│   │   │       ├── static/
│   │   │       │   ├── scripts/
│   │   │       │   │   ├── base.fb262f0e.js
│   │   │       │   │   ├── common.fed5411f.js
│   │   │       │   │   ├── ga.js
│   │   │       │   │   ├── instant.e7a17de6.js
│   │   │       │   │   ├── main/
│   │   │       │   │   │   ├── base/
│   │   │       │   │   │   │   ├── base.js
│   │   │       │   │   │   │   ├── event.js
│   │   │       │   │   │   │   └── util.js
│   │   │       │   │   │   ├── component/
│   │   │       │   │   │   │   ├── component.js
│   │   │       │   │   │   │   ├── popup.js
│   │   │       │   │   │   │   ├── popupAdd.js
│   │   │       │   │   │   │   └── popupMsg.js
│   │   │       │   │   │   ├── jquery.js
│   │   │       │   │   │   ├── site/
│   │   │       │   │   │   │   ├── detail.js
│   │   │       │   │   │   │   ├── follow.js
│   │   │       │   │   │   │   ├── home.js
│   │   │       │   │   │   │   └── profile.js
│   │   │       │   │   │   └── util/
│   │   │       │   │   │       ├── action.js
│   │   │       │   │   │       └── business.js
│   │   │       │   │   ├── page-index.d7b54ac7.js
│   │   │       │   │   ├── page-main.5d4c554d.js
│   │   │       │   │   ├── richtexteditor.aa0a4005.js
│   │   │       │   │   └── vendor.ff76fbae.js
│   │   │       │   └── styles/
│   │   │       │       ├── detail.css
│   │   │       │       ├── index.css
│   │   │       │       ├── letter.css
│   │   │       │       ├── login.css
│   │   │       │       └── result.css
│   │   │       ├── templates/
│   │   │       │   ├── detail.html
│   │   │       │   ├── error.html
│   │   │       │   ├── feeds.html
│   │   │       │   ├── followees.html
│   │   │       │   ├── followers.html
│   │   │       │   ├── footer.html
│   │   │       │   ├── header.html
│   │   │       │   ├── home.html
│   │   │       │   ├── index.html
│   │   │       │   ├── js.html
│   │   │       │   ├── letter.html
│   │   │       │   ├── letterDetail.html
│   │   │       │   ├── login.html
│   │   │       │   ├── mails/
│   │   │       │   │   └── login_exception.html
│   │   │       │   ├── profile.html
│   │   │       │   └── result.html
│   │   │       └── toolbox.xml
│   │   └── test/
│   │       ├── java/
│   │       │   └── com/
│   │       │       └── nowcoder/
│   │       │           ├── InitDatabaseTests.java
│   │       │           ├── ThreadTest.java
│   │       │           └── WendaApplicationTests.java
│   │       └── resources/
│   │           └── init-schema.sql
│   ├── target/
│   │   ├── classes/
│   │   │   ├── SensitiveWords.txt
│   │   │   ├── application.properties
│   │   │   ├── com/
│   │   │   │   └── nowcoder/
│   │   │   │       └── dao/
│   │   │   │           ├── FeedDAO.xml
│   │   │   │           └── QuestionDAO.xml
│   │   │   ├── mybatis-config.xml
│   │   │   ├── static/
│   │   │   │   ├── scripts/
│   │   │   │   │   ├── base.fb262f0e.js
│   │   │   │   │   ├── common.fed5411f.js
│   │   │   │   │   ├── ga.js
│   │   │   │   │   ├── instant.e7a17de6.js
│   │   │   │   │   ├── main/
│   │   │   │   │   │   ├── base/
│   │   │   │   │   │   │   ├── base.js
│   │   │   │   │   │   │   ├── event.js
│   │   │   │   │   │   │   └── util.js
│   │   │   │   │   │   ├── component/
│   │   │   │   │   │   │   ├── component.js
│   │   │   │   │   │   │   ├── popup.js
│   │   │   │   │   │   │   ├── popupAdd.js
│   │   │   │   │   │   │   └── popupMsg.js
│   │   │   │   │   │   ├── jquery.js
│   │   │   │   │   │   ├── site/
│   │   │   │   │   │   │   ├── detail.js
│   │   │   │   │   │   │   ├── follow.js
│   │   │   │   │   │   │   ├── home.js
│   │   │   │   │   │   │   └── profile.js
│   │   │   │   │   │   └── util/
│   │   │   │   │   │       ├── action.js
│   │   │   │   │   │       └── business.js
│   │   │   │   │   ├── page-index.d7b54ac7.js
│   │   │   │   │   ├── page-main.5d4c554d.js
│   │   │   │   │   ├── richtexteditor.aa0a4005.js
│   │   │   │   │   └── vendor.ff76fbae.js
│   │   │   │   └── styles/
│   │   │   │       ├── detail.css
│   │   │   │       ├── index.css
│   │   │   │       ├── letter.css
│   │   │   │       ├── login.css
│   │   │   │       └── result.css
│   │   │   ├── templates/
│   │   │   │   ├── detail.html
│   │   │   │   ├── error.html
│   │   │   │   ├── feeds.html
│   │   │   │   ├── followees.html
│   │   │   │   ├── followers.html
│   │   │   │   ├── footer.html
│   │   │   │   ├── header.html
│   │   │   │   ├── home.html
│   │   │   │   ├── index.html
│   │   │   │   ├── js.html
│   │   │   │   ├── letter.html
│   │   │   │   ├── letterDetail.html
│   │   │   │   ├── login.html
│   │   │   │   ├── mails/
│   │   │   │   │   └── login_exception.html
│   │   │   │   ├── profile.html
│   │   │   │   └── result.html
│   │   │   └── toolbox.xml
│   │   └── test-classes/
│   │       └── init-schema.sql
│   └── wenda.iml
└── wenda.sql
Download .txt
SYMBOL INDEX (1046 symbols across 103 files)

FILE: wenda.sql
  type `comment` (line 22) | CREATE TABLE `comment` (
  type `feed` (line 38) | CREATE TABLE `feed` (
  type `login_ticket` (line 52) | CREATE TABLE `login_ticket` (
  type `message` (line 66) | CREATE TABLE `message` (
  type `question` (line 83) | CREATE TABLE `question` (
  type `user` (line 98) | CREATE TABLE `user` (

FILE: wenda/src/main/java/com/nowcoder/WendaApplication.java
  class WendaApplication (line 7) | @SpringBootApplication
    method main (line 10) | public static void main(String[] args) {

FILE: wenda/src/main/java/com/nowcoder/aspect/LogAspect.java
  class LogAspect (line 13) | @Aspect
    method beforeMethod (line 18) | @Before("execution(* com.nowcoder.controller.*Controller.*(..))")
    method afterMethod (line 27) | @After("execution(* com.nowcoder.controller.IndexController.*(..))")

FILE: wenda/src/main/java/com/nowcoder/async/EventConsumer.java
  class EventConsumer (line 20) | @Service
    method afterPropertiesSet (line 31) | @Override
    method setApplicationContext (line 70) | @Override

FILE: wenda/src/main/java/com/nowcoder/async/EventHandler.java
  type EventHandler (line 5) | public interface EventHandler {
    method doHandler (line 6) | void doHandler(EventModel model);
    method getSupportEventTypes (line 7) | List<EventType> getSupportEventTypes();

FILE: wenda/src/main/java/com/nowcoder/async/EventModel.java
  class EventModel (line 6) | public class EventModel {
    method EventModel (line 15) | public EventModel() {
    method EventModel (line 19) | public EventModel(EventType type) {
    method setExt (line 23) | public EventModel setExt(String key, String value) {
    method getExt (line 28) | public String getExt(String key) {
    method getType (line 32) | public EventType getType() {
    method setType (line 36) | public EventModel setType(EventType type) {
    method getActorId (line 41) | public int getActorId() {
    method setActorId (line 45) | public EventModel setActorId(int actorId) {
    method getEntityType (line 50) | public int getEntityType() {
    method setEntityType (line 54) | public EventModel setEntityType(int entityType) {
    method getEntityId (line 59) | public int getEntityId() {
    method setEntityId (line 63) | public EventModel setEntityId(int entityId) {
    method getEntityOwnerId (line 68) | public int getEntityOwnerId() {
    method setEntityOwnerId (line 72) | public EventModel setEntityOwnerId(int entityOwnerId) {
    method getExts (line 77) | public Map<String, String> getExts() {
    method setExts (line 81) | public EventModel setExts(Map<String, String> exts) {

FILE: wenda/src/main/java/com/nowcoder/async/EventProducer.java
  class EventProducer (line 9) | @Service
    method fireEvent (line 15) | public boolean fireEvent(EventModel eventModel) {

FILE: wenda/src/main/java/com/nowcoder/async/EventType.java
  type EventType (line 3) | public enum  EventType {
    method EventType (line 12) | EventType(int value) {
    method getValue (line 16) | public int getValue() {

FILE: wenda/src/main/java/com/nowcoder/async/handler/FeedHandler.java
  class FeedHandler (line 20) | @Component
    method buildFeedData (line 41) | private String buildFeedData(EventModel model) {
    method doHandler (line 63) | @Override
    method getSupportEventTypes (line 86) | @Override

FILE: wenda/src/main/java/com/nowcoder/async/handler/FollowHandler.java
  class FollowHandler (line 20) | @Component
    method doHandler (line 28) | @Override
    method getSupportEventTypes (line 47) | @Override

FILE: wenda/src/main/java/com/nowcoder/async/handler/LikeHandler.java
  class LikeHandler (line 19) | @Component
    method doHandler (line 28) | @Override
    method getSupportEventTypes (line 41) | @Override

FILE: wenda/src/main/java/com/nowcoder/async/handler/LoginExceptionHandler.java
  class LoginExceptionHandler (line 15) | @Component
    method doHandler (line 21) | @Override
    method getSupportEventTypes (line 29) | @Override

FILE: wenda/src/main/java/com/nowcoder/configuration/WendaWebConfiguration.java
  class WendaWebConfiguration (line 10) | @Component
    method addInterceptors (line 18) | @Override

FILE: wenda/src/main/java/com/nowcoder/controller/CommentController.java
  class CommentController (line 19) | @Controller
    method addComment (line 32) | @RequestMapping(path = {"/addComment"}, method = RequestMethod.POST)

FILE: wenda/src/main/java/com/nowcoder/controller/FeedController.java
  class FeedController (line 19) | @Controller
    method getPullFeeds (line 33) | @RequestMapping(path = {"/pullfeeds"}, method = {RequestMethod.GET})
    method getPushFeeds (line 45) | @RequestMapping(path = {"/pushfeeds"}, method = {RequestMethod.GET})

FILE: wenda/src/main/java/com/nowcoder/controller/FollowController.java
  class FollowController (line 24) | @Controller
    method follow (line 46) | @RequestMapping(path = "/followUser", method = {RequestMethod.POST, Re...
    method unfollow (line 60) | @RequestMapping(path = "/unfollowUser", method = RequestMethod.POST)
    method followQuestion (line 74) | @RequestMapping(path = {"/followQuestion"}, method = {RequestMethod.PO...
    method unfollowQuestion (line 100) | @RequestMapping(path = {"/unfollowQuestion"}, method = {RequestMethod....
    method followers (line 124) | @RequestMapping(path = {"/user/{uid}/followers"}, method = {RequestMet...
    method followees (line 137) | @RequestMapping(path = {"/user/{uid}/followees"}, method = {RequestMet...
    method getUsersInfo (line 151) | private List<ViewObject> getUsersInfo(int localUserId, List<Integer> u...

FILE: wenda/src/main/java/com/nowcoder/controller/HomeController.java
  class HomeController (line 22) | @Controller
    method getQuestions (line 41) | private List<ViewObject> getQuestions(int userId, int offset, int limi...
    method index (line 54) | @RequestMapping(path = {"/", "/index"}, method = {RequestMethod.GET, R...
    method userIndex (line 61) | @RequestMapping(path = {"/user/{userId}"}, method = {RequestMethod.GET...

FILE: wenda/src/main/java/com/nowcoder/controller/IndexController.java
  class IndexController (line 20) | public class IndexController {
    method index (line 26) | @RequestMapping(path = {"/", "/index"}, method = {RequestMethod.GET})
    method profile (line 33) | @RequestMapping(path = {"/profile/{groupId}/{userId}"})
    method template (line 42) | @RequestMapping(path = {"/vm"}, method = {RequestMethod.GET})
    method request (line 57) | @RequestMapping(path = {"/request"}, method = {RequestMethod.GET})
    method redirect (line 86) | @RequestMapping(path = {"/redirect/{code}"}, method = {RequestMethod.G...
    method admin (line 97) | @RequestMapping(path = {"/admin"}, method = {RequestMethod.GET})
    method error (line 106) | @ExceptionHandler()

FILE: wenda/src/main/java/com/nowcoder/controller/LikeController.java
  class LikeController (line 21) | @Controller
    method like (line 37) | @RequestMapping(path = {"/like"}, method = RequestMethod.POST)
    method dislike (line 56) | @RequestMapping(path = {"/dislike"}, method = RequestMethod.POST)

FILE: wenda/src/main/java/com/nowcoder/controller/LoginController.java
  class LoginController (line 20) | @Controller
    method register (line 30) | @RequestMapping(path = {"/reg/"}, method = RequestMethod.POST)
    method login (line 56) | @RequestMapping(path = {"/login/"}, method = RequestMethod.POST)
    method relogin (line 91) | @RequestMapping(path = {"/relogin"}, method = RequestMethod.GET)
    method logout (line 97) | @RequestMapping(path = {"/logout"}, method = RequestMethod.GET)

FILE: wenda/src/main/java/com/nowcoder/controller/MessageController.java
  class MessageController (line 24) | @Controller
    method getConversationList (line 37) | @RequestMapping(path = {"/msg/list"}, method = RequestMethod.GET)
    method getConversationDetail (line 57) | @RequestMapping(path = {"/msg/detail"}, method = RequestMethod.GET)
    method addMessage (line 78) | @RequestMapping(path = {"/msg/addMessage"}, method = RequestMethod.POST)

FILE: wenda/src/main/java/com/nowcoder/controller/QuestionController.java
  class QuestionController (line 17) | @Controller
    method addQuestion (line 39) | @RequestMapping(value = "/question/add", method = RequestMethod.POST)
    method questionDetail (line 64) | @RequestMapping(path = {"/question/{qid}"})

FILE: wenda/src/main/java/com/nowcoder/controller/SettingController.java
  class SettingController (line 13) | @Controller
    method setting (line 18) | @RequestMapping(path = {"/setting"}, method = {RequestMethod.GET})

FILE: wenda/src/main/java/com/nowcoder/dao/CommentDAO.java
  type CommentDAO (line 9) | @Service
    method addComment (line 16) | @Insert({"insert into ", TABLE_NAME, "(", INSERT_FIELDS,
    method selectCommentByEntity (line 21) | @Select({"select ", SELECT_FIELDS, " from", TABLE_NAME,
    method getCommentCount (line 26) | @Select({"select count(id) from ", TABLE_NAME, "where entity_id=#{enti...
    method getUserCommentCount (line 30) | @Select({"select count(id) from ", TABLE_NAME, "where user_id=#{userId...
    method getCommentById (line 33) | @Select({"select ", SELECT_FIELDS, " from", TABLE_NAME, "where id=#{id...
    method updateStatus (line 36) | @Update({"update comment set status=#{status} where id=#{id}"})

FILE: wenda/src/main/java/com/nowcoder/dao/FeedDAO.java
  type FeedDAO (line 12) | @Service
    method addFeed (line 19) | @Insert({"insert into ", TABLE_NAME, "(", INSERT_FIELDS,
    method getFeedById (line 24) | @Select({"select ", SELECT_FIELDS, " from ", TABLE_NAME, " where id=#{...
    method selectUserFeeds (line 27) | List<Feed> selectUserFeeds(@Param("maxId") int maxId,

FILE: wenda/src/main/java/com/nowcoder/dao/LoginTicketDAO.java
  type LoginTicketDAO (line 7) | @Service
    method addTicket (line 14) | @Insert({"insert into ", TABLE_NAME, "(", INSERT_FIELDS,
    method selectByTicket (line 18) | @Select({"select ", SELECT_FIELDS, "from", TABLE_NAME, "where ticket =...
    method updateStatus (line 21) | @Update({"update ", TABLE_NAME, "set status = #{status} where ticket =...

FILE: wenda/src/main/java/com/nowcoder/dao/MessageDAO.java
  type MessageDAO (line 9) | @Service
    method addMessage (line 16) | @Insert({"insert into ", TABLE_NAME, "(", INSERT_FIELDS,
    method getConversationDetail (line 20) | @Select({"select ", SELECT_FIELDS, " from ", TABLE_NAME,
    method getConversationList (line 26) | @Select({"select ", INSERT_FIELDS, ", count(id) as id from ( select * ...
    method getConversationUnreadCount (line 33) | @Select({"select count(id) from ", TABLE_NAME, " where has_read=0 and ...
    method updateHasRead (line 37) | @Update({"update ", TABLE_NAME, " set has_read=1 where to_id=#{toId}"})

FILE: wenda/src/main/java/com/nowcoder/dao/QuestionDAO.java
  type QuestionDAO (line 9) | @Service
    method addQuestion (line 16) | @Insert({"insert into ", TABLE_NAME, "(", INSERT_FIELDS,
    method selectById (line 20) | @Select({"select ", SELECT_FIELDS, " from", TABLE_NAME, " where id=#{i...
    method selectLatestQuestions (line 23) | List<Question> selectLatestQuestions(@Param("userId") int userId, @Par...
    method updateCommentCount (line 26) | @Update({"update ", TABLE_NAME, " set comment_count=#{commentCount} wh...

FILE: wenda/src/main/java/com/nowcoder/dao/UserDAO.java
  type UserDAO (line 8) | @Service
    method addUser (line 16) | @Insert({"insert into ", TABLE_NAME, "(", INSERT_FIELDS,
    method selectById (line 20) | @Select({"select ", SELECT_FIELDS, " from ", TABLE_NAME, " where id=#{...
    method selectByName (line 23) | @Select({"select ", SELECT_FIELDS, " from ", TABLE_NAME, " where name=...
    method updatePassword (line 26) | @Update({"update ", TABLE_NAME, " set password=#{password} where id=#{...
    method deleteById (line 29) | @Delete({"delete from ", TABLE_NAME, " where id=#{id}"})

FILE: wenda/src/main/java/com/nowcoder/interceptor/LoginRequredInterceptor.java
  class LoginRequredInterceptor (line 12) | @Component
    method preHandle (line 18) | @Override
    method postHandle (line 26) | @Override
    method afterCompletion (line 31) | @Override

FILE: wenda/src/main/java/com/nowcoder/interceptor/PassportInterceptor.java
  class PassportInterceptor (line 18) | @Component
    method preHandle (line 28) | @Override
    method postHandle (line 50) | @Override
    method afterCompletion (line 57) | @Override

FILE: wenda/src/main/java/com/nowcoder/model/Comment.java
  class Comment (line 5) | public class Comment {
    method getId (line 14) | public int getId() {
    method setId (line 18) | public void setId(int id) {
    method getUserId (line 22) | public int getUserId() {
    method setUserId (line 26) | public void setUserId(int userId) {
    method getEntityId (line 30) | public int getEntityId() {
    method setEntityId (line 34) | public void setEntityId(int entityId) {
    method getEntityType (line 38) | public int getEntityType() {
    method setEntityType (line 42) | public void setEntityType(int entityType) {
    method getContent (line 46) | public String getContent() {
    method setContent (line 50) | public void setContent(String content) {
    method getCreatedDate (line 54) | public Date getCreatedDate() {
    method setCreatedDate (line 58) | public void setCreatedDate(Date createdDate) {
    method getStatus (line 62) | public int getStatus() {
    method setStatus (line 66) | public void setStatus(int status) {

FILE: wenda/src/main/java/com/nowcoder/model/EntityType.java
  class EntityType (line 3) | public class EntityType {

FILE: wenda/src/main/java/com/nowcoder/model/Feed.java
  class Feed (line 7) | public class Feed {
    method getId (line 15) | public int getId() {
    method setId (line 19) | public void setId(int id) {
    method getType (line 23) | public int getType() {
    method setType (line 27) | public void setType(int type) {
    method getUserId (line 31) | public int getUserId() {
    method setUserId (line 35) | public void setUserId(int userId) {
    method getCreatedDate (line 39) | public Date getCreatedDate() {
    method setCreatedDate (line 43) | public void setCreatedDate(Date createdDate) {
    method getData (line 47) | public String getData() {
    method setData (line 51) | public void setData(String data) {
    method get (line 56) | public String get(String key) {

FILE: wenda/src/main/java/com/nowcoder/model/HostHolder.java
  class HostHolder (line 5) | @Component
    method getUser (line 9) | public User getUser() {
    method setUser (line 12) | public void setUser(User user) {
    method clear (line 15) | public void clear() {

FILE: wenda/src/main/java/com/nowcoder/model/LoginTicket.java
  class LoginTicket (line 5) | public class LoginTicket {
    method getId (line 12) | public int getId() {
    method setId (line 16) | public void setId(int id) {
    method getUserId (line 20) | public int getUserId() {
    method setUserId (line 24) | public void setUserId(int userId) {
    method getExpired (line 28) | public Date getExpired() {
    method setExpired (line 32) | public void setExpired(Date expired) {
    method getStatus (line 36) | public int getStatus() {
    method setStatus (line 40) | public void setStatus(int status) {
    method getTicket (line 44) | public String getTicket() {
    method setTicket (line 48) | public void setTicket(String ticket) {

FILE: wenda/src/main/java/com/nowcoder/model/Message.java
  class Message (line 5) | public class Message {
    method getId (line 14) | public int getId() {
    method setId (line 18) | public void setId(int id) {
    method getFromId (line 22) | public int getFromId() {
    method setFromId (line 26) | public void setFromId(int fromId) {
    method getToId (line 30) | public int getToId() {
    method setToId (line 34) | public void setToId(int toId) {
    method getContent (line 38) | public String getContent() {
    method setContent (line 42) | public void setContent(String content) {
    method getCreatedDate (line 46) | public Date getCreatedDate() {
    method setCreatedDate (line 50) | public void setCreatedDate(Date createdDate) {
    method getHasRead (line 54) | public int getHasRead() {
    method setHasRead (line 58) | public void setHasRead(int hasRead) {
    method getConversationId (line 62) | public String getConversationId() {
    method setConversationId (line 70) | public void setConversationId(String conversationId) {

FILE: wenda/src/main/java/com/nowcoder/model/Question.java
  class Question (line 5) | public class Question {
    method getId (line 13) | public int getId() {
    method setId (line 17) | public void setId(int id) {
    method getTitle (line 21) | public String getTitle() {
    method setTitle (line 25) | public void setTitle(String title) {
    method getContent (line 29) | public String getContent() {
    method setContent (line 33) | public void setContent(String content) {
    method getCreatedDate (line 37) | public Date getCreatedDate() {
    method setCreatedDate (line 41) | public void setCreatedDate(Date createdDate) {
    method getUserId (line 45) | public int getUserId() {
    method setUserId (line 49) | public void setUserId(int userId) {
    method getCommentCount (line 53) | public int getCommentCount() {
    method setCommentCount (line 57) | public void setCommentCount(int commentCount) {

FILE: wenda/src/main/java/com/nowcoder/model/User.java
  class User (line 3) | public class User {
    method User (line 10) | public User() {
    method User (line 13) | public User(String name) {
    method getName (line 20) | public String getName() {
    method setName (line 24) | public void setName(String name) {
    method getPassword (line 28) | public String getPassword() {
    method setPassword (line 32) | public void setPassword(String password) {
    method getSalt (line 36) | public String getSalt() {
    method setSalt (line 40) | public void setSalt(String salt) {
    method getHeadUrl (line 44) | public String getHeadUrl() {
    method setHeadUrl (line 48) | public void setHeadUrl(String headUrl) {
    method getId (line 52) | public int getId() {
    method setId (line 56) | public void setId(int id) {

FILE: wenda/src/main/java/com/nowcoder/model/ViewObject.java
  class ViewObject (line 6) | public class ViewObject {
    method set (line 8) | public void set(String key, Object value) {
    method get (line 12) | public Object get(String key) {

FILE: wenda/src/main/java/com/nowcoder/service/CommentService.java
  class CommentService (line 13) | @Service
    method getCommentsByEntity (line 23) | public List<Comment> getCommentsByEntity(int entityId, int entityType) {
    method addComment (line 27) | public int addComment(Comment comment) {
    method getCommentCount (line 33) | public int getCommentCount(int entityId, int entityType) {
    method getUserCommentCount (line 37) | public int getUserCommentCount(int userId) {
    method updateStatus (line 41) | public boolean updateStatus(int commentId) {
    method getCommentById (line 45) | public Comment getCommentById(int id) {

FILE: wenda/src/main/java/com/nowcoder/service/FeedService.java
  class FeedService (line 10) | @Service
    method getUserFeeds (line 15) | public List<Feed> getUserFeeds(int maxId, List<Integer> userIds, int c...
    method addFeed (line 19) | public boolean addFeed(Feed feed) {
    method getById (line 24) | public Feed getById(int id) {

FILE: wenda/src/main/java/com/nowcoder/service/FollowService.java
  class FollowService (line 15) | @Service
    method follow (line 20) | public boolean follow(int userId, int entityType, int entityId) {
    method unfollow (line 32) | public boolean unfollow(int userId, int entityType, int entityId) {
    method getIdsFromSet (line 44) | private List<Integer> getIdsFromSet(Set<String> idset) {
    method getFollowers (line 52) | public List<Integer> getFollowers(int entityType, int entityId, int co...
    method getFollowers (line 57) | public List<Integer> getFollowers(int entityType, int entityId, int of...
    method getFollowees (line 62) | public List<Integer> getFollowees(int entityType, int entityId, int co...
    method getFollowees (line 67) | public List<Integer> getFollowees(int entityType, int entityId, int of...
    method getFolloweeCount (line 72) | public long getFolloweeCount(int userId, int entityType) {
    method getFollowerCount (line 77) | public long getFollowerCount(int entityType, int entityId) {
    method isFollower (line 82) | public boolean isFollower(int userId, int entityType, int entityId) {

FILE: wenda/src/main/java/com/nowcoder/service/LikeService.java
  class LikeService (line 8) | @Service
    method getLikeCount (line 14) | public long getLikeCount(int entityType, int entityId) {
    method getLikeStatus (line 19) | public int getLikeStatus(int userId, int entityType, int entityId) {
    method like (line 28) | public long like(int userId, int entityType, int entityId) {
    method disLike (line 38) | public long disLike(int userId, int entityType, int entityId) {

FILE: wenda/src/main/java/com/nowcoder/service/LoginTicketService.java
  class LoginTicketService (line 5) | @Service

FILE: wenda/src/main/java/com/nowcoder/service/MessageService.java
  class MessageService (line 12) | @Service
    method addMessage (line 22) | public int addMessage(Message message) {
    method getConversationDetail (line 27) | public List<Message> getConversationDetail(String conversationId, int ...
    method getConversationList (line 31) | public List<Message> getConversationList(int userId, int offset, int l...
    method getConversationUnreadCount (line 35) | public int getConversationUnreadCount(int userId, String conversationI...
    method updateHasRead (line 39) | public void updateHasRead(int toId) {

FILE: wenda/src/main/java/com/nowcoder/service/QuestionService.java
  class QuestionService (line 11) | @Service
    method addQuestion (line 19) | public int addQuestion(Question question) {
    method getLatestQuestions (line 30) | public List<Question> getLatestQuestions(int userId, int offset, int l...
    method selectById (line 34) | public Question selectById(int id) {
    method updateCommentCount (line 38) | public int updateCommentCount(int id, int count) {

FILE: wenda/src/main/java/com/nowcoder/service/SensitiveService.java
  class SensitiveService (line 16) | @Service
    method afterPropertiesSet (line 21) | @Override
    method addWord (line 45) | private void addWord(String lineTxt) {
    class TireNode (line 61) | private class TireNode {
      method addSubNode (line 66) | public void addSubNode(Character key, TireNode node) {
      method getSubNode (line 70) | public TireNode getSubNode(Character key) {
      method isKeywordEnd (line 74) | public boolean isKeywordEnd() {
      method setkeywordEnd (line 78) | public void setkeywordEnd(boolean end) {
    method isSymbol (line 85) | private boolean isSymbol(char c) {
    method filter (line 90) | public String filter(String text) {
    method main (line 129) | public static void main(String[] args) {

FILE: wenda/src/main/java/com/nowcoder/service/UserService.java
  class UserService (line 15) | @Service
    method getUser (line 24) | public User getUser(int id) {
    method selectByName (line 28) | public User selectByName(String name) {
    method selectById (line 32) | public User selectById(int id) {
    method register (line 36) | public Map<String, String> register(String username, String password) {
    method login (line 63) | public Map<String, String> login(String username, String password) {
    method addLoginTicket (line 87) | public String addLoginTicket(int userId) {
    method logout (line 102) | public void logout(String ticket) {

FILE: wenda/src/main/java/com/nowcoder/service/WendaService.java
  class WendaService (line 5) | @Service
    method getMessage (line 7) | public String getMessage(int userId) {

FILE: wenda/src/main/java/com/nowcoder/util/JedisAdapter.java
  class JedisAdapter (line 15) | @Service
    method print (line 22) | public static void print(int index, Object obj) {
    method main (line 25) | public static void main(String[] args) {
    method afterPropertiesSet (line 54) | @Override
    method getJedis (line 59) | public Jedis getJedis() {
    method sadd (line 63) | public long sadd(String key, String value) {
    method srem (line 78) | public long srem(String key, String value) {
    method scard (line 93) | public long scard(String key) {
    method sismember (line 108) | public boolean sismember(String key, String value) {
    method lpush (line 123) | public long lpush(String key, String value) {
    method brpop (line 138) | public List<String> brpop(int timeout, String key) {
    method multi (line 153) | public Transaction multi(Jedis jedis) {
    method exec (line 162) | public List<Object> exec(Transaction tx, Jedis jedis) {
    method zadd (line 182) | public long zadd(String key, double score, String value) {
    method zrevrange (line 197) | public Set<String> zrevrange(String key, int start, int end) {
    method zcard (line 212) | public long zcard(String key) {
    method zscore (line 227) | public Double zscore(String key, String member) {
    method lrange (line 242) | public List<String> lrange(String key, int start, int end) {

FILE: wenda/src/main/java/com/nowcoder/util/MailSender.java
  class MailSender (line 19) | @Service
    method sendWithHTMLTemplate (line 27) | public boolean sendWithHTMLTemplate(String to, String subject,
    method afterPropertiesSet (line 48) | @Override

FILE: wenda/src/main/java/com/nowcoder/util/RedisKeyUtil.java
  class RedisKeyUtil (line 3) | public class RedisKeyUtil {
    method getLikeKey (line 15) | public static String getLikeKey(int entityType, int entityId) {
    method getDisLikeKey (line 19) | public static String getDisLikeKey(int entityType, int entityId) {
    method getFollowerKey (line 23) | public static String getFollowerKey(int entityType, int entityId) {
    method getFolloweeKey (line 27) | public static String getFolloweeKey(int userId, int entityType) {
    method getEventQueueKey (line 31) | public static String getEventQueueKey() {
    method getTimelineKey (line 35) | public static String getTimelineKey(int userId) {

FILE: wenda/src/main/java/com/nowcoder/util/WendaUtil.java
  class WendaUtil (line 9) | public class WendaUtil {
    method getJSONString (line 16) | public static String getJSONString(int code) {
    method getJSONString (line 22) | public static String getJSONString(int code, String msg) {
    method getJSONString (line 29) | public static String getJSONString(int code, Map<String, Object> map) {

FILE: wenda/src/main/resources/static/scripts/base.fb262f0e.js
  function c (line 7) | function c(){}
  function c (line 14) | function c(){}
  function a (line 26) | function a(a){a=z.qb(a,d);return c[a]||""}
  function g (line 36) | function g(a){k||(k=!0,d.call(f,a))}
  function h (line 36) | function h(a){k||(k=!0,c.call(f,a))}
  function f (line 72) | function f(c){c&&b.appendChild(z.pa(c)?a.createTextNode(c):c)}
  function b (line 106) | function b(){f.onload=f.onerror=f.onreadystatechange=null;window.documen...
  function c (line 106) | function c(){b();d.resolve()}
  function g (line 166) | function g(){var a=b-r;0<a?(k.text(z.Ka(c(!0,n),a)),r+=1):h(a)}
  function h (line 166) | function h(a){a=void 0===a?b-r:a;m.stop();n+=1;k.text(z.Ka(c(!1,n),a));k...
  function c (line 181) | function c(b){Xk.call(this,b);this.name=a}
  function a (line 228) | function a(b,c){return c.length?a(b[c.shift()],c):b}
  function a (line 274) | function a(a){return{member:"people",favlist:"collection"}[a]||a}
  function b (line 415) | function b(a){return{start:c.rA?z.kb(a).id.split("-")[1]:0,offset:c.offs...

FILE: wenda/src/main/resources/static/scripts/common.fed5411f.js
  function d (line 36) | function d(){var b=new z.Z(!0),d="/question/"+(a?"set_anonymous":"set_pu...
  function d (line 37) | function d(g){g||(g=a.shift())&&b.call(c,g,f++,d)}
  function b (line 42) | function b(a){var c=!1;return function(){!0!==c&&(c=a.apply(this,argumen...
  function b (line 44) | function b(a){window.$.post("/node/Guide2",{method:"dismiss_editor",para...
  function c (line 44) | function c(a){z.xi(Object.assign({category:"popup_guide",label:{bio:"pop...
  function d (line 44) | function d(a){k||(k=new z.V,k.Bf(!0),k.cF=!1,z.W.add(k.fi(),"Guide"));k....
  function f (line 46) | function f(){z.Cp.dispatchEvent("guider2:topicselected")}
  function g (line 56) | function g(a){a&&(a.tabIndex=0,z.bj(a,h.jf()),z.hj(a,"goog-zippy-header"...
  function b (line 61) | function b(){(0,window.clearTimeout)(g);g=null;try{delete window[d]}catc...
  function d (line 68) | function d(a){return a&&a.preventDefault?a.preventDefault():!1}
  function c (line 88) | function c(b){return a.getElementsByTagName(b).length}
  function d (line 129) | function d(){return z.qb(b,function(a){return"topic"===a[0]&&a[4]&&a[1]=...
  function f (line 129) | function f(){return z.qb(b,function(a){return 3>=a.length&&a[1]===z.Ka("...
  function b (line 169) | function b(){var a=(0,window.$)('\x3cdiv\x3e\x3cdiv style\x3d"text-align...
  function a (line 184) | function a(a,b){a=z.pa(a)?new RegExp(a):a;return a.test(b)}
  function c (line 220) | function c(a){a=a.val();d.cH&&(a=window.$.trim(a));d.CR&&window.$.isNume...
  function d (line 312) | function d(a,b,c){a=["作者:"+b,"链接:"+a,"来源:知乎","著作权归作者所有。商业转载请联系作者获得授权,非商业...
  function f (line 312) | function f(a,b,c,f){b=d(b,c,f).join("\x3cbr /\x3e");return"\x3cdiv\x3e"+...
  function g (line 312) | function g(a,b,c,f){b=d(b,c,f).join("\n");return f?b+a:a+b}
  function h (line 312) | function h(){var a="";window.getSelection?a=window.getSelection().toStri...
  function k (line 313) | function k(a){var d=z.vu(),k=d&&(0,z.ab)(d.Id());if(k&&!(128>k.length)){...
  function b (line 330) | function b(){var b;ED||(ED=new CD,ED.init());b=ED;b.aj=a;b.kM=a.id.split...
  function c (line 330) | function c(b){if(!a.getAttribute("data-disabled")){var c;FD||(FD=new z.A...
  function d (line 330) | function d(){function b(){var f=d.value,g=a.getAttribute("id").split("-"...
  function b (line 335) | function b(a,b){return!!z.qb(a,function(a){return a.challenge_type===b})}
  function c (line 335) | function c(a){var b={value:a.challenge_type};switch(b.value){case "passw...
  function d (line 336) | function d(a){var b=(0,window.$)(".panel",k),c=a?b.filter(function(){ret...
  function c (line 342) | function c(a){a.eq(b).addClass("selected").siblings().removeClass("selec...
  function a (line 415) | function a(a){return a.replace(/\\\\/g,"\\").replace(/\\'/g,"'")}
  function c (line 512) | function c(a,b){if(3!==a.nodeType||"@"===a.nodeValue&&wv(a.previousSibli...
  function a (line 535) | function a(){Sv(b,!1);b.Gc.value=d.value}
  function g (line 550) | function g(a){a.r?z.X.message(a.msg):h(n)}
  function h (line 550) | function h(b){b?(z.W.Rv(a,k,m),pr(a,f.unfollow_text||"取消关注")):(z.W.Rv(a,...
  function a (line 551) | function a(){var b=Sw.shift();b&&(b=b[0],b.length?b(a):(b(),a()))}
  function a (line 621) | function a(a){return(0,z.Ii)({responseId:a.getResponseHeader("X-Za-Respo...
  function c (line 736) | function c(){b?b():d.handleError()}
  function f (line 737) | function f(){d.unmountComponentAtNode(c);b.G(!1)}
  function a (line 779) | function a(a,d){var f=z.O("div","zm-voters");a.appendChild(f);var g=z.O(...
  function a (line 781) | function a(){var a=c.Yc();if(a&&(b(),f)){var d=f,h=d.nb;h.data("async-vo...
  function b (line 781) | function b(){if(!g){var a=!z.Uj,b=z.N("js-collapse-body",c.m());a&&h&&(0...

FILE: wenda/src/main/resources/static/scripts/ga.js
  function Aa (line 1) | function Aa(a,b){switch(b){case 0:return""+a;case 1:return 1*a;case 2:re...
  function Ba (line 1) | function Ba(a){return"function"==typeof a}
  function Ca (line 1) | function Ca(a){return void 0!=a&&-1<(a.constructor+"").indexOf("String")}
  function F (line 1) | function F(a,b){return void 0==a||"-"==a&&!b||""==a}
  function Da (line 1) | function Da(a){if(!a||""==a)return"";for(;a&&-1<" \n\r\t".indexOf(a.char...
  function Ea (line 2) | function Ea(){return Math.round(2147483647*Math.random())}
  function Fa (line 2) | function Fa(){}
  function G (line 2) | function G(a,b){if(encodeURIComponent instanceof Function)return b?encod...
  function I (line 2) | function I(a){a=a.split("+").join(" ");if(decodeURIComponent instanceof ...
  function Ia (line 3) | function Ia(a,b){if(a){var c=J.createElement("script");c.type="text/java...
  function K (line 3) | function K(a){return a&&0<a.length?a[0]:""}
  function L (line 3) | function L(a){var b=a?a.length:0;return 0<b?a[b-1]:""}
  function Ka (line 4) | function Ka(a){0==a.indexOf("www.")&&(a=a.substring(4));return a.toLower...
  function La (line 5) | function La(a,b){var c,d={url:a,protocol:"http",host:"",path:"",R:new nf...
  function Oa (line 7) | function Oa(a,b){function c(a){var b=(a.hostname||"").split(":")[0].toLo...
  function Na (line 8) | function Na(a,b){function c(b,c){a.contains(b)||a.set(b,[]);a.get(b).pus...
  function Pa (line 9) | function Pa(a,b){if(F(a)||"["==a.charAt(0)&&"]"==a.charAt(a.length-1))re...
  function Ra (line 9) | function Ra(a,b,c){1<=Qa||1<=100*Math.random()||ld()||(a=["utmt=error","...
  function N (line 9) | function N(a){return Va("x"+Ta++,a)}
  function Va (line 9) | function Va(a,b){Ua[a]=!!b;return a}
  function a (line 11) | function a(a,c,d){T(qf.prototype,a,c,d)}
  function a (line 11) | function a(a,c,d){T(U.prototype,a,c,d)}
  function Pc (line 17) | function Pc(a){var b=this.plugins_;if(b)return b.get(a)}
  function $c (line 20) | function $c(a,b){b=b||[];for(var c=0;c<b.length;c++){var d=b[c];if(""+a=...
  function b (line 23) | function b(b,e){if(!F(a.get(b))){var f=a.c(b,""),f=f.split(" ").join("%2...
  function c (line 25) | function c(a){return(a=b.match(a+"=(.*?)(?:\\|utm|$)"))&&2==a.length?a[1...
  function d (line 25) | function d(b,c){c?(c=e?I(c):c.split("%20").join(" "),a.set(b,c)):a.set(b...
  function jd (line 25) | function jd(a){100!=a.get(vb)&&a.get(Q)%1E4>=100*a.get(vb)&&a.stopPropag...
  function kd (line 25) | function kd(a){ld(a.get(Wa))&&a.stopPropagation()}
  function md (line 25) | function md(a){"file:"==J.location.protocol&&a.stopPropagation()}
  function Ge (line 25) | function Ge(a){He()&&a.stopPropagation()}
  function nd (line 26) | function nd(a){a.get(Ib)||a.set(Ib,J.title,!0);a.get(Hb)||a.set(Hb,J.loc...
  function lf (line 26) | function lf(a){a.get(Wa)&&"UA-XXXXX-X"!=a.get(Wa)||a.stopPropagation()}
  function H (line 26) | function H(a){od.set(a)}
  function a (line 35) | function a(a,b,c,d){void 0==f[a]&&(f[a]={});void 0==f[a][b]&&(f[a][b]=[]...
  function b (line 35) | function b(a,b,c){if(void 0!=f[a]&&void 0!=f[a][b])return f[a][b][c]}
  function c (line 35) | function c(a,b){if(void 0!=f[a]&&void 0!=f[a][b]){f[a][b]=void 0;var c=!...
  function d (line 35) | function d(a){var b="",c=!1,d,e;for(d=0;d<Be.length;d++)if(e=a[Be[d]],vo...
  function wd (line 38) | function wd(a){return"string"==typeof a}
  function xd (line 38) | function xd(a){return!("number"==typeof a||void 0!=Number&&a instanceof ...
  function c (line 42) | function c(c,d){d=d||"-";var e=L(b.get(a.get(c)));return e&&"-"!=e?I(e):d}
  function c (line 45) | function c(a){a=(""+a).split("+").join("%20");return a=a.split(" ").join...
  function d (line 45) | function d(c){var d=""+(a.get(c)||"");c=""+(b[c]||"");return 0<d.length&...
  function d (line 54) | function d(a){return function(b){if((b=b.get(Nc)[a])&&b.length)for(var c...
  function c (line 68) | function c(a,b){b&&d.push(a+"="+b+";")}
  function Yc (line 77) | function Yc(a){var b=1,c=0,d;if(a)for(b=0,d=a.length-1;0<=d;d--)c=a.char...

FILE: wenda/src/main/resources/static/scripts/instant.e7a17de6.js
  function c (line 1) | function c(a){function b(a,b){var c;return window.getComputedStyle?c=win...
  function d (line 1) | function d(a){var b=+a.getAttribute("data-rawwidth"),d=+a.getAttribute("...
  function e (line 1) | function e(){var a=b.querySelectorAll;if(a)return a.call(b,"img.lazy");v...
  function f (line 1) | function f(a,b){for(var c=a.length-1;c>=0;c--)b(a[c])}
  function d (line 1) | function d(a,b){return typeof a===b}
  function e (line 1) | function e(){var a,b,c,e,f,g,h;for(var i in s)if(s.hasOwnProperty(i)){if...
  function f (line 1) | function f(a){var b=w.className,c=u._config.classPrefix||"";if(x&&(b=b.b...
  function g (line 1) | function g(a,b){return!!~(""+a).indexOf(b)}
  function h (line 1) | function h(){return"function"!=typeof b.createElement?b.createElement(ar...
  function i (line 1) | function i(){var a=b.body;return a||(a=h(x?"svg":"body"),a.fake=!0),a}
  function j (line 1) | function j(a,c,d,e){var f,g,j,k,l="modernizr",m=h("div"),n=i();if(parseI...
  function k (line 1) | function k(a){return a.replace(/([A-Z])/g,function(a,b){return"-"+b.toLo...
  function l (line 1) | function l(b,d){var e=b.length;if("CSS"in a&&"supports"in a.CSS){for(;e-...
  function m (line 1) | function m(a){return a.replace(/([a-z])-([a-z])/g,function(a,b,c){return...
  function n (line 1) | function n(a,b,e,f){function i(){k&&(delete D.style,delete D.modElem)}if...
  function o (line 1) | function o(a,b){return function(){return a.apply(b,arguments)}}
  function p (line 1) | function p(a,b,c){var e;for(var f in a)if(a[f]in b)return c===!1?a[f]:(e...
  function q (line 1) | function q(a,b,c,e,f){var g=a.charAt(0).toUpperCase()+a.slice(1),h=(a+" ...
  function r (line 1) | function r(a,b,d){return q(a,c,c,b,d)}

FILE: wenda/src/main/resources/static/scripts/main/base/base.js
  function fReady (line 23) | function fReady(sName, oParam) {
  function fTpl (line 68) | function fTpl(sTpl, oData) {
  function fBind (line 76) | function fBind(f, oTarget) {
  function fCreateClass (line 86) | function fCreateClass(sPackage, sClassName) {
  function fGetClass (line 132) | function fGetClass(sPackage, sClassName) {
  function fMix (line 156) | function fMix(oChild, oParent, oExtend, oExtendPrototype) {
  function fInherit (line 193) | function fInherit(oChild, oParent, oExtend) {

FILE: wenda/src/main/resources/static/scripts/main/base/event.js
  function fOn (line 10) | function fOn(sName, fCb) {
  function fEmit (line 21) | function fEmit(sName) {
  function fUnbind (line 33) | function fUnbind(sName, fCb) {
  function fUnbindAll (line 55) | function fUnbindAll() {

FILE: wenda/src/main/resources/static/scripts/main/base/util.js
  function fIsEmail (line 7) | function fIsEmail(sEmail) {

FILE: wenda/src/main/resources/static/scripts/main/component/component.js
  function fStaticSetEvents (line 27) | function fStaticSetEvents() {
  function fInitialize (line 38) | function fInitialize(oConf) {
  function fRender (line 47) | function fRender() {
  function fGetEl (line 58) | function fGetEl() {
  function fHtml (line 74) | function fHtml() {
  function fDestroy (line 89) | function fDestroy() {
  function fGetData (line 97) | function fGetData(oConf) {
  function fForbidScroll (line 101) | function fForbidScroll(oEl, bForbid) {
  function fEmit (line 105) | function fEmit(sName) {
  function _fSetCustomEvent (line 116) | function _fSetCustomEvent() {
  function _fSetDomEvent (line 132) | function _fSetDomEvent() {

FILE: wenda/src/main/resources/static/scripts/main/component/popup.js
  function fInitialize (line 114) | function fInitialize(oConf) {
  function fInitMask (line 122) | function fInitMask() {
  function fFixPosition (line 131) | function fFixPosition() {
  function fClose (line 154) | function fClose(bNoEmit) {
  function fError (line 160) | function fError(sContent) {
  function fGetData (line 167) | function fGetData(oConf) {

FILE: wenda/src/main/resources/static/scripts/main/component/popupAdd.js
  function fStaticShow (line 53) | function fStaticShow(oConf) {
  function fInitialize (line 106) | function fInitialize(oConf) {
  function fVal (line 112) | function fVal(oData) {

FILE: wenda/src/main/resources/static/scripts/main/component/popupMsg.js
  function fStaticShow (line 55) | function fStaticShow(oConf) {
  function fInitialize (line 114) | function fInitialize(oConf) {
  function fVal (line 120) | function fVal(oData) {

FILE: wenda/src/main/resources/static/scripts/main/jquery.js
  function DOMEval (line 76) | function DOMEval( code, doc ) {
  function isArrayLike (line 525) | function isArrayLike( obj ) {
  function Sizzle (line 757) | function Sizzle( selector, context, results, seed ) {
  function createCache (line 896) | function createCache() {
  function markFunction (line 914) | function markFunction( fn ) {
  function assert (line 923) | function assert( fn ) {
  function addHandle (line 945) | function addHandle( attrs, handler ) {
  function siblingCheck (line 960) | function siblingCheck( a, b ) {
  function createInputPseudo (line 986) | function createInputPseudo( type ) {
  function createButtonPseudo (line 997) | function createButtonPseudo( type ) {
  function createDisabledPseudo (line 1008) | function createDisabledPseudo( disabled ) {
  function createPositionalPseudo (line 1036) | function createPositionalPseudo( fn ) {
  function testContext (line 1059) | function testContext( context ) {
  function setFilters (line 2115) | function setFilters() {}
  function toSelector (line 2186) | function toSelector( tokens ) {
  function addCombinator (line 2196) | function addCombinator( matcher, combinator, base ) {
  function elementMatcher (line 2258) | function elementMatcher( matchers ) {
  function multipleContexts (line 2272) | function multipleContexts( selector, contexts, results ) {
  function condense (line 2281) | function condense( unmatched, map, filter, context, xml ) {
  function setMatcher (line 2302) | function setMatcher( preFilter, selector, matcher, postFilter, postFinde...
  function matcherFromTokens (line 2395) | function matcherFromTokens( tokens ) {
  function matcherFromGroupMatchers (line 2453) | function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
  function winnow (line 2794) | function winnow( elements, qualifier, not ) {
  function sibling (line 3091) | function sibling( cur, dir ) {
  function createOptions (line 3167) | function createOptions( options ) {
  function Identity (line 3392) | function Identity( v ) {
  function Thrower (line 3395) | function Thrower( ex ) {
  function adoptValue (line 3399) | function adoptValue( value, resolve, reject ) {
  function resolve (line 3491) | function resolve( depth, deferred, handler, special ) {
  function completed (line 3840) | function completed() {
  function Data (line 3940) | function Data() {
  function dataAttr (line 4109) | function dataAttr( elem, key, data ) {
  function adjustCSS (line 4429) | function adjustCSS( elem, prop, valueParts, tween ) {
  function getDefaultDisplay (line 4490) | function getDefaultDisplay( elem ) {
  function showHide (line 4513) | function showHide( elements, show ) {
  function getAll (line 4614) | function getAll( context, tag ) {
  function setGlobalEval (line 4631) | function setGlobalEval( elems, refElements ) {
  function buildFragment (line 4647) | function buildFragment( elems, context, scripts, selection, ignored ) {
  function returnTrue (line 4770) | function returnTrue() {
  function returnFalse (line 4774) | function returnFalse() {
  function safeActiveElement (line 4780) | function safeActiveElement() {
  function on (line 4786) | function on( elem, types, selector, data, fn, one ) {
  function manipulationTarget (line 5489) | function manipulationTarget( elem, content ) {
  function disableScript (line 5500) | function disableScript( elem ) {
  function restoreScript (line 5504) | function restoreScript( elem ) {
  function cloneCopyEvent (line 5516) | function cloneCopyEvent( src, dest ) {
  function fixInput (line 5551) | function fixInput( src, dest ) {
  function domManip (line 5564) | function domManip( collection, args, callback, ignored ) {
  function remove (line 5654) | function remove( elem, selector, keepData ) {
  function computeStyleTests (line 5947) | function computeStyleTests() {
  function curCSS (line 6021) | function curCSS( elem, name, computed ) {
  function addGetHookIf (line 6068) | function addGetHookIf( conditionFn, hookFn ) {
  function vendorPropName (line 6104) | function vendorPropName( name ) {
  function setPositiveNumber (line 6123) | function setPositiveNumber( elem, value, subtract ) {
  function augmentWidthOrHeight (line 6135) | function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
  function getWidthOrHeight (line 6179) | function getWidthOrHeight( elem, name, extra ) {
  function Tween (line 6487) | function Tween( elem, options, prop, end, easing ) {
  function raf (line 6610) | function raf() {
  function createFxNow (line 6618) | function createFxNow() {
  function genFx (line 6626) | function genFx( type, includeWidth ) {
  function createTween (line 6646) | function createTween( value, prop, animation ) {
  function defaultPrefilter (line 6660) | function defaultPrefilter( elem, props, opts ) {
  function propFilter (line 6829) | function propFilter( props, specialEasing ) {
  function Animation (line 6866) | function Animation( elem, properties, options ) {
  function getClass (line 7557) | function getClass( elem ) {
  function buildParams (line 8177) | function buildParams( prefix, obj, traditional, add ) {
  function addToPrefiltersOrTransports (line 8323) | function addToPrefiltersOrTransports( structure ) {
  function inspectPrefiltersOrTransports (line 8357) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
  function ajaxExtend (line 8386) | function ajaxExtend( target, src ) {
  function ajaxHandleResponses (line 8406) | function ajaxHandleResponses( s, jqXHR, responses ) {
  function ajaxConvert (line 8464) | function ajaxConvert( s, response, jqXHR, isSuccess ) {
  function done (line 8976) | function done( status, nativeStatusText, responses, headers ) {
  function getWindow (line 9701) | function getWindow( elem ) {

FILE: wenda/src/main/resources/static/scripts/main/site/detail.js
  function fInitialize (line 14) | function fInitialize() {
  function fVote (line 23) | function fVote(oEvent) {
  function fUnlike (line 59) | function fUnlike(oEvent) {

FILE: wenda/src/main/resources/static/scripts/main/site/follow.js
  function fInitialize (line 8) | function fInitialize() {

FILE: wenda/src/main/resources/static/scripts/main/site/home.js
  function fInitialize (line 13) | function fInitialize() {
  function fClickAdd (line 17) | function fClickAdd() {
  function fClickMsg (line 26) | function fClickMsg() {

FILE: wenda/src/main/resources/static/scripts/main/site/profile.js
  function fInitialize (line 8) | function fInitialize() {

FILE: wenda/src/main/resources/static/scripts/main/util/action.js
  function fLike (line 21) | function fLike(oConf) {
  function fDislike (line 40) | function fDislike(oConf) {
  function fFollowUser (line 59) | function fFollowUser(oConf) {
  function fUnFollowUser (line 78) | function fUnFollowUser(oConf) {
  function fFollowQuestion (line 97) | function fFollowQuestion(oConf) {
  function fUnFollowQuestion (line 116) | function fUnFollowQuestion(oConf) {
  function fPost (line 137) | function fPost(oConf) {

FILE: wenda/src/main/resources/static/scripts/main/util/business.js
  function fFollowUser (line 10) | function fFollowUser() {
  function fFollowQuestion (line 43) | function fFollowQuestion(oConf) {

FILE: wenda/src/main/resources/static/scripts/page-index.d7b54ac7.js
  function a (line 5) | function a(){var a=window.particlesJS;a&&((0,window.$)("\x3cdiv\x3e",{id...
  function a (line 13) | function a(a,b){(0,window.$)(":submit",a).click(function(){return b(a)})...

FILE: wenda/src/main/resources/static/scripts/page-main.5d4c554d.js
  function b (line 4) | function b(a){if(z.na(a))z.y(a,b);else{if(!(a instanceof z.Ed)){var g=nu...
  function a (line 26) | function a(a){if(!a)return z.X.message("网络异常");if(a.r)return z.X.message...
  function c (line 29) | function c(){var a=z.Pe(window.document).y,b=0;h.some(function(c,d){a>c&...
  function a (line 46) | function a(){function a(){return new window.Promise(function(a){w.onAnim...
  function b (line 48) | function b(){var a=(0,window.$)(".copyright-demo-pointer"),b=(0,window.$...
  function b (line 101) | function b(a,b){var h=(0,window.$)(a);window.$.each(b(),function(a,b){h....
  function c (line 101) | function c(a,b){return z.nb(a,function(a){return z.sa(a)?a(b):a})}
  function a (line 106) | function a(){return function(a){return"search_result_all_list_"+((0,wind...
  function a (line 106) | function a(b){return function(a){return"search_result_user_list_"+((0,wi...
  function a (line 107) | function a(b){return function(a){return"search_result_topic_list_"+((0,w...
  function a (line 131) | function a(a,b,c,d,m){c=(0,window.$)(c.target).closest(d,c.delegateTarge...
  function a (line 247) | function a(a,c){var d={action:a,category:"topic"};c&&(d.attributes=c);z....
  function a (line 249) | function a(a){if((0,window.$)(a).hasClass("article-item"))return new z.j...

FILE: wenda/src/main/resources/static/scripts/richtexteditor.aa0a4005.js
  function c (line 49) | function c(a,b){return{iB:a,YH:b}}
  function b (line 55) | function b(a){return z.A(f,a)}
  function c (line 55) | function c(){var a=window.document.createTextNode("\n");f.push(a);return a}
  function c (line 60) | function c(a){return a.parentNode.insertBefore(window.document.createTex...
  function g (line 87) | function g(a){var c=z.cd(b),f=z.jf(a.target)?a.target.getAttribute("role...
  function a (line 116) | function a(a,c,d){function r(a){z.df(a)}function ca(b,c){for(;b!==a;){if...
  function b (line 117) | function b(a,b){if(b){var c=function(b,c){return b&&g(a,b)&&z.Ju(b)>=c};...
  function c (line 118) | function c(a){return a&&"BR"===a.tagName||II(a)||z.Nu(a)}
  function d (line 118) | function d(a){a=z.uf(a,function(a){a=a.parentNode;return II(a)||z.Nu(a)}...
  function f (line 118) | function f(a,b){if(r.gM)window.document.execCommand("formatBlock",!1,b);...
  function g (line 119) | function g(a,b){return 3===a.nodeType?a===b:a.contains(3===b.nodeType?b....
  function h (line 119) | function h(a){return xI(a.Z(),a.va(),a.la(),a.La())}
  function k (line 119) | function k(a){function b(a){return!(a.previousSibling&&g(a.previousSibli...

FILE: wenda/src/main/resources/static/scripts/vendor.ff76fbae.js
  function c (line 1) | function c(){var a=d();a&&i(f(),function(b){a===b.getAttribute("znonce")...
  function d (line 1) | function d(){var a=b.getElementById("znonce");return a&&"META"===a.tagNa...
  function e (line 1) | function e(){return document.currentScript||document.scripts[document.sc...
  function f (line 1) | function f(){var a=b.querySelectorAll,c="text/zscript";if(a)return a.cal...
  function g (line 1) | function g(b){b&&b.length&&(a.execScript||function(b){a.eval.call(a,b)})...
  function h (line 1) | function h(a){return"textContent"in a?a.textContent:a.text}
  function i (line 1) | function i(a,b){for(var c=a.length-1;c>=0;c--)b(a[c])}
  function b (line 1) | function b(d){if(c[d])return c[d].exports;var e=c[d]={exports:{},id:d,lo...
  function d (line 1) | function d(a){return isFinite(a=+a)&&0!=a?0>a?-d(-a):Math.log(a+Math.sqr...
  function a (line 1) | function a(){}
  function a (line 1) | function a(b){var c=new y(b);return q(c,a.prototype),c}
  function a (line 2) | function a(){}
  function e (line 2) | function e(a,b){var d,h,k=arguments.length<3?a:arguments[2];return j(a)=...
  function e (line 2) | function e(a,b,d){var h,l,m=arguments.length<4?a:arguments[3],n=f.getDes...
  function c (line 2) | function c(a){var b=a.length,c=ka.type(a);return ka.isWindow(a)?!1:1===a...
  function d (line 2) | function d(a){var b=za[a]={};return ka.each(a.match(ma)||[],function(a,c...
  function e (line 2) | function e(a,c,d,e){if(ka.acceptData(a)){var f,g,h=ka.expando,i=a.nodeTy...
  function f (line 2) | function f(a,b,c){if(ka.acceptData(a)){var d,e,f=a.nodeType,g=f?ka.cache...
  function g (line 2) | function g(a,c,d){if(d===b&&1===a.nodeType){var e="data-"+c.replace(Ba,"...
  function h (line 2) | function h(a){var b;for(b in a)if(("data"!==b||!ka.isEmptyObject(a[b]))&...
  function i (line 2) | function i(){return!0}
  function j (line 2) | function j(){return!1}
  function k (line 2) | function k(){try{return Y.activeElement}catch(a){}}
  function l (line 2) | function l(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}
  function m (line 2) | function m(a,b,c){if(ka.isFunction(b))return ka.grep(a,function(a,d){ret...
  function n (line 2) | function n(a){var b=Ua.split("|"),c=a.createDocumentFragment();if(c.crea...
  function o (line 2) | function o(a,b){return ka.nodeName(a,"table")&&ka.nodeName(1===b.nodeTyp...
  function p (line 2) | function p(a){return a.type=(null!==ka.find.attr(a,"type"))+"/"+a.type,a}
  function q (line 2) | function q(a){var b=eb.exec(a.type);return b?a.type=b[1]:a.removeAttribu...
  function r (line 2) | function r(a,b){for(var c,d=0;null!=(c=a[d]);d++)ka._data(c,"globalEval"...
  function s (line 2) | function s(a,b){if(1===b.nodeType&&ka.hasData(a)){var c,d,e,f=ka._data(a...
  function t (line 2) | function t(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase...
  function u (line 2) | function u(a,c){var d,e,f=0,g=typeof a.getElementsByTagName!==W?a.getEle...
  function v (line 2) | function v(a){bb.test(a.type)&&(a.defaultChecked=a.checked)}
  function w (line 2) | function w(a,b){if(b in a)return b;for(var c=b.charAt(0).toUpperCase()+b...
  function x (line 2) | function x(a,b){return a=b||a,"none"===ka.css(a,"display")||!ka.contains...
  function y (line 2) | function y(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style...
  function z (line 2) | function z(a,b,c){var d=rb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2...
  function A (line 2) | function A(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b...
  function B (line 2) | function B(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=...
  function C (line 2) | function C(a){var b=Y,c=ub[a];return c||(c=D(a,b),"none"!==c&&c||(jb=(jb...
  function D (line 2) | function D(a,b){var c=ka(b.createElement(a)).appendTo(b.body),d=ka.css(c...
  function E (line 2) | function E(a,b,c,d){var e;if(ka.isArray(b))ka.each(b,function(b,e){c||Ab...
  function F (line 2) | function F(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d...
  function G (line 2) | function G(a,b,c,d){function e(h){var i;return f[h]=!0,ka.each(a[h]||[],...
  function H (line 2) | function H(a,c){var d,e,f=ka.ajaxSettings.flatOptions||{};for(e in c)c[e...
  function I (line 2) | function I(a,c,d){for(var e,f,g,h,i=a.contents,j=a.dataTypes;"*"===j[0];...
  function J (line 2) | function J(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for...
  function K (line 2) | function K(){try{return new a.XMLHttpRequest}catch(b){}}
  function L (line 2) | function L(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b...
  function M (line 2) | function M(){return setTimeout(function(){$b=b}),$b=ka.now()}
  function N (line 2) | function N(a,b,c){for(var d,e=(ec[b]||[]).concat(ec["*"]),f=0,g=e.length...
  function O (line 2) | function O(a,b,c){var d,e,f=0,g=dc.length,h=ka.Deferred().always(functio...
  function P (line 2) | function P(a,b){var c,d,e,f,g;for(c in a)if(d=ka.camelCase(c),e=b[d],f=a...
  function Q (line 2) | function Q(a,b,c){var d,e,f,g,h,i,j=this,k={},l=a.style,m=a.nodeType&&x(...
  function R (line 2) | function R(a,b,c,d,e){return new R.prototype.init(a,b,c,d,e)}
  function S (line 2) | function S(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=xb[e],d[...
  function T (line 2) | function T(a){return ka.isWindow(a)?a:9===a.nodeType?a.defaultView||a.pa...
  function c (line 3) | function c(a,b,c,d){var e,f,g,h,i,j,k,l,o,p;if((b?b.ownerDocument||b:O)!...
  function d (line 3) | function d(){function a(c,d){return b.push(c+=" ")>z.cacheLength&&delete...
  function e (line 3) | function e(a){return a[N]=!0,a}
  function f (line 3) | function f(a){var b=G.createElement("div");try{return!!a(b)}catch(c){ret...
  function g (line 3) | function g(a,b){for(var c=a.split("|"),d=a.length;d--;)z.attrHandle[c[d]...
  function h (line 3) | function h(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sour...
  function i (line 3) | function i(a){return function(b){var c=b.nodeName.toLowerCase();return"i...
  function j (line 3) | function j(a){return function(b){var c=b.nodeName.toLowerCase();return("...
  function k (line 3) | function k(a){return e(function(b){return b=+b,e(function(c,d){for(var e...
  function l (line 3) | function l(){}
  function m (line 3) | function m(a,b){var d,e,f,g,h,i,j,k=S[a+" "];if(k)return b?0:k.slice(0);...
  function n (line 3) | function n(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}
  function o (line 3) | function o(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=Q++;return b.first...
  function p (line 3) | function p(a){return a.length>1?function(b,c,d){for(var e=a.length;e--;)...
  function q (line 3) | function q(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f...
  function r (line 3) | function r(a,b,c,d,f,g){return d&&!d[N]&&(d=r(d)),f&&!f[N]&&(f=r(f,g)),e...
  function s (line 3) | function s(a){for(var b,c,d,e=a.length,f=z.relative[a[0].type],g=f||z.re...
  function t (line 3) | function t(a,b){var d=0,f=b.length>0,g=a.length>0,h=function(e,h,i,j,k){...
  function u (line 3) | function u(a,b,d){for(var e=0,f=b.length;f>e;e++)c(a,b[e],d);return d}
  function v (line 3) | function v(a,b,c,d){var e,f,g,h,i,j=m(a);if(!d&&1===j.length){if(f=j[0]=...
  function d (line 5) | function d(a,c,d,e){var f,l,s,t,v,x=c;2!==u&&(u=2,i&&clearTimeout(i),k=b...
  function d (line 5) | function d(){var d;return c.settings.submitHandler?(c.submitButton&&(d=a...
  function b (line 5) | function b(b){var c=a.data(this[0].form,"validator"),d="on"+b.type.repla...
  function a (line 6) | function a(a){return a.replace(/<.[^<>]*?>/g," ").replace(/&nbsp;|&#160;...
  function a (line 6) | function a(b,d){function e(a,b){return function(){return a.apply(b,argum...
  function g (line 6) | function g(){var b=0;i.each(function(){var c=a(this);if(!j.skip_invisibl...

FILE: wenda/src/test/java/com/nowcoder/InitDatabaseTests.java
  class InitDatabaseTests (line 15) | @RunWith(SpringJUnit4ClassRunner.class)
    method initDatabase (line 28) | @Test

FILE: wenda/src/test/java/com/nowcoder/ThreadTest.java
  class ThreadTest (line 9) | public class ThreadTest {
    method main (line 11) | public static void main(String[] args) {
    method testAtomic (line 19) | public static void testAtomic() {
    method testExecutor (line 39) | public static void testExecutor() {
    method test (line 73) | public static void test() {
  class Consumer (line 81) | class Consumer implements Runnable {
    method Consumer (line 85) | public Consumer(BlockingQueue<String> q) {
    method run (line 89) | @Override
  class Producer (line 101) | class Producer implements Runnable {
    method Producer (line 105) | public Producer(BlockingQueue<String> q) {
    method run (line 109) | @Override

FILE: wenda/src/test/java/com/nowcoder/WendaApplicationTests.java
  class WendaApplicationTests (line 9) | @RunWith(SpringJUnit4ClassRunner.class)
    method contextLoads (line 14) | @Test

FILE: wenda/src/test/resources/init-schema.sql
  type `question` (line 2) | CREATE TABLE `question` (
  type `user` (line 13) | CREATE TABLE `user` (

FILE: wenda/target/classes/static/scripts/base.fb262f0e.js
  function c (line 7) | function c(){}
  function c (line 14) | function c(){}
  function a (line 26) | function a(a){a=z.qb(a,d);return c[a]||""}
  function g (line 36) | function g(a){k||(k=!0,d.call(f,a))}
  function h (line 36) | function h(a){k||(k=!0,c.call(f,a))}
  function f (line 72) | function f(c){c&&b.appendChild(z.pa(c)?a.createTextNode(c):c)}
  function b (line 106) | function b(){f.onload=f.onerror=f.onreadystatechange=null;window.documen...
  function c (line 106) | function c(){b();d.resolve()}
  function g (line 166) | function g(){var a=b-r;0<a?(k.text(z.Ka(c(!0,n),a)),r+=1):h(a)}
  function h (line 166) | function h(a){a=void 0===a?b-r:a;m.stop();n+=1;k.text(z.Ka(c(!1,n),a));k...
  function c (line 181) | function c(b){Xk.call(this,b);this.name=a}
  function a (line 228) | function a(b,c){return c.length?a(b[c.shift()],c):b}
  function a (line 274) | function a(a){return{member:"people",favlist:"collection"}[a]||a}
  function b (line 415) | function b(a){return{start:c.rA?z.kb(a).id.split("-")[1]:0,offset:c.offs...

FILE: wenda/target/classes/static/scripts/common.fed5411f.js
  function d (line 36) | function d(){var b=new z.Z(!0),d="/question/"+(a?"set_anonymous":"set_pu...
  function d (line 37) | function d(g){g||(g=a.shift())&&b.call(c,g,f++,d)}
  function b (line 42) | function b(a){var c=!1;return function(){!0!==c&&(c=a.apply(this,argumen...
  function b (line 44) | function b(a){window.$.post("/node/Guide2",{method:"dismiss_editor",para...
  function c (line 44) | function c(a){z.xi(Object.assign({category:"popup_guide",label:{bio:"pop...
  function d (line 44) | function d(a){k||(k=new z.V,k.Bf(!0),k.cF=!1,z.W.add(k.fi(),"Guide"));k....
  function f (line 46) | function f(){z.Cp.dispatchEvent("guider2:topicselected")}
  function g (line 56) | function g(a){a&&(a.tabIndex=0,z.bj(a,h.jf()),z.hj(a,"goog-zippy-header"...
  function b (line 61) | function b(){(0,window.clearTimeout)(g);g=null;try{delete window[d]}catc...
  function d (line 68) | function d(a){return a&&a.preventDefault?a.preventDefault():!1}
  function c (line 88) | function c(b){return a.getElementsByTagName(b).length}
  function d (line 129) | function d(){return z.qb(b,function(a){return"topic"===a[0]&&a[4]&&a[1]=...
  function f (line 129) | function f(){return z.qb(b,function(a){return 3>=a.length&&a[1]===z.Ka("...
  function b (line 169) | function b(){var a=(0,window.$)('\x3cdiv\x3e\x3cdiv style\x3d"text-align...
  function a (line 184) | function a(a,b){a=z.pa(a)?new RegExp(a):a;return a.test(b)}
  function c (line 220) | function c(a){a=a.val();d.cH&&(a=window.$.trim(a));d.CR&&window.$.isNume...
  function d (line 312) | function d(a,b,c){a=["作者:"+b,"链接:"+a,"来源:知乎","著作权归作者所有。商业转载请联系作者获得授权,非商业...
  function f (line 312) | function f(a,b,c,f){b=d(b,c,f).join("\x3cbr /\x3e");return"\x3cdiv\x3e"+...
  function g (line 312) | function g(a,b,c,f){b=d(b,c,f).join("\n");return f?b+a:a+b}
  function h (line 312) | function h(){var a="";window.getSelection?a=window.getSelection().toStri...
  function k (line 313) | function k(a){var d=z.vu(),k=d&&(0,z.ab)(d.Id());if(k&&!(128>k.length)){...
  function b (line 330) | function b(){var b;ED||(ED=new CD,ED.init());b=ED;b.aj=a;b.kM=a.id.split...
  function c (line 330) | function c(b){if(!a.getAttribute("data-disabled")){var c;FD||(FD=new z.A...
  function d (line 330) | function d(){function b(){var f=d.value,g=a.getAttribute("id").split("-"...
  function b (line 335) | function b(a,b){return!!z.qb(a,function(a){return a.challenge_type===b})}
  function c (line 335) | function c(a){var b={value:a.challenge_type};switch(b.value){case "passw...
  function d (line 336) | function d(a){var b=(0,window.$)(".panel",k),c=a?b.filter(function(){ret...
  function c (line 342) | function c(a){a.eq(b).addClass("selected").siblings().removeClass("selec...
  function a (line 415) | function a(a){return a.replace(/\\\\/g,"\\").replace(/\\'/g,"'")}
  function c (line 512) | function c(a,b){if(3!==a.nodeType||"@"===a.nodeValue&&wv(a.previousSibli...
  function a (line 535) | function a(){Sv(b,!1);b.Gc.value=d.value}
  function g (line 550) | function g(a){a.r?z.X.message(a.msg):h(n)}
  function h (line 550) | function h(b){b?(z.W.Rv(a,k,m),pr(a,f.unfollow_text||"取消关注")):(z.W.Rv(a,...
  function a (line 551) | function a(){var b=Sw.shift();b&&(b=b[0],b.length?b(a):(b(),a()))}
  function a (line 621) | function a(a){return(0,z.Ii)({responseId:a.getResponseHeader("X-Za-Respo...
  function c (line 736) | function c(){b?b():d.handleError()}
  function f (line 737) | function f(){d.unmountComponentAtNode(c);b.G(!1)}
  function a (line 779) | function a(a,d){var f=z.O("div","zm-voters");a.appendChild(f);var g=z.O(...
  function a (line 781) | function a(){var a=c.Yc();if(a&&(b(),f)){var d=f,h=d.nb;h.data("async-vo...
  function b (line 781) | function b(){if(!g){var a=!z.Uj,b=z.N("js-collapse-body",c.m());a&&h&&(0...

FILE: wenda/target/classes/static/scripts/ga.js
  function Aa (line 1) | function Aa(a,b){switch(b){case 0:return""+a;case 1:return 1*a;case 2:re...
  function Ba (line 1) | function Ba(a){return"function"==typeof a}
  function Ca (line 1) | function Ca(a){return void 0!=a&&-1<(a.constructor+"").indexOf("String")}
  function F (line 1) | function F(a,b){return void 0==a||"-"==a&&!b||""==a}
  function Da (line 1) | function Da(a){if(!a||""==a)return"";for(;a&&-1<" \n\r\t".indexOf(a.char...
  function Ea (line 2) | function Ea(){return Math.round(2147483647*Math.random())}
  function Fa (line 2) | function Fa(){}
  function G (line 2) | function G(a,b){if(encodeURIComponent instanceof Function)return b?encod...
  function I (line 2) | function I(a){a=a.split("+").join(" ");if(decodeURIComponent instanceof ...
  function Ia (line 3) | function Ia(a,b){if(a){var c=J.createElement("script");c.type="text/java...
  function K (line 3) | function K(a){return a&&0<a.length?a[0]:""}
  function L (line 3) | function L(a){var b=a?a.length:0;return 0<b?a[b-1]:""}
  function Ka (line 4) | function Ka(a){0==a.indexOf("www.")&&(a=a.substring(4));return a.toLower...
  function La (line 5) | function La(a,b){var c,d={url:a,protocol:"http",host:"",path:"",R:new nf...
  function Oa (line 7) | function Oa(a,b){function c(a){var b=(a.hostname||"").split(":")[0].toLo...
  function Na (line 8) | function Na(a,b){function c(b,c){a.contains(b)||a.set(b,[]);a.get(b).pus...
  function Pa (line 9) | function Pa(a,b){if(F(a)||"["==a.charAt(0)&&"]"==a.charAt(a.length-1))re...
  function Ra (line 9) | function Ra(a,b,c){1<=Qa||1<=100*Math.random()||ld()||(a=["utmt=error","...
  function N (line 9) | function N(a){return Va("x"+Ta++,a)}
  function Va (line 9) | function Va(a,b){Ua[a]=!!b;return a}
  function a (line 11) | function a(a,c,d){T(qf.prototype,a,c,d)}
  function a (line 11) | function a(a,c,d){T(U.prototype,a,c,d)}
  function Pc (line 17) | function Pc(a){var b=this.plugins_;if(b)return b.get(a)}
  function $c (line 20) | function $c(a,b){b=b||[];for(var c=0;c<b.length;c++){var d=b[c];if(""+a=...
  function b (line 23) | function b(b,e){if(!F(a.get(b))){var f=a.c(b,""),f=f.split(" ").join("%2...
  function c (line 25) | function c(a){return(a=b.match(a+"=(.*?)(?:\\|utm|$)"))&&2==a.length?a[1...
  function d (line 25) | function d(b,c){c?(c=e?I(c):c.split("%20").join(" "),a.set(b,c)):a.set(b...
  function jd (line 25) | function jd(a){100!=a.get(vb)&&a.get(Q)%1E4>=100*a.get(vb)&&a.stopPropag...
  function kd (line 25) | function kd(a){ld(a.get(Wa))&&a.stopPropagation()}
  function md (line 25) | function md(a){"file:"==J.location.protocol&&a.stopPropagation()}
  function Ge (line 25) | function Ge(a){He()&&a.stopPropagation()}
  function nd (line 26) | function nd(a){a.get(Ib)||a.set(Ib,J.title,!0);a.get(Hb)||a.set(Hb,J.loc...
  function lf (line 26) | function lf(a){a.get(Wa)&&"UA-XXXXX-X"!=a.get(Wa)||a.stopPropagation()}
  function H (line 26) | function H(a){od.set(a)}
  function a (line 35) | function a(a,b,c,d){void 0==f[a]&&(f[a]={});void 0==f[a][b]&&(f[a][b]=[]...
  function b (line 35) | function b(a,b,c){if(void 0!=f[a]&&void 0!=f[a][b])return f[a][b][c]}
  function c (line 35) | function c(a,b){if(void 0!=f[a]&&void 0!=f[a][b]){f[a][b]=void 0;var c=!...
  function d (line 35) | function d(a){var b="",c=!1,d,e;for(d=0;d<Be.length;d++)if(e=a[Be[d]],vo...
  function wd (line 38) | function wd(a){return"string"==typeof a}
  function xd (line 38) | function xd(a){return!("number"==typeof a||void 0!=Number&&a instanceof ...
  function c (line 42) | function c(c,d){d=d||"-";var e=L(b.get(a.get(c)));return e&&"-"!=e?I(e):d}
  function c (line 45) | function c(a){a=(""+a).split("+").join("%20");return a=a.split(" ").join...
  function d (line 45) | function d(c){var d=""+(a.get(c)||"");c=""+(b[c]||"");return 0<d.length&...
  function d (line 54) | function d(a){return function(b){if((b=b.get(Nc)[a])&&b.length)for(var c...
  function c (line 68) | function c(a,b){b&&d.push(a+"="+b+";")}
  function Yc (line 77) | function Yc(a){var b=1,c=0,d;if(a)for(b=0,d=a.length-1;0<=d;d--)c=a.char...

FILE: wenda/target/classes/static/scripts/instant.e7a17de6.js
  function c (line 1) | function c(a){function b(a,b){var c;return window.getComputedStyle?c=win...
  function d (line 1) | function d(a){var b=+a.getAttribute("data-rawwidth"),d=+a.getAttribute("...
  function e (line 1) | function e(){var a=b.querySelectorAll;if(a)return a.call(b,"img.lazy");v...
  function f (line 1) | function f(a,b){for(var c=a.length-1;c>=0;c--)b(a[c])}
  function d (line 1) | function d(a,b){return typeof a===b}
  function e (line 1) | function e(){var a,b,c,e,f,g,h;for(var i in s)if(s.hasOwnProperty(i)){if...
  function f (line 1) | function f(a){var b=w.className,c=u._config.classPrefix||"";if(x&&(b=b.b...
  function g (line 1) | function g(a,b){return!!~(""+a).indexOf(b)}
  function h (line 1) | function h(){return"function"!=typeof b.createElement?b.createElement(ar...
  function i (line 1) | function i(){var a=b.body;return a||(a=h(x?"svg":"body"),a.fake=!0),a}
  function j (line 1) | function j(a,c,d,e){var f,g,j,k,l="modernizr",m=h("div"),n=i();if(parseI...
  function k (line 1) | function k(a){return a.replace(/([A-Z])/g,function(a,b){return"-"+b.toLo...
  function l (line 1) | function l(b,d){var e=b.length;if("CSS"in a&&"supports"in a.CSS){for(;e-...
  function m (line 1) | function m(a){return a.replace(/([a-z])-([a-z])/g,function(a,b,c){return...
  function n (line 1) | function n(a,b,e,f){function i(){k&&(delete D.style,delete D.modElem)}if...
  function o (line 1) | function o(a,b){return function(){return a.apply(b,arguments)}}
  function p (line 1) | function p(a,b,c){var e;for(var f in a)if(a[f]in b)return c===!1?a[f]:(e...
  function q (line 1) | function q(a,b,c,e,f){var g=a.charAt(0).toUpperCase()+a.slice(1),h=(a+" ...
  function r (line 1) | function r(a,b,d){return q(a,c,c,b,d)}

FILE: wenda/target/classes/static/scripts/main/base/base.js
  function fReady (line 23) | function fReady(sName, oParam) {
  function fTpl (line 68) | function fTpl(sTpl, oData) {
  function fBind (line 76) | function fBind(f, oTarget) {
  function fCreateClass (line 86) | function fCreateClass(sPackage, sClassName) {
  function fGetClass (line 132) | function fGetClass(sPackage, sClassName) {
  function fMix (line 156) | function fMix(oChild, oParent, oExtend, oExtendPrototype) {
  function fInherit (line 193) | function fInherit(oChild, oParent, oExtend) {

FILE: wenda/target/classes/static/scripts/main/base/event.js
  function fOn (line 10) | function fOn(sName, fCb) {
  function fEmit (line 21) | function fEmit(sName) {
  function fUnbind (line 33) | function fUnbind(sName, fCb) {
  function fUnbindAll (line 55) | function fUnbindAll() {

FILE: wenda/target/classes/static/scripts/main/base/util.js
  function fIsEmail (line 7) | function fIsEmail(sEmail) {

FILE: wenda/target/classes/static/scripts/main/component/component.js
  function fStaticSetEvents (line 27) | function fStaticSetEvents() {
  function fInitialize (line 38) | function fInitialize(oConf) {
  function fRender (line 47) | function fRender() {
  function fGetEl (line 58) | function fGetEl() {
  function fHtml (line 74) | function fHtml() {
  function fDestroy (line 89) | function fDestroy() {
  function fGetData (line 97) | function fGetData(oConf) {
  function fForbidScroll (line 101) | function fForbidScroll(oEl, bForbid) {
  function fEmit (line 105) | function fEmit(sName) {
  function _fSetCustomEvent (line 116) | function _fSetCustomEvent() {
  function _fSetDomEvent (line 132) | function _fSetDomEvent() {

FILE: wenda/target/classes/static/scripts/main/component/popup.js
  function fInitialize (line 114) | function fInitialize(oConf) {
  function fInitMask (line 122) | function fInitMask() {
  function fFixPosition (line 131) | function fFixPosition() {
  function fClose (line 154) | function fClose(bNoEmit) {
  function fError (line 160) | function fError(sContent) {
  function fGetData (line 167) | function fGetData(oConf) {

FILE: wenda/target/classes/static/scripts/main/component/popupAdd.js
  function fStaticShow (line 53) | function fStaticShow(oConf) {
  function fInitialize (line 106) | function fInitialize(oConf) {
  function fVal (line 112) | function fVal(oData) {

FILE: wenda/target/classes/static/scripts/main/component/popupMsg.js
  function fStaticShow (line 55) | function fStaticShow(oConf) {
  function fInitialize (line 114) | function fInitialize(oConf) {
  function fVal (line 120) | function fVal(oData) {

FILE: wenda/target/classes/static/scripts/main/jquery.js
  function DOMEval (line 76) | function DOMEval( code, doc ) {
  function isArrayLike (line 525) | function isArrayLike( obj ) {
  function Sizzle (line 757) | function Sizzle( selector, context, results, seed ) {
  function createCache (line 896) | function createCache() {
  function markFunction (line 914) | function markFunction( fn ) {
  function assert (line 923) | function assert( fn ) {
  function addHandle (line 945) | function addHandle( attrs, handler ) {
  function siblingCheck (line 960) | function siblingCheck( a, b ) {
  function createInputPseudo (line 986) | function createInputPseudo( type ) {
  function createButtonPseudo (line 997) | function createButtonPseudo( type ) {
  function createDisabledPseudo (line 1008) | function createDisabledPseudo( disabled ) {
  function createPositionalPseudo (line 1036) | function createPositionalPseudo( fn ) {
  function testContext (line 1059) | function testContext( context ) {
  function setFilters (line 2115) | function setFilters() {}
  function toSelector (line 2186) | function toSelector( tokens ) {
  function addCombinator (line 2196) | function addCombinator( matcher, combinator, base ) {
  function elementMatcher (line 2258) | function elementMatcher( matchers ) {
  function multipleContexts (line 2272) | function multipleContexts( selector, contexts, results ) {
  function condense (line 2281) | function condense( unmatched, map, filter, context, xml ) {
  function setMatcher (line 2302) | function setMatcher( preFilter, selector, matcher, postFilter, postFinde...
  function matcherFromTokens (line 2395) | function matcherFromTokens( tokens ) {
  function matcherFromGroupMatchers (line 2453) | function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
  function winnow (line 2794) | function winnow( elements, qualifier, not ) {
  function sibling (line 3091) | function sibling( cur, dir ) {
  function createOptions (line 3167) | function createOptions( options ) {
  function Identity (line 3392) | function Identity( v ) {
  function Thrower (line 3395) | function Thrower( ex ) {
  function adoptValue (line 3399) | function adoptValue( value, resolve, reject ) {
  function resolve (line 3491) | function resolve( depth, deferred, handler, special ) {
  function completed (line 3840) | function completed() {
  function Data (line 3940) | function Data() {
  function dataAttr (line 4109) | function dataAttr( elem, key, data ) {
  function adjustCSS (line 4429) | function adjustCSS( elem, prop, valueParts, tween ) {
  function getDefaultDisplay (line 4490) | function getDefaultDisplay( elem ) {
  function showHide (line 4513) | function showHide( elements, show ) {
  function getAll (line 4614) | function getAll( context, tag ) {
  function setGlobalEval (line 4631) | function setGlobalEval( elems, refElements ) {
  function buildFragment (line 4647) | function buildFragment( elems, context, scripts, selection, ignored ) {
  function returnTrue (line 4770) | function returnTrue() {
  function returnFalse (line 4774) | function returnFalse() {
  function safeActiveElement (line 4780) | function safeActiveElement() {
  function on (line 4786) | function on( elem, types, selector, data, fn, one ) {
  function manipulationTarget (line 5489) | function manipulationTarget( elem, content ) {
  function disableScript (line 5500) | function disableScript( elem ) {
  function restoreScript (line 5504) | function restoreScript( elem ) {
  function cloneCopyEvent (line 5516) | function cloneCopyEvent( src, dest ) {
  function fixInput (line 5551) | function fixInput( src, dest ) {
  function domManip (line 5564) | function domManip( collection, args, callback, ignored ) {
  function remove (line 5654) | function remove( elem, selector, keepData ) {
  function computeStyleTests (line 5947) | function computeStyleTests() {
  function curCSS (line 6021) | function curCSS( elem, name, computed ) {
  function addGetHookIf (line 6068) | function addGetHookIf( conditionFn, hookFn ) {
  function vendorPropName (line 6104) | function vendorPropName( name ) {
  function setPositiveNumber (line 6123) | function setPositiveNumber( elem, value, subtract ) {
  function augmentWidthOrHeight (line 6135) | function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
  function getWidthOrHeight (line 6179) | function getWidthOrHeight( elem, name, extra ) {
  function Tween (line 6487) | function Tween( elem, options, prop, end, easing ) {
  function raf (line 6610) | function raf() {
  function createFxNow (line 6618) | function createFxNow() {
  function genFx (line 6626) | function genFx( type, includeWidth ) {
  function createTween (line 6646) | function createTween( value, prop, animation ) {
  function defaultPrefilter (line 6660) | function defaultPrefilter( elem, props, opts ) {
  function propFilter (line 6829) | function propFilter( props, specialEasing ) {
  function Animation (line 6866) | function Animation( elem, properties, options ) {
  function getClass (line 7557) | function getClass( elem ) {
  function buildParams (line 8177) | function buildParams( prefix, obj, traditional, add ) {
  function addToPrefiltersOrTransports (line 8323) | function addToPrefiltersOrTransports( structure ) {
  function inspectPrefiltersOrTransports (line 8357) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
  function ajaxExtend (line 8386) | function ajaxExtend( target, src ) {
  function ajaxHandleResponses (line 8406) | function ajaxHandleResponses( s, jqXHR, responses ) {
  function ajaxConvert (line 8464) | function ajaxConvert( s, response, jqXHR, isSuccess ) {
  function done (line 8976) | function done( status, nativeStatusText, responses, headers ) {
  function getWindow (line 9701) | function getWindow( elem ) {

FILE: wenda/target/classes/static/scripts/main/site/detail.js
  function fInitialize (line 14) | function fInitialize() {
  function fVote (line 23) | function fVote(oEvent) {
  function fUnlike (line 59) | function fUnlike(oEvent) {

FILE: wenda/target/classes/static/scripts/main/site/follow.js
  function fInitialize (line 8) | function fInitialize() {

FILE: wenda/target/classes/static/scripts/main/site/home.js
  function fInitialize (line 13) | function fInitialize() {
  function fClickAdd (line 17) | function fClickAdd() {
  function fClickMsg (line 26) | function fClickMsg() {

FILE: wenda/target/classes/static/scripts/main/site/profile.js
  function fInitialize (line 8) | function fInitialize() {

FILE: wenda/target/classes/static/scripts/main/util/action.js
  function fLike (line 21) | function fLike(oConf) {
  function fDislike (line 40) | function fDislike(oConf) {
  function fFollowUser (line 59) | function fFollowUser(oConf) {
  function fUnFollowUser (line 78) | function fUnFollowUser(oConf) {
  function fFollowQuestion (line 97) | function fFollowQuestion(oConf) {
  function fUnFollowQuestion (line 116) | function fUnFollowQuestion(oConf) {
  function fPost (line 137) | function fPost(oConf) {

FILE: wenda/target/classes/static/scripts/main/util/business.js
  function fFollowUser (line 10) | function fFollowUser() {
  function fFollowQuestion (line 43) | function fFollowQuestion(oConf) {

FILE: wenda/target/classes/static/scripts/page-index.d7b54ac7.js
  function a (line 5) | function a(){var a=window.particlesJS;a&&((0,window.$)("\x3cdiv\x3e",{id...
  function a (line 13) | function a(a,b){(0,window.$)(":submit",a).click(function(){return b(a)})...

FILE: wenda/target/classes/static/scripts/page-main.5d4c554d.js
  function b (line 4) | function b(a){if(z.na(a))z.y(a,b);else{if(!(a instanceof z.Ed)){var g=nu...
  function a (line 26) | function a(a){if(!a)return z.X.message("网络异常");if(a.r)return z.X.message...
  function c (line 29) | function c(){var a=z.Pe(window.document).y,b=0;h.some(function(c,d){a>c&...
  function a (line 46) | function a(){function a(){return new window.Promise(function(a){w.onAnim...
  function b (line 48) | function b(){var a=(0,window.$)(".copyright-demo-pointer"),b=(0,window.$...
  function b (line 101) | function b(a,b){var h=(0,window.$)(a);window.$.each(b(),function(a,b){h....
  function c (line 101) | function c(a,b){return z.nb(a,function(a){return z.sa(a)?a(b):a})}
  function a (line 106) | function a(){return function(a){return"search_result_all_list_"+((0,wind...
  function a (line 106) | function a(b){return function(a){return"search_result_user_list_"+((0,wi...
  function a (line 107) | function a(b){return function(a){return"search_result_topic_list_"+((0,w...
  function a (line 131) | function a(a,b,c,d,m){c=(0,window.$)(c.target).closest(d,c.delegateTarge...
  function a (line 247) | function a(a,c){var d={action:a,category:"topic"};c&&(d.attributes=c);z....
  function a (line 249) | function a(a){if((0,window.$)(a).hasClass("article-item"))return new z.j...

FILE: wenda/target/classes/static/scripts/richtexteditor.aa0a4005.js
  function c (line 49) | function c(a,b){return{iB:a,YH:b}}
  function b (line 55) | function b(a){return z.A(f,a)}
  function c (line 55) | function c(){var a=window.document.createTextNode("\n");f.push(a);return a}
  function c (line 60) | function c(a){return a.parentNode.insertBefore(window.document.createTex...
  function g (line 87) | function g(a){var c=z.cd(b),f=z.jf(a.target)?a.target.getAttribute("role...
  function a (line 116) | function a(a,c,d){function r(a){z.df(a)}function ca(b,c){for(;b!==a;){if...
  function b (line 117) | function b(a,b){if(b){var c=function(b,c){return b&&g(a,b)&&z.Ju(b)>=c};...
  function c (line 118) | function c(a){return a&&"BR"===a.tagName||II(a)||z.Nu(a)}
  function d (line 118) | function d(a){a=z.uf(a,function(a){a=a.parentNode;return II(a)||z.Nu(a)}...
  function f (line 118) | function f(a,b){if(r.gM)window.document.execCommand("formatBlock",!1,b);...
  function g (line 119) | function g(a,b){return 3===a.nodeType?a===b:a.contains(3===b.nodeType?b....
  function h (line 119) | function h(a){return xI(a.Z(),a.va(),a.la(),a.La())}
  function k (line 119) | function k(a){function b(a){return!(a.previousSibling&&g(a.previousSibli...

FILE: wenda/target/classes/static/scripts/vendor.ff76fbae.js
  function c (line 1) | function c(){var a=d();a&&i(f(),function(b){a===b.getAttribute("znonce")...
  function d (line 1) | function d(){var a=b.getElementById("znonce");return a&&"META"===a.tagNa...
  function e (line 1) | function e(){return document.currentScript||document.scripts[document.sc...
  function f (line 1) | function f(){var a=b.querySelectorAll,c="text/zscript";if(a)return a.cal...
  function g (line 1) | function g(b){b&&b.length&&(a.execScript||function(b){a.eval.call(a,b)})...
  function h (line 1) | function h(a){return"textContent"in a?a.textContent:a.text}
  function i (line 1) | function i(a,b){for(var c=a.length-1;c>=0;c--)b(a[c])}
  function b (line 1) | function b(d){if(c[d])return c[d].exports;var e=c[d]={exports:{},id:d,lo...
  function d (line 1) | function d(a){return isFinite(a=+a)&&0!=a?0>a?-d(-a):Math.log(a+Math.sqr...
  function a (line 1) | function a(){}
  function a (line 1) | function a(b){var c=new y(b);return q(c,a.prototype),c}
  function a (line 2) | function a(){}
  function e (line 2) | function e(a,b){var d,h,k=arguments.length<3?a:arguments[2];return j(a)=...
  function e (line 2) | function e(a,b,d){var h,l,m=arguments.length<4?a:arguments[3],n=f.getDes...
  function c (line 2) | function c(a){var b=a.length,c=ka.type(a);return ka.isWindow(a)?!1:1===a...
  function d (line 2) | function d(a){var b=za[a]={};return ka.each(a.match(ma)||[],function(a,c...
  function e (line 2) | function e(a,c,d,e){if(ka.acceptData(a)){var f,g,h=ka.expando,i=a.nodeTy...
  function f (line 2) | function f(a,b,c){if(ka.acceptData(a)){var d,e,f=a.nodeType,g=f?ka.cache...
  function g (line 2) | function g(a,c,d){if(d===b&&1===a.nodeType){var e="data-"+c.replace(Ba,"...
  function h (line 2) | function h(a){var b;for(b in a)if(("data"!==b||!ka.isEmptyObject(a[b]))&...
  function i (line 2) | function i(){return!0}
  function j (line 2) | function j(){return!1}
  function k (line 2) | function k(){try{return Y.activeElement}catch(a){}}
  function l (line 2) | function l(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}
  function m (line 2) | function m(a,b,c){if(ka.isFunction(b))return ka.grep(a,function(a,d){ret...
  function n (line 2) | function n(a){var b=Ua.split("|"),c=a.createDocumentFragment();if(c.crea...
  function o (line 2) | function o(a,b){return ka.nodeName(a,"table")&&ka.nodeName(1===b.nodeTyp...
  function p (line 2) | function p(a){return a.type=(null!==ka.find.attr(a,"type"))+"/"+a.type,a}
  function q (line 2) | function q(a){var b=eb.exec(a.type);return b?a.type=b[1]:a.removeAttribu...
  function r (line 2) | function r(a,b){for(var c,d=0;null!=(c=a[d]);d++)ka._data(c,"globalEval"...
  function s (line 2) | function s(a,b){if(1===b.nodeType&&ka.hasData(a)){var c,d,e,f=ka._data(a...
  function t (line 2) | function t(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase...
  function u (line 2) | function u(a,c){var d,e,f=0,g=typeof a.getElementsByTagName!==W?a.getEle...
  function v (line 2) | function v(a){bb.test(a.type)&&(a.defaultChecked=a.checked)}
  function w (line 2) | function w(a,b){if(b in a)return b;for(var c=b.charAt(0).toUpperCase()+b...
  function x (line 2) | function x(a,b){return a=b||a,"none"===ka.css(a,"display")||!ka.contains...
  function y (line 2) | function y(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style...
  function z (line 2) | function z(a,b,c){var d=rb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2...
  function A (line 2) | function A(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b...
  function B (line 2) | function B(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=...
  function C (line 2) | function C(a){var b=Y,c=ub[a];return c||(c=D(a,b),"none"!==c&&c||(jb=(jb...
  function D (line 2) | function D(a,b){var c=ka(b.createElement(a)).appendTo(b.body),d=ka.css(c...
  function E (line 2) | function E(a,b,c,d){var e;if(ka.isArray(b))ka.each(b,function(b,e){c||Ab...
  function F (line 2) | function F(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d...
  function G (line 2) | function G(a,b,c,d){function e(h){var i;return f[h]=!0,ka.each(a[h]||[],...
  function H (line 2) | function H(a,c){var d,e,f=ka.ajaxSettings.flatOptions||{};for(e in c)c[e...
  function I (line 2) | function I(a,c,d){for(var e,f,g,h,i=a.contents,j=a.dataTypes;"*"===j[0];...
  function J (line 2) | function J(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for...
  function K (line 2) | function K(){try{return new a.XMLHttpRequest}catch(b){}}
  function L (line 2) | function L(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b...
  function M (line 2) | function M(){return setTimeout(function(){$b=b}),$b=ka.now()}
  function N (line 2) | function N(a,b,c){for(var d,e=(ec[b]||[]).concat(ec["*"]),f=0,g=e.length...
  function O (line 2) | function O(a,b,c){var d,e,f=0,g=dc.length,h=ka.Deferred().always(functio...
  function P (line 2) | function P(a,b){var c,d,e,f,g;for(c in a)if(d=ka.camelCase(c),e=b[d],f=a...
  function Q (line 2) | function Q(a,b,c){var d,e,f,g,h,i,j=this,k={},l=a.style,m=a.nodeType&&x(...
  function R (line 2) | function R(a,b,c,d,e){return new R.prototype.init(a,b,c,d,e)}
  function S (line 2) | function S(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=xb[e],d[...
  function T (line 2) | function T(a){return ka.isWindow(a)?a:9===a.nodeType?a.defaultView||a.pa...
  function c (line 3) | function c(a,b,c,d){var e,f,g,h,i,j,k,l,o,p;if((b?b.ownerDocument||b:O)!...
  function d (line 3) | function d(){function a(c,d){return b.push(c+=" ")>z.cacheLength&&delete...
  function e (line 3) | function e(a){return a[N]=!0,a}
  function f (line 3) | function f(a){var b=G.createElement("div");try{return!!a(b)}catch(c){ret...
  function g (line 3) | function g(a,b){for(var c=a.split("|"),d=a.length;d--;)z.attrHandle[c[d]...
  function h (line 3) | function h(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sour...
  function i (line 3) | function i(a){return function(b){var c=b.nodeName.toLowerCase();return"i...
  function j (line 3) | function j(a){return function(b){var c=b.nodeName.toLowerCase();return("...
  function k (line 3) | function k(a){return e(function(b){return b=+b,e(function(c,d){for(var e...
  function l (line 3) | function l(){}
  function m (line 3) | function m(a,b){var d,e,f,g,h,i,j,k=S[a+" "];if(k)return b?0:k.slice(0);...
  function n (line 3) | function n(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}
  function o (line 3) | function o(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=Q++;return b.first...
  function p (line 3) | function p(a){return a.length>1?function(b,c,d){for(var e=a.length;e--;)...
  function q (line 3) | function q(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f...
  function r (line 3) | function r(a,b,c,d,f,g){return d&&!d[N]&&(d=r(d)),f&&!f[N]&&(f=r(f,g)),e...
  function s (line 3) | function s(a){for(var b,c,d,e=a.length,f=z.relative[a[0].type],g=f||z.re...
  function t (line 3) | function t(a,b){var d=0,f=b.length>0,g=a.length>0,h=function(e,h,i,j,k){...
  function u (line 3) | function u(a,b,d){for(var e=0,f=b.length;f>e;e++)c(a,b[e],d);return d}
  function v (line 3) | function v(a,b,c,d){var e,f,g,h,i,j=m(a);if(!d&&1===j.length){if(f=j[0]=...
  function d (line 5) | function d(a,c,d,e){var f,l,s,t,v,x=c;2!==u&&(u=2,i&&clearTimeout(i),k=b...
  function d (line 5) | function d(){var d;return c.settings.submitHandler?(c.submitButton&&(d=a...
  function b (line 5) | function b(b){var c=a.data(this[0].form,"validator"),d="on"+b.type.repla...
  function a (line 6) | function a(a){return a.replace(/<.[^<>]*?>/g," ").replace(/&nbsp;|&#160;...
  function a (line 6) | function a(b,d){function e(a,b){return function(){return a.apply(b,argum...
  function g (line 6) | function g(){var b=0;i.each(function(){var c=a(this);if(!j.skip_invisibl...

FILE: wenda/target/test-classes/init-schema.sql
  type `question` (line 2) | CREATE TABLE `question` (
  type `user` (line 13) | CREATE TABLE `user` (
Condensed preview — 250 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (6,345K chars).
[
  {
    "path": "README.md",
    "chars": 5760,
    "preview": "# nowcoder问答平台\n\n**本项目是一个基于 SpringBoot 的问答平台。数据库使用了 redis 和 mysql,实现注册登录、点赞点踩、评论站内信、Timeline 事件流等功能,同时通过一个异步消息框架来实现事件的异步处"
  },
  {
    "path": "wenda/.idea/compiler.xml",
    "chars": 622,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <annotationP"
  },
  {
    "path": "wenda/.idea/encodings.xml",
    "chars": 172,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Encoding\">\n    <file url=\"file://$PROJEC"
  },
  {
    "path": "wenda/.idea/inspectionProfiles/Project_Default.xml",
    "chars": 262,
    "preview": "<component name=\"InspectionProjectProfileManager\">\n  <profile version=\"1.0\">\n    <option name=\"myName\" value=\"Project De"
  },
  {
    "path": "wenda/.idea/libraries/Maven__antlr_antlr_2_7_7.xml",
    "chars": 450,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: antlr:antlr:2.7.7\">\n    <CLASSES>\n      <root url=\"jar://$MAVEN_"
  },
  {
    "path": "wenda/.idea/libraries/Maven__aopalliance_aopalliance_1_0.xml",
    "chars": 502,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: aopalliance:aopalliance:1.0\">\n    <CLASSES>\n      <root url=\"jar"
  },
  {
    "path": "wenda/.idea/libraries/Maven__ch_qos_logback_logback_classic_1_1_7.xml",
    "chars": 556,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: ch.qos.logback:logback-classic:1.1.7\">\n    <CLASSES>\n      <root"
  },
  {
    "path": "wenda/.idea/libraries/Maven__ch_qos_logback_logback_core_1_1_7.xml",
    "chars": 535,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: ch.qos.logback:logback-core:1.1.7\">\n    <CLASSES>\n      <root ur"
  },
  {
    "path": "wenda/.idea/libraries/Maven__com_alibaba_fastjson_1_2_13.xml",
    "chars": 502,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: com.alibaba:fastjson:1.2.13\">\n    <CLASSES>\n      <root url=\"jar"
  },
  {
    "path": "wenda/.idea/libraries/Maven__com_fasterxml_classmate_1_1_0.xml",
    "chars": 510,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: com.fasterxml:classmate:1.1.0\">\n    <CLASSES>\n      <root url=\"j"
  },
  {
    "path": "wenda/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_6_7.xml",
    "chars": 632,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: com.fasterxml.jackson.core:jackson-annotations:2.6.7\">\n    <CLAS"
  },
  {
    "path": "wenda/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_6_7.xml",
    "chars": 583,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: com.fasterxml.jackson.core:jackson-core:2.6.7\">\n    <CLASSES>\n  "
  },
  {
    "path": "wenda/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_6_7.xml",
    "chars": 611,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: com.fasterxml.jackson.core:jackson-databind:2.6.7\">\n    <CLASSES"
  },
  {
    "path": "wenda/.idea/libraries/Maven__com_google_protobuf_protobuf_java_2_6_0.xml",
    "chars": 562,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: com.google.protobuf:protobuf-java:2.6.0\">\n    <CLASSES>\n      <r"
  },
  {
    "path": "wenda/.idea/libraries/Maven__commons_beanutils_commons_beanutils_1_9_2.xml",
    "chars": 582,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: commons-beanutils:commons-beanutils:1.9.2\">\n    <CLASSES>\n      "
  },
  {
    "path": "wenda/.idea/libraries/Maven__commons_chain_commons_chain_1_1.xml",
    "chars": 524,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: commons-chain:commons-chain:1.1\">\n    <CLASSES>\n      <root url="
  },
  {
    "path": "wenda/.idea/libraries/Maven__commons_collections_commons_collections_3_2_2.xml",
    "chars": 604,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: commons-collections:commons-collections:3.2.2\">\n    <CLASSES>\n  "
  },
  {
    "path": "wenda/.idea/libraries/Maven__commons_digester_commons_digester_2_1.xml",
    "chars": 557,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: commons-digester:commons-digester:2.1\">\n    <CLASSES>\n      <roo"
  },
  {
    "path": "wenda/.idea/libraries/Maven__commons_lang_commons_lang_2_4.xml",
    "chars": 513,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: commons-lang:commons-lang:2.4\">\n    <CLASSES>\n      <root url=\"j"
  },
  {
    "path": "wenda/.idea/libraries/Maven__commons_validator_commons_validator_1_3_1.xml",
    "chars": 582,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: commons-validator:commons-validator:1.3.1\">\n    <CLASSES>\n      "
  },
  {
    "path": "wenda/.idea/libraries/Maven__dom4j_dom4j_1_1.xml",
    "chars": 436,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: dom4j:dom4j:1.1\">\n    <CLASSES>\n      <root url=\"jar://$MAVEN_RE"
  },
  {
    "path": "wenda/.idea/libraries/Maven__javax_activation_activation_1_1.xml",
    "chars": 515,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: javax.activation:activation:1.1\">\n    <CLASSES>\n      <root url="
  },
  {
    "path": "wenda/.idea/libraries/Maven__javax_mail_mail_1_4_7.xml",
    "chars": 463,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: javax.mail:mail:1.4.7\">\n    <CLASSES>\n      <root url=\"jar://$MA"
  },
  {
    "path": "wenda/.idea/libraries/Maven__javax_validation_validation_api_1_1_0_Final.xml",
    "chars": 599,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: javax.validation:validation-api:1.1.0.Final\">\n    <CLASSES>\n    "
  },
  {
    "path": "wenda/.idea/libraries/Maven__junit_junit_4_12.xml",
    "chars": 443,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: junit:junit:4.12\">\n    <CLASSES>\n      <root url=\"jar://$MAVEN_R"
  },
  {
    "path": "wenda/.idea/libraries/Maven__mysql_mysql_connector_java_8_0_12.xml",
    "chars": 562,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: mysql:mysql-connector-java:8.0.12\">\n    <CLASSES>\n      <root ur"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_apache_commons_commons_pool2_2_4_2.xml",
    "chars": 558,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.apache.commons:commons-pool2:2.4.2\">\n    <CLASSES>\n      <ro"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_apache_struts_struts_core_1_3_8.xml",
    "chars": 540,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.apache.struts:struts-core:1.3.8\">\n    <CLASSES>\n      <root "
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_apache_struts_struts_taglib_1_3_8.xml",
    "chars": 554,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.apache.struts:struts-taglib:1.3.8\">\n    <CLASSES>\n      <roo"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_apache_struts_struts_tiles_1_3_8.xml",
    "chars": 547,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.apache.struts:struts-tiles:1.3.8\">\n    <CLASSES>\n      <root"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_core_8_0_36.xml",
    "chars": 613,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.apache.tomcat.embed:tomcat-embed-core:8.0.36\">\n    <CLASSES>"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_el_8_0_36.xml",
    "chars": 599,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.apache.tomcat.embed:tomcat-embed-el:8.0.36\">\n    <CLASSES>\n "
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_logging_juli_8_0_36.xml",
    "chars": 669,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.apache.tomcat.embed:tomcat-embed-logging-juli:8.0.36\">\n    <"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_websocket_8_0_36.xml",
    "chars": 648,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.apache.tomcat.embed:tomcat-embed-websocket:8.0.36\">\n    <CLA"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_apache_tomcat_tomcat_jdbc_8_0_36.xml",
    "chars": 547,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.apache.tomcat:tomcat-jdbc:8.0.36\">\n    <CLASSES>\n      <root"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_apache_tomcat_tomcat_juli_8_0_36.xml",
    "chars": 547,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.apache.tomcat:tomcat-juli:8.0.36\">\n    <CLASSES>\n      <root"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_apache_velocity_velocity_1_7.xml",
    "chars": 513,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.apache.velocity:velocity:1.7\">\n    <CLASSES>\n      <root url"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_apache_velocity_velocity_tools_2_0.xml",
    "chars": 555,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.apache.velocity:velocity-tools:2.0\">\n    <CLASSES>\n      <ro"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_aspectj_aspectjweaver_1_8_9.xml",
    "chars": 530,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.aspectj:aspectjweaver:1.8.9\">\n    <CLASSES>\n      <root url="
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml",
    "chars": 520,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.hamcrest:hamcrest-core:1.3\">\n    <CLASSES>\n      <root url=\""
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_hamcrest_hamcrest_library_1_3.xml",
    "chars": 541,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.hamcrest:hamcrest-library:1.3\">\n    <CLASSES>\n      <root ur"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_hibernate_hibernate_validator_5_2_4_Final.xml",
    "chars": 622,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.hibernate:hibernate-validator:5.2.4.Final\">\n    <CLASSES>\n  "
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_3_0_Final.xml",
    "chars": 596,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.jboss.logging:jboss-logging:3.3.0.Final\">\n    <CLASSES>\n    "
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_mockito_mockito_core_1_10_19.xml",
    "chars": 537,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.mockito:mockito-core:1.10.19\">\n    <CLASSES>\n      <root url"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_mybatis_mybatis_3_4_0.xml",
    "chars": 488,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.mybatis:mybatis:3.4.0\">\n    <CLASSES>\n      <root url=\"jar:/"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_mybatis_mybatis_spring_1_3_0.xml",
    "chars": 537,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.mybatis:mybatis-spring:1.3.0\">\n    <CLASSES>\n      <root url"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_mybatis_spring_boot_mybatis_spring_boot_autoconfigure_1_1_1.xml",
    "chars": 718,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:1.1.1\""
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_mybatis_spring_boot_mybatis_spring_boot_starter_1_1_1.xml",
    "chars": 676,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:1.1.1\">\n    "
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_objenesis_objenesis_2_1.xml",
    "chars": 496,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.objenesis:objenesis:2.1\">\n    <CLASSES>\n      <root url=\"jar"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_slf4j_jcl_over_slf4j_1_7_21.xml",
    "chars": 536,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.slf4j:jcl-over-slf4j:1.7.21\">\n    <CLASSES>\n      <root url="
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_slf4j_jul_to_slf4j_1_7_21.xml",
    "chars": 522,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.slf4j:jul-to-slf4j:1.7.21\">\n    <CLASSES>\n      <root url=\"j"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_slf4j_log4j_over_slf4j_1_7_21.xml",
    "chars": 550,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.slf4j:log4j-over-slf4j:1.7.21\">\n    <CLASSES>\n      <root ur"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_21.xml",
    "chars": 501,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.slf4j:slf4j-api:1.7.21\">\n    <CLASSES>\n      <root url=\"jar:"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_springframework_boot_spring_boot_1_3_6_RELEASE.xml",
    "chars": 624,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.springframework.boot:spring-boot:1.3.6.RELEASE\">\n    <CLASSE"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_1_3_6_RELEASE.xml",
    "chars": 722,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.springframework.boot:spring-boot-autoconfigure:1.3.6.RELEASE"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_springframework_boot_spring_boot_devtools_1_3_6_RELEASE.xml",
    "chars": 687,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.springframework.boot:spring-boot-devtools:1.3.6.RELEASE\">\n  "
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_1_3_6_RELEASE.xml",
    "chars": 680,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.springframework.boot:spring-boot-starter:1.3.6.RELEASE\">\n   "
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_aop_1_3_6_RELEASE.xml",
    "chars": 708,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.springframework.boot:spring-boot-starter-aop:1.3.6.RELEASE\">"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_jdbc_1_3_6_RELEASE.xml",
    "chars": 715,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.springframework.boot:spring-boot-starter-jdbc:1.3.6.RELEASE\""
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_1_3_6_RELEASE.xml",
    "chars": 736,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.springframework.boot:spring-boot-starter-logging:1.3.6.RELEA"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_test_1_3_6_RELEASE.xml",
    "chars": 715,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.springframework.boot:spring-boot-starter-test:1.3.6.RELEASE\""
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_tomcat_1_3_6_RELEASE.xml",
    "chars": 729,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.springframework.boot:spring-boot-starter-tomcat:1.3.6.RELEAS"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_validation_1_3_6_RELEASE.xml",
    "chars": 757,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.springframework.boot:spring-boot-starter-validation:1.3.6.RE"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_velocity_1_3_6_RELEASE.xml",
    "chars": 743,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.springframework.boot:spring-boot-starter-velocity:1.3.6.RELE"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_web_1_3_6_RELEASE.xml",
    "chars": 708,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.springframework.boot:spring-boot-starter-web:1.3.6.RELEASE\">"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_springframework_spring_aop_4_2_7_RELEASE.xml",
    "chars": 597,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.springframework:spring-aop:4.2.7.RELEASE\">\n    <CLASSES>\n   "
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_springframework_spring_beans_4_2_7_RELEASE.xml",
    "chars": 611,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.springframework:spring-beans:4.2.7.RELEASE\">\n    <CLASSES>\n "
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_springframework_spring_context_4_2_7_RELEASE.xml",
    "chars": 625,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.springframework:spring-context:4.2.7.RELEASE\">\n    <CLASSES>"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_springframework_spring_context_support_4_2_7_RELEASE.xml",
    "chars": 681,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.springframework:spring-context-support:4.2.7.RELEASE\">\n    <"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_springframework_spring_core_4_2_7_RELEASE.xml",
    "chars": 604,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.springframework:spring-core:4.2.7.RELEASE\">\n    <CLASSES>\n  "
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_springframework_spring_expression_4_2_7_RELEASE.xml",
    "chars": 646,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.springframework:spring-expression:4.2.7.RELEASE\">\n    <CLASS"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_springframework_spring_jdbc_4_2_7_RELEASE.xml",
    "chars": 604,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.springframework:spring-jdbc:4.2.7.RELEASE\">\n    <CLASSES>\n  "
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_springframework_spring_test_4_2_7_RELEASE.xml",
    "chars": 604,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.springframework:spring-test:4.2.7.RELEASE\">\n    <CLASSES>\n  "
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_springframework_spring_tx_4_2_7_RELEASE.xml",
    "chars": 590,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.springframework:spring-tx:4.2.7.RELEASE\">\n    <CLASSES>\n    "
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_springframework_spring_web_4_2_7_RELEASE.xml",
    "chars": 597,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.springframework:spring-web:4.2.7.RELEASE\">\n    <CLASSES>\n   "
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_springframework_spring_webmvc_4_2_7_RELEASE.xml",
    "chars": 618,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.springframework:spring-webmvc:4.2.7.RELEASE\">\n    <CLASSES>\n"
  },
  {
    "path": "wenda/.idea/libraries/Maven__org_yaml_snakeyaml_1_16.xml",
    "chars": 483,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: org.yaml:snakeyaml:1.16\">\n    <CLASSES>\n      <root url=\"jar://$"
  },
  {
    "path": "wenda/.idea/libraries/Maven__oro_oro_2_0_8.xml",
    "chars": 428,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: oro:oro:2.0.8\">\n    <CLASSES>\n      <root url=\"jar://$MAVEN_REPO"
  },
  {
    "path": "wenda/.idea/libraries/Maven__redis_clients_jedis_2_9_0.xml",
    "chars": 482,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: redis.clients:jedis:2.9.0\">\n    <CLASSES>\n      <root url=\"jar:/"
  },
  {
    "path": "wenda/.idea/libraries/Maven__sslext_sslext_1_2_0.xml",
    "chars": 461,
    "preview": "<component name=\"libraryTable\">\n  <library name=\"Maven: sslext:sslext:1.2-0\">\n    <CLASSES>\n      <root url=\"jar://$MAVE"
  },
  {
    "path": "wenda/.idea/misc.xml",
    "chars": 443,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"MavenProjectsManager\">\n    <option name="
  },
  {
    "path": "wenda/.idea/modules.xml",
    "chars": 250,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n   "
  },
  {
    "path": "wenda/.idea/workspace.xml",
    "chars": 52443,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ChangeListManager\">\n    <list default=\"t"
  },
  {
    "path": "wenda/.mvn/wrapper/maven-wrapper.properties",
    "chars": 110,
    "preview": "distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.zip\n"
  },
  {
    "path": "wenda/mvnw",
    "chars": 7058,
    "preview": "#!/bin/sh\n# ----------------------------------------------------------------------------\n# Licensed to the Apache Softwa"
  },
  {
    "path": "wenda/mvnw.cmd",
    "chars": 5006,
    "preview": "@REM ----------------------------------------------------------------------------\n@REM Licensed to the Apache Software F"
  },
  {
    "path": "wenda/pom.xml",
    "chars": 2978,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "wenda/pyspider/conf.json",
    "chars": 140,
    "preview": "{\n\t\"message_queue\":\"redis://127.0.0.1:6379/0\",\n\t\"webui\":{\n\t\t\"port\":5001,\n\t\t\"need-auth\":true,\n\t\t\"username\":\"root\",\n\t\t\"pas"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/WendaApplication.java",
    "chars": 334,
    "preview": "package com.nowcoder;\n\nimport com.nowcoder.model.User;\nimport org.springframework.boot.SpringApplication;\nimport org.spr"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/aspect/LogAspect.java",
    "chars": 960,
    "preview": "package com.nowcoder.aspect;\n\nimport org.aspectj.lang.JoinPoint;\nimport org.aspectj.lang.annotation.After;\nimport org.as"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/async/EventConsumer.java",
    "chars": 2708,
    "preview": "package com.nowcoder.async;\n\nimport com.alibaba.fastjson.JSON;\nimport com.nowcoder.util.JedisAdapter;\nimport com.nowcode"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/async/EventHandler.java",
    "chars": 169,
    "preview": "package com.nowcoder.async;\n\nimport java.util.List;\n\npublic interface EventHandler {\n    void doHandler(EventModel model"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/async/EventModel.java",
    "chars": 1681,
    "preview": "package com.nowcoder.async;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic class EventModel {\n    private Even"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/async/EventProducer.java",
    "chars": 677,
    "preview": "package com.nowcoder.async;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.nowcoder.util.JedisAdapter;\nimport com.n"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/async/EventType.java",
    "chars": 287,
    "preview": "package com.nowcoder.async;\n\npublic enum  EventType {\n    LIKE(0),\n    COMMENT(1),\n    LOGIN(2),\n    MAIL(3),\n    FOLLOW"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/async/handler/FeedHandler.java",
    "chars": 2799,
    "preview": "package com.nowcoder.async.handler;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.nowcoder.async.EventHandler;\nimp"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/async/handler/FollowHandler.java",
    "chars": 1629,
    "preview": "package com.nowcoder.async.handler;\n\nimport com.nowcoder.async.EventHandler;\nimport com.nowcoder.async.EventModel;\nimpor"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/async/handler/LikeHandler.java",
    "chars": 1310,
    "preview": "package com.nowcoder.async.handler;\n\nimport com.nowcoder.async.EventHandler;\nimport com.nowcoder.async.EventModel;\nimpor"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/async/handler/LoginExceptionHandler.java",
    "chars": 934,
    "preview": "package com.nowcoder.async.handler;\n\nimport com.nowcoder.async.EventHandler;\nimport com.nowcoder.async.EventModel;\nimpor"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/configuration/WendaWebConfiguration.java",
    "chars": 922,
    "preview": "package com.nowcoder.configuration;\n\nimport com.nowcoder.interceptor.LoginRequredInterceptor;\nimport com.nowcoder.interc"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/controller/CommentController.java",
    "chars": 2054,
    "preview": "package com.nowcoder.controller;\n\nimport com.nowcoder.model.Comment;\nimport com.nowcoder.model.EntityType;\nimport com.no"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/controller/FeedController.java",
    "chars": 2090,
    "preview": "package com.nowcoder.controller;\n\nimport com.nowcoder.model.EntityType;\nimport com.nowcoder.model.Feed;\nimport com.nowco"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/controller/FollowController.java",
    "chars": 7383,
    "preview": "package com.nowcoder.controller;\n\nimport com.nowcoder.async.EventModel;\nimport com.nowcoder.async.EventProducer;\nimport "
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/controller/HomeController.java",
    "chars": 2973,
    "preview": "package com.nowcoder.controller;\n\nimport com.nowcoder.model.*;\nimport com.nowcoder.service.CommentService;\nimport com.no"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/controller/IndexController.java",
    "chars": 4245,
    "preview": "package com.nowcoder.controller;\n\nimport com.nowcoder.model.User;\nimport com.nowcoder.service.WendaService;\nimport org.s"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/controller/LikeController.java",
    "chars": 2406,
    "preview": "package com.nowcoder.controller;\n\nimport com.nowcoder.async.EventModel;\nimport com.nowcoder.async.EventProducer;\nimport "
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/controller/LoginController.java",
    "chars": 4042,
    "preview": "package com.nowcoder.controller;\n\nimport com.nowcoder.async.EventProducer;\nimport com.nowcoder.service.UserService;\nimpo"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/controller/MessageController.java",
    "chars": 4066,
    "preview": "package com.nowcoder.controller;\n\nimport com.nowcoder.model.HostHolder;\nimport com.nowcoder.model.Message;\nimport com.no"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/controller/QuestionController.java",
    "chars": 3920,
    "preview": "package com.nowcoder.controller;\n\nimport com.nowcoder.model.*;\nimport com.nowcoder.service.*;\nimport com.nowcoder.util.W"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/controller/SettingController.java",
    "chars": 719,
    "preview": "package com.nowcoder.controller;\n\nimport com.nowcoder.service.WendaService;\nimport org.springframework.beans.factory.ann"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/dao/CommentDAO.java",
    "chars": 1512,
    "preview": "package com.nowcoder.dao;\n\nimport com.nowcoder.model.Comment;\nimport org.apache.ibatis.annotations.*;\nimport org.springf"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/dao/FeedDAO.java",
    "chars": 970,
    "preview": "package com.nowcoder.dao;\n\nimport com.nowcoder.model.Feed;\nimport org.apache.ibatis.annotations.Insert;\nimport org.apach"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/dao/LoginTicketDAO.java",
    "chars": 844,
    "preview": "package com.nowcoder.dao;\n\nimport com.nowcoder.model.LoginTicket;\nimport org.apache.ibatis.annotations.*;\nimport org.spr"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/dao/MessageDAO.java",
    "chars": 1905,
    "preview": "package com.nowcoder.dao;\n\nimport com.nowcoder.model.Message;\nimport org.apache.ibatis.annotations.*;\nimport org.springf"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/dao/QuestionDAO.java",
    "chars": 1055,
    "preview": "package com.nowcoder.dao;\n\nimport com.nowcoder.model.Question;\nimport org.apache.ibatis.annotations.*;\nimport org.spring"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/dao/UserDAO.java",
    "chars": 963,
    "preview": "package com.nowcoder.dao;\n\nimport com.nowcoder.model.User;\nimport org.apache.ibatis.annotations.*;\nimport org.springfram"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/interceptor/LoginRequredInterceptor.java",
    "chars": 1213,
    "preview": "package com.nowcoder.interceptor;\n\nimport com.nowcoder.model.HostHolder;\nimport org.springframework.beans.factory.annota"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/interceptor/PassportInterceptor.java",
    "chars": 2188,
    "preview": "package com.nowcoder.interceptor;\n\nimport com.nowcoder.dao.LoginTicketDAO;\nimport com.nowcoder.dao.UserDAO;\nimport com.n"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/model/Comment.java",
    "chars": 1266,
    "preview": "package com.nowcoder.model;\n\nimport java.util.Date;\n\npublic class Comment {\n    private int id;\n    private int userId;\n"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/model/EntityType.java",
    "chars": 181,
    "preview": "package com.nowcoder.model;\n\npublic class EntityType {\n    public static int ENTITY_QUESTION = 1;\n    public static int "
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/model/Feed.java",
    "chars": 1105,
    "preview": "package com.nowcoder.model;\n\nimport com.alibaba.fastjson.JSONObject;\n\nimport java.util.Date;\n\npublic class Feed {\n    pr"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/model/HostHolder.java",
    "chars": 392,
    "preview": "package com.nowcoder.model;\n\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class HostHolder {\n    "
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/model/LoginTicket.java",
    "chars": 873,
    "preview": "package com.nowcoder.model;\n\nimport java.util.Date;\n\npublic class LoginTicket {\n    private int id;\n    private int user"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/model/Message.java",
    "chars": 1421,
    "preview": "package com.nowcoder.model;\n\nimport java.util.Date;\n\npublic class Message {\n    private int id;\n    private int fromId;\n"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/model/Question.java",
    "chars": 1109,
    "preview": "package com.nowcoder.model;\n\nimport java.util.Date;\n\npublic class Question {\n    private int id;\n    private String titl"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/model/User.java",
    "chars": 1022,
    "preview": "package com.nowcoder.model;\n\npublic class User {\n    private int id;\n    private String name;\n    private String passwor"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/model/ViewObject.java",
    "chars": 333,
    "preview": "package com.nowcoder.model;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic class ViewObject {\n    private Map<"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/service/CommentService.java",
    "chars": 1452,
    "preview": "package com.nowcoder.service;\n\nimport com.nowcoder.dao.CommentDAO;\nimport com.nowcoder.model.Comment;\nimport org.slf4j.L"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/service/FeedService.java",
    "chars": 650,
    "preview": "package com.nowcoder.service;\n\nimport com.nowcoder.dao.FeedDAO;\nimport com.nowcoder.model.Feed;\nimport org.springframewo"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/service/FollowService.java",
    "chars": 3632,
    "preview": "package com.nowcoder.service;\n\nimport com.nowcoder.util.JedisAdapter;\nimport com.nowcoder.util.RedisKeyUtil;\nimport org."
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/service/LikeService.java",
    "chars": 1691,
    "preview": "package com.nowcoder.service;\n\nimport com.nowcoder.util.JedisAdapter;\nimport com.nowcoder.util.RedisKeyUtil;\nimport org."
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/service/LoginTicketService.java",
    "chars": 125,
    "preview": "package com.nowcoder.service;\n\nimport org.springframework.stereotype.Service;\n\n@Service\npublic class LoginTicketService "
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/service/MessageService.java",
    "chars": 1316,
    "preview": "package com.nowcoder.service;\n\nimport com.nowcoder.dao.MessageDAO;\nimport com.nowcoder.model.Message;\nimport org.slf4j.L"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/service/QuestionService.java",
    "chars": 1262,
    "preview": "package com.nowcoder.service;\n\nimport com.nowcoder.dao.QuestionDAO;\nimport com.nowcoder.model.Question;\nimport org.sprin"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/service/SensitiveService.java",
    "chars": 4110,
    "preview": "package com.nowcoder.service;\n\nimport org.apache.commons.lang.CharUtils;\nimport org.apache.commons.lang.StringUtils;\nimp"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/service/UserService.java",
    "chars": 3267,
    "preview": "package com.nowcoder.service;\n\nimport com.nowcoder.dao.LoginTicketDAO;\nimport com.nowcoder.dao.UserDAO;\nimport com.nowco"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/service/WendaService.java",
    "chars": 225,
    "preview": "package com.nowcoder.service;\n\nimport org.springframework.stereotype.Service;\n\n@Service\npublic class WendaService {\n    "
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/util/JedisAdapter.java",
    "chars": 6957,
    "preview": "package com.nowcoder.util;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.fa"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/util/MailSender.java",
    "chars": 2635,
    "preview": "package com.nowcoder.util;\n\nimport org.apache.velocity.app.VelocityEngine;\nimport org.slf4j.Logger;\nimport org.slf4j.Log"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/util/RedisKeyUtil.java",
    "chars": 1344,
    "preview": "package com.nowcoder.util;\n\npublic class RedisKeyUtil {\n    private static String SPLIT = \":\";\n    private static String"
  },
  {
    "path": "wenda/src/main/java/com/nowcoder/util/WendaUtil.java",
    "chars": 1064,
    "preview": "package com.nowcoder.util;\n\nimport com.alibaba.fastjson.JSONObject;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFact"
  },
  {
    "path": "wenda/src/main/resources/SensitiveWords.txt",
    "chars": 8,
    "preview": "嫖娼\n赌博\n色情"
  },
  {
    "path": "wenda/src/main/resources/application.properties",
    "chars": 387,
    "preview": "spring.velocity.suffix=.html\nspring.datasource.url=jdbc:mysql://localhost:3306/wenda?useUnicode=true&characterEncoding=u"
  },
  {
    "path": "wenda/src/main/resources/com/nowcoder/dao/FeedDAO.xml",
    "chars": 836,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://myb"
  },
  {
    "path": "wenda/src/main/resources/com/nowcoder/dao/QuestionDAO.xml",
    "chars": 684,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://myb"
  },
  {
    "path": "wenda/src/main/resources/mybatis-config.xml",
    "chars": 1065,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE configuration\n        PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\"\n     "
  },
  {
    "path": "wenda/src/main/resources/static/scripts/base.fb262f0e.js",
    "chars": 206626,
    "preview": "PLOVR_MODULE_INFO={\"page-index\":[\"common\"],\"common\":[\"base\"],\"page-settings\":[\"common\"],\"page-main\":[\"common\"],\"page-pro"
  },
  {
    "path": "wenda/src/main/resources/static/scripts/common.fed5411f.js",
    "chars": 415626,
    "preview": "(function(z){\nvar xn=function(a){a=a.tabIndex;return z.qa(a)&&0<=a&&32768>a};var yn=function(a){a=a.getAttributeNode(\"ta"
  },
  {
    "path": "wenda/src/main/resources/static/scripts/ga.js",
    "chars": 43082,
    "preview": "(function(){var E;function Aa(a,b){switch(b){case 0:return\"\"+a;case 1:return 1*a;case 2:return!!a;case 3:return 1E3*a}re"
  },
  {
    "path": "wenda/src/main/resources/static/scripts/instant.e7a17de6.js",
    "chars": 6475,
    "preview": "!function(){var a=document.cookie.match(/actioncontinuationhash=([^;]+)/),b=a&&a[1];b&&(location.hash=decodeURIComponent"
  },
  {
    "path": "wenda/src/main/resources/static/scripts/main/base/base.js",
    "chars": 7149,
    "preview": "(function (window, undefined) {\n    var Base = window.Base = fCreateClass('main.base.Base');\n    $.extend(Base, {\n      "
  },
  {
    "path": "wenda/src/main/resources/static/scripts/main/base/event.js",
    "chars": 1492,
    "preview": "(function (window, undefined) {\n    var Event = Base.createClass('main.base.Event');\n    $.extend(Event, {\n        on: f"
  },
  {
    "path": "wenda/src/main/resources/static/scripts/main/base/util.js",
    "chars": 328,
    "preview": "(function (window, undefined) {\n    var Util = Base.createClass('main.base.Util');\n    $.extend(Util, {\n        isEmail:"
  },
  {
    "path": "wenda/src/main/resources/static/scripts/main/component/component.js",
    "chars": 5059,
    "preview": "(function (window, undefined) {\n    var Component = Base.createClass('main.component.Component');\n    var Event = Base.g"
  },
  {
    "path": "wenda/src/main/resources/static/scripts/main/component/popup.js",
    "chars": 6070,
    "preview": "/**\nvar oPopup = new Popup({\n   title: String, 标题\n   content: String, 内容\n   width: Number, 宽度\n   close: Function, 关闭的回调\n"
  },
  {
    "path": "wenda/src/main/resources/static/scripts/main/component/popupAdd.js",
    "chars": 4489,
    "preview": "/**\nvar oPopupAdd = new PopupAdd({\n    data: 初始数据\n    ok: Function, 发布成功后的回调\n});\n */\n(function (window) {\n    var PopupA"
  },
  {
    "path": "wenda/src/main/resources/static/scripts/main/component/popupMsg.js",
    "chars": 4840,
    "preview": "/**\nvar oPopupAdd = new PopupAdd({\n    data: 初始数据\n        toName: String, 姓名\n        content: String, 内容\n});\n */\n(functi"
  },
  {
    "path": "wenda/src/main/resources/static/scripts/main/jquery.js",
    "chars": 263268,
    "preview": "/*!\n * jQuery JavaScript Library v3.0.0\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * C"
  },
  {
    "path": "wenda/src/main/resources/static/scripts/main/site/detail.js",
    "chars": 1858,
    "preview": "(function (window, undefined) {\n    var Action = Base.getClass('main.util.Action');\n    var Business = Base.getClass('ma"
  },
  {
    "path": "wenda/src/main/resources/static/scripts/main/site/follow.js",
    "chars": 218,
    "preview": "(function (window, undefined) {\n    var Business = Base.getClass('main.util.Business');\n\n    Base.ready({\n        initia"
  },
  {
    "path": "wenda/src/main/resources/static/scripts/main/site/home.js",
    "chars": 826,
    "preview": "(function (window, undefined) {\n    var PopupAdd = Base.getClass('main.component.PopupAdd');\n    var PopupMsg = Base.get"
  },
  {
    "path": "wenda/src/main/resources/static/scripts/main/site/profile.js",
    "chars": 218,
    "preview": "(function (window, undefined) {\n    var Business = Base.getClass('main.util.Business');\n\n    Base.ready({\n        initia"
  },
  {
    "path": "wenda/src/main/resources/static/scripts/main/util/action.js",
    "chars": 4430,
    "preview": "(function (window, undefined) {\n    var Action = Base.createClass('main.util.Action');\n    $.extend(Action, {\n        li"
  },
  {
    "path": "wenda/src/main/resources/static/scripts/main/util/business.js",
    "chars": 3306,
    "preview": "(function (window, undefined) {\n    var Business = Base.createClass('main.util.Business');\n    var Action = Base.getClas"
  },
  {
    "path": "wenda/src/main/resources/static/scripts/page-index.d7b54ac7.js",
    "chars": 8463,
    "preview": "(function(z){\nvar bS=function(){z.R.call(this)};var cS=function(){(0,window.$)(\"body\").on(\"click\",\".org-tip a\",function("
  },
  {
    "path": "wenda/src/main/resources/static/scripts/page-main.5d4c554d.js",
    "chars": 122557,
    "preview": "(function(z){\nvar DL=function(a){if(a.kq){var b=(0,window.$)(a.kq);b.stop().text(\"草稿已经保存\").fadeTo(600,.5).delay(3E3).fad"
  },
  {
    "path": "wenda/src/main/resources/static/scripts/richtexteditor.aa0a4005.js",
    "chars": 74355,
    "preview": "(function(z){\nvar vI=function(a){if(z.C&&!(9<=z.Tg)){var b=!1;try{b=a.parentNode}catch(c){}return!!b}return z.lf(a.owner"
  },
  {
    "path": "wenda/src/main/resources/static/scripts/vendor.ff76fbae.js",
    "chars": 189677,
    "preview": "!function(a,b){function c(){var a=d();a&&i(f(),function(b){a===b.getAttribute(\"znonce\")&&g(h(b))})}function d(){var a=b."
  },
  {
    "path": "wenda/src/main/resources/static/styles/detail.css",
    "chars": 305937,
    "preview": "@-webkit-keyframes fadeIn {\n    from {\n    opacity:0;\n    -ms-filter:\"alpha(Opacity=0)\"\n}\nto {\n    opacity:1;\n    -ms-fi"
  },
  {
    "path": "wenda/src/main/resources/static/styles/index.css",
    "chars": 318811,
    "preview": "@-webkit-keyframes fadeIn {\n    from {\n        opacity: 0;\n        -ms-filter: \"alpha(Opacity=0)\"\n    }\n\n    to {\n      "
  },
  {
    "path": "wenda/src/main/resources/static/styles/letter.css",
    "chars": 439691,
    "preview": "/*\n\n*/\n\n\nhtml {\n  background-color: #f0f3f4;\n}\n\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  "
  },
  {
    "path": "wenda/src/main/resources/static/styles/login.css",
    "chars": 64834,
    "preview": "body,ul,ol,li,p,h1,h2,h3,h4,h5 {\n    margin: 0;\n    padding: 0\n}\n\nbutton,input,select,textarea {\n    margin: 0;\n    font"
  },
  {
    "path": "wenda/src/main/resources/static/styles/result.css",
    "chars": 309741,
    "preview": "@-webkit-keyframes fadeIn {\n    from {\n    opacity:0;\n    -ms-filter:\"alpha(Opacity=0)\"\n}\nto {\n    opacity:1;\n    -ms-fi"
  },
  {
    "path": "wenda/src/main/resources/templates/detail.html",
    "chars": 8195,
    "preview": "#parse(\"header.html\")\n<link rel=\"stylesheet\" href=\"../styles/detail.css\">\n<div class=\"zg-wrap zu-main clearfix with-inde"
  },
  {
    "path": "wenda/src/main/resources/templates/error.html",
    "chars": 181,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>error page</title>\n</head>\n<body>\n        "
  },
  {
    "path": "wenda/src/main/resources/templates/feeds.html",
    "chars": 9072,
    "preview": "#parse(\"header.html\")\n\n#macro (comment_question, $vo)\n<div class=\"feed-item folding feed-item-hook feed-item-2\n         "
  },
  {
    "path": "wenda/src/main/resources/templates/followees.html",
    "chars": 3334,
    "preview": "#parse(\"header.html\")\n<link rel=\"stylesheet\" href=\"../../styles/result.css\">\n<link rel=\"stylesheet\" href=\"../../styles/d"
  },
  {
    "path": "wenda/src/main/resources/templates/followers.html",
    "chars": 3311,
    "preview": "#parse(\"header.html\")\n<link rel=\"stylesheet\" href=\"../../styles/result.css\">\n<link rel=\"stylesheet\" href=\"../../styles/d"
  },
  {
    "path": "wenda/src/main/resources/templates/footer.html",
    "chars": 866,
    "preview": "\n\n<script type=\"text/javascript\" src=\"/scripts/main/jquery.js\"></script>\n<script type=\"text/javascript\" src=\"/scripts/ma"
  },
  {
    "path": "wenda/src/main/resources/templates/header.html",
    "chars": 10520,
    "preview": "<!DOCTYPE html>\n<!-- saved from url=(0029)#signin -->\n<html lang=\"zh-CN\" dropeffect=\"none\" class=\"js is-AppPromotionBarV"
  },
  {
    "path": "wenda/src/main/resources/templates/home.html",
    "chars": 998,
    "preview": "<html>\n<body>\n<pre>\n    #*\n    你看不到我~~~~\n    *#\n    $!{value1}\n    $!{value2} ## 如果不存在,强制为空\n    ${value3}\n\n    colors: $"
  },
  {
    "path": "wenda/src/main/resources/templates/index.html",
    "chars": 6137,
    "preview": "#parse(\"header.html\")\n<link rel=\"stylesheet\" href=\"../styles/index.css\">\n<link rel=\"stylesheet\" href=\"../styles/detail.c"
  },
  {
    "path": "wenda/src/main/resources/templates/js.html",
    "chars": 852,
    "preview": "\n<script type=\"text/javascript\" src=\"/scripts/main/jquery.js\"></script>\n<script type=\"text/javascript\" src=\"/scripts/mai"
  },
  {
    "path": "wenda/src/main/resources/templates/letter.html",
    "chars": 1896,
    "preview": "#parse(\"header.html\")\n<link rel=\"stylesheet\" media=\"all\" href=\"../styles/letter.css\">\n    <div id=\"main\">\n        <div c"
  },
  {
    "path": "wenda/src/main/resources/templates/letterDetail.html",
    "chars": 1218,
    "preview": "#parse(\"header.html\")\n<link rel=\"stylesheet\" media=\"all\" href=\"../styles/letter.css\">\n<div id=\"main\">\n    <div class=\"zg"
  },
  {
    "path": "wenda/src/main/resources/templates/login.html",
    "chars": 2784,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\"\n      class=\"is-AppPromotionBarVisible cssanimations csstransforms csstransitions fle"
  },
  {
    "path": "wenda/src/main/resources/templates/mails/login_exception.html",
    "chars": 21,
    "preview": "你好$username,你的登陆有问题!\n"
  },
  {
    "path": "wenda/src/main/resources/templates/profile.html",
    "chars": 8528,
    "preview": "#parse(\"header.html\")\n<link rel=\"stylesheet\" href=\"../styles/index.css\">\n<link rel=\"stylesheet\" href=\"../styles/detail.c"
  },
  {
    "path": "wenda/src/main/resources/templates/result.html",
    "chars": 2119,
    "preview": "#set($bodyclass = \"page-search\")\n#parse(\"header.html\")\n<link rel=\"stylesheet\" href=\"../styles/result.css\">\n<link rel=\"st"
  },
  {
    "path": "wenda/src/main/resources/toolbox.xml",
    "chars": 168,
    "preview": "<toolbox>\n    <tool>\n        <key>date</key>\n        <scope>application</scope>\n        <class>org.apache.velocity.tools"
  },
  {
    "path": "wenda/src/test/java/com/nowcoder/InitDatabaseTests.java",
    "chars": 1948,
    "preview": "package com.nowcoder;\n\nimport com.nowcoder.dao.QuestionDAO;\nimport com.nowcoder.dao.UserDAO;\nimport com.nowcoder.model.E"
  },
  {
    "path": "wenda/src/test/java/com/nowcoder/ThreadTest.java",
    "chars": 3401,
    "preview": "package com.nowcoder;\n\nimport java.util.concurrent.ArrayBlockingQueue;\nimport java.util.concurrent.BlockingQueue;\nimport"
  },
  {
    "path": "wenda/src/test/java/com/nowcoder/WendaApplicationTests.java",
    "chars": 494,
    "preview": "package com.nowcoder;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.Spri"
  },
  {
    "path": "wenda/src/test/resources/init-schema.sql",
    "chars": 698,
    "preview": "DROP TABLE IF EXISTS `question`;\nCREATE TABLE `question` (\n  `id` INT NOT NULL AUTO_INCREMENT,\n  `title` VARCHAR(255) NO"
  },
  {
    "path": "wenda/target/classes/SensitiveWords.txt",
    "chars": 8,
    "preview": "嫖娼\n赌博\n色情"
  },
  {
    "path": "wenda/target/classes/application.properties",
    "chars": 387,
    "preview": "spring.velocity.suffix=.html\nspring.datasource.url=jdbc:mysql://localhost:3306/wenda?useUnicode=true&characterEncoding=u"
  },
  {
    "path": "wenda/target/classes/com/nowcoder/dao/FeedDAO.xml",
    "chars": 836,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://myb"
  },
  {
    "path": "wenda/target/classes/com/nowcoder/dao/QuestionDAO.xml",
    "chars": 684,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://myb"
  },
  {
    "path": "wenda/target/classes/mybatis-config.xml",
    "chars": 1065,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE configuration\n        PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\"\n     "
  },
  {
    "path": "wenda/target/classes/static/scripts/base.fb262f0e.js",
    "chars": 206626,
    "preview": "PLOVR_MODULE_INFO={\"page-index\":[\"common\"],\"common\":[\"base\"],\"page-settings\":[\"common\"],\"page-main\":[\"common\"],\"page-pro"
  }
]

// ... and 50 more files (download for full content)

About this extraction

This page contains the full source code of the hzcforever/nowcoder-project GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 250 files (5.7 MB), approximately 1.5M tokens, and a symbol index with 1046 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!