一二三应用开发平台应用开发示例(3)——生成库表及后端代码

生成库表

前端页面的配置,也就是视图功能,我们先放一放,来看看生成库表和后端代码。
关闭实体配置界面,回到实体列表,勾选“文件夹”实体,点击“生成库表”,并确定。
image.png
系统提示成功后,使用数据库客户端图形化工具查看,如下:
image.png
库表创建完成了,库表的名称和注释、字段的名称、编码、类型、注释都是完整的,来源于数据模型的配置。
注意:配置中的是否必填,平台在生成库表环节特意去除了数据库层面的不能为空的处理,改由应用层的前端与后端去做逻辑验证。

生成代码

在实体列表页面,勾选“文件夹”实体,点击“生成代码”按钮,提示成功后,到idea的项目根目录下,找到output目录,生成的代码会按照前面的配置,结合代码模板,生成各层的代码,如下图所示:
image.png
注意上图中,包路径出现了两次edoc,实际上含义不同,第一个edoc是应用的编码,第二个edoc是模块的编码,如果要避免这种情况,也简单,模块可以命名为main或core等其他不重复的名字,这里我就不调整了。

复制后端代码

复制输出的代码,到我们新建的模块对应包下,如下图所示:
image.png

查看后端代码

以下完全是基于配置和代码模板一次性生成的各层代码,无任何手工调整的地方,包括注释,均为自动生成。

实体类

package tech.abc.edoc.edoc.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import tech.abc.platform.common.base.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.time.LocalDateTime;

/**
 * 文件夹 实体类
 *
 * @author wqliu
 * @date 2024-01-29
 *
 */
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("ed_folder")
public class Folder extends BaseEntity {

    /**
    * 上级
    */
    @TableField("parent_id")
    private String parentId;

    /**
    * 名称
    */
    @TableField("name")
    private String name;



    /********非库表存储属性*****/
}

mapper类及xml

package tech.abc.edoc.edoc.mapper;

import tech.abc.edoc.edoc.entity.Folder;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;


/**
 * 文件夹 Mapper 接口
 *
 * @author wqliu
 * @date 2024-01-29
 */
public interface FolderMapper extends BaseMapper<Folder> {

}
<?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="tech.abc.edoc.edoc.mapper.FolderMapper">

</mapper>

保留了MybatisPlus(或者说Mybatis)的xml和mapper接口类,如需要使用sql语句扩展功能,如多表关联查询,在当前文件上追加即可,非常方便。

服务接口

package tech.abc.edoc.edoc.service;

import tech.abc.edoc.edoc.entity.Folder;
import tech.abc.platform.common.base.BaseService;
import java.util.List;
import java.util.Map;

/**
 * 文件夹 服务接口类
 *
 * @author wqliu
 * @date 2024-01-29
 */
public interface FolderService extends BaseService<Folder> {

   /**
   * 获取标识与名称的Map集合
   *
   * @param idList 标识列表
   * @return 集合
   */
   Map<String,String> getNameMap(List<String> idList);
}


公用操作如增删改查,都放到了父接口中BaseService,并内置了一个获取标识与名称的Map集合,用于处理列表页面转换显示数据时产生的经典1+N问题。

服务实现类

package tech.abc.edoc.edoc.service.impl;

import tech.abc.edoc.edoc.entity.Folder;
import tech.abc.edoc.edoc.mapper.FolderMapper;
import tech.abc.edoc.edoc.service.FolderService;
import tech.abc.platform.common.base.BaseServiceImpl;
import org.springframework.stereotype.Service;
import tech.abc.platform.common.exception.CommonException;
import tech.abc.platform.common.exception.CustomException;
import java.math.BigDecimal;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
import java.util.Map;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.HashMap;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
/**
* 文件夹 服务实现类
*
* @author wqliu
* @date 2024-01-29
*/
@Service
@Slf4j
public class FolderServiceImpl extends BaseServiceImpl<FolderMapper, Folder> implements FolderService {

    @Override
    public Folder init() {
        Folder entity=new Folder();
        // 预先分配标识
        entity.setId(IdWorker.getIdStr());
        //默认值处理
        return entity;
    }

    @Override
    public void beforeAdd(Folder entity) {
        //唯一性验证
        //验证 名称 同节点下唯一
        if (StringUtils.isNotBlank(entity.getName())) {
            long countName = this.lambdaQuery().eq(Folder::getName, entity.getName())
            .eq(Folder::getParentId, entity.getParentId()).count();
            if (countName > 0) {
                throw new CustomException(CommonException.PROPERTY_EXIST_IN_SAME_NODE,"【名称】");
            }
        }

    }

    @Override
    public void beforeModify(Folder entity) {
        //唯一性验证
        //验证 名称 同节点下唯一
        if (StringUtils.isNotBlank(entity.getName())) {
            long countName = this.lambdaQuery().eq(Folder::getName, entity.getName())
                .eq(Folder::getParentId, entity.getParentId())
                .ne(Folder::getId, entity.getId()).count();
            if (countName > 0) {
                throw new CustomException(CommonException.PROPERTY_EXIST_IN_SAME_NODE,"【名称】");
            }
        }
    }

    @Override
    public Map<String, String> getNameMap(List<String> idList) {
        Map<String, String> result = new HashMap<>(5);
        if (CollectionUtils.isNotEmpty(idList)) {
            List<Folder> list = this.lambdaQuery().in(Folder::getId, idList).list();
            if (CollectionUtils.isNotEmpty(list)) {
                list.stream().forEach(x -> {
                    result.put(x.getId(), x.getName());
                });
            }
        }
        return result;
    }

    @Override
    protected void copyPropertyHandle(Folder entity, String... value) {
        // 主属性后附加“副本”用于区分
        entity.setName (entity.getName() + " 副本");
    }

}


模型属性配置时的唯一性配置,平台处理时,会自动在新增和修改操作前生成验证代码;默认值配置,会在初始化方法init中体现。

控制器

package tech.abc.edoc.edoc.controller;


import org.springframework.web.bind.annotation.RestController;
import tech.abc.platform.common.base.BaseController;
import org.springframework.web.bind.annotation.RequestMapping;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import tech.abc.platform.common.annotation.SystemLog;
import tech.abc.platform.common.constant.TreeDefaultConstant;
import tech.abc.platform.common.query.QueryGenerator;
import tech.abc.platform.common.utils.ResultUtil;
import tech.abc.platform.common.vo.PageInfo;
import tech.abc.platform.common.vo.Result;
import tech.abc.platform.common.vo.SortInfo;
import tech.abc.edoc.edoc.entity.Folder;
import tech.abc.edoc.edoc.service.FolderService;
import tech.abc.edoc.edoc.vo.FolderVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import tech.abc.platform.common.utils.TreeUtil;
import tech.abc.platform.common.vo.TreeVO;

/**
* 文件夹 前端控制器类
*
* @author wqliu
* @date 2024-01-29
*/
@RestController
@RequestMapping("/edoc/folder")
@Slf4j
public class FolderController extends BaseController {
    @Autowired
    private FolderService folderService;


    //region 基本操作
    /**
    * 初始化
    */
    @GetMapping("/init")
    public ResponseEntity<Result> init() {
        Folder entity=folderService.init();
        FolderVO vo = convert2VO(entity);
        return ResultUtil.success(vo);
    }

    /**
    * 新增
    */
    @PostMapping("/")
    @SystemLog(value = "文件夹-新增")
    @PreAuthorize("hasPermission(null,'edoc:folder:add')")
    public ResponseEntity<Result> add(@Validated @RequestBody FolderVO vo) {
        Folder entity=convert2Entity(vo);
        folderService.add(entity);
        FolderVO newVO = convert2VO(entity);
        return ResultUtil.success(newVO);
    }

    /**
    * 修改
    */
    @PutMapping("/")
    @SystemLog(value = "文件夹-修改")
    @PreAuthorize("hasPermission(null,'edoc:folder:modify')")
    public ResponseEntity<Result> modify(@Validated @RequestBody FolderVO vo) {
        Folder entity=convert2Entity(vo);
        folderService.modify(entity);
        FolderVO newVO = convert2VO(entity);
        return ResultUtil.success(newVO);
    }

    /**
    * 删除数据,单条数据标识,或多条数据标识用逗号间隔拼成的字符串
    */
    @DeleteMapping("/{id}")
    @SystemLog(value = "文件夹-删除")
    @PreAuthorize("hasPermission(null,'edoc:folder:remove')")
    public ResponseEntity<Result> remove(@PathVariable("id") String id) {
        folderService.remove(id);
        return ResultUtil.success();
    }

    /**
    * 分页
    */
    @GetMapping("/page")
    @SystemLog(value = "文件夹-分页")
    @PreAuthorize("hasPermission(null,'edoc:folder:query')")
    public ResponseEntity<Result> page(FolderVO queryVO, PageInfo pageInfo, SortInfo sortInfo) {
        //构造分页对象
        IPage<Folder> page = new Page<Folder>(pageInfo.getPageNum(), pageInfo.getPageSize());

        // 当勾选查询所有复选框时,查询所有数据
        if (queryVO.getIgnoreParent() != null && queryVO.getIgnoreParent()) {
            queryVO.setParentId(null);
        }

        //构造查询条件
        QueryWrapper<Folder> queryWrapper = QueryGenerator.generateQueryWrapper(Folder.class,queryVO,sortInfo);

        //查询数据
        folderService.page(page, queryWrapper);
        //转换vo
        IPage<FolderVO> pageVO = mapperFacade.map(page, IPage.class);
        List<FolderVO>  folderVOList=convert2VO(page.getRecords());
        pageVO.setRecords(folderVOList);
        return ResultUtil.success(pageVO);
    }


    /**
    * 列表
    */
    @GetMapping("/list")
    @SystemLog(value = "文件夹-列表")
    @PreAuthorize("hasPermission(null,'edoc:folder:query')")
    public ResponseEntity<Result> list(FolderVO queryVO, SortInfo sortInfo) {
        //构造查询条件
        QueryWrapper<Folder> queryWrapper = QueryGenerator.generateQueryWrapper(Folder.class, queryVO,sortInfo);
        List<Folder> list= folderService.list(queryWrapper);
        //转换vo
        List<FolderVO>  folderVOList=convert2VO(list);
        return ResultUtil.success(folderVOList);
    }

    /**
    * 获取单条数据
    */
    @GetMapping("/{id}")
    @SystemLog(value = "文件夹-详情")
    @PreAuthorize("hasPermission(null,'edoc:folder:view')")
    public ResponseEntity<Result> get(@PathVariable("id") String id) {
        Folder entity = folderService.query(id);
        FolderVO vo = convert2VO(entity);
        return ResultUtil.success(vo);
    }

    /**
    * 复制新增数据,单条数据标识,或多条数据标识用逗号间隔拼成的字符串
    */
    @PostMapping("/{id}")
    @SystemLog(value = "文件夹-复制新增")
    @PreAuthorize("hasPermission(null,'edoc:folder:addByCopy')")
    public ResponseEntity<Result> addByCopy(@PathVariable("id") String id) {
        folderService.addByCopy(id);
        return ResultUtil.success();
    }



    //endregion

    //region 扩展操作

    //endregion

    //region 树操作
    /**
    * 获取树数据
    *
    * @return
    */
    @GetMapping("/tree")
    @PreAuthorize("hasPermission(null,'edoc:folder:query')")
    public ResponseEntity<Result> tree() {
        QueryWrapper<Folder> queryWrapper = new QueryWrapper<>();
        List<Folder> list = folderService.list(queryWrapper);
        // 转化成树结构数据
        List<TreeVO> treeList = list.stream().map(e -> convert2TreeVO(e)).collect(Collectors.toList());
        List<TreeVO> tree = TreeUtil.buildTree(treeList, TreeDefaultConstant.DEFAULT_TREE_ROOT_PARENT_ID);
        return ResultUtil.success(tree);
   }

    /**
    * 转换为树视图对象
    */
    private TreeVO convert2TreeVO(Folder entity) {
        TreeVO tree = new TreeVO();
        tree.setId(entity.getId());
        tree.setParentId(entity.getParentId());
        tree.setLabel(entity.getName());
        return tree;
    }

    //endregion
    //region 辅助操作

    /**
    * 将单条实体转换为视图对象
    *
    * @param entity 实体
    * @return {@link EntityVO} 视图对象
    */
    protected FolderVO convert2VO(Folder entity){
        FolderVO vo=mapperFacade.map(entity,FolderVO.class);
        return vo;
    }

    /**
    * 将实体列表转换为视图对象列表
    *
    * @param entityList 实体列表
    * @return {@link List}<{@link EntityVO}> 视图对象列表
    */
    protected List<FolderVO> convert2VO(List<Folder> entityList) {
        List<FolderVO> voList = new ArrayList<>(entityList.size());

        entityList.stream().forEach(x -> {
            FolderVO vo = convert2VO(x);
            voList.add(vo);
        });
        return voList;
    }


    private Folder convert2Entity(FolderVO vo){
        Folder entity=mapperFacade.map(vo,Folder.class);
        return entity;
    }

    //endregion
 }

控制器类作为与前端交互的最后一个层,不能像服务层那样,通过泛型基类来提取公共代码复用,平台生成全量的增删改查基本操作,根据实际业务需求进行删除,比如某些实体只能删除不能修改。

除了基本的初始化、新增、删除、修改外,平台内置了分页操作、列表操作、复制新增操作以及实体类与视图对象类的转换操作,且转换时数据字典类型与实体关联类可自动化转换。如果该实体是自关联,同时还会附加树形数据的处理方法。

同时考虑到该类的方法比较多,使用region注释的方式进行了分组。
image.png

视图对象类

package tech.abc.edoc.edoc.vo;


import tech.abc.platform.common.base.BaseVO;
import java.time.LocalDateTime;
import javax.validation.constraints.NotBlank;
import java.math.BigDecimal;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

/**
* 文件夹 视图对象类
*
* @author wqliu
* @date 2024-01-29
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
public class FolderVO extends BaseVO {
    /**
    * 上级
    */
    private String parentId;

    /**
    * 名称
    */
    @NotBlank(message = "【名称】不能为空")
    private String name;




    /********非库表存储属性*****/



    /********字典类*****/

    /********实体类、用户单选、组织机构单选*****/

    /********范围查询*****/

    /********自定义扩展*****/
    /**
    * 忽略上级
    */
    private Boolean ignoreParent;


    /********子对象*****/




}

这里平台自动附加了一个忽略上级的属性,是对于树形结构的实体,默认查询是只查询选中节点下的数据,有时候不确定在哪个节点下,总不能逐个点击去查找,而是提供了这么一个额外属性,来忽略选中节点,查询所有数据。

编译代码

使用maven,clean并install该模块。
image.png
一次性编译成功,无需任何改动。

开发平台资料

平台名称:一二三应用开发平台
平台简介:企业级通用低代码应用开发平台,免费全开源可商用
设计资料:csdn专栏
开源地址:Gitee
开源协议:MIT

应用系统资料

应用名称:一二三文档管理系统
应用简介: 企事业单位一站式文档管理系统,让组织内文档管理有序,协作高效、安全可控
设计文档:csdn专栏
开源地址:Gitee
开源协议:MIT

如果您在阅读本文时获得了帮助或受到了启发,希望您能够喜欢并收藏这篇文章,为它点赞~
请在评论区与我分享您的想法和心得,一起交流学习,不断进步,遇见更加优秀的自己!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/715695.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习-课程整理及初步介绍

简介: 机器学习是人工智能的一个分支&#xff0c;它使计算机系统能够从经验中学习并改进其在特定任务上的表现&#xff0c;而无需进行明确的编程。机器学习涉及多种算法和统计模型&#xff0c;它们可以从数据中学习规律&#xff0c;并做出预测或决策。机器学习的应用非常广泛&…

云计算在保险行业的应用:太平财险团财险理赔新核心业务系统案例

随着科技的快速发展&#xff0c;云计算技术已经成为推动保险行业数字化转型的重要力量。云计算为保险公司提供了弹性、可扩展的计算资源&#xff0c;使其能够灵活应对业务高峰和低谷&#xff0c;提高业务运营效率和风控水平。太平财险与太平金科联合开发的“团财险理赔新核心业…

购物车列表设计

三、缓存结构设计 购物车数量 数据结构 string redisKey : cart_size${userId} value:购物车数量 缓存时间 15天 数据库用户购物车列表 数据结构 string redisKey : cart${userId} value:数据库用户购物车列表json 缓存时间 15天 用户排序后购物车商品列表&#xff…

Android sensor列表和访问记录

命令: dumpsys sensorservice 1.dumpsys sensorservice查看最近申请记录 dumpsys sensorservice命令输出Previous Registrations. Previous Registrations: 23:07:43 0x00000008 pid16587 uid10397 packagecom.start.testdemo.ui.udfp.fql.XsqFQLActivity samplingPeriod66…

智慧分流:探索互联网与物联网的负载均衡技术

数字化时代&#xff0c;个人认为&#xff0c;无论是互联网还是物联网&#xff0c;还是其他网&#xff0c;在各个层级&#xff0c;都对系统的稳定性和效率提出了更高的要求。负载均衡技术作为保障系统平稳运行的关键&#xff0c;其重要性不言而喻。在数字世界的海洋中&#xff0…

仅靠独立网站也能赚到100万,真的太牛了

你听说过 Photopea 吗&#xff1f;这是一个免费的类似 Photoshop 的图像编辑器。 这个项目&#xff1a; 每月1300万访问量每月150万用户使用小时每月10万美元的广告收入 Photopea 项目的天才创造者是 Ivan Kutskir。 令人惊讶的是&#xff0c;他独自处理了每日50万用户&…

gt9x双击唤醒屏幕

