宠物网站管理信息系统
一、 需求分析
该系统主要提供宠物商店与宠物主人之间的买卖功能,包括登录,对宠物的增删查改,用户信息的查询与修改,以及用户上传图片的功能。
通过选择宠物主人或者商店来进行登录,然后进行之后的具体操作:
1、功能1 登录功能
2、功能2 显示用户列表功能
3、功能3 修改用户信息功能
4、功能4 查看用户详情功能
5、功能5 用户购买宠物功能
6、功能6 用户出售宠物功能
二、概念结构设计
三、逻辑结构设计
表1 宠物主人表
属性名 含义 类型 说明
id 宠物主人id int 主键,每次自增1
name 宠物主人姓名 varchar
password 宠物主人密码 varchar
money 宠物主人资金 int
表2 宠物商店表
属性名 含义 类型 说明
id 宠物商店id int 主键,每次自增1
name 宠物商店名 varchar
password 宠物商店密码 varchar
money 宠物商店资金 int
表3 宠物表
属性名 含义 类型 说明
id 宠物id int 主键,每次自增1
name 宠物姓名 varchar
type_name 宠物品种 varchar
health 宠物健康值 int 健康值为0-100
love 宠物爱心值 int 爱心值为0-100
birthday 宠物出生日期 timestamp Timestamp类型
owner_id 宠物所属主人id int 外键,该宠物无主人,这行则为(0)
store_id 宠物所属商店id int 外键,该宠物有主人,这行则为(0)
money 宠物价格 Int
四、具体实现
1、登录功能:
启动程序进入登录界面,在登录界面中可以选择,宠物主人登录或者宠物商店的登录:
主要代码:
public class LoginServlet extends HttpServlet {
@Override
public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.设置请求与响应的编码
req.setCharacterEncoding(“utf-8”);
resp.setContentType(“text/html;charset=utf-8”);
//2.拿到请求中传过来的数据(浏览器传过来的用户名和密码)
//req.getParameter(“jsp页面中对应输入框中的name属性值”);
String username = req.getParameter(“username”);
String pwd = req.getParameter(“pwd”);
System.out.println(username+","+pwd);
//新增:获取用户是否选中了记住密码的操作
String remb = req.getParameter(“remb”);
//增加获取petType
int logintype = Integer.parseInt(req.getParameter(“logintype”));
System.out.println(“输出logintype:”+logintype);
CommonService commonService = new CommonServiceImpl();
/**
* 宠物主人登录
/
if(logintype==App.LOGIN_PETOWNER){
//3.查询是否有该用户
int flag = commonService.loginOwner(username,pwd);
UserService userService = new UserServiceImpl();
//可以返回pershop对象,也可以返回true or false,还可以返回int
PrintWriter pw = resp.getWriter();
if (flag == App.LOGIN_OK) {
//4.查询成功,就显示恭喜登录成功
pw.println(“登陆成功”);
//新增:如果用户点击记住密码的操作,并且用户名!=null
if(“1”.equals(remb)){
//设置Cookie的方法
remb_pwd(resp,username,pwd,remb);
}
System.out.println(“我做完了保存密码这一步了”);
//使用session来存储用户
HttpSession session = req.getSession();
//设置存活时间
session.setMaxInactiveInterval(3060);//秒
//获取上下文对象
ServletContext sc = getServletContext();
//获取封装的数据
String sessionId = session.getId();
sc.setAttribute(“Id”,sessionId);
//设置存活时间
//登录成功后转跳到userList.jsp(转发)
//req.getRequestDispatcher(“findAllUser”).forward(req,resp);
//登录成功后转跳到userList.jsp(重定向)
System.out.println(“我做到sessionId这一步了”);
req.setAttribute(“logintype”,logintype);
req.setAttribute(“username”,username);
req.getRequestDispatcher(“findAllUser”).forward(req,resp);
//resp.sendRedirect(“findAllUser”);
} else if(flag == App.WRONG_NAME){
//5.查询失败,就跳转到登录页面继续登录
pw.println(“用户名输入错误,登录失败”);
pw.println(“返回登录”);
}else{
pw.println(“密码输入错误,登录失败”);
pw.println(“返回登录”);
}
//6关闭
pw.close();
}else{
/*** 宠物商店登录*/
//3.查询是否有该用户
//可以返回user对象,也可以返回true or false,还可以返回int
int flag = commonService.loginStore(username,pwd);
PrintWriter pw = resp.getWriter();
if (flag == App.LOGIN_OK) {
//4.查询成功,就显示恭喜登录成功
pw.println(“登陆成功”);
//新增:如果用户点击记住密码的操作,并且用户名!=null
if(“1”.equals(remb)){
//设置Cookie的方法
remb_pwd(resp,username,pwd,remb);
}
//使用session来存储用户
HttpSession session = req.getSession();
//设置存活时间
session.setMaxInactiveInterval(30*60);//秒
//获取上下文对象
ServletContext sc = getServletContext();
//获取封装的数据
String sessionId = session.getId();
sc.setAttribute(“Id”,sessionId);
//登录成功后转跳到userList.jsp(转发)
//req.getRequestDispatcher(“findAllUser”).forward(req,resp);
//登录成功后转跳到userList.jsp(重定向)
req.setAttribute(“logintype”,logintype);
req.setAttribute(“username”,username);
req.getRequestDispatcher(“findAllUser”).forward(req,resp);
//resp.sendRedirect(“findAllUser”);
} else if(flag == App.WRONG_NAME){
//5.查询失败,就跳转到登录页面继续登录
pw.println(“用户名输入错误,登录失败”);
pw.println(“返回登录”);
}else{
pw.println(“密码输入错误,登录失败”);
pw.println(“返回登录”);
}
//6关闭
pw.close();
}
}
2、显示用户列表的功能:
通过登录用户的信息来进行查询,进入到用户列表界面,在这里可以看见其他用户名,但无法查看和操作除自己以外人的信息。之后通过点击后面的功能来进行下一步操作。
主要代码:
@WebServlet("/friend_demo/findAllUser")
public class FindAllUserServlet extends HttpServlet {
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.设置请求与响应的编码
req.setCharacterEncoding(“utf-8”);
resp.setContentType(“text/html;charset=utf-8”);
PrintWriter pw = resp.getWriter();
String username = req.getParameter(“username”);
int logintype = Integer.parseInt(req.getParameter(“logintype”));
/**
* 宠物主人登录
/
if(logintype==App.LOGIN_PETOWNER) {
PetOwnerService pos = new PetOwnerServiceImpl();
List list = pos.getAllPetOwners();
System.out.println(“findAlluser获取的username:” + username);
//遍历循环输出用户信息
for (PetOwner u: list) {
System.out.println(u);
}
//判断是否登录
//首先获取上下文对象
ServletContext sc = getServletContext();
//然后判断是否登录
String sessionId = (String) sc.getAttribute(“Id”);
if (sessionId == null){
//pw.println("未登录,请先登录在进入 ");
//pw.println(“进入登录”);
//转跳到Login.jsp(重定向)
resp.sendRedirect(“login.jsp”);
}else {
//获取session对象
HttpSession session = req.getSession();
//设置存活时间
System.out.println(session);
session.setMaxInactiveInterval(3060);//秒
//首先获取session绑定计数
Integer num = (Integer) session.getAttribute(“count”);
//判断count
if(numnull){
num = 1;
}else{
num++;
}
//把绑定的数据进行更新
session.setAttribute(“count”,num);
//将num封装到req请求中
req.setAttribute(“count”,num);
//将用户列表封装到request请求中
req.setAttribute(“name”,username.trim());
req.setAttribute(“users”,list);
req.setAttribute(“logintype”,logintype);
//转发传到userList
req.getRequestDispatcher(“userList.jsp”).forward(req,resp);
}
}else{
/**
* 宠物商店登录
/
PetStoreService pss = new PetStoreServiceImpl();
Listlist = pss.getAllPetStores();
System.out.println(“findAlluser获取的username:” + username);
//遍历循环输出用户信息
for (PetStore u: list) {
System.out.println(u);
}
//判断是否登录
//首先获取上下文对象
ServletContext sc = getServletContext();
//然后判断是否登录
String sessionId = (String) sc.getAttribute(“Id”);
if (sessionId == null){
//pw.println("未登录,请先登录在进入 ");
//pw.println(“进入登录”);
//转跳到Login.jsp(重定向)
resp.sendRedirect(“login.jsp”);
}else {
//获取session对象
HttpSession session = req.getSession();
//设置存活时间
System.out.println(session);
session.setMaxInactiveInterval(3060);//秒
//首先获取session绑定计数
Integer num = (Integer) session.getAttribute(“count”);
//判断count
if(numnull){
num = 1;
}else{
num++;
}
//把绑定的数据进行更新
session.setAttribute(“count”,num);
//将num封装到req请求中
req.setAttribute(“count”,num);
//将用户列表封装到request请求中
req.setAttribute(“name”,username.trim());
req.setAttribute(“users”,list);
req.setAttribute(“logintype”,logintype);
//转发传到userList
req.getRequestDispatcher(“userList.jsp”).forward(req,resp);
}
}
}
}
3、修改信息的功能:
在这里我们进入到修改用户信息的界面,通过输入后提交来进行修改。这里是用了“hidden”将 id 进行隐藏,从而通过提交后,通过id修改信息。
主要代码:
@WebServlet("/friend_demo/load")
public class LoadServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.设置请求与响应的编码
req.setCharacterEncoding(“utf-8”);
resp.setContentType(“text/html;charset=utf-8”);
//2.使用用户id获取用户信息
int id = Integer.parseInt(req.getParameter(“id”));
int logintype = Integer.parseInt(req.getParameter(“logintype”));
CommonDao commonDao = new CommonDaoImpl();
if(logintype==App.LOGIN_PETSTORE){
PetStore petStore = commonDao.findOneStore(id);
//回显,绑定数据转发到load.Jsp中
req.setAttribute(“myuser”,petStore);
req.getRequestDispatcher(“load.jsp”).forward(req,resp);
//登录成功后转跳到ChangeUser.jsp(重定向)
resp.sendRedirect(“ChangeUser”);
}else{
PetOwner petOwner = commonDao.findOneOwner(id);
//回显,绑定数据转发到load.Jsp中
req.setAttribute(“myuser”,petOwner);
req.setAttribute(“logintype”,logintype);
req.getRequestDispatcher(“load.jsp”).forward(req,resp);
//登录成功后转跳到ChangeUser.jsp(重定向)
resp.sendRedirect(“ChangeUser”);
}
}
}
4、查询用户详细信息的功能:
通过携带的参数id,进行查询,输出用户的资金,和姓名,同时可以上传个人照片进行分享。
主要代码:
@WebServlet("/friend_demo/userDetail")
public class UserDetailServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.编码设置
resp.setContentType(“text/html;charset=utf-8”);
req.setCharacterEncoding(“utf-8”);
//2.获取当前用户名是否被占用
int id = Integer.parseInt(req.getParameter(“id”));
int logintype = Integer.parseInt(req.getParameter(“logintype”));
CommonDao commonDao = new CommonDaoImpl();
//根据用户名去数据库进行查找是否有对应的数据
if (logintype== App.LOGIN_PETSTORE){
PetStore petStore = commonDao.findOneStore(id);
PrintWriter pw = resp.getWriter();
//获取session对象
HttpSession session = req.getSession();
//设置存活时间
System.out.println(session);
session.setMaxInactiveInterval(3060);//秒
session.setAttribute(“myuser”, petStore);
session.setAttribute(“logintype”,logintype);
//req.setAttribute(“myuser”,user);
//转发
req.getRequestDispatcher(“userDetail.jsp”).forward(req,resp);
}else{
PetOwner petOwner = commonDao.findOneOwner(id);
PrintWriter pw = resp.getWriter();
//获取session对象
HttpSession session = req.getSession();
//设置存活时间
System.out.println(session);
session.setMaxInactiveInterval(3060);//秒
session.setAttribute(“myuser”, petOwner);
session.setAttribute(“logintype”,logintype);
//req.setAttribute(“myuser”,user);
//转发
req.getRequestDispatcher(“userDetail.jsp”).forward(req,resp);
}
}
}
加载上传照片的主要代码:
@MultipartConfig
@WebServlet("/friend_demo/imgUpload2")
public class ImgUploadServlet2 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.编码
req.setCharacterEncoding(“utf-8”);
resp.setContentType(“text/html;charset=utf-8”);
//2.得到图片对应的id
int logintype = Integer.parseInt(req.getParameter(“logintype”));
int id = Integer.parseInt(req.getParameter(“id”));
//3.获取请求头中关于文件上传的信息,方便后期截取文件的类型
//3.1获取请求头封装的Part对象
Part part = req.getPart(“file1”);
//3.2获取请求头信息
String message = part.getHeader(“Content-Disposition”);
System.out.println(“message:”+message);//form-data; name=“file1”; filename=“222.jpg”
String suffix = message.substring(message.lastIndexOf("."),message.length()-1);
System.out.println(“suffix=====”+suffix);// .jpg
//4.2设置文件的前缀名称 UUID
String fileName = UUID.randomUUID().toString()+suffix;
System.out.println(“fileName:”+fileName);
//82c95a4b-dea8-42c4-b70f-f06842c96554.jpg
//读写操作,如果需要构建子目录,记得创建文件夹
String address = “d://image”+File.separator+“user_”+id;
File file = new File(address);
if(!file.exists()){
file.mkdirs();
}
//输出流
FileOutputStream fos = new FileOutputStream(“d://image”+File.separator+“user_”+id+File.separator+fileName);
//获取文件的输入流
InputStream is = part.getInputStream();
//文件拷贝
byte[] b = new byte[1024];
int lenth = 0;
while((lenth=is.read(b))!=-1){
fos.write(b,0,lenth);
}
//关闭流
is.close();
fos.close();
//图片路径
String picName = “image/user_”+id+File.separator+fileName;
//将图片保存在数据库中
PicService ps = new PicServiceImpl();
int flag = ps.putImgInSql(id,logintype,picName);
//判断是否保存成功
if(flag == App.PUTIMG_FAIL){
System.out.println(“图片信息存储失败”);
}else{
//做数据查询操作,通过userId查询pic表中的数据,放到集合中
List pics = ps.getPicByUserId(id,logintype);
//将用户列表封装到request请求中
for (Pic p:pics) {
System.out.println§;
}
//将图片绑定过去
req.setAttribute(“pics”,pics); req.getRequestDispatcher(“userDetail.jsp”).forward(req,resp);
}
}
}
5、宠物主人或者宠物商店购买宠物功能:
通过用户的id以及登录的方式logintype来作为参数。
主要代码:
@WebServlet("/friend_demo/petList1")
public class FindPetServlet1 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.设置请求与响应的编码
req.setCharacterEncoding(“utf-8”);
resp.setContentType(“text/html;charset=utf-8”);
int userid = Integer.parseInt(req.getParameter(“userid”));
int logintype = Integer.parseInt(req.getParameter(“logintype”));
PrintWriter pw = resp.getWriter();
CommonDao commonDao = new CommonDaoImpl();
/**
* 宠物主人登录
/
if(logintype== App.LOGIN_PETOWNER){
//寻找不属于宠物主人的宠物
List pets = commonDao.findNoOwnerPet();
for (Pet p :pets) {
System.out.println§;
}
req.setAttribute(“users”,pets);
req.setAttribute(“userid”,userid);
req.setAttribute(“logintype”,logintype);
req.getRequestDispatcher(“petList1.jsp”).forward(req,resp);
}else{
/*
* 宠物商店登录
*/
//寻找不属于宠物商店 的宠物
List pets = commonDao.findNoStorePet();
for (Pet p :pets) {
System.out.println§;
}
req.setAttribute(“users”,pets);
req.setAttribute(“userid”,userid);
req.setAttribute(“logintype”,logintype);
req.getRequestDispatcher(“petList1.jsp”).forward(req,resp);
}
}
}
6、宠物主人或宠物商店出售宠物功能:
通过用户的id以及登录的方式logintype来作为参数。
1.如果是宠物主人登录,就查询属于该宠物主人的宠物,并且输出出来。
2.如果是宠物商店登录,就查询属于该宠物商店的宠物,并且输出出来。
如果需要出售,就随机选择一个用户进行出售,类似于现实中,选择商铺(这里使用随机数来实现)。如果出售成功,输出宠物最新的信息。失败就提示“失败”。
主要代码:
@WebServlet("/friend_demo/petList2")
public class FindPetServlet2 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.设置请求与响应的编码
req.setCharacterEncoding(“utf-8”);
resp.setContentType(“text/html;charset=utf-8”);
int userid = Integer.parseInt(req.getParameter(“userid”));
int logintype = Integer.parseInt(req.getParameter(“logintype”));
PrintWriter pw = resp.getWriter();
CommonDao commonDao = new CommonDaoImpl();
/* * 宠物主人登录 */
if(logintype== App.LOGIN_PETOWNER){
//寻找属于该宠物主人的宠物
List pets = commonDao.findPetByOwnerId(userid);
for (Pet p :pets) {
System.out.println§;
}
req.setAttribute("users",pets);
req.setAttribute("userid",userid);
req.setAttribute("logintype",logintype);
req.getRequestDispatcher("petList2.jsp").forward(req,resp);
}else{
/** * 宠物商店登录 */
//寻找属于该宠物商店的宠物
List pets = commonDao.findPetByOwnerId(userid);
for (Pet p :pets) {
System.out.println(p);
}
req.setAttribute("users",pets);
req.setAttribute("userid",userid);
req.setAttribute("logintype",logintype);
req.getRequestDispatcher("petList2.jsp").forward(req,resp);
}
}
}
五、总结
1.通过此次的课程设计,让我对于数据库对生活中的联系,及其使用有了更深刻了解和运用。但是通过此次的设计,也反应出来了许多问题,在对于学校学的东西有时候不能很好的用代码描述出来,对于动手能力有很大的欠缺。这也是我之后学习中需要改进的方面
2.在此次的课设中,我也遇到了许多问题,例如:在完成一个功能的时候,TomCat无法正常启动,总是会出现404或者500的错误。所以在设计中,会经常性的推翻重写,导致了课设总是迟迟完成不了。
3.这次的课设我学习到了许多东西,对于知识掌握更加完善,本程序也有许多的不足之处,如系统十分简单,实现功能也不够完善,所以在之后的学习中我会继续努力,完善程序。