SpringMVC 个人项目:简易设备资产管理系统

项目目的:

理解web应用的基本特点及webMVC的发展历程;掌握SpringMVC的请求处理过程。熟练掌握基于SpringMVC的web开发框架;熟练掌握基于注解的用户控制器的设计与开发及url映射的配置;掌握基于注解的请求数据绑定;能够利用SpringMVC进行简单的web开发(数据库操作使用mybatis或JPA)。

项目内容:

一、 SpringMVC开发环境与开发步骤

1、 在IntellJ中创建maven web项目(maven-archetype-webapp)

2、 补全项目结构

在src下创建test目录,并在test目录下创建java、resources目录;在main下创建java目录

3、 添加springmvc、servlet、json等的依赖包以及jetty插件

4、 在web.xml中添加springmvc前置控制器的配置,拦截所有请求

5、 在WEB-INF下添加SpringMVC的配置文件(包扫描及resolver配置)

6、 开发controller

7、 开发视图(jsp)

8、 运行测试站点:clean jetty:run -Djetty.port=8080


二、数据库建表:

在这里插入图片描述

三、系统原型:

四、系统需求:

1、系统需求:

①、用户注册与登录;②、简单设备资产管理(添加和查看):管理员(type=0的user)可在系统中添加设备(equipment)并可以同时指定该设备的领用保管人;管理员可以看所有的资产,普通用户只能看到自己的资产。

2、系统设计与开发

总体要求:所有的数据要落到数据库中,用什么方式操作数据库没有要求。

① 、规划设计用户请求处理

用户操作请求名url请求类型参数功能描述
注册DoRegister/user/registerPOST@ModelAttribute(“user”) User user用户访问注册页面,填写注册表单,提交注册。
登录login/user/loginPOST@RequestParam(“loginName”) String loginName, @RequestParam(“password”) String password, HttpSession session填写用户名、密码登录
查看个人设备home/eq/homeGETHttpSession session普通用户登录成功,跳转到home页面查看个人资产设备
管理员操作请求名url请求类型参数功能描述
查看全部资产home/eq/homeGETHttpSession session管理员登录成功后,home页面显示全部资产情况
添加设备addEquipment/eq/addPOSTHttpServletRequest request管理员登录home页面可以添加设备,指定领用人

② 、用户注册、登录。

③ 、用户成功登录/注册后将当前登录用户的信息通过HttpSession写入session,用户注册成功后直接转向【用户home页面】,显示当前登录用户名下的所有设备资产信息

④ 、【系统管理员(type=0)】成功登录后转向【管理员home页面】,显示所有设备资产信息。同时可以在该页面中为用户登记新的设备。



五、具体代码实现:

本项目功能使用传统三层架构实现:Controller、Service、Dao

Dao层使用注解@Repository将数据层添加到bean
Service层使用@Autowired自动装配获取到dao层,并且使用@Service注解添加到bean
Controller层同样使用@Autowired自动装配获取到service层,并且使用@Controller注解添加到bean

创建项目、依赖导入、配置文件……之前的环境搭建环节不做展示。

1、注册功能:

用户浏览器url访问到注册页面,填写注册表单后提交给后台服务器处理,提交表单是POST请求,而浏览器只能响应GET请求,所以先写GET请求方法显示注册页面。其中的return “user/register”就是访问注册页面的意思,即找到对应的 .jsp文件加载jsp/user/register.jsp

当用户填写好表单信息,点击注册按钮,表单信息以POST方式提交到后台,后台进行具体业务处理操作:将用户信息存放到数据库中的tb_user表中。其中的userService.addUser(user);是Controller调用Service,Service在Dao中进行数据库的更新操作,即存入注册的用户信息。而return “redirect:/user/login”;是重定向到登录页面,你可以理解为 注册好后,浏览器跳转到login——登录页面。


这里的用户信息保存到数据库中时,有一个字段叫type,用来区分用户类型,注册后我固定保存为 1 普通用户。到此,注册功能基本完成。


2、登录功能:

注册完成后跳转到的登录页面如下,

要实现的功能为:填写用户名、密码后点击“登录”按钮进入home系统页面,

也是POST请求,提交的数据传回后台进行具体业务逻辑操作判断:用户是否存在(从数据库中能否查询到用户)?用户存在 密码是否填写正确?是普通用户还是管理员用户?根据这些判断结果来显示不同的页面信息。

数据库中有一个字段 last_login_time 最后一次登录时间,如果登录成功后,我们还要更新这个日期。



登录的具体逻辑是这样的:

注册成功后 页面重定向 跳转到登录页面,而浏览器只支持GET请求访问,所以前一个login方法的GET请求,return “user/login”即加载login.jsp文件来访问到登录页面。

