基于Springboot实现汽车4S店销售管理系统

简介: 本项目基于Springboot框架开发实现,主要针对汽车4S店的销售信息进行管理,名为4S管家,主要包含管理员用户和员工用户,主要实现的功能有汽车销售信息管理、配件销售订单管理、售后服务订单管理、库存管理、客户管理、员工管理、系统用户管理、日志管理、系统说明等。特色功能包含图形报表统计功能,数据导入导出功能等。...

项目编号:BS-XX-126

一,项目简介

   本项目基于Springboot框架开发实现,主要针对汽车4S店的销售信息进行管理,名为4S管家,主要包含管理员用户和员工用户,主要实现的功能有汽车销售信息管理、配件销售订单管理、售后服务订单管理、库存管理、客户管理、员工管理、系统用户管理、日志管理、系统说明等。特色功能包含图形报表统计功能,数据导入导出功能等。

二,环境介绍

语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

后台开发技术:Springboot+Mybatis

前端开发技术:Bootstrap+Jquery+Ajax

image.gif编辑

三,系统展示

系统登陆

image.gif编辑

仪表盘

image.gif编辑

汽车订单管理

image.gif编辑

配件订单管理

image.gif编辑

售后订单管理

image.gif编辑

汽车库存管理

image.gif编辑

配件库存管理

image.gif编辑

客户管理

image.gif编辑

员工管理

image.gif编辑

员工管理

image.gif编辑

日志管理

image.gif编辑

Druid监控

image.gif编辑

四,核心代码展示

package com.gk.carshopsys.controller;
import com.github.pagehelper.PageInfo;
import com.gk.carshopsys.annotation.Log;
import com.gk.carshopsys.pojo.Admin;
import com.gk.carshopsys.service.AdminService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.support.RedirectAttributesModelMap;
import javax.servlet.http.HttpSession;
import java.lang.reflect.Array;
import java.sql.Date;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Controller
public class AdminController {
    @Autowired
    private AdminService adminService;
    //初始页面跳转登录页
    @RequestMapping("/")
    public String tologin(){
      return "login";
    };
    //跳转登录页
    @RequestMapping("/login")
    public String login(){
        return "login";
    };
    //主页跳转
    @RequestMapping("/index")
    public String toindex(){return "index";}
    //登录页响应页面跳转
    @PostMapping ("/login.action")
    public String adminlogin(@RequestParam("user") String user,
                             @RequestParam("username") String username,
                             @RequestParam("password") String password, Model model, HttpSession session){
        Admin admin=adminService.loginAdmin(username,password);
        if(admin!=null){
            session.setAttribute("loginUser",username);
            return "redirect:/index";
        }else{
            model.addAttribute("msg", "密码或者账号有误,请重新输入");
            return "login";
        }
    } ;
    //退出登录
    @RequestMapping("/logout")
    public String logout(HttpSession session){
        session.invalidate();
        return "redirect:/login";
    };
    //管理员用户列表跳转
    @RequestMapping("/adminlist")
    public  String toadminlist(){
        return "adminlist";
    };
    //返回管理员用户列表
    @Log("查询管理员")
    @RequestMapping("/adminlist/query")
    @ResponseBody
    public List<Admin> findAdmin(@RequestBody Map<String,String> param){
        String username = param.get("username");
        String id_s = param.get("id");
        if (id_s!=null && !id_s.equals("")){
            try{
                Integer id = Integer.parseInt(id_s);
                return adminService.findAdminByIdAndUsername(id,username);
            }catch (ClassCastException e){
                return adminService.findAdminByIdAndUsername(null,username);
            }
        }else {
            return adminService.findAdminByIdAndUsername(null,username);
        }
    };
    //管理员用户添加
    //RedirectAttributesModelMap类防止重定向后model丢失
    @Log("添加管理员")
    @PostMapping("/adminlist/add")
    public  String adminlistadd(@RequestParam("add_adminname") String username,
                                @RequestParam("add_password") String password,RedirectAttributesModelMap model){
        int result = adminService.addAdmin(username,password);
        if(result==-1){
            model.addFlashAttribute("addmsg","插入失败,用户名已存在,请重新插入");
            return "redirect:/adminlist";
        }
        if(result==1){
            model.addFlashAttribute("addmsg","插入成功");
        }else{
            model.addFlashAttribute("addmsg","插入未知错误");
        }
            return "redirect:/adminlist";
        };
    // 管理员用户更新
    @Log("修改管理员")
    @PostMapping("/adminlist/upadte")
    public String adminlistupadte(@RequestParam("update_id") Integer id,
                                  @RequestParam("update_adminname") String username,
                                  @RequestParam("update_password") String password,RedirectAttributesModelMap model){
        int result=adminService.updateAdmin(id,username,password);
        if(result==-1){
            model.addFlashAttribute("updatemsg","修改失败,用户名已存在,请重新修改");
            return "redirect:/adminlist";
        }
        if (result==1){
            model.addFlashAttribute("updatemsg","修改成功");
        }else {
            model.addFlashAttribute("updatemsg","修改失败,未知错误");
        }
        return "redirect:/adminlist";
    };
    //管理员用户批量删除
    @Log("删除管理员")
    @ResponseBody
    @RequestMapping("/adminlist/del")
    public Map<String,Integer> adminlistdel(@RequestBody List<Integer> ids){
        int result = adminService.delAdmin(ids);
        Map<String,Integer> map = new HashMap<>();
        map.put("code",result);
        return map;
    }
}

