还没有整理完,待续……
学校开了Android课,最后让交一个大作业。正好拿来练练手,记录下思路。也希望能给有需要的朋友们一些帮助。恩,纯小白教程,大神们可以绕路了。
作业的题目是这样的:
考试APP系统:
1)要求有用户登陆功能:从远程服务器进行登陆验证。
2)要有考试测试界面,主要是选择、判断、简答题目测试。
3)要有统计成绩界面和错题显示界面。
评分标准:
1、界面设计占评分的30%
2、系统运行正确; 功能完善;工作量充分; 系统实现有一定的技术的难度。50%
3、要求有适当的系统主要模块的文档说明和代码注释。
4、直接将数据库文件(数据库一定要备份成SQL语句格式,指明数据库)和项目文件提交。
乍一看挺简单的,真要研究起来,写的实用一些,还真有点不知如何下手,那跟着我的思路,一起来吧!恩,不想看思路的,可以直接戳Android源码下载源码来看了。
功能需求设计:
登录注册
答题:选择题,判断题,简答题
答题得分计算
错题查看
最后效果
总体思路
总体思路是这样的,App通过http连接服务器,进行登录或者注册服务,登录成功之后,服务器查询数据库并以json的形式返回试题数据。App接收数据之后,解析并存到本地数据库,然后展示给用户答题。点击交卷按钮后,进行评分并可进行错题查看。内容比较杂乱,大家可以根据目录来快速查看自己需要或者感兴趣的地方。
数据库设计
首先,就登录注册的功能来说,得先有一个用户表,包含用户名,密码,id号这些基本的内容。我在这里又加了一个权限字段,用来返回状态。(设置权限字段,方便日后进行扩展,可设置用不同数字代表不同等级或身份)
tbl_user_info
其次,就是题库了。为了使项目具有实用性,减小安装包体积,便于更新修正,题库同样也需要放在服务器上才合适。
tbl_question
jsp程序
jsp依赖了两个jar包,分别是连接mysql的驱动:mysql-connector-java-5.1.34-bin还有生成json用的:json 。为了减少代码的耦合性,这里采用MVC模式进行设计。(自以为是MVC)。目录结构如下:
登录注册
1.连接数据库
数据库操作类,封装了连接,查询,关闭数据库的方法。大家如果使用这部分代码,别忘了把数据库连接常量改成自己的。
//****连接数据库**DBManager***
public class DBManager {
// 数据库连接常量
public static final String DRIVER = "com.mysql.jdbc.Driver";
public static final String USER = "root";
public static final String PASS = "root";
public static final String URL = "jdbc:mysql://localhost:3306/shop";
// 静态成员,支持单态模式
private static DBManager per = null;
private Connection conn = null;
private Statement stmt = null;
// 单态模式-懒汉模式
private DBManager() {
}
public static DBManager createInstance() {
if (per == null) {
per = new DBManager();
per.initDB();
}
return per;
}
// 加载驱动
public void initDB() {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (Exception e) {
e.printStackTrace();
}
}
// 连接数据库,获取句柄+对象
public void connectDB() {
System.out.println("Connecting to database...");
try {
conn = DriverManager.getConnection(URL, USER, PASS);
stmt = conn.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
System.out.println("SqlManager:Connect to database successful.");
}
// 关闭数据库 关闭对象,释放句柄
public void closeDB() {
System.out.println("Close connection to database..");
try {
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
System.out.println("Close connection successful");
}
// 查询
public ResultSet executeQuery(String sql) {
ResultSet rs = null;
try {
rs = stmt.executeQuery(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
// 增添/删除/修改
public int executeUpdate(String sql) {
int ret = 0;
try {
ret = stmt.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return ret;
}
}
2.登录
客户端提交过来一个用户名,一个密码,jsp连接数据库查询,如果两者都符合,返回登录成功信息,否则返回登录失败信息。(我这里用权限来代表,当权限>-1即为登录成功)。
3.注册
客户端同样提交过来一个用户名,一个密码,但是需要首先查询数据库,看看该用户名是否已被注册,若没有,则执行数据库插入操作。成功则返回注册成功,否则返回失败信息。
//****服务代码****
public class StartService {
/**
* 登录方法
* @param username
* @param password
* @return 登录成功与否
*/
public HashMap login(String username, String password) {
HashMap hashMap = new HashMap();
// 获取Sql查询语句
String logSql = "select perssion from userinfo where username ='"
+ username + "' and password ='" + password + "'";
System.out.println(logSql);
// 获取DB对象
DBManager sql = DBManager.createInstance();
sql.connectDB();
hashMap.put("permission", "-1");
hashMap.put("username", username);
// 操作DB对象
try {
ResultSet rs = sql.executeQuery(logSql);
if (rs.next()) {
hashMap.put("permission", rs.getInt(1) + "");
System.out.print("权限===" + rs.getInt(1) + "\t");
sql.closeDB();
return hashMap;
}
} catch (SQLException e) {
e.printStackTrace();
}
sql.closeDB();
return hashMap;
}
/**
* 注册方法
* @param username
* @param password
* @return 注册成功与否
*/
public HashMap register(String username, String password) {
HashMap hashMap = new HashMap();
hashMap.put("username", username);
hashMap.put("msg", "notok");
if (this.namerepeat(username)) {
hashMap.put("msg", "rename");
} else {
// 获取Sql查询语句
String regSql = "insert into userinfo(username,password) values('"
+ username + "','" + password + "')";
System.out.println(regSql);
// 获取DB对象
DBManager sql = DBManager.createInstance();
sql.connectDB();
int ret = sql.executeUpdate(regSql);
if (ret != 0) {
hashMap.put("msg", "ok");
sql.closeDB();
return hashMap;
}
sql.closeDB();
}
return hashMap;
}
/**
* 检测该账户是否已经注册
*
* @param username
* @return 注册状态
*/
public Boolean namerepeat(String username) {
String checkSql = "select use