登录表单POST提交后来到第二个login方法,它的请求方法为POST是跟jsp文件中对应的,这个方法里面来编写具体的业务操作:先调用UserService在UserDao里从数据库中查询信息 比对,没问题后代表登陆成功,更新登录时间,最后return “redirect:/eq/home”页面跳转到home系统页面 ;若有问题,用户不存在/用户名密码错误?跳转页面显示error信息即可。到此,登录功能即完成。

当然,在此页面下,如果没有账户,还是可以点击注册按钮回到register页面进行注册。


3、home系统页面:

用户登录成功,进入系统页面查看资产信息。

我的操作是:eq/home请求先判断用户类型,如果是管理员,则显示所以资产,并可以操作资产(添加资产,指定领用人);如果是普通用户,页面显示的只有他个人的资产信息。

首先肯定是列出资产设备信息的表现层:

判断出是管理员用户后,页面还得显示出管理设备的功能表格,下面是添加设备功能对应的JSP和Controller核心代码:

其中
<% for (User u : (List) session.getAttribute(“allUsers”)) { %>
<%= u.getRealName() %>
<% } %>
是在jsp文件中添加一个下拉框,用于选择设备的领用人。其中,通过session.getAttribute(“allUsers”)获取到所有的用户列表,然后使用for循环遍历列表,将每个用户的id和真实姓名作为一个选项添加到下拉框中。当用户选择一个选项时,该选项的value值就会被发送到服务器端,用于添加设备记录时设置设备的领用人。

Controller中添加完成后返回的return “添加完成”因为方法前面加了@ResponseBody注解,返回值将会直接在页面中提示。

到此,home系统页面的基本功能也已完成。

下面是普通用户和管理员登录的效果图:


基本功能和核心代码展示完成。


六、完整代码类

UserController类:

@Controller
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserServiceImpl userService;

    /**
     * 注册
     *
     * @return
     */
    @RequestMapping(value = "/registe", method = RequestMethod.GET)
    public String register() {
        return "user/register";
    }

    @RequestMapping(value = "/register", method = RequestMethod.POST)
    public String DoRegister(@ModelAttribute("user") User user) {
        userService.addUser(user);
        return "redirect:/user/login";
    }


    /**
     * 登录
     *
     * @return
     */
    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String login() {
        return "user/login";
    }

    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public String login(@RequestParam("loginName") String loginName, @RequestParam("password") String password, HttpSession session) {
        User user = userService.getUserByNameAndPassword(loginName, password);

        List<User> allUsers = userService.getAllUsers();
        session.setAttribute("allUsers", allUsers);

        if (user != null) {
            // 更新用户lastlogin时间
            Date date = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String dateString = sdf.format(date);
            userService.updateLastLoginTime(dateString, user);

            session.setAttribute("user", user);

            return "redirect:/eq/home";
        } else {
            session.setAttribute("error", "error");
            return "error";
        }
    }


}

UserService接口和UserServiceImpl类:

public interface UserService {
    void addUser(User user);  //注册

    List<User> getAllUsers();

    User getUserByNameAndPassword(String username, String password);  //用户登录

    void updateLastLoginTime(String formattedDate, User user);  //更新用户登录时间
}



@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDaoImpl userDao;

    @Override
    public void addUser(User user) {
        userDao.addUser(user);
    }

    @Override
    public List<User> getAllUsers() {
        return userDao.getAllUsers();
    }

    @Override
    public User getUserByNameAndPassword(String username, String password) {
        return userDao.findByLoginNameAndPassword(username,password);
    }

    @Override
    public void updateLastLoginTime(String date,User user) {
        userDao.updateUserLastLoginTime(date,user);
    }

}

UserDao接口和UserDaoImpl类:

public interface UserDao {
    void addUser(User user);  //注册

    List<User> getAllUsers();  //获取所有用户

    User findByLoginNameAndPassword(String loginName, String password);  //用户登录

    void updateUserLastLoginTime(String formattedDate, User user);  //更新用户最后登录时间
}




