当前位置:   article > 正文

69-记单词软件及网站开发(一)_写一个背单词网站

写一个背单词网站

       本人曾今英语渣渣,现在依然是!!!但是也想学好英语,学好英语得记单词呀。于是引出了记单词的需求,市场上这么多单词软件还不够你用吗?非得作死自己搞一个,用室友的话说:这是对技术的追求!狗屁,哪那么闲啊,主要是别人的软件用着总会感觉有不合适的地方,所以如果按照自己的需求设计一款记单词软件和网站,你就别找借口不想记单词是因为别人的软件要收钱或者不好用!!!

      需求很明确了,就是设计一款按自己需求的软件记单词。

源码:https://download.csdn.net/download/qq_39451578/88839400

本人需求

1.包含记单词功能;

2.单词库初步包含恋念有词(2019版),其实与2020差别好像不大;

3.具备发音、加入单词本功能(这里就必须要登入了)。

4.成品:网站、webAPP(就是将网站用HBuilder打包为安卓应用),所以其实做网页版就够了。

如果大家有什么好的建议,请在下方评论!

开发设计:

1.技术:前端使用webApp模板,后端使用 ssm 框架;

2.数据库:mysql;

3.先构建网页版,后面用 将网站利用hbuilder打包为安卓app 即可。

数据库设计(目前,后面根据需求完善):

1.用户表;

2.单词表;

3.生词表;

4.每本单词书的各个单元数量统计视图;

5.生词和单词视图视图;

源码附上:

  1. /*用户表*/
  2. DROP TABLE IF EXISTS `user`;
  3. CREATE TABLE user(
  4. id int(11) auto_increment primary key,
  5. username varchar(20) not null unique comment "登录名",
  6. password varchar(20) not null comment "密码",
  7. phone varchar(15) comment "联系电话",
  8. level int(2) comment "用户权限: 0 普通用户; 1 VIP用户",
  9. motto varchar(255) comment "座右铭",
  10. create_time timestamp default current_timestamp
  11. )engine=InnoDB auto_increment=1 default charset=utf8;
  12. /* 生词本 */
  13. DROP TABLE IF EXISTS `wordbook`;
  14. CREATE TABLE wordbook(
  15. id int(11) auto_increment primary key,
  16. wid int(11) comment "单词id",
  17. uid int(11) comment "用户id",
  18. remember int(3) default 5 comment "用户记忆等级",
  19. create_time timestamp default current_timestamp
  20. )engine=InnoDB auto_increment=1 default charset=utf8;
  21. /* 单词 */
  22. --DROP TABLE IF EXISTS `word`;
  23. CREATE TABLE word (
  24. id int(11) NOT NULL AUTO_INCREMENT,
  25. name varchar(50) NOT NULL comment "单词",
  26. mean varchar(250) NOT NULL comment "含义",
  27. voice_en varchar(100) comment "英式发音",
  28. voice_am varchar(100) comment "美式发音",
  29. unit int(11) NOT NULL comment "所属单元",
  30. bookname varchar(50) NOT NULL comment "所属单词书",
  31. PRIMARY KEY (id)
  32. ) ENGINE=InnoDB auto_increment=1 default charset=utf8;
  33. /* 每本单词书的各个单元数量统计 */
  34. create view v_unitword_num
  35. select bookname, unit, count(id) as num
  36. from word word
  37. group by bookname, unit;
  38. /* 生词和单词视图 */
  39. create view v_wordbook_word as
  40. SELECT
  41. a.id,
  42. wid,
  43. uid,remember,
  44. create_time,
  45. name,
  46. mean,
  47. voice_en,
  48. voice_am,
  49. unit,
  50. bookname
  51. FROM `wordbook` a
  52. left JOIN word b on a.wid = b.id;

代码实现:(分小块简单介绍实现的思路,后面会将源码附上给大家参考!)

1.单词从何而来:

我主要目的只获取恋念有词的单词库,我从github找到了资源,地址

可以从上面下载下来,然后存入数据库,怎么存?首先获取的只有单词英文,没有中文意思,所以该怎么办。我是先从取其它网站逐个查询其意思,然后就获得了词库了,但是我只记录了中文意思,没有记录例句啥的!!!当然不可能手动取查询,不然两千多个单词还不要累死呀,我是利用python写了个脚本去做的。得到词库要存入数据库,先构建好数据库的表格,然后我是用python代码自动插入的。

python处理代码如下:

