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

目录

一、项目介绍

二、项目截图

管理后台

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.mzph.cn/web/7465.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot 引入第三方bean

如何进行第三方bean的定义 参数进行自动装配

如何通过编程学习走科技特长生的路线?

编程是一门非常重要的技能&#xff0c;在当今数字化时代&#xff0c;掌握编程技能可以为个人的发展和就业提供更多机会。如果想要走科技特长生的路线&#xff0c;通过编程学习是一个非常好的选择。以下是一些步骤和建议&#xff0c;帮助你通过编程学习走科技特长生的路线&#…

rancher/elemental 构建不可变IOS(一)

一、什么是elemental Elemental 是 Rancher 的一个变种&#xff0c;专注于提供一个更轻量级的 Kubernetes 发行版。它旨在提供简化的部署和管理体验&#xff0c;同时保持 Kubernetes 的灵活性和强大功能。Elemental 通常针对较小的部署场景或资源受限的环境&#xff0c;例如测…

自建GitLab仓库

摘要 GitLab 是一个功能强大的开源代码托管平台&#xff0c;它不仅提供了代码存储和版本控制的核心功能&#xff0c;还集成了项目管理、CI/CD 流水线、代码审查等企业级特性。本文将指导你如何在自己的服务器上搭建 GitLab 社区版&#xff0c;创建一个完全属于自己的开源仓库&…

数据结构链表

数据结构链表 链表 1&#xff09;链表的概念及结构: 链表是一种物理存储结构上非连续存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的引用链接次序实现的。 2&#xff09;实际中链表的结构非常多样&#xff0c;以下情况组合起来就有8种链表结构&#xff1a; 单向、双向…

# SSH 是什么?

SSH 是什么&#xff1f; 1、SSH 简介&#xff1a; SSH &#xff1a;全称 Secure Shell &#xff0c;它是安全外壳协议&#xff08;Secure Shell&#xff0c;简称SSH&#xff09;&#xff0c;是一种在不安全网络上用于安全远程登录和其他安全网络服务的协议。 SSH 由 IETF 的网…

信息系统项目管理师——项目工具

直方图散点图蒙特卡洛分析 PERT分析 因果图 控制图 帕累托图 持续改进 偏差分析 鱼骨图 工作绩效报告可以包含挣值图表和信息、趋势线和预测、储备燃尽图、缺陷直方图、合同绩效信息以及风险概述信息。可表现为仪表指示图、热点报告、信号灯图或其他形式。 干系人参与度评估矩…

服务器数据恢复—ESXi虚拟机中MySQL数据库数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌EVA某型号存储中部署VMware ESXi虚拟化平台&#xff0c;数据盘&#xff08;精简模式&#xff09;快照数据盘&#xff0c;虚拟机中有mysql数据库。 服务器故障&#xff1a; 机房意外断电导致该存储中的一台VMware虚拟机无法启动&#xff0…

C语言从头学01——入门程序

从这篇文章起&#xff0c;我将对以往自己学习C语言的笔记进行整理&#xff0c;并以专栏的形式与各位朋友一同再学习一下C语言。 开始&#xff0c;先介绍一个入门程序。这是一个学习任何计算机语言往往都以此开头的程序&#xff0c;这个程序的唯一作用是在屏幕上打印出“…

【iOS】方法交换(Method Swizzling)

文章目录 前言一、原理与注意用法注意要点Method Swizzing涉及的相关API 二、应用场景与实践1.统计VC加载次数并打印2.防止UI控件短时间多次激活事件3.防崩溃处理&#xff1a;数组越界问题4.防KVO崩溃 总结 前言 上文讲到了iOS的消息发送机制&#xff0c;在消息机制中我们了解…

【3dmax笔记】023:阵列工具(移动+一维+二维+三维)

文章目录 一、阵列工具二、案例演示 一、阵列工具 【阵列】命令将显示【阵列】对话框&#xff0c;使用该对话框可以基于当前选择创建对象阵列。 菜单栏&#xff1a;【工具】菜单 > 【阵列】 二、案例演示 首先&#xff0c;画一个物体&#xff0c;如茶壶&#xff0c;如下图…

【Web前端】CSS样式

1.CSS概念 1.1 使用意义 CSS(Cascading Style sheet):层香样式表CSS是一种语言&#xff0c;主要用来表现HTML样式的&#xff0c;可以修饰静态网页&#xff0c;也可以配合脚本语言对网页各元素进行美化处理CSS美化网页 1.2 特点 内容和表现相分离整站的所有网页表现形式统一&…

鸿蒙 DevEcoStudio:组件实例(页面及组件生命周期函数)

【使用onPageshow等生命周期函数】 在entry/src/main/ets/pages路径下创建Page1.ets: import router from ohos.router Entry Component struct Page1 {State message: string Hello WorldState show: booleantrueaboutToAppear(){console.log(Page1组件创建实例)}aboutToDisa…

中国教育界的泰斗级人物颜廷利:一位在多个领域具有深远影响的学者

**中国教育界的泰斗级人物颜廷利教授是一位在多个领域都有着深远影响的学者**。 山东籍文化名人颜廷利教授是一位世界级的哲学大师&#xff0c;他在学术界拥有多项创造性的成果。他不仅是国际十大姓名学专家排行榜上的佼佼者&#xff0c;颜廷利还被评为颜氏家族十大杰出名人教育…

在Windows 11环境下,生成自签名证书

在Windows 11环境下&#xff0c;使用上述命令生成自签名证书时&#xff0c;需要注意的是Windows命令行不直接支持<(command)这样的进程替换语法。因此&#xff0c;您需要稍微调整方法来实现相同的目标。下面是分步骤的操作指南&#xff1a; ### 1. 安装OpenSSL 确保您已经…

python分析预测退休后养老金金额

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.代码 三.总结 一.前言 养老金,也称为退休金或退休费,是一种主要的社会养老保险待遇。它旨在保障职工退休后的基本生活需要,根据劳动者对社会所作的贡献和所具备的享受养老保险资格或退休条件,按月或一次…

【Word】写论文,参考文献涉及的上标、尾注、脚注 怎么用

一、功能位置 二、脚注和尾注区别 1.首先脚注是一个汉语词汇&#xff0c;论文脚注就是附在论文页面的最底端&#xff0c;对某些内容加以说明&#xff0c;印在书页下端的注文。脚注和尾注是对文本的补充说明。 2.其次脚注一般位于页面的底部&#xff0c;可以作为文档某处内容的…

C++ 函数前后使用 const 的作用

1、在c函数前后使用const的作用是不同的&#xff1a; 在函数前面添加const表示返回值为const类型的变量&#xff1b; 在函数后面添加const表示函数不可以修改class类的成员。 2、在函数后面使用const 0 (都是和virtual关键字同时使用的)&#xff0c;表示是一个纯虚函数&#xf…

从招标到合作:如何筛选与企业需求匹配的6sigma咨询公司

在市场竞争激烈的环境中&#xff0c;领军企业需要不断改进和创新才能在行业中保持竞争优势。为了解决产品质量、生产流程和客户满意度等方面的挑战&#xff0c;许多企业选择与6sigma咨询公司合作&#xff0c;推动企业的全面变革和持续发展。下面是企业在选择合作伙伴时通常会经…

GPT-3

论文&#xff1a;Language Models are Few-Shot Learners&#xff08;巨无霸OpenAI GPT3 2020&#xff09; 摘要 最近的工作表明&#xff0c;通过对大量文本进行预训练&#xff0c;然后对特定任务进行微调&#xff0c;在许多NLP任务和基准方面取得了实质性进展。虽然这种方法…