@Repository
public class UserDaoImpl implements UserDao {
    private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());

    @Override
    public void addUser(User user) {
        //定义sql
        String sql = "insert into tb_user(login_name,real_name,password,telephone,email) values(?,?,?,?,?)";
        //2.执行sql

        template.update(sql, user.getLoginName(),
                user.getRealName(),
                user.getPassword(),
                user.getTelephone(),
                user.getEmail()
        );
    }

    @Override
    public List<User> getAllUsers() {
        String sql = "SELECT * FROM tb_user";
        List<User> users = template.query(sql, new BeanPropertyRowMapper<>(User.class));
        return users;
    }

    @Override
    public User findByLoginNameAndPassword(String loginName, String password) {
        String sql = "SELECT * FROM tb_user WHERE login_name = ? AND password = ? ";
        Object[] args = {loginName, password};
        List<User> users = template.query(sql, args, new BeanPropertyRowMapper<>(User.class));
        if (users != null && users.size() > 0) {
            return users.get(0);
        } else {
            return null;
        }
    }

    @Override
    public void updateUserLastLoginTime(String formattedDate, User user) {
        String sql = "UPDATE tb_user SET last_login_time = ? WHERE login_name = ?";
        template.update(sql, formattedDate, user.getLoginName());
    }
}

EquipmentController类:

@Controller
@RequestMapping("/eq")
public class EquipmentController {

    @Autowired
    private EquipmentServiceImpl equipmentService;


    /**
     * 列出资产设备
     */
    @RequestMapping(value = "/home", method = RequestMethod.GET)
    public String home(HttpSession session) {
        User user = (User) session.getAttribute("user");

        if (user == null) {  //用户为空,回到登录页面
            return "user/login";
        }
        if (user.getType() == 1) {  //普通用户
            List<Equipment> equipments = equipmentService.getEquipmentByUserId(user.getId());
            session.setAttribute("equipments", equipments);
            return "eq/home";
        }else if(user.getType()==0){  //管理员
            List<Equipment> allEquipments = equipmentService.getAllEquipments();
            session.setAttribute("equipments", allEquipments);
            return "eq/home";
        }
        else {
            session.setAttribute("error","你没有权限访问改页面");
            return "error";
        }
    }

    /**
     * 管理员添加设备
     */
    @RequestMapping(value = "/add",method = RequestMethod.POST)
    @ResponseBody
    public String addEquipment(HttpServletRequest request){
        String name = request.getParameter("name");
        String code = request.getParameter("code");
        double price = Double.parseDouble(request.getParameter("price"));
        String place = request.getParameter("place");
        int uerId = Integer.parseInt(request.getParameter("userId"));
        Equipment equipment = new Equipment();
        equipment.setName(name);
        equipment.setCode(code);
        equipment.setPrice(price);
        equipment.setPlace(place);
        equipment.setUserId(uerId);
        equipment.setAddTime(new Date());
        equipmentService.addEquipment(equipment);
        return "添加完成";
    }
}

EquipmentService和EquipmentServiceImpl类:

public interface EquipmentService {
    List<Equipment> getEquipmentByUserId(int userid);  //查询出用户资产设备

    List<Equipment> getAllEquipments();

    void addEquipment(Equipment equipment);

}


@Service
public class EquipmentServiceImpl implements EquipmentService {

    @Autowired
    private EquipmentDaoImpl equipmentDao;

    @Override
    public List<Equipment> getEquipmentByUserId(int userid) {
        return equipmentDao.getEquipmentByUserId(userid);
    }

    @Override
    public List<Equipment> getAllEquipments() {
        return equipmentDao.getAllEquipments();
    }

    @Override
    public void addEquipment(Equipment equipment) {
        equipmentDao.addEquipment(equipment);
    }
}

EquipmentDao和EquipmentDaoImpl类:

public interface EquipmentDao {
    List<Equipment> getEquipmentByUserId(int userId);  //查询出用户资产设备

    List<Equipment> getAllEquipments();  //查询出所有资产设备

    void addEquipment(Equipment equipment);

}



@Repository
public class EquipmentDaoImpl implements EquipmentDao {
    private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());


    @Override
    public List<Equipment> getEquipmentByUserId(int userId) {
        String sql = "SELECT * FROM tb_equipment WHERE user_id = ? ";
        Object[] args = {userId};
        return template.query(sql,args,new BeanPropertyRowMapper<>(Equipment.class));
    }

    @Override
    public List<Equipment> getAllEquipments() {
        String sql = "SELECT * FROM tb_equipment ";
        return template.query(sql,new BeanPropertyRowMapper<>(Equipment.class));
    }

    @Override
    public void addEquipment(Equipment equipment) {
        String sql = "INSERT INTO tb_equipment (`name`,code,price,place,user_id,add_time) VALUES (?, ?, ?, ?, ?, ?)";
        template.update(sql,equipment.getName(),
                            equipment.getCode(),
                            equipment.getPrice(),
                            equipment.getPlace(),
                            equipment.getUserId(),
                            equipment.getAddTime());
    }
}



七、提示

本文未写项目搭建、环境配置、数据库创建、实体类创建、JSP文件内容

完整项目结构:


完整项目源码在giteehttps://gitee.com/li-zhi_xiang/lzx-springmvc

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值