1.main.py

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # @Time : 2019/7/24 14:58
  4. # @Author : ystraw
  5. # @Site :
  6. # @File : main.py
  7. # @Software: PyCharm Community Edition
  8. # @function: 组织所有逻辑
  9. import requests
  10. import random
  11. from bs4 import BeautifulSoup
  12. import time
  13. import random
  14. import re
  15. from urllib import parse
  16. import database_tools
  17. def write(name, context):
  18. with open(name, 'w', encoding='utf-8') as f:
  19. f.write(context)
  20. print('已写入!')
  21. #查询单词,无需登入
  22. def search(word):
  23. # word = 'shared'
  24. #查询连接:
  25. wd = parse.quote(word) #转码:
  26. url = 'http://dict.kekenet.com/en/' + word
  27. # print(url)
  28. response = requests.get(url).text
  29. bs = BeautifulSoup(response, 'lxml')
  30. trans = bs.findAll('div', attrs={'id': 'wordm'} )
  31. moduel = re.compile('<.*?>')
  32. # print(trans[0])
  33. info = ''
  34. try:
  35. st = str(trans[0])
  36. info = re.sub(moduel, '\n', st)
  37. except Exception:
  38. # print(trans)
  39. # print(Exception)
  40. pass
  41. # print(info)
  42. return info
  43. # 从文本获取每单元单词
  44. def getWords(unit):
  45. # 获取单词
  46. print('./words/恋恋有词生词本/unit (' + str(unit) + ').txt')
  47. with open('./words/恋恋有词生词本/unit (' + str(unit) + ').txt', 'rb+') as f:
  48. string = f.read().decode("utf8","ignore")
  49. # print(string)
  50. words = string.split('\n')
  51. # print(words)
  52. return words
  53. if __name__ == '__main__':
  54. # 获取单词
  55. for unit in range(15, 31):
  56. # print(unit)
  57. words = getWords(unit)
  58. # print(words)
  59. words_name = []
  60. words_mean = []
  61. tt = 0
  62. for word in words:
  63. if word != None and word != '' and tt != 0:
  64. words_name.append(word)
  65. word_mean = search(word) # 查询单词含义
  66. words_mean.append(word_mean)
  67. database_tools.myInsert(word, word_mean, unit) # 插入数据库
  68. # time.sleep(1)
  69. # break
  70. tt = 1
  71. print("单词name: ", words_name)
  72. print("单词mean: ", words_mean)
  73. print(len(words_name))
  74. print(len(words_mean))

2.database_tools.py

  1. #!/usr/bin/python3
  2. import pymysql
  3. # 1. 查询:
  4. # 使用 execute() 方法执行 SQL 查询
  5. # cursor.execute("select * from user_inf")
  6. # 使用 fetchone() 方法获取单条数据.
  7. # data = cursor.fetchall()
  8. # print(data)
  9. # 2. 插入:
  10. def myInsert(word_name, word_mean, unit):
  11. # 打开数据库连接
  12. db = pymysql.connect("localhost", "root", "root", "mywords")
  13. # 使用 cursor() 方法创建一个游标对象 cursor
  14. cursor = db.cursor()
  15. try:
  16. #插入:
  17. # sql = "insert into word(word, chinese) values('test', '测试')"
  18. sql = "INSERT INTO `mywords`.`word`(`name`, `mean`, `voice_en`, `voice_am`,`unit`,`bookname`) VALUES ('" + word_name + "' , '"+word_mean+"', NULL, NULL, "+ str(unit) +", '恋恋有词');"
  19. # print(sql)
  20. cursor.execute(sql)
  21. # 提交到数据库执行
  22. db.commit()
  23. # print("finishe!")
  24. except BaseException:
  25. # 如果发生错误则回滚
  26. print('------faile!', word_name)
  27. db.rollback()
  28. # 关闭数据库连接
  29. db.close()

不出意外应该搞好单词库了吧,要想要例句啥的自己修改代码,获取即可。

2.开发网站:

(一)框架搭建:

网站从零开始开发,但是配置文件还是从以前的拷一个吧,也就是找个ssm框架的模板,其配置文件完善的即可,我是用我以前的一个地址

简单说下,如果是使用的我的模板的换,建议新建一个javaweb工程,将除了filter文件外的其余文件请考到新建文件的对应位置,然后修改您的配置文件中部分内容:

1.spring-mvc.xml: 中的base-package配置,

修改为本项目对应即可,也就是你的controller在什么包下就用什么。

    <!-- 1.开启springMVC注解模式 -->
    <context:component-scan
        base-package="com.ctgu.wd.controller" />

2.applicationContext.xml:

base-package包改为您当前的包,例如我的为:

<context:component-scan base-package="com.ctgu" />

3.jdbc.properties:

修改:url中的数据库地址,端口号,需要链接的数据库名称(即本项目建立的数库);

修改:username修改登入名称;

修改:password修改登入密码;

4.web.xml:

最好用我的web.xml覆盖新建项目的web.xml,但是需要注释调:权限过滤器(UserFilter,AdminFilter)的配置,最后提醒目前开发先不用过滤器,到最后项目完成了在打开,并重新配置下即可。

