├── data ├── zutki_likes.sql ├── zutki_papers.sql └── zutki_users.sql ├── src ├── dao │ ├── LikeDao.java │ ├── PaperDao.java │ └── UserDao.java ├── entity │ ├── Like.java │ ├── Paper.java │ └── User.java ├── servlet │ ├── IndexServlet.java │ ├── LoginServlet.java │ ├── LogoutServlet.java │ ├── PaperServlet.java │ ├── RegistServlet.java │ └── SearchServlet.java └── util │ ├── BaseDao.java │ └── ItemSimilarity.java ├── web ├── WEB-INF │ ├── lib │ │ ├── jstl-1.2.jar │ │ ├── mysql-connector-java-8.0.13.jar │ │ └── standard-1.1.2.jar │ └── web.xml ├── htmls │ ├── classify.jsp │ ├── img │ │ └── htmls │ │ │ ├── button.png │ │ │ ├── button1.jpg │ │ │ ├── header.png │ │ │ ├── mark.png │ │ │ ├── paper.jpg │ │ │ ├── pic-1.jpg │ │ │ ├── pic-2.jpg │ │ │ ├── pic-3.jpg │ │ │ ├── sjd.jpg │ │ │ └── user.png │ ├── index.jsp │ ├── login.jsp │ ├── paper.jsp │ └── register.jsp └── thtml │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.jpg │ ├── 5.jpg │ ├── button.png │ ├── classify.jsp │ ├── header.png │ ├── index.jsp │ ├── login.jsp │ ├── mark.png │ ├── paper.jsp │ ├── regist.jsp │ ├── sjd.jpg │ └── user.png └── zutki.iml /data/zutki_likes.sql: -------------------------------------------------------------------------------- 1 | -- MySQL dump 10.13 Distrib 8.0.12, for Win64 (x86_64) 2 | -- 3 | -- Host: localhost Database: zutki 4 | -- ------------------------------------------------------ 5 | -- Server version 8.0.12 6 | 7 | /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; 8 | /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; 9 | /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; 10 | SET NAMES utf8 ; 11 | /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; 12 | /*!40103 SET TIME_ZONE='+00:00' */; 13 | /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; 14 | /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; 15 | /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; 16 | /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; 17 | 18 | -- 19 | -- Table structure for table `likes` 20 | -- 21 | 22 | DROP TABLE IF EXISTS `likes`; 23 | /*!40101 SET @saved_cs_client = @@character_set_client */; 24 | SET character_set_client = utf8mb4 ; 25 | CREATE TABLE `likes` ( 26 | `lid` int(11) NOT NULL AUTO_INCREMENT COMMENT '喜欢id', 27 | `uid` int(11) NOT NULL COMMENT '用户id', 28 | `pid` int(11) NOT NULL COMMENT '论文id', 29 | PRIMARY KEY (`lid`) 30 | ) ENGINE=InnoDB AUTO_INCREMENT=50 DEFAULT CHARSET=utf8 COMMENT='喜欢项的表(推荐相关)'; 31 | /*!40101 SET character_set_client = @saved_cs_client */; 32 | 33 | -- 34 | -- Dumping data for table `likes` 35 | -- 36 | 37 | LOCK TABLES `likes` WRITE; 38 | /*!40000 ALTER TABLE `likes` DISABLE KEYS */; 39 | INSERT INTO `likes` VALUES (1,2,1),(2,2,2),(3,1,2),(4,1,1),(18,1,3),(19,1,4),(20,1,7),(21,2,4),(22,2,6),(23,2,7),(24,3,3),(25,3,6),(26,3,1),(27,5,7),(28,5,2),(29,6,1),(30,6,3),(31,6,2),(32,5,1),(33,5,1),(34,5,1),(35,5,1),(36,1,1),(37,5,1),(38,5,2),(39,5,5),(40,5,8),(41,5,2),(42,1,2),(43,1,4),(44,1,4),(45,5,1),(46,4,2),(47,4,3),(48,4,7),(49,1,4); 40 | /*!40000 ALTER TABLE `likes` ENABLE KEYS */; 41 | UNLOCK TABLES; 42 | /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; 43 | 44 | /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; 45 | /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; 46 | /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; 47 | /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; 48 | /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; 49 | /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; 50 | /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; 51 | 52 | -- Dump completed on 2019-06-21 13:44:00 53 | -------------------------------------------------------------------------------- /data/zutki_papers.sql: -------------------------------------------------------------------------------- 1 | -- MySQL dump 10.13 Distrib 8.0.12, for Win64 (x86_64) 2 | -- 3 | -- Host: localhost Database: zutki 4 | -- ------------------------------------------------------ 5 | -- Server version 8.0.12 6 | 7 | /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; 8 | /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; 9 | /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; 10 | SET NAMES utf8 ; 11 | /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; 12 | /*!40103 SET TIME_ZONE='+00:00' */; 13 | /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; 14 | /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; 15 | /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; 16 | /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; 17 | 18 | -- 19 | -- Table structure for table `papers` 20 | -- 21 | 22 | DROP TABLE IF EXISTS `papers`; 23 | /*!40101 SET @saved_cs_client = @@character_set_client */; 24 | SET character_set_client = utf8mb4 ; 25 | CREATE TABLE `papers` ( 26 | `pid` int(11) NOT NULL AUTO_INCREMENT, 27 | `author` varchar(500) DEFAULT 'unknown' COMMENT '作者', 28 | `place` varchar(500) DEFAULT 'unknown' COMMENT '发表机构', 29 | `title` varchar(500) DEFAULT 'unknown' COMMENT '论文题目', 30 | `digest` varchar(1000) DEFAULT 'unknown' COMMENT '摘要', 31 | `source` varchar(100) DEFAULT 'unknown' COMMENT '来源', 32 | `likeCnt` int(11) DEFAULT '0' COMMENT '喜欢该论文人数', 33 | `downCnt` int(11) DEFAULT '0' COMMENT '该论文下载人数', 34 | `date` date DEFAULT NULL COMMENT '发表日期', 35 | PRIMARY KEY (`pid`) 36 | ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='论文表'; 37 | /*!40101 SET character_set_client = @saved_cs_client */; 38 | 39 | -- 40 | -- Dumping data for table `papers` 41 | -- 42 | 43 | LOCK TABLES `papers` WRITE; 44 | /*!40000 ALTER TABLE `papers` DISABLE KEYS */; 45 | INSERT INTO `papers` VALUES (1,'Truong Khang Nguyen;','unknown','Investigation of a computer CPU','Abstract(#br)In the present study, the thermal performance of an air-cooled, flat-plate heat sink in forced convection was performed using a three-dimension','Elsevierjournal',61,153,'2019-05-04'),(2,'络首发 陈林林; 韩可; 李伟; 吴嘉树; 辛嘉英','unknown','铬天青S法结合高效液相色谱法测定甲烷氧化菌素含量 网络首发','unknown','食品工业科技',29,12,'2019-03-07'),(3,'薛硕;董曼;张璐璐;尹凯静;王琳','unknown','β-环糊精与香芹酮形成常数的测定及其包合物的制备及表征 网络首发','unknown','食品与发酵工业',0,0,'2019-02-11'),(4,' Investigation of a computer CPU heat sink under laminar forced convection using a structural ','unknown',' Investigation of a computer CPU heat sink under laminar forced convection using a structural ','unknown','International Journal of Heat and Mass ',3,0,'2019-05-04'),(5,'何玲, 黎加厚','unknown','促进学生深度学习','正深度学习的提出早在20 世纪50 年代中期, 在瑞典工作的两位美国学者FerenceMarton ','计算机教与学. 现代教学',25,41,'2019-05-04'),(6,' 马湧; 王晓鹏; 马莎莎','unknown',' 基于Keras深度学习框架下BP神经网络的热轧带钢力学性能预测','unknown',' 冶金自动化',12,31,'2019-05-04'),(7,' 齐孟雷','unknown','基于云班课的《数控加工技术》混合式学习研究','unknown',' 山东工业技术',0,0,'2019-03-08'),(8,'滕爱杰','unknown',' 基于微信的混合式学习模式在独立院校英语教学中的应','unknown',' 黑龙江教育学院学报 ',23,13,'2019-03-08'); 46 | /*!40000 ALTER TABLE `papers` ENABLE KEYS */; 47 | UNLOCK TABLES; 48 | /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; 49 | 50 | /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; 51 | /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; 52 | /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; 53 | /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; 54 | /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; 55 | /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; 56 | /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; 57 | 58 | -- Dump completed on 2019-06-21 13:43:59 59 | -------------------------------------------------------------------------------- /data/zutki_users.sql: -------------------------------------------------------------------------------- 1 | -- MySQL dump 10.13 Distrib 8.0.12, for Win64 (x86_64) 2 | -- 3 | -- Host: localhost Database: zutki 4 | -- ------------------------------------------------------ 5 | -- Server version 8.0.12 6 | 7 | /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; 8 | /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; 9 | /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; 10 | SET NAMES utf8 ; 11 | /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; 12 | /*!40103 SET TIME_ZONE='+00:00' */; 13 | /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; 14 | /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; 15 | /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; 16 | /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; 17 | 18 | -- 19 | -- Table structure for table `users` 20 | -- 21 | 22 | DROP TABLE IF EXISTS `users`; 23 | /*!40101 SET @saved_cs_client = @@character_set_client */; 24 | SET character_set_client = utf8mb4 ; 25 | CREATE TABLE `users` ( 26 | `uid` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id', 27 | `username` varchar(20) NOT NULL COMMENT '用户名', 28 | `password` varchar(20) NOT NULL COMMENT '密码', 29 | `major` varchar(20) DEFAULT NULL COMMENT '专业', 30 | `email` varchar(20) DEFAULT NULL COMMENT '邮箱', 31 | PRIMARY KEY (`uid`) 32 | ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COMMENT='用户表'; 33 | /*!40101 SET character_set_client = @saved_cs_client */; 34 | 35 | -- 36 | -- Dumping data for table `users` 37 | -- 38 | 39 | LOCK TABLES `users` WRITE; 40 | /*!40000 ALTER TABLE `users` DISABLE KEYS */; 41 | INSERT INTO `users` VALUES (1,'1','123',NULL,NULL),(2,'57820','5705',NULL,NULL),(3,'442','35','science','a15907120@qq.com'),(4,'2047','40570','science','41075@qq.com'),(5,'ss','123','economics','ss@qq'),(6,'aa','123','economics','ss@qq'),(7,'15465','56465','economics','156@qq'); 42 | /*!40000 ALTER TABLE `users` ENABLE KEYS */; 43 | UNLOCK TABLES; 44 | /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; 45 | 46 | /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; 47 | /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; 48 | /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; 49 | /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; 50 | /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; 51 | /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; 52 | /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; 53 | 54 | -- Dump completed on 2019-06-21 13:43:59 55 | -------------------------------------------------------------------------------- /src/dao/LikeDao.java: -------------------------------------------------------------------------------- 1 | package dao; 2 | 3 | import entity.Like; 4 | import util.BaseDao; 5 | 6 | import java.sql.Connection; 7 | import java.sql.ResultSet; 8 | import java.sql.Statement; 9 | import java.util.ArrayList; 10 | import java.util.Vector; 11 | 12 | public class LikeDao { 13 | public ArrayList findLikesByUser(int uid){ 14 | ArrayList result = null; 15 | Connection con=null; 16 | ResultSet rs=null; 17 | Statement st=null; 18 | 19 | try { 20 | String sql="SELECT * FROM zutki.likes where uid = "+uid+";"; 21 | System.out.println(sql); 22 | con= BaseDao.getConnection(); 23 | st=con.createStatement(); 24 | result = new ArrayList(); 25 | rs = st.executeQuery(sql); 26 | 27 | while(rs.next()){ 28 | Like like = new Like(); 29 | like.setLid(rs.getInt("lid")); 30 | like.setPid(rs.getInt("pid")); 31 | like.setUid(rs.getInt("uid")); 32 | 33 | result.add(like); 34 | } 35 | 36 | }catch(Exception e) { 37 | e.printStackTrace(); 38 | }finally{ 39 | BaseDao.closeAll(rs, st, con); 40 | } 41 | return result; 42 | } 43 | 44 | public static void addLike(int uid, int pid){ 45 | Vector result = null; 46 | Connection con=null; 47 | ResultSet rs=null; 48 | Statement st=null; 49 | 50 | try { 51 | String sql="INSERT INTO `zutki`.`likes` (`uid`, `pid`) VALUES ('"+uid+"', '"+pid+"');"; 52 | System.out.println(sql); 53 | con= BaseDao.getConnection(); 54 | st=con.createStatement(); 55 | st.execute(sql); 56 | }catch(Exception e) { 57 | e.printStackTrace(); 58 | }finally{ 59 | BaseDao.closeAll(rs, st, con); 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/dao/PaperDao.java: -------------------------------------------------------------------------------- 1 | package dao; 2 | 3 | import entity.Like; 4 | import entity.Paper; 5 | import util.BaseDao; 6 | 7 | import java.sql.Connection; 8 | import java.sql.ResultSet; 9 | import java.sql.Statement; 10 | import java.util.ArrayList; 11 | import java.util.List; 12 | import java.util.Vector; 13 | 14 | public class PaperDao { 15 | public Paper findPaperById(int pid){ 16 | Connection con=null; 17 | ResultSet rs=null; 18 | Statement st=null; 19 | 20 | Paper paper = new Paper(); 21 | try { 22 | String sql="SELECT * FROM zutki.papers where pid = "+pid+";"; 23 | System.out.println(sql); 24 | con= BaseDao.getConnection(); 25 | st=con.createStatement(); 26 | rs = st.executeQuery(sql); 27 | 28 | if (rs.next()){ 29 | paper.setPid(rs.getInt("pid")); 30 | paper.setAuthor(rs.getString("author")); 31 | paper.setCnt(rs.getInt("downCnt")); 32 | paper.setDate(rs.getDate("date")); 33 | paper.setDigest(rs.getString("digest")); 34 | paper.setPlace(rs.getString("place")); 35 | paper.setSource(rs.getString("source")); 36 | paper.setTitle(rs.getString("title")); 37 | } 38 | }catch(Exception e) { 39 | e.printStackTrace(); 40 | }finally{ 41 | BaseDao.closeAll(rs, st, con); 42 | } 43 | return paper; 44 | } 45 | 46 | public ArrayList findTopNPapers(ArrayList papers){ 47 | //将喜欢人数最多的论文补入推荐列表, 直至满五篇(考虑重复) 48 | Connection con=null; 49 | ResultSet rs=null; 50 | Statement st=null; 51 | 52 | try { 53 | String sql = "SELECT * FROM zutki.papers order by likeCnt desc;"; 54 | System.out.println(sql); 55 | con= BaseDao.getConnection(); 56 | st=con.createStatement(); 57 | rs = st.executeQuery(sql); 58 | 59 | while(rs.next() && papers.size() < 5){ 60 | Paper paper = new Paper(); 61 | paper.setPid(rs.getInt("pid")); 62 | paper.setAuthor(rs.getString("author")); 63 | paper.setCnt(rs.getInt("downCnt")); 64 | paper.setDate(rs.getDate("date")); 65 | paper.setDigest(rs.getString("digest")); 66 | paper.setPlace(rs.getString("place")); 67 | paper.setSource(rs.getString("source")); 68 | paper.setTitle(rs.getString("title")); 69 | 70 | if(BaseDao.isExist(papers, paper.getPid())) 71 | papers.add(paper); 72 | } 73 | }catch(Exception e) { 74 | e.printStackTrace(); 75 | }finally{ 76 | BaseDao.closeAll(rs, st, con); 77 | } 78 | return papers; 79 | } 80 | 81 | public ArrayList SearchPapers(String classify, String search){ 82 | ArrayList result = null; 83 | Connection con=null; 84 | ResultSet rs=null; 85 | Statement st=null; 86 | 87 | try { 88 | String sql="select * from zutki.papers where "+classify+" like '%"+search+"%'"; 89 | System.out.println(sql); 90 | con= BaseDao.getConnection(); 91 | st=con.createStatement(); 92 | result = new ArrayList(); 93 | rs = st.executeQuery(sql); 94 | 95 | while(rs.next()){ 96 | Paper paper = new Paper(); 97 | paper.setPid(rs.getInt("pid")); 98 | paper.setAuthor(rs.getString("author")); 99 | paper.setCnt(rs.getInt("downCnt")); 100 | paper.setDate(rs.getDate("date")); 101 | paper.setDigest(rs.getString("digest")); 102 | paper.setPlace(rs.getString("place")); 103 | paper.setSource(rs.getString("source")); 104 | paper.setTitle(rs.getString("title")); 105 | 106 | result.add(paper); 107 | } 108 | 109 | }catch(Exception e) { 110 | e.printStackTrace(); 111 | }finally{ 112 | BaseDao.closeAll(rs, st, con); 113 | } 114 | return result; 115 | } 116 | 117 | public ArrayList getAllPapers(){ 118 | ArrayList result = null; 119 | Connection con=null; 120 | ResultSet rs=null; 121 | Statement st=null; 122 | 123 | try { 124 | String sql = "SELECT * FROM zutki.papers;"; 125 | System.out.println(sql); 126 | con= BaseDao.getConnection(); 127 | st=con.createStatement(); 128 | result = new ArrayList(); 129 | rs = st.executeQuery(sql); 130 | 131 | while(rs.next()){ 132 | Paper paper = new Paper(); 133 | paper.setPid(rs.getInt("pid")); 134 | paper.setAuthor(rs.getString("author")); 135 | paper.setCnt(rs.getInt("downCnt")); 136 | paper.setDate(rs.getDate("date")); 137 | paper.setDigest(rs.getString("digest")); 138 | paper.setPlace(rs.getString("place")); 139 | paper.setSource(rs.getString("source")); 140 | paper.setTitle(rs.getString("title")); 141 | result.add(paper); 142 | } 143 | 144 | }catch(Exception e) { 145 | e.printStackTrace(); 146 | }finally{ 147 | BaseDao.closeAll(rs, st, con); 148 | } 149 | return result; 150 | } 151 | 152 | public void addLikeCnt(int pid){ 153 | Connection con=null; 154 | ResultSet rs=null; 155 | Statement st=null; 156 | 157 | try { 158 | String sql = "UPDATE `zutki`.`papers` SET `likeCnt` = likeCnt+'1' WHERE (`pid` = '"+pid+"');"; 159 | System.out.println(sql); 160 | con= BaseDao.getConnection(); 161 | st=con.createStatement(); 162 | st.execute(sql); 163 | }catch(Exception e) { 164 | e.printStackTrace(); 165 | }finally{ 166 | BaseDao.closeAll(rs, st, con); 167 | } 168 | } 169 | } 170 | -------------------------------------------------------------------------------- /src/dao/UserDao.java: -------------------------------------------------------------------------------- 1 | package dao; 2 | 3 | import entity.Paper; 4 | import entity.User; 5 | import util.BaseDao; 6 | 7 | import java.sql.Connection; 8 | import java.sql.ResultSet; 9 | import java.sql.SQLException; 10 | import java.sql.Statement; 11 | import java.util.ArrayList; 12 | import java.util.Vector; 13 | 14 | public class UserDao { 15 | public boolean userAdd(User user) { 16 | //添加用户 17 | int result=0; 18 | Connection con=null; 19 | ResultSet rt=null; 20 | Statement st=null; 21 | 22 | try { 23 | String sql = "INSERT INTO `zutki`.`users` (`username`, `password`, `major`, `email`) VALUES ('"+user.getUsername()+"', '"+user.getPassword()+"'," + 24 | " '"+user.getMajor()+"', '"+user.getEmail()+"');\n"; 25 | 26 | System.out.println(sql); 27 | con= BaseDao.getConnection(); 28 | st= con.createStatement(); 29 | result=st.executeUpdate(sql); 30 | 31 | } catch (Exception e) { 32 | e.printStackTrace(); 33 | return false; 34 | }finally{ 35 | BaseDao.closeAll(rt, st, con); 36 | } 37 | 38 | if(result>=0) 39 | return true; 40 | else 41 | return false; 42 | } 43 | 44 | public User findByName(String username) { 45 | //通过用户名来查找该用户 46 | Connection conn=null; 47 | Statement st=null; 48 | ResultSet rs=null; 49 | 50 | try { 51 | String sql="select * from zutki.users where username='"+username+"'"; 52 | conn=BaseDao.getConnection(); 53 | st=conn.createStatement(); 54 | rs=st.executeQuery(sql); 55 | if (rs.next()){ 56 | User target = new User(rs.getInt("uid"), rs.getString("username"), 57 | rs.getString("password"), rs.getString("major"), rs.getString("email")); 58 | return target; 59 | }else { 60 | return null; 61 | } 62 | } catch (SQLException e) { 63 | e.printStackTrace(); 64 | } 65 | finally { 66 | BaseDao.closeAll(rs, st, conn); 67 | } 68 | return null; 69 | } 70 | 71 | public boolean isExist(String username){ 72 | //通过用户名查找该用户是否存在 73 | Connection conn=null; 74 | Statement st=null; 75 | ResultSet rs=null; 76 | 77 | try { 78 | String sql = "select count(*) from users where uid = '"+username+"';"; 79 | System.out.println(sql); 80 | conn = BaseDao.getConnection(); 81 | st = conn.createStatement(); 82 | rs = st.executeQuery(sql); 83 | 84 | //如果找到该用户返回true 85 | while (rs.next()){ 86 | if(rs.getBoolean(1)) 87 | return true; 88 | else 89 | return false; 90 | } 91 | 92 | } catch (SQLException e) { 93 | e.printStackTrace(); 94 | }finally { 95 | BaseDao.closeAll(rs, st, conn); 96 | } 97 | return false; 98 | } 99 | 100 | 101 | 102 | public ArrayList getAllUsers(){ 103 | ArrayList result = null; 104 | Connection con=null; 105 | ResultSet rs=null; 106 | Statement st=null; 107 | 108 | try { 109 | String sql = "SELECT * FROM zutki.users;"; 110 | System.out.println(sql); 111 | con= BaseDao.getConnection(); 112 | st=con.createStatement(); 113 | result = new ArrayList(); 114 | rs = st.executeQuery(sql); 115 | 116 | while(rs.next()){ 117 | User user = new User(); 118 | user.setEmail(rs.getString("email")); 119 | user.setMajor(rs.getString("major")); 120 | user.setPassword(rs.getString("password")); 121 | user.setUsername(rs.getString("username")); 122 | user.setUid(rs.getInt("uid")); 123 | 124 | result.add(user); 125 | } 126 | 127 | }catch(Exception e) { 128 | e.printStackTrace(); 129 | }finally{ 130 | BaseDao.closeAll(rs, st, con); 131 | } 132 | return result; 133 | 134 | 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /src/entity/Like.java: -------------------------------------------------------------------------------- 1 | package entity; 2 | 3 | public class Like { 4 | int uid; //发起喜欢的用户 5 | int pid; //被喜欢的文章 6 | int lid; //该喜欢行为的id 7 | 8 | public Like(int uid, int pid, int lid) { 9 | this.uid = uid; 10 | this.pid = pid; 11 | this.lid = lid; 12 | } 13 | 14 | public Like(){ 15 | 16 | } 17 | 18 | public int getUid() { 19 | return uid; 20 | } 21 | 22 | public void setUid(int uid) { 23 | this.uid = uid; 24 | } 25 | 26 | public int getPid() { 27 | return pid; 28 | } 29 | 30 | public void setPid(int pid) { 31 | this.pid = pid; 32 | } 33 | 34 | public int getLid() { 35 | return lid; 36 | } 37 | 38 | public void setLid(int lid) { 39 | this.lid = lid; 40 | } 41 | 42 | @Override 43 | public String toString() { 44 | return "Like{" + 45 | "uid=" + uid + 46 | ", pid=" + pid + 47 | ", lid=" + lid + 48 | '}'; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/entity/Paper.java: -------------------------------------------------------------------------------- 1 | package entity; 2 | 3 | 4 | import java.util.Date; 5 | 6 | public class Paper { 7 | int pid; //论文id 8 | String author; //作者 9 | Date date; //发表日期 10 | String place; //发表机构 11 | String title; //论文题目 12 | String digest; //摘要 13 | String source; //论文来源 14 | int cnt; //喜欢该论文的用户数量 15 | int downCnt; //下载量 16 | double w; //相似度(只在推荐时调用) 17 | 18 | public Paper() { 19 | } 20 | 21 | public Paper(int pid, String author, Date date, String place, String title, String digest, String source, int cnt, int downCnt) { 22 | this.pid = pid; 23 | this.author = author; 24 | this.date = date; 25 | this.place = place; 26 | this.title = title; 27 | this.digest = digest; 28 | this.source = source; 29 | this.cnt = cnt; 30 | this.downCnt = downCnt; 31 | } 32 | 33 | public int getPid() { 34 | return pid; 35 | } 36 | 37 | public void setPid(int pid) { 38 | this.pid = pid; 39 | } 40 | 41 | public String getAuthor() { 42 | return author; 43 | } 44 | 45 | public void setAuthor(String author) { 46 | this.author = author; 47 | } 48 | 49 | public Date getDate() { 50 | return date; 51 | } 52 | 53 | public void setDate(Date date) { 54 | this.date = date; 55 | } 56 | 57 | public String getPlace() { 58 | return place; 59 | } 60 | 61 | public void setPlace(String place) { 62 | this.place = place; 63 | } 64 | 65 | public String getTitle() { 66 | return title; 67 | } 68 | 69 | public void setTitle(String title) { 70 | this.title = title; 71 | } 72 | 73 | public String getDigest() { 74 | return digest; 75 | } 76 | 77 | public void setDigest(String digest) { 78 | this.digest = digest; 79 | } 80 | 81 | public String getSource() { 82 | return source; 83 | } 84 | 85 | public void setSource(String source) { 86 | this.source = source; 87 | } 88 | 89 | public int getCnt() { 90 | return cnt; 91 | } 92 | 93 | public void setCnt(int cnt) { 94 | this.cnt = cnt; 95 | } 96 | 97 | public int getDownCnt() { 98 | return downCnt; 99 | } 100 | 101 | public void setDownCnt(int downCnt) { 102 | this.downCnt = downCnt; 103 | } 104 | 105 | public double getW() { 106 | return w; 107 | } 108 | 109 | public void setW(double w) { 110 | this.w = w; 111 | } 112 | 113 | @Override 114 | public String toString() { 115 | return "Paper{" + 116 | "pid=" + pid + 117 | ", author='" + author + '\'' + 118 | ", date=" + date + 119 | ", place='" + place + '\'' + 120 | ", title='" + title + '\'' + 121 | ", degest='" + digest + '\'' + 122 | ", source='" + source + '\'' + 123 | ", cnt=" + cnt + 124 | ", downCnt=" + downCnt + 125 | '}'; 126 | } 127 | } 128 | 129 | -------------------------------------------------------------------------------- /src/entity/User.java: -------------------------------------------------------------------------------- 1 | package entity; 2 | 3 | public class User { 4 | int uid; //用户id 5 | String username; //用户名 6 | String password; //密码 7 | String major; //专业 8 | String email; //邮箱 9 | 10 | public User() { 11 | } 12 | 13 | public User(int uid, String username, String password, String major, String email) { 14 | this.uid = uid; 15 | this.username = username; 16 | this.password = password; 17 | this.major = major; 18 | this.email = email; 19 | } 20 | 21 | public User(String username, String password, String major, String email) { 22 | this.username = username; 23 | this.password = password; 24 | this.major = major; 25 | this.email = email; 26 | } 27 | 28 | public int getUid() { 29 | return uid; 30 | } 31 | 32 | public void setUid(int uid) { 33 | this.uid = uid; 34 | } 35 | 36 | public String getUsername() { 37 | return username; 38 | } 39 | 40 | public void setUsername(String username) { 41 | this.username = username; 42 | } 43 | 44 | public String getPassword() { 45 | return password; 46 | } 47 | 48 | public void setPassword(String password) { 49 | this.password = password; 50 | } 51 | 52 | public String getMajor() { 53 | return major; 54 | } 55 | 56 | public void setMajor(String major) { 57 | this.major = major; 58 | } 59 | 60 | public String getEmail() { 61 | return email; 62 | } 63 | 64 | public void setEmail(String email) { 65 | this.email = email; 66 | } 67 | 68 | @Override 69 | public String toString() { 70 | return "User{" + 71 | "uid=" + uid + 72 | ", username='" + username + '\'' + 73 | ", password='" + password + '\'' + 74 | '}'; 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /src/servlet/IndexServlet.java: -------------------------------------------------------------------------------- 1 | package servlet; 2 | 3 | import dao.PaperDao; 4 | import entity.Paper; 5 | import entity.User; 6 | import util.ItemSimilarity; 7 | 8 | import javax.servlet.ServletException; 9 | import javax.servlet.annotation.WebServlet; 10 | import javax.servlet.http.*; 11 | import java.io.IOException; 12 | import java.util.ArrayList; 13 | import java.util.Vector; 14 | 15 | @WebServlet(name = "IndexServlet", urlPatterns = "/IndexServlet") 16 | public class IndexServlet extends HttpServlet { 17 | protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 18 | doGet(request, response); 19 | } 20 | 21 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 22 | response.setContentType("text/html;charset=utf-8"); 23 | 24 | PaperDao dao = new PaperDao(); 25 | HttpSession session = request.getSession(); 26 | User user = (User) session.getAttribute("user"); 27 | 28 | //生成推荐 29 | ArrayList recomends = new ArrayList<>(); 30 | 31 | if(user!=null) 32 | recomends = ItemSimilarity.recommend(user.getUid()); 33 | else 34 | recomends = dao.findTopNPapers(recomends); 35 | 36 | request.setAttribute("recomends", recomends); 37 | 38 | System.out.println("推荐列表为: "); 39 | for(Paper paper: recomends) 40 | System.out.println("推荐题目为: "+paper.getTitle()); 41 | 42 | request.getRequestDispatcher("htmls/index.jsp").forward(request, response); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/servlet/LoginServlet.java: -------------------------------------------------------------------------------- 1 | package servlet; 2 | 3 | import dao.UserDao; 4 | import entity.User; 5 | 6 | import javax.servlet.ServletException; 7 | import javax.servlet.annotation.WebServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | import java.io.PrintWriter; 12 | 13 | @WebServlet(name = "LoginServlet", urlPatterns = "/LoginServlet") 14 | public class LoginServlet extends javax.servlet.http.HttpServlet { 15 | protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 16 | response.setContentType("text/html;charset=utf-8"); 17 | String username = request.getParameter("username"); 18 | String password = request.getParameter("password"); 19 | UserDao dao = new UserDao(); 20 | 21 | //查看数据库中是否有该用户 22 | User qUser = dao.findByName(username); 23 | if(qUser==null){ 24 | request.setAttribute("status", "该用户不存在"); 25 | System.out.println("该用户不存在"); 26 | }else if(qUser.getPassword().equals(password)){ 27 | request.setAttribute("status", "登录成功, 等待跳转..."); 28 | System.out.println("登录成功, 等待跳转..."); 29 | request.getSession().setAttribute("user",qUser); 30 | }else { 31 | System.out.println("账号或密码输入错误"); 32 | request.setAttribute("status", "账号或密码输入错误"); 33 | } 34 | response.sendRedirect("/zutki_war_exploded/IndexServlet"); 35 | } 36 | 37 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 38 | doPost(request, response); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/servlet/LogoutServlet.java: -------------------------------------------------------------------------------- 1 | package servlet; 2 | 3 | import javax.servlet.ServletException; 4 | import javax.servlet.annotation.WebServlet; 5 | import javax.servlet.http.HttpServlet; 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | import java.io.IOException; 9 | 10 | @WebServlet(name = "LogoutServlet", urlPatterns = "/LogoutServlet") 11 | public class LogoutServlet extends HttpServlet { 12 | protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 13 | doGet(request, response); 14 | } 15 | 16 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 17 | request.getSession().removeAttribute("user"); 18 | 19 | response.sendRedirect("/zutki_war_exploded/IndexServlet"); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/servlet/PaperServlet.java: -------------------------------------------------------------------------------- 1 | package servlet; 2 | 3 | import com.mysql.cj.Session; 4 | import dao.LikeDao; 5 | import dao.PaperDao; 6 | import entity.Paper; 7 | import entity.User; 8 | 9 | import javax.persistence.metamodel.SetAttribute; 10 | import javax.servlet.ServletException; 11 | import javax.servlet.annotation.WebServlet; 12 | import javax.servlet.http.HttpServlet; 13 | import javax.servlet.http.HttpServletRequest; 14 | import javax.servlet.http.HttpServletResponse; 15 | import javax.servlet.http.HttpSession; 16 | import java.io.IOException; 17 | 18 | @WebServlet(name = "PaperServlet", urlPatterns = "/PaperServlet") 19 | public class PaperServlet extends HttpServlet { 20 | protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 21 | doGet(request, response); 22 | } 23 | 24 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 25 | response.setContentType("text/html;charset=utf-8"); 26 | PaperDao dao = new PaperDao(); 27 | 28 | //展示论文信息 29 | int pid = Integer.parseInt(request.getParameter("pid")); 30 | Paper paper = dao.findPaperById(pid); 31 | request.setAttribute("paper", paper); 32 | request.getRequestDispatcher("htmls/paper.jsp").forward(request, response); 33 | 34 | //添加一次喜欢 35 | int lid = (Integer) request.getAttribute("lid"); 36 | dao.addLikeCnt(lid); 37 | 38 | HttpSession session = request.getSession(); 39 | User user = (User) session.getAttribute("user"); 40 | 41 | System.out.println(user.toString() +" : " +lid); 42 | LikeDao.addLike(user.getUid(), lid); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/servlet/RegistServlet.java: -------------------------------------------------------------------------------- 1 | package servlet; 2 | 3 | import dao.UserDao; 4 | import entity.User; 5 | 6 | import javax.servlet.ServletException; 7 | import javax.servlet.annotation.WebServlet; 8 | import javax.servlet.http.HttpServlet; 9 | import javax.servlet.http.HttpServletRequest; 10 | import javax.servlet.http.HttpServletResponse; 11 | import java.io.IOException; 12 | 13 | @WebServlet("/RegistServlet") 14 | public class RegistServlet extends HttpServlet { 15 | protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 16 | response.setContentType("text/html;charset=utf-8"); 17 | UserDao dao = new UserDao(); 18 | 19 | String username = request.getParameter("username"); 20 | String password = request.getParameter("password"); 21 | String email = request.getParameter("email"); 22 | String major = request.getParameter("major"); 23 | 24 | if(dao.isExist(username)){ 25 | request.setAttribute("message", "该用户已存在!"); 26 | }else{ 27 | User user = new User(username, password, major, email); 28 | dao.userAdd(user); 29 | request.setAttribute("message", "注册成功!"); 30 | } 31 | 32 | response.setHeader("refresh", "3;url=/zutki_war_exploded/index.html"); //3秒后跳转到主页 33 | } 34 | 35 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 36 | doPost(request, response); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/servlet/SearchServlet.java: -------------------------------------------------------------------------------- 1 | package servlet; 2 | 3 | import dao.PaperDao; 4 | import entity.Paper; 5 | 6 | import javax.servlet.ServletException; 7 | import javax.servlet.annotation.WebServlet; 8 | import javax.servlet.http.HttpServlet; 9 | import javax.servlet.http.HttpServletRequest; 10 | import javax.servlet.http.HttpServletResponse; 11 | import java.io.IOException; 12 | import java.util.List; 13 | 14 | @WebServlet(name = "SearchServlet", urlPatterns = "/SearchServlet") 15 | public class SearchServlet extends HttpServlet { 16 | protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 17 | doGet(request, response); 18 | } 19 | 20 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 21 | response.setContentType("text/html;charset=utf-8"); 22 | PaperDao dao = new PaperDao(); 23 | 24 | String classify = request.getParameter("classify"); 25 | String search = request.getParameter("search"); 26 | 27 | List papers = dao.SearchPapers(classify, search); 28 | 29 | System.out.println(papers.get(0).toString()); 30 | if(papers!=null){ 31 | Paper paper = papers.get(0); 32 | request.setAttribute("title", paper.getTitle()); 33 | request.setAttribute("author", paper.getAuthor()); 34 | request.setAttribute("digest", paper.getDigest()); 35 | request.setAttribute("cnt", paper.getCnt()); 36 | request.setAttribute("date", paper.getDate()); 37 | request.setAttribute("downCnt", paper.getDownCnt()); 38 | request.setAttribute("place", paper.getPlace()); 39 | request.setAttribute("source", paper.getSource()); 40 | }else { 41 | request.setAttribute("message", "找不到您输入的结果! 请重新查找"); 42 | } 43 | 44 | request.setAttribute("papers", papers); 45 | request.setAttribute("origin", search); 46 | request.getRequestDispatcher("htmls/classify.jsp").forward(request, response); 47 | return; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/util/BaseDao.java: -------------------------------------------------------------------------------- 1 | package util; 2 | 3 | import entity.Paper; 4 | 5 | import java.sql.Connection; 6 | import java.sql.DriverManager; 7 | import java.sql.Statement; 8 | import java.sql.ResultSet; 9 | import java.util.ArrayList; 10 | 11 | public class BaseDao { 12 | private static final String driver="com.mysql.cj.jdbc.Driver"; 13 | private static final String url="jdbc:mysql://localhost:3306/zutki?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false"; 14 | private static final String uid="root"; 15 | private static final String pwd="123456"; 16 | 17 | Connection conn = null; 18 | Statement prs = null; 19 | ResultSet rs = null; 20 | 21 | //建立连接 22 | public static Connection getConnection(){ 23 | Connection con=null; 24 | try { 25 | Class.forName(driver); 26 | con= DriverManager.getConnection(url,uid,pwd); 27 | } catch (Exception e) { 28 | e.printStackTrace(); 29 | } 30 | return con; 31 | } 32 | 33 | //关闭连接 34 | public static void closeAll(ResultSet rs, Statement st, Connection con){ 35 | try { 36 | if(rs!=null){ 37 | rs.close(); 38 | rs=null; 39 | } 40 | if(st!=null){ 41 | st.close(); 42 | st=null; 43 | } 44 | if(con!=null){ 45 | con.close(); 46 | con=null; 47 | } 48 | } catch (Exception e) { 49 | e.printStackTrace(); 50 | } 51 | } 52 | 53 | //判断该论文组中是否有该论文 54 | public static boolean isExist(ArrayList papers, int pid){ 55 | for (Paper paper : papers) 56 | if(paper.getPid() == pid) 57 | return false; 58 | return true; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/util/ItemSimilarity.java: -------------------------------------------------------------------------------- 1 | package util; 2 | 3 | import dao.LikeDao; 4 | import dao.PaperDao; 5 | import dao.UserDao; 6 | import entity.Like; 7 | import entity.Paper; 8 | import entity.User; 9 | import java.util.*; 10 | 11 | public class ItemSimilarity { 12 | public static void main(String[] args) { 13 | //测试小Demo 14 | System.out.println("请输入用户希望推荐的用户id : "); 15 | Scanner input = new Scanner(System.in); 16 | int uid = input.nextInt(); 17 | ArrayList v = recommend(uid); 18 | 19 | System.out.println("正在生成针对用户id为"+uid+"的推荐..."); 20 | for(int i = 0; i < v.size(); i++) 21 | System.out.println("第"+(i+1)+"个推荐: 题目:"+v.get(i).getTitle()+""); 22 | } 23 | 24 | //通过计算余弦相似度并取TopN, 返回为uid的用户生成的5个推荐文章 25 | public static ArrayList recommend(int uid){ 26 | UserDao userdao = new UserDao(); 27 | PaperDao paperdao = new PaperDao(); 28 | LikeDao likedao = new LikeDao(); 29 | 30 | ArrayList likeLists; //其他用户喜欢的论文列表 31 | 32 | ArrayList users = userdao.getAllUsers(); //所有用户列表 33 | ArrayList papers = paperdao.getAllPapers(); //所有论文列表 34 | int[][] curMatrix = new int[papers.size()+5][papers.size()+5]; //当前矩阵 35 | int[][] comMatrix = new int[papers.size()+5][papers.size()+5]; //共现矩阵 36 | int[] N = new int[papers.size()+5]; //喜欢每个物品的人数 37 | 38 | for(User user: users){ 39 | if(user.getUid()==uid) continue; //当前用户则跳过 40 | 41 | likeLists = likedao.findLikesByUser(user.getUid()); //当前用户的喜欢列表 42 | 43 | for(int i = 0; i < papers.size(); i++) 44 | for(int j = 0; j < papers.size(); j++) 45 | curMatrix[i][j] = 0; //清空矩阵 46 | 47 | for(int i = 0; i < likeLists.size(); i++){ 48 | int pid1 = likeLists.get(i).getPid(); 49 | ++N[pid1]; 50 | for(int j = i+1; j < likeLists.size(); j++){ 51 | int pid2 = likeLists.get(j).getPid(); 52 | ++curMatrix[pid1][pid2]; 53 | ++curMatrix[pid2][pid1]; //两两加一 54 | } 55 | } 56 | //累加所有矩阵, 得到共现矩阵 57 | for(int i = 0; i < papers.size(); i++){ 58 | for(int j = 0; j < papers.size(); j++){ 59 | int pid1 = papers.get(i).getPid(), pid2 = papers.get(j).getPid(); 60 | comMatrix[pid1][pid2] += curMatrix[pid1][pid2]; 61 | comMatrix[pid1][pid2] += curMatrix[pid1][pid2]; 62 | } 63 | } 64 | } 65 | 66 | 67 | TreeSet preList = new TreeSet(new Comparator() { 68 | @Override 69 | public int compare(Paper o1, Paper o2) { 70 | if(o1.getW()!=o2.getW()) 71 | return (int) (o1.getW()-o2.getW())*100; 72 | else 73 | return o1.getCnt()-o2.getCnt(); 74 | } 75 | }); //预处理的列表 76 | 77 | likeLists = likedao.findLikesByUser(uid); //当前用户喜欢的论文列表 78 | boolean[] used = new boolean[papers.size()+5]; //判重数组 79 | for(Like like: likeLists){ 80 | int Nij = 0; //既喜欢i又喜欢j的人数 81 | double Wij; //相似度 82 | Paper tmp; //当前的论文 83 | 84 | int i = like.getPid(); 85 | for(Paper paper: papers){ 86 | if(like.getPid() == paper.getPid()) continue; 87 | int j = paper.getPid(); 88 | 89 | Nij = comMatrix[i][j]; 90 | Wij = (double)Nij/Math.sqrt(N[i]*N[j]); //计算余弦相似度 91 | 92 | tmp = paperdao.findPaperById(paper.getPid()); 93 | tmp.setW(Wij); 94 | 95 | if(used[tmp.getPid()]) continue; 96 | preList.add(tmp); 97 | used[tmp.getPid()] = true; 98 | } 99 | } 100 | 101 | ArrayList recomLists = new ArrayList<>(); //生成的推荐结果 102 | for(int i = 0; preList.size()>0 && i<5; i++){ 103 | recomLists.add(preList.pollLast()); 104 | preList.pollLast(); 105 | } 106 | if(recomLists.size()<5){ 107 | //推荐数量不满5个, 补足喜欢数最高的文章 108 | recomLists = paperdao.findTopNPapers(recomLists); 109 | } 110 | 111 | return recomLists; 112 | } 113 | } -------------------------------------------------------------------------------- /web/WEB-INF/lib/jstl-1.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SupritYoung/zutki/351b194a5306debe944ce921585c255e9f3e7214/web/WEB-INF/lib/jstl-1.2.jar -------------------------------------------------------------------------------- /web/WEB-INF/lib/mysql-connector-java-8.0.13.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SupritYoung/zutki/351b194a5306debe944ce921585c255e9f3e7214/web/WEB-INF/lib/mysql-connector-java-8.0.13.jar -------------------------------------------------------------------------------- /web/WEB-INF/lib/standard-1.1.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SupritYoung/zutki/351b194a5306debe944ce921585c255e9f3e7214/web/WEB-INF/lib/standard-1.1.2.jar -------------------------------------------------------------------------------- /web/WEB-INF/web.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | IndexServlet 10 | 11 | -------------------------------------------------------------------------------- /web/htmls/classify.jsp: -------------------------------------------------------------------------------- 1 | <%@ page import="entity.Paper" %> 2 | <%@ page import="java.util.ArrayList" %> 3 | <%@ page import="java.util.Vector" %> 4 | <%@ page language="java" contentType="text/html; charset=UTF-8" 5 | pageEncoding="UTF-8" %> 6 | <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 中工知网 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 33 | 34 | 35 | 36 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 85 | 86 |
87 | 88 | 89 |
90 |

欢迎来到中国知网

91 |

在这里希望你能找到您想要的一切

92 |
93 | 94 | 121 | 124 |
125 | 126 | 127 | 128 |
129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | <% 139 | ArrayList papers = (ArrayList) request.getAttribute("papers"); 140 | %> 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 |
论文编号题目作者来源发表时间下载量
${papers.pid}${papers.title}${papers.author}${papers.source}${papers.date}${papers.downCnt}
152 |
153 | 154 | 155 |
156 | 157 | 158 |
159 | 160 | 161 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | -------------------------------------------------------------------------------- /web/htmls/img/htmls/button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SupritYoung/zutki/351b194a5306debe944ce921585c255e9f3e7214/web/htmls/img/htmls/button.png -------------------------------------------------------------------------------- /web/htmls/img/htmls/button1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SupritYoung/zutki/351b194a5306debe944ce921585c255e9f3e7214/web/htmls/img/htmls/button1.jpg -------------------------------------------------------------------------------- /web/htmls/img/htmls/header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SupritYoung/zutki/351b194a5306debe944ce921585c255e9f3e7214/web/htmls/img/htmls/header.png -------------------------------------------------------------------------------- /web/htmls/img/htmls/mark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SupritYoung/zutki/351b194a5306debe944ce921585c255e9f3e7214/web/htmls/img/htmls/mark.png -------------------------------------------------------------------------------- /web/htmls/img/htmls/paper.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SupritYoung/zutki/351b194a5306debe944ce921585c255e9f3e7214/web/htmls/img/htmls/paper.jpg -------------------------------------------------------------------------------- /web/htmls/img/htmls/pic-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SupritYoung/zutki/351b194a5306debe944ce921585c255e9f3e7214/web/htmls/img/htmls/pic-1.jpg -------------------------------------------------------------------------------- /web/htmls/img/htmls/pic-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SupritYoung/zutki/351b194a5306debe944ce921585c255e9f3e7214/web/htmls/img/htmls/pic-2.jpg -------------------------------------------------------------------------------- /web/htmls/img/htmls/pic-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SupritYoung/zutki/351b194a5306debe944ce921585c255e9f3e7214/web/htmls/img/htmls/pic-3.jpg -------------------------------------------------------------------------------- /web/htmls/img/htmls/sjd.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SupritYoung/zutki/351b194a5306debe944ce921585c255e9f3e7214/web/htmls/img/htmls/sjd.jpg -------------------------------------------------------------------------------- /web/htmls/img/htmls/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SupritYoung/zutki/351b194a5306debe944ce921585c255e9f3e7214/web/htmls/img/htmls/user.png -------------------------------------------------------------------------------- /web/htmls/index.jsp: -------------------------------------------------------------------------------- 1 | <%@ page import="entity.Paper" %> 2 | <%@ page import="java.util.ArrayList" %> 3 | <%@ page import="java.util.Vector" %> 4 | <%@ page language="java" contentType="text/html; charset=UTF-8" 5 | pageEncoding="UTF-8" %> 6 | <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 中工知网 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 33 | 34 | 35 | 36 | 40 | 41 | 42 | 43 | 44 | 45 | 86 | 87 |
88 | 89 | 90 |
91 |

欢迎来到中国知网

92 |

在这里希望你能找到您想要的一切

93 |
94 | 95 | 122 | 125 |
126 | 127 | 128 | 129 |
130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | <% 140 | ArrayList recomends = (ArrayList) request.getAttribute("recomends"); 141 | %> 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 |
论文编号题目作者来源发表时间下载量
${recomend.pid}${recomend.title}${recomend.author}${recomend.source}${recomend.date}${recomend.downCnt}
153 |
154 | 155 | 156 |
157 | 158 | 159 |
160 | 161 | 162 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | -------------------------------------------------------------------------------- /web/htmls/login.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" contentType="text/html; charset=UTF-8" 2 | pageEncoding="UTF-8" %> 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 中工知网 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 28 | 29 | 30 | 31 | 35 | 36 | 58 | 59 | 60 | 61 | 62 |
63 |

登录

64 |
65 |
68 | 69 |
70 | 71 | 72 | 73 | 74 | 75 |
76 | 79 |
80 | 81 |

${status}

82 |
83 | 84 |
85 | 86 | 87 | 88 | 89 | 90 | 91 | -------------------------------------------------------------------------------- /web/htmls/paper.jsp: -------------------------------------------------------------------------------- 1 | <%@ page import="entity.Paper" %> 2 | <%@ page import="java.util.ArrayList" %> 3 | <%@ page import="java.util.Vector" %> 4 | <%@ page import="util.ItemSimilarity" %> 5 | <%@ page language="java" contentType="text/html; charset=UTF-8" 6 | pageEncoding="UTF-8" %> 7 | <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 中工知网 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 34 | 35 | 36 | 37 | 41 | 42 | 43 | 44 | 45 | 46 | 85 | 86 |
87 | 88 | 89 |
90 |

欢迎来到中国知网

91 |

在这里希望你能找到您想要的一切

92 |
93 | 96 |
97 |

摘要

98 |

${paper.digest}

99 |

作者

100 |

${paper.author}

101 |

所在机构

102 |

${paper.place}

103 |

出版时间

104 |

${paper.date}

105 |

论文编号

106 |

${paper.pid}

107 |

喜欢数量

108 |

${paper.cnt}

109 |

喜欢数量

110 |

${paper.downCnt}

111 |
112 | 113 | 116 | 117 |

118 | 119 | 128 |

129 | 130 | 131 | 132 | 133 | 136 |
137 |
138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | <% 148 | ArrayList recomends = (ArrayList) ItemSimilarity.recommend(Integer.parseInt(request.getParameter("pid"))); 149 | request.setAttribute("recomends", recomends); 150 | %> 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 |
论文编号题目作者来源发表时间下载量
${recomend.pid}${recomend.title}${recomend.author}${recomend.source}${recomend.date}${recomend.downCnt}
162 |
163 | 164 | 165 |
166 | 167 | 168 |
169 | 170 | 171 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | -------------------------------------------------------------------------------- /web/htmls/register.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" contentType="text/html; charset=UTF-8" 2 | pageEncoding="UTF-8" %> 3 | 4 | 5 | 6 | 7 | 中工知网 8 | 9 | 10 | 11 | 14 | 15 | 16 | 17 | 18 |
19 |
20 |
21 | 22 | 23 |
24 |
25 |

注册申请

26 |

注:*为必填内容

27 |
28 |
29 | 账号信息 30 | 31 | 32 |
33 | 34 | 35 |
36 | 37 | 38 |
45 | 46 | 47 | 48 |
49 | 50 | 51 |
52 |
53 | 54 |
55 | 56 | 57 |
58 |
59 | 60 | 61 |

${message}

62 |
63 |
64 |
65 |
66 | 67 | -------------------------------------------------------------------------------- /web/thtml/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SupritYoung/zutki/351b194a5306debe944ce921585c255e9f3e7214/web/thtml/1.jpg -------------------------------------------------------------------------------- /web/thtml/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SupritYoung/zutki/351b194a5306debe944ce921585c255e9f3e7214/web/thtml/2.jpg -------------------------------------------------------------------------------- /web/thtml/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SupritYoung/zutki/351b194a5306debe944ce921585c255e9f3e7214/web/thtml/3.jpg -------------------------------------------------------------------------------- /web/thtml/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SupritYoung/zutki/351b194a5306debe944ce921585c255e9f3e7214/web/thtml/4.jpg -------------------------------------------------------------------------------- /web/thtml/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SupritYoung/zutki/351b194a5306debe944ce921585c255e9f3e7214/web/thtml/5.jpg -------------------------------------------------------------------------------- /web/thtml/button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SupritYoung/zutki/351b194a5306debe944ce921585c255e9f3e7214/web/thtml/button.png -------------------------------------------------------------------------------- /web/thtml/classify.jsp: -------------------------------------------------------------------------------- 1 | <%@ page import="entity.Paper" %> 2 | <%@ page import="java.util.Vector" %> 3 | <%@ page import="java.util.List" %> 4 | 5 | <%@ page language="java" contentType="text/html; charset=UTF-8" 6 | pageEncoding="UTF-8" %> 7 | <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 8 | 9 | 10 | 11 | 12 | 13 | 中工知网 14 | 15 | 16 | 157 | 158 | 159 | 160 | 161 | 162 |
163 | 164 |
165 | 166 |
167 |
168 |
    169 |
  • 经济
  • 171 |
  • 信息
  • 172 |
  • 医药
  • 173 |
  • 社科
  • 174 |
  • 农业
  • 175 |
  • 理工
  • 176 |
  • 人文
  • 177 |
  • 工程
  • 178 |
  • 高级检索
  • 179 |
  • 登录
  • 180 |
  • 注册
  • 181 |
  • 欢迎登录
  • 182 | 183 | 194 |
195 |
196 | 197 |
198 | 199 |
200 | 205 | 206 | 207 |
208 | 209 | 210 |

搜索结果

211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | <% 221 | List papers = (List) request.getAttribute("papers"); 222 | %> 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 |
论文编号题名作者来源发表时间下载量
${papers.pid}${papers.title}${papers.author}${papers.source}${papers.date}${papers.downCnt}
234 |
235 | 236 |
237 |
238 | 239 | 240 | -------------------------------------------------------------------------------- /web/thtml/header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SupritYoung/zutki/351b194a5306debe944ce921585c255e9f3e7214/web/thtml/header.png -------------------------------------------------------------------------------- /web/thtml/index.jsp: -------------------------------------------------------------------------------- 1 | <%@ page import="entity.Paper" %> 2 | <%@ page import="java.util.ArrayList" %> 3 | <%@ page import="java.util.Vector" %> 4 | <%@ page language="java" contentType="text/html; charset=UTF-8" 5 | pageEncoding="UTF-8" %> 6 | <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 7 | 8 | 9 | 10 | 11 | 12 | 中工知网 13 | 14 | 15 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 |
167 | 168 |
169 | 170 |
171 |
172 |
    173 |
  • 首页
  • 174 |
  • 经济
  • 175 |
  • 信息
  • 176 |
  • 医药
  • 177 |
  • 社科
  • 178 |
  • 农业
  • 179 |
  • 理工
  • 180 |
  • 人文
  • 181 |
  • 工程
  • 182 |
  • 高级检索
  • 183 |
  • 登录
  • 184 |
  • 注册
  • 185 |
  • 欢迎登录
  • 186 | 187 | 198 |
199 |
200 | 201 |
202 | 203 |
204 | 209 | 210 | 211 |
212 | 213 | 214 |
215 |
216 | 1 217 | 1 218 | 2 219 | 3 220 | 4 221 | 5 222 | 5 223 |
224 |
225 | 226 | 227 | 228 | 229 | 230 |
231 | 232 | 233 |
234 | 319 | 320 |     321 | 322 |
323 |

为您推荐

324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | <% 334 | ArrayList recomends = (ArrayList) request.getAttribute("recomends"); 335 | %> 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 |
论文编号题名作者来源发表时间下载量
${recomend.pid}${recomend.title}${recomend.author}${recomend.source}${recomend.date}${recomend.downCnt}
349 |
350 | 351 |
352 |

最新发表

353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | <% 363 | Vector papers = (Vector) request.getAttribute("papers"); 364 | %> 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 |
论文编号题名作者来源作者下载量
${paper.pid}${paper.title}${paper.author}${paper.source}${paper.date}${paper.downCnt}
376 |
377 |
378 |
379 | 380 | 381 | 382 | -------------------------------------------------------------------------------- /web/thtml/login.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" contentType="text/html; charset=UTF-8" 2 | pageEncoding="UTF-8"%> 3 | 4 | 5 | 6 | 7 | 8 | 中工知网 9 | 10 | 11 | 12 |
13 | 账号:
14 | 密码:
15 | 16 |

${status}

17 |
18 | 19 | -------------------------------------------------------------------------------- /web/thtml/mark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SupritYoung/zutki/351b194a5306debe944ce921585c255e9f3e7214/web/thtml/mark.png -------------------------------------------------------------------------------- /web/thtml/paper.jsp: -------------------------------------------------------------------------------- 1 | <%@ page import="entity.Paper" %> 2 | <%@ page import="java.util.Vector" %> 3 | <%@ page language="java" contentType="text/html; charset=UTF-8" 4 | pageEncoding="UTF-8"%> 5 | <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 6 | 7 | 8 | 9 | 10 | 11 | 中工知网 12 | 13 | 14 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 |
93 | 94 |
95 | 96 |
97 |
98 |
    99 |
  • 首页
  • 100 |
  • 经济
  • 101 |
  • 信息
  • 102 |
  • 医药
  • 103 |
  • 社科
  • 104 |
  • 农业
  • 105 |
  • 理工
  • 106 |
  • 人文
  • 107 |
  • 工程
  • 108 |
  • 高级检索
  • 109 |
  • 登录
  • 110 |
  • 注册
  • 111 |
  • 欢迎登录
  • 112 | 113 | 124 |
125 |
126 | 127 |
128 | 129 |
130 | 135 | 136 | 137 |
138 |
139 |
140 |

${paper.title}

141 |

摘要:


142 | 143 | ${paper.digest} 144 | 145 |

论文id:

146 | ${paper.pid} 147 | 148 |

下载量:

149 | ${paper.downCnt} 150 | 151 |

喜欢人数:

152 | ${paper.cnt} 153 |
154 | 155 | 156 | 165 |
166 | 167 | 168 |
169 |
170 | 171 | 172 | -------------------------------------------------------------------------------- /web/thtml/regist.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" contentType="text/html; charset=UTF-8" 2 | pageEncoding="UTF-8"%> 3 | 4 | 5 | 6 | 7 | 中工知网 8 | 9 | 10 | 11 | 14 | 15 | 16 | 17 | 18 |
19 |
20 |
21 | 22 | 23 |
24 |
25 |

注册申请

26 |

注:*为必填内容

27 |
28 |
29 | 账号信息 30 | 31 | 32 |
33 | 34 | 35 |
36 | 37 | 38 |
45 | 46 | 47 | 48 |
49 | 50 | 51 |
52 |
53 | 54 |
55 | 56 | 57 |
58 |
59 | 60 | 61 |

${message}

62 |
63 |
64 |
65 |
66 | 67 | -------------------------------------------------------------------------------- /web/thtml/sjd.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SupritYoung/zutki/351b194a5306debe944ce921585c255e9f3e7214/web/thtml/sjd.jpg -------------------------------------------------------------------------------- /web/thtml/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SupritYoung/zutki/351b194a5306debe944ce921585c255e9f3e7214/web/thtml/user.png -------------------------------------------------------------------------------- /zutki.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | --------------------------------------------------------------------------------