JAVA商品销售管理系统(ER图+源代码) 第6页
package myEncryption;
public class MyEncryption
{
public char[] passwordMaker(String macmaked)
{
//初始密钥
int inc[] = {6,1,4,76,111,86,101,9,2,7,10,155,185,89,200,14,32,68,98,124,689};
char temp;
//将字符串转换为字符数组
char[] word = macmaked.toCharArray();
char[] password = new char[macmaked.length()];
for(int i = 0; i < macmaked.length(); i++)
{
password[i] = word[i];
//进行第一轮加密
password[i] = (char)((password[i] * inc[i])%253 + 1);
}
//进行移位加密
for(int out = 1; out < 26; out++)
{
//保存第一位密码
temp = password[0];
for(int i = 0; i < macmaked.length() - 1; i++)
{
password[i] = (char)((password[i + 1] + inc[i])%253 + 1);
//密钥动态变化实现
inc[i] = password[i];
}
//对最后一位密码加密
password[macmaked.length() - 1] = (char)((temp + inc[macmaked.length() - 1])%253 + 1);
//改变最后一位密钥
inc[macmaked.length() - 1] = password[macmaked.length() - 1];
}
return password;//返回加密结果
}
}
可能由于Java与SQL对字符的具体存取格式不同,所以不能仅仅通过上边的方法来实现对密码加密(否则在登录时会导致密码不匹配)。因此,在数据库中建立了一名为Change的表,该表只有一列(Exchange),并同时插入一个数据(任意数据),设置工作人员角色staff_role对该表具有Update和Select权限。通过该表,在工作人员登录系统时,先调用加密方法passwordMaker()对输入的密码进行加密,并将加密结果Update到表Change的ExChange列中,然后再重新取出(这样便实现了Java与SQL对字符的编码不同表示的转换)。最后将去出来的结果与Staff表中对应的Password比较,完全匹配便成功登录系统,否则给出相应的错误提示。
工作人员登录时程序所调用的方法编码如下:
public int staffLogin(String id,String pwd)
{
int result = 32767;
Connection con;
Statement stmt;
//调用加密方法,对输入密码进行加密
MyEncryption me = new MyEncryption();
pwd = String.valueOf(me.passwordMaker(pwd));
try{
DBCon dbc = new DBCon();
con = DriverManager.getConnection(dbc.url,"staff","123");
stmt = con.createStatement();
String query ;
ResultSet rs ;
/**
* 实现sql和程序的字符转换
*/
//向转换表插入数据
query = "update Change " +
"set ExChange = '"+ pwd +"';";
stmt.executeUpdate(query);
//读出插入后的数据
query = "select ExChange from Change ;";
rs = stmt.executeQuery(query);
while( rs.next()){
pwd = rs.getString("ExChange");
}
if(rs != null)
rs.close();
/**
* 将转换后的密码与Staff表中的密码比较
*/
query = "select Password,Type from Staff where ID = '"+id+"';";
rs = stmt.executeQuery(query);
while( rs.next()){
String temp = rs.getString("Password");
char[] pwdtemp = temp.toCharArray();
char[] c_pwd = pwd.toCharArray();
if(pwdtemp.length == c_pwd.length)
{
int i = 0;
for(;i < pwdtemp.length; i++)
{
if(pwdtemp[i] != c_pwd[i])
{
break;
}
}
if(i == pwdtemp.length)
result = Integer.parseInt(rs.getString("Type"));
}
}
dbc.dbClose(con,rs);
}
catch(Exception e){
e.printStackTrace();
}
return result;
}7 系统测试方案和报告
测试方案:在编码过程中进行单元测试,客户管理、销售管理和售后服务管理三个模块的功能基本相同。在这里只给出销售管理模块的测试:
查询功能测试:
查询售后编号为10000的售后服务信息: