财务管理系统|基于Springboot开发实现公司财务管理系统

简介: 财务管理系统|基于Springboot开发实现公司财务管理系统

项目编号:BS-XX-169

2022年疫情期间带队开发的一套企业财务管理系统,成功交付,下面展示一下系统的相关功能说明与实现。

一,项目简介

当今社会,随着软硬件技术的急速发展,计算机在我们生活中的方方面面都发挥着越来越重要的作用。企业的管理模式也随着科技进步逐渐智能化,人性化。随着企业规模越来越庞大,部门越来越多,公司财务的管理越来越复杂,以前古老的人工财务管理已经远远无法满足现代企业的财务管理的需求,财务审核各种报销审批,工资结算时效率低下,还特别容易出错,同时很多账目都难以查询,而且纸质账目容易丢失损坏,对于账目的保存也特别麻烦。而作为财务管理工作的核心就是最简单的资金流通,如果想要在资金的流通与使用过程中更好的应用并且合理的调配是离不开一个好的财务管理系统的。

本次设计的公司财务系统不仅可以管理资金,它还能进行企业财务帐目、企业资金帐户、企业收支状况等方面的管理。各部门领导也可通过此系统提交部门年度预算,审核员工的报销,更好的把公司各个部门的资金流动贯穿起来,使资金流动更加透明,更加容易查询。通过各部门的严格审批,也同时防止了资金的去向不明等情况的发生,使公司能更快更平稳的发展。

本系统是基于SpringBoot的公司财务系统,初步分为四个部分。管理员,财务,部门领导以及普通员工。系统有着完备的用户角色权限管理功能,可以自主分配用户角色和功能,具体功能权限可以具体到菜单级别的CRUD操作。

财务:

报销管理:财务可修改报销种类供员工报销,当部门领导审核普通员工报销后,财务进行二审,财务可根据实际情况通过或驳回报销请求。报销审核通过后,可通过报销号添加报销凭证。

员工工资管理:财务可以通过员工工资管理界面查看员工工资明细,确认情况属实后可发放员工工资。

收支管理:财务可以添加每天的收入和支出详情。

预算管理:财务可以通过审批界面查看各部门领导的部门年度预算,财务可根据实际情况通过或驳回预算请求。

各部门领导:

提交部门年度预算:部门领导通过对该部门一年规划的研究,制定了年度预算的方案,提交年度的部门预算,财务审核通过后方能提交成功。

审核员工报销:员工提交的各种报销需要其部门领导审核,部门领导可根据实际情况通过或驳回该员工的报销,审核成功后交给财务二审,财务通过后即可给员工报销。

普通员工:

查看系统公告:员工登录后可查看系统公告。

提交报销:员工关于公司的各种花销都可提交报销单,等待部门领导和财务进行审核,审核成功后方可报销。

管理员:

(1)用户管理:管理所有用户,可为所有用户分配角色,设置权限,当用户离职时也可以删除用户,忘记密码时管理员也可以重置密码。

(2)权限管理:管理员可管理所有用户的权限。

(3)部门管理:管理员可以增加,修改,删除部门信息。

(4)登录日志:查看所有用户的登录日志,方便查看。

(5)系统公告:管理员可以添加和编辑系统公告,供用户查看。

二,环境介绍

语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

后台开发技术:Springboot+Mybatis

前端开发技术:Layui+Jquery+Html

三,系统展示

后台管理主菜单

工资管理:财务可以通过员工工资管理界面查看员工工资明细,情况属实后可发放员工工资

报销种类管理:添加各类报销种类信息供员工选择

报销审核:当部门领导一审通过后,由财务最终审核报销申请

添加凭证:当审核通过时,财务可为该报销添加凭证

预算审核:当部门领导提交部门年度预算时,由财务审核

收支管理:财务添加公司收入和支出的详细信息

统计报表:由财务的收入和支出详情生成收支统计对比表

部门管理:管理员可管理公司部门信息,删除部门时必须无子部门或没有用户在该部门

权限管理:管理员可以管理用户所有功能权限

角色管理:管理员可为用户添加新角色,可为每个角色分配权限

用户管理:管理所有用户,可为所有用户分配角色,设置权限,当用户离职时也可以删除用户,忘记密码时管理员也可以重置密码

四,核心代码展示

package com.test.base.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
 * 跳转
 *
 */
@Controller
@RequestMapping("/bus")
public class BusinessController {
  /**
   * 跳转到 工资条
   */
  @RequestMapping("toCustomerManager")
  public String toCustomerManager() {
    return "business/customer/customerManager";
  }
  /**
   * 跳转到 报销种类
   */
  @RequestMapping("toProviderManager")
  public String toProviderManager() {
    return "business/provider/providerManager";
  }
  /**
   * 跳转到申请报销
   */
  @RequestMapping("toGoodsManager")
  public String toGoodsManager() {
    return "business/goods/goodsManager";
  }
  /**
   * 跳转到申请审核
   */
  @RequestMapping("toVerify")
  public String toVerify() {
    return "business/verify/verify";
  }
  /**
   * 跳转到凭证
   * @return
   */
  @RequestMapping("toPinzheng")
  public String toPinzheng() {
    return "business/pinzheng/pinzheng";
  }
  @RequestMapping("toAccount")
  public String toAccount() {
    return "business/account/account";
  }
  /**
   * 跳转到报销申请
   */
  @RequestMapping("toBudgetManager")
  public String toBudgetManager() {
    return "business/budget/budgetManager";
  }
  /**
   * 跳转到审核报销
   */
  @RequestMapping("toBudgetVerify")
  public String toBudgetVerify() {
    return "business/verify/budgetVerify";
  }
  /**
   * 跳转到收入详情
   */
  @RequestMapping("toInCome")
  public String toInCome() {
    return "business/crmt/income";
  }
  /**
   * 跳转到支出详情
   */
  @RequestMapping("toPay")
  public String toPay() {
    return "business/crmt/pay";
  }
  /**
   * 跳转到统计详情
   */
  @RequestMapping("toEcharts")
  public String toEcharts() {
    return "business/echarts/shan";
  }
}
package com.test.base.controller;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.test.base.domain.Customer;
import com.test.base.service.CustomerService;
import com.test.base.vo.CustomerVo;
import com.test.sys.common.DataGridView;
import com.test.sys.common.ResultObj;
/**
 * 员工 工资条 管理
 */
@RestController
@RequestMapping("/customer")
public class CustomerController {
  @Autowired
  private CustomerService customerService;
  /**
   * 查询  工资条
   */
  @RequiresPermissions(value = {"customer:view"})
  @RequestMapping("loadAllCustomer")
  public DataGridView loadAllCustomer(CustomerVo customerVo) {
    IPage<Customer> page = new Page<>(customerVo.getPage(), customerVo.getLimit());
    QueryWrapper<Customer> queryWrapper = new QueryWrapper<>();
    queryWrapper.like(StringUtils.isNotBlank(customerVo.getCustomername()), "customername",
        customerVo.getCustomername());
    queryWrapper.like(StringUtils.isNotBlank(customerVo.getPhone()), "phone", customerVo.getPhone());
    queryWrapper.like(StringUtils.isNotBlank(customerVo.getConnectionperson()), "connectionperson",
        customerVo.getConnectionperson());
    this.customerService.page(page, queryWrapper);
    return new DataGridView(page.getTotal(), page.getRecords());
  }
  /**
   * 添加
   */
  @RequiresPermissions(value = {"customer:create"})
  @RequestMapping("addCustomer")
  public ResultObj addCustomer(CustomerVo customerVo) {
    try {
      this.customerService.save(customerVo);
      return ResultObj.ADD_SUCCESS;
    } catch (Exception e) {
      e.printStackTrace();
      return ResultObj.ADD_ERROR;
    }
  }
  /**
   * 修改
   */
  @RequiresPermissions(value = {"customer:update"})
  @RequestMapping("updateCustomer")
  public ResultObj updateCustomer(CustomerVo customerVo) {
    try {
      this.customerService.updateById(customerVo);
      return ResultObj.UPDATE_SUCCESS;
    } catch (Exception e) {
      e.printStackTrace();
      return ResultObj.UPDATE_ERROR;
    }
  }
  /**
   * 删除
   */
  @RequiresPermissions(value = {"customer:delete"})
  @RequestMapping("deleteCustomer")
  public ResultObj deleteCustomer(Integer id) {
    try {
      this.customerService.removeById(id);
      return ResultObj.DELETE_SUCCESS;
    } catch (Exception e) {
      e.printStackTrace();
      return ResultObj.DELETE_ERROR;
    }
  }
  /**
   * 批量删除
   */
  @RequiresPermissions(value = {"customer:batchdelete"})
  @RequestMapping("batchDeleteCustomer")
  public ResultObj batchDeleteCustomer(CustomerVo customerVo) {
    try {
      Collection<Serializable> idList = new ArrayList<Serializable>();
      for (Integer id : customerVo.getIds()) {
        idList.add(id);
      }
      this.customerService.removeByIds(idList);
      return ResultObj.DELETE_SUCCESS;
    } catch (Exception e) {
      e.printStackTrace();
      return ResultObj.DELETE_ERROR;
    }
  }
}
package com.test.base.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.test.base.domain.InCome;
import com.test.base.service.IncomeService;
import com.test.base.vo.*;
import com.test.sys.common.DataGridView;
import com.test.sys.common.ResultObj;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.io.Serializable;
import java.util.*;
/**
 * 收入详情
 */