image.gif

package com.gk.carshopsys.controller;
import com.alibaba.excel.EasyExcel;
import com.gk.carshopsys.annotation.Log;
import com.gk.carshopsys.pojo.Car;
import com.gk.carshopsys.pojo.Cust;
import com.gk.carshopsys.service.CarService;
import com.gk.carshopsys.utils.CarDataListener;
import com.gk.carshopsys.utils.CustDataListener;
import com.gk.carshopsys.utils.ExcelUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.support.RedirectAttributesModelMap;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Controller
public class CarController {
    @Autowired
    private CarService carService;
    //Excel参数
    private HashMap<String,String> param;
    //excel传参
    @PostMapping("/carlist/excelparamset")
    @ResponseBody
    public void excelset(@RequestBody HashMap<String,String> params){
        param= params;
    }
    //excel下载
    @Log("导出汽车库存")
    @GetMapping("/carlist/excelexport")
    @ResponseBody
    public String excelexport(HttpServletResponse response) throws Exception {
        //导出的参数
        String id_s = param.get("id");
        String carname = param.get("carname");
        String brand = param.get("brand");
        String color = param.get("color");
        String type = param.get("type");
        String configuration = param.get("configuration");
        String low_price = param.get("low_price");//需要转型
        String hight_price = param.get("hight_price");//需要转型
        Car car = new Car();
        if(id_s!=null && !id_s.equals("")){
            try {
                Long id = Long.valueOf(id_s);
                car.setId(id);
            }catch (ClassCastException e){
            }finally {
                car.setBrand(brand);
                car.setCarname(carname);
                car.setColor(color);
                car.setType(type);
                car.setConfiguration(configuration);
            }
        }
        car.setBrand(brand);
        car.setCarname(carname);
        car.setColor(color);
        car.setType(type);
        car.setConfiguration(configuration);
        ExcelUtils.export2Web(response, "汽车库存表", "汽车库存信息",Car.class,carService.findCar(car,low_price,hight_price));
        return "success";
        }
    // easyexcel上传文件
    @Log("导入汽车库存")
    @PostMapping("/carlist/excelimport")
    public String upload(MultipartFile file, RedirectAttributesModelMap model) throws IOException {
        EasyExcel.read(file.getInputStream(), Car.class, new CarDataListener(carService)).sheet().doRead();
        return "redirect:/carlist";
    }
    //批量删除车型
    @Log("删除汽车库存")
    @ResponseBody
    @RequestMapping("/carlist/del")
    public Map<String,Integer> carlistdel(@RequestBody List<Integer> ids){
        int result = carService.delCar(ids);
        Map<String,Integer> map = new HashMap<>();
        map.put("code",result);
        return map;
    }
    @Log("更新汽车库存")
    @RequestMapping("/carlist/update")
    public String carUpdate(@RequestParam("update_id") Long id,
                            @RequestParam("update_brand") String brand,
                            @RequestParam("update_carname") String carname,
                            @RequestParam("update_price") Long price,
                            @RequestParam("update_color") String color,
                            @RequestParam("update_type") String type,
                            @RequestParam("update_quantity") Long quantity,
                            @RequestParam("update_configuration") String configuration,
                            RedirectAttributesModelMap model){
        Car car = new Car(id,brand,carname,price,color,type,quantity,configuration);
        int result =carService.updateCar(car);
        if(result==1){
            model.addFlashAttribute("addmsg","修改成功");
        }else {
            model.addFlashAttribute("addmsg","修改失败");
        }
        return "redirect:/carlist";
    }
    //查询车辆库存
    @Log("查询汽车库存")
    @RequestMapping("/carlist/query")
    @ResponseBody
    public List<Car> queryCar(@RequestBody HashMap<String,String> params){
        String id_s = params.get("id");
        String carname = params.get("carname");
        String brand = params.get("brand");
        String color = params.get("color");
        String type = params.get("type");
        String configuration = params.get("configuration");
        String low_price = params.get("low_price");//需要转型
        String hight_price = params.get("hight_price");//需要转型
        Car car = new Car();
        if(id_s!=null && !id_s.equals("")){
            try {
                Long id = Long.valueOf(id_s);
                car.setId(id);
            }catch (ClassCastException e){
            }finally {
                car.setBrand(brand);
                car.setCarname(carname);
                car.setColor(color);
                car.setType(type);
                car.setConfiguration(configuration);
            }
        }
        car.setBrand(brand);
        car.setCarname(carname);
        car.setColor(color);
        car.setType(type);
        car.setConfiguration(configuration);
        return carService.findCar(car,low_price,hight_price);
    }
    @Log("添加汽车库存")
    @RequestMapping("/carlist/add")
    public String carAdd(@RequestParam("add_brand") String brand,
                         @RequestParam("add_carname") String carname,
                         @RequestParam("add_price") Long price,
                         @RequestParam("add_color") String color,
                         @RequestParam("add_type") String type,
                         @RequestParam("add_quantity") Long quantity,
                         @RequestParam("add_configuration") String configuration,
                         RedirectAttributesModelMap model){
        Car car = new Car(brand,carname,price,color,type,quantity,configuration);
        int result =carService.addCar(car);
        if(result==1){
            model.addFlashAttribute("addmsg","添加车型成功");
        }else {
            model.addFlashAttribute("addmsg","添加车型失败,未知错误");
        }
        return "redirect:/carlist";
    }
    //跳转车辆库存管理页面
    @RequestMapping("/carlist")
    public String tocarlist(){
        return "carlist";
    }
}

