计算机毕业设计 大学生选修选课系统的设计与实现 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

news/2024/5/18 14:05:11 标签: java, spring boot, 毕业设计, 论文, 选课系统

🍊作者:计算机编程-吉哥
🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。
🍊心愿:点赞 👍 收藏 ⭐评论 📝
🍅 文末获取源码联系

👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~
Java毕业设计项目~热门选题推荐《1000套》

目录

1.技术选型

2.数据库表结构

3.开发工具

4.功能

4.1【角色】

4.2【学生功能模块】

4.3【教师功能模块】

4.4【管理员功能模块】

5.项目演示截图

5.1 登录

5.2 学生选课

5.3 学生查看排课

5.4 选课列表

5.5 成绩列表

5.6 选课限制

5.7 公告信息

5.8 教师录入成绩

5.9 管理员基础数据管理

5.10 公告类型管理

6.数据库文件设计

7.核心代码 

7.1 选课Controller

7.2 选课Service

7.3 选课ServiceImpl

7.4 选课Dao

8.参考文档


1.技术选型

springboot、mybatisplus、vue、elementui、html、css、js、mysql、jdk1.8

2.数据库表结构

12张 

3.开发工具

idea、navicat

4.功能

4.1【角色】

学生、教师、管理员

4.2【学生功能模块】

  • 登录注册
  • 首页
  • 个人中心
  • 课程信息管理
  • 排课信息管理
  • 选课信息管理
  • 学生成绩管理
  • 公告信息管理

4.3【教师功能模块】

  • 登录注册
  • 首页
  • 个人中心
  • 学生管理
  • 课程信息管理
  • 排课信息管理
  • 选课信息管理
  • 学生成绩管理
  • 选课限制管理
  • 公告信息管理

4.4【管理员功能模块】

  • 登录注册
  • 首页
  • 个人中心
  • 管理员管理
  • 教师管理
  • 学生管理
  • 课程信息管理
  • 排课信息管理
  • 选课信息管理
  • 学生成绩管理
  • 基础数据管理
  • 选课限制管理
  • 公告信息管理

5.项目演示截图

5.1 登录

5.2 学生选课

 

5.3 学生查看排课

 

5.4 选课列表

 

5.5 成绩列表

 

5.6 选课限制

 

5.7 公告信息

 

5.8 教师录入成绩

 

5.9 管理员基础数据管理

 

5.10 公告类型管理

 

6.数据库文件设计


CREATE TABLE `chengji` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `chengji_name` varchar(200) DEFAULT NULL COMMENT '成绩标题 Search111',
  `chengji_types` int(11) DEFAULT NULL COMMENT '成绩类型  Search111',
  `xuenfen_number` int(11) DEFAULT NULL COMMENT '成绩',
  `chengji_content` text COMMENT '备注',
  `yonghu_id` int(11) DEFAULT NULL COMMENT '学生',
  `chengji_delete` int(11) DEFAULT '1' COMMENT '假删',
  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间 show1 show2 photoShow',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COMMENT='学生成绩';



CREATE TABLE `config` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(100) DEFAULT NULL COMMENT '配置参数名称',
  `value` varchar(100) DEFAULT NULL COMMENT '配置参数值',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='配置文件';


CREATE TABLE `dictionary` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `dic_code` varchar(200) DEFAULT NULL COMMENT '字段',
  `dic_name` varchar(200) DEFAULT NULL COMMENT '字段名',
  `code_index` int(11) DEFAULT NULL COMMENT '编码',
  `index_name` varchar(200) DEFAULT NULL COMMENT '编码名字  Search111 ',
  `super_id` int(11) DEFAULT NULL COMMENT '父字段id',
  `beizhu` varchar(200) DEFAULT NULL COMMENT '备注',
  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8 COMMENT='字典';



CREATE TABLE `jiaoshi` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `jiaoshi_uuid_number` varchar(200) DEFAULT NULL COMMENT '工号 ',
  `username` varchar(200) DEFAULT NULL COMMENT '账户',
  `password` varchar(200) DEFAULT NULL COMMENT '密码',
  `jiaoshi_name` varchar(200) DEFAULT NULL COMMENT '教师姓名 Search111 ',
  `jiaoshi_photo` varchar(255) DEFAULT NULL COMMENT '头像',
  `sex_types` int(11) DEFAULT NULL COMMENT '性别 Search111 ',
  `jiaoshi_phone` varchar(200) DEFAULT NULL COMMENT '联系方式',
  `jiaoshi_email` varchar(200) DEFAULT NULL COMMENT '邮箱',
  `banji_types` int(11) DEFAULT NULL COMMENT '班级 Search111 ',
  `jiaoshi_delete` int(11) DEFAULT '1' COMMENT '假删',
  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='教师';