@RestController
@RequestMapping("/income")
public class IncomeController {
    @Autowired
    private IncomeService incomeService;
    /**
     * 查询
     */
    @RequestMapping("loadAllIncome")
    public DataGridView loadAllIncome(IncomeVo incomeVo) {
        IPage<InCome> page = new Page<>(incomeVo.getPage(), incomeVo.getLimit());
        QueryWrapper<InCome> queryWrapper = new QueryWrapper<>();
        queryWrapper.like(StringUtils.isNotBlank(incomeVo.getTitle()), "title", incomeVo.getTitle());
        queryWrapper.like(StringUtils.isNotBlank(incomeVo.getPayway()), "payway", incomeVo.getPayway());
        this.incomeService.page(page, queryWrapper);
        List<InCome> records = page.getRecords();
        return new DataGridView(page.getTotal(), records);
    }
    /**
     * 添加
     */
    @RequestMapping("addIncome")
    public ResultObj addIncome(IncomeVo incomeVo) {
        try {
            incomeVo.setTime(new Date());
            this.incomeService.save(incomeVo);
            return ResultObj.ADD_SUCCESS;
        } catch (Exception e) {
            e.printStackTrace();
            return ResultObj.ADD_ERROR;
        }
    }
    /**
     * 修改
     */
    @RequestMapping("updateIncome")
    public ResultObj updateIncome(IncomeVo incomeVo) {
        try {
            incomeVo.setTime(new Date());//更新时间字段否则该字段为空,会报错
            this.incomeService.updateById(incomeVo);
            return ResultObj.UPDATE_SUCCESS;
        } catch (Exception e) {
            e.printStackTrace();
            return ResultObj.UPDATE_ERROR;
        }
    }
    /**
     * 删除
     */
    @RequestMapping("deleteIncome")
    public ResultObj deleteIncome(Integer id) {
        try {
            this.incomeService.removeById(id);
            return ResultObj.DELETE_SUCCESS;
        } catch (Exception e) {
            e.printStackTrace();
            return ResultObj.DELETE_ERROR;
        }
    }
    /**
     * 批量删除
     * @return
     */
    @RequestMapping("batchDeleteIncome")
    public ResultObj batchDeleteCustomer(IncomeVo incomeVo) {
        try {
            Collection<Serializable> idList = new ArrayList<Serializable>();
            for (Integer id : incomeVo.getIds()) {
                idList.add(id);
            }
            this.incomeService.removeByIds(idList);
            return ResultObj.DELETE_SUCCESS;
        } catch (Exception e) {
            e.printStackTrace();
            return ResultObj.DELETE_ERROR;
        }
    }
    /**
     * 收入统计
     * @return
     */
    @RequestMapping("/sumIncome")
    @ResponseBody
    public Double[] sumIncome(){
        List<String> list = Arrays.asList("2022-01","2022-02","2022-03","2022-04","2022-05","2022-06","2022-07","2022-08","2022-09","2022-10","2022-11","2022-12");
        Double[] inter = new Double[12];
        for (int i = 0;i < list.size(); i++){
            QueryWrapper<InCome> queryWrapper = new QueryWrapper<>();
            queryWrapper.select("IFNULL( sum(money),0) as sumIncome");
            queryWrapper.like(StringUtils.isNotBlank(list.get(i)), "time", list.get(i));
            InCome income = incomeService.getOne(queryWrapper);
            Double sum = income.getSumIncome();
            if(sum==null){
                inter[i] = 0.0;
            }else{
                inter[i] = sum;
            }
        }
        return inter;
    }
}
package com.test.sys.controller;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.test.base.domain.Provider;
import com.test.sys.common.Constast;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.test.sys.common.DataGridView;
import com.test.sys.common.ResultObj;
import com.test.sys.common.TreeNode;
import com.test.sys.domain.Dept;
import com.test.sys.service.DeptService;
import com.test.sys.vo.DeptVo;
@RestController
@RequestMapping("/dept")
public class DeptController {
  @Autowired
  private DeptService deptService;
  /**
   * 加载部门管理左边的部门树的json
   */
  @RequestMapping("loadDeptManagerLeftTreeJson")
  public DataGridView loadDeptManagerLeftTreeJson(DeptVo deptVo) {
    List<Dept> list = this.deptService.list();
    List<TreeNode> treeNodes=new ArrayList<>();
    for (Dept dept : list) {
      Boolean spread=dept.getOpen()==1?true:false;
      treeNodes.add(new TreeNode(dept.getId(), dept.getPid(), dept.getTitle(), spread));
    }
    return new DataGridView(treeNodes);
  }
  /**
   * 查询
   */
  @RequiresPermissions(value = {"dept:view"})
  @RequestMapping("loadAllDept")
  public DataGridView loadAllDept(DeptVo deptVo) {
    IPage<Dept> page=new Page<>(deptVo.getPage(), deptVo.getLimit());
    QueryWrapper<Dept> queryWrapper=new QueryWrapper<>();
    queryWrapper.like(StringUtils.isNotBlank(deptVo.getTitle()), "title", deptVo.getTitle());
    queryWrapper.like(StringUtils.isNotBlank(deptVo.getAddress()), "address", deptVo.getAddress());
    queryWrapper.like(StringUtils.isNotBlank(deptVo.getRemark()), "remark", deptVo.getRemark());
    queryWrapper.eq(deptVo.getId()!=null, "id", deptVo.getId()).or().eq(deptVo.getId()!=null,"pid", deptVo.getId());
    queryWrapper.orderByAsc("ordernum");
    this.deptService.page(page, queryWrapper);
    return new DataGridView(page.getTotal(), page.getRecords());
  }
  /**
   * 加载最大的排序码
   */
  @RequestMapping("loadDeptMaxOrderNum")
  public Map<String,Object> loadDeptMaxOrderNum(){
    Map<String, Object> map=new HashMap<String, Object>();
    QueryWrapper<Dept> queryWrapper=new QueryWrapper<>();
    queryWrapper.orderByDesc("ordernum");
    IPage<Dept> page=new Page<>(1, 1);
    List<Dept> list = this.deptService.page(page, queryWrapper).getRecords();
    if(list.size()>0) {
      map.put("value", list.get(0).getOrdernum()+1);
    }else {
      map.put("value", 1);
    }
    return map;
  }
  /**
   * 添加
   * @param deptVo
   * @return
   */
  @RequiresPermissions(value = {"dept:create"})
  @RequestMapping("addDept")
  public ResultObj addDept(DeptVo deptVo) {
    try {
      deptVo.setCreatetime(new Date());
      this.deptService.save(deptVo);
      return ResultObj.ADD_SUCCESS;
    } catch (Exception e) {
      e.printStackTrace();
      return ResultObj.ADD_ERROR;
    }
  }
  /**
   * 修改
   * @param deptVo
   * @return
   */
  @RequiresPermissions(value = {"dept:update"})
  @RequestMapping("updateDept")
  public ResultObj updateDept(DeptVo deptVo) {
    try {
      this.deptService.updateById(deptVo);
      return ResultObj.UPDATE_SUCCESS;
    } catch (Exception e) {
      e.printStackTrace();
      return ResultObj.UPDATE_ERROR;
    }
  }
  /**
   * 查询当前的ID的部门有没有子部门
   */
  @RequestMapping("checkDeptHasChildrenNode")
  public Map<String,Object> checkDeptHasChildrenNode(DeptVo deptVo){
    Map<String, Object> map=new HashMap<String, Object>();
    QueryWrapper<Dept> queryWrapper=new QueryWrapper<>();
    queryWrapper.eq("pid", deptVo.getId());
    List<Dept> list = this.deptService.list(queryWrapper);
    if(list.size()>0) {
      map.put("value", true);
    }else {
      map.put("value", false);
    }
    return map;
  }
  /**
   * 删除
   * @param deptVo
   * @return
   */
  @RequiresPermissions(value = {"dept:delete"})
  @RequestMapping("deleteDept")
  public ResultObj deleteDept(DeptVo deptVo) {
    try {
      this.deptService.removeById(deptVo.getId());
      return ResultObj.DELETE_SUCCESS;
    } catch (Exception e) {
      e.printStackTrace();
      return ResultObj.DELETE_ERROR;
    }
  }
  /**
   * 加载所有可用的部门
   */
  @RequestMapping("loadAllDeptForSelect")
  public DataGridView loadAllDeptForSelect() {
    QueryWrapper<Dept> queryWrapper=new QueryWrapper<>();
    queryWrapper.eq("available", Constast.AVAILABLE_TRUE);
    List<Dept> list = this.deptService.list(queryWrapper);
    return new DataGridView(list);
  }
}

