springboot+vue+elementui实现校园互助平台大作业、毕业设计

ops/2024/9/25 9:34:48/

目录

一、项目介绍

二、项目截图

管理后台

1.登录(默认管理员账号密码均为:admin)

2. 用户管理

​编辑 3.任务管理

互助单(学生发布)

行政单(教师发布) 

​编辑 审核(退回需要写明原因)

4.管理员管理

​编辑 ​编辑

5.个人信息、修改密码

​编辑 ​编辑

用户端

1.登录

​编辑 2.首页

可以对任务进行接取,搜索任务等

可评论

​编辑 3.任务发布

互助单发布

行政单差发布

 4.个人中心

 5.我的发布

6.我的接取

​编辑 7.消息中心

三、 项目实现简述

1.项目需求、要求文档

2.后端项目

idea开发

​编辑 部分实现源码:

3.前端vue项目

管理后台前端vue项目:

登录页面代码案例:

四、总结

 


一、项目介绍

     后端分离实现

  1. 项目分为三个部分:springboot后端、管理后台和用户平台pc端;
  2. 后端采用springboot+redis+mybatisplus+mysql+JWT token;
  3. 管理后台采用vue+elementui,用户平台端同样,框架类似,很好的框架、适合新手、老手,都可以,没有复杂错乱的结构。

二、项目截图

管理后台

1.登录(默认管理员账号密码均为:admin)

2. 用户管理

分为学生管理、教师管理,同表设计,界面差不多

 3.任务管理

互助单(学生发布)

行政单(教师发布) 
 审核(退回需要写明原因)

4.管理员管理

 

5.个人信息、修改密码

 

用户端

1.登录

 2.首页

可以对任务进行接取,搜索任务等

可评论

 3.任务发布

互助单发布

行政单差发布

 

 4.个人中心

 

 5.我的发布

6.我的接取

 7.消息中心

各种实时消息通知

 

三、 项目实现简述

1.项目需求、要求文档

2.后端项目

idea开发

 部分实现源码:

package com.product.service.impl;import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.product.entity.*;
import com.product.entity.base.PageQuery;
import com.product.entity.base.Result;
import com.product.entity.base.ResultPage;
import com.product.entity.vo.CommentVO;
import com.product.entity.vo.HelpTaskVO;
import com.product.enumerate.*;
import com.product.mapper.CommentMapper;
import com.product.mapper.HelpTaskMapper;
import com.product.mapper.RecruitRecordMapper;
import com.product.param.HelpTaskParam;
import com.product.service.*;
import com.product.util.JwtUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;@Slf4j
@Service
public class HelpTaskServiceImpl extends ServiceImpl<HelpTaskMapper, HelpTask> implements HelpTaskService {@Resourceprivate FileUploadService fileUploadService;@Resourceprivate UserService userService;@Resourceprivate RecruitRecordMapper recruitRecordMapper;@Resourceprivate CommentMapper commentMapper;@Resourceprivate MsgRecordService msgRecordService;@Resourceprivate RecruitRecordService recruitRecordService;/*** 添加或更新*/@Overridepublic Result<?> add(Integer userId, HelpTaskParam param) {if (param.getRecruitStartTime().isAfter(param.getRecruitEndTime())) {return Result.failMsg("招募结束时间不能小于开始时间");}User user = userService.getUserById(userId);if (Objects.equals(UserType.TEACHER.getValue(), user.getUserType()) && Objects.equals(param.getPublishType(), PublishType.MUTUAL_AID.getValue())) {return Result.failMsg("教师不可发布任务单");}if (Objects.equals(UserType.STUDENT.getValue(), user.getUserType()) && Objects.equals(param.getPublishType(), PublishType.ADMINISTRATION.getValue())) {return Result.failMsg("学生不可发布行政单");}if (param.getFile() != null) {String coverPath = fileUploadService.uploadImage(param.getFile());param.setCoverPath(coverPath);}LocalDateTime now = LocalDateTime.now();param.setUpdateTime(now);if (param.getId() == null) {//添加param.setUserId(userId);param.setCreateTime(now);param.setAuditStatus(AuditStatus.UNDER_REVIEW.getValue());param.setTaskStatus(HelpTaskStatus.TO_BE_RECRUITED.getValue());save(param);} else {//param.setAuditStatus(AuditStatus.UNDER_REVIEW.getValue());param.setRejectRemark("");HelpTask helpTask = getById(param.getId());if (Objects.equals(helpTask.getTaskStatus(), HelpTaskStatus.TASK_FAIL.getValue())|| Objects.equals(helpTask.getTaskStatus(), HelpTaskStatus.TASK_FINISHED.getValue())) {return Result.failMsg("任务状态不允许修改");}updateById(param);}return Result.OKMsg("保存成功,审核中~");}/*** 分页*/@Overridepublic ResultPage<HelpTaskVO> getHomePage(PageQuery pageQuery) {Page<HelpTask> page;LambdaQueryWrapper<HelpTask> queryWrapper = new LambdaQueryWrapper<>();if (StringUtils.isNotBlank(pageQuery.getKeyWord())) {queryWrapper.and(i->i.like(HelpTask::getName, pageQuery.getKeyWord()).or().like(HelpTask::getContent, pageQuery.getKeyWord()));}if (pageQuery.getPublishType() != null) {queryWrapper.eq(HelpTask::getPublishType, pageQuery.getPublishType());}if (pageQuery.getTaskType() != null) {queryWrapper.eq(HelpTask::getType, pageQuery.getTaskType());}queryWrapper.eq(HelpTask::getAuditStatus, AuditStatus.PUBLISHED.getValue());queryWrapper.in(HelpTask::getTaskStatus, Arrays.asList(HelpTaskStatus.TO_BE_RECRUITED.getValue(),HelpTaskStatus.RECRUITMENT_IN_PROGRESS.getValue(),HelpTaskStatus.TASK_IN_PROGRESS.getValue()));queryWrapper.orderByDesc(HelpTask::getCreateTime);page = page(pageQuery.build(), queryWrapper);List<HelpTaskVO> helpTaskVOList = new ArrayList<>();if (CollectionUtil.isNotEmpty(page.getRecords())) {page.getRecords().forEach(item -> {HelpTaskVO helpTaskVO = new HelpTaskVO();BeanUtil.copyProperties(item, helpTaskVO);this.fixOtherInfo(helpTaskVO, false);helpTaskVOList.add(helpTaskVO);});}return ResultPage.OK(page.getTotal(), page.getCurrent(), page.getSize(), helpTaskVOList);}/*** 分页*/@Overridepublic ResultPage<HelpTaskVO> getAdminPage(PageQuery pageQuery) {Page<HelpTask> page;LambdaQueryWrapper<HelpTask> queryWrapper = new LambdaQueryWrapper<>();if (StringUtils.isNotBlank(pageQuery.getKeyWord())) {queryWrapper.like(HelpTask::getName, pageQuery.getKeyWord());}if (pageQuery.getPublishType() != null) {queryWrapper.eq(HelpTask::getPublishType, pageQuery.getPublishType());}if (pageQuery.getTaskType() != null) {queryWrapper.eq(HelpTask::getType, pageQuery.getTaskType());}if (pageQuery.getAuditStatus() != null) {queryWrapper.eq(HelpTask::getAuditStatus, pageQuery.getAuditStatus());}if (pageQuery.getTaskStatus() != null) {queryWrapper.eq(HelpTask::getTaskStatus, pageQuery.getTaskStatus());}queryWrapper.orderByDesc(HelpTask::getCreateTime);page = page(pageQuery.build(), queryWrapper);List<HelpTaskVO> helpTaskVOList = new ArrayList<>();if (CollectionUtil.isNotEmpty(page.getRecords())) {page.getRecords().forEach(item -> {HelpTaskVO helpTaskVO = new HelpTaskVO();BeanUtil.copyProperties(item, helpTaskVO);this.fixOtherInfo(helpTaskVO, false);helpTaskVOList.add(helpTaskVO);});}return ResultPage.OK(page.getTotal(), page.getCurrent(), page.getSize(), helpTaskVOList);}/*** 分页*/@Overridepublic ResultPage<HelpTaskVO> getMyPublishPage(PageQuery pageQuery) {Page<HelpTask> page;LambdaQueryWrapper<HelpTask> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(HelpTask::getUserId, JwtUtil.getUserId());if (StringUtils.isNotBlank(pageQuery.getKeyWord())) {queryWrapper.like(HelpTask::getName, pageQuery.getKeyWord());}if (pageQuery.getPublishType() != null) {queryWrapper.eq(HelpTask::getPublishType, pageQuery.getPublishType());}if (pageQuery.getTaskType() != null) {queryWrapper.eq(HelpTask::getType, pageQuery.getTaskType());}if (pageQuery.getAuditStatus() != null) {queryWrapper.eq(HelpTask::getAuditStatus, pageQuery.getAuditStatus());}if (pageQuery.getTaskStatus() != null) {queryWrapper.eq(HelpTask::getTaskStatus, pageQuery.getTaskStatus());}queryWrapper.orderByDesc(HelpTask::getCreateTime);page = page(pageQuery.build(), queryWrapper);List<HelpTaskVO> helpTaskVOList = new ArrayList<>();if (CollectionUtil.isNotEmpty(page.getRecords())) {page.getRecords().forEach(item -> {HelpTaskVO helpTaskVO = new HelpTaskVO();BeanUtil.copyProperties(item, helpTaskVO);this.fixOtherInfo(helpTaskVO, false);helpTaskVOList.add(helpTaskVO);});}return ResultPage.OK(page.getTotal(), page.getCurrent(), page.getSize(), helpTaskVOList);}@Overridepublic Result<List<CommentVO>> getCommentList(int helpTaskId) {List<CommentVO> commentVOList = new ArrayList<>();List<Comment> commentList = commentMapper.selectList(Wrappers.<Comment>lambdaQuery().eq(Comment::getHelpTaskId, helpTaskId));if (CollUtil.isNotEmpty(commentList)) {List<Integer> userIds = commentList.stream().map(Comment::getUserId).collect(Collectors.toList());userIds.addAll(commentList.stream().map(Comment::getBeReplyUserId).collect(Collectors.toList()));List<User> userList = userService.list(Wrappers.<User>lambdaQuery().in(User::getId, userIds));userList.forEach(item -> {item.setAvatar(fileUploadService.getRealPath(item.getAvatar()));});Map<Integer, User> userMap = userList.stream().collect(Collectors.toMap(User::getId, obj -> obj));commentList.forEach(item -> {CommentVO commentVO = new CommentVO();BeanUtil.copyProperties(item, commentVO);commentVO.setPublishUser(userMap.get(item.getUserId()));commentVO.setBeReplyUser(userMap.get(item.getBeReplyUserId()));commentVOList.add(commentVO);});}return Result.OK(commentVOList);}@Overridepublic void fixOtherInfo(HelpTaskVO helpTaskVO, boolean comment) {helpTaskVO.setPublishTypeText(PublishType.valueOf(helpTaskVO.getPublishType()).getText());helpTaskVO.setTypeText(HelpTaskType.valueOf(helpTaskVO.getType()).getText());helpTaskVO.setTaskStatusText(HelpTaskStatus.valueOf(helpTaskVO.getTaskStatus()).getText());helpTaskVO.setAuditStatusText(AuditStatus.valueOf(helpTaskVO.getAuditStatus()).getText());helpTaskVO.setCoverPath(fileUploadService.getRealPath(helpTaskVO.getCoverPath()));User user = userService.getUserById(helpTaskVO.getUserId());user.setAvatar(fileUploadService.getRealPath(user.getAvatar()));helpTaskVO.setPublishUser(user);//招募成员List<RecruitRecord> recruitRecords = recruitRecordMapper.selectList(Wrappers.<RecruitRecord>lambdaQuery().eq(RecruitRecord::getHelpTaskId, helpTaskVO.getId()));if (CollUtil.isNotEmpty(recruitRecords)) {List<Integer> userIds = recruitRecords.stream().map(RecruitRecord::getUserId).collect(Collectors.toList());List<User> userList = userService.list(Wrappers.<User>lambdaQuery().in(User::getId, userIds));userList.forEach(item -> {item.setAvatar(fileUploadService.getRealPath(item.getAvatar()));});helpTaskVO.setUserList(userList);}int commentNum = Math.toIntExact(commentMapper.selectCount(Wrappers.<Comment>lambdaQuery().eq(Comment::getHelpTaskId, helpTaskVO.getId())));helpTaskVO.setCommentNum(commentNum);//评论列表if (comment) {List<Comment> commentList = commentMapper.selectList(Wrappers.<Comment>lambdaQuery().eq(Comment::getHelpTaskId, helpTaskVO.getId()));if (CollUtil.isNotEmpty(commentList)) {List<CommentVO> commentVOList = new ArrayList<>();List<Integer> userIds = commentList.stream().map(Comment::getUserId).collect(Collectors.toList());userIds.addAll(commentList.stream().map(Comment::getBeReplyUserId).collect(Collectors.toList()));List<User> userList = userService.list(Wrappers.<User>lambdaQuery().in(User::getId, userIds));userList.forEach(item -> {item.setAvatar(fileUploadService.getRealPath(item.getAvatar()));});Map<Integer, User> userMap = userList.stream().collect(Collectors.toMap(User::getId, obj -> obj));commentList.forEach(item -> {CommentVO commentVO = new CommentVO();BeanUtil.copyProperties(item, commentVO);commentVO.setPublishUser(userMap.get(item.getUserId()));commentVO.setBeReplyUser(userMap.get(item.getBeReplyUserId()));commentVOList.add(commentVO);});helpTaskVO.setCommentList(commentVOList);}}}/*** 删除** @param userId 用户ID* @param ids    所操作记录*/@Overridepublic Result<?> del(Integer userId, String ids) {String[] idsArr = ids.split(",");List<Long> idsList = new ArrayList<>();for (String str : idsArr) {idsList.add(Long.parseLong(str));}boolean change = remove(Wrappers.<HelpTask>lambdaQuery().in(HelpTask::getId, idsList));if (change) {return Result.OKMsg("删除成功");} else {return Result.failMsg("删除失败,请重试");}}/*** 更新状态** @param userId 用户ID* @param ids    所操作记录* @return*/@Overridepublic Result<?> updateAuditStatus(Integer userId, Integer auditStatus, String ids, String rejectRemark) {String[] idsArr = ids.split(",");String content = "任务审核状态发生了变化【" + AuditStatus.valueOf(auditStatus).getText() + "】,请及时查看";for (String str : idsArr) {lambdaUpdate().eq(HelpTask::getId, Integer.parseInt(str)).set(HelpTask::getAuditStatus, AuditStatus.valueOf(auditStatus).getValue()).set(HelpTask::getRejectRemark, rejectRemark).set(HelpTask::getUpdateSystemAdminId, userId).set(HelpTask::getUpdateSystemTime, LocalDateTime.now()).update();HelpTask helpTask = getById(Integer.parseInt(str));
//            if (!Objects.equals(helpTask.getUserId(), userId)) {MsgRecord msgRecord = new MsgRecord();msgRecord.setReceiveUserId(helpTask.getUserId());msgRecord.setRelId(helpTask.getId());msgRecord.setStatus(YesOrNo.NO.getValue());msgRecord.setMsgType(MsgType.HELP_TASK.getValue());msgRecord.setContent(content);msgRecordService.add(msgRecord);
//            }}return Result.OKMsg("操作成功");}/*** 更新状态** @param userId 用户ID* @param ids    所操作记录* @return*/@Transactional(rollbackFor = Exception.class)@Overridepublic Result<?> updateStatus(Integer userId, Integer status, String ids) {String[] idsArr = ids.split(",");String content = "任务状态发生了变化【" + HelpTaskStatus.valueOf(status).getText() + "】,请及时查看";for (String str : idsArr) {lambdaUpdate().eq(HelpTask::getId, Integer.parseInt(str)).set(HelpTask::getTaskStatus, HelpTaskStatus.valueOf(status).getValue()).set(HelpTask::getUpdateSystemAdminId, userId).set(HelpTask::getUpdateSystemTime, LocalDateTime.now()).update();HelpTask helpTask = getById(Integer.parseInt(str));
//            if (!Objects.equals(helpTask.getUserId(), userId)) {MsgRecord msgRecord = new MsgRecord();msgRecord.setReceiveUserId(helpTask.getUserId());msgRecord.setRelId(helpTask.getId());msgRecord.setStatus(YesOrNo.NO.getValue());msgRecord.setMsgType(MsgType.HELP_TASK.getValue());msgRecord.setContent(content);msgRecordService.add(msgRecord);
//            }//任务完成,奖励积分 行政单才有积分if (Objects.equals(helpTask.getPublishType(), PublishType.ADMINISTRATION.getValue()) && Objects.equals(HelpTaskStatus.TASK_FINISHED, HelpTaskStatus.valueOf(status))) {//招募成员List<RecruitRecord> recruitRecords = recruitRecordMapper.selectList(Wrappers.<RecruitRecord>lambdaQuery().eq(RecruitRecord::getHelpTaskId, helpTask.getId()).eq(RecruitRecord::getAddIntegral, YesOrNo.NO.getValue()));if (CollUtil.isNotEmpty(recruitRecords)) {List<Integer> userIds = recruitRecords.stream().map(RecruitRecord::getUserId).collect(Collectors.toList());List<User> userList = userService.list(Wrappers.<User>lambdaQuery().in(User::getId, userIds));userList.forEach(item -> {Integer integral = item.getIntegral();if (integral == null) {integral = 0;}integral += helpTask.getIntegral();userService.lambdaUpdate().eq(User::getId, item.getId()).set(User::getIntegral, integral).update();});//更新已经清算积分 避免重复状态修改重复增加积分List<Integer> idList = recruitRecords.stream().map(RecruitRecord::getId).collect(Collectors.toList());recruitRecordService.lambdaUpdate().in(RecruitRecord::getId, idList).set(RecruitRecord::getAddIntegral, YesOrNo.YES.getValue()).update();}}}return Result.OKMsg("操作成功");}/*** 详情** @param id 主键*/@Overridepublic Result<HelpTaskVO> getDetailById(int id) {HelpTask helpTask = getById(id);HelpTaskVO vo = BeanUtil.copyProperties(helpTask, HelpTaskVO.class);this.fixOtherInfo(vo, true);return Result.OK(vo);}/*** 评论*/@Transactional(rollbackFor = Exception.class)@Overridepublic Result<Comment> addComment(Integer userId, Comment comment) {comment.setUserId(userId);commentMapper.insert(comment);MsgRecord msgRecord = new MsgRecord();msgRecord.setUserId(comment.getUserId());msgRecord.setBeReplyUserId(comment.getBeReplyUserId());msgRecord.setReceiveUserId(comment.getBeReplyUserId());msgRecord.setRelId(comment.getHelpTaskId());msgRecord.setStatus(YesOrNo.NO.getValue());msgRecord.setMsgType(MsgType.COMMENT.getValue());msgRecord.setContent("评论了你,请及时回复~");msgRecordService.add(msgRecord);return Result.OK("评论成功", comment);}/*** 评论*/@Overridepublic Result<?> delComment(int id) {int change = commentMapper.deleteById(id);return Result.OKMsg("删除成功");}
}

3.前端vue项目

管理后台前端vue项目:

 用户端前端vue项目:

登录页面代码案例:
<template><div id="login-body"><div style="width: 100%;height: 100%;overflow: hidden;"><div class="name">大学校园互助平台</div><div class="login-modal"><div class="title">登录</div><el-form class="login-form":rules="loginRules"ref="loginForm":model="loginForm"label-width="0"><el-form-item prop="username"><el-inputplaceholder="请输入用户名"prefix-icon="el-icon-user"v-model="loginForm.username"></el-input></el-form-item><el-form-item prop="password"><el-input:type="passwordType"placeholder="请输入密码"prefix-icon="el-icon-lock"v-model="loginForm.password"></el-input></el-form-item><el-form-item><el-row :span="24">
<!--    					     <el-col :span="12">-->
<!--    					       <el-checkbox v-model="loginForm.rememberPwd">记住密码</el-checkbox>-->
<!--    					     </el-col>--><el-col :span="24"><el-popoverplacement="top-start"title=""width="200"trigger="hover"content="忘记密码请联系系统管理员"><span style="color: #1890ff;float: right;" slot="reference">忘记密码</span></el-popover></el-col></el-row></el-form-item><el-form-item><el-button type="primary"style="width: 100%;"@click.native.prevent="handleLogin"class="login-submit">登录</el-button></el-form-item></el-form></div></div></div>
</template><script>import {getStore,setStore} from "@/utils/store.js";export default {data() {return {loading: false,passwordType: "password",loginForm: {//用户名username: "",//密码password: "",adminType: "1",rememberPwd: false,},roles:[{val: '1',name:'管理员'},{val: '2',name:'教师'},],loginRules: {username: [{required: true, message: "请输入用户名", trigger: "change"}],password: [{required: true, message: "请输入密码", trigger: "change"}],adminType: [{required: true, message: "请选择角色", trigger: "change"}]},};},watch: {},computed: {},mounted() {window.addEventListener('keydown', this.keyDown)},methods: {keyDown (e) {// 回车则执行登录方法 enter键的ASCII是13if (e.keyCode === 13) {this.handleLogin() // 需要执行的方法方法}},destroyed () {window.removeEventListener('keydown', this.keyDown, false)},showPassword() {this.passwordType === ""? (this.passwordType = "password"): (this.passwordType = "");},handleLogin() {//登录this.$refs.loginForm.validate(valid => {if (valid) {const loading = this.$loading({lock: true,text: '登录中,请稍后。。。',spinner: "el-icon-loading"});this.$store.dispatch('login',this.loginForm).then((res)=>{if(res.code === 200){this.destroyed();this.$notify({title: '登录成功',message: res.data.username+',欢迎您!',type: 'success'});this.$router.push({path: '/'});}}).finally(() =>loading.close());}});},}};
</script><style>#login-body{width: 100%;height: 100%;background-size: 100% 100%;background-image: linear-gradient(to top,rgba(0,0,0,0.5),rgba(0,0,0,0.5)), url("../../../public/img/bg2.jpg");background-repeat: no-repeat;}.name{line-height: 50px;font-size: 30px;font-weight: 700;color: #FFFFFF;margin-left: 10px;}.login-modal{position: relative;width: 420px;height: 400px;margin: 0 auto;top: 50%;margin-top: -200px;background-color: #FFFFFF;border-radius: 5px;}.title{height: 100px;line-height: 100px;font-weight: 600;text-align: center;font-size: 28px;}.login-form{margin: 20px 40px;}
</style>

四、总结

项目页面完整,后续可能将不断升级。

关注作者,及时了解更多好项目!

更多优质项目请看作者主页!

获取源码或如需帮助,可通过博客后面名片+作者即可!

 

 其他作品集合(主页更多):低价多销-CSDN博客


http://www.ppmy.cn/ops/35770.html

相关文章

C语言 | Leetcode C语言题解之第72题编辑距离

题目&#xff1a; 题解&#xff1a; static inline int Min(const int a, const int b, const int c) {int min (a < b) ? a : b;return (min < c) ? min : c; }int minDistance(char * word1, char * word2){int m strlen(word1), n strlen(word2);int dp[m 1][n…

怎么获得请求ip

在Java中&#xff0c;获取HTTP请求的客户端IP地址通常可以通过HttpServletRequest对象来实现。考虑到请求可能经过代理服务器或负载均衡器&#xff0c;以下是一种常用且较为全面的方法来尝试获取真实的客户端IP地址&#xff1a; 基本方法 1. 使用 getRemoteAddr() 这是最直接…

2.开始学习C++

开始学习C 写在前面创建C程序1.输入输出2.main()函数3.头文件4.名称空间 C其他语句1.cin2.类3.函数4.自定义函数 写在前面 每次写读书笔记之前我都打算先写一会自己的心得&#xff0c;或者一些前情提要。先说说为什么要写这个读书心得吧。 首先是自己摆烂太久了&#xff0c;从…

Go-Zero技能提升:深度探究goctl的妙用,轻松应对微服务开发挑战!(三)

前言 有位同学在群里说&#xff1a;“Go-Zero官方文档太简洁了&#xff0c;对小白有点不友好。好奇你们是怎么学习的&#xff1f;项目是怎么封装的&#xff1f;有什么提高开发效率的技巧吗&#xff1f;”。 来来来&#xff0c;这期内容给你安排上&#xff0c;先教你goctl的妙…

计算机系列之数据结构

19、数据结构&#xff08;重点、考点&#xff09; 1、线性结构 线性结构&#xff1a;每个元素最多只有一个出度和一个入读&#xff0c;表现为一条线状。线性表按存储方式分为顺序表和链表。 1、顺序存储和链式存储 存储结构&#xff1a; 顺序存储&#xff1a;用一组地址连续…

11个值得关注的文本转语音AI大模型

语言模型&#xff0c;尤其是大型语言模型&#xff08;LLM&#xff09;&#xff0c;本质上已经成为人工智能的代表。然而&#xff0c;他们有一个隐秘的问题。到目前为止&#xff0c;人工智能社区主要在文本数据上训练人工智能&#xff0c;而忽略了音频数据。结果&#xff0c;我们…

面试集中营—Spring篇

Spring 框架的好处 1、轻量&#xff1a;spring是轻量的&#xff0c;基本的版本大约2MB&#xff1b; 2、IOC&#xff1a;控制反转&#xff0c;Spring的IOC机制使得对象之间的依赖不再需要我们自己来控制了&#xff0c;而是由容易来控制&#xff0c;一个字&#xff1a;爽&#xf…

常用的预编码算法学习

一、概况 预编码算法的常用实现方式有以下几种: 1. 间隔预编码(Interval Pre-coding):该算法将原始数据分成若干个间隔,然后对每个间隔内的数据进行编码。间隔的长度可以根据具体情况进行选择,常见的间隔长度有固定长度和可变长度两种方式。 2. 迭代预编码(Iterative…