里面可以看到irq 和 rst的gpio引脚从设备树获取失败&#xff0c;排查设备树发现是属性名写错了&#xff1a; c &i2c1 {status "okay";goodix_ts5d {compatible "goodix,gt9xx";reg <0x5d>;// tp-size <89>;touchscreen-size-x <12…

JINGWHALE WH 迭代思维法:科学优化问题解析、任务策略规划与高效工作汇报的赋能艺术

JINGWHALE 对此论文相关未知以及已知概念、定理、公式、图片等内容的感悟、分析、创新、创造等拥有作品著作权。未经 JINGWHALE 授权&#xff0c;禁止转载与商业使用。

怎样搭建serveru ftp个人服务器

首先说说什么是ftp&#xff1f; FTP协议是专门针对在两个系统之间传输大的文件这种应用开发出来的&#xff0c;它是TCP/IP协议的一部分。FTP的意思就是文件传输协议&#xff0c;用来管理TCP/IP网络上大型文件的快速传输。FTP早也是在Unix上开发出来的&#xff0c;并且很长一段…

混淆矩阵-召回率、精确率、准确率

混淆矩阵 1 混淆矩阵2 混淆矩阵指标2.1 准确率2.2 精确率2.3 召回率2.4 特异度2.4 假正率2.5 假负率2.6 F1 分数 3 总结 1 混淆矩阵 混淆矩阵是一种用于评估分类模型性能的重要工具。它通过矩阵形式清晰地展示了模型对样本进行分类的结果&#xff0c;帮助我们理解模型在不同类…

第十七篇——交叉熵:如何避免制订出与事实相反的计划?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 任何事情&#xff0c;都需要我们制订计划执行计划&#xff1b;而制订计划…

AI 能否自行设计和制造芯片?

一、背景 AI在芯片设计和制造方面的潜力极其巨大&#xff0c;可以从以下几个方面探讨&#xff1a; 芯片设计阶段 自动化设计优化&#xff1a; AI可以实现芯片架构的自动化设计和优化&#xff0c;通过机器学习算法探索庞大的设计空间&#xff0c;找到性能、功耗、面积等方面的…

软件测试---基础知识

目录 一、概念 1、需求 2、测试用例 3、软件错误--BUG 4、软件生命周期 5、软件开发模型 6、测试模型 7、软件测试生命周期 二、基础 1、描述一个bug 2、定义bug的级别 3、bug的生命周期 4、开始第一次测试 5、解决争执 三、测试用例基础知识 1、用例基本要素 …

k8s实战案例之部署nginx+Tomcat+nfs实现动静分离

​​​​​ k8s实战案例之部署NginxTomcatNFS实现动静分离 1、基于镜像分层构建及自定义镜像运行Nginx及Java服务并基于NFS实现动静分离 1.1、业务镜像设计规划 根据业务的不同&#xff0c;我们可以导入官方基础镜像&#xff0c;在官方基础镜像的基础上自定义需要用的工具和…

结构设计模式 - 桥接设计模式 - JAVA

桥接设计模式 一. 介绍二. 桥接模式示例2.1 定义实现部分和具体实现2.2 定义抽象部分和细化抽象部分2.3 测试2.4 解释 三. 结论 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 一.…

爬虫初学篇

初次学习爬虫&#xff0c;知识笔记小想 目录&#x1f31f; 一、&#x1f349;基础知识二、&#x1f349;http协议&#xff1a;三、&#x1f349;解析网页(1) xpath的用法&#xff1a;(2) bs4解析器的解释&#xff1a;(3) python字符编码的错误&#xff1a;(4) 正则表达式&#…

HTML静态网页成品作业(HTML+CSS)——中华传统美德介绍网页(2个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;表格布局&#xff0c;未使用Javacsript代码&#xff0c;共有2个页面。…

python GUI开发: tkinter事件处理的几种方式详解与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

分布式之日志系统平台ELK

ELK解决了什么问题 我们开发完成后发布到线上的项目出现问题时(中小型公司),我们可能需要获取服务器中的日志文件进行定位分析问题。但在规模较大或者更加复杂的分布式场景下就显得力不从心。因此急需通过集中化的日志管理,将所有服务器上的日志进行收集汇总。所以ELK应运而生…

【C/C++】【学生成绩管理系统】深度剖析

可接各类C/C管理系统课设 目录 实现功能 部分1&#xff1a;系统设置和主菜单 1. 引入头文件 2. 定义结构体 3. 函数声明 4. 主函数 部分2&#xff1a;添加学生信息 部分3&#xff1a;删除学生信息 部分4&#xff1a;修改学生信息 部分5&#xff1a;查询学生信息 部分…