image.gif

package com.gk.carshopsys.controller;
import com.alibaba.excel.EasyExcel;
import com.gk.carshopsys.annotation.Log;
import com.gk.carshopsys.pojo.Car;
import com.gk.carshopsys.pojo.CarOrder;
import com.gk.carshopsys.pojo.CarOrderImport;
import com.gk.carshopsys.pojo.Cust;
import com.gk.carshopsys.service.CarOrderService;
import com.gk.carshopsys.utils.CarDataListener;
import com.gk.carshopsys.utils.CarOrderDataListener;
import com.gk.carshopsys.utils.ExcelUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.support.RedirectAttributesModelMap;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Controller
public class CarOrderController {
    @Autowired
    CarOrderService carOrderService;
    //Excel参数
    private HashMap<String,String> param;
    //excel传参
    @PostMapping("/carorderlist/excelparamset")
    @ResponseBody
    public void excelset(@RequestBody HashMap<String,String> params){
        param= params;
    }
    //excel下载
    @Log("导出汽车订单")
    @GetMapping("/carorderlist/excelexport")
    @ResponseBody
    public String excelexport(HttpServletResponse response) throws Exception {
            ExcelUtils.export2Web(response, "汽车订单表", "订单信息",CarOrder.class,carOrderService.findCarOrder(param));
            return "success";
    }
    // easyexcel上传文件
    @Log("导入汽车订单")
    @PostMapping("/carorderlist/excelimport")
    public String upload(MultipartFile file, RedirectAttributesModelMap model) throws IOException {
        EasyExcel.read(file.getInputStream(), CarOrderImport.class, new CarOrderDataListener(carOrderService)).sheet().doRead();
        return "redirect:/carorderlist";
    }
    @RequestMapping("/carorderlist")
    public String toCarOrder(){
        return "carorderlist";
    }
    @Log("查询汽车订单")
    @RequestMapping("/carorderlist/query")
    @ResponseBody
    public List<CarOrder> quryCarOrderList(@RequestBody HashMap<String,String> params){
        return carOrderService.findCarOrder(params);
    }
    @Log("添加汽车订单")
    @RequestMapping("/carorderlist/add")
    public String addCarOrder(@RequestParam("add_carid") Long carid,
                              @RequestParam("add_custid") Long custid,
                              @RequestParam("add_empnum") String empnum,
                              @RequestParam("add_quantity") Integer quantity,
                              @RequestParam("add_state") String state,
                              @RequestParam("add_remarks") String remarks, RedirectAttributesModelMap model){
        int result = carOrderService.addCarOrder(carid,custid,empnum,quantity,state,remarks);
        if (result==-1){
            model.addFlashAttribute("addmsg","添加失败,车辆不存在");
            return "redirect:/carorderlist";
        }
        if (result==-2){
            model.addFlashAttribute("addmsg","添加失败,客户不存在");
            return "redirect:/carorderlist";
        }
        if (result==-3){
            model.addFlashAttribute("addmsg","添加失败,员工不存在");
            return "redirect:/carorderlist";
        }
        if (result==-4){
            model.addFlashAttribute("addmsg","添加失败,库存不足");
            return "redirect:/carorderlist";
        }
        if (result==1){
            model.addFlashAttribute("addmsg","添加订单成功");
            return "redirect:/carorderlist";
        }else{
            model.addFlashAttribute("addmsg","添加订单失败,未知错误");
            return "redirect:/carorderlist";
        }
    }
    @Log("更新汽车订单")
    @RequestMapping("/carorderlist/update")
    public String updateCarOrder(@RequestParam("update_id") Long id,
                                 @RequestParam("update_state") String state,
                                 @RequestParam("update_remarks") String remarks,
                                 @RequestParam("update_quantity") Long quantity,
                                 @RequestParam("update_carid") Long carid,RedirectAttributesModelMap model){
        CarOrder carOrder = new CarOrder();
        carOrder.setId(id);
        carOrder.setRemarks(remarks);
        carOrder.setCarid(carid);
        if(state.equals("取消订单")){
            carOrder.setState("已取消");
        }else{
            carOrder.setState(state);
        }
        int result = carOrderService.updateCarOrderById(carOrder,quantity);
        if (result==1){
            model.addFlashAttribute("addmsg","修改订单成功");
            return "redirect:/carorderlist";
        }else{
            model.addFlashAttribute("addmsg","修改订单失败,未知错误");
            return "redirect:/carorderlist";
        }
    }
    //批量删除订单
    //订单批量删除
    @Log("删除汽车订单")
    @ResponseBody
    @RequestMapping("/carorderlist/del")
    public Map<String,Integer> carorderlistdel(@RequestBody List<Integer> ids){
        int result = carOrderService.delCarOrder(ids);
        Map<String,Integer> map = new HashMap<>();
        map.put("code",result);
        return map;
    }
}

