办公车辆管理系统的实现(内附项目源码)
程序员文章站
2022-03-11 21:33:53
...
办公车辆管理系统的设计实现
1. 一个简单的SpringBoot项目实现
- 目前的功能大概有这些
- 小组校内实习,分工合作完成,项目结构如下(内附sql文件,红色波浪线请自动忽略,项目没有刷新成功的问题)
2.后台主要代码展示
- 登录过滤实现,阻止未登录越权访问
@Component
@WebFilter(filterName = "LoginFilter",urlPatterns = "/*")
@Order(1) //Order(1)在定义多个Filter时,用于决定执行顺序的,数字越小,越先执行。
public class LoginFilter implements Filter {
private static final String [] ALLOWEDPATH = {"/login","/register",".ico",".js",".css",".jpg",".png","/fonts/"};
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 这样在每个Servlet执行的时候都会先进行这个
HttpServletRequest request= (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
if(needLogin(request)) {
// 需要登录则跳转到登录Controller
String userName = (String)((HttpServletRequest) request).getSession().getAttribute("username");
System.out.println(userName);
if(Optional.ofNullable(userName).map(String::length).orElse(0) <= 0){
//response.sendRedirect("login.html");
response.sendRedirect(request.getContextPath()+"/login.html");
//throw new ZcException(ExceptionEnums.NOT_LOGGED_IN);
}
filterChain.doFilter(servletRequest, servletResponse);
return;
}else{
}
//因为有可能不止这一个过滤器,所以需要将所有的过滤器执行
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
private boolean needLogin(HttpServletRequest request) {
//进行是否需要登录的判断操作
String path = request.getRequestURI().substring(request.getContextPath().length()).replaceAll("[/]+$", "");
System.out.println(path);
boolean allowedPath = false;
for (String url : ALLOWEDPATH) {
if(path.contains(url)){
allowedPath = true;
break;
}
}
return !allowedPath;
}
}
- 配置切面异常处理,枚举异常,异常结果封装(advice、enums、exception、vo)
@ControllerAdvice
public class CommonExceptionHandler {
@ExceptionHandler(ZcException.class)
public ResponseEntity<ExceptionResult> handleException(ZcException e){
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ExceptionResult(e.getExceptionEnums()));
}
}
@AllArgsConstructor
public enum ExceptionEnums {
UNIMPLEMENTED(1, "Not yet implemented."),
UNEXPECTED(2, "Unexpected error."),
REGISTER_FAILED(3, "Register failed."),
FORMAT_CORRUPTED(4, "Format corrupted."),
NOT_FOUND(5, "Not found."),
INCORRECT_STATE(6, "Incorrect state."),
RESTRICTED(7, "Operation is not allowed."),
CANCELLED(8, "Operation has been cancelled."),
NOTALLOWED(9, "not allowed."),
CONFLICT(10, "Conflicts detected."),
UNSUPPORTED(11, "Operation is not supported."),
NOT_LOGGED_IN(12, "Not logged in."),
UNDEFINED(Integer.MAX_VALUE, "Undefined error.");
@Getter private int errorCode;
@Getter private String error;
}
@AllArgsConstructor
@NoArgsConstructor
@Getter
public class ZcException extends RuntimeException {
private ExceptionEnums exceptionEnums;
}
@Data
public class ExceptionResult {
private int errorCode;
private String error;
public ExceptionResult(ExceptionEnums em){
this.errorCode = em.getErrorCode();
this.error = em.getError();
}
}
- Controller代码
@RestController
@RequestMapping(CAR_ZC)
public class EMController {
/**
* 用户登录
* @param request
* @param servletRequest
* @return
*/
@RequestMapping(value = CAR_STAFF_LOGIN ,method = POST , produces = APPLICATION_JSON_UTF8_VALUE)
public ResponseEntity<JSONObject> login(@RequestBody String request, ServletRequest servletRequest){
return ResponseEntity.status(200).body(loginService.login(servletRequest,request));
}
/................./
public static final String CAR_ZC = "/zccar";
public static final String CAR_STAFF_LOGIN = "/staff/login";
@Autowired
private LoginService loginService;
- 配置视图路径
@Configuration
public class DefaultController extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers( ViewControllerRegistry registry ) {
registry.addViewController( "/zccar" ).setViewName( "forward:/login.html" );
registry.setOrder( Ordered.HIGHEST_PRECEDENCE );
super.addViewControllers( registry );
}
}
- model实体例如用户
import lombok.Data;
@Data
public class User{
private Integer id;
private String username;
private String password;
private String name;
private String phone;
}
- dao演示,例如userDao
@Mapper
public interface UserDao {
// 用作登录查询,用户名和密码是否正确
@Select("select username,password,name from tab_user where username = #{username} and password = #{password} ")
User findNameAndPwd(@Param("username") String name, @Param("password")String pwd);
// 查询用户id
@Select("select id from tab_user where username = #{username} ")
Integer findId(@Param("username") String name);
// 注册用户增添用户数据
@Insert("insert into tab_user(username, password, name, phone) values(#{u.username}, #{u.password}, #{u.name}, #{u.phone}) ")
void insertUser(@Param("u") User user);
// 根据id查用户角色
@Select("SELECT details FROM tab_role WHERE id in ( SELECT roleId FROM tab_user_role WHERE userId = #{id}) ")
String findId_Role(@Param("id") int id);
@Insert("insert into tab_user_role(userId, roleId) values(#{id}, 3) ")
void insertUserRole(@Param("id") int id);
}
- service演示,login和application
@Service
public class LoginService {
@Autowired
private UserDao userDao;
public JSONObject login(ServletRequest servletRequest, String param){
JSONObject json = Objects.requireNonNull(JSON.parseObject(param));
String username = Objects.requireNonNull(json.getString("username"));
String password = Objects.requireNonNull(json.getString("password"));
val httpRequest = (HttpServletRequest)servletRequest;
val session = httpRequest.getSession(true);
User user = userDao.findNameAndPwd(username, password);
if(user == null){
throw new ZcException(ExceptionEnums.NOT_FOUND);
}
session.setAttribute("username",user.getUsername());
// 根据查询用户所拥有的角色
Integer id = userDao.findId(user.getUsername());
String role = userDao.findId_Role(id);
return new JSONObject().fluentPut("errorCode",0).fluentPut("error",null)
.fluentPut("data",new JSONObject().fluentPut("name",user.getName()).fluentPut("role",role));
}
}
@Service
public class RecordService {
@Autowired
private RecordDao recordDao;
public void application(String request, ServletRequest servletRequest) {
val p = Objects.requireNonNull(JSON.parseObject(request));
JSONObject json = Objects.requireNonNull(p.getJSONObject("record"));
Record record = JSONObject.toJavaObject(json, Record.class);
//此处需要调用车辆管理的查询车辆状态方法
int status = recordDao.findStatus(record.getVehicleId());
if(status == 0){
throw new ZcException(ExceptionEnums.NOTALLOWED);
}
val httpRequest = (HttpServletRequest)servletRequest;
val session = httpRequest.getSession(true);
String username = (String)session.getAttribute("username");
record.setUsername(username);
String name = recordDao.findName(username);
record.setName(name);
recordDao.uInsert(record);
}
..............
- 发送ajax填充数据
$(document).on("click","#vehicleDisAll",function(){//获取所有数据
$("tr").remove(".doDele");
$.ajax({
type:'POST',
dataType :'JSON',
contentType: "application/json",
url:'http://localhost:10010/zccar/record/asearch',
data:JSON.stringify({
status1: 2
}),
crossDomain: true,
success:function(data){
console.log(data)
if(data.errorCode == 0){
console.log(data)
if(data.data){
var str="";
var data=data.data;//因为返回的数据格式不确定,可能有问题,调试的时候可能需要修改
for(i in data){
str+="<tr class='doDele'>"+
"<td id='data'>"+data[i].id+"</td>"+
"<td id='vehicleId'>"+data[i].vehicleId+"</td>"+
"<td>"+data[i].departDate+"</td>"+
"<td>"+data[i].backDate+"</td>"+
"<td>"+data[i].level+"</td>"+
"<td>"+data[i].event+"</td>"+
"<td>"+data[i].realDepartDate+"</td>"+
"<td>"+data[i].realBackDate+"</td>"+
"<td>"+data[i].timeout+"</td>"+
"<td>"+data[i].username+"</td>"+
"<td>"+data[i].name+"</td>";
if(data[i].status1==0){
str+="<td>待审核</td>";
}
else{
str+="<td>已处理</td>"
}
str+="<td>禁止操作</td>";
str+="</tr>";
}
$("#vehicleTable").append(str);
}
}
else{
}
},
error:function(err){
}
})
})
3.环境相关配置
- pom.xml导入相关的jar包
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.Internship.ds</groupId>
<artifactId>office-service</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<java.version>1.8</java.version>
<spring.version>1.5.6.RELEASE</spring.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!--Spring Framework-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Logging Support -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring.version}</version>
<scope>compile</scope>
</dependency>
<!-- JDBC -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!-- Database: MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- Database Connection Pool -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>2.7.8</version>
</dependency>
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- HTTP -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3</version>
</dependency>
<!-- JSON Processing -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
<!-- Tool Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
<scope>provided</scope>
</dependency>
<!--前端模板引擎FreeMaker和Velocity ,Thymeleaf(官方推荐)-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
<build>
<finalName>OfficeService</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.version}</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
</plugins>
</build>
</project>
- application.yml文件配置(datasource处处理时差问题)
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/etc_management?characterEncoding=utf-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
username: root
password: root
# hikari数据源配置
hikari:
connection-test-query: SELECT 1 FROM DUAL
connection-timeout: 30000
maximum-pool-size: 20
max-lifetime: 1800000
minimum-idle: 5
server:
port: 10010
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.internship.ds.model
4. github源码链接
https://github.com/capriciousness/vehicle-manage-end.git
上一篇: 200105 CAGProject
下一篇: 可持久化数组(知识整理+板子总结)
推荐阅读