1.设置设备查看权限(每个公司只能查看自己购买的设备,未完善)

2.添加设备信息模块,可以选择设备查看详情(未添加实时数据部分)
3.添加教学视频模块,拉取b站系列中的视频
4.初步调整ui
This commit is contained in:
2026-03-31 17:46:40 +08:00
parent 0e2d75c23c
commit 2b8d5cc126
334 changed files with 2303 additions and 28691 deletions

View File

@@ -18,11 +18,11 @@
<dependencies>
<!-- spring-boot-devtools -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> <!-- 表示依赖不会传递 -->
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-devtools</artifactId>-->
<!-- <optional>true</optional> &lt;!&ndash; 表示依赖不会传递 &ndash;&gt;-->
<!-- </dependency>-->
<!-- spring-doc -->
<dependency>

View File

@@ -0,0 +1,71 @@
package com.ruoyi.web.controller;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Anonymous;
/**
* B站封面图片代理解决直接访问403的问题
*/
@RestController
@RequestMapping("/system/bili")
public class BiliImageProxyController {
@GetMapping("/cover")
@Anonymous
public ResponseEntity<byte[]> cover(@RequestParam("url") String urlStr) throws Exception {
if (urlStr != null) {
// 避免部分数据源返回 http 导致白名单不通过
urlStr = urlStr.replaceFirst("(?i)^http://", "https://");
}
// 简单防护只允许代理B站常见图片域名
if (urlStr == null
|| !(urlStr.startsWith("https://i0.hdslb.com/")
|| urlStr.startsWith("https://i1.hdslb.com/")
|| urlStr.startsWith("https://i2.hdslb.com/")
|| urlStr.startsWith("https://archive.biliimg.com/"))) {
return ResponseEntity.badRequest().build();
}
HttpURLConnection conn = (HttpURLConnection) new URL(urlStr).openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(8000);
conn.setReadTimeout(15000);
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
conn.setRequestProperty("Referer", "https://www.bilibili.com/");
conn.connect();
try (InputStream is = conn.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
byte[] buf = new byte[4096];
int len;
while ((len = is.read(buf)) != -1) {
baos.write(buf, 0, len);
}
byte[] body = baos.toByteArray();
String contentType = conn.getContentType();
if (contentType == null || !contentType.startsWith("image/")) {
contentType = MediaType.IMAGE_JPEG_VALUE;
}
return ResponseEntity.ok()
.header(HttpHeaders.CACHE_CONTROL, "public, max-age=86400")
.contentType(MediaType.parseMediaType(contentType))
.body(body);
} finally {
conn.disconnect();
}
}
}

View File

@@ -0,0 +1,56 @@
package com.ruoyi.web.controller;
import java.util.List;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.domain.DeviceInfo;
import com.ruoyi.system.service.IDeviceInfoService;
import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 设备基本信息Controller
*
* @author ruoyi
* @date 2026-03-31
*/
@RestController
@RequestMapping("/system/info")
public class DeviceInfoController extends BaseController
{
@Autowired
private IDeviceInfoService deviceInfoService;
@Autowired
private ISysDeptService deptService;
/**
* 查询设备基本信息列表
*/
@PreAuthorize("@ss.hasPermi('system:info:list')")
@GetMapping("/list")
public TableDataInfo list(DeviceInfo deviceInfo)
{
startPage();
List<DeviceInfo> list = deviceInfoService.selectDeviceInfoList(deviceInfo);
return getDataTable(list);
}
/**
* 获取设备基本信息详细信息
*/
@PreAuthorize("@ss.hasPermi('system:info:query')")
@GetMapping(value = "/{deviceId}")
public AjaxResult getInfo(@PathVariable("deviceId") Long deviceId)
{
DeviceInfo deviceInfo = deviceInfoService.selectDeviceInfoByDeviceId(deviceId);
deptService.checkDeptDataScope(deviceInfo.getDeptId());
return success(deviceInfo);
}
}

View File