框架搭好了先跑下,能跑通就简单了,后面就是加写实现逻辑了。

(二)代码实现:

1.单词展示与发音:

先实现小的demo吧,即先能实现放一个单词到页面,然后能发音即可,刚开始要求不要太高。

怎么实现?

读音从何而来,两种思路,一种利用单词意思来源相同的思路,去某个网站全部爬下来,然后从本地调用;另一种,比较简单就是直接给个链接取别人那里获取读音,自己玩的话,完全可以,但是如果要真正做自己的软件就不太好,本人追求不高玩玩而已,直接使用了第二中方法。

http://dict.youdao.com/dictvoice?type=1&audio=forklift (英音)

http://dict.youdao.com/dictvoice?type=2&audio=forklift (美音)

http://dict.youdao.com/dictvoice?audio=road%2Broller (词组%2B是链接符号

找到了写了个例子:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  5. <title>Insert title here</title>
  6. <style>
  7. video::-webkit-media-controls-enclosure {
  8. overflow: hidden;
  9. }
  10. video::-internal-media-controls-overflow-button {
  11. display: none !important;
  12. }
  13. video::-webkit-media-controls-mute-button {
  14. display: none !important;
  15. }
  16. </style>
  17. <script src="jquery-3.4.1.min.js"></script>
  18. </head>
  19. <body>
  20. <!-- <video controls="" autoplay="" name="media" > -->
  21. <div>
  22. forklift
  23. <img class="pronounce" src="sound.png" style="background-color: black; cursor: pointer" alt="voice" onclick="play(this)">
  24. <audio src="http://dict.youdao.com/dictvoice?type=2&amp;audio=forklift"></audio>
  25. </div>
  26. <script>
  27. function play(obj) {
  28. $(obj).parent().find("audio").trigger('play');
  29. }
  30. </script>
  31. </body>
  32. </html>

2.界面设计

能实现demo了,后面就是找个好看的webapp模板了,改下界面,把自己的单词弄进去。模板网上很多,有各种模板网站,直接百度一个自己喜欢的,我找的是以前写项目用过的模板,如果需要可以去下载, 地址,界面如下:

     

所以,找一款自己喜欢的前端模板吧,然后就是改改,当然如果要求比较高,并且是前端大佬,那可以自己设计一款。

3.首先实现一个首页的搜索功能吧。

csdn没有代码折叠吗???放上代码好占位置呀!!!

放上我的前端页面,因为很多页面都是共用一个head.jsp和foot.jsp,所以我把他切出来了,代码一并送上:

appHead.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <title>SX</title>
  7. <!-- For-Mobile-Apps-and-Meta-Tags -->
  8. <meta name="viewport" content="width=device-width, initial-scale=1" />
  9. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  10. <meta name="keywords" content="" />
  11. <script type="application/x-javascript"> addEventListener("load", function() { setTimeout(hideURLbar, 0); }, false); function hideURLbar(){ window.scrollTo(0,1); } </script>
  12. <!-- //For-Mobile-Apps-and-Meta-Tags -->
  13. <!-- Custom Theme files -->
  14. <link href="${pwd }/static/app/css/bootstrap.css" type="text/css" rel="stylesheet" media="all">
  15. <link href="${pwd }/static/app/css/style.css" type="text/css" rel="stylesheet" media="all">
  16. <link rel="stylesheet" href="${pwd }/static/app/css/ken-burns.css" type="text/css" media="all" />
  17. <!-- //Custom Theme files -->
  18. <!-- js -->
  19. <script src="${pwd }/static/app/js/jquery-2.2.3.min.js"></script>
  20. <!-- //js -->
  21. <!-- pop-up-box -->
  22. <script src="${pwd }/static/app/js/jquery.magnific-popup.js" type="text/javascript"></script>
  23. <script>
  24. $(document).ready(function() {
  25. $('.popup-top-anim').magnificPopup({
  26. type: 'inline',
  27. fixedContentPos: false,
  28. fixedBgPos: true,
  29. overflowY: 'auto',
  30. closeBtnInside: true,
  31. preloader: false,
  32. midClick: true,
  33. removalDelay: 300,
  34. mainClass: 'my-mfp-zoom-in'
  35. });
  36. });
  37. </script>
  38. <script>
  39. function play(obj) {
  40. $(obj).parent().find("audio").trigger('play');
  41. }
  42. </script>
  43. <!--//pop-up-box -->
  44. <!-- web-fonts -->
  45. <link href='http://fonts.useso.com/css?family=Abel' rel='stylesheet' type='text/css'>
  46. <link href='http://fonts.useso.com/css?family=Roboto:400,100,100italic,300,300italic,400italic,500,500italic,700,700italic,900,900italic' rel='stylesheet' type='text/css'>
  47. <!-- //web-fonts -->
  48. </head>
  49. <body class="bg">
  50. <div class="agile-main">
  51. <div class="menu-wrap" id="style-1">
  52. <nav class="top-nav">
  53. <ul class="icon-list">
  54. <c:if test="${user == null }">
  55. <li class="menu-title"><a herf = "${pwd}/user/login" style = "font-size:20px;">未登入</a></li>
  56. </c:if>
  57. <c:if test="${user != null }">
  58. <li class="menu-title" style="text-align:center;">${user.username } </li>
  59. </c:if>
  60. <li><a class="active" href="${pwd }/index"><i class="glyphicon glyphicon-home"></i> 主页 </a></li>
  61. <li><a href="${pwd }/word/wordbook"><i class="glyphicon glyphicon-info-sign"></i> 单词书 </a></li>
  62. <li><a href="${pwd }/word/newword"><i class="glyphicon glyphicon-briefcase"></i> 生词本 </a></li>
  63. <li><a href="${pwd }/user/personInfo"><i class="glyphicon glyphicon-eye-open"></i> 个人信息 </a></li>
  64. <li><a href="${pwd }/about"><i class="glyphicon glyphicon-picture"></i> 关于 </a></li>
  65. <ul class="nav-sub">
  66. <li><a href="#small-dialog" class="sign-in popup-top-anim"><i class="glyphicon glyphicon-user"></i> login</a></li>
  67. <li><a href="#small-dialog1" class="sign-in popup-top-anim"><i class="glyphicon glyphicon-edit"></i> Sign Up</a></li>
  68. <li><a href="codes.html"><i class="glyphicon glyphicon-list-alt"></i> Short Codes</a></li>
  69. </ul>
  70. <div class="clearfix"> </div>
  71. <script>
  72. $( "li a.menu" ).click(function() {
  73. $( "ul.nav-sub" ).slideToggle( 300, function() {
  74. // Animation complete.
  75. });
  76. });
  77. </script>
  78. </li>
  79. </ul>
  80. </nav>
  81. <button class="close-button" id="close-button">C</button>
  82. </div>
  83. <div class="content-wrap">
  84. <div class="header">
  85. <div class="menu-icon">
  86. <button class="menu-button" id="open-button">O</button>
  87. </div>
  88. <div class="logo">
  89. <h2><a href="${pwd}/index">SX</a></h2>
  90. </div>
  91. <div class="login">
  92. <c:if test="${user == null }">
  93. <a href="#small-dialog" class="sign-in popup-top-anim">
  94. <span class="glyphicon glyphicon-user"></span>
  95. </a>
  96. </c:if>
  97. <c:if test="${user != null }">
  98. <a href = "${pwd}/user/logout" style = "font-size:20px; color:#fff;">退出</a>
  99. <%-- <li class="menu-title" style="text-align:center;">${user.username } </li> --%>
  100. </c:if>
  101. <!-- modal -->
  102. <div id="small-dialog" class="mfp-hide">
  103. <div class="login-modal">
  104. <div class="booking-info">
  105. <h3><a href="main.html">用户登陆</a></h3>
  106. </div>
  107. <!-- 用户登入 -->
  108. <div class="login-form">
  109. <form action="${pwd}/user/login" method="post">
  110. <div class="styled-input">
  111. <input type="text" name="username" required=""/>
  112. <label>用户名</label>
  113. <span></span>
  114. </div>
  115. <div class="styled-input">
  116. <input type="password" name="password" required="">
  117. <label>密码</label>
  118. <span></span>
  119. </div>
  120. <div class="wthree-text">
  121. <ul>
  122. <li>
  123. <input type="checkbox" id="brand" value="">
  124. <label for="brand"><span></span>记住我?</label>
  125. </li>
  126. <li> <a href="#">忘记密码?</a> </li>
  127. </ul>
  128. <div class="clear"> </div>
  129. </div>
  130. <input type="submit" value="登陆" >
  131. </form>
  132. <p>没有账号?<a href="#small-dialog1" class="sign-in popup-top-anim">注册</a></p>
  133. </div>
  134. </div>
  135. </div>
  136. <!-- //modal -->
  137. <!-- modal-two -->
  138. <!---------------------- 注册 --------------------->
  139. <div id="small-dialog1" class="mfp-hide">
  140. <div class="login-modal">
  141. <div class="booking-info">
  142. <h3><a href="main.html">注册</a></h3>
  143. </div>
  144. <div class="login-form signup-form">
  145. <form action="${pwd}/user/registerInfo" method="post">
  146. <div class="styled-input">
  147. <input type="text" name="username" required=""/>
  148. <label>用户名</label>
  149. <span></span>
  150. </div>
  151. <div class="styled-input">
  152. <input type="password" name="password" required="">
  153. <label>密码</label>
  154. <span></span>
  155. </div>
  156. <div class="styled-input">
  157. <input type="text" name="phone" required=""/>
  158. <label>电话</label>
  159. <span></span>
  160. </div>
  161. <div class="styled-input">
  162. <input type="text" name="motto" required=""/>
  163. <label>座右铭</label>
  164. <span></span>
  165. </div>
  166. <div class="wthree-text">
  167. <input type="checkbox" id="brand1" value="" checked="true">
  168. <label for="brand1"><span></span>我接受使用条款</label>
  169. </div>
  170. <input type="submit" value="Sign Up">
  171. </form>
  172. </div>
  173. </div>
  174. </div>
  175. <!-- //modal-two -->
  176. </div>
  177. <div class="clearfix"> </div>
  178. </div>

