2024年大数据最新微人事项目代码泛读结对练习经验分享_微人事代码精读(2),2024年最新我的大数据开发春季历程

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!


配置数据库,在本地(或者云端和虚拟机)创建一个名为vhr的数据库 —创建即可


下载redis,可以使用我这边提供的网址:https://github.com/tporadowski/redis/releases


或者去官网自行下载:https://redis.io/download


配置rabbitmq消息队列,可以看我之前的博客,在Linux环境下利用docker部署


这里附上我之前的博客链接:http://t.csdnimg.cn/U2x5q


完成后需要在配置文件将上面三个的配置换成自己的


之后就可以运行了


### 三、git训练


(1) 创建针对本作业的项目和软件版本库,在版本库中建立“src”和“doc”两个文件夹,分别存储软件系统的源代码和报告文档


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/34bf6951ccde4c4f8f51780453bcb07b.png)


(2) 建立master、develop以及成员分支(a\_branch),将当前版本存入master目录下  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/545a9259d15241d99231510f61a1fb2e.png)


在远程仓库可以看到已经生成了一个develop


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/8bcf29788cbe4faeb47f7b049489aeb5.png)


(3) 实践操作参考:组长组员两个人协同开发:组长负责维护开发分支dev,组员向dev上传提交;当dev测试合适后,组长有唯一权限向master上传作为最终结果。


① 远程仓库有master和dev两个分支


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/0b2de46f94b24fcf896f57126dabc7c2.png)


② 组长本地有master和dev分支,分别关联对应的远程分支


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/52936a2120b14dc0ac2723f4b4b2a4ea.png)


③ 组员本地只有一个分支,关联远程dev分支【可以选择clone某一个远程分支到本地】


④ 具体开发流程是:


1. 组长和组员分别在各自的本地dev分支开发,有阶段性成果后push到远程dev【若有冲突,解决冲突再合并】  
 组员在src提交了一个文件:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/2c0720fa8f43464bbf096faebb48e795.png)  
 组长提交:提交过程报错,需要pull最新版本的develop,这时候进行冲突处理后合并,解决后重新push到orgin develop  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/3a02d8650b9b4fcd81eeda2d40abab75.png)
2. 当开发完成、结果稳定后,组长将本地的master和dev分支merge,再把master分支push上去  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6cf116633cc0471c97ebe7067811cdd4.png)


最后展示一下项目  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d4f582ad403f4395aa0fe2f3b7f40eb2.png)


### 四、项目理解


(1) **用例图**:通过用例图来描述微人事系统的主要功能以及它们之间的关系;


(2) **体系结构图(包图)**:通过绘制体系结构图来了解整个软件的总体设计思路;


(3) **类之间的调用关系图**:通过绘制类之间的调用关系图来掌握微人事的具体设计;


(4) **核心类**的主要作用:通过给出核心类的主要作用来进一步加深对软件设计的理解。


1.MailReceiver类



@Component
public class MailReceiver {

public static final Logger logger = LoggerFactory.getLogger(MailReceiver.class);

@Autowired
JavaMailSender javaMailSender;
@Autowired
MailProperties mailProperties;
@Autowired
TemplateEngine templateEngine;
@Autowired
StringRedisTemplate redisTemplate;

@RabbitListener(queues = MailConstants.MAIL_QUEUE_NAME)
public void handler(Message message, Channel channel) throws IOException {
Employee employee = (Employee) message.getPayload();
MessageHeaders headers = message.getHeaders();
Long tag = (Long) headers.get(AmqpHeaders.DELIVERY_TAG);
String msgId = (String) headers.get(“spring_returned_message_correlation”);
if (redisTemplate.opsForHash().entries(“mail_log”).containsKey(msgId)) {
//redis 中包含该 key,说明该消息已经被消费过
logger.info(msgId + “:消息已经被消费”);
channel.basicAck(tag, false);//确认消息已消费
return;
}
//收到消息,发送邮件
MimeMessage msg = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(msg);
try {
helper.setTo(employee.getEmail());
helper.setFrom(mailProperties.getUsername());
helper.setSubject(“入职欢迎”);
helper.setSentDate(new Date());
Context context = new Context();
context.setVariable(“name”, employee.getName());
context.setVariable(“posName”, employee.getPosition().getName());
context.setVariable(“joblevelName”, employee.getJobLevel().getName());
context.setVariable(“departmentName”, employee.getDepartment().getName());
String mail = templateEngine.process(“mail”, context);
helper.setText(mail, true);
javaMailSender.send(msg);
redisTemplate.opsForHash().put(“mail_log”, msgId, “javaboy”);
channel.basicAck(tag, false);
logger.info(msgId + “:邮件发送成功”);
} catch (MessagingException e) {
channel.basicNack(tag, false, true);
e.printStackTrace();
logger.error(“邮件发送失败:” + e.getMessage());
}
}
}