五,项目总结

财务管理系统正是财务信息化的系统,它不仅对企业的财务计划,财务控制方面有一定作用,在企业的财务运用、财务监督方面也起了很大作用,每个单位里都少不了一个这样的信息化管理系统。一个企业发展的成功与否,同企业内部财务管理的好坏有关。现今,在企业的现实运作中,资金运转贯穿在企业的整个生产经营过程,所以在企业的各项工作中财务管理同样贯穿其中。通过加强企业内部核算,节支降耗才可能实现。财务管理系统是企业信息管理的有效延伸,能更好的把个性化、规范化服务有机的融入到财务管理中去,能推动企业发展。财务管理系统大大方便了企业对财务整理和评估,提高了公司的效率。鉴于体系结构的各种优势,所以此次对企业财务管理系统的开发是十分合适并且有帮助的。同时,该系统的设计思想以经济学的观点作为需求指导,将经济知识和软件开发技术进行有机的结合,它使用方便,方便管理,在数据整合和账目管理方面尤为出色,减轻了财务系统人员的工作负担,也可以在一定程度上帮助公司节省人手,加快工作效率,减少开支。

相关文章
|
15天前
|
XML Java 数据库连接
SpringBoot集成Flowable:打造强大的工作流管理系统
在企业级应用开发中,工作流管理是一个核心组件,它能够帮助我们定义、执行和管理业务流程。Flowable是一个开源的工作流和业务流程管理(BPM)平台,它提供了强大的工作流引擎和建模工具。结合SpringBoot,我们可以快速构建一个高效、灵活的工作流管理系统。本文将探讨如何将Flowable集成到SpringBoot应用中,并展示其强大的功能。
58 1
|
23天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
1月前
|
存储 安全 Java
打造智能合同管理系统:SpringBoot与电子签章的完美融合
【10月更文挑战第7天】 在数字化转型的浪潮中,电子合同管理系统因其高效、环保和安全的特点,正逐渐成为企业合同管理的新宠。本文将分享如何利用SpringBoot框架实现一个集电子文件签字与合同管理于一体的智能系统,探索技术如何助力合同管理的现代化。
62 4
|
1月前
|
前端开发 Java Apache
SpringBoot实现电子文件签字+合同系统!
【10月更文挑战第15天】 在现代企业运营中,合同管理和电子文件签字成为了日常活动中不可或缺的一部分。随着技术的发展,电子合同系统因其高效性、安全性和环保性,逐渐取代了传统的纸质合同。本文将详细介绍如何使用SpringBoot框架实现一个电子文件签字和合同管理系统。
60 1
|
1月前
|
文字识别 安全 Java
SpringBoot3.x和OCR构建车牌识别系统
本文介绍了一个基于Java SpringBoot3.x框架的车牌识别系统,详细阐述了系统的设计目标、需求分析及其实现过程。利用Tesseract OCR库和OpenCV库,实现了车牌图片的识别与处理,确保系统的高准确性和稳定性。文中还提供了具体的代码示例,展示了如何构建和优化车牌识别服务,以及如何处理特殊和异常车牌。通过实际应用案例,帮助读者理解和应用这一解决方案。
|
2月前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
基于Java+Springboot+Vue开发的大学竞赛报名管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的大学竞赛报名管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
223 3
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
|
19天前
|
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 的前后端分离的后台管理系统
32 0
|
1月前
|
机器学习/深度学习 移动开发 自然语言处理
基于人工智能技术的智能导诊系统源码,SpringBoot作为后端服务的框架,提供快速开发,自动配置和生产级特性
当身体不适却不知该挂哪个科室时,智能导诊系统应运而生。患者只需选择不适部位和症状,系统即可迅速推荐正确科室,避免排错队浪费时间。该系统基于SpringBoot、Redis、MyBatis Plus等技术架构,支持多渠道接入,具备自然语言理解和多输入方式,确保高效精准的导诊体验。无论是线上医疗平台还是大型医院,智能导诊系统均能有效优化就诊流程。
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
154 1
|
23天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
97 62

热门文章

最新文章