网络编程—投票系统和在线交流系统

题目一 投票系统

1.1 题目需求

      功能要求:界面标题“欢迎给厦门理工学院班干部投票”;显示班干部的学号、姓名、得票数;表格的第四列有投票链接;实现防止刷票功能。

1.2 系统设计

1.2.1 系统框架

(1)系统开发环境:

①开发语言和框架:使用Java编程语言,并结合Web框架来快速构建系统。

②后端服务器环境:使用Web服务器,结合应用服务器Tomcat来提供服务。

③数据库管理系统:选择适合的数据库管理系统MySQL。数据库字段的设计采用了JPA提供的标准:元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中。

④前端开发环境:使用HTML和JavaScript技术进行开发来提供用户友好的交互。

⑤集成开发环境:选择合适的集成开发环境MyEclipse来辅助开发工作。

(2)系统网络结构:

①前端界面:设计一个用户友好的前端界面,包括标题栏、表格等元素。在界面上显示"欢迎给厦门理工学院班干部投票"作为标题。

②后端服务器:建立一个后端服务器,用于处理前端发起的请求,并提供数据存储和计算相关功能。

③数据库:在后端服务器中设置数据库,用于存储班干部的学号、姓名、得票数等信息。

④后端逻辑:编写后端逻辑代码,包括处理用户投票请求、更新数据库中的得票数据、生成投票链接等功能。此处还包含防止刷票的功能,通过填写学号(唯一性)、密码信息减少刷票行为。

⑤投票链接生成:为每个班干部生成唯一的投票链接,并将链接保存在数据库中的第四列中,以便前端界面显示。

⑥安全性保护:对系统进行安全防护,通过身份验证的措施,以保护用户的投票数据和系统的安全性。

系统导图

1.2.2 界面设计

(1)登录界面:通过学号(唯一性)和密码登录投票系统。

loginForm.jsp: 

<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<html> 
  <body>
     	★★欢迎你登录投票系统★★
    <form action="loginAction.jsp" name="form1" method="post">
    	输入账号:<input name="account" type="text"><BR>
    	输入密码:<input name="password" type="password">   	
    	<input type="submit" value="登录" >
    </form>   
  </body>
</html>

(2)投票界面:点击第四列“投票”按钮进行投票。

display.jsp: 

<%@ page language="java" import="java.sql.*" pageEncoding="gb2312"%>
<%@ include file="db.inc" %>
<html>
  <body>
  <table align="center">
  	<caption>欢迎给厦门理工学院最优秀班干部投票(每人仅投一票)</caption>
   <tr bgcolor="yellow">
   	<td>学号</td>
   	<td>姓名</td>
   	<td>得票数</td>
   	<td>投票</td>
   </tr>
   <%	
   		Connection conn = getConnection();
   		Statement stat = conn.createStatement();
		String sql = 
		"SELECT sno,sname,vote FROM S_VOTE";
		ResultSet rs = stat.executeQuery(sql);
		while(rs.next()){
			String sno = rs.getString("sno");
			String sname = rs.getString("sname");
			int vote = rs.getInt("vote");
	%>
		<tr bgcolor="pink">
   		<td><%=sno %></td>
   		<td><%=sname %></td>
   		<td><img src="img/bar.jpg" width="<%=vote%>" height="10"> <%=vote%></td>
   		<td><a href="vote.jsp?sno=<%=sno%>">投票</a></td>
   		</tr>
	<%		
		}
		stat.close();
		conn.close();
	%>
   </table>
  </body>
</html>

1.2.3 数据库设计

(1)S_VOTE表:储存了如下所示的厦门理工学院被投票班干部的基本信息。

字段

数据类型

可否为空

说明

sno

varchar(20)

NO

主键学号

sname

Varchar(20)

NO

被投票者姓名

vote

Int(11)

NO

得票数

(2)S_login表:储存了如下所示的厦门理工学院学生的基本信息:学号、密码,通过学号的唯一性实现防止刷票。