CREATE TABLE `kecheng` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `kecheng_uuid_number` varchar(200) DEFAULT NULL COMMENT '课程编号 ',
  `kecheng_name` varchar(200) DEFAULT NULL COMMENT '课程名称 Search111',
  `kecheng_types` int(11) DEFAULT NULL COMMENT '课程类型  Search111',
  `xuenfen_number` int(11) DEFAULT NULL COMMENT '学分',
  `kecheng_content` text COMMENT '课程详情',
  `kecheng_delete` int(11) DEFAULT '1' COMMENT '假删',
  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间 show1 show2 photoShow',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COMMENT='课程信息';



CREATE TABLE `news` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `news_name` varchar(200) DEFAULT NULL COMMENT '公告标题  Search111 ',
  `news_types` int(11) DEFAULT NULL COMMENT '公告类型  Search111 ',
  `news_photo` varchar(200) DEFAULT NULL COMMENT '公告图片',
  `insert_time` timestamp NULL DEFAULT NULL COMMENT '添加时间',
  `news_content` text COMMENT '公告详情',
  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间 show1 show2 nameShow',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COMMENT='公告信息';



CREATE TABLE `paike` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `kecheng_id` int(11) DEFAULT NULL COMMENT '课程',
  `shangke_time` timestamp NULL DEFAULT NULL COMMENT '上课时间',
  `xiake_time` timestamp NULL DEFAULT NULL COMMENT '结束时间',
  `jieke_types` int(11) DEFAULT NULL COMMENT '第几节  Search111',
  `xueqi_types` int(11) DEFAULT NULL COMMENT '学期 Search111',
  `xingqi_types` int(11) DEFAULT NULL COMMENT '周次 Search111',
  `paike_address` varchar(200) DEFAULT NULL COMMENT '上课地点',
  `jiaoshi_id` int(11) DEFAULT NULL COMMENT '教师',
  `paike_delete` int(11) DEFAULT '1' COMMENT '假删',
  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COMMENT='排课信息';



CREATE TABLE `token` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `userid` bigint(20) NOT NULL COMMENT '学生id',
  `username` varchar(100) NOT NULL COMMENT '学生名',
  `tablename` varchar(100) DEFAULT NULL COMMENT '表名',
  `role` varchar(100) DEFAULT NULL COMMENT '角色',
  `token` varchar(200) NOT NULL COMMENT '密码',
  `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '新增时间',
  `expiratedtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '过期时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COMMENT='token表';



