OJ在线评测系统 后端基础部分开发 完善CRUD相关接口
完善相关接口
判斷编程语言是否合法
先从用户的请求拿到Language

package com.dduo.dduoj.service.impl;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dduo.dduoj.common.ErrorCode;
import com.dduo.dduoj.exception.BusinessException;
import com.dduo.dduoj.model.dto.questionsubmit.JudgeInfo;
import com.dduo.dduoj.model.dto.questionsubmit.QuestionSubmitAddRequest;
import com.dduo.dduoj.model.enums.QuestionSubmitLanguageEnum;
import com.dduo.dduoj.model.enums.QuestionSubmitStatusEnum;
import com.dduo.dduoj.service.mapper.QuestionSubmitMapper;
import com.dduo.dduoj.service.mapper.entity.Question;
import com.dduo.dduoj.service.mapper.entity.QuestionSubmit;
import com.dduo.dduoj.service.mapper.entity.User;
import com.dduo.dduoj.service.QuestionService;
import com.dduo.dduoj.service.QuestionSubmitService;
import javax.annotation.Resource;
import org.springframework.aop.framework.AopContext;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;/*** 提交题目服务实现**/
@Service
public class QuestionSubmitServiceImpl extends ServiceImpl<QuestionSubmitMapper, QuestionSubmit>implements QuestionSubmitService {@Resourceprivate QuestionService questionService;/*** 提交题目** @param questionSubmitAddRequest* @param loginUser* @return*/@Overridepublic long doQuestionSubmit(QuestionSubmitAddRequest questionSubmitAddRequest, User loginUser) {// 编程语言是否合法String language = questionSubmitAddRequest.getLanguage();QuestionSubmitLanguageEnum enumByValue = QuestionSubmitLanguageEnum.getEnumByValue(language);if (enumByValue==null){throw new BusinessException(ErrorCode.PARAMS_ERROR,"编程语言错误");}long questionId = questionSubmitAddRequest.getQuestionId();// 判断实体是否存在,根据类别获取实体Question question = questionService.getById(questionId);if (question == null) {throw new BusinessException(ErrorCode.NOT_FOUND_ERROR);}// 是否提交题目long userId = loginUser.getId();// 每个用户串行提交题目// 锁必须要包裹住事务方法QuestionSubmit questionSubmit = new QuestionSubmit();questionSubmit.setUserId(userId);questionSubmit.setQuestionId(questionId);questionSubmit.setCode(questionSubmitAddRequest.getCode());questionSubmit.setLanguage(language);//设置初始状态questionSubmit.setStatus(QuestionSubmitStatusEnum.WATING.getValue());questionSubmit.setJudgeInfo("{}");boolean save = this.save(questionSubmit);if(!save){throw new BusinessException(ErrorCode.SYSTEM_ERROR,"数据插入失败");}return questionSubmit.getId();}}
写好了 idea启动

代码运行成功

我们
使用接口文档提交题目试一试
数据库中数据录入成功

为了防止用户根据id爬取题目
建议把id的生成规则改成ASSIGN_ID
非连续递增
而不是从1开始递增

数值传到数据库中进行一个转换

/*** 创建** @param questionAddRequest* @param request* @return*/
@PostMapping("/add")
public BaseResponse<Long> addQuestion(@RequestBody QuestionAddRequest questionAddRequest, HttpServletRequest request) {if (questionAddRequest == null) {throw new BusinessException(ErrorCode.PARAMS_ERROR);}Question question = new Question();BeanUtils.copyProperties(questionAddRequest, question);List<String> tags = questionAddRequest.getTags();if (tags != null) {question.setTags(GSON.toJson(tags));}List<JudgeCase> judgeCase = questionAddRequest.getJudgeCase();if (judgeCase != null) {question.setJudgeCase(GSON.toJson(judgeCase));}List<JudgeConfig> judgeConfig = questionAddRequest.getJudgeConfig();if (judgeConfig != null) {question.setJudgeConfig(GSON.toJson(judgeConfig));}questionService.validQuestion(question, true);User loginUser = userService.getLoginUser(request);question.setUserId(loginUser.getId());question.setFavourNum(0);question.setThumbNum(0);boolean result = questionService.save(question);ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR);long newQuestionId = question.getId();return ResultUtils.success(newQuestionId);
}

@PostMapping("/update")
@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<Boolean> updateQuestion(@RequestBody QuestionUpdateRequest questionUpdateRequest) {if (questionUpdateRequest == null || questionUpdateRequest.getId() <= 0) {throw new BusinessException(ErrorCode.PARAMS_ERROR);}Question question = new Question();BeanUtils.copyProperties(questionUpdateRequest, question);List<String> tags = questionUpdateRequest.getTags();if (tags != null) {question.setTags(GSON.toJson(tags));}List<JudgeCase> judgeCase = questionUpdateRequest.getJudgeCase();if (judgeCase != null) {question.setJudgeCase(GSON.toJson(judgeCase));}List<JudgeConfig> judgeConfig = questionUpdateRequest.getJudgeConfig();if (judgeConfig != null) {question.setJudgeConfig(GSON.toJson(judgeConfig));}// 参数校验questionService.validQuestion(question, false);long id = questionUpdateRequest.getId();// 判断是否存在Question oldQuestion = questionService.getById(id);ThrowUtils.throwIf(oldQuestion == null, ErrorCode.NOT_FOUND_ERROR);boolean result = questionService.updateById(question);return ResultUtils.success(result);
}

@PostMapping("/edit")
public BaseResponse<Boolean> editQuestion(@RequestBody QuestionEditRequest questionEditRequest, HttpServletRequest request) {if (questionEditRequest == null || questionEditRequest.getId() <= 0) {throw new BusinessException(ErrorCode.PARAMS_ERROR);}Question question = new Question();BeanUtils.copyProperties(questionEditRequest, question);List<String> tags = questionEditRequest.getTags();if (tags != null) {question.setTags(GSON.toJson(tags));}List<JudgeCase> judgeCase = questionEditRequest.getJudgeCase();if (judgeCase != null) {question.setJudgeCase(GSON.toJson(judgeCase));}List<JudgeConfig> judgeConfig = questionEditRequest.getJudgeConfig();if (judgeConfig != null) {question.setJudgeConfig(GSON.toJson(judgeConfig));}// 参数校验questionService.validQuestion(question, false);User loginUser = userService.getLoginUser(request);long id = questionEditRequest.getId();// 判断是否存在Question oldQuestion = questionService.getById(id);ThrowUtils.throwIf(oldQuestion == null, ErrorCode.NOT_FOUND_ERROR);// 仅本人或管理员可编辑if (!oldQuestion.getUserId().equals(loginUser.getId()) && !userService.isAdmin(loginUser)) {throw new BusinessException(ErrorCode.NO_AUTH_ERROR);}boolean result = questionService.updateById(question);return ResultUtils.success(result);
}
枯燥的测试



完善
查询提交信息
接口功能 能够根据用户id 题目id 编程语言 去查询提交记录
注意事项 仅本人和管理员能看见自己提交代码的答案 提交代码
实现方案 先查询

package com.dduo.dduoj.model.dto.questionsubmit;import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;import java.io.Serializable;//查询请求
@Data
public class QuestionSubmitQueryRequest implements Serializable {/*** 编程语言*/private String language; /*** 提交状态*/private Integer status;/*** 题目id*/private Long questionId;/*** 用户id*/private Long userId;@TableField(exist = false)private static final long serialVersionUID = 1L;
}
QuestionSubmitVO
/*** 包装类转对象** @param questionSubmitVO* @return*/
public static QuestionSubmit voToObj(QuestionSubmitVO questionSubmitVO) {if (questionSubmitVO == null) {return null;}QuestionSubmit questionSubmit = new QuestionSubmit();BeanUtils.copyProperties(questionSubmitVO, questionSubmit);JudgeInfo judgeInfoObj = questionSubmitVO.getJudgeInfo();if (judgeInfoObj != null) {questionSubmit.setJudgeInfo(JSONUtil.toJsonStr(judgeInfoObj));}return questionSubmit;
}/*** 对象转包装类** @param questionSubmit* @return*/
public static QuestionSubmitVO objToVo(QuestionSubmit questionSubmit) {if (questionSubmit == null) {return null;}QuestionSubmitVO questionSubmitVO = new QuestionSubmitVO();BeanUtils.copyProperties(questionSubmit, questionSubmitVO);String judgeInfoStr = questionSubmit.getJudgeInfo();questionSubmitVO.setJudgeInfo(JSONUtil.toBean(judgeInfoStr, JudgeInfo.class));return questionSubmitVO;
}
先查询再根据权限去脱敏

/*** 分页获取题目提交(除了管理员外 普通用户是能看见非答案 提交代码等非公开信息)** @param questionSubmitQueryRequest* @return*/
@PostMapping("/list/page")
@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<Page<QuestionSubmitVO>> listQuestionSubmitByPage(@RequestBody QuestionSubmitQueryRequest questionSubmitQueryRequest,HttpServletRequest request) {long current = questionSubmitQueryRequest.getCurrent();long size = questionSubmitQueryRequest.getPageSize();//从数据库中获取信息Page<QuestionSubmit> questionSubmitPage = questionSubmitService.page(new Page<>(current, size),questionSubmitService.getQueryWrapper(questionSubmitQueryRequest));//返回脱敏方法return ResultUtils.success(questionSubmitService.getQuestionSubmitVOPage(questionSubmitPage,request));
}
脱敏处理

/*
* 单条数据
* */
@Override
public QuestionSubmitVO getQuestionSubmitVO(QuestionSubmit questionSubmit, User loginUser) {QuestionSubmitVO questionSubmitVO = QuestionSubmitVO.objToVo(questionSubmit);// 脱敏:仅本人和管理员能看见自己(提交 userId 和登录用户 id 不同)提交的代码long userId = loginUser.getId();// 处理脱敏if (userId != questionSubmit.getUserId() && !userService.isAdmin(loginUser)) {questionSubmitVO.setCode(null);}return questionSubmitVO;
}/** 多条数据* */
@Override
public Page<QuestionSubmitVO> getQuestionSubmitVOPage(Page<QuestionSubmit> questionSubmitPage, User loginUser) {List<QuestionSubmit> questionSubmitList = questionSubmitPage.getRecords();Page<QuestionSubmitVO> questionSubmitVOPage = new Page<>(questionSubmitPage.getCurrent(), questionSubmitPage.getSize(), questionSubmitPage.getTotal());if (CollectionUtils.isEmpty(questionSubmitList)) {return questionSubmitVOPage;}List<QuestionSubmitVO> questionSubmitVOList = questionSubmitList.stream().map(questionSubmit -> getQuestionSubmitVO(questionSubmit, loginUser)).collect(Collectors.toList());questionSubmitVOPage.setRecords(questionSubmitVOList);return questionSubmitVOPage;
}
QuestionSubmitServiceImpl
package com.dduo.dduoj.service.impl;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dduo.dduoj.common.ErrorCode;
import com.dduo.dduoj.constant.CommonConstant;
import com.dduo.dduoj.exception.BusinessException;
import com.dduo.dduoj.judge.JudgeService;
import com.dduo.dduoj.model.dto.questionsubmit.QuestionSubmitAddRequest;
import com.dduo.dduoj.model.dto.questionsubmit.QuestionSubmitQueryRequest;
import com.dduo.dduoj.model.entity.Question;
import com.dduo.dduoj.model.entity.QuestionSubmit;
import com.dduo.dduoj.model.entity.User;
import com.dduo.dduoj.model.enums.QuestionSubmitLanguageEnum;
import com.dduo.dduoj.model.enums.QuestionSubmitStatusEnum;
import com.dduo.dduoj.mapper.QuestionSubmitMapper;
import com.dduo.dduoj.model.vo.QuestionSubmitVO;
import com.dduo.dduoj.service.QuestionService;
import com.dduo.dduoj.service.QuestionSubmitService;
import javax.annotation.Resource;import com.dduo.dduoj.service.UserService;
import com.dduo.dduoj.utils.SqlUtils;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;/*** 提交题目服务实现**/
@Service
public class QuestionSubmitServiceImpl extends ServiceImpl<QuestionSubmitMapper, QuestionSubmit>implements QuestionSubmitService {@Resourceprivate QuestionService questionService;@Resourceprivate UserService userService;@Resource@Lazyprivate JudgeService judgeService;/*** 提交题目** @param questionSubmitAddRequest* @param loginUser* @return*/@Overridepublic long doQuestionSubmit(QuestionSubmitAddRequest questionSubmitAddRequest, User loginUser) {// 校验编程语言是否合法String language = questionSubmitAddRequest.getLanguage();QuestionSubmitLanguageEnum languageEnum = QuestionSubmitLanguageEnum.getEnumByValue(language);if (languageEnum == null) {throw new BusinessException(ErrorCode.PARAMS_ERROR, "编程语言错误");}long questionId = questionSubmitAddRequest.getQuestionId();// 判断实体是否存在,根据类别获取实体Question question = questionService.getById(questionId);if (question == null) {throw new BusinessException(ErrorCode.NOT_FOUND_ERROR);}// 是否已提交题目long userId = loginUser.getId();// 每个用户串行提交题目QuestionSubmit questionSubmit = new QuestionSubmit();questionSubmit.setUserId(userId);questionSubmit.setQuestionId(questionId);questionSubmit.setCode(questionSubmitAddRequest.getCode());questionSubmit.setLanguage(language);// 设置初始状态questionSubmit.setStatus(QuestionSubmitStatusEnum.WAITING.getValue());questionSubmit.setJudgeInfo("{}");boolean save = this.save(questionSubmit);if (!save){throw new BusinessException(ErrorCode.SYSTEM_ERROR, "数据插入失败");}Long questionSubmitId = questionSubmit.getId();// 执行判题服务CompletableFuture.runAsync(() -> {judgeService.doJudge(questionSubmitId);});return questionSubmitId;}/*** 获取查询包装类(用户根据哪些字段查询,根据前端传来的请求对象,得到 mybatis 框架支持的查询 QueryWrapper 类)** @param questionSubmitQueryRequest* @return*/@Overridepublic QueryWrapper<QuestionSubmit> getQueryWrapper(QuestionSubmitQueryRequest questionSubmitQueryRequest) {QueryWrapper<QuestionSubmit> queryWrapper = new QueryWrapper<>();if (questionSubmitQueryRequest == null) {return queryWrapper;}String language = questionSubmitQueryRequest.getLanguage();Integer status = questionSubmitQueryRequest.getStatus();Long questionId = questionSubmitQueryRequest.getQuestionId();Long userId = questionSubmitQueryRequest.getUserId();String sortField = questionSubmitQueryRequest.getSortField();String sortOrder = questionSubmitQueryRequest.getSortOrder();// 拼接查询条件queryWrapper.eq(StringUtils.isNotBlank(language), "language", language);queryWrapper.eq(ObjectUtils.isNotEmpty(userId), "userId", userId);queryWrapper.eq(ObjectUtils.isNotEmpty(questionId), "questionId", questionId);queryWrapper.eq(QuestionSubmitStatusEnum.getEnumByValue(status) != null, "status", status);queryWrapper.eq("isDelete", false);queryWrapper.orderBy(SqlUtils.validSortField(sortField), sortOrder.equals(CommonConstant.SORT_ORDER_ASC),sortField);return queryWrapper;}/** 单条数据* */@Overridepublic QuestionSubmitVO getQuestionSubmitVO(QuestionSubmit questionSubmit, User loginUser) {QuestionSubmitVO questionSubmitVO = QuestionSubmitVO.objToVo(questionSubmit);// 脱敏:仅本人和管理员能看见自己(提交 userId 和登录用户 id 不同)提交的代码long userId = loginUser.getId();// 处理脱敏if (userId != questionSubmit.getUserId() && !userService.isAdmin(loginUser)) {questionSubmitVO.setCode(null);}return questionSubmitVO;}/** 多条数据* */@Overridepublic Page<QuestionSubmitVO> getQuestionSubmitVOPage(Page<QuestionSubmit> questionSubmitPage, User loginUser) {List<QuestionSubmit> questionSubmitList = questionSubmitPage.getRecords();Page<QuestionSubmitVO> questionSubmitVOPage = new Page<>(questionSubmitPage.getCurrent(), questionSubmitPage.getSize(), questionSubmitPage.getTotal());if (CollectionUtils.isEmpty(questionSubmitList)) {return questionSubmitVOPage;}List<QuestionSubmitVO> questionSubmitVOList = questionSubmitList.stream().map(questionSubmit -> getQuestionSubmitVO(questionSubmit, loginUser)).collect(Collectors.toList());questionSubmitVOPage.setRecords(questionSubmitVOList);return questionSubmitVOPage;}}
controller层代码

/*** 提交题目** @param questionSubmitAddRequest* @param request* @return 提交记录的 id*/
@PostMapping("/")
public BaseResponse<Long> doQuestionSubmit(@RequestBody QuestionSubmitAddRequest questionSubmitAddRequest,HttpServletRequest request) {if (questionSubmitAddRequest == null || questionSubmitAddRequest.getQuestionId() <= 0) {throw new BusinessException(ErrorCode.PARAMS_ERROR);}// 登录才能点赞final User loginUser = userService.getLoginUser(request);long questionSubmitId = questionSubmitService.doQuestionSubmit(questionSubmitAddRequest, loginUser);return ResultUtils.success(questionSubmitId);
}
listQuestionSubmitByPage

/*** 分页获取题目提交(除了管理员外 普通用户是能看见非答案 提交代码等非公开信息)** @param questionSubmitQueryRequest* @return*/
@PostMapping("/list/page")
@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<Page<QuestionSubmitVO>> listQuestionSubmitByPage(@RequestBody QuestionSubmitQueryRequest questionSubmitQueryRequest, HttpServletRequest request) {long current = questionSubmitQueryRequest.getCurrent();long size = questionSubmitQueryRequest.getPageSize();//从数据库中获取信息Page<QuestionSubmit> questionSubmitPage = questionSubmitService.page(new Page<>(current, size),questionSubmitService.getQueryWrapper(questionSubmitQueryRequest));final User loginUser = userService.getLoginUser(request);//返回脱敏方法return ResultUtils.success(questionSubmitService.getQuestionSubmitVOPage(questionSubmitPage, loginUser));
}相关文章:
OJ在线评测系统 后端基础部分开发 完善CRUD相关接口
完善相关接口 判斷编程语言是否合法 先从用户的请求拿到Language package com.dduo.dduoj.service.impl;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dduo.dduoj…...
计算机网络--TCP、UDP抓包分析实验
计算机网络实验 目录 实验目的 实验环境 实验原理 1、UDP协议 2、TCP协议 实验具体步骤 实验目的 1、掌握使用wireshark工具对UDP协议进行抓包分析的方法,掌握UDP协议的报文格式,掌握UDP协议校验和的计算方法,理解UDP协议的优缺点&am…...
FreeRTOS的中断管理
前言 FreeRTOS的任务有优先级,MCU的硬件中断有中断优先级,这是两个不同的概念,FreeRTOS的任务管理要用到硬件中断,使用FreeRTOS时候也可以使用硬件中断,但是硬件中断ISR的设计要注意一些设计原则,在本节中我…...
JS加密=JS混淆?(JS加密、JS混淆,是一回事吗?)
JS加密、JS混淆,是一回事吗? 是的!在国内,JS加密,其实就是指JS混淆。 1、当人们提起JS加密时,通常是指对JS代码进行混淆加密处理,而不是指JS加密算法(如xor加密算法、md5加密算法、…...
hive-拉链表
目录 拉链表概述缓慢变化维拉链表定义 拉链表的实现常规拉链表历史数据每日新增数据历史数据与新增数据的合并 分区拉链表 拉链表概述 缓慢变化维 通常我们用一张维度表来维护维度信息,比如用户手机号码信息。然而随着时间的变化,某些用户信息会发生改…...
高并发内存池(六):补充内容
目录 有关大于256KB内存的申请和释放处理方法 处理大于256KB的内存申请 补充内容1 补充内容2 补充内容3 处理大于256KB的内存释放 新增内容1 新增内容2 测试函数 使用定长内存池替代new 释放对象时不传对象大小 补充内容1 补充内容2 补充内容3 补充内容4 测试…...
高性能存储 SIG 月度动态:优化 fuse 提升 AI 存储接入能力,erofs 工具发布新版本
本次月报综合了 SIG 在 7、8 两个月的工作进展,包含多项新特性、优化、Bugfix 等。 SIG 整体进展 fuse 支持 failover,并优化 background 读写公平性,提升 AI 存储接入场景的能力。 erofs page cache 共享特性已发到上游社区,re…...
2024 年最新 Protobuf 结构化数据序列化和反序列化详细教程
Protobuf 序列化概述 Protobuf(Protocol Buffers)是由Google开发的一种语言中立、平台中立、可扩展的序列化结构数据的方法。它用于在不同系统之间高效地交换数据。Protobuf使用定义文件(.proto)来描述数据结构,并通过…...
【小程序】微信小程序课程 -4 项目实战
目录 1、 效果图 2、创建项目 2.1 创建小程序端 2.1.1 先创建纯净项目 2.1.2 删除components 2.1.4 删除app.json红色部分 2.1.5 删除index.json红色部分 2.1.6 删除index.wxss全部内容 2.1.7 删除index.wxml全部内容 2.1.8 app.json创建4个页面 2.1.9 app.json添加…...
【期刊】论文索引库-SCI\SSCI\IE\南大核心\北大核心\CSCD等
外文期刊检索 SCI SCI即《科学引文索引》(Science Citation Index),是由美国科学信息研究所(Institute for Scientific Information)创建于1961年,收录文献的作者、题目、源期刊、摘要、关键词,不仅可以从文献引证的角度评估文章的学术价值,还可以迅速方便地组建研究课…...
开源链动 2+1 模式 S2B2C 商城小程序:社交电商团队为王的新引擎
摘要:本文深入探讨在社交电商领域中,团队的重要性以及如何借助开源链动 21 模式 S2B2C 商城小程序,打造具有强大竞争力的团队,实现个人价值与影响力的放大,创造被动收入,迈向财富自由之路,同时为…...
使用Fiddler Classic抓包工具批量下载音频资料
1. 通过F12开发者工具,下载音频文件 浏览器打开音频列表->F12快捷键->网络->媒体,播放一个音频文件,右边媒体下生成一个音频文件,右击“在新标签页中打开”,可以下载这个音频文件。 2.通过Fiddler Classic抓…...
QT开发:基于Qt实现的交通信号灯模拟器:实现一个带有倒计时功能的图形界面应用
介绍 本文将介绍如何使用Qt框架实现一个简单的交通信号灯控制程序。本程序包括一个图形界面,显示红、黄、绿三色信号灯,并通过定时器控制信号灯的切换。同时,我们还将实现一个带有按钮的界面,用于展示信号灯的状态。 1. 安装Qt开…...
【编程基础知识】网络I/O模型详解:从阻塞到异步
引言 网络I/O模型是网络编程的核心,它们决定了应用程序如何进行读写操作以与网络进行数据交换。了解不同的网络I/O模型对于设计高效、可扩展的网络应用程序至关重要。 一、阻塞I/O(Blocking I/O) 1. 定义 阻塞调用:当应用程序…...
yolo自动化项目实例解析(六)自建UI(主窗口、预览窗口)
前面我们大致把各个代码块梳理出来了,但是还是不知道从那块开始,我们这里主要先通过ui页面的元素去推理整个执行过程,我们首先需要知道ui功能里面有那些组件 qt设计师基础控件 Qt Designer 是一个图形界面设计工具,用于创建 Qt 应…...
Unity优质教程分类汇总 【持续更新中】
以下收录的均为作者自己看过的觉得比较好的教程 基础 Unity入门: https://www.bilibili.com/video/BV1HX4y1V71E?p13 生命周期 https://docs.unity.cn/cn/2022.3/uploads/Main/monobehaviour_flowchart.svg https://zhuanlan.zhihu.com/p/551294000 编程技巧…...
真正掌握left join on 和 where 的差别
总结 用 where 是先连接然后再筛选用 on 是先筛选再连接数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。在使用left jion时,on和where条件的区别如下: on条件是在生成临时表…...
神经网络在多分类问题中的应用
作者简介:热爱数据分析,学习Python、Stata、SPSS等统计语言的小高同学~个人主页:小高要坚强的博客当前专栏:Python之机器学习本文内容:神经网络在多分类问题中的应用作者“三要”格言:要坚强、要努力、要学习 目录 1. 引言 2.数据构造 3.划分数据集 4.神经网络实现多…...
nginx的安装和使用
源码安装 1.环境准备:卸载其他方式安装的web应用,防止端口冲突 2.下载nginx源码包 wget https://nginx.org/download/nginx-1.20.2.tar.gz 3.源码编译安装 yum install -y gcc pcre-devel zlib-devel #安装依赖包 useradd -M -s /sbin/nologin ngi…...
js采用覆盖键、覆盖鼠标滑动事件实现禁止网页通过 ctrl + +/- 和 ctrl + 滚轮 对页面进行缩放
一、兼容电脑端的禁止通过 ctrl /- 和 ctrl 滚轮 对页面进行缩放 const keyCodeMap {// 91: true, // command61: true,107: true, // 数字键盘 109: true, // 数字键盘 -173: true, // 火狐 - 号187: true, // 189: true, // -};二、覆盖ctrl||command ‘’/‘-’ // 覆…...
波色量子获18.4亿融资,1000量子比特计算机让肿瘤切缘识别、脑电解码大提速!
【导语:科幻电影中令人惊叹的量子计算机,如今已从实验室走向商业化落地。波色量子成立三年获11轮融资,累计金额达18.4亿元。其量子计算能力在多个行业实现应用,尤其在生命科学领域展现出巨大潜力。】波色量子:资本竞逐…...
Taotoken API密钥的精细权限管理与操作审计日志在安全运维中的作用
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken API密钥的精细权限管理与操作审计日志在安全运维中的作用 对于负责技术基础设施安全与合规的团队而言,引入新…...
Claude Code与Cursor CLI集成:AI辅助编程工作流优化实践
1. 项目概述:Claude Code与Cursor CLI的桥梁如果你和我一样,日常开发中同时使用Claude Code和Cursor,并且对Composer 2的执行速度印象深刻,那么你很可能也面临过这样的困境:Claude Code在规划、分析和代码审查方面表现…...
LabVIEW数字IO编程避坑指南:单点采样、连续采样到底怎么选?NI-MAX测试面板帮你验证
LabVIEW数字IO编程实战:采样模式选择与NI-MAX验证全攻略 在工业自动化测试领域,LabVIEW的数字IO模块是最基础也最常用的功能之一。许多工程师在初次接触数字IO编程时,往往会被各种采样模式搞得晕头转向——单点采样、N采样、连续采样…...
从Softmax到ArcFace:PyTorch实战解析人脸识别中的角度间隔损失函数
1. 从Softmax到ArcFace:人脸识别损失函数的进化之路 人脸识别技术如今已经深入到我们生活的方方面面,从手机解锁到机场安检,背后都离不开一个关键环节——如何让模型学会区分不同的人脸。这就像教小朋友认人一样,我们需要告诉模型…...
如何利用WinRAR分卷压缩,轻松突破大文件传输限制
1. 为什么需要分卷压缩? 在日常工作和生活中,我们经常会遇到需要传输大文件的情况。比如设计师要发送PSD源文件给客户,程序员要分享开发环境的镜像,或者普通用户想通过邮件发送高清视频给亲友。但几乎所有主流传输平台都对单个文件…...
如何轻松解决软件授权难题?智能授权管理脚本全解析
如何轻松解决软件授权难题?智能授权管理脚本全解析 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 你是否曾经遇到过这样的情况:重要的办公软件突然提示授权过期…...
5分钟免费安装终极Markdown阅读器:浏览器最强文档查看解决方案
5分钟免费安装终极Markdown阅读器:浏览器最强文档查看解决方案 【免费下载链接】markdown-viewer Markdown Viewer / Browser Extension 项目地址: https://gitcode.com/gh_mirrors/ma/markdown-viewer Markdown Viewer是一款功能强大的浏览器扩展࿰…...
从零构建STM32蓝牙遥控车:基于CubeMX与HAL库的硬件驱动与无线通信详解
1. 项目概述与硬件准备 第一次接触STM32蓝牙遥控车项目时,我被这个看似复杂实则有趣的工程深深吸引了。这不仅仅是一个简单的遥控玩具,而是融合了嵌入式开发、无线通信、电机控制等多个技术领域的综合实践。对于初学者来说,完成这个项目能系统…...
Pega Helm Charts:Kubernetes上企业级低代码BPM平台部署指南
1. 项目概述:Pega Helm Charts 是什么,以及为什么你需要它如果你正在或计划在 Kubernetes 上部署 Pega Platform,那么pegasystems/pega-helm-charts这个项目就是你绕不开的“官方说明书”和“自动化部署工具箱”。简单来说,这是一…...