@@ -0,0 +1,50 @@
package com.ruoyi.web.controller;
import java.util.List;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.domain.TeachingVideo;
import com.ruoyi.system.service.ITeachingVideoService;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 教学视频Controller
*
* @author ruoyi
* @date 2026-03-31
*/
@RestController
@RequestMapping("/system/video")
public class TeachingVideoController extends BaseController
{
@Autowired
private ITeachingVideoService teachingVideoService;
/**
* 查询教学视频列表
*/
@PreAuthorize("@ss.hasPermi('system:video:list')")
@GetMapping("/list")
public TableDataInfo list(TeachingVideo teachingVideo)
{
startPage();
List<TeachingVideo> list = teachingVideoService.selectTeachingVideoList(teachingVideo);
return getDataTable(list);
}
/**
* 获取教学视频详细信息
*/
@PreAuthorize("@ss.hasPermi('system:video:query')")
@GetMapping(value = "/{videoId}")
public AjaxResult getInfo(@PathVariable("videoId") Long videoId)
{
return success(teachingVideoService.selectTeachingVideoByVideoId(videoId));
}
}

View File

@@ -0,0 +1,23 @@
package com.ruoyi.web.task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.ruoyi.system.service.ITeachingVideoSyncService;
/**
* B站教学视频同步任务由若依定时任务调用
*
* invoke_target 示例biliVideoSyncTask.syncAll()
*/
@Component("biliVideoSyncTask")
public class BiliVideoSyncTask
{
@Autowired
private ITeachingVideoSyncService teachingVideoSyncService;
public void syncAll()
{
teachingVideoSyncService.syncAllEnabledSources();
}
}

View File

@@ -8,7 +8,7 @@ spring:
master:
url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: password
password: Yeyw35
# 从库数据源
slave:
# 从数据源开关/默认关闭

View File