CREATE TABLE `users` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `username` varchar(100) NOT NULL COMMENT '学生名',
  `password` varchar(100) NOT NULL COMMENT '密码',
  `role` varchar(100) DEFAULT '管理员' COMMENT '角色',
  `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '新增时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='管理员';


CREATE TABLE `xuanke` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `kecheng_id` int(11) DEFAULT NULL COMMENT '课程',
  `yonghu_id` int(11) DEFAULT NULL COMMENT '学生',
  `insert_time` timestamp NULL DEFAULT NULL COMMENT '选课时间',
  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间 show1 show2 photoShow',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8 COMMENT='选课信息';



CREATE TABLE `xuankexianzhi` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `xuankexianzhi_number` int(11) DEFAULT NULL COMMENT '选课数量',
  `kaishi_time` timestamp NULL DEFAULT NULL COMMENT '开始时间',
  `jieshu_time` timestamp NULL DEFAULT NULL COMMENT '结束时间',
  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间 show1 show2 photoShow',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COMMENT='选课限制';



CREATE TABLE `yonghu` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `yonghu_uuid_number` varchar(200) DEFAULT NULL COMMENT '学号 ',
  `username` varchar(200) DEFAULT NULL COMMENT '账户',
  `password` varchar(200) DEFAULT NULL COMMENT '密码',
  `yonghu_name` varchar(200) DEFAULT NULL COMMENT '学生名称 Search111 ',
  `yonghu_photo` varchar(255) DEFAULT NULL COMMENT '头像',
  `yonghu_phone` varchar(200) DEFAULT NULL COMMENT '学生手机号',
  `yonghu_id_number` varchar(200) DEFAULT NULL COMMENT '学生身份证号 ',
  `sex_types` int(11) DEFAULT NULL COMMENT '性别 Search111 ',
  `banji_types` int(11) DEFAULT NULL COMMENT '班级 Search111 ',
  `yonghu_email` varchar(200) DEFAULT NULL COMMENT '邮箱',
  `yonghu_delete` int(11) DEFAULT '1' COMMENT '假删',
  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='学生';

7.核心代码 

7.1 选课Controller

java">package com.controller;

/**
 * 选课信息
 * 后端接口
 * @author 计算机编程-吉哥
 * @email
*/
@RestController
@Controller
@RequestMapping("/xuanke")
public class XuankeController {
    private static final Logger logger = LoggerFactory.getLogger(XuankeController.class);

    private static final String TABLE_NAME = "xuanke";

    @Autowired
    private XuankeService xuankeService;


    @Autowired
    private TokenService tokenService;

    @Autowired
    private ChengjiService chengjiService;//学生成绩
    @Autowired
    private DictionaryService dictionaryService;//字典
    @Autowired
    private JiaoshiService jiaoshiService;//教师
    @Autowired
    private KechengService kechengService;//课程信息
    @Autowired
    private NewsService newsService;//公告信息
    @Autowired
    private PaikeService paikeService;//排课信息
    @Autowired
    private XuankexianzhiService xuankexianzhiService;//选课限制
    @Autowired
    private YonghuService yonghuService;//学生
    @Autowired
    private UsersService usersService;//管理员


    /**
    * 后端列表
    */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){
        logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
        String role = String.valueOf(request.getSession().getAttribute("role"));
        if(false)
            return R.error(511,"永不会进入");
        else if("学生".equals(role))
            params.put("yonghuId",request.getSession().getAttribute("userId"));
        else if("教师".equals(role))
            params.put("jiaoshiId",request.getSession().getAttribute("userId"));
        CommonUtil.checkMap(params);
        PageUtils page = xuankeService.queryPage(params);

        //字典表数据转换
        List<XuankeView> list =(List<XuankeView>)page.getList();
        for(XuankeView c:list){
            //修改对应字典表字段
            dictionaryService.dictionaryConvert(c, request);
        }
        return R.ok().put("data", page);
    }

    /**
    * 后端详情
    */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") Long id, HttpServletRequest request){
        logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
        XuankeEntity xuanke = xuankeService.selectById(id);
        if(xuanke !=null){
            //entity转view
            XuankeView view = new XuankeView();
            BeanUtils.copyProperties( xuanke , view );//把实体数据重构到view中
            //级联表 学生
            //级联表
            YonghuEntity yonghu = yonghuService.selectById(xuanke.getYonghuId());
            if(yonghu != null){
            BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createTime", "insertTime", "updateTime", "yonghuId"});//把级联的数据添加到view中,并排除id和创建时间字段,当前表的级联注册表
            view.setYonghuId(yonghu.getId());
            }
            //级联表 课程信息
            //级联表
            KechengEntity kecheng = kechengService.selectById(xuanke.getKechengId());
            if(kecheng != null){
            BeanUtils.copyProperties( kecheng , view ,new String[]{ "id", "createTime", "insertTime", "updateTime", "yonghuId"});//把级联的数据添加到view中,并排除id和创建时间字段,当前表的级联注册表
            view.setKechengId(kecheng.getId());
            }
            //修改对应字典表字段
            dictionaryService.dictionaryConvert(view, request);
            return R.ok().put("data", view);
        }else {
            return R.error(511,"查不到数据");
        }

    }

    /**
    * 后端保存
    */
    @RequestMapping("/save")
    public R save(@RequestBody XuankeEntity xuanke, HttpServletRequest request){
        logger.debug("save方法:,,Controller:{},,xuanke:{}",this.getClass().getName(),xuanke.toString());

        String role = String.valueOf(request.getSession().getAttribute("role"));
        if(false)
            return R.error(511,"永远不会进入");
        else if("学生".equals(role))
            xuanke.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));

        Wrapper<XuankeEntity> queryWrapper = new EntityWrapper<XuankeEntity>()
            .eq("kecheng_id", xuanke.getKechengId())
            .eq("yonghu_id", xuanke.getYonghuId())
            ;

        logger.info("sql语句:"+queryWrapper.getSqlSegment());
        XuankeEntity xuankeEntity = xuankeService.selectOne(queryWrapper);
        if(xuankeEntity==null){
            List<XuankexianzhiEntity> xuankexianzhiEntities = xuankexianzhiService.selectList(null);
            if(xuankexianzhiEntities.size()<0){
                return R.error("选课限制表无数据");
            }
            if(xuankexianzhiEntities.get(0).getKaishiTime().getTime() > new Date().getTime() || new Date().getTime() > xuankexianzhiEntities.get(0).getJieshuTime().getTime()){
                return R.error("不在选课限制时间之内");
            }
            Wrapper<XuankeEntity> xuankeList = new EntityWrapper<XuankeEntity>()
                    .eq("yonghu_id", xuanke.getYonghuId())
                    ;
            List<XuankeEntity> xuankeEntities = xuankeService.selectList(xuankeList);
            Integer xuankeshuliang = xuankeEntities.size()+1;
            if(xuankeshuliang > xuankexianzhiEntities.get(0).getXuankexianzhiNumber()){
                return R.error("当前选("+xuankeEntities.size()+")课,选课限制为:"+xuankexianzhiEntities.get(0).getXuankexianzhiNumber());
            }
            xuanke.setInsertTime(new Date());
            xuanke.setCreateTime(new Date());
            xuankeService.insert(xuanke);
            return R.ok();
        }else {
            return R.error(511,"请不要重复选课");
        }
    }

    /**
    * 后端修改
    */
    @RequestMapping("/update")
    public R update(@RequestBody XuankeEntity xuanke, HttpServletRequest request) throws NoSuchFieldException, ClassNotFoundException, IllegalAccessException, InstantiationException {
        logger.debug("update方法:,,Controller:{},,xuanke:{}",this.getClass().getName(),xuanke.toString());
        XuankeEntity oldXuankeEntity = xuankeService.selectById(xuanke.getId());//查询原先数据

        String role = String.valueOf(request.getSession().getAttribute("role"));

            xuankeService.updateById(xuanke);//根据id更新
            return R.ok();
    }



    /**
    * 删除
    */
    @RequestMapping("/delete")
    public R delete(@RequestBody Integer[] ids, HttpServletRequest request){
        logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
        List<XuankeEntity> oldXuankeList =xuankeService.selectBatchIds(Arrays.asList(ids));//要删除的数据
        xuankeService.deleteBatchIds(Arrays.asList(ids));

        return R.ok();
    }


    /**
     * 批量上传
     */
    @RequestMapping("/batchInsert")
    public R save( String fileName, HttpServletRequest request){
        logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName);
        Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")));
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            List<XuankeEntity> xuankeList = new ArrayList<>();//上传的东西
            Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段
            Date date = new Date();
            int lastIndexOf = fileName.lastIndexOf(".");
            if(lastIndexOf == -1){
                return R.error(511,"该文件没有后缀");
            }else{
                String suffix = fileName.substring(lastIndexOf);
                if(!".xls".equals(suffix)){
                    return R.error(511,"只支持后缀为xls的excel文件");
                }else{
                    URL resource = this.getClass().getClassLoader().getResource("static/upload/" + fileName);//获取文件路径
                    File file = new File(resource.getFile());
                    if(!file.exists()){
                        return R.error(511,"找不到上传文件,请联系管理员");
                    }else{
                        List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件
                        dataList.remove(0);//删除第一行,因为第一行是提示
                        for(List<String> data:dataList){
                            //循环
                            XuankeEntity xuankeEntity = new XuankeEntity();
                            xuankeList.add(xuankeEntity);

                            //把要查询是否重复的字段放入map中
                        }

                        //查询是否重复
                        xuankeService.insertBatch(xuankeList);
                        return R.ok();
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            return R.error(511,"批量插入数据异常,请联系管理员");
        }
    }

}

7.2 选课Service

java">package com.service;

import com.baomidou.mybatisplus.service.IService;
import com.utils.PageUtils;
import com.entity.XuankeEntity;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.lang.Nullable;
import java.util.List;

/**
 * 选课信息 服务类
 */
public interface XuankeService extends IService<XuankeEntity> {

    /**
    * @param params 查询参数
    * @return 带分页的查询出来的数据
    */
     PageUtils queryPage(Map<String, Object> params);

}

7.3 选课ServiceImpl

java">package com.service.impl;

import com.utils.StringUtil;
import com.service.DictionaryService;
import com.utils.ClazzDiff;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.lang.reflect.Field;
import java.util.*;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;
import com.utils.PageUtils;
import com.utils.Query;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import com.dao.XuankeDao;
import com.entity.XuankeEntity;
import com.service.XuankeService;
import com.entity.view.XuankeView;

/**
 * 选课信息 服务实现类
 */
@Service("xuankeService")
@Transactional
public class XuankeServiceImpl extends ServiceImpl<XuankeDao, XuankeEntity> implements XuankeService {

    @Override
    public PageUtils queryPage(Map<String,Object> params) {
        Page<XuankeView> page =new Query<XuankeView>(params).getPage();
        page.setRecords(baseMapper.selectListView(page,params));
        return new PageUtils(page);
    }


}

 7.4 选课Dao

java">package com.dao;

import com.entity.XuankeEntity;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import java.util.List;
import java.util.Map;
import com.baomidou.mybatisplus.plugins.pagination.Pagination;

import org.apache.ibatis.annotations.Param;
import com.entity.view.XuankeView;

/**
 * 选课信息 Dao 接口
 *
 * @author 
 */
public interface XuankeDao extends BaseMapper<XuankeEntity> {

   List<XuankeView> selectListView(Pagination page,@Param("params")Map<String,Object> params);

}

8.参考文档

你可能还有感兴趣的项目👇🏻👇🏻👇🏻

更多项目推荐:计算机毕业设计项目

如果大家有任何疑虑,请在下方咨询或评论


http://www.niftyadmin.cn/n/5086946.html

相关文章

Linux:【Kafka四】集群介绍与单机搭建

目录 环境简介 一、搭建kafka集群 1.1、复制出两个kafka的配置文件 1.2、修改配置文件中的如下属性 二、启动kafka集群 三、可校验kafka三个节点是否均启动成功 四、查看集群中主题的分区和副本 4.1、新建一个包含了分区和副本的主题 4.2、查看该主题的详细信息 五、…

C/C++ C语言 C++语言 当一个文件会和很多个编译单元一起编译时,而这个文件又引用了某些编译单元内独有的函数、全局变量,怎么办?

解决方案如下图&#xff0c;在独有的编译单元内使用 #define&#xff0c;在这个文件内使用 #ifdef &#xff08;这种方式是错误的&#xff0c;#define 一般只会在当前文件起作用&#xff09; 另外一个方案是&#xff0c;在这个 ”会被很多个编译单元链接“ 的文件里定义全局变…

sylar高性能服务器-日志(P7-P8)代码解析

文章目录 p71.TabFormatItem2.init函数&#xff0c;对于{}内容的解析3.Util.h4.CmakeLists5.优化日志输出-流式输出 p81.优化日志输出-格式化输出2.日志管理器3.单例模型设计 测试(无调试步骤) P7P8两节视频新增内容不多&#xff0c;主要看下优化日志输出使用的宏函数。本次记录…

Spring Boot爬虫实战:模拟点击按钮下载表格详解

摘要&#xff1a;爬虫技术在数据获取和处理方面扮演着重要角色&#xff0c;本文将详细介绍如何使用Spring Boot实现爬虫功能&#xff0c;具体涉及模拟点击按钮并下载表格的实现细节&#xff0c;包括依赖导入、代码编写以及数据处理等方面&#xff0c;帮助读者快速入门并使用Spr…

有人因它丢掉offer!背景调查到底有什么魔力?

求职时&#xff0c;公司往往会对应聘者过往经历做一些背景调查——也被叫做背调。 据i背调人才研究院数据显示&#xff0c;2022年的求职失信占比仍然较高&#xff0c;有39.13%的候选人存在职业信用异常。而随着近些年来&#xff0c;整体就业市场和职业发展中竞争压力不断加剧&…

Air001 TIM16/17通用定时器单脉冲输出模式使用

Air001 TIM16/17通用定时器单脉冲输出模式使用 &#x1f4cc;相关篇《Air001 TIM1高级定时器单脉冲输出模式使用》 ✨对于单脉冲输出模式&#xff0c;高级定时器和通用定时器的实现是由差异的&#xff0c;为了在通用定时器上实现此功能&#xff0c;也是卡了很久。 &#x1f516…

一文吃透零代码、低代码和aPaaS系统

零代码、低代码和aPaaS是近年来软件开发和业务敏捷性领域中流行的概念。每个概念都有其特定的定义和能力&#xff0c;企业可以根据自身的需求和目标来选择合适的工具和技术。接下来我将详细介绍三者的定义与区别。 一、零代码&#xff08;Zero-Code&#xff09; 零代码是指无需…

深入了解基数排序:原理、性能分析与 Java 实现

基数排序&#xff08;Radix Sort&#xff09;是一种非比较性排序算法&#xff0c;它根据元素的每个位上的值来进行排序。基数排序适用于整数或字符串等数据类型的排序。本文将详细介绍基数排序的原理、性能分析及java实现。 基数排序原理 基数排序的基本原理是按照低位先排序&…