appFoot.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!-- //brands -->
  4. <!-- footer -->
  5. <div class="w3agile footer">
  6. <div class="social-icons">
  7. <ul>
  8. <li><a href="#"> </a></li>
  9. <li><a href="#" class="fb"> </a></li>
  10. <li><a href="#" class="gp"> </a></li>
  11. <li><a href="#" class="drb"> </a></li>
  12. </ul>
  13. <div class="clearfix"> </div>
  14. </div>
  15. <div class="footer-nav">
  16. <ul>
  17. <li><a href="#"> Home </a></li>
  18. <li><a href="#"> About </a> </li>
  19. <li><a href="#"> Properties </a></li>
  20. <li><a href="#"> Gallery</a></li>
  21. <li><a href="#"> Contact </a></li>
  22. </ul>
  23. <div class="clearfix"> </div>
  24. </div>
  25. <div class="footer-text">
  26. <p>Copyright &copy; 2019.YSTRAW.</p>
  27. </div>
  28. </div>
  29. </div>
  30. </div>
  31. </div>
  32. <!-- menu-js -->
  33. <script src="${pwd }/static/app/js/classie.js"></script>
  34. <script src="${pwd }/static/app/js/main.js"></script>
  35. <!-- //menu-js -->
  36. <!-- nice scroll-js -->
  37. <script src="${pwd }/static/app/js/jquery.nicescroll.min.js"></script>
  38. <script>
  39. $(document).ready(function() {
  40. var nice = $("html").niceScroll(); // The document page (body)
  41. $("#div1").html($("#div1").html()+' '+nice.version);
  42. $("#boxscroll").niceScroll({cursorborder:"",cursorcolor:"#00F",boxzoom:true}); // First scrollable DIV
  43. });
  44. </script>
  45. <!-- //nice scroll-js -->
  46. <!-- Bootstrap core JavaScript
  47. ================================================== -->
  48. <!-- Placed at the end of the document so the pages load faster -->
  49. <script src="${pwd }/static/app/js/bootstrap.js"></script>

searchReasult.jsp

  1. <%@ include file="../baseFrame/appHead.jsp"%>
  2. <%@ page language="java" contentType="text/html; charset=UTF-8"
  3. pageEncoding="UTF-8"%>
  4. <script type="text/javascript">
  5. function addword(id) {
  6. var params = {id: id};
  7. url = '${pwd}/word/addword';
  8. $.post(url,params,function(data){
  9. // alert(data);//这个data就是返回的数据
  10. if (data == "1") {
  11. alert("添加成功!");
  12. }
  13. else if(data == "3"){
  14. alert("您已经添加过,无需再次添加!");
  15. }
  16. else{
  17. alert("您尚未登入!" );
  18. }
  19. });
  20. return false;
  21. }
  22. </script>
  23. <!----------------主页内容-------------------- -->
  24. <div class="content">
  25. <div class="container">
  26. <div class="row" style="padding: 5px 10px;">
  27. <table class="table table-striped text-center">
  28. <caption style="text-align:center">查找结果</caption>
  29. <tbody>
  30. <c:if test="${flag == 1}">
  31. <tr>
  32. <td>恋念有词中暂无此单词,<a href="https://www.baidu.com/s?wd=${word}">百度一下</a></td>
  33. </tr>
  34. </c:if>
  35. <c:if test="${flag == 0}">
  36. <tr>
  37. <td style="text-align:left"><div>
  38. ${word.name } &nbsp;
  39. <img class="pronounce" src="${pwd }/static/images/sound.gif" style="background-color: black; cursor: pointer;" alt="voice" onclick="play(this)">
  40. <audio src="http://dict.youdao.com/dictvoice?type=2&amp;audio=${word.name }"></audio>
  41. &nbsp;
  42. <img class="pronounce" src="${pwd }/static/images/addword.gif" style="cursor:pointer" alt="addword" onclick="addword('test')">
  43. </div>
  44. </td>
  45. </tr>
  46. <tr>
  47. <td style="text-align:left">
  48. ${word.mean }
  49. </td>
  50. </tr>
  51. </c:if>
  52. </tbody>
  53. </table>
  54. </div>
  55. </div>
  56. <!-- foot -->
  57. <%@ include file="../baseFrame/appFoot.jsp"%>
  58. </body>
  59. </html>