image.gif

package com.gk.carshopsys.controller;
import com.alibaba.excel.EasyExcel;
import com.gk.carshopsys.annotation.Log;
import com.gk.carshopsys.pojo.Cust;
import com.gk.carshopsys.pojo.Emp;
import com.gk.carshopsys.service.CustService;
import com.gk.carshopsys.utils.CustDataListener;
import com.gk.carshopsys.utils.EmpDataListener;
import com.gk.carshopsys.utils.ExcelUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.support.RedirectAttributesModelMap;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Controller
public class CustController {
    @Autowired
    CustService custService;
    //Excel参数
    private HashMap<String,String> param;
    //excel传参
    @PostMapping("/custlist/excelparamset")
    @ResponseBody
    public void excelset(@RequestBody HashMap<String,String> params){
        param= params;
    }
    //excel下载
    @Log("导出客户")
    @GetMapping("/custlist/excelexport")
    @ResponseBody
    public String excelexport(HttpServletResponse response) throws Exception {
        //导出的参数
        String custid_s = param.get("custid");
        String custname = param.get("custname");
        String job = param.get("job");
        String address = param.get("address");
        Cust cust = new Cust();
        if (custid_s!=null && !custid_s.equals("")){
            try{
                Long custid=Long.parseLong(custid_s);
                cust.setid(custid);
            }catch (ClassCastException e){
            }finally {
                cust.setCust_name(custname);
                cust.setJob(job);
                cust.setAddress(address);
                ExcelUtils.export2Web(response, "客户表", "客户信息",Cust.class,custService.findCust(cust));
                return "success";
            }
        }else {
            cust.setCust_name(custname);
            cust.setJob(job);
            cust.setAddress(address);
            ExcelUtils.export2Web(response, "客户表", "客户信息",Cust.class,custService.findCust(cust));
            return "success";
        }
    }
    // easyexcel上传文件
    @Log("导入客户")
    @PostMapping("/custlist/excelimport")
    public String upload(MultipartFile file, RedirectAttributesModelMap model) throws IOException {
        EasyExcel.read(file.getInputStream(), Cust.class, new CustDataListener(custService)).sheet().doRead();
        return "redirect:/custlist";
    }
    //跳转客户管理页面
    @RequestMapping("/custlist")
    public String tocustlist(){
        return "custlist";
    }
    //返回查询客户列表
    @Log("查询客户")
    @RequestMapping("/custlist/query")
    @ResponseBody
    public List<Cust> findcust(@RequestBody HashMap<String,String> params){
        //接收的数据
        String custid_s = params.get("custid");
        String custname = params.get("custname");
        String job = params.get("job");
        String address = params.get("address");
        Cust cust = new Cust();
        if (custid_s!=null && !custid_s.equals("")){
            try{
                Long custid=Long.parseLong(custid_s);
                cust.setid(custid);
            }catch (ClassCastException e){
            }finally {
                cust.setCust_name(custname);
                cust.setJob(job);
                cust.setAddress(address);
                return custService.findCust(cust);
            }
        }else {
            cust.setCust_name(custname);
            cust.setJob(job);
            cust.setAddress(address);
            return custService.findCust(cust);
        }
    }
//    添加客户
    @Log("添加客户")
    @PostMapping("/custlist/add")
    public  String addcust(@RequestParam("add_custname") String name,
                           @RequestParam("add_sex") String sex,
                           @RequestParam("add_job") String job,
                           @RequestParam("add_telphone") String telphone,
                           @RequestParam("add_address") String address,
                           RedirectAttributesModelMap model){
        Cust add_cust =new Cust(name,sex,job,telphone,address);
        int result = custService.addCust(add_cust);
        if(result==1){
            model.addFlashAttribute("addmsg","添加客户成功");
            return "redirect:/custlist";
        }else {
            model.addFlashAttribute("addmsg","添加客户失败,未知错误");
            return "redirect:/custlist";
        }
   }
   //更新修改客户
    @Log("更新客户")
    @PostMapping("/custlist/update")
    public String updatecust(@RequestParam("update_custid") Long id,
                             @RequestParam("update_custname") String name,
                             @RequestParam("update_sex") String sex,
                             @RequestParam("update_job") String job,
                             @RequestParam("update_telphone") String telphone,
                             @RequestParam("update_address") String address,
                             RedirectAttributesModelMap model){
        Cust update_cust =new Cust(id,name,sex,job,telphone,address);
        int result = custService.updateCust(update_cust);
        if(result==1){
            model.addFlashAttribute("updatemsg","修改客户成功");
            return "redirect:/custlist";
        }else {
            model.addFlashAttribute("updatemsg","修改客户失败,未知错误");
            return "redirect:/custlist";
        }
    }
    //批量删除客户
    //客户批量删除
    @Log("删除客户")
    @ResponseBody
    @RequestMapping("/custlist/del")
    public Map<String,Integer> custlistdel(@RequestBody List<Integer> ids){
        int result = custService.delCust(ids);
        Map<String,Integer> map = new HashMap<>();
        map.put("code",result);
        return map;
    }
}

image.gif

五,项目总结

     项目整体设计简洁大方,功能实用性强,前后端交互比较符合人性化需求,比较适合用做毕业设计和课程设计使用。

 

相关文章
|
1月前
|
JavaScript NoSQL Java
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
39 0
|
5月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的在线学习过程管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的在线学习过程管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的在线学习过程管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
|
5月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的大学生勤工助学管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的大学生勤工助学管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
|
5月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue的志愿服务管理系统设计和实现(源码+LW+部署讲解)
基于SpringBoot+Vue的志愿服务管理系统设计和实现(源码+LW+部署讲解)
81 6
|
5月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue的医疗废弃物收运管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue的医疗废弃物收运管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
71 6
|
5月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的酒店客房管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的酒店客房管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
|
5月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的公园管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的公园管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
|
5月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue的街道办管理系统的详细设计和实现(源码+lw+部署文档+讲解等
基于SpringBoot+Vue的街道办管理系统的详细设计和实现(源码+lw+部署文档+讲解等
68 0
|
5月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的中医学习服务管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的中医学习服务管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
|
5月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的高校教师工作量管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的高校教师工作量管理系统的详细设计和实现(源码+lw+部署文档+讲解等)

热门文章

最新文章