主要作用:


这段代码是一个邮件接收器 MailReceiver,通过 RabbitMQ 监听特定队列中的消息,并处理发送邮件的逻辑。让我简单解释一下代码的主要功能:


1. 通过 @Autowired 注解注入了 JavaMailSender、MailProperties、TemplateEngine 和 StringRedisTemplate 实例。
2. 使用 @RabbitListener 注解监听名为 MailConstants.MAIL\_QUEUE\_NAME 的 RabbitMQ 队列, MailConstants.MAIL\_QUEUE\_NAME的值可以在MailConstants常量类找到


public static final String MAIL\_QUEUE\_NAME = “javaboy.mail.queue”;


1. 在 handler 方法中,从消息中获取员工信息,并检查消息是否已经被消费过(通过 Redis)。
2. 如果消息未被消费过,则利用MimeMessage构建邮件内容并发送邮件,发送成功后将消息 ID 记录到 Redis 缓存中。
3. 利用try-catch进行处理,如果发送过程中出现异常,将消息标记为未确认状态,并记录错误日志。


2.各个Control类(以SalaryControl类为例)



@RestController
@RequestMapping(“/salary/sob”)
public class SalaryController {
@Autowired
SalaryService salaryService;

@GetMapping(“/”)
public List getAllSalaries() {
return salaryService.getAllSalaries();
}

@PostMapping(“/”)
public RespBean addSalary(@RequestBody Salary salary) {
if (salaryService.addSalary(salary) == 1) {
return RespBean.ok(“添加成功!”);
}
return RespBean.error(“添加失败!”);
}

@DeleteMapping(“/{id}”)
public RespBean deleteSalaryById(@PathVariable Integer id) {
if (salaryService.deleteSalaryById(id) == 1) {
return RespBean.ok(“删除成功!”);
}
return RespBean.error(“删除失败!”);
}

@PutMapping(“/”)
public RespBean updateSalaryById(@RequestBody Salary salary) {
if (salaryService.updateSalaryById(salary) == 1) {
return RespBean.ok(“更新成功!”);
}
return RespBean.error(“更新失败!”);
}
}


这个项目以Restful风格开发控制器,这个用例SalaryControl的作用是用于处理与薪资信息相关的HTTP请求。


1. 通过@Autowired自动注入了SalaryService服务,用于处理与薪资信息相关的业务逻辑,一般来说功能的实现都需要放到service层进行处理,Controller层专注处理通讯问题。
2. @GetMapping("/")注解的getAllSalaries()方法处理HTTP的GET请求,用于获取所有的薪资信息列表。
3. @PostMapping("/")注解的addSalary(@RequestBody Salary salary)方法处理HTTP的POST请求,用于添加新的薪资信息。
4. @DeleteMapping("/{id}")注解的deleteSalaryById(@PathVariable Integer id)方法处理HTTP的DELETE请求,根据提供的id删除特定的薪资信息。
5. @PutMapping("/")注解的updateSalaryById(@RequestBody Salary salary)方法处理HTTP的PUT请求,用于更新特定的薪资信息。


选择这个类作为样例是因为这个使用到了比较全面的RestfulAPI中的GET(获取)、POST(创建)、DELETE(删除)和PUT(更新),用于实现对薪资信息的增删改查功能。


3. SecurityConfig安全



@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
HrService hrService;
@Autowired
CustomFilterInvocationSecurityMetadataSource customFilterInvocationSecurityMetadataSource;
@Autowired
CustomUrlDecisionManager customUrlDecisionManager;

@Bean
PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(hrService);
}

@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers(“/css/**”, “/js/**”, “/index.html”, “/img/**”, “/fonts/**”, “/favicon.ico”, “/verifyCode”);
}

@Bean
LoginFilter loginFilter() throws Exception {
LoginFilter loginFilter = new LoginFilter();
loginFilter.setAuthenticationSuccessHandler((request, response, authentication) -> {
response.setContentType(“application/json;charset=utf-8”);
PrintWriter out = response.getWriter();
Hr hr = (Hr) authentication.getPrincipal();
hr.setPassword(null);
RespBean ok = RespBean.ok(“登录成功!”, hr);

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

.(img-PPeFfwNP-1715622035454)]
[外链图片转存中…(img-Xg8t3jCZ-1715622035454)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值