我建立一个WordController.java 用来控制单词相关的逻辑:

搜索相关的代码如下:

  1. /**
  2. * 查找单词
  3. *
  4. * @param model
  5. * @return
  6. */
  7. @RequestMapping("/search")
  8. public String Search( Model model, @RequestParam("word") String wd) {
  9. // 查词
  10. Word word = wordService.findByName(wd);
  11. if(word == null) {
  12. model.addAttribute("flag", 1);
  13. model.addAttribute("word", wd);
  14. }
  15. else {
  16. word.setMean(word.getMean().replace("\n", "<br>"));
  17. model.addAttribute("word", word);
  18. model.addAttribute("flag", 0);
  19. }
  20. return "app/searchReasult";
  21. }

需要注意的是,我是从数库中查找前端页面传过来得单词,从我的恋念有词库,所以问题来了:

1.可能没有该单词,所以我就将其返回值的flag标记为1,在前端提示词库暂时没有,并给以百度该词的链接。

2.查询的词词库不止一条,所以写sql语句时要注意,只返回一条即可,即用 limit 1 限制一下。

    // 根据name查询和删除
    @Select("select * from "+ "word" +" where name = #{name} limit 1")
    Word findByName(String name);

结果如下:

4.搜索功能写完了,写个单词书页面把。

wordbook.jsp

  1. <%@ include file="../baseFrame/appHead.jsp"%>
  2. <%@ page language="java" contentType="text/html; charset=UTF-8"
  3. pageEncoding="UTF-8"%>
  4. <!----------------单词书-------------------- -->
  5. <div class="content">
  6. <div class="container">
  7. <div class="row" style="padding: 5px 10px;">
  8. <table class="table table-striped text-center">
  9. <caption style="text-align:center; font-size:25px; color:#0f0;">${unitword_num[0].bookname }</caption>
  10. <thead>
  11. <tr>
  12. <th class="text-center">单元</th>
  13. <th class="text-center">单词数量</th>
  14. </tr>
  15. </thead>
  16. <tbody>
  17. <c:forEach items="${unitword_num }" var="uwn">
  18. <tr>
  19. <td><P><a href = "${pwd }/word/wordList?unit=${uwn.unit }">${uwn.bookname } &nbsp; unit${uwn.unit } &nbsp;&nbsp;</td>
  20. <td>单词数量:${uwn.num } </a></P></td>
  21. </tr>
  22. </c:forEach>
  23. </tbody>
  24. </table>
  25. </div>
  26. </div>
  27. <!-- foot -->
  28. <%@ include file="../baseFrame/appFoot.jsp"%>
  29. </body>
  30. </html>

WordController.jsp:

  1. /**
  2. *
  3. * 返回对应单词书的指定单元的单词
  4. *
  5. * @param model
  6. * @param unit
  7. * @return
  8. */
  9. @RequestMapping("/wordList")
  10. public String WordList( Model model, @RequestParam("unit") Integer unit) {
  11. // // 查询数据库单词
  12. // List<Word> words = wordService.findAllWord();
  13. // System.out.println("数据库单词:" + words);
  14. // // 查询指定单元的指定书籍单词
  15. String bookname = "恋恋有词";
  16. Word word = new Word();
  17. word.setUnit(unit);
  18. word.setBookname(bookname);
  19. List<Word> words = wordService.findWordBySome(word);
  20. // System.out.println("数据库单词:" + words);
  21. model.addAttribute("words", words);
  22. model.addAttribute("unit", unit);
  23. return "app/wordList";
  24. }

结果图,如下所以:

5.显示每个单元的单词:

wordList.jsp

  1. <%@ include file="../baseFrame/appHead.jsp"%>
  2. <%@ page language="java" contentType="text/html; charset=UTF-8"
  3. pageEncoding="UTF-8"%>
  4. <%-- <script src="${pwd }/static/bs/jquery-3.4.1.min.js"></script> --%>
  5. <script type="text/javascript">
  6. function addword(id) {
  7. var params = {id: id};
  8. url = '${pwd}/word/addword';
  9. $.post(url,params,function(data){
  10. // alert(data);//这个data就是返回的数据
  11. if (data == "1") {
  12. alert("添加成功!");
  13. }
  14. else if(data == "3"){
  15. alert("您已经添加过,无需再次添加!");
  16. }
  17. else{
  18. alert("您尚未登入!" );
  19. }
  20. });
  21. return false;
  22. }
  23. </script>
  24. <!----------------单词列表-------------------- -->
  25. <div class="content">
  26. <div class="container">
  27. <div class="row" style="padding: 5px 10px;">
  28. <table class="table table-striped text-center">
  29. <caption style="text-align:center"><a href="${pwd }/word/wordbook">unit${unit }单词</a></caption>
  30. <!-----单词列表--- -->
  31. <tbody>
  32. <c:forEach items="${words }" var="word">
  33. <tr>
  34. <td width="40%">
  35. <div>
  36. ${word.name }
  37. <img class="pronounce" src="${pwd }/static/images/sound.gif" style="background-color: black; cursor: pointer;" alt="voice" onclick="play(this)">
  38. <audio src="http://dict.youdao.com/dictvoice?type=2&amp;audio=${word.name }"></audio>
  39. &nbsp;
  40. <img class="pronounce" src="${pwd }/static/images/addword.gif" style="cursor:pointer" alt="addword" onclick="addword(${word.id})">
  41. </div>
  42. </td>
  43. <%-- <td>${word.mean }</td> --%>
  44. <td><label id = "1" onclick="ishow(this);" data-text = "${word.mean }" >点击查看</label></td>
  45. </tr>
  46. </c:forEach>
  47. </tbody>
  48. </table>
  49. </div>
  50. </div>
  51. <script>
  52. function ishow(obj){
  53. // alert(obj.innerHTML); // 获取当前标签值
  54. // alert($(obj).data("text")); // 获取标签存放的值
  55. // var test = obj.getAttribute("data-text");
  56. alert(obj.innerHTML + ";" + test);
  57. // obj.setAttribute("data-text", obj.innerHTML);
  58. // obj.innerHTML = test;
  59. var t = obj.innerHTML;
  60. obj.innerHTML = $(obj).data("text");
  61. $(obj).data("text", t);
  62. }
  63. </script>
  64. <!-- foot -->
  65. <%@ include file="../baseFrame/appFoot.jsp"%>
  66. </body>
  67. </html>

WordController.java:

下面包括展示单词,和接受收藏单词的代码

  1. /**
  2. *
  3. * 返回对应单词书的指定单元的单词
  4. *
  5. * @param model
  6. * @param unit
  7. * @return
  8. */
  9. @RequestMapping("/wordList")
  10. public String WordList( Model model, @RequestParam("unit") Integer unit) {
  11. // // 查询数据库单词
  12. // List<Word> words = wordService.findAllWord();
  13. // System.out.println("数据库单词:" + words);
  14. // // 查询指定单元的指定书籍单词
  15. String bookname = "恋恋有词";
  16. Word word = new Word();
  17. word.setUnit(unit);
  18. word.setBookname(bookname);
  19. List<Word> words = wordService.findWordBySome(word);
  20. // System.out.println("数据库单词:" + words);
  21. model.addAttribute("words", words);
  22. model.addAttribute("unit", unit);
  23. return "app/wordList";
  24. }
  1. /**
  2. *
  3. * 添加单词到单词本
  4. *
  5. * @param model
  6. * @param word
  7. * @return
  8. */
  9. @ResponseBody
  10. @RequestMapping("/addword")
  11. public String Addword( Model model, @RequestParam("id") Integer id) {
  12. User user = (User) session.getAttribute("user");
  13. if(user == null) {
  14. return "2";
  15. // return "您尚未登入";
  16. }
  17. // System.out.println("用户:" + user.toString());
  18. Wordbook wb = new Wordbook();
  19. wb.setRemember(5); // 默认的单词等级
  20. wb.setUid(user.getId());
  21. wb.setWid(id);
  22. List<Wordbook> wb2 = wordbookService.findWordbookBySome(wb);
  23. if(wb2.size() > 0) {
  24. return "3";
  25. // return "您已经添加过,无需再次添加!";
  26. }
  27. wordbookService.addWordbook(wb);
  28. return "1";
  29. }

注意:这里前端设计的中设计到一个功能,就是点击可以隐藏单词含义,并且再次点击又可以显示单词含义,这里我的写的js是利用了标签的data-  属性来实现的,也就是刚开始分别将单词含义和点击查看分别存在标签的data-text和标签的html中,点击时,将被点击的标签对象传入函数,然后就是交换两者之间的内容了,很简单的。

结果页面如下所示:

6.显示收藏的单词:

前端页面和后端处理代码如下:

newWordList.jsp

  1. <%@ include file="../baseFrame/appHead.jsp"%>
  2. <%@ page language="java" contentType="text/html; charset=UTF-8"
  3. pageEncoding="UTF-8"%>
  4. <script src="${pwd }/static/bs/jquery-3.4.1.min.js"></script>
  5. <script type="text/javascript">
  6. function delword(id, obj) {
  7. var params = {id: id};
  8. url = '${pwd}/word/delword';
  9. $.post(url,params,function(data){
  10. // alert(data);//这个data就是返回的数据
  11. if (data == "1") {
  12. alert("删除成功!");
  13. var index=obj.parentNode.rowIndex;
  14. var table = document.getElementById("table");
  15. table.deleteRow(index);
  16. }
  17. else if(data == "2"){
  18. alert("您尚未登入");
  19. }
  20. else{
  21. alert("您未添加该单词!");
  22. }
  23. });
  24. return false;
  25. }
  26. </script>
  27. <!----------------收藏的生单词列表-------------------- -->
  28. <div class="content">
  29. <div class="container">
  30. <div class="row" style="padding: 5px 10px;">
  31. <table id="table" class="table table-striped text-center">
  32. <caption style="text-align:center"><a href="#">收藏单词列表</a></caption>
  33. <!-----单词列表--- -->
  34. <tbody id = "tbody">
  35. <c:forEach items="${newwordlist }" var="word" varStatus="status">
  36. <tr>
  37. <td width="40%">
  38. <div>
  39. ${word.name }
  40. <img class="pronounce" src="${pwd }/static/images/sound.gif" style="background-color: black; cursor: pointer;" alt="voice" onclick="play(this)">
  41. <audio src="http://dict.youdao.com/dictvoice?type=2&amp;audio=${word.name }"></audio>
  42. &nbsp;
  43. <img class="pronounce" src="${pwd }/static/images/delword.gif" style="cursor:pointer" alt="addword" onclick="delword(${word.id}, this)">
  44. </div>
  45. </td>
  46. <%-- <td>${word.mean }</td> --%>
  47. <td><label id = "1" onclick="ishow(this);" data-text = "${word.mean }" >点击查看</label></td>
  48. </tr>
  49. </c:forEach>
  50. </tbody>
  51. </table>
  52. </div>
  53. </div>
  54. <script>
  55. function ishow(obj){
  56. // alert(obj.innerHTML); // 获取当前标签值
  57. // alert($(obj).data("text")); // 获取标签存放的值
  58. // var test = obj.getAttribute("data-text");
  59. alert(obj.innerHTML + ";" + test);
  60. // obj.setAttribute("data-text", obj.innerHTML);
  61. // obj.innerHTML = test;
  62. var t = obj.innerHTML;
  63. obj.innerHTML = $(obj).data("text");
  64. $(obj).data("text", t);
  65. }
  66. </script>
  67. <!-- foot -->
  68. <%@ include file="../baseFrame/appFoot.jsp"%>
  69. </body>
  70. </html>

WordController.java:

  1. /**
  2. *
  3. * 删除单词本中的指定单词
  4. *
  5. * @param model
  6. * @param word
  7. * @return
  8. */
  9. @ResponseBody
  10. @RequestMapping("/delword")
  11. public String Delword( Model model, @RequestParam("id") Integer id) {
  12. User user = (User) session.getAttribute("user");
  13. if( user == null) {
  14. return "2";
  15. // return "您尚未登入";
  16. }
  17. try {
  18. wordbookService.deleteById(id);
  19. } catch (Exception e) {
  20. return "3";
  21. // return "您没有添加改单词!";
  22. }
  23. return "1";
  24. }
  25. /**
  26. *
  27. * 返回收藏的单词
  28. *
  29. * @param model
  30. * @param unit
  31. * @return
  32. */
  33. @RequestMapping("/newword")
  34. public String Wewword( Model model) {
  35. User user = (User) session.getAttribute("user");
  36. if( user == null) {
  37. return "2";
  38. // return "您尚未登入";
  39. }
  40. // 查询本用户生词
  41. V_wordbook_word v_wordbook_word = new V_wordbook_word();
  42. v_wordbook_word.setUid(user.getId());
  43. List<V_wordbook_word> newwordlist = v_wordbook_wordService.findV_wordbook_wordBySome(v_wordbook_word);
  44. model.addAttribute("newwordlist", newwordlist);
  45. return "app/newWordList";
  46. }

返回收藏的单词,我从视图中查找的数据,并封装了一个对应的对象,这样直接传到前端比较好处理。

至此,我目前的开发过程和内容已经说完了,并已经放到了服务器上,大家有兴趣可以玩玩吧(趁它还没到期),地址

功能目前就上面这么多(用户的登入注册有,那个就懒得写了),对本软件有什么想法的可以留言!

源码:https://download.csdn.net/download/qq_39451578/88839400

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/205464
推荐阅读
相关标签
  

闽ICP备14008679号