字段

数据类型

可否为空

说明

account

varchar(11)

NO

主键学号

password

varchar(11)

NO

密码

q

varchar(11)

NO

初始值为0,登录一次后加1,禁止进入再次系统,防止刷票

1.3 系统实现

1.3.1 模块定义

名  称

作  用

display.jsp

连接数据库,查询学生学号、姓名、得票数
显示学生学号、姓名、得票数、“投票”链接

vote.jsp

连接数据库,获取“投票"链接传来的学生学号
将学生学号对应的得票数加1

loginForm.jsp和loginAction.jsp

loginForm.jsp显示登录界面
loginAction.jsp验证登录是否成功
若成功则跳转到display.jsp,失败跳转到error.jsp

error.jsp

显示“已过投票”,防刷票

1.3.2 登录系统

(1)使用学号密码登录,将输入框的账号密码与数据库数据进行比对,一致则登录成功,不一致则显示“账号或者密码错误”后返回登录界面重新登录。仅有校内学生可以进行投票,维护了系统的安全性。

loginAction.jsp:

<%@ page language="java" import="java.sql.*" pageEncoding="gb2312"%>
<%@ include file="db.inc" %>
<html>
  <body> 
  <%
  		String text=request.getParameter("account");
  		String password=request.getParameter("password");
  		Connection conn = getConnection();
  		session.setAttribute("user",text);
   		Statement stat = conn.createStatement();
		String sql = 
        "SELECT account,password FROM s_login";
		ResultSet rs = stat.executeQuery(sql);
		while(rs.next()){
			String text1 = rs.getString("account");
			String password1 = rs.getString("password");
			if(text1.equals(text)&&password1.equals(password))
			{
 %>
				<jsp:forward page="display.jsp"></jsp:forward>
		<%
			}
				}
		%>
		<script type="text/javascript" >
			window.alert("账号或者密码错误");
			window.document.location.href="loginForm.jsp";
		</script>
  </body>
</html>

1.3.3 投票系统

(1)当第一次输入正确密码后进入系统,点击投票链接使票数vote+1,并将标志值q设置为1。

vote.jsp:

<%@ page language="java" import="java.sql.*" pageEncoding="gb2312"%>
<%@ include file="db.inc" %>
<html>
  <body> 
   <%
   		String sno = request.getParameter("sno");
   		Connection conn = getConnection();
   		String name=(String)session.getAttribute("user");
   		String p = "0";
		Statement stat = conn.createStatement();
		String sql1 = 
		"SELECT q FROM s_login where account= "+name+" ";
		ResultSet rs = stat.executeQuery(sql1);
		while(rs.next()){
		String q = rs.getString("q");
		if(q.equals(p)){
		String sql = 
        "UPDATE S_VOTE SET vote=vote+1 WHERE sno=?";
		PreparedStatement ps = conn.prepareStatement(sql);
		ps.setString(1,sno);
		ps.executeUpdate();
		ps.close();
		String sql2 = 
		 "UPDATE s_login SET q=q+1 WHERE account= "+name+" ";
		PreparedStatement ps1 = conn.prepareStatement(sql2);
		ps1.executeUpdate();
		ps1.close();
		conn.close();
	%>
	<jsp:forward page="display.jsp"></jsp:forward>
		<%
	}
	else
	{
		%> 
	  <jsp:forward page="error.jsp"></jsp:forward>
	  <%
	}
	}
	  %> 
  </body>
</html>

(2)当第二次输入同一账号密码进行登录时,q不再为0禁止进入系统,跳转到error.jsp:显示“该账号已投过票,不能再投”,防止刷票。

error.jsp:

<%@ page language="java" import="java.sql.*" pageEncoding="gb2312"%>
<html>
  <body> 
<script type="text/javascript" language="javascript">
alert("该账号已投过票,不能再投");
window.document.location.href="loginForm.jsp";
</script>
</body>
</html>

1.4 测试结果

(1)给第二位班干部投票:

(2)点击“刷新”按钮连续给第二位班干部投票(模拟刷票):

跳出弹框提示以下信息:

1.5总结 

(1)学习了:

     ①设计简洁清晰的界面,包括添加标题、展示表格等功能。

     ②如何在界面上展示数据,例如显示班干部的学号、姓名和得票数。

     ③使用数据库进行数据存储,并能够在后续的处理中获取和更新数据。

     ④如何为每位班干部生成投票链接,实现投票功能。

     ⑤如何防止刷票,采取措施限制投票频率,提高系统的安全性和公正性。

(2)不足:

     ①没有实现对多个人进行投票,仅能选择其中一人。

     ②初始的思路没能实现(投票过的同学的密码将被系统自动改为“0”,只有当密码非“0”且正确时才能再次进入系统,以此防止已经投过票的同学再次进行投票),请教了同学后学习了其他的方法才实现了防刷票功能。

     ③界面单调,功能较为单一,没有拓展。

题目二 在线交流

2.1 题目需求

      功能要求:在线交流学习心得,包括:登录、聊天、退出登录。要有聊天记录,状态刷新。

2.2 系统设计

2.2.1 系统框架

(1)系统开发环境:

①开发语言和框架:使用Java编程语言,并结合Web框架来快速构建系统。

②后端开发:使用Web服务器,并结合应用服务器Tomcat来提供服务。

③数据库:通过数据库管理系统MySQL来存储用户的登录信息、聊天记录等数据。

④前端开发:使用HTML和JavaScript等前端技术来实现用户界面。

⑤集成开发环境(IDE):选择合适的集成开发环境MyEclipse来辅助开发工作。

(2)系统网络结构:

①用户界面:前端界面通过Web浏览器与用户进行交互,用户可以在界面上进行登录、聊天和退出登录操作。前端界面向后端发送HTTP请求,并接收和展示后端返回的数据。

②前端与后端通信:前端通过HTTP协议与后端进行通信。前端发送登录请求时,会将登录信息(用户名和密码)以POST请求方式发送给后端验证。聊天时,前端将聊天内容通过POST请求发送给后端,后端进行处理后返回相应结果。

③后端服务器:后端服务器接收前端发送的请求,并根据请求的类型执行相应的操作。对于登录操作,后端验证用户身份。对于聊天操作,后端接收聊天内容,并将其保存到数据库中。同时,后端可以通过数据库查询获取聊天记录,并将其返回给前端展示。

④数据库:数据库用于存储和管理用户的登录信息、聊天记录等数据。后端在处理聊天请求时,会将聊天内容存储到数据库中,并在需要时从中提取聊天记录。

(3)系统导图

2.2.2 界面设计

(1)登录界面:通过学号和密码登录在线交流学习心得系统。     

<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<html> 
  <body>
  	<%
  		/*初始化application*/
    	ArrayList customers = (ArrayList)application.getAttribute("customers");    	    	
    	if(customers==null)	{
    		customers = new ArrayList();
    		application.setAttribute("customers",customers);
    	}
    	
    	ArrayList msgs = (ArrayList)application.getAttribute("msgs");
    	if(msgs==null)	{
    			msgs = new ArrayList();
    			application.setAttribute("msgs",msgs);
    	}
  	%>
     	★★欢迎你登录在线交流学习心得系统★★
    <form action="loginAction.jsp" name="form1" method="post">
    	输入账号:<input name="account" type="text"><BR>
    	输入密码:<input name="password" type="password">   	
    	<input type="submit" value="登录" >
    </form>   
  </body>
</html>

(2)发表心得界面:显示了对登录用户的欢迎信息;发表学习心得后,单击“发送”按钮,可以将信息显示在所有已经登录用户的界面上;界面下方显示聊天信息和当前在线用户;当用户点击“退出系统”后显示用户下线的信息。

chatForm.jsp:

<%@ page language="java" pageEncoding="gb2312"%>
<%@page import="vo.Customer"%>
<html> 
  <body>
  	<%
  		Customer customer = (Customer)session.getAttribute("customer");
  	%>
    欢迎<%=customer.getCname() %>在线交流学习心得!!!<BR>
    <form action="chatAction.jsp" name="form1" method="post">
    	请输入学习心得:<input name="msg" type="text" size="40">
    	<input type="submit" value="发送" >
    </form>  
    <a href="logoutAction.jsp">退出登录</a>
    <HR>
    <iframe src="msgs.jsp" width="100%" height="80%" frameborder="0"></iframe>   
  </body>
</html>

2.2.3 数据库设计

(1)T_CUSTOMER表:储存了如下所示的厦门理工学院学生的基本信息。

字段

数据类型

可否为空

说明

account

varchar(15)

NO

主键学号

password

Varchar(15)

NO

密码

cname

Int(10)

YES

姓名

2.3 系统实现

2.3.1 模块定义

页  面

作 用

loginForm.jsp和loginAction.jsp

loginForm.jsp显示登录界面;
loginAction.jsp验证登录是否成功;
若成功则跳转到chatForm.jsp;

chatForm.jsp和chatAction.jsp

chatForm.jsp显示聊天界面;
chatAction.jsp获取消息内容;
处理消息后跳转到chatForm.jsp;

msgs.jsp

显示所有用户的聊天信息和在线名单;
该页面每隔一段时间自动刷新,以iframe形式嵌入chatForm.jsp

logoutAction.jsp

负责处理退出登录的操作

2.3.2 登录系统

(1)在DAO中验证用户的合法身份。

CustomerDao.java:

package dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import vo.Customer;

public class CustomerDao {
	private Connection conn = null;
	public void initConnection() throws Exception {
		Class.forName("com.mysql.jdbc.Driver");
		conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql","root","2110716407");
	}
	//根据账号查询Customer对象
	public Customer getCustomerByAccount(String account) throws Exception {
		Customer cus = null;
		initConnection();
		String sql = 
"SELECT ACCOUNT,PASSWORD,CNAME FROM T_CUSTOMER WHERE ACCOUNT=?";
		PreparedStatement ps = conn.prepareStatement(sql);
		ps.setString(1, account);
		ResultSet rs = ps.executeQuery();
		if(rs.next()){
			cus = new Customer();
			cus.setAccount(rs.getString("ACCOUNT"));
			cus.setPassword(rs.getString("PASSWORD"));
			cus.setCname(rs.getString("CNAME"));
		}
		closeConnection();
		return cus;		
	}	
	public void closeConnection() throws Exception {
		conn.close();
	}
}

(2)用户输入的账号密码与数据库中数据进行比对,一致则成功登录系统,不一致则返回登录页面;当用户登录成功后用户信息被保存到session中。

loginAction.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<%@page import="dao.CustomerDao"%>
<%@page import="vo.Customer"%>
<html> 
  <body>
    <%
    	request.setCharacterEncoding("gb2312");
    	String account = request.getParameter("account");
    	String password = request.getParameter("password");
    	
    	CustomerDao cdao = new CustomerDao();
    	Customer customer = cdao.getCustomerByAccount(account);
		if(customer==null || !customer.getPassword().equals(password)){
	%>
			登录失败,<a href="loginForm.jsp">返回登录页面</a>
	<%			
		}
		else{
			session.setAttribute("customer",customer);
			ArrayList customers = (ArrayList)application.getAttribute("customers");
			ArrayList msgs = (ArrayList)application.getAttribute("msgs");
			customers.add(customer);
			msgs.add(customer.getCname() + "登录成功!");    		
    		response.sendRedirect("chatForm.jsp");
		}       	
    %> 
  </body>
</html>

(3)点击“退出登录”后,清除用户的会话状态,将session设置为失效。

logoutAction.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<%@page import="vo.Customer"%>
<html> 
  <body>
    <%
  		Customer customer = (Customer)session.getAttribute("customer");
  		ArrayList customers = (ArrayList)application.getAttribute("customers"); 
  		customers.remove(customer);
  		ArrayList msgs = (ArrayList)application.getAttribute("msgs");
  		msgs.add(customer.getCname() + "已离线!");  
  		session.invalidate();
  		response.sendRedirect("loginForm.jsp");
  	%>
  </body>
</html>

2.3.3 聊天系统

(1)将消息内容和在线名单输出到会话框中。

Customer.java:

package vo;
public class Customer {
	private String account;
	private String password;
	private String cname;
	public String getAccount() {
		return account;
	}
	public void setAccount(String account) {
		this.account = account;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getCname() {
		return cname;
	}
	public void setCname(String cname) {
		this.cname = cname;
	}
}

chatAction.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<%@page import="vo.Customer"%>
<html> 
  <body>  
  	<%
  	Customer customer = (Customer)session.getAttribute("customer");
    	request.setCharacterEncoding("gb2312");
    	String msg = request.getParameter("msg");
    	ArrayList msgs = (ArrayList)application.getAttribute("msgs");
    	if(msg!=null && !msg.equals("")){
    		msgs.add(customer.getCname() + "发表学习心得:" + msg);    	
    	}
    	response.sendRedirect("chatForm.jsp");			
    %>  
  </body>
</html>

(2)让消息内容和在线名单保存在application对象内,能够保证消息内容和在线名单能被所有用户页面显示;每次有用户上线,就向application内的在线名单内添加该用户的上线消息;每次有用户下线,就从application内的在线名单内移除该用户的上线消息。

      用户提交信息,就向application内的消息集合内添加该用户提交的消息。

      msgs.jsp需要定时刷新(此处设置每隔10秒刷新一次),以便即时获取application对象中的内容,显示聊天信息和在线名单,更新页面。

msgs.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<%@page import="vo.Customer"%>
<html> 
  <body>
  	<%
  		response.setHeader("Refresh","10");  
  	 %>
  	<table width="80%"  border="0" align="center">
  	  <tr bgcolor="yellow" align="center">
  	  <td width="75%">学习心得</td>
  	  <td width="25%">当前在线</td>
  	  </tr>
      <tr bgcolor="pink">
        <td><%   	
    	ArrayList msgs = (ArrayList)application.getAttribute("msgs");
    	for(int i=msgs.size()-1;i>=0;i--){
    		out.println(msgs.get(i) + "<BR>");
    	}
    %></td>
        <td valign="top"><%    	
    	ArrayList customers = (ArrayList)application.getAttribute("customers");
    	for(int i=customers.size()-1;i>=0;i--){
    		Customer customer = (Customer)customers.get(i);
    		out.println(customer.getAccount() + "(" + customer.getCname() + ")" + "<BR>");
    	}
    %></td>
      </tr>
    </table>
  </body>
</html>

2.4 测试结果

(1)先使用账号2110716001登录。

(2)输入心得内容:在本次课程设计的学习中,我认识到了自己的不足,对结构框架比较不熟悉,后续我一定会加强学习,不断进步!

成功发表心得结果如下:

(3)再使用账号2110716003登录,输入心得内容:学习尚未成功,同志还需努力!成功显示他人发表心得以及登录状态的记录。

(4)打开多个网页,显示多个用户同时在线。

2.5 总结

(1)学习了:

    ①实现实时聊天功能的基本原理,包括建立WebSocket连接、发送和接收消息等。这样可以实现用户之间的即时交流和信息共享。

    ②将聊天记录保存到数据库中,并能够在后续的处理中获取和更新数据。

    ③聊天状态的刷新,使用户能够实时看到新的消息或在线用户的变动。

(2)不足:

    ①同时打开多个页面登录不同的用户可以显示多个用户同时在线但是多个界面都只能由最后一位登录的用户发表信息,其他用户无法发布。

    ②界面单调,功能较为单一,没有拓展。

  • 15
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值