即时通信系统
******** 计算机科学与技术学院
课程设计
2012— 2013学年第一学期
课程名称 电子商务课程设计 设计题目 即时通信系统 学生姓名 ****** 学 号 ********* 专业班级 ******* 指导教师 *******
2012 年 12 月 20日
河南理工大学电子商务课程设计
目录
1、课程设计任务书......................................................................................................................... 2
1.1、题目与要求 ...................................................................................................................... 2
1.2、系统设计知识点 .............................................................................................................. 2 2、功能设计 .................................................................................................................................... 3
2.1、算法设计 .......................................................................................................................... 3
2.2、模块图.............................................................................................................................. 4
2.2.1、系统主体的处理流程 ......................................................................................... 4
2.2.2、总体结构 ............................................................................................................. 4
2.2.3、客服端 ................................................................................................................. 5
2.2.4、服务端 ................................................................................................................. 5
2.3、程序流程图 ...................................................................................................................... 6
2.3.1、未注册用户 ......................................................................................................... 6
2.3.2、主界面 ................................................................................................................. 7
2.3.3、已注册用户流程图 ............................................................................................. 8 3、程序代码设计............................................................................................................................. 8
3.1、数据表设计 ...................................................................................................................... 8
3.1.1、用户表 ................................................................................................................. 8
3.1.2、好友表 ................................................................................................................. 9
3.1.3、消息表 ................................................................................................................. 9
3.2、建立数据库 ...................................................................................................................... 9
3.3、设计主窗体 .................................................................................................................... 10
3.4、修改用户表并完成显示好友 ........................................................................................ 12
3.4.1、修改users表结构 ........................................................................................... 12
3.4.2、显示好友功能 ..................................................................................................... 12
3.5、添加测试数据 ............................................................................................................... 13 4、功能设计 .................................................................................................................................. 14
4.1、实现登录功能 ................................................................................................................ 14
4.2、实现注册功能 ................................................................................................................ 15
4.3、实现聊天功能 ................................................................................................................ 17
4.4、修改个人信息功能 ........................................................................................................ 18 5、致谢 .......................................................................................................................................... 23
6、参考文献:............................................................................................................................... 23
1
河南理工大学电子商务课程设计
1、课程设计任务书
1.1、题目与要求
在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,类似QQ,网络聊天时一类的聊天系统的发展日新月异,因此产生了制作一个类似QQ的网络聊天工具的;而且通过制作该程序还能更好的学习网络软件编程知识。
本课程设计的目标是利用套接字socket()设计一个聊天程序,该程序基于C/S模式,客户机器向服务器发聊天请求,服务器应答并能显示客户机发过来的信息。主要实现以下几个功能:
, 用户登录
, 用户注册
, 修改个人信息
, 用户聊天
1.2、系统设计知识点
C/S模型
C,S(Client,Server,客户,服务器)模型,简称C,S架构。该模型可以合理利用两端硬件环境优势,将任务合理分配到客户端6rill务器,降低系统通信开销。在这种结构中,服务器处于一个中心地位。服务器是一个拥有强大处理能力和很大带宽的高性能计算机,数据和信息都保存在服务器上。服务器始终处于工作状态,一般同时为多个客户提供服务,它被动地接受客户连接,根据客户的请求提供相应的服务。这就造成了服务器设计的复杂性。特别是像即时通信服务器这类具有社区性的服务器,它只有为群体提供服务才有意义。即时通信服务器是数据中心,它是客户活动的中介,需要同时应对众多客户的请求。 P2P模型
P2P(Peerto Peer,对等连接或对等网络)模型,是指网络中的物理节点在逻辑上以相同的地位进行通信的模型,而不是处理能力的对等。相对于传统的C,S模型,其弱化了服务器的概念,系统中的各个节点不再区分服务器和客户端的角色关系,每个节点既可请求服务,也可提供服务,节点之间可以直接交换资源
2
河南理工大学电子商务课程设计
和服务而不必通过服务器。P2P的最大特点就是用户之间直接共享资源,使得PC不再是被动的客户端,而成为具有服务器和客户端双重特征的设备。 即时通信
传输控制协议TCP(Transmission Control Protocal)和用户数据报协议UDP(User Datagram Protoc01)是TCP,IP协议族的两个主要的传输协议,这两个协议都使用IP作为网络层协议。在网络通信传输机制中,TCP是属于“面向连接,可靠传输”的类型,面向连接的传输意味着在进行通信以前,需要在两个系统之问建立逻辑连接,在每个数据传输的过程中都需要进行应答以保证数据包的完整。这种
需要的网络不销较大,但却提供一种可靠的传输层服务。UDP是属于“面向无连接,不可靠传输”的类型,该协议只负责接收和传送上层协议传递的消息,UDP本身不做任何检测、修改与应答,上层协议需要自己处理这些事务。他们实际上最大的区别在于为应用协议提供不同的服务。 WinSock技术
随着Intemet的迅猛发展,网络通信应用程序的开发成为一个研究热点。Windows环境下进行通信程序设计的最基本方法是采用WinSock技术实现。WinSock
以u(C(Berkeley大学BSD UNIX中流行的Sockets接口为范例定义了一套Micosoft Windows下网络编程接口1。应用程序调用WinSock的API实现相互之间的通信。又利用下层的网络通信协议功能和操作系统调用实现实际的通信工作。
2、功能设计
2.1、算法设计
核心算法
1)建立一个Information类用于表示通信中传递的信息对象,Information
有三个字段,分别代表信息类型,信息来源,信息内容。
2)建立两个扩展自Thread的类 Sendert和Receiver分别用于一个Socket
的接收和发送信息,他们都使用可阻塞线程的队列Queue作为接口传递
信息。
3)使用Model-UI模式构建服务器和客户端程序。
3
河南理工大学电子商务课程设计
服务器Model:有两个线程,一个等待用户连接,一个用于转发数据。
首先构造一个ServerSocket,在第一个线程中用accept()方法等待连接。
连接一个用户后取得Socket,然后建立该Socket的Sender和Receiver
对象。每个Sender都有一个单独的Queue,这个queue和Socket以键值
对保存在一个socket_queue_map中,以后可以遍历。所有的Receiver
使用同一个receiver_queue。在第二个线程中,用receiver_queue.tack()
等待Receiver接收的信息,然后遍历socket_queue_map,转发给每一个
socket。
客户端Model:连接服务器后获得一个Socket,分别建立Sender和
Receiver线程并运行。然后利用sender_queue发送消息,利用
receiver_queue接收消息。
4)分别建立Server和Client的GUI,再进行细节优化,增设其他功能 2.2、模块图
2.2.1、系统主体的处理流程
发送请求
客服端 服务端
返回应答
图1 系统主体的处理流程
2.2.2、总体结构
服务端 网络聊天室
客服端
图2 总体结构
4
河南理工大学电子商务课程设计
2.2.3、客服端
显示在线用户
客服端 发送消息
接收并显示消息
图3 客户端
2.2.4、服务端
处理用户登录申请
转发用户消息 服务端
服务器管理
图4 服务端
5
河南理工大学电子商务课程设计 2.3、程序流程图
2.3.1、未注册用户
开始
读取服务器IP
显示注册界面
接收用户信息
判断信息 No
Yes
显示主界面 写入服务器数据库
结束
图5 未注册用户流程图
6
河南理工大学电子商务课程设计 2.3.2、主界面
公聊
注销 私聊
主界面
文件传输 用户列表
图6 主界面
7
河南理工大学电子商务课程设计 2.3.3、已注册用户流程图
开始
读取服务器IP
显示登录界面
No 接收用户名及
密码
判断密码
Yes
显示主界面
结束
图7 已注册用户流程图 3、程序代码设计
3.1、数据表设计
数据库选用机房安装的MySQL 5.1。数据库表设计如下: 3.1.1、用户表
表1 用户表users
列名 数据类型 允许空 说明 id int 否 主键,自增,种子10000,表示QQ号码
8
河南理工大学电子商务课程设计
password varchar(50) 否 登录密码
nickname varchar(50) 否 昵称
state int 否 1->离线,2->在线,3->隐身 friendpolicy int 否 1->允许,2->需要验证,3->不允许 sex varchar(2) 否 男或女
age int 否 年龄
3.1.2、好友表
表2 好友表friends
列名 数据类型 允许空 说明 id int 否 主键,自增
hostid int 否 好友关系中,主人的号码,users表的外键 friendid int 否 好友关系中,好友的号码,users表的外键 3.1.3、消息表
表3 消息表messages
列名 数据类型 允许空 说明 id int 否 主键,自增
fromid int 否 发消息的QQ号,users表的外键 toid int 否 收消息的QQ号,users表的外键 message varchar(100) 否 消息内容
type int 否 1->普通消息,2->系统消息 state int 否 0->未读,1->已读 3.2、建立数据库
通过SQL创建数据库,SQL语句如下:
#创建数据库
create database myqq;
#切换数据库
use myqq;
#创建users表
create table users
(
id int not null auto_increment primary key,
password varchar(50) not null,
nickname varchar(50) not null,
faceid int not null,
state int not null,
9
河南理工大学电子商务课程设计
friendpolicy int not null,
sex varchar(2) not null,
age int not null
)
auto_increment=10000;
#设置种子为10000
#创建friends表
create table friends
(
id int auto_increment primary key,
hostid int not null references users(id),
friendid int not null references users(id) );
#创建messages表
create table messages
(
id int primary key auto_increment,
fromid int not null references users(id),
toid int not null references users(id),
content varchar(100) not null,
type int not null,
state int not null,
sendtime varchar(50) not null ) 3.3、设计主窗体
设计主窗体的界面,如图8所示:
图8 主窗体界面
主窗体的布局使用的是BorderLayout,Center放的是一个JGroupPanel的对象,North放置的一个JPanel。JPanel上面放置了三个按钮,按钮上面放置的图片。JGroupPanel的源代码为见源文件JGroupPanel.java。创建初始化分组的代码
10
河南理工大学电子商务课程设计
为:
private void createDefaultGroup(JGroupPanel grgMain) {
//创建我的好友组
grgMain.insertGroup(0,"我的好友",Color.white);
grgMain.getGroup(0).setMemberGap(20, 5);
grgMain.getGroup(0).getTitleButton().setForeground(Color.black);
ImageIcon img1 = new ImageIcon("images\\1.gif");
JButton btnPlaynet = new JButton("playnet",img1);
btnPlaynet.setVerticalTextPosition(SwingConstants.BOTTOM);
btnPlaynet.setHorizontalTextPosition(SwingConstants.CENTER);
btnPlaynet.setSize(new Dimension(20,20));
btnPlaynet.setBorder(null);
btnPlaynet.setContentAreaFilled(false);
btnPlaynet.setForeground(Color.black);
grgMain.addMember(0,btnPlaynet);
//创建陌生人组
grgMain.insertGroup(1,"陌生人",Color.white);
grgMain.getGroup(1).setMemberGap(20, 5);
grgMain.getGroup(1).getTitleButton().setForeground(Color.black);
JButton btnNew = new JButton("陌生人",img1);
btnNew.setVerticalTextPosition(SwingConstants.BOTTOM);
btnNew.setHorizontalTextPosition(SwingConstants.CENTER);
btnNew.setSize(new Dimension(20,20));
btnNew.setBorder(null);
btnNew.setContentAreaFilled(false);
btnNew.setForeground(Color.black);
grgMain.addMember(1,btnNew);
grgMain.expandGroup(0);
}
JPanel上放置带图片的按钮的源代码为:
//创建图片对象
ImageIcon modify = new ImageIcon("images\\edit.gif"); ImageIcon search = new ImageIcon("images\\search.gif"); ImageIcon message = new ImageIcon("images\\message.gif"); //创建按钮对象
JButton btnMessage = new JButton();
JButton btnSearch = new JButton();
JButton btnModify = new JButton();
//设置FlowLayout的对齐方式
jPanel1.setLayout(new FlowLayout(FlowLayout.LEADING)); //统一图片的大
modify.setImage(modify.getImage().getScaledInstance(20,20,Image.SCALE_DEFAULT))
;
11
河南理工大学电子商务课程设计
search.setImage(search.getImage().getScaledInstance(20,20,Image.SCALE_DEFAULT))
;
message.setImage(message.getImage().getScaledInstance(20,20,Image.SCALE_DEFAULT
));
//将图片设置到JButton上,并设置Border为空
btnModify.setIcon(modify);
btnModify.setBorder(null);
btnSearch.setIcon(search);
btnSearch.setBorder(null);
btnMessage.setIcon(message);
btnMessage.setBorder(null);
3.4、修改用户表并完成显示好友
3.4.1、修改users表结构
为uers表添加一个字段faceid表示头像的id,修改后的users表结构为:
表4 修改后的users表结构
列名 数据类型 允许空 说明
id int 否 主键,自增,种子10000,表示QQ号码 password varchar(50) 否 登录密码
nickname varchar(50) 否 昵称
faceid int 否 用户头像的id
state int 否 1->离线,2->在线,3->隐身 friendpolicy int 否 1->允许,2->需要验证,3->不允许 sex varchar(2) 否 男或女
age int 否 年龄
相应地,创建表的sql语句也需要修改。源代码QQUser.java,UserDao.java,RegisterFrame.java也需要修改。
3.4.2、显示好友功能
定义ImageIcon数组用于存储QQ用户的头像。定义并初始化该数组的主要代码为:
//保存QQ用户的头像
private ImageIcon [] faces = new ImageIcon[10]; for(int i=0; i
list = uDao.getUsers(sql);
for(QQUser user : list){
btnUser.setVerticalTextPosition(SwingConstants.BOTTOM);
btnUser.setHorizontalTextPosition(SwingConstants.CENTER);
btnUser.setSize(new Dimension(20,20));
btnUser.setBorder(null);
btnUser.setContentAreaFilled(false);
btnUser.setForeground(Color.black);
btnUser.setToolTipText(user.getNickname()+"("+user.getId()+")");
grgMain.addMember(0,btnUser);
}
//创建陌生人组
grgMain.insertGroup(1,"陌生人",Color.white);
grgMain.getGroup(1).setMemberGap(20, 5);
grgMain.getGroup(1).getTitleButton().setForeground(Color.black);
grgMain.expandGroup(0);
}
调用该代码的代码为(LoginFrame.java):
MainFrame main = new MainFrame();
//设置登录用户的信息
main.setMe(user);
main.createDefaultGroup(main.grpMain);
3.5、添加测试数据
在sql.txt文件的最后添加测试数据,具体sql语句为
#添加一用户数据
insert into users (password,nickname,faceid,state,friendpolicy,sex,age) values
('abc','大海',0,1,2,'男',26);
13
河南理工大学电子商务课程设计
insert into users (password,nickname,faceid,state,friendpolicy,sex,age)
values('abc','playnet',2,1,2,'男',26);
insert into users (password,nickname,faceid,state,friendpolicy,sex,age) values
('abc','soccer',4,2,2,'女',26);
#添加好友数据
insert into friends (hostid,friendid) values (10000,10001);
insert into friends (hostid,friendid) values (10001,10000);
insert into friends (hostid,friendid) values (10000,10002);
insert into friends (hostid,friendid) values (10002,10000);
4、功能设计
4.1、实现登录功能
public class Login extends JFrame implements ActionListener{//界面组件及其他变量声明
public Login() {//界面组件初始化
try{
FileInputStream fsread=new FileInputStream("c:\\ServerIPaddress.txt");
InputStreamReader inputread=new InputStreamReader(fsread);
BufferedReader bfread=new BufferedReader(inputread);
ServerIPaddress=bfread.readLine();
fsread.close();
toServer=new Socket(ServerIPaddress,1207);
}
catch(IOException e){} //服务器IP地址读取及连接的建立
public void actionPerformed(ActionEvent e) {
if(e.getSource()==button1)
{
dispose();
new Checkin(toServer);
}
if(e.getActionCommand().equals("登陆"))
{
if(textField1.getText().equals(""))
{
JOptionPane.showMessageDialog(null,"用户名不能为空~");
}
else {
try{
User user=new User();
User userlogin=new User();
user.Name=textField1.getText();
14
河南理工大学电子商务课程设计
user.Password=textField2.getText();
user.Command="Enter";
streamToServer=new
ObjectOutputStream(toServer.getOutputStream());
streamFromServer=new
ObjectInputStream(toServer.getInputStream());
streamToServer.writeObject((User)user);
streamToServer.flush();
userlogin=(User)streamFromServer.readObject();
if(userlogin.Command.equals("Enter"))
{
new MainFrame(toServer,user.Name);
dispose();
}
else JOptionPane.showMessageDialog(null,"用户名或密码错");
textField1.setText("");
textField2.setText("");
}catch(Exception ee){JOptionPane.showMessageDialog(null,"连
接错误~");}
}
try{
streamToServer.close();
streamFromServer.close();
}catch(Exception ee){}
}
} //按钮动作及对服务器命令的响应
public static void main(String args[]) {
JFrame.setDefaultLookAndFeelDecorated(true);
Font font =new Font("JFrame",Font.PLAIN,14);
Enumeration keys=UIManager.getLookAndFeelDefaults().keys();
while(keys.hasMoreElements()){
Object key=keys.nextElement();
if(UIManager.get(key) instanceof Font )UIManager.put(key,font);
}
new Login();
} //main方法
}
4.2、实现注册功能
public class Checkin extends JFrame implements ActionListener{
. //界面组件及其他变量声明
public Checkin(Socket toServer) { //界面组件初始化
try{ ToServer=toServer;
15
河南理工大学电子商务课程设计
streamToServer = new ObjectOutputStream(ToServer.getOutputStream());
streamFromServer=new ObjectInputStream(ToServer.getInputStream());
}catch(Exception e){}
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
} //将Login中建立的socket做参数传递给Checkin
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("注册"))
{
for(int t=0;t==0;){
if(textField1.getText().equals(""))
{
JOptionPane.showMessageDialog(null,"用户名不能为空~");
t=1;
}
else if(textField3.getText().equals(textField2.getText())==false)
{
JOptionPane.showMessageDialog(null,"密码不一致~");
t=1;
}else{
User user=new User();
user.Name=textField1.getText();
user.Password=textField2.getText();
user.Age=textField4.getText();
user.Email=textField5.getText();
user.sex=(String)checkboxGroup1.getSelectedCheckbox().getLabel();
user.Command="Login";
try{
streamToServer.writeObject((User)user);
fromServerMessage=(User)streamFromServer.readObject();
}catch(Exception ee){JOptionPane.showMessageDialog(null,"数据发送错误~");}
if(fromServerMessage.Command.equals("Login"))
{
dispose();
new MainFrame(ToServer,user.Name);
}
if(fromServerMessage.Command.equals("Repeat"))
{
JOptionPane.showMessageDialog(null,"用户名已存在~");
t=1;
}
}
}
}
if(e.getActionCommand().equals("取消"))
16
河南理工大学电子商务课程设计
{
dispose();
new Login();
}
} //按钮动作的添加及对服务器的信息传
//递和响应
4.3、实现聊天功能
首先修改messages表,增加发送时间(sendtime)字段。修改后的messages表结构,如表5:
表5 修改后的消息表messages
列名 数据类型 允许空 说明
id int 否 主键,自增
fromid int 否 发消息的QQ号,users表的外键 toid int 否 收消息的QQ号,users表的外键 content varchar(100) 否 消息内容
type int 否 1->普通消息,2->系统消息 state int 否 0->未读,1->已读
sendtime varchar(50) 否 消息的发送时间
对应修改sql.txt文件。实现聊天的效果如图9所示。
图9 聊天效果图
实现聊天主要分两步:第一步是将发送的消息插入到数据中;第二步是定时从数据库中读出未读消息并将该消息设置成已读。第一步的主要代码为:
//消息为空不能发送
String content = txaSend.getText();
if (content.equals("")) {
JOptionPane.showMessageDialog(this, "不能发送空消息,请输入消息内容!", "
提示",JOptionPane.INFORMATION_MESSAGE);
return;
}
17
河南理工大学电子商务课程设计
//将发送的消息插入到数据库中
int fromid = from.getId();
int toid = to.getId();
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String sendtime = sdf.format(now);
String sql = "insert into messages
(fromid,toid,content,type,state,sendtime) values ("+ fromid + "," + toid
+ ",'" + content + "',1,0,'" + sendtime +"')";
MessageDao mdao = new MessageDao();
mdao.updateMessage(sql);
//将自己发送的消息显示在消息框中
txaMessages.append(from.getNickname() + " " + sendtime + "\r\n");
txaMessages.append(txaSend.getText() + "\r\n");
txaSend.setText("");
第二步的主要代码为:
//每隔2秒从数据中读出从fromid发给toid的未读消息
int delay = 2000; //milliseconds
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
//读出由好友发给自己的未读消息
String sql = "select * from messages where fromid=" + to.getId() +
" and toid=" + from.getId() + " and state=0 and type=1";
MessageDao mdao = new MessageDao();
ArrayList list = mdao.getMessages(sql);
//将未读消息显示出来
for (Message message : list) {
txaMessages.append(to.getNickname() + " " +
message.getSendtime() + "\r\n");
txaMessages.append(message.getContent() + "\r\n");
//将该消息设置成已读
String sqlModify = "update messages set state=1 where id=" +
message.getId();
mdao.updateMessage(sqlModify);
}
}
};
new Timer(delay, taskPerformer).start();
4.4、修改个人信息功能
修改个人信息的界面如图10所示。
18
河南理工大学电子商务课程设计
图10 修改个人信息窗口
点击头像下方的按钮,弹出头像选择窗口,如图11所示。
图11 选择头像窗口
主要实现的功能有:
, 点击主窗口中修改个人信息按钮,弹出图9所示的窗体,并初始化该QQ用
户信息
, 昵称不能为空,否则提示
, 年龄不能为空,否则提示
, 如果不需要修改密码,更新数据库,更新主窗体
, 如果需要修改密码,验证原密码、新密码、确认密码是否为空,旧密码是否
正确,两次密码是否一致。更新数据,更新主窗体
打开修改个人信息窗口的代码为:
ModifyFrame frame = new ModifyFrame();
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
int x = (screenSize.width - frame.getSize().width) / 2;
int y = (screenSize.height - frame.getSize().height) / 2;
frame.setLocation(x, y);
frame.initialSelf(this);
frame.setVisible(true);
初始化个人信息修改窗口的代码为:
19
河南理工大学电子商务课程设计
this.me = frame.getMe();
this.frame = frame;
//初始化原有信息
txtId.setText(""+me.getId());
txtNickname.setText(me.getNickname());
txtAge.setText(""+me.getAge());
if(me.getSex().equals("男")){
radMale.setSelected(true);
}else{
radFemale.setSelected(true);
}
if(me.getFriendpolicy() == 1){
radAllow.setSelected(true);
}else if(me.getFriendpolicy() == 2){
radConfirm.setSelected(true);
}else{
rdoNever.setSelected(true);
}
//设置头像
lblFace.setIcon(faces[me.getFaceid()]);
faceid = me.getFaceid();
修改按钮的事件处理程序为:
//没有输入昵称,给出提示
String nickname = txtNickname.getText();
if(nickname.equals("")){
JOptionPane.showMessageDialog(this,"昵称不能为空","提示
",JOptionPane.ERROR_MESSAGE);
return;
}
//没有输入年龄,给出提示
String ageString = txtAge.getText();
if(ageString.equals(""))
{
JOptionPane.showMessageDialog(this,"年龄不能为空","提示
",JOptionPane.ERROR_MESSAGE);
return;
}
//年龄不是数字,给谁提示
int age = -1;
try{
age = Integer.parseInt(ageString);
}catch(NumberFormatException ex){
JOptionPane.showMessageDialog(this,"年龄必须为数字","提示
",JOptionPane.ERROR_MESSAGE);
20
河南理工大学电子商务课程设计
return;
}
//获得性别信息
String sex = "";
if(radMale.isSelected()){
sex = radMale.getText();
}else{
sex = radFemale.getText();
}
//获得身份验证信息
int policy = -1;
if(radAllow.isSelected()){
policy = 1;
}else if (radConfirm.isSelected()){
policy = 2;
}else{
policy = 3;
}
//分两种情况,一种是需要修改密码,一种是不需要修改密码
String sql = "";
if(pwdOld.getPassword().length == 0 && pwdNew.getPassword().length == 0 &&
pwdConfirm.getPassword().length == 0){
//第一种情况,不需要修改密码
sql = "update users set nickname='"+nickname+"', age="+age+",
sex='"+sex+"', friendpolicy="+policy+", faceid="+faceid+" where
id="+me.getId();
}else{
//如果原密码为空提示
if(pwdOld.getPassword().length == 0){
JOptionPane.showMessageDialog(this,"原密码不能为空","提示
",JOptionPane.ERROR_MESSAGE);
pwdOld.requestFocus();
return;
}
//如果新密码为空提示
if(pwdNew.getPassword().length == 0){
JOptionPane.showMessageDialog(this,"新密码不能为空","提示
",JOptionPane.ERROR_MESSAGE);
pwdNew.requestFocus();
return;
}
String old = new String(pwdOld.getPassword());
String newpwd = new String(pwdNew.getPassword());
String confirm = new String(pwdConfirm.getPassword());
21
河南理工大学电子商务课程设计
//如果旧密码不正确,提示
if(!old.equals(me.getPassword())){
JOptionPane.showMessageDialog(this,"旧密码不正确","提示
",JOptionPane.ERROR_MESSAGE);
pwdOld.setText("");
pwdNew.setText("");
pwdConfirm.setText("");
pwdOld.requestFocus();
return;
}
//如果两次密码不一致,提示
if(!newpwd.equals(confirm)){
JOptionPane.showMessageDialog(this,"两次密码不一致","提示
",JOptionPane.ERROR_MESSAGE);
pwdNew.setText("");
pwdConfirm.setText("");
pwdNew.requestFocus();
return;
}
me.setPassword(newpwd);
sql = "update users set nickname='"+nickname+"', age="+age+",
sex='"+sex+"', friendpolicy="+policy+", password='"+newpwd+"',
faceid="+faceid+" where id="+me.getId();
}
//修改前提示
UserDao udao = new UserDao();
int result = JOptionPane.showConfirmDialog(this,"确定要修改自己的信息
吗,","提示
",JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE);
if(result == JOptionPane.YES_OPTION){
udao.updateUser(sql);
//更新me的数据
me.setFaceid(faceid);
me.setNickname(nickname);
me.setAge(age);
me.setSex(sex);
me.setFriendpolicy(policy);
}
this.dispose();
frame.updateSelf();
22
河南理工大学电子商务课程设计
5、致谢
本设计是在吴正江老师的悉心指导下完成的,衷心感谢他在课程设计期间给与我的热情帮助和指导。吴正江老师渊博的知识,认真负责的工作作风,平易近人的态度让我获益匪浅。在此,向吴正江老师表示最衷心的感谢和最诚挚的敬意。
还要感谢我的同学,他在我们的课程设计过程中提出了很多建设性的意见,并给了我们很多启发。
在此期间,我不仅学到了许多新的知识,而且也开阔了视野,提高了自己的设计能力。 其次,我要感谢帮助过我的同学,他们也为我解决了不少我不太明白的设计的难题。 6、参考文献:
《软件开发JSP基础与案例开发详解》张孝祥 徐明华 编著 清华大学出版社 《计算机网络》 谢希仁 编著 电子工业出版社
《软件工程》
《Java编程语言》(第三版)
《精通Struts》--孙卫琴
《Tomcat与Java Web开发技术详解》—孙卫琴
23