跳至主要內容
Da-API平台-项目部署

前后端分离部署:原生部署、宝塔方式部署、Docker部署、工作流部署

  • 前端:npm run build项目打包

  • 后端:

    backend 项目:web 项目,部署 spring boot 的 jar 包(对外的)

    gateway 网关项目:web 项目,部署 spring boot 的 jar 包(对外的)

    interface 模拟接口项目:web 项目,部署 spring boot 的 jar 包(不建议对外暴露的)

    关键:网络必须要连通


holic-x...大约 30 分钟项目Da-API平台
Da-API平台-分布式改造&RPC

1.RPC框架引入

网关业务逻辑梳理

问题:网关项目比较纯净,没有操作数据库的包、并且还要调用之前项目写过的代码,复制粘贴维护麻烦。

理想:直接请求到其他项目的方法(调用)

​ 目前网关项目遇到一个问题,就是网关项目比较纯净,没有涉及数据库操作的包,但同时需要调用之前编写过的代码。尽管复制粘贴一开始并不麻烦,但是随着次数增多以及未来的修改维护,就变得相当繁琐了。(考虑系统迭代的可维护性和可扩展性)

​ 因此,理想情况就是希望能够直接请求 api-platform-backend 项目中的 invokeCount 方法,此处引入一个概念:远程过程调用(RPC)


holic-x...大约 23 分钟项目Da-API平台
Da-API平台-接口发布、在线调用

1.接口发布下线

【1】接口管理(发布、下线)

概念设计

(1)流程设计

​ 基于现有接口管理模块开发一个用于发布和下线接口的功能。本质上来说,就是改变每条接口数据的状态。在设计接口信息表时,之前已经预留了一个状态字段status。其中,关闭和开启分别对应接口的下线和上线。只有状态为 1 的接口才可以被用户调用,否则将无法调用。(优先后台接口开发,后续完善页面设计)

(2)功能设计

​ 开发发布接口和下线接口(仅管理员可操作这两个接口,防止用户越权操作)。大致规划一下思路:

​ 发布接口:这个接口需要执行哪些任务呢?首先需要验证接口是否存在,然后判断接口是否可调用,否则访问接口都是 404,影响用户体验。如果接口可以调用,需要修改数据库中该接口的状态为 1,表示接口已经被发布,状态默认为 0(关闭)。


holic-x...大约 22 分钟项目Da-API平台
CMS-动态公告(公告系统管理)

项目介绍

​ 构建通用动态公告系统,后端管理员统一维护公告信息,对外提供接口根据域名或者其他参数配置构建通告联系(关联通知对象,例如根据域名区分子系统等)。前台通过引入通用公告SDK组件(请求调用后台接口获取通知,封装弹窗组件获取公告信息),不同子系统接入只需要一行代码的形式即可完成接入。

项目源码


holic-x...大约 9 分钟项目itc
自定义通用组件开发

1.复制粘贴按钮组件(CopyButton)

components/Common/CopyButton.tsx

import React from 'react';
import { CopyOutlined } from '@ant-design/icons';
import { Button, message } from 'antd';

// 自定义复制按钮组件,传入text文件则可完成复制操作
const CopyButton = ({ text }) => {
  const copyToClipboard = () => {
    navigator.clipboard.writeText(text).then(
      () => message.success('复制成功'),
      () => message.error('复制失败')
    );
  };

  return (
    <Button icon={<CopyOutlined />} onClick={copyToClipboard}>
      复制
    </Button>
  );
};

export default CopyButton;


holic-x...小于 1 分钟项目itc
OJ 单机版沙箱

Docker沙箱改造

1.模板方法优化代码沙箱

先确认设计模式的应用场景和现有的业务场景是否匹配

模板方法概念

模版方法:定义一套通用的执行流程,让子类负责每个执行步骤的具体实现

模版方法的适用场景:适用于有规范的流程,且执行流程可以复用

作用:大幅节省重复代码量,便于项目扩展、更好维护

对比JavaNativeCodeSandbox、JavaDockerCodeSandbox的方法实现流程,基本都是遵循同样的一套思路,只不过可能每个步骤的实现细节可能有所不同


holic-x...大约 4 分钟项目oj-platform
OJ 基于Docker构建代码沙箱

​ 先配置好虚拟机环境,Docker在虚拟机环境上操作(也可使用远程服务器,如果是构建项目测试的话建议使用虚拟机,以免玩崩)

Docker核心

1.Docker基本概念

为什么要使用Docker技术?

为了提升系统的安全性,把不同的程序和宿主机进行隔离,是的某个程序(应用)的执行不会影响到系统本身

Docker 技术可以实现程序和宿主机的隔离

什么是容器?(可以把一个容器理解为一个新的电脑(定制化的操作系统))

​ 理解为对一系列应用程序、服务和环境的封装,从而把程序运行在一个隔离的、密闭的、隐私的空间内,对外整体提供服务。


holic-x...大约 30 分钟项目oj-platform
OJ 代码沙箱

​ 基于判题服务的构建,基本打通了用户提交问题记录的业务逻辑,前面的实现是基于Example代码沙箱,主要是为了打通业务逻辑而设定的存在,参考原有远程代码沙箱设计概念,可单独构建一个可执行程序用作用作远程代码沙箱执行操作

沙箱服务构建

​ 创建一个web项目,构建沙箱服务

  • Springboot:2.7.6

  • Maven:3.5.2

  • JDK版本:1.8版本(切换Server URL:https://start.aliyun.com)

  • 初始化引用依赖:Spring Web、lombok


holic-x...大约 26 分钟项目oj-platform
OJ 模块开发

04-模块开发

用户提交问卷信息查询

1.后端接口开发(todo)

扩展思考:后端接口响应慢的优化思路

​ 后端接口响应慢的优化思路:用逻辑操作替换频繁调用service请求(网络数据库交互)

​ 两端代码的分析:前者是一次性获取所有的内容,然后做逻辑处理;后者是每次遍历都访问一次数据库

2.前端组件开发

开发前端页面:

1)用户注册页面

2)创建题目页面(管理员)


holic-x...大约 13 分钟项目oj-platform
OJ 判题服务开发

判题模块预开发

​ 如何理解预开发概念:指的是先梳理开发框架和整体开发思路、架构设计,先把业务流程的架子先搭好,调通整个业务流程和基本逻辑,然后再实现优化

1.梳理判题模块和代码沙箱的关系

​ 构建思路:最简单的实现方式就是在同一个项目中通过代码调用的方式实现,为了让代码沙箱更具备通用性,将代码沙箱服务抽离出来,判题模块与其交互则通过http调用接口的方式进行验证,让这两个模块完全解耦

​ 判题模块:调用代码沙箱,把代码和输入交给代码沙箱去执行

​ 代码沙箱:只负责接受代码和输入,返回编译运行的结果,不负责判题(可以作为独立的项目/服务,提供给其他的需要执行代码的项目去使用)


holic-x...大约 17 分钟项目oj-platform