新建项目
新建springboot项目,内建vue模块
mysql数据库
drop table if exists f_dormitory_admin;
create table f_dormitory_admin(
id int not null auto_increment primary key comment '宿管id',
user_name varchar(20) not null comment '登录名',
password varchar(20) not null comment '密码',
name varchar(20) not null comment '姓名',
gender varchar(10) default null comment '性别',
telephone varchar(20) default null comment '电话'
) comment '宿舍管理员表';
insert into f_dormitory_admin values (null,'user1','1234','赵国栋','男','13300000000');
insert into f_dormitory_admin values (null,'user2','1234','张无忌','男','13400000000');
insert into f_dormitory_admin values (null,'user3','1234','张亚琴','女','18800000000');
drop table if exists f_system_admin;
create table f_system_admin(
id int not null auto_increment primary key comment 'id',
user_name varchar(20) not null comment '登录名',
password varchar(20) not null comment '密码',
name varchar(20) not null comment '姓名',
gender varchar(10) default null comment '性别',
telephone varchar(20) default null comment '电话'
) comment '系统管理员表';
insert into f_system_admin values (null,'admin1','1234','管理员1','男','13300000000');
insert into f_system_admin values (null,'admin2','1234','管理员2','男','13400000000');
insert into f_system_admin values (null,'admin3','1234','管理员3','女','18800000000');
drop table if exists f_student;
create table f_student(
id int not null auto_increment primary key comment 'id',
number varchar(20) not null comment '学号',
name varchar(20) not null comment '姓名',
gender varchar(10) default null comment '性别',
dormitory_id int not null comment '宿舍id',
state varchar(10) not null comment '状态',
create_date datetime default CURRENT_TIMESTAMP comment '创建时间'
) comment '学生表';
insert into f_student values(null,'001','周润发','男',1,'入住','2023-01-01');
insert into f_student values(null,'002','周星驰','男',1,'入住','2023-01-01');
insert into f_student values(null,'003','刘德华','男',1,'入住','2023-01-01');
insert into f_student values(null,'004','迪丽热巴','女',2,'入住','2023-01-01');
drop table if exists f_dormitory;
create table f_dormitory(
id int not null auto_increment primary key comment 'id',
building_id int not null comment '楼宇id',
name varchar(30) not null comment '宿舍名称',
type int not null comment '几人间宿舍',
available int not null comment '空余床位',
telephone varchar(20) default null comment '电话'
) comment '宿舍表';
insert into f_dormitory values(null,1,'101',4,0,'88230001');
insert into f_dormitory values(null,1,'201',2,2,'88230002');
insert into f_dormitory values(null,1,'301',8,6,'88230002');
drop table if exists f_building;
create table f_building(
id int not null auto_increment primary key comment 'id',
name varchar(30) not null comment '楼宇名称',
introduction varchar(30) default null comment '介绍',
admin_id int not null comment '宿管id'
) comment '楼宇表';
insert into f_building values (null,'1号楼','科技学院宿舍楼',1);
insert into f_building values (null,'2号楼','信息学院宿舍楼',1);
insert into f_building values (null,'5号楼','电信学院宿舍楼',1);
springboot
配置
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.15</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.shrimpking</groupId>
<artifactId>springboot-vue-test07</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-vue-test07</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.30</version>
</dependency>
<dependency>
<groupId>com.spring4all</groupId>
<artifactId>spring-boot-starter-swagger</artifactId>
<version>1.5.1.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
application.properties
server.port=8089
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimeZone=UTC
spring.datasource.username=root
spring.datasource.password=mysql123
#日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#配置别名
mybatis-plus.type-aliases-package=com.shrimpking.pojo
config
CorsConfig .java
package com.shrimpking.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* @author user1
* // 案例 一
*/
@Configuration
public class CorsConfig implements WebMvcConfigurer
{
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
//是否发送Cookie
.allowCredentials(true)
//放行哪些原始域
.allowedOriginPatterns("*")
.allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"})
.allowedHeaders("*")
.exposedHeaders("*");
}
}
MybatisPlusConfig.java
package com.shrimpking.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@MapperScan("com.shrimpking.mapper")
public class MybatisPlusConfig
{
/**
* 配置分页插件的
* @return
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor()
{
MybatisPlusInterceptor interceptor
= new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
controller
BuildingController .java
package com.shrimpking.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 楼宇表 前端控制器
* </p>
*
* @author shrimpking
* @since 2023-08-30
*/
@RestController
@RequestMapping("/building")
public class BuildingController {
}
DormitoryAdminController .java
package com.shrimpking.controller;
import com.shrimpking.form.RuleForm;
import com.shrimpking.form.SearchForm;
import com.shrimpking.pojo.DormitoryAdmin;
import com.shrimpking.service.DormitoryAdminService;
import com.shrimpking.utils.ResultVOUtil;
import com.shrimpking.vo.PageVO;
import com.shrimpking.vo.ResultVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* <p>
* 宿舍管理员表 前端控制器
* </p>
*
* @author shrimpking
* @since 2023-08-28
*/
@RestController
@RequestMapping("/dormitoryAdmin")
public class DormitoryAdminController {
@Autowired
private DormitoryAdminService dormitoryAdminService;
//登录
@GetMapping("/login")
public ResultVO login(RuleForm ruleForm){
return this.dormitoryAdminService.login(ruleForm);
}
//保存
@PostMapping("/save")
public ResultVO save(@RequestBody DormitoryAdmin dormitoryAdmin){
boolean save = this.dormitoryAdminService.save(dormitoryAdmin);
ResultVO resultVO = new ResultVO();
if(save){
//保存成功
return ResultVOUtil.success(null);
}else {
//保存失败
return ResultVOUtil.fail();
}
}
//查询列表
@GetMapping("/list/{page}/{size}")
public ResultVO list(
@PathVariable("page") Integer page,
@PathVariable("size") Integer size){
PageVO pageVO = this.dormitoryAdminService.pageList(page, size);
return ResultVOUtil.success(pageVO);
}
@GetMapping("/search")
public ResultVO search(SearchForm searchForm){
PageVO pageVO = this.dormitoryAdminService.search(searchForm);
return ResultVOUtil.success(pageVO);
}
//更新
@PutMapping("/update")
public ResultVO update(@RequestBody DormitoryAdmin dormitoryAdmin){
boolean update = this.dormitoryAdminService.updateById(dormitoryAdmin);
ResultVO resultVO = new ResultVO();
if(update){
//更新成功
return ResultVOUtil.success(null);
}else {
//更新失败
return ResultVOUtil.fail();
}
}
@GetMapping("/findById/{id}")
public ResultVO findById(@PathVariable("id") Integer id){
DormitoryAdmin dormitoryAdmin = this.dormitoryAdminService.getById(id);
return ResultVOUtil.success(dormitoryAdmin);
}
@DeleteMapping("/delete/{id}")
public ResultVO delete(@PathVariable("id") Integer id){
boolean remove = this.dormitoryAdminService.removeById(id);
if(remove){
return ResultVOUtil.success(null);
}else {
return ResultVOUtil.fail();
}
}
}
DormitoryController .java
package com.shrimpking.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.shrimpking.pojo.Dormitory;
import com.shrimpking.service.DormitoryService;
import com.shrimpking.utils.ResultVOUtil;
import com.shrimpking.vo.ResultVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* <p>
* 宿舍表 前端控制器
* </p>
*
* @author shrimpking
* @since 2023-08-30
*/
@RestController
@RequestMapping("/dormitory")
public class DormitoryController {
@Autowired
private DormitoryService dormitoryService;
//返回有空余床位的宿舍列表
@GetMapping("/availableList")
public ResultVO availableList(){
LambdaQueryWrapper<Dormitory> wrapper = new LambdaQueryWrapper<>();
wrapper.gt(Dormitory::getAvailable,0);
List<Dormitory> dormitoryList = this.dormitoryService.list(wrapper);
return ResultVOUtil.success(dormitoryList);
}
}
StudentController .java
package com.shrimpking.controller;
import com.shrimpking.form.SearchForm;
import com.shrimpking.form.StudentForm;
import com.shrimpking.pojo.DormitoryAdmin;
import com.shrimpking.pojo.Student;
import com.shrimpking.service.StudentService;
import com.shrimpking.utils.ResultVOUtil;
import com.shrimpking.vo.PageVO;
import com.shrimpking.vo.ResultVO;
import net.bytebuddy.asm.Advice;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.swing.*;
/**
* <p>
* 学生表 前端控制器
* </p>
*
* @author shrimpking
* @since 2023-08-29
*/
@RestController
@RequestMapping("/student")
public class StudentController {
@Autowired
private StudentService studentService;
//保存
@PostMapping("/save")
public ResultVO save(@RequestBody Student student){
boolean saveStudent = this.studentService.saveStudent(student);
if(!saveStudent) {return ResultVOUtil.fail();}
return ResultVOUtil.success(null);
}
//查询列表
@GetMapping("/list/{page}/{size}")
public ResultVO list(
@PathVariable("page") Integer page,
@PathVariable("size") Integer size
){
PageVO pageVO = this.studentService.pageList(page, size);
return ResultVOUtil.success(pageVO);
}
//搜索
@GetMapping("/search")
public ResultVO search(SearchForm searchForm){
PageVO pageVO = this.studentService.search(searchForm);
return ResultVOUtil.success(pageVO);
}
@PutMapping("/update")
public ResultVO update(@RequestBody StudentForm studentForm){
boolean update = this.studentService.update(studentForm);
ResultVO resultVO = new ResultVO();
if(update){
//更新成功
return ResultVOUtil.success(null);
}else {
//更新失败
return ResultVOUtil.fail();
}
}
@GetMapping("/findById/{id}")
public ResultVO findById(@PathVariable("id") Integer id){
Student student = this.studentService.getById(id);
StudentForm studentForm = new StudentForm();
BeanUtils.copyProperties(student,studentForm);
studentForm.setOldDormitoryId(student.getDormitoryId());
return ResultVOUtil.success(studentForm);
}
@DeleteMapping("/delete/{id}")
public ResultVO delete(@PathVariable("id") Integer id){
boolean remove = this.studentService.removeById(id);
if(!remove) ResultVOUtil.fail();
return ResultVOUtil.success(null);
}
}
SystemAdminController .java
package com.shrimpking.controller;
import com.shrimpking.form.RuleForm;
import com.shrimpking.service.SystemAdminService;
import com.shrimpking.vo.ResultVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 宿舍管理员表 前端控制器
* </p>
*
* @author shrimpking
* @since 2023-08-28
*/
@RestController
@RequestMapping("/systemAdmin")
public class SystemAdminController {
@Autowired
private SystemAdminService systemAdminService;
@GetMapping("/login")
public ResultVO login(RuleForm ruleForm){
return systemAdminService.login(ruleForm);
}
}
form
RuleForm.java
package com.shrimpking.form;
import lombok.Data;
/**
* Created by IntelliJ IDEA.
*
* @Author : Shrimpking
* @create 2023/8/28 19:57
*/
@Data
public class RuleForm
{
private String username;
private String password;
}
SearchForm.java
package com.shrimpking.form;
import lombok.Data;
/**
* Created by IntelliJ IDEA.
*
* @Author : Shrimpking
* @create 2023/8/29 20:25
*/
@Data
public class SearchForm
{
private String key;
private String value;
private Integer page;
private Integer size;
}
StudentForm.java
package com.shrimpking.form;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* Created by IntelliJ IDEA.
*
* @Author : Shrimpking
* @create 2023/8/30 16:11
*/
@Data
public class StudentForm
{
private Integer id;
private String number;
private String name;
private String gender;
private Integer dormitoryId;
private Integer oldDormitoryId;
private String state;
private Date createDate;
}
mapper
BuildingMapper .java
package com.shrimpking.mapper;
import com.shrimpking.pojo.Building;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 楼宇表 Mapper 接口
* </p>
*
* @author shrimpking
* @since 2023-08-30
*/
public interface BuildingMapper extends BaseMapper<Building> {
}
DormitoryAdminMapper .java
package com.shrimpking.mapper;
import com.shrimpking.pojo.DormitoryAdmin;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 宿舍管理员表 Mapper 接口
* </p>
*
* @author shrimpking
* @since 2023-08-28
*/
public interface DormitoryAdminMapper extends BaseMapper<DormitoryAdmin> {
}
DormitoryMapper .java
package com.shrimpking.mapper;
import com.shrimpking.pojo.Dormitory;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 宿舍表 Mapper 接口
* </p>
*
* @author shrimpking
* @since 2023-08-30
*/
public interface DormitoryMapper extends BaseMapper<Dormitory> {
public void subAvailable(Integer id);
public void addAvailable(Integer id);
}
StudentMapper .java
package com.shrimpking.mapper;
import com.shrimpking.pojo.Student;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 学生表 Mapper 接口
* </p>
*
* @author shrimpking
* @since 2023-08-29
*/
public interface StudentMapper extends BaseMapper<Student> {
}
SystemAdminMapper .java
package com.shrimpking.mapper;
import com.shrimpking.pojo.SystemAdmin;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 宿舍管理员表 Mapper 接口
* </p>
*
* @author shrimpking
* @since 2023-08-28
*/
public interface SystemAdminMapper extends BaseMapper<SystemAdmin> {
}
pojo
Building .java
package com.shrimpking.pojo;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 楼宇表
* </p>
*
* @author shrimpking
* @since 2023-08-30
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("f_building")
@ApiModel(value="Building对象", description="楼宇表")
public class Building implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "id")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty(value = "楼宇名称")
private String name;
@ApiModelProperty(value = "介绍")
private String introduction;
@ApiModelProperty(value = "宿管id")
private Integer adminId;
}
Dormitory .java
package com.shrimpking.pojo;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 宿舍表
* </p>
*
* @author shrimpking
* @since 2023-08-30
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("f_dormitory")
@ApiModel(value="Dormitory对象", description="宿舍表")
public class Dormitory implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "id")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty(value = "楼宇id")
private Integer buildingId;
@ApiModelProperty(value = "宿舍名称")
private String name;
@ApiModelProperty(value = "几人间宿舍")
private Integer type;
@ApiModelProperty(value = "空余床位")
private Integer available;
@ApiModelProperty(value = "电话")
private String telephone;
}
DormitoryAdmin .java
package com.shrimpking.pojo;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 宿舍管理员表
* </p>
*
* @author shrimpking
* @since 2023-08-28
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("f_dormitory_admin")
@ApiModel(value="DormitoryAdmin对象", description="宿舍管理员表")
public class DormitoryAdmin implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "宿管id")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty(value = "登录名")
private String userName;
@ApiModelProperty(value = "密码")
private String password;
@ApiModelProperty(value = "姓名")
private String name;
@ApiModelProperty(value = "性别")
private String gender;
@ApiModelProperty(value = "电话")
private String telephone;
}
student.java
package com.shrimpking.pojo;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import java.util.Date;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 学生表
* </p>
*
* @author shrimpking
* @since 2023-08-29
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("f_student")
@ApiModel(value="Student对象", description="学生表")
public class Student implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "id")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty(value = "学号")
private String number;
@ApiModelProperty(value = "姓名")
private String name;
@ApiModelProperty(value = "性别")
private String gender;
@ApiModelProperty(value = "宿舍id")
private Integer dormitoryId;
@ApiModelProperty(value = "状态")
private String state;
@ApiModelProperty(value = "创建时间")
private Date createDate;
}
SystemAdmin .java
package com.shrimpking.pojo;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 宿舍管理员表
* </p>
*
* @author shrimpking
* @since 2023-08-28
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("f_system_admin")
@ApiModel(value="SystemAdmin对象", description="系统管理员表")
public class SystemAdmin implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "id")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty(value = "登录名")
private String userName;
@ApiModelProperty(value = "密码")
private String password;
@ApiModelProperty(value = "姓名")
private String name;
@ApiModelProperty(value = "性别")
private String gender;
@ApiModelProperty(value = "电话")
private String telephone;
}
service
BuildingService .java
package com.shrimpking.service;
import com.shrimpking.pojo.Building;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 楼宇表 服务类
* </p>
*
* @author shrimpking
* @since 2023-08-30
*/
public interface BuildingService extends IService<Building> {
}
DormitoryAdminService .java
package com.shrimpking.service;
import com.shrimpking.form.RuleForm;
import com.shrimpking.form.SearchForm;
import com.shrimpking.pojo.DormitoryAdmin;
import com.baomidou.mybatisplus.extension.service.IService;
import com.shrimpking.vo.PageVO;
import com.shrimpking.vo.ResultVO;
/**
* <p>
* 宿舍管理员表 服务类
* </p>
*
* @author shrimpking
* @since 2023-08-28
*/
public interface DormitoryAdminService extends IService<DormitoryAdmin> {
public ResultVO login(RuleForm ruleForm);
public PageVO pageList(Integer page,Integer size);
public PageVO search(SearchForm searchForm);
}
DormitoryService .java
package com.shrimpking.service;
import com.shrimpking.pojo.Dormitory;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 宿舍表 服务类
* </p>
*
* @author shrimpking
* @since 2023-08-30
*/
public interface DormitoryService extends IService<Dormitory> {
}
StudentService .java
package com.shrimpking.service;
import com.shrimpking.form.SearchForm;
import com.shrimpking.form.StudentForm;
import com.shrimpking.pojo.Student;
import com.baomidou.mybatisplus.extension.service.IService;
import com.shrimpking.vo.PageVO;
import com.shrimpking.vo.StudentVO;
import java.util.List;
/**
* <p>
* 学生表 服务类
* </p>
*
* @author shrimpking
* @since 2023-08-29
*/
public interface StudentService extends IService<Student> {
public boolean saveStudent(Student student);
public boolean update(StudentForm studentForm);
public PageVO pageList(Integer page, Integer size);
public PageVO search(SearchForm searchForm);
}
SystemAdminService .java
package com.shrimpking.service;
import com.shrimpking.form.RuleForm;
import com.shrimpking.pojo.SystemAdmin;
import com.baomidou.mybatisplus.extension.service.IService;
import com.shrimpking.vo.ResultVO;
/**
* <p>
* 宿舍管理员表 服务类
* </p>
*
* @author shrimpking
* @since 2023-08-28
*/
public interface SystemAdminService extends IService<SystemAdmin> {
public ResultVO login(RuleForm ruleForm);
}
service impl
BuildingServiceImpl .java
package com.shrimpking.service.impl;
import com.shrimpking.pojo.Building;
import com.shrimpking.mapper.BuildingMapper;
import com.shrimpking.service.BuildingService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 楼宇表 服务实现类
* </p>
*
* @author shrimpking
* @since 2023-08-30
*/
@Service
public class BuildingServiceImpl extends ServiceImpl<BuildingMapper, Building> implements BuildingService {
}
DormitoryAdminServiceImpl .java
package com.shrimpking.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.shrimpking.form.RuleForm;
import com.shrimpking.form.SearchForm;
import com.shrimpking.pojo.DormitoryAdmin;
import com.shrimpking.mapper.DormitoryAdminMapper;
import com.shrimpking.service.DormitoryAdminService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.shrimpking.vo.PageVO;
import com.shrimpking.vo.ResultVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* <p>
* 宿舍管理员表 服务实现类
* </p>
*
* @author shrimpking
* @since 2023-08-28
*/
@Service
public class DormitoryAdminServiceImpl extends ServiceImpl<DormitoryAdminMapper, DormitoryAdmin> implements DormitoryAdminService {
@Autowired
private DormitoryAdminMapper dormitoryAdminMapper;
@Override
public ResultVO login(RuleForm ruleForm)
{
//查询数据库用户名是否存在
LambdaQueryWrapper<DormitoryAdmin> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(DormitoryAdmin::getUserName,ruleForm.getUsername());
DormitoryAdmin dormitoryAdmin = dormitoryAdminMapper.selectOne(wrapper);
ResultVO<DormitoryAdmin> resultVO = new ResultVO<>();
//没查到用户名
if(dormitoryAdmin == null){
resultVO.setCode(-1);
} else {
//判断密码是否正确
if(!dormitoryAdmin.getPassword().equals(ruleForm.getPassword())){
//密码错误
resultVO.setCode(-2);
} else {
//密码正确
resultVO.setCode(0);
resultVO.setData(dormitoryAdmin);
}
}
return resultVO;
}
@Override
public PageVO pageList(Integer page, Integer size)
{
Page<DormitoryAdmin> dormitoryAdminPage = new Page<>(page,size);
Page<DormitoryAdmin> resultPage = this.dormitoryAdminMapper.selectPage(dormitoryAdminPage,null);
PageVO pageVO = new PageVO();
//总数
pageVO.setTotal(resultPage.getTotal());
//数据
pageVO.setData(resultPage.getRecords());
return pageVO;
}
@Override
public PageVO search(SearchForm searchForm)
{
//需要模糊查询与分页
Page<DormitoryAdmin> page = new Page<>(searchForm.getPage(),searchForm.getSize());
Page<DormitoryAdmin> resultPage = null;
if("".equals(searchForm.getValue())){
//没有查询条件的值,
resultPage = this.dormitoryAdminMapper.selectPage(page,null);
} else {
//
QueryWrapper<DormitoryAdmin> wrapper = new QueryWrapper<>();
wrapper.like(searchForm.getKey(),searchForm.getValue());
resultPage = this.dormitoryAdminMapper.selectPage(page,wrapper);
}
//封装
PageVO pageVO = new PageVO();
pageVO.setTotal(resultPage.getTotal());
pageVO.setData(resultPage.getRecords());
return pageVO;
}
}
DormitoryServiceImpl .java
package com.shrimpking.service.impl;
import com.shrimpking.pojo.Dormitory;
import com.shrimpking.mapper.DormitoryMapper;
import com.shrimpking.service.DormitoryService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 宿舍表 服务实现类
* </p>
*
* @author shrimpking
* @since 2023-08-30
*/
@Service
public class DormitoryServiceImpl extends ServiceImpl<DormitoryMapper, Dormitory> implements DormitoryService {
}
StudentServiceImpl .java
package com.shrimpking.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.shrimpking.form.SearchForm;
import com.shrimpking.form.StudentForm;
import com.shrimpking.mapper.DormitoryMapper;
import com.shrimpking.pojo.Dormitory;
import com.shrimpking.pojo.Student;
import com.shrimpking.mapper.StudentMapper;
import com.shrimpking.service.StudentService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.shrimpking.utils.CommonUtil;
import com.shrimpking.vo.PageVO;
import com.shrimpking.vo.StudentVO;
import freemarker.core.UnknownDateTypeFormattingUnsupportedException;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* <p>
* 学生表 服务实现类
* </p>
*
* @author shrimpking
* @since 2023-08-29
*/
@Service
public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student> implements StudentService {
@Autowired
private StudentMapper studentMapper;
@Autowired
private DormitoryMapper dormitoryMapper;
@Override
public boolean saveStudent(Student student)
{
//添加学生信息
student.setState("入住");
student.setCreateDate(new Date());
int insert = this.studentMapper.insert(student);
if(insert != 1){ return false; }
//修改宿舍空余床位
Dormitory dormitory = this.dormitoryMapper.selectById(student.getDormitoryId());
if(dormitory.getAvailable() == 0){
return false;
}
dormitory.setAvailable(dormitory.getAvailable() - 1);
int update = this.dormitoryMapper.updateById(dormitory);
if(update != 1) { return false; }
return true;
}
@Override
public boolean update(StudentForm studentForm)
{
//更新学生信息
Student student = new Student();
BeanUtils.copyProperties(studentForm,student);
int update = this.studentMapper.updateById(student);
if(update != 1) { return false; }
//更新宿舍信息
if(!studentForm.getDormitoryId().equals(studentForm.getOldDormitoryId())){
try
{
this.dormitoryMapper.addAvailable(studentForm.getOldDormitoryId());
this.dormitoryMapper.subAvailable(studentForm.getDormitoryId());
}catch (Exception e){
return false;
}
}
return true;
}
@Override
public PageVO pageList(Integer page, Integer size)
{
//声明分页
Page<Student> studentPage = new Page<>(page,size);
Page<Student> resultPage = this.studentMapper.selectPage(studentPage,null);
//获取结果集
List<Student> studentList = resultPage.getRecords();
List<StudentVO> studentVOList = new ArrayList<>();
//Vo转换
for (Student student : studentList)
{
StudentVO studentVO = new StudentVO();
//复制属性内容到新vo中
BeanUtils.copyProperties(student,studentVO);
//查询宿舍名称
Dormitory dormitory = this.dormitoryMapper.selectById(student.getDormitoryId());
studentVO.setDormitoryName(dormitory.getName());
studentVOList.add(studentVO);
}
PageVO pageVO = new PageVO();
pageVO.setData(studentVOList);
pageVO.setTotal(resultPage.getTotal());
return pageVO;
}
@Override
public PageVO search(SearchForm searchForm){
Page<Student> studentPage = new Page<>(searchForm.getPage(),searchForm.getSize());
Page<Student> resultPage = null;
if("".equals(searchForm.getValue())){
resultPage = this.studentMapper.selectPage(studentPage,null);
}else {
QueryWrapper<Student> queryWrapper = new QueryWrapper<>();
queryWrapper.like(searchForm.getKey(),searchForm.getValue());
resultPage = this.studentMapper.selectPage(studentPage,queryWrapper);
}
//获取结果集
List<Student> studentList = resultPage.getRecords();
List<StudentVO> studentVOList = new ArrayList<>();
//Vo转换
for (Student student : studentList)
{
StudentVO studentVO = new StudentVO();
//复制属性内容到新vo中
BeanUtils.copyProperties(student,studentVO);
//查询宿舍名称
Dormitory dormitory = this.dormitoryMapper.selectById(student.getDormitoryId());
studentVO.setDormitoryName(dormitory.getName());
studentVOList.add(studentVO);
}
PageVO pageVO = new PageVO();
pageVO.setData(studentVOList);
pageVO.setTotal(resultPage.getTotal());
return pageVO;
}
}
SystemAdminServiceImpl .java
package com.shrimpking.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.shrimpking.form.RuleForm;
import com.shrimpking.pojo.SystemAdmin;
import com.shrimpking.mapper.SystemAdminMapper;
import com.shrimpking.service.SystemAdminService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.shrimpking.vo.ResultVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* <p>
* 宿舍管理员表 服务实现类
* </p>
*
* @author shrimpking
* @since 2023-08-28
*/
@Service
public class SystemAdminServiceImpl extends ServiceImpl<SystemAdminMapper, SystemAdmin> implements SystemAdminService {
@Autowired
private SystemAdminMapper systemAdminMapper;
@Override
public ResultVO login(RuleForm ruleForm)
{
//查询用户名是否存在
LambdaQueryWrapper<SystemAdmin> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemAdmin::getUserName,ruleForm.getUsername());
SystemAdmin systemAdmin = this.systemAdminMapper.selectOne(wrapper);
ResultVO<SystemAdmin> resultVO = new ResultVO<>();
if(systemAdmin == null){
//用户名不存在
resultVO.setCode(-1);
} else {
//密码是否正确
if(!systemAdmin.getPassword().equals(ruleForm.getPassword())){
resultVO.setCode(-2);
} else {
//密码正确
resultVO.setCode(0);
resultVO.setData(systemAdmin);
}
}
return resultVO;
}
}
utils
CommonUtil.java
package com.shrimpking.utils;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Created by IntelliJ IDEA.
*
* @Author : Shrimpking
* @create 2023/8/30 10:24
*/
public class CommonUtil
{
/**
* 创建日期类型的字符串
* @return
*/
public static String createData(){
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
return format.format(new Date());
}
}
ResultVOUtil.java
package com.shrimpking.utils;
import com.shrimpking.vo.ResultVO;
/**
* Created by IntelliJ IDEA.
*
* @Author : Shrimpking
* @create 2023/8/29 11:10
*/
public class ResultVOUtil
{
//成功
public static ResultVO success(Object object){
ResultVO resultVO = new ResultVO<>();
resultVO.setCode(0);
resultVO.setData(object);
return resultVO;
}
//失败
public static ResultVO fail(){
ResultVO resultVO = new ResultVO();
resultVO.setCode(-1);
return resultVO;
}
}
Vo
pagevo.java
package com.shrimpking.vo;
import lombok.Data;
/**
* Created by IntelliJ IDEA.
*
* @Author : Shrimpking
* @create 2023/8/29 19:49
*/
@Data
public class PageVO
{
private Object data;
private Long total;
}
resultVo.java
package com.shrimpking.vo;
import lombok.Data;
/**
* Created by IntelliJ IDEA.
*
* @Author : Shrimpking
* @create 2023/8/28 19:54
*/
@Data
public class ResultVO<T>
{
private Integer code;
private T data;
}
studentvo.java
package com.shrimpking.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* Created by IntelliJ IDEA.
*
* @Author : Shrimpking
* @create 2023/8/30 13:11
*/
@Data
public class StudentVO
{
private Integer id;
private String number;
private String name;
private String gender;
private String dormitoryName;
private String state;
private Date createDate;
}
mapper xml
buildingMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.shrimpking.mapper.BuildingMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.shrimpking.pojo.Building">
<id column="id" property="id" />
<result column="name" property="name" />
<result column="introduction" property="introduction" />
<result column="admin_id" property="adminId" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, name, introduction, admin_id
</sql>
</mapper>
DormitoryAdminMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.shrimpking.mapper.DormitoryAdminMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.shrimpking.pojo.DormitoryAdmin">
<id column="id" property="id" />
<result column="user_name" property="userName" />
<result column="password" property="password" />
<result column="name" property="name" />
<result column="gender" property="gender" />
<result column="telephone" property="telephone" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, user_name, password, name, gender, telephone
</sql>
</mapper>
DormitoryMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.shrimpking.mapper.DormitoryMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.shrimpking.pojo.Dormitory">
<id column="id" property="id" />
<result column="building_id" property="buildingId" />
<result column="name" property="name" />
<result column="type" property="type" />
<result column="available" property="available" />
<result column="telephone" property="telephone" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, building_id, name, type, available, telephone
</sql>
<update id="subAvailable">
update f_dormitory set available = available - 1 where id = #{id}
</update>
<update id="addAvailable">
update f_dormitory set available = available + 1 where id = #{id}
</update>
</mapper>
StudentMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.shrimpking.mapper.StudentMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.shrimpking.pojo.Student">
<id column="id" property="id" />
<result column="number" property="number" />
<result column="name" property="name" />
<result column="gender" property="gender" />
<result column="dormitory_id" property="dormitoryId" />
<result column="state" property="state" />
<result column="create_date" property="createDate" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, number, name, gender, dormitory_id, state, create_date
</sql>
</mapper>
SystemAdminMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.shrimpking.mapper.SystemAdminMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.shrimpking.pojo.SystemAdmin">
<id column="id" property="id" />
<result column="user_name" property="userName" />
<result column="password" property="password" />
<result column="name" property="name" />
<result column="gender" property="gender" />
<result column="telephone" property="telephone" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, user_name, password, name, gender, telephone
</sql>
</mapper>
vue
配置
main.js
import Vue from 'vue'
import App from './App.vue'
import router from '@/router'
import store from '@/store'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import axios from "axios";
import * as echarts from 'echarts'
axios.defaults.baseURL='http://localhost:8089';
Vue.prototype.$http = axios;
Vue.prototype.$echarts = echarts;
Vue.use(ElementUI,{size:'small'});
Vue.config.productionTip = false;
new Vue({
render: h => h(App),
router,
store
}).$mount('#app');
app.vue
<template>
<div id="app">
<router-view></router-view>
</div>
</template>
<script>
export default {
name: 'App',
components: {
}
}
</script>
<style>
*,div {
margin: 0;
padding: 0;
}
</style>
store index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex);
export default new Vuex.Store({
state:{
}
});
router index.js
import Vue from 'vue'
import VueRouter from "vue-router";
import Login from "@/views/Login";
import SystemAdmin from "@/views/SystemAdmin";
import DormitoryAdminAdd from "@/views/DormitoryAdminAdd";
import DormitoryAdminManager from "@/views/DormitoryAdminManager";
import DormitoryAdminUpdate from "@/views/DormitoryAdminUpdate";
import StudentAdd from "@/views/StudentAdd";
import StudentManager from "@/views/StudentManager";
import StudentUpdate from "@/views/StudentUpdate";
Vue.use(VueRouter);
export default new VueRouter({
mode:'history',
routes:[
{
path:'/',
redirect:'/login'
},
{
path: '/login',
name:'Login',
component: Login
},
{
path:'/systemAdmin',
name:'SystemAdmin',
component:SystemAdmin,
redirect:'/dormitoryAdminManager',
meta:{
displayName:'后台'
},
children:[
{
path:'/dormitoryAdminAdd',
name:'DormitoryAdminAdd',
component:DormitoryAdminAdd,
meta:{
displayName: '添加宿管'
}
},
{
path:'/dormitoryAdminManager',
name:'DormitoryAdminManager',
component:DormitoryAdminManager,
meta: {
displayName: '宿管管理'
}
},
{
path:'/dormitoryAdminUpdate',
name:'DormitoryAdminUpdate',
component:DormitoryAdminUpdate,
meta:{
displayName: '更新宿管'
}
},
{
path:'/studentAdd',
name:'StudentAdd',
component: StudentAdd,
meta:{
displayName:'添加学生'
}
},
{
path:'/studentManager',
name:'StudentManager',
component: StudentManager,
meta:{
displayName:'学生管理'
}
},
{
path:'/studentUpdate',
name:'StudentUpdate',
component: StudentUpdate,
meta:{
displayName:'修改学生'
}
},
]
}
]
});
views
DormitoryAdminAdd.vue
<template>
<div class="dormitory-add">
<el-form :model="ruleForm" :rules="rules" ref="ruleForm"
label-width="90px"
label-position="left"
class="">
<el-form-item label="用户名" prop="userName">
<el-input v-model="ruleForm.userName" type="text"></el-input>
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input v-model="ruleForm.password" type="password"></el-input>
</el-form-item>
<el-form-item label="姓名" prop="name">
<el-input v-model="ruleForm.name" type="text"></el-input>
</el-form-item>
<el-form-item label="性别" prop="gender">
<div style="width:170px;height:30px;">
<template>
<el-radio v-model="ruleForm.gender" label="男">男</el-radio>
<el-radio v-model="ruleForm.gender" label="女">女</el-radio>
</template>
</div>
</el-form-item>
<el-form-item label="电话" prop="telephone">
<el-input v-model="ruleForm.telephone" type="text"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleSubmit('ruleForm')">保存</el-button>
<el-button @click="handleReset('ruleForm')">重置</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
export default {
name: "DormitoryAdminAdd",
data(){
return {
ruleForm:{
userName:'',
password:'',
name:'',
gender:'男',
telephone:''
},
rules:{
userName:[
{ required: true, message: '请输入用户名', trigger: 'blur'}
],
password:[
{ required: true, message: '请输入密码', trigger: 'blur'}
],
name:[
{ required: true, message: '请输入姓名', trigger: 'blur'}
],
gender:[
{ required: true, message:'请选择性别', trigger: 'blur'}
],
telephone: [
{ required: true, message: '请输入手机号码', trigger:'blur'}
]
}
}
},
methods:{
//保存
handleSubmit(formName){
this.$refs[formName].validate((valid) => {
if(valid){
this.$http.post('/dormitoryAdmin/save',this.ruleForm)
.then( res => {
if(res.data.code === 0){
//成功
this.$message.success('保存成功!');
this.$router.push('/dormitoryAdminManager');
}
})
}
})
},
//重置
handleReset(formName){
this.$refs[formName].resetFields();
}
}
}
</script>
<style scoped>
.dormitory-add{
margin-top: 60px;
margin-left: 330px;
width: 450px;
height: 500px;
}
</style>
DormitoryAdminManager.vue
<template>
<div class="dormitory-manager">
<el-form :model="ruleForm" :rules="rules" ref="ruleForm"
label-width="65px" label-position="left">
<el-form-item label="字段" prop="key">
<el-select v-model="ruleForm.key" style="width: 160px;float: left;" placeholder="请选择字段">
<el-option label="宿管账号" value="user_name"></el-option>
<el-option label="宿管姓名" value="name"></el-option>
<el-option label="宿管电话" value="telephone"></el-option>
</el-select>
</el-form-item>
<div style="width: 400px;height: 60px;position: relative;top:-51px;left:300px;">
<el-form-item label="值">
<el-input type="text" v-model="ruleForm.value" placeholder="请输入关键字" style="width: 160px;"></el-input>
<el-button type="primary" icon="el-icon-search" style="position:relative;left:20px;" @click="handleSearch('ruleForm')">搜索</el-button>
</el-form-item>
</div>
</el-form>
<el-table
:data="tableData"
border
style="width: 100%;position: relative;top: -30px;">
<el-table-column
prop="id"
label="ID">
</el-table-column>
<el-table-column
prop="userName"
label="用户名">
</el-table-column>
<el-table-column
prop="password"
label="密码">
</el-table-column>
<el-table-column
prop="name"
label="姓名">
</el-table-column>
<el-table-column
prop="gender"
label="性别">
</el-table-column>
<el-table-column
prop="telephone"
label="电话">
</el-table-column>
<el-table-column label="操作" >
<template slot-scope="scope">
<el-button @click="edit(scope.row)">编辑</el-button>
<el-button @click="del(scope.row)" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
background
layout="prev,pager,next"
:pageSize="pageSize"
:total="total"
:current-page.sync="currentPage"
@current-change="page">
</el-pagination>
</div>
</template>
<script>
export default {
name: "DormitoryAdminManager",
data(){
return {
tableData:null,
currentPage: 1,
pageSize: 3,
total:null,
ruleForm:{
key:'',
value:'',
page:'',
size: 3
},
rules:{
key:[{required: true, message:'请选择字段', trigger: 'change'}]
}
}
},
methods:{
//加载数据
loadData(){
this.$http.get('/dormitoryAdmin/list/1/'+ this.pageSize).then(res => {
this.tableData = res.data.data.data;
this.total = res.data.data.total;
});
},
edit(row){
this.$router.push('/dormitoryAdminUpdate?id=' + row.id);
},
del(row){
this.$confirm('确定要删除【' + row.userName +'】吗?','删除提示',{
confirmButtonText:'删除',
cancelButtonText:'取消',
type:'warning'
}).then(() => {
this.$http.delete('/dormitoryAdmin/delete/'+ row.id)
.then( res => {
if(res.data.code === 0){
this.$message.success('删除成功!');
}
}).then(()=> {
this.currentPage = 1;
this.loadData();
})
}).catch(()=>{
this.$message({
type:'info',
message:'已取消删除!'
});
});
},
//搜索
handleSearch(formName){
this.currentPage = 1;
this.$refs[formName].validate((valid) =>{
if(valid){
this.ruleForm.page = this.currentPage;
this.$http.get('/dormitoryAdmin/search',{params: this.ruleForm})
.then(res => {
this.tableData = res.data.data.data;
this.total = res.data.data.total;
})
}
})
},
page(currentPage){
//没有查询条件
if(this.ruleForm.value === ''){
this.$http.get('/dormitoryAdmin/list/'+ currentPage +'/' + this.pageSize)
.then(res => {
this.tableData = res.data.data.data;
this.total = res.data.data.total;
})
} else {
//有查询条件
this.ruleForm.page = this.currentPage;
this.$http.get('/dormitoryAdmin/search',{params: this.ruleForm})
.then(res => {
this.tableData = res.data.data.data;
this.total = res.data.data.total;
})
}
}
},
created(){
this.loadData();
}
}
</script>
<style scoped>
.dormitory-manager{
margin-top: 60px;
margin-left: 80px;
}
</style>
DormitoryAdminUpdate.vue
<template>
<div class="dormitory-add">
<el-form :model="ruleForm" :rules="rules" ref="ruleForm"
label-width="90px"
label-position="left"
class="">
<el-form-item label="ID">
<el-input v-model="ruleForm.id" type="text" readonly></el-input>
</el-form-item>
<el-form-item label="用户名" prop="userName">
<el-input v-model="ruleForm.userName" type="text"></el-input>
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input v-model="ruleForm.password" type="password"></el-input>
</el-form-item>
<el-form-item label="姓名" prop="name">
<el-input v-model="ruleForm.name" type="text"></el-input>
</el-form-item>
<el-form-item label="性别" prop="gender">
<div style="width:170px;height:30px;">
<template>
<el-radio v-model="ruleForm.gender" label="男">男</el-radio>
<el-radio v-model="ruleForm.gender" label="女">女</el-radio>
</template>
</div>
</el-form-item>
<el-form-item label="电话" prop="telephone">
<el-input v-model="ruleForm.telephone" type="text"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleSubmit('ruleForm')">更新</el-button>
<el-button @click="handleCancel">取消</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
export default {
name: "DormitoryAdminUpdate",
data(){
return {
ruleForm:{
id:'',
userName:'',
password:'',
name:'',
gender:'男',
telephone:''
},
rules:{
userName:[
{ required: true, message: '请输入用户名', trigger: 'blur'}
],
password:[
{ required: true, message: '请输入密码', trigger: 'blur'}
],
name:[
{ required: true, message: '请输入姓名', trigger: 'blur'}
],
gender:[
{ required: true, message:'请选择性别', trigger: 'blur'}
],
telephone: [
{ required: true, message: '请输入手机号码', trigger:'blur'}
]
}
}
},
methods:{
//保存
handleSubmit(formName){
this.$refs[formName].validate((valid) => {
if(valid){
this.$http.put('/dormitoryAdmin/update',this.ruleForm)
.then( res => {
if(res.data.code === 0){
//成功
this.$message.success('更新成功!');
this.$router.push('/dormitoryAdminManager');
}
})
}
})
},
//取消
handleCancel(){
this.$router.push('/dormitoryAdminManager');
}
},
created(){
this.$http.get('/dormitoryAdmin/findById/'+this.$route.query.id)
.then(res => {
this.ruleForm = res.data.data;
});
}
}
</script>
<style scoped>
.dormitory-add{
margin-top: 60px;
margin-left: 330px;
width: 450px;
height: 500px;
}
</style>
LoginPage.vue
<template>
<div class="login-container">
<el-form :model="ruleForm" :rules="rules"
status-icon
ref="ruleForm"
label-position="left"
label-width="80px"
class="demo-ruleForm login-page">
<h3 class="title">系统登录</h3>
<el-form-item label="用户名" prop="username">
<el-input type="text" v-model="ruleForm.username" placeholder="用户名"></el-input>
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input type="password" v-model="ruleForm.password" placeholder="密码"></el-input>
</el-form-item>
<el-form-item>
<el-radio v-model="type" label="sysAdmin">系统管理员</el-radio>
<el-radio v-model="type" label="dormitoryAdmin" style="position: relative;left: 120px;">宿舍管理员</el-radio>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleLogin" :loading="loading" style="width: 80%;">登录</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
export default {
name: "LoginPage",
data(){
return {
ruleForm:{
username:'admin1',
password:'1234'
},
type:'sysAdmin',
loading: false,
rules:{
username:[
{ required: true,message: '请输入账号',trigger: 'blur'}
],
password:[
{ required: true,message: '请输入密码',trigger: 'blur'}
]
}
}
},
methods:{
handleLogin(){
this.$refs.ruleForm.validate( (valid) =>{
if(valid){
this.loading = true;
if(this.type === 'sysAdmin'){
this.$http.get('/systemAdmin/login',{
params:{
username: this.ruleForm.username,
password: this.ruleForm.password
}
})
.then(res => {
this.loading = false;
if(res.data.code === -1){
this.$message.warning('用户名不存在')
}
if(res.data.code === -2){
this.$message.error('密码错误')
}
if(res.data.code === 0){
this.$message.success('登录成功');
localStorage.setItem('systemAdmin',JSON.stringify(res.data.data));
this.$router.push('/systemAdmin');
}
})
}else if (this.type === 'dormitoryAdmin'){
this.$http.get('/dormitoryAdmin/login',{params:this.ruleForm})
.then(res => {
this.loading = false;
if(res.data.code === -1){
this.$message.warning('用户名不存在')
}
if(res.data.code === -2){
this.$message.error('密码错误')
}
if(res.data.code === 0){
this.$message.success('登录成功');
localStorage.setItem('dormitoryAdmin',JSON.stringify(res.data.data));
this.$router.push('/systemAdmin');
}
})
}
}
});
}
}
}
</script>
<style scoped>
.login-container{
width: 30%;
margin: 140px auto;
border: 1px solid #cccccc;
border-radius: 15px;
padding: 5px 20px;
}
</style>
StudentAdd.vue
<template>
<div class="student-add">
<el-form :model="ruleForm" :rules="rules" ref="ruleForm"
label-width="80px" label-position="left">
<el-form-item label="学号" prop="number">
<el-input type="text" v-model="ruleForm.number"></el-input>
</el-form-item>
<el-form-item label="姓名" prop="name">
<el-input type="text" v-model="ruleForm.name"></el-input>
</el-form-item>
<el-form-item label="性别" prop="gender">
<div style="width: 170px;height: 30px;">
<template>
<el-radio v-model="ruleForm.gender" label="男">男</el-radio>
<el-radio v-model="ruleForm.gender" label="女">女</el-radio>
</template>
</div>
</el-form-item>
<el-form-item label="宿舍" prop="dormitoryId">
<el-select v-model="ruleForm.dormitoryId" placeholder="请选择宿舍">
<el-option v-for="(item,index) in dormitoryList" :key="index" :label="item.name" :value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleSubmit('ruleForm')">保存</el-button>
<el-button @click="handleReset('ruleForm')">重置</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
export default {
name: "StudentAdd",
data(){
return {
dormitoryList:[],
ruleForm:{
number:'',
name:'',
gender:'男',
dormitoryId:''
},
rules:{
number:[{ required: true, message: '请输入学号', trigger: 'blur'}],
name: [{ required: true, message: '请输入姓名', trigger: 'blur'}],
gender: [{ required: true, message: '请选择性别', trigger: 'blur'}],
dormitoryId: [{ required: true, message: '请选择宿舍', trigger: 'change'}],
}
}
},
methods:{
handleSubmit(formName){
this.$refs[formName].validate((valid) => {
if(valid){
this.$http.post('/student/save',this.ruleForm).then(res => {
if(res.data.code === 0){
this.$message.success('保存成功!');
this.$router.push('/studentManager');
}
})
}
})
},
handleReset(formName){
this.$refs[formName].resetFields();
}
},
created(){
this.$http.get('/dormitory/availableList').then(res => {
this.dormitoryList = res.data.data;
});
}
}
</script>
<style scoped>
.student-add{
margin-top: 60px;
margin-left: 330px;
width: 350px;
height: 500px;
}
</style>
StudentManager.vue
<template>
<div class="student-manager">
<el-form :model="ruleForm" :rules="rules" ref="ruleForm"
label-width="65px" label-position="left">
<el-form-item label="字段" prop="key">
<el-select v-model="ruleForm.key" style="width: 160px;float: left;">
<el-option label="学号" value="number"></el-option>
<el-option label="姓名" value="name"></el-option>
</el-select>
</el-form-item>
<div style="width: 400px; height: 60px;position:relative; top:-51px;left: 300px;">
<el-form-item label="值">
<el-input type="text" v-model="ruleForm.value" palceholder="请输入关键字" style="width:160px;"></el-input>
<el-button type="primary" icon="el-icon-search" style="position:relative;left:20px;" @click="handleSearch('ruleForm')">搜索</el-button>
</el-form-item>
</div>
</el-form>
<el-table
:data="tableData"
border
style="width: 100%;position: relative;top: -30px;">
<el-table-column
prop="id"
label="ID">
</el-table-column>
<el-table-column
prop="number"
label="学号">
</el-table-column>
<el-table-column
prop="name"
label="姓名">
</el-table-column>
<el-table-column
prop="gender"
label="性别">
</el-table-column>
<el-table-column
prop="dormitoryName"
label="宿舍">
</el-table-column>
<el-table-column
prop="state"
label="住宿状态">
</el-table-column>
<el-table-column
prop="createDate"
label="入住时间">
</el-table-column>
<el-table-column label="操作" >
<template slot-scope="scope">
<el-button @click="edit(scope.row)">编辑</el-button>
<el-button @click="del(scope.row)" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
background
layout="prev,pager,next"
:pageSize="pageSize"
:total="total"
:current-page.sync="currentPage"
@current-change="page">
</el-pagination>
</div>
</template>
<script>
export default {
name: "StudentManager",
data(){
return {
tableData:null,
currentPage: 1,
pageSize: 3,
total:null,
ruleForm:{
key:'',
value:'',
page:'',
size: 3
},
rules:{
key:[{required: true, message:'请选择字段', trigger: 'change'}]
}
}
},
methods:{
//加载数据
loadData(){
this.$http.get('/student/list/1/'+ this.pageSize).then(res => {
this.tableData = res.data.data.data;
this.total = res.data.data.total;
});
},
edit(row){
this.$router.push('/studentUpdate?id=' + row.id);
},
del(row){
this.$confirm('确定要删除【' + row.name +'】吗?','删除提示',{
confirmButtonText:'删除',
cancelButtonText:'取消',
type:'warning'
}).then(() => {
this.$http.delete('/student/delete/'+ row.id)
.then( res => {
if(res.data.code === 0){
this.$message.success('删除成功!');
}
}).then(()=> {
this.currentPage = 1;
this.loadData();
})
}).catch(()=>{
this.$message({
type:'info',
message:'已取消删除!'
});
});
},
//搜索
handleSearch(formName){
this.currentPage = 1;
this.$refs[formName].validate((valid) =>{
if(valid){
this.ruleForm.page = this.currentPage;
this.$http.get('/student/search',{params: this.ruleForm})
.then(res => {
this.tableData = res.data.data.data;
this.total = res.data.data.total;
})
}
})
},
page(currentPage){
//没有查询条件
if(this.ruleForm.value === ''){
this.$http.get('/student/list/'+ currentPage +'/' + this.pageSize)
.then(res => {
this.tableData = res.data.data.data;
this.total = res.data.data.total;
})
} else {
//有查询条件
this.ruleForm.page = this.currentPage;
this.$http.get('/student/search',{params: this.ruleForm})
.then(res => {
this.tableData = res.data.data.data;
this.total = res.data.data.total;
})
}
}
},
created(){
this.loadData();
}
}
</script>
<style scoped>
.student-manager{
margin-top: 60px;
margin-left: 80px;
}
</style>
StudentUpdate.vue
<template>
<div class="student-add">
<el-form :model="ruleForm" :rules="rules" ref="ruleForm"
label-width="80px" label-position="left">
<el-form-item label="ID">
<el-input type="text" v-model="ruleForm.id" readonly></el-input>
</el-form-item>
<el-form-item label="学号" prop="number">
<el-input type="text" v-model="ruleForm.number"></el-input>
</el-form-item>
<el-form-item label="姓名" prop="name">
<el-input type="text" v-model="ruleForm.name"></el-input>
</el-form-item>
<el-form-item label="性别" prop="gender">
<div style="width: 170px;height: 30px;">
<template>
<el-radio v-model="ruleForm.gender" label="男">男</el-radio>
<el-radio v-model="ruleForm.gender" label="女">女</el-radio>
</template>
</div>
</el-form-item>
<el-form-item label="宿舍" prop="dormitoryId">
<el-select v-model="ruleForm.dormitoryId" placeholder="请选择宿舍">
<el-option v-for="(item,index) in dormitoryList" :key="index" :label="item.name" :value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleSubmit('ruleForm')">更新</el-button>
<el-button @click="handleCancel">取消</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
export default {
name: "StudentUpdate",
data(){
return {
dormitoryList:[],
ruleForm:{
id:'',
number:'',
name:'',
gender:'男',
dormitoryId:''
},
rules:{
number:[{ required: true, message: '请输入学号', trigger: 'blur'}],
name: [{ required: true, message: '请输入姓名', trigger: 'blur'}],
gender: [{ required: true, message: '请选择性别', trigger: 'blur'}],
dormitoryId: [{ required: true, message: '请选择宿舍', trigger: 'change'}],
}
}
},
methods:{
handleSubmit(formName){
this.$refs[formName].validate((valid) => {
if(valid){
this.$http.put('/student/update',this.ruleForm).then(res => {
if(res.data.code === 0){
this.$message.success('更新成功!');
this.$router.push('/studentManager');
}
})
}
})
},
handleCancel(){
this.$router.push('/studentManager');
}
},
created(){
this.$http.get('/dormitory/availableList').then(res => {
this.dormitoryList = res.data.data;
});
this.$http.get('/student/findById/'+this.$route.query.id)
.then(res => {
this.ruleForm = res.data.data;
});
}
}
</script>
<style scoped>
.student-add{
margin-top: 60px;
margin-left: 330px;
width: 350px;
height: 500px;
}
</style>
SystemAdmin.vue
<template>
<el-container class="home-container">
<!-- 头部 -->
<el-header class="home-header">
<div class="home-title">Shrimpking宿舍管理系统</div>
<div class="home-userInfo">
<el-dropdown>
<span class="el-dropdown-link home-user">
{{ admin.name }} <i class="el-icon-arrow-down el-icon--right home-user"></i>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item @click.native="logout">退出登录</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
</el-header>
<el-container>
<!-- 左边菜单 -->
<el-aside class="home-aside" width="200px">
<el-menu
default-active="1"
class="el-menu-vertical-demo"
router>
<el-submenu index="1">
<template slot="title">
<i class="el-icon-menu"></i>
<span>宿管模块</span>
</template>
<el-menu-item index="/dormitoryAdminAdd" :class="$route.path === '/dormitoryAdminAdd'? 'is-active': ''">
<i class="el-icon-document"></i>
<span slot="title">添加宿管</span>
</el-menu-item>
<el-menu-item index="/dormitoryAdminManager" :class="$route.path === '/dormitoryAdminManager'? 'is-active': ''">
<i class="el-icon-document"></i>
<span slot="title">宿管管理</span>
</el-menu-item>
</el-submenu>
<el-submenu index="2">
<template slot="title">
<i class="el-icon-menu"></i>
<span>学生模块</span>
</template>
<el-menu-item index="/studentAdd" :class="$route.path === '/studentAdd'? 'is-active': ''">
<i class="el-icon-document"></i>
<span slot="title">添加学生</span>
</el-menu-item>
<el-menu-item index="/studentManager" :class="$route.path === '/studentManager'? 'is-active': ''">
<i class="el-icon-document"></i>
<span slot="title">学生管理</span>
</el-menu-item>
</el-submenu>
<el-submenu index="3">
<template slot="title">
<i class="el-icon-menu"></i>
<span>楼宇模块</span>
</template>
<el-menu-item index="/buildingAdd">
<i class="el-icon-document"></i>
<span slot="title">添加楼宇</span>
</el-menu-item>
<el-menu-item index="/buildingManager">
<i class="el-icon-document"></i>
<span slot="title">楼宇管理</span>
</el-menu-item>
</el-submenu>
<el-submenu index="4">
<template slot="title">
<i class="el-icon-menu"></i>
<span>宿舍模块</span>
</template>
<el-menu-item index="/dormitoryAdd">
<i class="el-icon-document"></i>
<span slot="title">添加宿舍</span>
</el-menu-item>
<el-menu-item index="/dormitoryManager">
<i class="el-icon-document"></i>
<span slot="title">宿舍管理</span>
</el-menu-item>
</el-submenu>
<el-menu-item index="/moveoutRegister">
<i class="el-icon-document"></i>
<span slot="title">学生迁出登记</span>
</el-menu-item>
<el-menu-item index="/moveoutRecord">
<i class="el-icon-document"></i>
<span slot="title">学生迁出记录</span>
</el-menu-item>
<el-menu-item index="/absentRecord">
<i class="el-icon-document"></i>
<span slot="title">学生缺寝记录</span>
</el-menu-item>
</el-menu>
</el-aside>
<!-- 中部 -->
<el-container>
<el-main>
<el-breadcrumb separator-class="el-icon-arrow-right">
<el-breadcrumb-item :to="{ path: '/systemAdmin' }">首页</el-breadcrumb-item>
<el-breadcrumb-item v-text="this.$router.currentRoute.meta.displayName"></el-breadcrumb-item>
</el-breadcrumb>
<router-view></router-view>
</el-main>
<el-footer class="home-footer">
<sapn class="footer-title">虾米大王</sapn>
</el-footer>
</el-container>
</el-container>
</el-container>
</template>
<script>
export default {
name: "SystemAdmin",
data(){
return {
admin: ''
}
},
methods:{
logout(){
this.$confirm('确定要退出吗?','提示',{
confirmButtonText:'退出',
cancelButtonText:'取消',
type:'warning'
}).then(() => {
window.localStorage.removeItem('systemAdmin');
window.localStorage.removeItem('dormitoryAdmin');
this.$message.success('退出系统成功!');
this.$router.push('/login');
}).catch(() =>{
});
}
},
created(){
//从本地存储,取得登录的信息
let admin = JSON.parse(window.localStorage.getItem('systemAdmin'));
if(admin == null){
admin = JSON.parse(window.localStorage.getItem('dormitoryAdmin'));
}
this.admin = admin;
}
}
</script>
<style scoped>
.home-container{
width: 100%;
height: 100%;
}
.home-header{
background-color: #1f1e20;
}
.home-title{
display: inline;
color: #9afff8;
font-size: 24px;
line-height: 60px;
}
.home-userInfo{
width: 120px;
height: 60px;
line-height: 60px;
float: right;
margin-right: 35px;
text-align: center;
}
.home-user{
color: #bdfaff;
}
.home-aside{
height: 91vh;
overscroll-behavior-x: none;
overscroll-behavior-y: none;
}
.el-menu{
height: 100%;
}
.home-footer{
width: 100%;
text-align: center;
border-top: 1px solid #cccccc;
}
.home-footer .footer-title{
color: #666666;
font-size: 14px;
display: inline-block;
margin-top: 28px;
}
</style>
测试
登录
首页
退出登录 ![](https://i-blog.csdnimg.cn/blog_migrate/38777f85240f7d70edb4fcee8ad23bad.png)
添加宿管![](https://i-blog.csdnimg.cn/blog_migrate/8efbc3394aa3a9341586a0d535a78a9b.png)
宿管管理![](https://i-blog.csdnimg.cn/blog_migrate/bc77876d184c0e4ef813395315ce3b51.png)
更新宿管
删除宿管