第一篇:软件工程课程设计——物业管理系统
软件工程
——物业管理系统的开发
学生姓名: 武鹏艳 乔海亮
学生班级: 软件工程122002班
学生学号: 201220040220 201220040213 指导老师: 潘理虎 日 期: 2014.6.20
目录
一.背景分析...............................................................................................1 二.系统设计问题定义..............................................................................1 三.系统分析.............................................................................................1
1、现行系统分析................................................................................1
2、系统可行性分析............................................................................1 四.系统描述.............................................................................................2
1、系统需求具体描述........................................................................2
2、系统功能具体描述........................................................................3 五.系统流程图设计................................................................................3 六.系统功能模块图设计........................................................................4
1、系统性能需求分析......................................................................4
2、系统功能需求分析......................................................................5 七.系统功能模型设计............................................................................5 八.系统所涉及的实体联系设计............................................................5 九. 系统状态图设计..............................................................................6 十. 系统数据流图设计..........................................................................7 十一.系统人机交互界面的设计............................................................9 十二. 系统设计的实现........................................................................11 十三. 系统设计的代码附录................................................................20
一.背景分析
随着市场经济的发展和人们生活水平的提高,小区物业方面缴费方面越来越多,但缴费难的问题继续困扰着我们,需要有一个系统来实现银行卡交水电费,实现小区管理而且小区用户可以更好的维护小区各项物业管理业务,处理工作,实现缴费方便功能,就可以避免应缴费不及时而造成停电停水的情况发生。二.系统设计问题定义
1、实现对住户水电使用信息管理。
2、实现住户的信息查询与更新。三.系统分析(1)现行系统分析
以往住户的更替使水电费管理有些混乱,不能顺利收取费用。现在的系统会对小区水电管理存在的不完善之处做相应的改进,及时提醒住户缴费,而且对每户人员及时更新并做详细记录,为操作人员做权限设置。
(2)系统可行性分析 A系统成本效益分析
1、货币的时间价值
假设生命周期为t年,编写程序需m元,应用程序后,每年可节省n元,年利率为p。
2、纯收入
工程的纯收入是:r=n/(1+p)+n/(1+p)²+„„+n/(1+p)^n-m
3、投资回收率
m=F1/(1+j)+F2/(1+j)²+„„+Fn/(1+j)^n(Fi是第i年底效益,j是投资回收率。)B系统可行性综述
1、经济可行性:获益是当初投资总额的三倍或三倍以上,可以进行投资。
2、技术可行性:该系统简单、使用,且以现有的技术可以实现系统中的功能。
3、社会可行性:该系统面向全社会小区居民的物业管理,没有负面影响,并且可以为社会带来很高的效益。四.系统描述
(1)系统需求具体描述
所设计的物业管理系统,它是由住户信息管理,缴费管理,投诉管理,楼房管理组成的网络系统。a住户信息管理
由住户注册,注册姓名,联系方式,住址,邮箱,入住时间。注册成功后,由系统管理员统一管理,管理员可以进行查询,修改信息。住户注册成功可以进行登录系统进行查询,但是不可以修改。进行信息的修改需要投诉给管理员,管理员进行修改。b缴费管理
由住户执行,住户可以查询水电费使用情况,余额不足进行缴费,进入银行缴费界面,输入账号密码,进行缴费。
c投诉管理
由管理员进行查询,用户可以对小区物业管理水电费物业部门投诉建议。管理员可以根据客户要求,能对住户水电费信息、修改、查询和删除等操作,并且还要实现包括水、电、煤气费在内的各项物业管理费用的统计、查询和报表生成。d住户和管理员
住户可以管理自己的信息,可以提交投诉信息,可以浏览收费信息和缴费信息。管理员可以对纪录进行增加、删除、修改,管理投诉等更新操作。用户进入系统必须先输入用户名和密码,按“确认”按钮后,系统辨别用户身份,对合法用户根据用户的权限赋予相应的使用功能。
(2)系统功能具体描述
小区物业管理系统具体实现以下功能:
1.对小区所有房屋资料的录入和增,删,改,查询等功能的实现。
2.对本小区内住户的详细资料的管理,包括增,删,改,查询等功能的实现。
3.实现物业设备管理,仪表包括水,电数据管理,收费管理。仪表数据管理模块管理每个住户的水,电的资料,统计住户每月的用量以及需要交纳的费用,收费管理记录物业公司对住户的每一笔收费,包括水,电等使用费用和物业管理费用,余额不足进行银行卡充值。五.系统流程图设计
六.系统功能模块图设计
1、系统性能需求分析
所设计的系统主要涉及到四大部分:系统管理,基本信息管理,水电管理,费用查询。
(1)系统管理:管理系统操作人员,设置操作人员口令和权限。在满足不同系统用户的操作需求的基础上,提高系统的安全性。(2)基本信息管理:维护小区基本信息。
住户信息管理:入住登记,信息修改,迁出注销,查询。房屋信息管理:房屋信息添加,修改,删除,查询。户型信息管理:小区户型登记。(3)水电服务管理:完成小区各种服务,例如物业费用缴费管理功能。
(4)查询统计管理:本系统中各种数据的统计与查询功能。
2、系统功能需求分析
小区物业管理水电费物业部门用来对住宅小区内水费,电费,缴费情况信息管理系统。根据客户要求,系统要能对住户水电费信息、修改、查询和删除等操作,并且还要实现包括水、电、煤气费在内的各项物业管理费用的统计、查询和报表生成。因此,实现该物业管理系统功能模块图如下
七.系统功能模型设计
八.系统所涉及的实体联系设计
九.系统状态图设计(1)总状态图设计
(2)系统银行卡模块状态设计
十.系统数据流图设计
(1)系统数据流程图
(2)系统数据字典(1)
名字:用水信息记录表 别名:用水信息
描述:水量剩余小于临界值时报告住户
定义:用水信息记录表=户主信息+水量使用费+收费日期
位置:输出打印机(2)
名字:用电信息表 别名:电量信息
描述:剩余电量小于临界值时报告住户
定义:用电信息表=户主信息+电量使用费+收费日期 位置:输出打印机(3)
名字:住户信息表 描述:每户人员的详细信息
定义:住户信息表=住户姓名+性别+年龄+联系方式+证件号码 位置:输出打印机,显示在屏幕 十一.系统人机交互界面的设计 ①登陆界面的设计
②住户界面的设计
③管理员界面的设计
十二.系统设计的实现(1)数据库载入
(2).住户登陆成功界面
(3)住户界面
(4)住户修改信息
(5)住户查询物业信息
(6)住户反馈
(7)住户缴费
(8)银行卡登陆
(9)银行卡登陆成功
(10)银行卡缴费界面
(11)银行卡修改密码界面
(12)管理员登陆
(13)管理员界面
(14)管理员查询住户信息界面
(15)管理员修改住户信息
(16)管理员更新物业信息
(17)管理员添加管理员信息
(18)管理员接收反馈
(19)管理员接收反馈界面
十三.系统设计的代码附录
package xuesheng;
import javax.swing.*;import java.awt.event.*;import java.sql.*;
public class systems extends JFrame implements ActionListener { static systems ss;
JPanel panel = new JPanel();JLabel label1 = new JLabel(“输入姓名:”);JTextField name = new JTextField();JLabel label2 = new JLabel(“密 码:”);JPasswordField pwd = new JPasswordField();JButton Enter = new JButton(“登录”);JButton Exit = new JButton(“退出”);String url = “F:JAVA背景图片4.jpg”;ButtonGroup bgp = new ButtonGroup();JRadioButton ihb = new JRadioButton(“住户”);JRadioButton mg = new JRadioButton(“管理员”);
public systems(){
super(“物业系统登录”);
this.setResizable(false);JLabel img = new JLabel(new ImageIcon(url));
img.setBounds(0,0,500,100);
panel.add(img);
ihb.setBounds(165,210,70,20);
mg.setBounds(265,210,70,20);
bgp.add(ihb);
bgp.add(mg);
panel.add(ihb);
panel.add(mg);
Enter.setBounds(150,250,80,20);
Exit.setBounds(270,250,80,20);
Enter.addActionListener(this);
Exit.addActionListener(this);
panel.add(Enter);
panel.add(Exit);panel.setLayout(null);
this.add(panel);20
label1.setBounds(135,130,100,25);
panel.add(label1);name.setBounds(265,130,100,25);
panel.add(name);
label2.setBounds(135,165,100,25);
panel.add(label2);pwd.setBounds(265,165,100,25);
panel.add(pwd);
this.setBounds(100,100,500,350);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}
public void actionPerformed(ActionEvent e){
if(e.getSource()==Enter)
{
String username , password;
username = name.getText();
password = pwd.getText();
try
{
Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);
}
catch(ClassNotFoundException ce)
{
JOptionPane.showMessageDialog(ss,ce.getMessage());
}
if(ihb.isSelected())
{
try
{
//
Connection con = DriverManager.getConnection(“jdbc:sqlserver://localhost:1433;DatabaseName=物业管理系统”,“sa”,“11111111”);
String sql = “select * from inhabitant where 姓名=? and 密码=?”;
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, username);
pstmt.setString(2, password);
ResultSet rs = pstmt.executeQuery();
if(rs!=null)
{
JOptionPane.showMessageDialog(ss,“登陆成功”);
new inhabitants();
}
else
{
JOptionPane.showMessageDialog(ss,“登录失败”);
}
rs.close();
pstmt.close();
}
catch(SQLException se)
{
JOptionPane.showMessageDialog(ss,se.getMessage());
}
}
else if(mg.isSelected())
{
try
{
Connection con = DriverManager.getConnection(“jdbc:sqlserver://localhost:1433;DatabaseName=物业管理系统”,“sa”,“11111111”);
String sql = “select * from manager where 姓名=? and 密码=?”;
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, username);
pstmt.setString(2, password);
ResultSet rs = pstmt.executeQuery();
if(rs!=null)
{
JOptionPane.showMessageDialog(ss,“登陆成功”);
new managers();
}
else
{
JOptionPane.showMessageDialog(ss,“登录失败”);
}
rs.close();
pstmt.close();22
}
catch(SQLException se)
{
JOptionPane.showMessageDialog(ss,se.getMessage());
}
}
}
else
{
System.exit(0);
} }
public static void main(String[] args){
new systems();} }
package xuesheng;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class inhabitants extends JFrame implements ActionListener { JPanel panel=new JPanel();JMenuBar jmb = new JMenuBar();JMenu Message = new JMenu(“信息”);JMenu Payment = new JMenu(“缴费”);JMenu back = new JMenu(“反馈”);JMenuItem Item1 = new JMenuItem(“修改住户信息”);JMenuItem Item2 = new JMenuItem(“查询物业信息”);JMenuItem Item3 = new JMenuItem(“发送反馈”);JMenuItem Item4 = new JMenuItem(“交电费”);JMenuItem Item5 = new JMenuItem(“交水费”);String url = “F:JAVA背景图片36.jpg”;public inhabitants(){ 23
super(“住户界面”);
this.setSize(500,400);
this.setVisible(true);JLabel img = new JLabel(new ImageIcon(url));
img.setBounds(0,0,500,600);
panel.add(img);
panel.setLayout(null);
this.add(panel);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setJMenuBar(jmb);
jmb.add(Message);
jmb.add(back);
jmb.add(Payment);
Message.add(Item1);
Message.add(Item2);
back.add(Item3);
Payment.add(Item4);
Payment.add(Item5);
Item1.addActionListener(this);
Item2.addActionListener(this);
Item3.addActionListener(this);
Item4.addActionListener(this);
Item5.addActionListener(this);}
public void actionPerformed(ActionEvent e){
if(e.getSource()==Item1)
{
AlterInhabitantInformation ai = new AlterInhabitantInformation();
}
else if(e.getSource()==Item2)
{
Serch ser = new Serch();
}
else if(e.getSource()==Item3)
{
tickling ib=new tickling();
}
else if(e.getSource()==Item4)24
{
ATM atm=new ATM();
}
else if(e.getSource()==Item5)
{
ATM atm=new ATM();
} }
public static void main(String[] args){
inhabitants stu = new inhabitants();} }
package xuesheng;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class managers extends JFrame implements ActionListener { JMenuBar bar = new JMenuBar();JMenu menu1 = new JMenu(“信息”);JMenu menu2 = new JMenu(“反馈”);JMenuItem item1 = new JMenuItem(“查询住户信息”);JMenuItem item2 = new JMenuItem(“修改住户信息”);JMenuItem item3 = new JMenuItem(“更新物业信息”);JMenuItem item4 = new JMenuItem(“接收反馈”);JMenuItem item5 = new JMenuItem(“添加管理员信息”);String url = “F:JAVA背景图片36.jpg”;JPanel jpl = new JPanel();
public managers(){
super(“管理员界面”);
this.setSize(500,300);
this.setResizable(false);25
} this.setVisible(true);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setJMenuBar(bar);this.add(jpl);jpl.setLayout(null);bar.add(menu1);bar.add(menu2);menu1.add(item1);menu1.add(item2);menu1.add(item3);menu1.add(item5);menu2.add(item4);item1.addActionListener(this);item2.addActionListener(this);item3.addActionListener(this);item4.addActionListener(this);item5.addActionListener(this);public void actionPerformed(ActionEvent e){ if(e.getSource()==item1){
ReferMsg rm = new ReferMsg();} if(e.getSource()==item2){
AlterInhabitantInformations ai = new AlterInhabitantInformations();} else if(e.getSource()==item3){
AddMsg sc = new AddMsg();} else if(e.getSource()==item4){
tickling tl=new tickling();} else if(e.getSource()==item5){
managerinformation mf=new managerinformation();} } 26
public static void main(String[] args){
managers mng = new managers();} }
package xuesheng;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;import java.awt.font.*;import java.sql.*;
public class ReferMsg extends JFrame implements ActionListener { static ReferMsg s;JLabel title = new JLabel(“查询住户信息”,JLabel.CENTER);Font f = new Font(“楷体”,Font.BOLD+Font.ITALIC,16);JPanel jpl = new JPanel();JLabel label1 = new JLabel(“请输入门牌号:”,JLabel.CENTER);JTextField num = new JTextField();JButton serch = new JButton(“查询”);JButton fangqi = new JButton(“返回”);JLabel label2 = new JLabel(“门牌号:”,JLabel.LEFT);JLabel label3 = new JLabel(“姓名:”,JLabel.LEFT);JLabel label4 = new JLabel(“性别:”,JLabel.LEFT);JLabel label5 = new JLabel(“年龄:”,JLabel.LEFT);JLabel label6 = new JLabel(“籍贯:”,JLabel.LEFT);JLabel label7 = new JLabel(“身份证号:”,JLabel.LEFT);JLabel label8 = new JLabel(“电话:”,JLabel.LEFT);JLabel label9 = new JLabel(“职业:”,JLabel.LEFT);
JTextField[] txt ={ new JTextField(), new JTextField(), new JTextField(), new JTextField(), new JTextField(),new JTextField(), new JTextField(),new JTextField()};static int p = 140;
public ReferMsg()27
{ super(“查询住户信息”);this.setResizable(false);this.setSize(500,550);this.setVisible(true);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);title.setFont(f);this.add(jpl);jpl.setLayout(null);title.setBounds(80,20,300,20);jpl.add(title);label1.setBounds(100,60,90,20);jpl.add(label1);num.setBounds(200,60,140,20);jpl.add(num);serch.setBounds(130,100,90,20);fangqi.setBounds(240,100,90,20);jpl.add(serch);jpl.add(fangqi);serch.addActionListener(this);fangqi.addActionListener(this);label2.setBounds(100,140,140,20);label3.setBounds(100,180,140,20);label4.setBounds(100,220,140,20);label5.setBounds(100,260,140,20);label6.setBounds(100,300,140,20);label7.setBounds(100,340,140,20);label8.setBounds(100,380,140,20);label9.setBounds(100,420,140,20);jpl.add(label2);jpl.add(label3);jpl.add(label4);jpl.add(label5);jpl.add(label6);jpl.add(label7);jpl.add(label8);jpl.add(label9);
for(int i = 0;i txt[i].setBounds(200,p,140,20); jpl.add(txt[i]); p=p+40;} 28 } public void actionPerformed(ActionEvent e){ if(e.getSource()==fangqi) { this.setVisible(false); new managers(); } if(e.getSource()==serch) { String mp = num.getText(); try { Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”); } catch(ClassNotFoundException ce) { JOptionPane.showMessageDialog(s,ce.getMessage()); } try { Connection con = DriverManager.getConnection(“jdbc:sqlserver://localhost:1433;DatabaseName=物业管理系统”,“sa”,“11111111”); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(“select * from inhabitant where inhabitant.门牌号 ='” + mp + “' AND inhabitant.门牌号 = inhabitant.门牌号”); while(rs.next()) { for(int i = 0;i { txt[i].setText(rs.getString(i+1)); } } } catch(SQLException se) { JOptionPane.showMessageDialog(s,se.getMessage()); } } else { for(int i = 0;i { txt[i].setText(“"); } num.setText(”“); } } public static void main(String[] args){ ReferMsg s = new ReferMsg();} } package xuesheng; import java.awt.*; import javax.swing.*; import java.awt.event.*;import java.sql.*; public class Serch extends JFrame implements ActionListener { /*查询学生信息控件*/ static Serch s;JPanel jpl = new JPanel();JLabel SCH = new JLabel(”物业信息“,JLabel.CENTER);JLabel label1 = new JLabel(”请输入门牌号:“,JLabel.CENTER);JButton serch = new JButton(”查询“);JLabel label2 = new JLabel(”姓名:“,JLabel.CENTER);JLabel label3 = new JLabel(”电量:“,JLabel.CENTER);JLabel label4 = new JLabel(”水量:“,JLabel.CENTER);JLabel label5 = new JLabel(”性别:“,JLabel.CENTER);ButtonGroup bgp = new ButtonGroup();JRadioButton man = new JRadioButton(”男“);JRadioButton women = new JRadioButton(”女“);JTextField num = new JTextField();JTextField nam = new JTextField();JTextField ele = new JTextField();30 JTextField wat = new JTextField();JButton fangqi = new JButton(”返回“);public Serch(){ this.setSize(500,400);this.setVisible(true);this.setResizable(false);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.add(jpl);jpl.setLayout(null);serch.addActionListener(this);fangqi.addActionListener(this);/*查询面板*/ SCH.setBounds(100,20,300,20);jpl.add(SCH);label1.setBounds(100,60,100,20);jpl.add(label1);num.setBounds(220,60,140,20);jpl.add(num);serch.setBounds(120,100,90,20);fangqi.setBounds(260,100,90,20);jpl.add(serch);jpl.add(fangqi);label2.setBounds(100,140,70,20);jpl.add(label2);nam.setBounds(190,140,140,20);jpl.add(nam);label5.setBounds(100,180,70,20);jpl.add(label5);man.setBounds(205,180,60,20);women.setBounds(285,180,60,20);bgp.add(man);bgp.add(women);jpl.add(man);jpl.add(women);label3.setBounds(100,220,70,20);jpl.add(label3);ele.setBounds(190,220,140,20);jpl.add(ele);label4.setBounds(100,260,70,20);jpl.add(label4);wat.setBounds(190,260,140,20);jpl.add(wat);31 } public void actionPerformed(ActionEvent e){ if(e.getSource()==fangqi) { this.setVisible(false); new inhabitants(); } String mp = num.getText(); if(e.getSource()==serch) { try { Class.forName(”com.microsoft.sqlserver.jdbc.SQLServerDriver“); } catch(ClassNotFoundException ce) { JOptionPane.showMessageDialog(s,ce.getMessage()); } try { Connection con = DriverManager.getConnection(”jdbc:sqlserver://localhost:1433;DatabaseName=物业管理系统“,”sa“,”11111111“); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(”select * from PropertyInformation where 门牌号 = '“ + mp + ”'“); while(rs.next()) { nam.setText(rs.getString(”姓名“)); if(rs.getString(”性别“).equals(”男“)) { man.setSelected(true); } else { women.setSelected(true); } ele.setText(rs.getString(”电量“)); wat.setText(rs.getString(”水量“)); } } catch(SQLException se)32 { JOptionPane.showMessageDialog(s,se.getMessage()); } } } public static void main(String[] args){ Serch sch = new Serch();} } package xuesheng;import java.awt.*;import java.awt.event.*;class Selection extends Frame implements ActionListener{ Button button1,button2,button3,button4,button5;Panel p1 = new Panel();Panel p2 = new Panel();Panel p3 = new Panel();Panel p4 = new Panel();Panel p5 = new Panel();Panel p = new Panel();Account act; public Selection(){} Selection(String s,Account act){ super(s); this.act=act; this.setLayout(null); this.setLayout(new GridLayout(6,1)); p.add(new Label(”请选择你要的服务“)); this.add(p);/*各种服务功能*/ button1 = new Button(”缴水费“); p1.add(button1); this.add(p1); button2 = new Button(”交电费“); p2.add(button2); this.add(p2); button3 = new Button(”查询“);33 p3.add(button3);this.add(p3);button4 = new Button(”退出“);p4.add(button4);this.add(p4);button5 = new Button(”修改密码“);p5.add(button5);this.add(p5);this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } });button1.addActionListener(this);button2.addActionListener(this);button3.addActionListener(this);button4.addActionListener(this);button5.addActionListener(this);setBounds(150,150,225,275);setVisible(true);validate();} public void actionPerformed(ActionEvent e){ if(e.getSource()==button1){//取款 GetWater gw = new GetWater(”交水费“,act); } if(e.getSource()==button2){//取款 GetBalance gb = new GetBalance(”交电费“,act); } if(e.getSource()==button3){//查询余额 Query q =new Query(”查询余额“,act);} else if(e.getSource()==button4){//退出 System.exit(0); dispose();} else if(e.getSource()==button5){//修改密码 Account 修改密码; ChangePassword cp = new ChangePassword(”修改密码“,act);34 dispose(); } } } package xuesheng;import java.awt.Color;import java.awt.Font; import javax.swing.*;public class tickling { public tickling(){ //创建JFrame对象 JFrame f=new JFrame(”反馈“);//创建具有指定文本的JLbabel对象 JLabel Label=new JLabel(”反馈:“);Font ft = new Font(”黑体“ , Font.BOLD , 24); Label.setFont(ft); Label.setForeground(Color.black);//创建列数为20的JTextField对象 JTextField t=new JTextField(20);JPanel panel=new JPanel(); panel.add(Label);t.setBounds(70,100,300,120);panel.add(t);Font fo = new Font(”黑体“ , Font.BOLD , 24);t.setFont(fo);Label.add(t);f.setVisible(true); //将JLabel组件添加到JFrame窗体上 f.getContentPane().add(Label);f.getContentPane().add(Label);f.setSize(400,350);f.setVisible(true);} public static void main(String[] args){ 35 tickling tl = new tickling();} } package xuesheng; import java.awt.*; import javax.swing.*; import java.awt.event.*;import java.sql.*; public class AlterInhabitantInformation extends JFrame implements ActionListener { static AlterInhabitantInformation ss;JLabel[] label = {new JLabel(”门牌号:“), new JLabel(”姓名:“), new JLabel(”性别:“), new JLabel(”年龄:“), new JLabel(”籍贯:“), new JLabel(”身份证号:“), new JLabel(”电话:“), new JLabel(”职业:“)};JTextField[] txt = {new JTextField(), new JTextField(), new JTextField(), new JTextField(), new JTextField(),new JTextField(), new JTextField(),new JTextField()};JButton add = new JButton(”确认“);JButton fangqi = new JButton(”返回“);JPanel jpl = new JPanel();JLabel title = new JLabel(”修改住户信息“ , JLabel.CENTER);Font f = new Font(”黑体“ , Font.BOLD , 16);int s = 100; public AlterInhabitantInformation(){ super(”修改住户信息“); this.setResizable(false); this.setSize(500,600); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setVisible(true); this.add(jpl); add.addActionListener(this); fangqi.addActionListener(this); jpl.setLayout(null);36 title.setBounds(150,40,200,20); title.setFont(f); title.setForeground(Color.red); jpl.setBackground(Color.LIGHT_GRAY); jpl.add(title); for(int i = 0;i { label[i].setBounds(100,s,140,20); jpl.add(label[i]); txt[i].setBounds(260,s,140,20); jpl.add(txt[i]); s=s+40; } add.setBounds(150,s,80,20); fangqi.setBounds(250,s,80,20); jpl.add(add); jpl.add(fangqi);} public void actionPerformed(ActionEvent e){ if(e.getSource()==fangqi) { this.setVisible(false); new inhabitants(); } if(e.getSource()==add) { try { Class.forName(”com.microsoft.sqlserver.jdbc.SQLServerDriver“); } catch(ClassNotFoundException ce) { JOptionPane.showMessageDialog(ss,ce.getMessage()); } try { Connection con = DriverManager.getConnection(”jdbc:sqlserver://localhost:1433;DatabaseName=物业管理系统“,”sa“,”11111111“); Statement stmt = con.createStatement(); int a = stmt.executeUpdate(”insert into inhabitant(门牌号,姓名,性别,年龄,籍贯,身份证号,电话,职 37 业)values('“+txt[0].getText()+”','“+txt[1].getText()+”','“+txt[2].getText()+”','“+txt[3].getText()+”','“+txt[4].getText()+”','“+txt[5].getText()+”','“+txt[6].getText()+”','“+txt[7].getText()+”')“); if(a==1) { JOptionPane.showMessageDialog(ss,”添加成功“); } else { JOptionPane.showMessageDialog(ss,”添加失败“); } } catch(SQLException se) { JOptionPane.showMessageDialog(ss,se.getMessage()); } } else { for(int i = 0;i { txt[i].setText(”“); txt[0].requestFocus(); } } } public static void main(String[] args){ AlterInhabitantInformation as = new AlterInhabitantInformation();} } package xuesheng; import java.awt.*; import javax.swing.*; import java.awt.event.*;import java.sql.*;38 public class AlterInhabitantInformations extends JFrame implements ActionListener { static AlterInhabitantInformation ss;JLabel[] label = {new JLabel(”门牌号:“), new JLabel(”姓名:“), new JLabel(”性别:“), new JLabel(”年龄:“), new JLabel(”籍贯:“), new JLabel(”身份证号:“), new JLabel(”电话:“), new JLabel(”职业:“)};JTextField[] txt = {new JTextField(), new JTextField(), new JTextField(), new JTextField(), new JTextField(),new JTextField(), new JTextField(),new JTextField()};JButton add = new JButton(”确认“);JButton fangqi = new JButton(”返回“);JPanel jpl = new JPanel();JLabel title = new JLabel(”修改住户信息“ , JLabel.CENTER);Font f = new Font(”黑体“ , Font.BOLD , 16);int s = 100; public AlterInhabitantInformations(){ super(”修改住户信息“); this.setResizable(false); this.setSize(500,600); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setVisible(true); this.add(jpl); add.addActionListener(this); fangqi.addActionListener(this); jpl.setLayout(null); title.setBounds(150,40,200,20); title.setFont(f); title.setForeground(Color.red); jpl.setBackground(Color.LIGHT_GRAY); jpl.add(title); for(int i = 0;i { label[i].setBounds(100,s,140,20); jpl.add(label[i]); txt[i].setBounds(260,s,140,20); jpl.add(txt[i]); s=s+40; } add.setBounds(150,s,80,20); fangqi.setBounds(250,s,80,20); jpl.add(add);39 jpl.add(fangqi);} public void actionPerformed(ActionEvent e){ if(e.getSource()==fangqi) { this.setVisible(false); new managers(); } if(e.getSource()==add) { try { Class.forName(”com.microsoft.sqlserver.jdbc.SQLServerDriver“); } catch(ClassNotFoundException ce) { JOptionPane.showMessageDialog(ss,ce.getMessage()); } try { Connection con = DriverManager.getConnection(”jdbc:sqlserver://localhost:1433;DatabaseName=物业管理系统“,”sa“,”11111111“); Statement stmt = con.createStatement(); int a = stmt.executeUpdate(”insert into inhabitant(门牌号,姓名,性别,年龄,籍贯,身份证号,电话,职业)values('“+txt[0].getText()+”','“+txt[1].getText()+”','“+txt[2].getText()+”','“+txt[3].getText()+”','“+txt[4].getText()+”','“+txt[5].getText()+”','“+txt[6].getText()+”','“+txt[7].getText()+”')“); if(a==1) { JOptionPane.showMessageDialog(ss,”添加成功“); } else { JOptionPane.showMessageDialog(ss,”添加失败“); } } catch(SQLException se) { JOptionPane.showMessageDialog(ss,se.getMessage()); } 40 } else { for(int i = 0;i { txt[i].setText(”“); txt[0].requestFocus(); } } } } package xuesheng; import javax.swing.*; import java.awt.event.*;import java.sql.*; public class AddMsg extends JFrame implements ActionListener { static AddMsg s;/*添加住户信息控件*/ JPanel jpl = new JPanel();JLabel label1 = new JLabel(”更新物业信息“,JLabel.CENTER);JLabel label2 = new JLabel(”门牌号:“,JLabel.CENTER);JLabel label3 = new JLabel(”姓名:“,JLabel.CENTER);JLabel label4 = new JLabel(”性别:“,JLabel.CENTER);JLabel label5 = new JLabel(”电量:“,JLabel.CENTER);JLabel label6 = new JLabel(”水量:“,JLabel.CENTER);JTextField num = new JTextField(2);JTextField nam = new JTextField(4);ButtonGroup bgp = new ButtonGroup();JRadioButton man = new JRadioButton(”男“);JRadioButton women = new JRadioButton(”女“);JTextField ele = new JTextField();JTextField wat = new JTextField();JButton fangqi = new JButton(”返回“);JButton addmsg = new JButton(”添加“); public AddMsg()41 { } super(”更新物业信息“);this.setResizable(false);this.setSize(500,400);this.setVisible(true);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.add(jpl);jpl.setLayout(null);addmsg.addActionListener(this);fangqi.addActionListener(this);/*插入面板*/ label2.setBounds(100,50,70,20);jpl.add(label2);num.setBounds(190,50,140,20);jpl.add(num); label3.setBounds(100,90,70,20);jpl.add(label3);nam.setBounds(190,90,140,20);jpl.add(nam); label4.setBounds(100,130,70,20);jpl.add(label4);man.setBounds(190,130,60,20);women.setBounds(270,130,60,20);jpl.add(man);jpl.add(women);bgp.add(man);bgp.add(women);label5.setBounds(100,170,70,20);jpl.add(label5);ele.setBounds(190,170,140,20);jpl.add(ele);label6.setBounds(100,210,70,20);jpl.add(label6);wat.setBounds(190,210,140,20);jpl.add(wat);fangqi.setBounds(120,250,90,20);addmsg.setBounds(240,250,90,20);jpl.add(fangqi);jpl.add(addmsg);42 public void actionPerformed(ActionEvent e){ if(e.getSource()==fangqi) { this.setVisible(false); new managers(); } if(e.getSource()==addmsg) { String sex; if(man.isSelected()) { sex=”男“; } else { sex=”女“; } try { Class.forName(”com.microsoft.sqlserver.jdbc.SQLServerDriver“); } catch(ClassNotFoundException ce) { JOptionPane.showMessageDialog(s,ce.getMessage()); } try { String number = num.getText(); String name = nam.getText(); String electyic = ele.getText(); String water = wat.getText(); //1注册驱动 Connection con = DriverManager.getConnection(”jdbc:sqlserver://localhost:1433;DatabaseName=物业管理系统“,”sa“,”11111111“); String sql = ”insert into PropertyInformation(门牌号 ,姓名, 性别 , 电量 , 水量)values(?,?,?,?,?)“; //2预处理 PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setString(1, number); pstmt.setString(2, name); pstmt.setString(3, sex); pstmt.setString(4, electyic);43 pstmt.setString(5, water); //3执行 int a = pstmt.executeUpdate(); if(a==1) { JOptionPane.showMessageDialog(s,”已成功添加“); } else { JOptionPane.showMessageDialog(s,”添加失败“); } pstmt.close(); } catch(SQLException se) { System.out.println(1); JOptionPane.showMessageDialog(s,se.getMessage()); } } else { num.setText(”“); nam.setText(”“); ele.setText(”“); wat.setText(”“); num.requestFocus(); } } public static void main(String[] args){ new AddMsg();} } package xuesheng;public class ATM{ public ATM(){ new WindowBox(”登录页面“);} public static void main(String [] args){ ATM atm=new ATM();} 44 } package xuesheng;import javax.swing.*;import java.awt.*;import javax.swing.border.*;import java.awt.event.*;import java.io.*;/*登陆页面首窗口*/ class WindowBox extends Frame implements ActionListener{ Box baseBox,box1,box2;TextField tf1,tf2;Button button1;Button button2;WindowBox(String s){//构造方法 super(s);tf1 = new TextField(6);tf2 = new TextField(6); box1= Box.createVerticalBox(); box1.add(new Label(”请输入你的卡号“));//输入卡号 box1.add(Box.createVerticalStrut(8)); box1.add(new Label(”请输入你的支付密码“));//输入密码 box2=Box.createVerticalBox(); box2.add(tf1); //box2.add(new TextField(16)); box2.add(Box.createVerticalStrut(8)); box2.add(tf2); //box2.add(new TextField(16)); baseBox=Box.createHorizontalBox(); baseBox.add(box1); baseBox.add(Box.createHorizontalStrut(10)); baseBox.add(box2); add(baseBox); button1= new Button(”确定“);//加入按钮 button1.addActionListener(this); add(button1); button2 = new Button(”退卡“);//退卡按钮 button2.addActionListener(this); add(button2); setLayout(new FlowLayout()); /*监听器*/ 45 this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); setBounds(220,225,225,275); setVisible(true);} public void actionPerformed(ActionEvent e){ Account act; String card;String pwd; act=new Account(”12“,”Devil“,”12“,50000);//初始化 /*选择各种服务*/ if(e.getSource()== button1){ String number1,number2;//输入的两个卡号和密码的变量 number1=tf1.getText(); number2=tf2.getText(); /*判断两次输入的卡号和密码是否正确*/ if((”123“.equals(number1))&&(”123“.equals(number2))) { Selection s = new Selection(”选择服务“,act); }else{ dispose(); ErrorWarn ew = new ErrorWarn();//报输入密码或卡号不正确 } } if(e.getSource()==button2){ System.exit(0); dispose();//退出 } } } package xuesheng;import javax.swing.*;import java.awt.*;import javax.swing.border.*;import java.awt.event.*;class Query extends Frame implements ActionListener{ 46 //Account act;Button button;Account act;Query(String s,Account act){//构造函数 super(s); this.act = act; button=new Button(”确定“); //TextField tf = new TextField(6); Panel panel1 = new Panel(); Panel panel = new Panel(); panel1.add(new Label(”你的余额为: “ + act.get_Money()));//查询余额的方法 //panel1.add(tf); button.addActionListener(this); panel.add(button); this.add(panel); this.add(panel1); this.setLayout(new GridLayout(2,1)); this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); setBounds(200,200,150,150); setVisible(true);} public void actionPerformed(ActionEvent e){ if(e.getSource()==button){ dispose(); Selection s = new Selection(”选择服务“,act);//返回选择服务 } } } package xuesheng;import javax.swing.*;import java.awt.*;import javax.swing.border.*;import java.awt.event.*;47 class GetBalance extends Frame implements ActionListener{ Box baseBox, box1,box2;Button button;TextField tf;Account act;GetBalance(String s,Account act){//构造函数 super(s); this.act=act; button=new Button(”确定“); Panel panel = new Panel(); Panel panel1 = new Panel(); tf = new TextField(6); this.setLayout(new GridLayout(2,1)); panel1.add(new Label(”请输入你想交电费的数目")); panel1.add(tf); panel.add(button); this.add(panel1); this.add(panel); button.addActionListener(this); this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); setBounds(200,200,150,150); this.setVisible(true);} public void actionPerformed(ActionEvent e){ //System.out.println(e.getActionCommand()); double money; money = Double.parseDouble(tf.getText().trim()); if(e.getSource()==button){ if(act.get_Money()<0){//判断余额是否为负 dispose(); ErrorWarn4 ew4 = new ErrorWarn4(); } else if(money<=act.get_Money()){//交费的数额不大于余额 if((money%100!=0)||(money>=5000)){ dispose(); ErrorWarn6 ew6 = new ErrorWarn6(); } 48 销售管理系统一.项目简介 随着计算机技术的迅猛发展,存在于网络的企业销售管理系统将逐步代替传统的管理模式进入企业。为了更高效得完成销售方面的工作,也可以有更多的时间处理更多的别的事务,企业也将摆脱原有的管理形势完全进入信息化管理。销售管理系统在企业的管理过程中起着巨大的作用 二.功能需求 一个销售管理系统,设计者的目标是满足公司运营和日常管理的需要,具有对产品,客户管理的功能。客户登录销售管理系统进行售后服务查询,销售员可以对销售的产品进行登记,并将销售情况反馈给数据库。为管理的方便性和信息传递的快速性提供了一个很好的平台。系统开发的总体任务是实现售后服务及销售登记自动化。总之,销售管理系统要实现登陆验证、商品销售管理、商品销售报表管理、客户信息管理四大部分。1.客户对功能的需求 1>查看自己的信息,了解自己近期的购买情况。2>查看产品的信息,熟悉产品情况。2>查看售后服务信息。 2.销售人员对功能的需求 1>查看自己的信息,了解自己近期的销售情况。2>查看产品的信息,熟悉产品情况。3>登记销售产品。 4>添加新产品,并填写产品相关信息。 3.售后服务人员对功能的需求 1>查看售后服务信息。2>添加售后服务信息。 三.分析模型时序图 销售管理系统顶层图 1.客户管理 第三层DFD图 客户管理子系统 2.销售管理 第三层DFD图 销售管理子系统 3.售后服务管理 第三层DFD图 售后服务管理子系统 4.客户登录动态时序图为 四.模块活动图,登录流程图 1.注册、登陆模块 1>模块功能描述 该模块主要实现对用户能否进入系统的确认以及对进入系统的用户权限的设定;因为本系统涉及到三类使用者,不可能每一类用户都具有相同的操作权限,如前所说,必然会早成系统的混乱和崩溃,严重影响其安全性和有效性。所以采取在通常的注册,登录模式下加上用户类型的选择,非常简洁地就完成了对用户类型的区别及权限的划分。2>在模块的详细设计后,便能得出实现该部分的具体流程,如图 用户注册模块程序流程图 登录模块程序流程图 活动图为: 2.客户管理模块 1>模块功能描述 显示客户的基本信息。库户可以查看自己的等级和交易次数。 2>在模块的详细设计后,便能得出实现该部分的具体流程,如图3-8。 客户管理模块流程图 活动图为: 3.销售管理模块 >模块功能描述 在这个模块可以登记销售记录。并且在提交记录时,更新数据库: (1)更新客户信息。如果是“老客户”系统会按照客户等级给出对应的优惠价。(2)更新产品信息。主要是更新该产品数量。 2>在模块的详细设计后,便能得出实现该部分的具体流程,如图 销售管理模块流程图 活动图为 五.数据库设计 1.客户信息表 字段khidkhnamegyshjchzhgzhugteladrkhtelfaxbzh数据类型IntVarCharVarCharVarCharnCharVarCharncharVarChartext是否是主键是否否否否否否否否是否为空否否否是是是否是是说明客户编号客户名称客户简称采购主管采购主管联系方式客户地址客户电话传真备注 2.商品进货表 字段数据类型intVarCharCharCharCharnumericnumericint是否是主键是否否否否否否否是否为空说明进货编号商品名称商品名称首拼大单位小单位进货成本jhbhshpmchshpshpddwxdwjhchbxshjgjhshulgyshjhrqbzh否否否否是否否否销售价格进货数量供应商进货日期备注VarCharsmalldatetimeVarChar否否否是否是 3.商品销售表 字段xshbhshpmchshpshpxshjgxshshlxshryxshrqkhbzh数据类型IntVarCharVarCharNumericIntVarCharSmalldatetimeVarChartext是否是主键是否否否否否否否否是否为空否否否是是是否是是说明销售编号商品名称商品名称首拼销售价格销售数量销售人员销售日期客户简称备注 六.运行界面与代码 1.登陆窗口 Dim conn As ADODB.Connection Dim rs As ADODB.Recordset Private Sub CmdOk_Click()If UserName.Text <> “" And PassWord.Text <> ”“ Then Set conn = New ADODB.Connection Set rs = New ADODB.Recordset conn.Open ”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=“ & App.Path & ”人事.mdb;Persist Security Info=False“ rs.Open ”select * from usermanage where username='“ & UserName.Text & ”'“, conn, 1, 1 If Not rs.EOF Then If rs(”password“)= PassWord.Text Then Main.Show Unload Me Else MsgBox ”非法登录,密码错误!“, vbOKOnly, ”警告“ End If Else MsgBox ”非法登录,找不到该用户!“, vbOKOnly, ”警告“ End If Else MsgBox ”用户名或密码不能为空!“, vbOKOnly, ”提示“ End If End Sub Private Sub PassWord_KeyPress(KeyAscii As Integer)If KeyAscii = 13 Then Call CmdOk_Click End If End Sub Private Sub UserName_KeyPress(KeyAscii As Integer)If KeyAscii = 13 Then Call CmdOk_Click End If End Sub `2.主界面 Private Sub Cmd_Click(Index As Integer)Select Case Index Case 0 GoodsIn.Show Me.Enabled = False Case 1 Saler.Show Me.Enabled = False Case 2 SaleData.Show Me.Enabled = False Case 3 SaleTotal.Show Me.Enabled = False Case 4 UserM.Show Me.Enabled = False End Select End Sub `进货管理 Private Sub Cmd_Click(Index As Integer)Select Case Index Case 0 '第一条 Adodc1.Recordset.MoveFirst Case 1 '上一条 If Not Adodc1.Recordset.BOF Then Adodc1.Recordset.MovePrevious End If Case 2 '下一条 If Not Adodc1.Recordset.EOF Then Adodc1.Recordset.MoveNext End If Case 3 '最尾条 Adodc1.Recordset.MoveLast Case 4 '添加 Adodc1.Recordset.AddNew For i = 0 To 7 GoodText(i).Enabled = True Next Cmd(6).Enabled = True Case 5 '修改 For i = 0 To 7 GoodText(i).Enabled = True Next Cmd(6).Enabled = True Case 6 '保存 Adodc1.Recordset.Update For i = 0 To 7 GoodText(i).Enabled = False Next MsgBox ”更新记录成功!“, vbOKOnly, ”提示“ Cmd(6).Enabled = False Case 6 '删除 If MsgBox(”确定删除当前记录,数据将不可恢复?“, vbOKCancel, ”提示“)= vbOK Then Adodc1.Recordset.Delete End If End Select End Sub Private Sub Form_Load()Adodc1.ConnectionString = ”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=“ & App.Path & ”人事.mdb;Persist Security Info=False“ Adodc1.RecordSource = ”select * from save“ For i = 0 To 6 Set GoodText(i).DataSource = Adodc1 GoodText(i).DataField = Adodc1.Recordset.Fields(i).Name Next Adodc1.Refresh Set DataGrid1.DataSource = Adodc1 End Sub Private Sub Form_Unload(Cancel As Integer)Main.Enabled = True End Sub `销售管理 Dim conn As ADODB.Connection Dim rs As ADODB.Recordset Public id As String Public action As String Private Sub Cmd_Click(Index As Integer)Select Case Index Case 0 '第一条 If Not Adodc1.Recordset.BOF Then Adodc1.Recordset.MoveFirst End If Case 1 '上一条 If Not Adodc1.Recordset.BOF Then Adodc1.Recordset.MovePrevious End If Case 2 '下一条 If Not Adodc1.Recordset.EOF Then Adodc1.Recordset.MoveNext End If Case 3 '最尾条 If Not Adodc1.Recordset.EOF Then Adodc1.Recordset.MoveLast End If Case 4 '添加 action = ”add“ ManageSale.Show Me.Enabled = False Case 5 '修改 action = ”modify“ id = Adodc1.Recordset.Fields(”id“)ManageSale.Show Me.Enabled = False Case 7 '删除 If MsgBox(”确定删除当前记录,数据将不可恢复?“, vbOKCancel, ”提示“)= vbOK Then Set conn = New ADODB.Connection Set rs = New ADODB.Recordset conn.Open ”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=“ & App.Path & ”人事.mdb;Persist Security Info=False“ rs.Open ”select goodcount from save where goodnum='“ & GoodText(0).Text & ”'“, conn, 1, 3 rs(”goodcount“)= rs(”goodcount“)+ GoodText(5).Text rs.Update rs.Close Adodc1.Recordset.Delete End If End Select End Sub Private Sub Form_Load()Adodc1.ConnectionString = ”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=“ & App.Path & ”人事.mdb;Persist Security Info=False“ Adodc1.RecordSource = ”select * from sale order by id“ For i = 0 To 6 Set GoodText(i).DataSource = Adodc1 GoodText(i).DataField = Adodc1.Recordset.Fields(i + 1).Name Next Adodc1.Refresh Set DataGrid1.DataSource = Adodc1 End Sub Private Sub Form_Unload(Cancel As Integer)Main.Enabled = True End Sub 添加修改销售记录 Dim conn As ADODB.Connection Dim rs As ADODB.Recordset Public salecount As Long Private Sub Combo1_Change()End Sub Private Sub Cmd_Click(Index As Integer)Select Case Index Case 0 Set conn = New ADODB.Connection Set rs = New ADODB.Recordset conn.Open ”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=“ & App.Path & ”人事.mdb;Persist Security Info=False“ If GoodText(0)= ”“ Or GoodText(3)= ”“ Or GoodText(4)= ”“ Then MsgBox ”数据没有输入完整,请重新输入!“, vbOKOnly, ”提示“ Exit Sub End If If SaleData.action = ”add“ Then rs.Open ”select * from sale“, conn, 1, 3 rs.AddNew Else rs.Open ”select * from sale where id=“ & SaleData.id, conn, 1, 3 End If rs(”Goodnum“)= GNum.Text rs(”goodname“)= GoodText(1).Text rs(”danwei“)= GoodText(2).Text rs(”outdate“)= GoodText(3).Text rs(”danjia“)= GoodText(4).Text rs(”outcount“)= GoodText(0).Text rs(”salename“)= SaleName.Text rs.Update rs.Close rs.Open ”select * from save where goodnum='“ & GNum.Text & ”'“, conn, 1, 3 '在库存表中将库存数量减去已售出的数量 If SaleData.action = ”add“ Then rs(”goodcount“)= rs(”goodcount“)(GoodText(0).Text-salecount)End If rs.Update rs.Close MsgBox ”数据更新成功!“, vbOKOnly, ”提示“ SaleData.Adodc1.Refresh Unload Me Case 1 Unload Me End Select End Sub Private Sub Form_Load()Set conn = New ADODB.Connection Set rs = New ADODB.Recordset conn.Open ”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=“ & App.Path & ”人事.mdb;Persist Security Info=False“ Dim saleman As String If SaleData.action = ”add“ Then rs.Open ”select goodnum from save order by goodnum“, conn, 1, 1 Do While Not rs.EOF GNum.AddItem rs(0)rs.MoveNext Loop GNum.Text = GNum.List(0)Else rs.Open ”select * from sale where id=“ & SaleData.id, conn, 1, 1 GNum.AddItem rs(”goodnum“)GoodText(1).Text = rs(”goodname“)GoodText(2).Text = rs(”danwei“)GoodText(3).Text = rs(”outdate“)GoodText(4).Text = rs(”danjia“)GoodText(0).Text = rs(”outcount“)saleman = rs(”salename“)GNum.Text = GNum.List(0)GNum.Enabled = False rs.Close rs.Open ”select * from save where goodnum='“ & GNum.Text & ”'“, conn, 1, 1 SaleNum.Max = GoodText(0).Text + rs(”goodcount“)salecount = GoodText(0).Text End If rs.Close rs.Open ”select salename from saler order by id“, conn, 1, 1 Do While Not rs.EOF SaleName.AddItem rs(0)rs.MoveNext Loop If SaleData.action = ”add“ Then SaleName.Text = SaleName.List(0)Else SaleName.Text = saleman Cmd(0).Caption = ”保存修改“ End If rs.Close End Sub Private Sub Form_Unload(Cancel As Integer)SaleData.Enabled = True End Sub Private Sub GNum_Click()Set conn = New ADODB.Connection Set rs = New ADODB.Recordset conn.Open ”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=“ & App.Path & ”人事.mdb;Persist Security Info=False“ rs.Open ”select * from save where goodnum='“ & GNum.Text & ”'“, conn, 1, 1 If Not rs.EOF Then GoodText(1).Text = rs(”goodname“)GoodText(2).Text = rs(”danwei“)SaleNum.Max = rs(”goodcount")End If End Sub 目 录 目录...............................................................................................................第一章 绪 论.................................................................................................1.1 开发背景说明....................................................................................1.2课程设计目的.....................................................................................1.3课程题目及内容.................................................................................1.4课程设计要求.....................................................................................1.5预期目标.............................................................................................1.6 系统环境............................................................................................第二章 可行性分析.........................................................................................2.1 可行性研究前提................................................................................2.2 经济上可行性....................................................................................2.3 技术可行性........................................................................................2.4目标方案可行性.................................................................................2.5操作可行性.........................................................................................第三章 需求分析.............................................................................................3.1引言.....................................................................................................3.2任务陈述.............................................................................................3.3市场需求分析.....................................................................................3.4系统功能需求分析.............................................................................3.5系统性能需求分析.............................................................................3.6 系统业务数据流...................................................错误!未定义书签。3.7用例分析...........................................................................................3.8用例列表...........................................................................................3.9绘制系统模型图...............................................................................第四章 系统概要设计...................................................................................4.1模块分析和概要设计.......................................................................4.2 系统数据库逻辑结构设计..............................................................4.3概念模型转换为关系数据模型.......................................................4.4 数据库设计......................................................................................第五章 详细设计...........................................................................................5.1登录管理...........................................................................................-***39424243443 入帐目时的错误,可以根据职工的考勤、职务、部门、各种税费等等,自动求出工资。为了便于企业领导掌握本企业的工资信息在系统中应加入各种查询功能,包括个人信息、职工工资、本企业内某一个月或某一部门的工资情况查询。系统应能输出各类统计报表。 本系统需要完成的功能主要有:系统数据初始化;职工基本信息数据的输入、修改、删除;企业工资的基本设定;职工工资的浏览;职工个人工资表的查询;职工工资的计算;工资报表打印。 数据流: 职工基本状况:包括职工编号、职工姓名、性别、年龄、职位等。工资级别和工资金额:包括工资等级、工资额。 企业部门及工作岗位信息:包括部门名称、工作岗位名称、工作岗位工资等。工资信息:包括职工编号、职工姓名、职工基本工资、职工岗位工资、职工工龄工资、公司津贴、职工实发工资等。工龄和工资金额:包括工龄及对应工资额。 1.4课程设计要求 坚持“规格严格,功夫到家”的优良传统,加强基本功训练,做到理论与实际相结合,继承与创新相结合,充分发挥学生的主观能动性与教师因材施教、严格要求相结合,抓智力因素教育与非智力因素教育相结合,教书育人。所设计的工资管理系统应包含输入输出、修改、删除、查询等基本功能。根据题目的基本需求,画出流程图、用例图、类图等,编写程序,并写出详细的设计说明书。课程设计过程中,要严格遵守课程设计的时间安排,听从指导教师的指导。正确地完成上述内容,规范完整地撰写出课程设计报告。 1.5预期目标 计划设计:对于企、事业单位的工资发放来说,不需要太大型的数据库系统,只需要一个操作方便,功能实用,能满足财务部门对工资及时的发放。本工资管理系统预期目标就是实现如下的一些功能:查询浏览记录功能,增加记录功能、修改记录功能、删除记录功能、刷新记录功能、最后实现统计计算功能。 1.6 系统环境 1.6.1硬件:个人PC 1.6.2软件: Windows XP、Microsoft Visual C++6.0、Rational Rose。 第二章 可行性分析 2.1 可行性研究前提 要求:满足对工资管理的基本要求及功能,并对职工信息收集、处理、保存。目标:实现无纸化办公,节省成本,提高工作效率。 条件、假定、限制:当企业工资管理的信息量和复杂程度达到某一限度时,即管理人员的劳动强度超过其承受能力时,就必须采用新的管理手段,如用计算机技术对信息的收集、加工、传递和存贮等,这样,一个工资管理系统就可以对企业职工工资进行高效、合理、恰当地管理。 2.2 经济上可行性 开发成本要低廉。 效益:大幅度地提高工资管理信息系统的工作质量和效率,让企业掌握整个工资管理系统的全面情况,为管理人员提供了准确的工资管理信息,促进工资管理工作的规范化及各项管理制度与指标体系的建立和健全;提供各种加工处理了的工资管理信息,以满足工资管理的特殊要求,适应新形势对职工队伍提出的新要求。 效益/投资比:暂时无法估算。投资回收期内: (1)企业有能力承担系统开发费用。 (2)新系统将为企业带来经济效益。管理系统是一个信息化、智能化和先进。理理念的集合体。而管理是一个动态过程,在其运行过程中要采取多项措施。其最主要的表现就是减少了企业管理费用和人力开支。 2.3 技术可行性 (1)软件需求:操作系统WINDOWS 2000 Advance Server以上。 硬件需求:赛扬1.7G CPU、512M内存 80G硬盘的计算机。(2)本系统采用VC++实现,依靠其强大的面向对象系统,与数据库管理系统相结合。 (3)要求掌握计算机技术,熟悉系统的功能和使用方法使系统能够顺利运行。 2.4目标方案可行性 计算机设备处理繁杂的工资增减问题,大幅度减少人力、物力,极大地提高企业的管理水平和管理效率。 管理水平和管理效率的提高能直接产生经济效益。 格,如完成任务表、考勤表、考核表、职工当月的扣款情况(包括水电费、病事假扣款等)等计算职工变动工资、个人所得税和应发放工资等,编制工资单。按类进行汇总,编制工资汇总表。将实发工资转入代发银行,由银行代发工资,并进行账务处理。工资结算过程主要设计如下会计账户:现金、银行存款、应付工资、其他应付款、其他应收款等。 3.3市场需求分析 工资管理系统是一个企业单位不可或缺的部分,他能为用户提供充足的信息和快捷的查询手段。一个工资管理系统可以高效能、大容量的收集、处理、存储工资管理信息,大幅度的工资管理信息系统的工作质量和效率。 能够为企业管理人员及时掌握整个工资管理系统的全面情况,提供系统的准确的工资管理信息,可以促进工资管理工作的规范化及各项管理制度与指标体系的建立和健全。为企业提供各种加工管理了工资管理信息,以满足工资管理的特殊要求,适应新形势对职工队伍建设提出的新要求,帮助管理人员选择方案,实现优化决策。虽然当前,不少单位的工资管理部门对于计算机应用还仅限于简单的单机应用,随着时间的推移、任务的复杂、用户的需求,其应用还会扩大。 3.4系统功能需求分析 工资管理系统涉及到员工基本信息的录入、修改和删除,工资标准的设定、查询和结算等。 典型的工资管理系统主要有以下基本功能: a)系统数据初始化 b)员工基本信息的录入、修改、删除等功能 c)工资标准的设定功能,集体包括职务工资、职称工资、其他工资标准和福利的设定。 d)工资信息的浏览 e)员工工资信息表的创建及查询 f)工资调整管理 g)工资计算 h)工资报表打印 3.5系统性能需求分析 3.5.1 需求分析总体目标 需求分析的目的在于与开发人员与用户之间达成系统开发的共识,使开发人员所考虑的系统在功能(系统能做什么)、简单操作,良好界面,个人信息保密性,系统安全与稳定,良好帐户管理,友好信息返回模式(如报表及打印功能)。 时,防止数据被不法分析任意的修改和破坏,对所有的敏感数据均进行基于SSL协议 的加密操作,只有对信息解密的人员才能最终读取数据信息。这样,能 最大程度的防止数据在传输过程的安全保密性。 3.6 系统业务数据流 3.6.1 数据流分析 数据流程图是一种能全面描述信息系统逻辑模型的主要工具,也是系统分析人员与用户进行交流的有效手段。本系统的数据流程图把握住对系统总体目标与总体功能的要求,基于上述的业务流程图,从科学性,合理性和可行性入手,采用自顶向下,逐层分解的方法建立本管理信息系统的逻辑模型,综合地反映出信息在本系统中的流动,处理和存储,具有抽象性和概括性.通过进行用户调查收集用户需求后,就要对用户需求进行分析,并表达用户的需求。采用结构化分析方法,主要采用数据流图对用户需求进行分析,用数字字典和加工说明对数据流图进行补充和说明。数据流图用于描述系统中数据流动的过程,反映的是加工处理的对象。 3.6.2 流程图,模块图如下: 流程图 模块图 112 3.9.2活动图: 分析用例中的逻辑流程,描述用例的事件流,进而画出各用例对应的活动图 用户登录活动图: 管理员工信息活动图: 3.9.3 类图: 类图是面向对象的软件开发中的一个核心概念。Rose中的类图用于描述软件系统中涉及到的类的相关信息,以及类与类之间的相互关系。 〔1〕类的识别 类的识别通常由分析员在分析问题域的基础上来完成。常用的方法有: a.名词识别法。 b.系统识别法。 c.从用例中识别类。 d.利用分解与抽象技术。〔2〕系统类图 3.9.4状态图: 状态图(State Diagram)用来描述一个特定对象的所有可能状态及其引起状态转移的事件。 3.9.5 时序图: 时序图用来描述对象之间动态的交互关系,着重体现对象间消息传送消息的时间顺序。下面分别给出各个用例的时序图: 用户登录时序图: 职工时序图: 71819 设计一般分为三个步骤: 〔1〕概念模型转换为关系数据模型。〔2〕关系模型的优化。〔3〕设计用户子模式书号。 4.3概念模型转换为关系数据模型 一般转换原则如下: 〔1〕一个实体转换为一个表(Table),则实体的属性转换为表的列(Column),实体的码转换为表的主键(Primary Key)。 〔2〕实体间的联系根据联系的类型,转换如下: ① 1:n 的联系: 1:n 的联系是比较普遍的联系,其转换比较直观。转换规律是在n 端的实体对应的表中增加属性,该属性是1 端实体对应表的主码。如:岗位和员工的关系是1:n 的联系。 ② m:n 的联系: 通过引进一个新表来表达两个实体间多对多的联系,新表的主码由联系两端实体的主码组合而成,同时增加相关的联系属性。如:部门与员工的联系是n:m 联系。 4.4 数据库设计 数据库的物理结构设计是指为逻辑数据模型选取一个最适合应用环境的物理结构(包括存储结构和存取方法),它完全取决于给定的计算机系统。物理结构可分两步进行。第一步是分析所得到的各种数据模型,依据在实际执行时可能产生的数据容量以及各种数据模型之间的相互依赖程度等,确定数据库的物理结构;第二步则要根据某种方法对所设计的物理结构进行评价,评价重点是时间和空间的效率。数据库实施是指建立数据库,编制与调试应用程序,组织数据入库,并进行试运行。 根据人员规模,我们只建立起一个数据库,在此数据库基础上建立起如下表: ·职工表 ·用户表 ·工资表 下面说明各表的字段名称和数据类型: 工资表: 职工表: 用户表: 第五章 详细设计 详细设计阶段主要是将系统中的每个模块完成的功能进行具体描述。 5.1登录管理 根据系统总体结构可以得出登录管理模块实现用户登录、密码修改和退出系统三个功能。其中,退出系统实现流程很容易,只需要一行代码即可;用户登录的实现流程是用户在登录窗口输入用户名称和密码,如果没有用户名和密码可以进行注册后再登录,选择了用户角色后,单击【登录】按钮进行提交,系统开始验证用户提交的登录信息是否正确。如果正确,则打开工资管理系统,并根据用户角色赋于相应的操作权限;否则给出错误信息。 5.1.1界面设计 登录界面如下: 5.1.2 代码 部分核心代码设计: void CZHUCE::OnButton1(){ UpdateData(TRUE);if(m_username.IsEmpty()||m_password.IsEmpty()||m_password2.IsEmpty()){AfxMessageBox(“请将资料填写完整!”);m_password2.Empty(); m_password.Empty(); UpdateData(FALSE); return;} OnInitADOConn();if(m_password2==m_password){ CString str; str.Format(“insert into 用户表(用户名,密码)('%s','%s')”,m_username,m_password); _variant_t var; int fieldrow; try{//捕捉表的主键存在重复值的异常 m_pConnection->Execute((_bstr_t)str,&var,adCmdText); fieldrow=(int)V_I2(&var); } catch(...) { AfxMessageBox(“用户名已存在,注册失败”); m_username.Empty(); m_password.Empty(); m_password2.Empty(); UpdateData(FALSE); return;} AfxMessageBox(“注册成功,请返回登录!”); m_pConnection->Close(); Clogin clg; clg.DoModal();} else{AfxMessageBox(“两次密码输入不一样,注册失败!”); m_username.Empty(); m_password.Empty();m_password2.Empty(); }} UpdateData(FALSE);return;void CZHUCE::OnInitADOConn()try {//创建连接对象实例 } catch(_com_error e){ AfxMessageBox(e.Description());m_pConnection.CreateInstance(“ADODB.Connection”);//设置连接字符串 Cstring strConnect=“Provider=Microsoft.Jet.OLEDB.4.0;Data Source=salary.mdb;Persist Security Info=False;”;//使用Open方法连接数据库 m_pConnection->Open((_bstr_t)strConnect,“",”“,adModeUnknown); } try{if(m_pConnection==NULL){OnInitADOConn();} m_pRecordset.CreateInstance(__uuidof(Recordset));m_pRecordset->Open(sqlstr,m_pConnection.GetInterfacePtr(),adOpenDyna } catch(_com_error e){ e.Description();} return m_pRecordset; mic,adLockOptimistic,adCmdText); 5.1.3修改密码模块: 成功登录主界面: 5.2用户管理 用户管理模块用于实现用户的添加、删除、更新功能。5.2.1新增用户模块: 627UpdateData(TRUE);if(m_Bianhao.IsEmpty()||m_Name.IsEmpty()){AfxMessageBox(”not null“);return;} OnInitADOConn();CString str;str.Format(”update 职工表 set 性别='%s',年龄=%d,电话='%s',住址='%s',位='%s',备 注 ='%s' where 职 工 编 号='%s'“,m_Sex,m_Age,m_Telphone,m_Address,m_Zhiwei,m_Beizhu,m_Bianhao);m_pConnection->Execute((_bstr_t)str,NULL,adCmdText);m_pConnection->Close();m_zhglist.DeleteAllItems();AddToGrid();ClearAll();UpdateData(FALSE); {// TODO: Add your control notification handler code here } void CGXZHG::OnButton4(){ UpdateData(TRUE);if(m_tiaojian.IsEmpty()){AfxMessageBox(”请选择删除的职工!“);return;} OnInitADOConn();CString bstrSQL;bstrSQL.Format(”delete from 职工表 where 职工编号CMAKESURE cmake;if(cmake.DoModal()!=IDOK){ } m_pConnection->Execute((_bstr_t)bstrSQL,NULL,adCmdText);m_pConnection->Close();m_zhglist.DeleteAllItems();AddToGrid();ClearAll();AfxMessageBox(“删除成功!”);UpdateData(FALSE);return;='%s'“,m_tiaojian);UpdateData(TRUE);m_type.GetWindowText(m_Type);if(m_Type.IsEmpty()){AfxMessageBox(”请选择查询的方式!“);return;} if(m_tiaojian.IsEmpty()){AfxMessageBox(”请输入查询的职工编号!“);return;} OnInitADOConn();CString sql; 部分核心代码如下: void CTXGZ::OnButton2() {// TODO: Add your control notification handler code here 息!”); if(m_Bianhao.IsEmpty()||m_Jibengz==NULL||m_Yuefen.IsEmpty()){AfxMessageBox(“编号不允许空值,请重新填写!”);ClearALL();return;} OnInitADOConn();float CString cstr1;cstr1.Format(“%.2f”,f1);m_yfsh.SetWindowText(cstr1);float f2=m_Fangzu+m_Chuxu+m_Huifei;CString cstr2;cstr2.Format(“%.2f”,f2);m_yksh.SetWindowText(cstr2);float f4;f4=calculator(f1-f2);float f3=f1-f2-f4;CString cstr3;cstr3.Format(“%.2f”,f3);m_shfsh.SetWindowText(cstr3);CString cstr4;cstr4.Format(“%.2f”,f4);m_grsdsh.SetWindowText(cstr4);CString str;str.Format(“insert into 工 资 表 values UpdateData(TRUE);m_yuefen.SetCurSel(0);// AfxMessageBox(”该编号的职工不存在,请先到职工管理添加职工信f1=m_Jibengz+m_Jintie+m_Gangtie+m_Butie+m_Fangtie+m_Jiaotongbt;('%s','%s',%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f)“,m_ } void CTXGZ::ClearALL(){ } void CTXGZ::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult){// TODO: Add your control notification handler code here m_pConnection->Close();m_gzlist.DeleteAllItems();AddToGrid();m_yuefen.SetCurSel(0);ClearALL();m_Jibengz=NULL;m_Jintie=NULL; m_Shfsh.Empty();m_Yfsh.Empty();m_Yksh.Empty();m_Yuefen.Empty();m_Chaxun.Empty();m_Jiaotongbt=NULL;m_Huifei=NULL;m_Grsdsh.Empty();m_Fangzu=NULL;m_Fangtie=NULL;m_Chuxu=NULL;m_Bianhao=”“;m_Gangtie=NULL;UpdateData(FALSE);int position=m_gzlist.GetSelectionMark();m_Bianhao=m_gzlist.GetItemText(position,0);m_Chaxun=m_gzlist.GetItemText(position,0);m_Yuefen=m_gzlist.GetItemText(position,1);m_Jibengz=atof(m_gzlist.GetItemText(position,2));m_Jintie=atof(m_gzlist.GetItemText(position,3));m_Gangtie=atof(m_gzlist.GetItemText(position,4)); 3return;} void CTXGZ::OnButton5(){ } float CTXGZ::calculator(float a){float b=a-2000; } if(b<0){b=0;} if(0=500&&b<2000){return b=b*10/100-25;} if(b>=2000&&b<5000){return b=b*15/100-125;} if(b>=5000&&b<20000){return b=b*20/100-375;} if(b>=20000&&b<40000){return b=b*25/100-1375;} if(b>=40000&&b<60000){return b=b*30/100-3375;} if(b>=60000&&b<80000){return b=b*35/100-6375;} if(b>=80000&&b<100000){return b=b*40/100-10375;} if(b>=100000){ return b=b*45/100-15375;} UpdateData(TRUE);if(m_Chaxun.IsEmpty()){AfxMessageBox(”请输入查询的职工编号!“);return;} OnInitADOConn();CString sql;sql.Format(”select * from 工资表 where 职工编号='%s'“,m_Chaxun);m_pConnection->Execute((_bstr_t)sql,NULL,adCmdText);m_pConnection->Close();m_gzlist.DeleteAllItems();ClearALL();m_Chaxun=m_Chaxun;m_yuefen.SetCurSel(0);UpdateData(FALSE);5.5查询管理 该模块实现功能是职工查询工资的详细信息,查询个人详细信息的功能。 5.5.1职工信息查询: 5.5.2工资信息查询: 部分核心代码如下: void CGXGZ::OnButton1(){ UpdateData(TRUE); if(m_Chaxun.IsEmpty()){AfxMessageBox(”请输入查询的职工编号!“);return;} OnInitADOConn();CString sql;sql.Format(”select * from 工资表 where 职工编号='%s'“,m_Chaxun);m_pConnection->Execute((_bstr_t)sql,NULL,adCmdText);m_pConnection->Close();m_gzlist.DeleteAllItems();UpdateGrid();m_Chaxun.Empty(); 6UpdateData(FALSE);{//创建连接对象实例 } catch(_com_error e){ AfxMessageBox(e.Description());m_pConnection.CreateInstance(”ADODB.Connection“);//设置连接字符串 CString strConnect=”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=salary.mdb;Persist Security Info=False;“;//使用Open方法连接数据库 m_pConnection->Open((_bstr_t)strConnect,”“,”“,adModeUnknown); } OnInitADOConn();//设置查询字符串 CString bstrSQL;bstrSQL.Format(”select * from 工资表 where 职工编号='%s' order by 职//创建记录集指针对象实例 m_pRecordset.CreateInstance(__uuidof(Recordset));//打开记录集 m_pRecordset->Open((_bstr_t)bstrSQL,m_pConnection.GetInterfacePtr(),ad adLockOptimistic,adCmdText);工编号 desc “,m_Chaxun);OpenDynamic, while(!m_pRecordset->adoEOF){ m_gzlist.InsertItem(0,”“);m_gzlist.SetItemText(0,0,(char*)(_bstr_t)m_pRecordset->GetCollect(”职工编号 m_gzlist.SetItemText(0,1,(char*)(_bstr_t)m_pRecordset->GetCollect(“月份”));m_gzlist.SetItemText(0,2,(char*)(_bstr_t)m_pRecordset->GetCollect(“基本工资”));m_gzlist.SetItemText(0,3,(char*)(_bstr_t)m_pRecordset->GetCollect(“津贴”));m_gzlist.SetItemText(0,4,(char*)(_bstr_t)m_pRecordset->GetCollect(“岗贴”));m_gzlist.SetItemText(0,5,(char*)(_bstr_t)m_pRecordset->GetCollect(“补贴”));m_gzlist.SetItemText(0,6,(char*)(_bstr_t)m_pRecordset->GetCollect(“房贴”));m_gzlist.SetItemText(0,7,(char*)(_bstr_t)m_pRecordset->GetCollect(“交通补贴”));m_gzlist.SetItemText(0,8,(char*)(_bstr_t)m_pRecordset->GetCollect(“应发数”));m_gzlist.SetItemText(0,9,(char*)(_bstr_t)m_pRecordset->GetCollect(“房租”));m_gzlist.SetItemText(0,10,(char*)(_bstr_t)m_pRecordset->GetCollect(“储蓄”));m_gzlist.SetItemText(0,11,(char*)(_bstr_t)m_pRecordset->GetCollect(“会费”));m_gzlist.SetItemText(0,12,(char*)(_bstr_t)m_pRecordset->GetCollect(“个人所得税”));m_gzlist.SetItemText(0,13,(char*)(_bstr_t)m_pRecordset->GetCollect(“应扣数”));m_gzlist.SetItemText(0,14,(char*)(_bstr_t)m_pRecordset->GetCollect(“实发数”)); } void CGXGZ::ExitConnect(){if(m_pRecordset!=NULL) } m_pRecordset->Close();m_pConnection->Close();//将记录集指针移动到下一条记录 } //AfxMessageBox(“123”);//断开数据库连接 ExitConnect();m_pRecordset->MoveNext(); 第六章 系统测试 6.1 测试方法 (1)测试人员: 测试队伍由两位成员组成。软件的设计者在测试整个过程中负责整体测试方案的制定和测试进度的掌握以及白盒测试的测试者。第二位成员由未参加软件制作者担任,主要责任是进行软件的黑盒测试以及软件环境,硬件要求和极限测试工作。 (2)机器测试: 通过在计算机上直接运行被测程序,来发现程序中的错误。机器测试包括黑盒测试盒白盒测试。黑盒测试也称功能测试,将软件看作黑盒子,在完全不考虑程序的内部结构和特性的情况下,研究软件的外部特性。根据软件的需求规格说明书测试用例,从程序的输入和输出特性上测试是否满足设定的功能。白盒测试也称结构测试,将软件看作一个透明的白盒子,按照程序的内部结构和处理逻辑来选定测试用例,对软件的逻辑路径及过程进行测试,检查与测试是否相符。 6.2测试内容 1)软件的正常运行、关闭及退出时保存记录的提示。 2)用户登录界面友好,可操作性及安全性能较好,能对不同管理级别者进行限制,以保证数据库的安全。 3)数据库的可维护性好,数据的录入、删除及更改均能顺利完成,并能实现动态更新。 4)数据查询便捷,能对各种不同的查询条件搜索,以找到最合适的答案。5)数据溢出、越界均能进行非法提示,以警告用户正确使用。对用户的正常操作方式也提出警告。 6)数据类型填写错误时,系统能够报错。 7)软件对操作系统的兼容性良好,可移植性完好。 6.3测试结果 本系统有提示消息! 录入相同编号的数据: 该系统有报错功能! 查询职工工资信息: 查询职工信息成功! 1424344- 牟永敏 清华大学出版社 软件工程课程设计实验心得 经过一个星期的软件工程课程设计,本人在老师的指导下,顺利完成该课程设计。通过该课程设计,收获颇多。 一、对实验原理有更深的理解 通过该课程设计,掌握了什么是软件程序,软件程序工作的基本过程及其各阶段的基本任务,熟悉了软件程序总流程框图,了解了软件程序的生成过程、构造工具及其相关的技术对课本上的知识有了更深的理解,课本上的知识师机械的,表面的。通过把该算法的内容,算法的执行顺序在计算机上实现,把原来以为很深奥的书本知识变的更为简单,对实验原理有更深的理解。 二、对该理论在实践中的应用有深刻的理解 通过把该算法的内容,算法的执行顺序在计算机上实现,知道和理解了该理论在计算机中是怎样执行的,对该理论在实践中的应用有深刻的理解。 三、激发了学习的积极性 通过该课程设计,全面系统的理解了软件工程程序构造的一般原理和基本实现方法。把死板的课本知识变得生动有趣,激发了学习的积极性。把学过的软件工程的知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。以前对与计算机操作系统的认识是模糊的,概念上的,现在通过 自己动手做实验,从实践上认识了操作系统是如何处理命令的,如何协调计算机内部各个部件运行,对软件工程的认识更加深刻。课程设计中程序比较复杂,在调试时应该仔细,在程序调试时,注意指针,将不必要的命令去除。在这次课程设计中,我就是按照实验指导的思想来完成。加深了理解文件系统的内部功能及内部实现,培养实践动手能力和程序开发能力的目的。 四、理解了该知识点以及学科之间的融合渗透 本次课程设计程序部分是用C语言编写的,把《计算机操作系统》,《软件工程》,《算法分析与设计》《C语言》四门学科联系起来,把各个学科之间的知识融合起来,把各门课程的知识联系起来,对计算机整体的认识更加深刻。使我加深了对《计算机操作系统》,《软件工程》,《算法分析与设计》《C语言》四门课程的认识。 软件工程课程设计报告---个人帐本管理 一、需求分析 1、系统开发背景 当今社会是一个信息与科技并行的时代,在社会中消费时每个人都有的社会行为,消费与人的日常生活是息息相关的,一个人如果有一个很好的消费观的话能给自己带来很到好处。鉴于此目的,编写了一个小型的个人账本管理系统。此系统是一个简单的系统,可以管理个人的日常消费,可以为一般人所使用。对于业务较多的用户来说此系统就不是一个很好的选择。 2、软件主要组成及功能 收入模块 功能:录入收入 任何时间录入你所得到的收入(共有以下几种选择: 1、工资; 2、奖金; 3、其他收入;); 输入你所的到的金额; 录入金额的原因(可选); 支出模块 功能:支出的记录 什么时候 什么类型的支出(1、生活费; 2、日常用品; 3、休闲娱乐; 4、社交应酬; 5、交通费; 6、通讯费; 7、医疗保健; 8、其他支出)输入支出的金额 什么原因的支出 查询模块 功能:查询 以选择查询的类型(1、支出; 2、收入; 3、全部) 时间(1、今天; 2、昨天; 3、本周; 4、上周; 5、本月; 6、上月; 7、本年; 8、去年; 9、全部;)以及什么类别 消费的金额在什么范围之类的记录 将时间,类别,金额,备注显示出来 统计模块 功能:统计 选择统计的类型(1、支出; 2、收入;) 时间(1、今天; 2、昨天; 3、本周; 4、上周; 5、本月; 6、上月; 7、本年; 8、去年; 9、全部;)什么类别 统计的方式(1、总和; 2、平均值; 3、最大值; 4、最小值;)将时间,类别,方式,数值显示出来 管理模块 功能:完成系统相应的管理 可以对数据库进行备份 数据库的还原 查看日志操作。 修改模块 功能:对已有数据进行修改更新操作 对记录进行修改 对记录删除。 退出模块 退出此系统3、4、用户特点及一般约束 功能需求(DFD图) 收入 顶层图: 填写相应的信息收入录入事务确认成功录入成功 一层图: 收入录入事务填写相应的信息返回确认信息确认成功录入成功D:添加收入信息 支出 顶层图: 填写相应的信息支出录入事务确认成功录入成功 一层图: 填写相应的信息支出录入事务返回确认信息确认成功录入成功D:添加支出信息 查询 顶层图: 填写相应的信息查询命令输入事务确认成功查询成功 一层图: 查询命令输入事务填写相应的信息返回确认信息确认成功显示查询结果D:查询信息 统计 顶层图: 填写相应的信息统计命令输入事务确认成功显示统计结果 一层图: 填写相应的信息统计命令输入事务返回确认信息确认成功显示统计结果D:查询信息 管理 顶层图: 填写相应的信息管理命令输入事务确认成功管理成功 一层图: 管理命令输入事务填写相应的信息返回确认信息确认成功处理成功D:记录 查询 修改 顶层图: 填写相应的信息修改命令输入事务确认成功修改成功 一层图: 填写相应的信息修改命令输入事务返回确认信息确认成功修改成功D:查询数据库 5、外部接口需求 在用户界面方面要求对每一个操作都以主界面为前提弹出相应的对话框,硬软件接口方面没有特别的需求,一般用户都可以直接使用。 6、性能需求 因为系统本身较小,实际使用的人群的特点,响应时间可能有不同的要求。 7、软件属性需求 在数据的检索、数据的增删改方面必须做到丝毫不差,满足软件开发的正确性的要求。必须充分考虑软件的异常处理机制以及软件的复用性,以增强软件的健壮性。 在软件的保密性方面可以不用考虑,此软件主要是面向小型用户,对系统的保密没有要求。 所开发出来的软件必须是可维护的,要有可以升级的空间,要预留接口,方便后面软件的升级。 8、二、项目概要设计 1、总体设计(系统总流程图) 个人账本管理系统数据需求(ER图) 收入管理模块支出管理模块查询功能模块统计模块管理模块修改模块退出模块 2、各个界面的截图及相应的操作规则 在第一次运行是要首先运行此文件对控件进行注册。 第一次运行的结果如图所示 收入 支出 查询 统计 管理 退出 三、详细设计 1、进行项目详细设计工作; 2、写出详细设计说明书。 四、编 码 1、此系统用MFC来编写。 2、编码分工: 3、各个模块核心代码 查询模块: // CSelect 消息处理程序 void CSelect::OnBnClickedOk(){ // TODO: 在此添加控件通知处理程序代码 UpdateData(true);CString type,date,kind,count,start,end;m_type.GetLBText(m_type.GetCurSel(),type);m_date.GetLBText(m_date.GetCurSel(),date);m_kind.GetLBText(m_kind.GetCurSel(),kind);m_count.GetLBText(m_count.GetCurSel(),count);CTime t = CTime::GetCurrentTime();int tyear,tmonth,tday;CString year,month,day;tyear=t.GetYear();tmonth=t.GetMonth();tday=t.GetDay();if(date==“今天”){ year.Format(_T(“%d”),tyear); if(tmonth<10) month.Format(_T(“0%d”),tmonth); else month.Format(_T(“%d”),tmonth); if(tday<10) day.Format(_T(“0%d”),tday); //确定查询 else day.Format(_T(“%d”),tday); start=year+_T(“-”)+month+_T(“-”)+day; end=year+_T(“-”)+month+_T(“-”)+day;} CString str,str1,str2,str3,str4;ADOConn m_AdoConn;m_AdoConn.OnInitADOConn();CString sql; if(type==_T(“0”)&&kind!=_T(“所有收入”)) sql.Format(_T(“select 时间,类别,金额,备注from mymoney where 类型= ”+type+“ and 类别= '”+kind+“' and 时间>= '”+start+“'and 时间<= '”+end+“' and 金额>= ”+count+“ order by 时间asc”)); _RecordsetPtr m_pRecordset;m_pRecordset = m_AdoConn.GetRecordSet((_bstr_t)sql);m_list.DeleteAllItems();while(m_AdoConn.m_pRecordset->adoEOF==0){ m_list.InsertItem(0,_T(“")); m_list.SetItemText(0,0,(_bstr_t)m_pRecordset->GetCollect(_T(”时间“))); m_list.SetItemText(0,1,(_bstr_t)m_pRecordset->GetCollect(_T(”类别“))); m_list.SetItemText(0,2,(_bstr_t)m_pRecordset->GetCollect(_T(”金额“))); m_list.SetItemText(0,3,(_bstr_t)m_pRecordset->GetCollect(_T(”备注“))); m_pRecordset->MoveNext();} str=m_list.GetItemText(0,0);if(str==_T(”“)){ m_list.DeleteAllItems(); m_date.GetLBText(m_date.GetCurSel(),str1); m_kind.GetLBText(m_kind.GetCurSel(),str2); m_count.GetLBText(m_count.GetCurSel(),str3); str4=_T(”无此记录“); m_list.InsertItem(0,_T(”“)); } } m_list.SetItemText(0,0,str1);m_list.SetItemText(0,1,str2);m_list.SetItemText(0,2,str3);m_list.SetItemText(0,3,str4);管理模块: void CManage::OnBnClickedButton1()//数据库备份 { // TODO: 在此添加控件通知处理程序代码 m_button1.EnableWindow(false);m_button2.EnableWindow(true);m_static.SetWindowTextW(_T(”请选择备份目录:“));m_static.ShowWindow(SW_SHOW);m_button.ShowWindow(SW_SHOW);m_edit.ShowWindow(SW_SHOW);m_edit.SetWindowTextW(_T(”“));flag=1;strname=_T(”“);UpdateData(false);Invalidate(true);} void CManage::OnBnClickedButton2()//数据库还原 { // TODO: 在此添加控件通知处理程序代码 m_button2.EnableWindow(false);m_button1.EnableWindow(true);m_static.SetWindowTextW(_T(”请选择还原文件目录:“));m_static.ShowWindow(SW_SHOW);m_button.ShowWindow(SW_SHOW);m_edit.ShowWindow(SW_SHOW);m_edit.SetWindowTextW(_T(”“));flag=-1;strname=_T(”“);UpdateData(false);Invalidate(true);} void CManage::OnBnClickedButton3()//察看日志 { // TODO: 在此添加控件通知处理程序代码 CFile file;CTime t=CTime::GetCurrentTime();int tyear,tmonth,tday,thour,tmin,tsec;CString year,month,day,hour,min,sec;tyear=t.GetYear();tmonth=t.GetMonth();tday=t.GetDay();thour=t.GetHour();tmin=t.GetMinute();tsec=t.GetSecond();year.Format(_T(”%d“),tyear);month.Format(_T(”%d“),tmonth);day.Format(_T(”%d“),tday);hour.Format(_T(”%d“),thour);min.Format(_T(”%d“),tmin);sec.Format(_T(”%d“),sec); CString str;str=year+_T(”“)+month+_T(”“)+day+_T(” “)+hour+_T(”:“)+min+_T(” 察看日志rnrn“);} void CManage::OnBnClickedButton4()//浏览 { // TODO: 在此添加控件通知处理程序代码 if(flag==1){ UpdateData(true); TCHAR szDir[MAX_PATH]; BROWSEINFO bi; ITEMIDLIST *pidl; bi.hwndOwner = this->m_hWnd; bi.pidlRoot = NULL; bi.pszDisplayName = szDir; bi.lpszTitle = _T(”请选择目录“); bi.ulFlags = BIF_RETURNONLYFSDIRS; bi.lpfn = NULL; bi.lParam = 0; bi.iImage = 0; pidl = SHBrowseForFolder(&bi); if(pidl == NULL)return; if(!SHGetPathFromIDList(pidl, szDir))return; else strname=szDir; UpdateData(false);} else if(flag==-1){ CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,_T(”数据库文件|moneyback.db||“)); if(dlg.DoModal()==IDOK) { strname=dlg.GetPathName(); } if(strname!=_T(”“)) { UpdateData(false); } } } 收入模块: // CIncome 消息处理程序 void CIncome::OnBnClickedOk()//确定按钮 { // TODO: 在此添加控件通知处理程序代码 UpdateData(true);if(m_count.IsEmpty()){ MessageBox(_T(”金额不能为空“)); return;} ADOConn m_AdoConn;m_AdoConn.OnInitADOConn();_bstr_t sql;sql = ”select * from mymoney“;_RecordsetPtr m_pRecordset;m_pRecordset=m_AdoConn.GetRecordSet(sql);CString mydate,mykind;m_date.GetLBText(m_date.GetCurSel(),mydate);m_kind.GetLBText(m_kind.GetCurSel(),mykind);mydate.Remove(' ');try { m_pRecordset->AddNew();//添加新行 m_pRecordset->PutCollect(”类型“,(_bstr_t)_T(”0“)); m_pRecordset->PutCollect(”时间“,(_bstr_t)mydate); m_pRecordset->PutCollect(”类别“,(_bstr_t)mykind); m_pRecordset->PutCollect(”金额“,(_bstr_t)m_count); m_pRecordset->PutCollect(”备注“,(_bstr_t)m_remark); m_pRecordset->GetFields()->GetItem(”类型“)->Value =(_bstr_t)_T(”0“); m_pRecordset->GetFields()->GetItem(”时间“)->Value =(_bstr_t)mydate; m_pRecordset->GetFields()->GetItem(”类别“)->Value =(_bstr_t)mykind; m_pRecordset->GetFields()->GetItem(”金额“)->Value =(_bstr_t)m_count; m_pRecordset->GetFields()->GetItem(”备注“)->Value =(_bstr_t)m_remark; m_pRecordset->Update(); m_AdoConn.ExitConnect();} catch(...){ MessageBox(_T(”操作失败“)); return;} } 统计模块: // CCount 消息处理程序 void CCount::OnBnClickedOk()//确定统计 { // TODO: 在此添加控件通知处理程序代码 UpdateData(true);CString type,date,kind,way,start,end;m_type.GetLBText(m_type.GetCurSel(),type);m_date.GetLBText(m_date.GetCurSel(),date);m_kind.GetLBText(m_kind.GetCurSel(),kind);m_way.GetLBText(m_way.GetCurSel(),way); if(type==”支出“) type=_T(”1“);else type=_T(”0“); CTime t = CTime::GetCurrentTime();int tyear,tmonth,tday;CString year,month,day;tyear=t.GetYear();tmonth=t.GetMonth();tday=t.GetDay(); if(date==”今天“){ year.Format(_T(”%d“),tyear); month.Format(_T(”%d“),tmonth); day.Format(_T(”%d“),tday); start=year+_T(”-“)+month+_T(”-“)+day; end=year+_T(”-“)+month+_T(”-“)+day;} ADOConn m_AdoConn;m_AdoConn.OnInitADOConn();CString sql; if(kind!=_T(”所有收入“)&&kind!=_T(”所有支出“)&&way==_T(”总和“)) sql.Format(_T(”select sum(金额)as my from mymoney where 类型= “+type+” and 类别= '“+kind+”' and 时间>= '“+start+”'and 时间<= '“+end+”' “)); _RecordsetPtr m_pRecordset;m_pRecordset = m_AdoConn.GetRecordSet((_bstr_t)sql); while(m_AdoConn.m_pRecordset->adoEOF==0){ m_list.InsertItem(0,_T(”“)); m_list.SetItemText(0,0,date); m_list.SetItemText(0,1,kind); m_list.SetItemText(0,2,way); try { m_list.SetItemText(0,3,(_bstr_t)m_pRecordset->GetCollect(_T(”my“))); } catch(...) { m_list.SetItemText(0,3,_T(”0“)); } m_pRecordset->MoveNext();} } 支出模块: // COutlay 消息处理程序 void COutlay::OnBnClickedOk(){ // TODO: 在此添加控件通知处理程序代码 UpdateData(true);if(m_count.IsEmpty()){ MessageBox(_T(”金额不能为空“)); return;} ADOConn m_AdoConn;m_AdoConn.OnInitADOConn();_bstr_t sql;sql = ”select * from mymoney“;_RecordsetPtr m_pRecordset;m_pRecordset=m_AdoConn.GetRecordSet(sql);CString mydate,mykind;m_date.GetLBText(m_date.GetCurSel(),mydate);m_kind.GetLBText(m_kind.GetCurSel(),mykind);mydate.Remove(' '); try { m_pRecordset->AddNew();//添加新行 m_pRecordset->PutCollect(”类型“,(_bstr_t)_T(”1“)); m_pRecordset->PutCollect(”时间“,(_bstr_t)mydate); m_pRecordset->PutCollect(”类别“,(_bstr_t)mykind); m_pRecordset->PutCollect(”金额“,(_bstr_t)m_count); m_pRecordset->PutCollect(”备注“,(_bstr_t)m_remark); m_pRecordset->GetFields()->GetItem(”类型“)->Value =(_bstr_t)_T(”1“); m_pRecordset->GetFields()->GetItem(”时间“)->Value =(_bstr_t)mydate; m_pRecordset->GetFields()->GetItem(”类别“)->Value =(_bstr_t)mykind; m_pRecordset->GetFields()->GetItem(”金额“)->Value =(_bstr_t)m_count; m_pRecordset->GetFields()->GetItem(”备注“)->Value =(_bstr_t)m_remark; m_pRecordset->Update(); m_AdoConn.ExitConnect();} catch(...){ MessageBox(_T(”操作失败")); return;} } 五、项目测试1、2、3、4、黑盒测试用例: 白盒测试用例: 黑盒测试记录: 白盒测试记录:第二篇:软件工程 课程设计 销售管理系统
第三篇:工资管理系统--软件工程课程设计2
第四篇:软件工程课程设计
第五篇:软件工程课程设计 (个人账本管理系统)