欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

办公车辆管理系统的实现(内附项目源码)

程序员文章站 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