@@ -1,147 +1,153 @@
# 项目相关配置
ruoyi:
# 名称
name: RuoYi
# 版本
version: 3.9.2
# 版权年份
copyrightYear: 2026
# 文件路径 示例( Windows配置D:/ruoyi/uploadPathLinux配置 /home/ruoyi/uploadPath
profile: D:/ruoyi/uploadPath
# 获取ip地址开关
addressEnabled: false
# 验证码类型 math 数字计算 char 字符验证
captchaType: math
# 开发环境配置
server:
# 服务器的HTTP端口默认为8080
port: 8080
servlet:
# 应用的访问路径
context-path: /
tomcat:
# tomcat的URI编码
uri-encoding: UTF-8
# 连接数满后的排队数默认为100
accept-count: 1000
threads:
# tomcat最大线程数默认为200
max: 800
# Tomcat启动初始化的线程数默认值10
min-spare: 100
# 日志配置
logging:
level:
com.ruoyi: debug
org.springframework: warn
# 用户配置
user:
password:
# 密码最大错误次数
maxRetryCount: 5
# 密码锁定时间默认10分钟
lockTime: 10
# Spring配置
spring:
# 资源信息
messages:
# 国际化资源文件路径
basename: i18n/messages
profiles:
active: druid
# 文件上传
servlet:
multipart:
# 单个文件大小
max-file-size: 10MB
# 设置总上传的文件大小
max-request-size: 20MB
jackson:
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss
# 服务模块
devtools:
restart:
# 热部署开关
enabled: true
data:
# redis 配置
redis:
# 地址
host: localhost
# 端口默认为6379
port: 6379
# 数据库索引
database: 0
# 密码
password:
# 连接超时时间
timeout: 10s
lettuce:
pool:
# 连接池中的最小空闲连接
min-idle: 0
# 连接池中的最大空闲连接
max-idle: 8
# 连接池的最大数据库连接数
max-active: 8
# #连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
# token配置
token:
# 令牌自定义标识
header: Authorization
# 令牌密钥
secret: abcdefghijklmnopqrstuvwxyz
# 令牌有效期默认30分钟
expireTime: 30
# MyBatis配置
mybatis:
# 搜索指定包别名
typeAliasesPackage: com.ruoyi.**.domain
# 配置mapper的扫描找到所有的mapper.xml映射文件
mapperLocations: classpath*:mapper/**/*Mapper.xml
# 加载全局的配置文件
configLocation: classpath:mybatis/mybatis-config.xml
# PageHelper分页插件
pagehelper:
helperDialect: mysql
supportMethodsArguments: true
params: count=countSql
# Springdoc配置
springdoc:
api-docs:
path: /v3/api-docs
swagger-ui:
enabled: true
path: /swagger-ui.html
tags-sorter: alpha
group-configs:
- group: 'default'
display-name: '测试模块'
paths-to-match: '/**'
packages-to-scan: com.ruoyi.web.controller.tool
# 防盗链配置
referer:
# 防盗链开关
enabled: false
# 允许的域名列表
allowed-domains: localhost,127.0.0.1,ruoyi.vip,www.ruoyi.vip
# 防止XSS攻击
xss:
# 过滤开关
enabled: true
# 排除链接(多个用逗号分隔)
excludes: /system/notice
# 匹配链接
urlPatterns: /system/*,/monitor/*,/tool/*
# 项目相关配置
ruoyi:
# 名称
name: RuoYi
# 版本
version: 3.9.2
# 版权年份
copyrightYear: 2026
# 文件路径 示例( Windows配置D:/ruoyi/uploadPathLinux配置 /home/ruoyi/uploadPath
profile: D:/ruoyi/uploadPath
# 获取ip地址开关
addressEnabled: false
# 验证码类型 math 数字计算 char 字符验证
captchaType: math
# 开发环境配置
server:
# 服务器的HTTP端口默认为8080
port: 8080
servlet:
# 应用的访问路径
context-path: /
tomcat:
# tomcat的URI编码
uri-encoding: UTF-8
# 连接数满后的排队数默认为100
accept-count: 1000
threads:
# tomcat最大线程数默认为200
max: 800
# Tomcat启动初始化的线程数默认值10
min-spare: 100
# 日志配置
logging:
level:
com.ruoyi: debug
org.springframework: warn
# 用户配置
user:
password:
# 密码最大错误次数
maxRetryCount: 5
# 密码锁定时间默认10分钟
lockTime: 10
# Spring配置
spring:
# 资源信息
messages:
# 国际化资源文件路径
basename: i18n/messages
profiles:
active: druid
# 文件上传
servlet:
multipart:
# 单个文件大小
max-file-size: 10MB
# 设置总上传的文件大小
max-request-size: 20MB
jackson:
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss
# 服务模块
devtools:
restart:
# 热部署开关
enabled: true
data:
# redis 配置
redis:
# 地址
host: 172.22.96.137
# 端口默认为6379
port: 16379
# 数据库索引
database: 0
# 密码
password:
# 连接超时时间
timeout: 10s
lettuce:
pool:
# 连接池中的最小空闲连接
min-idle: 0
# 连接池中的最大空闲连接
max-idle: 8
# 连接池的最大数据库连接数
max-active: 8
# #连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
quartz:
# 必须开启否则Scheduler会处于standby导致不执行任务
auto-startup: true
# 若依默认使用内存JobStore并在启动时从sys_job加载任务到Scheduler
job-store-type: memory
# token配置
token:
# 令牌自定义标识
header: Authorization
# 令牌密钥
secret: abcdefghijklmnopqrstuvwxyz
# 令牌有效期默认30分钟
expireTime: 30
# MyBatis配置
mybatis:
# 搜索指定包别名
typeAliasesPackage: com.ruoyi.**.domain
# 配置mapper的扫描找到所有的mapper.xml映射文件
mapperLocations: classpath*:mapper/**/*Mapper.xml
# 加载全局的配置文件
configLocation: classpath:mybatis/mybatis-config.xml
# PageHelper分页插件
pagehelper:
helperDialect: mysql
supportMethodsArguments: true
params: count=countSql
# Springdoc配置
springdoc:
api-docs:
path: /v3/api-docs
swagger-ui:
enabled: true
path: /swagger-ui.html
tags-sorter: alpha
group-configs:
- group: 'default'
display-name: '测试模块'
paths-to-match: '/**'
packages-to-scan: com.ruoyi.web.controller.tool
# 防盗链配置
referer:
# 防盗链开关
enabled: false
# 允许的域名列表
allowed-domains: localhost,127.0.0.1,ruoyi.vip,www.ruoyi.vip
# 防止XSS攻击
xss:
# 过滤开关
enabled: true
# 排除链接(多个用逗号分隔)
excludes: /system/notice
# 匹配链接
urlPatterns: /system/*,/monitor/*,/tool/*