mirror of
https://github.com/PlayEdu/PlayEdu
synced 2025-07-28 05:19:30 +08:00
Compare commits
7 Commits
92a9f85171
...
370cc361f6
Author | SHA1 | Date | |
---|---|---|---|
|
370cc361f6 | ||
|
b4647458ba | ||
|
1c2ed1e4df | ||
|
5fa072592a | ||
|
0a5286d026 | ||
|
bac04d164f | ||
|
6541c3a191 |
20
.dockerignore
Normal file
20
.dockerignore
Normal file
@ -0,0 +1,20 @@
|
||||
/playedu-pc/node_modules/
|
||||
/playedu-pc/dist/
|
||||
/playedu-pc/.env.local/
|
||||
/playedu-pc/.env.development/
|
||||
/playedu-pc/.env.production/
|
||||
/playedu-pc/build/
|
||||
|
||||
/playedu-h5/node_modules/
|
||||
/playedu-h5/dist/
|
||||
/playedu-h5/.env.local/
|
||||
/playedu-h5/.env.development/
|
||||
/playedu-h5/.env.production/
|
||||
/playedu-h5/build/
|
||||
|
||||
/playedu-admin/node_modules/
|
||||
/playedu-admin/dist/
|
||||
/playedu-admin/.env.local/
|
||||
/playedu-admin/.env.development/
|
||||
/playedu-admin/.env.production/
|
||||
/playedu-admin/build/
|
47
.github/workflows/build.yml
vendored
47
.github/workflows/build.yml
vendored
@ -1,47 +0,0 @@
|
||||
name: EstablishDockerImage
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- "*"
|
||||
|
||||
env:
|
||||
IMAGE_FQDN: registry.cn-hangzhou.aliyuncs.com/playedu/light
|
||||
IMAGE_TAG: ""
|
||||
|
||||
jobs:
|
||||
build-and-push:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v2
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
- name: Login to GHCR
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
registry: registry.cn-hangzhou.aliyuncs.com
|
||||
username: ${{ secrets.ALI_REGISTRY_EMAIL }}
|
||||
password: ${{ secrets.ALI_REGISTRY_PASS }}
|
||||
- name: Build
|
||||
uses: docker/build-push-action@v3
|
||||
with:
|
||||
context: .
|
||||
platforms: linux/amd64,linux/arm64
|
||||
push: true
|
||||
tags: |
|
||||
${{ env.IMAGE_FQDN }}:${{ env.IMAGE_TAG }}
|
||||
env:
|
||||
IMAGE_TAG: ${{ startsWith(github.ref, 'refs/heads/main') && 'latest' || startsWith(github.ref, 'refs/heads/dev') && 'dev' || github.ref_name }}
|
||||
if: startsWith(github.ref, 'refs/heads/')
|
||||
- name: Build with Tag
|
||||
uses: docker/build-push-action@v3
|
||||
with:
|
||||
context: .
|
||||
platforms: linux/amd64,linux/arm64
|
||||
push: true
|
||||
tags: |
|
||||
${{ env.IMAGE_FQDN }}:${{ github.ref_name }}
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
31
CHANGELOG.md
31
CHANGELOG.md
@ -1,13 +1,20 @@
|
||||
## v1.7 版本更新
|
||||
## 1.8 版本更新
|
||||
|
||||
- 新增:[API]MinIO配置信息增加环境变量的读取
|
||||
- 新增:[API]学员学习权限优化
|
||||
- 新增:[后台]后台首页增加课件数量的显示
|
||||
- 新增:[后台]线上课列表增加创建人字段
|
||||
- 优化:[后台]学员部门包含子部门所有学员数量
|
||||
- 优化:[API]根据分类ID获取所有子分类的课程
|
||||
- 优化:[API]根据部门ID获取所有父级部门的课程
|
||||
- 优化:[后台]部门指派器
|
||||
- 优化:[PC]视频播放器去除右键点击
|
||||
- 优化:[PC]首页学习时长去掉秒
|
||||
- 优化:[H5]首页tab切换优化
|
||||
- 优化:[API]日志输出
|
||||
- 优化:[API]LDAP的部门同步逻辑
|
||||
- 优化:[API]LDAP的用户同步逻辑
|
||||
- 优化:[其它]`docker`镜像更换为阿里云加速
|
||||
|
||||
## 1.7 版本更新
|
||||
|
||||
- 新增:[API]MinIO配置信息增加环境变量的读取
|
||||
- 新增:[API]学员学习权限优化
|
||||
- 新增:[后台]后台首页增加课件数量的显示
|
||||
- 新增:[后台]线上课列表增加创建人字段
|
||||
- 优化:[后台]学员部门包含子部门所有学员数量
|
||||
- 优化:[API]根据分类ID获取所有子分类的课程
|
||||
- 优化:[API]根据部门ID获取所有父级部门的课程
|
||||
- 优化:[后台]部门指派器
|
||||
- 优化:[PC]视频播放器去除右键点击
|
||||
- 优化:[PC]首页学习时长去掉秒
|
||||
- 优化:[H5]首页tab切换优化
|
26
Dockerfile
26
Dockerfile
@ -1,15 +1,9 @@
|
||||
FROM node:20-alpine as NodeBuilder
|
||||
|
||||
RUN yarn config set registry https://registry.npmmirror.com &&\
|
||||
yarn global add pnpm &&\
|
||||
pnpm config set registry https://registry.npmmirror.com
|
||||
FROM registry.cn-hangzhou.aliyuncs.com/hzbs/node:20-alpine AS node-builder
|
||||
|
||||
COPY playedu-admin /app/admin
|
||||
COPY playedu-pc /app/pc
|
||||
COPY playedu-h5 /app/h5
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
WORKDIR /app/admin
|
||||
RUN pnpm i && VITE_APP_URL=/api/ pnpm build
|
||||
|
||||
@ -19,7 +13,7 @@ RUN pnpm i && VITE_APP_URL=/api/ pnpm build
|
||||
WORKDIR /app/h5
|
||||
RUN pnpm i && VITE_APP_URL=/api/ pnpm build
|
||||
|
||||
FROM eclipse-temurin:17 as javaBuilder
|
||||
FROM registry.cn-hangzhou.aliyuncs.com/hzbs/eclipse-temurin:17 AS java-builder
|
||||
|
||||
COPY playedu-api /app
|
||||
|
||||
@ -27,19 +21,13 @@ WORKDIR /app
|
||||
|
||||
RUN /app/mvnw -Dmaven.test.skip=true clean package
|
||||
|
||||
FROM eclipse-temurin:17
|
||||
FROM registry.cn-hangzhou.aliyuncs.com/hzbs/eclipse-temurin:17 AS base
|
||||
|
||||
LABEL maintainer="滕勇志 <tengyongzhi@meedu.vip>"
|
||||
COPY --from=java-builder /app/playedu-api/target/playedu-api.jar /app/api/app.jar
|
||||
|
||||
RUN echo "Asia/Shanghai" > /etc/timezone
|
||||
|
||||
RUN apt update && apt install -y nginx
|
||||
|
||||
COPY --from=javaBuilder /app/playedu-api/target/playedu-api.jar /app/api/app.jar
|
||||
|
||||
COPY --from=NodeBuilder /app/admin/dist /app/admin
|
||||
COPY --from=NodeBuilder /app/pc/dist /app/pc
|
||||
COPY --from=NodeBuilder /app/h5/dist /app/h5
|
||||
COPY --from=node-builder /app/admin/dist /app/admin
|
||||
COPY --from=node-builder /app/pc/dist /app/pc
|
||||
COPY --from=node-builder /app/h5/dist /app/h5
|
||||
|
||||
COPY docker/nginx/conf/nginx.conf /etc/nginx/sites-enabled/default
|
||||
|
||||
|
@ -14,13 +14,13 @@ networks:
|
||||
|
||||
volumes:
|
||||
mysql-data:
|
||||
mysql-conf:
|
||||
redis-data:
|
||||
minio-data:
|
||||
|
||||
services:
|
||||
playedu:
|
||||
image: registry.cn-hangzhou.aliyuncs.com/playedu/light:1.7
|
||||
# build: .
|
||||
image: registry.cn-hangzhou.aliyuncs.com/playedu/light:1.8
|
||||
restart: always
|
||||
environment:
|
||||
- DB_HOST=mysql
|
||||
@ -39,6 +39,8 @@ services:
|
||||
- "${PLAYEDU_PC_PORT:-9800}:9800"
|
||||
- "${PLAYEDU_H5_PORT:-9801}:9801"
|
||||
- "${PLAYEDU_ADMIN_PORT:-9900}:9900"
|
||||
volumes:
|
||||
- "./docker/data/:/playedu-data/"
|
||||
networks:
|
||||
- playedu
|
||||
depends_on:
|
||||
@ -67,7 +69,6 @@ services:
|
||||
- TZ=UTC
|
||||
volumes:
|
||||
- mysql-data:/var/lib/mysql
|
||||
- mysql-conf:/etc/mysql/conf.d
|
||||
# ports:
|
||||
# - "${MYSQL_PORT:-3306}:3306"
|
||||
networks:
|
||||
@ -75,7 +76,7 @@ services:
|
||||
logging: *default-logging
|
||||
|
||||
minio:
|
||||
image: bitnami/minio:latest
|
||||
image: registry.cn-hangzhou.aliyuncs.com/hzbs/bitnami-minio:2024.6.6
|
||||
restart: always
|
||||
environment:
|
||||
- MINIO_ROOT_USER=${MINIO_ROOT_USERNAME:-username}
|
||||
|
2
docker/data/.gitignore
vendored
Normal file
2
docker/data/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
*
|
||||
!.gitignore
|
13
docker/maven/settings.xml
Normal file
13
docker/maven/settings.xml
Normal file
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
|
||||
<mirrors>
|
||||
<mirror>
|
||||
<id>nexus-aliyun</id>
|
||||
<mirrorOf>*</mirrorOf>
|
||||
<name>Nexus aliyun</name>
|
||||
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
|
||||
</mirror>
|
||||
</mirrors>
|
||||
</settings>
|
@ -1,18 +1,5 @@
|
||||
FROM mysql:8.1
|
||||
FROM registry.cn-hangzhou.aliyuncs.com/hzbs/mysql:8.1
|
||||
|
||||
# 时区配置
|
||||
ARG TZ=UTC
|
||||
ENV TZ ${TIMEZONE}
|
||||
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ >/etc/timezone && chown -R mysql:root /var/lib/mysql/
|
||||
|
||||
# 复制自定义的my.cnf
|
||||
COPY my.cnf /etc/mysql/conf.d/my.cnf
|
||||
|
||||
# my.cnf只读权限
|
||||
RUN chmod 0444 /etc/mysql/conf.d/my.cnf
|
||||
|
||||
# 暴露3306端口
|
||||
EXPOSE 3306
|
||||
|
||||
# 启动mysql
|
||||
CMD ["mysqld"]
|
||||
RUN chmod 0444 /etc/mysql/conf.d/my.cnf
|
@ -1,21 +1,11 @@
|
||||
client_max_body_size 50m;
|
||||
|
||||
server {
|
||||
# 监听端口号9800
|
||||
listen 9800;
|
||||
# 禁用绝对重定向
|
||||
# 如果没有设置该配置项,当Nginx重定向时,它将使用绝对路径,这意味着当用户访问一个虚拟主机时
|
||||
# Nginx可能会将他们重定向到另一个主机的URL,这可能会导致安全问题和用户体验问题。因此,通过
|
||||
# 设置 absolute_redirect off ,Nginx将使用相对路径进行重定向,以确保用户在同一主机上进
|
||||
# 行重定向,而不会遇到上述问题。
|
||||
absolute_redirect off;
|
||||
# 匹配任何主机名
|
||||
server_name _;
|
||||
# 指定Web应用程序的根目录
|
||||
root /app/pc;
|
||||
# 指定默认的索引文件为index.html
|
||||
index index.html;
|
||||
# 启用gzip压缩
|
||||
|
||||
gzip on;
|
||||
gzip_static on;
|
||||
gzip_buffers 4 16k;
|
||||
@ -24,35 +14,23 @@ server {
|
||||
gzip_types text/plain application/javascript text/css application/xml text/javascript;
|
||||
gzip_vary on;
|
||||
|
||||
# 将所有以/api/开头的请求代理到本地地址为127.0.0.1:9898的Web应用程序后端服务器
|
||||
location /api/ {
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_pass http://127.0.0.1:9898/;
|
||||
}
|
||||
|
||||
# 处理所有不以/api/开头的请求,尝试查找匹配的文件,如果没有找到则返回index.html
|
||||
location ~* ^/(?![api].*) {
|
||||
try_files $uri /index.html;
|
||||
}
|
||||
}
|
||||
|
||||
server {
|
||||
# 监听端口号9801
|
||||
listen 9801;
|
||||
# 禁用绝对重定向
|
||||
# 如果没有设置该配置项,当Nginx重定向时,它将使用绝对路径,这意味着当用户访问一个虚拟主机时
|
||||
# Nginx可能会将他们重定向到另一个主机的URL,这可能会导致安全问题和用户体验问题。因此,通过
|
||||
# 设置 absolute_redirect off ,Nginx将使用相对路径进行重定向,以确保用户在同一主机上进
|
||||
# 行重定向,而不会遇到上述问题。
|
||||
absolute_redirect off;
|
||||
# 匹配任何主机名
|
||||
server_name _;
|
||||
# 指定Web应用程序的根目录
|
||||
root /app/h5;
|
||||
# 指定默认的索引文件为index.html
|
||||
index index.html;
|
||||
# 启用gzip压缩
|
||||
|
||||
gzip on;
|
||||
gzip_static on;
|
||||
gzip_buffers 4 16k;
|
||||
@ -61,35 +39,23 @@ server {
|
||||
gzip_types text/plain application/javascript text/css application/xml text/javascript;
|
||||
gzip_vary on;
|
||||
|
||||
# 将所有以/api/开头的请求代理到本地地址为127.0.0.1:9898的Web应用程序后端服务器
|
||||
location /api/ {
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_pass http://127.0.0.1:9898/;
|
||||
}
|
||||
|
||||
# 处理所有不以/api/开头的请求,尝试查找匹配的文件,如果没有找到则返回index.html
|
||||
location ~* ^/(?![api].*) {
|
||||
try_files $uri /index.html;
|
||||
}
|
||||
}
|
||||
|
||||
server {
|
||||
# 监听端口号9900
|
||||
listen 9900;
|
||||
# 禁用绝对重定向
|
||||
# 如果没有设置该配置项,当Nginx重定向时,它将使用绝对路径,这意味着当用户访问一个虚拟主机时
|
||||
# Nginx可能会将他们重定向到另一个主机的URL,这可能会导致安全问题和用户体验问题。因此,通过
|
||||
# 设置 absolute_redirect off ,Nginx将使用相对路径进行重定向,以确保用户在同一主机上进
|
||||
# 行重定向,而不会遇到上述问题。
|
||||
absolute_redirect off;
|
||||
# 匹配任何主机名
|
||||
server_name _;
|
||||
# 指定Web应用程序的根目录
|
||||
root /app/admin;
|
||||
# 指定默认的索引文件为index.html
|
||||
index index.html;
|
||||
# 启用gzip压缩
|
||||
|
||||
gzip on;
|
||||
gzip_static on;
|
||||
gzip_buffers 4 16k;
|
||||
@ -98,14 +64,12 @@ server {
|
||||
gzip_types text/plain application/javascript text/css application/xml text/javascript;
|
||||
gzip_vary on;
|
||||
|
||||
# 将所有以/api/开头的请求代理到本地地址为127.0.0.1:9898的Web应用程序后端服务器
|
||||
location /api/ {
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_pass http://127.0.0.1:9898/;
|
||||
}
|
||||
|
||||
# 处理所有不以/api/开头的请求,尝试查找匹配的文件,如果没有找到则返回index.html
|
||||
location ~* ^/(?![api].*) {
|
||||
try_files $uri /index.html;
|
||||
}
|
||||
@ -113,16 +77,11 @@ server {
|
||||
|
||||
|
||||
server {
|
||||
# 监听端口号80
|
||||
listen 9700;
|
||||
# 匹配任何主机名
|
||||
server_name _;
|
||||
# 指定Web应用程序的根目录
|
||||
root /app/pc;
|
||||
# 指定默认的索引文件为index.html
|
||||
index index.html;
|
||||
|
||||
# 将所有请求代理到本地地址为127.0.0.1:9898的Web应用程序后端服务器
|
||||
location / {
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
|
@ -1,9 +1,3 @@
|
||||
FROM redis:7.0.12
|
||||
FROM registry.cn-hangzhou.aliyuncs.com/hzbs/redis:7.0.12
|
||||
|
||||
COPY redis.conf /usr/local/etc/redis/redis.conf
|
||||
|
||||
VOLUME /data
|
||||
|
||||
EXPOSE 6379
|
||||
|
||||
CMD ["redis-server", "/usr/local/etc/redis/redis.conf"]
|
||||
COPY redis.conf /usr/local/etc/redis/redis.conf
|
@ -1,3 +0,0 @@
|
||||
/node_modules
|
||||
/build
|
||||
/dist
|
4
playedu-admin/.gitignore
vendored
4
playedu-admin/.gitignore
vendored
@ -32,6 +32,4 @@ deploy-test.sh
|
||||
deploy-prod.sh
|
||||
deploy-demo.sh
|
||||
|
||||
dist/
|
||||
|
||||
pnpm-lock.yaml
|
||||
dist/
|
@ -1,13 +0,0 @@
|
||||
FROM node:lts-slim as builder
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY . /app
|
||||
|
||||
RUN yarn config set registry https://registry.npm.taobao.org && yarn && yarn build
|
||||
|
||||
FROM nginx:1.23.4-alpine-slim
|
||||
|
||||
COPY --from=builder /app/dist /usr/share/nginx/html
|
||||
|
||||
COPY --from=builder /app/docker/nginx.conf /etc/nginx/nginx.conf
|
@ -1,83 +0,0 @@
|
||||
|
||||
user nginx;
|
||||
worker_processes auto;
|
||||
|
||||
error_log /var/log/nginx/error.log notice;
|
||||
pid /var/run/nginx.pid;
|
||||
|
||||
|
||||
events {
|
||||
worker_connections 32000;
|
||||
}
|
||||
|
||||
|
||||
http {
|
||||
include /etc/nginx/mime.types;
|
||||
default_type application/octet-stream;
|
||||
|
||||
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
||||
'$status $body_bytes_sent "$http_referer" '
|
||||
'"$http_user_agent" "$http_x_forwarded_for"';
|
||||
|
||||
access_log /var/log/nginx/access.log main;
|
||||
|
||||
sendfile on;
|
||||
#tcp_nopush on;
|
||||
|
||||
keepalive_timeout 65;
|
||||
|
||||
#开启gzip
|
||||
gzip on;
|
||||
#低于1kb的资源不压缩
|
||||
gzip_min_length 1k;
|
||||
#压缩级别1-9,越大压缩率越高,同时消耗cpu资源也越多,建议设置在5左右。
|
||||
gzip_comp_level 5;
|
||||
#需要压缩哪些响应类型的资源,多个空格隔开。不建议压缩图片.
|
||||
gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css;
|
||||
#配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
|
||||
gzip_disable "MSIE [1-6]\.";
|
||||
#是否添加“Vary: Accept-Encoding”响应头
|
||||
gzip_vary on;
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
listen [::]:80;
|
||||
server_name localhost;
|
||||
root /usr/share/nginx/html;
|
||||
index index.html index.htm;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
#禁止访问的文件或目录
|
||||
location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md)
|
||||
{
|
||||
return 404;
|
||||
}
|
||||
|
||||
#一键申请SSL证书验证目录相关设置
|
||||
location ~ \.well-known{
|
||||
allow all;
|
||||
}
|
||||
|
||||
#禁止在证书验证目录放入敏感文件
|
||||
if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {
|
||||
return 403;
|
||||
}
|
||||
|
||||
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
|
||||
{
|
||||
expires 30d;
|
||||
error_log /dev/null;
|
||||
access_log /dev/null;
|
||||
}
|
||||
|
||||
location ~ .*\.(js|css)?$
|
||||
{
|
||||
expires 12h;
|
||||
error_log /dev/null;
|
||||
access_log /dev/null;
|
||||
}
|
||||
}
|
||||
}
|
2126
playedu-admin/pnpm-lock.yaml
generated
Normal file
2126
playedu-admin/pnpm-lock.yaml
generated
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,2 +1,2 @@
|
||||
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.6/apache-maven-3.8.6-bin.zip
|
||||
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar
|
||||
distributionUrl=https://download.playeduos.com/apache-maven-3.8.6-bin.zip
|
||||
wrapperUrl=https://download.playeduos.com/maven-wrapper-3.1.0.jar
|
||||
|
@ -1,4 +1,4 @@
|
||||
FROM eclipse-temurin:17 as builder
|
||||
FROM registry.cn-hangzhou.aliyuncs.com/hzbs/eclipse-temurin:17 AS builder
|
||||
|
||||
COPY . /app
|
||||
|
||||
@ -6,20 +6,14 @@ WORKDIR /app
|
||||
|
||||
RUN /app/mvnw -Dmaven.test.skip=true clean package
|
||||
|
||||
FROM eclipse-temurin:17
|
||||
FROM registry.cn-hangzhou.aliyuncs.com/hzbs/eclipse-temurin:17 AS base
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# 使用东八区时间环境
|
||||
RUN echo "Asia/Shanghai" > /etc/timezone
|
||||
|
||||
# 将指定目录下的jar包复制到docker容器的/目录下
|
||||
COPY --from=builder /app/playedu-api/target/playedu-api.jar /app/app.jar
|
||||
|
||||
RUN chmod +x /app/app.jar
|
||||
|
||||
# 声明服务运行在8080端口
|
||||
EXPOSE 9898
|
||||
EXPOSE 9898/tcp
|
||||
|
||||
# 指定docker容器启动时运行jar包
|
||||
ENTRYPOINT ["java", "-jar", "/app/app.jar"]
|
||||
|
@ -1,17 +1,11 @@
|
||||
FROM eclipse-temurin:17
|
||||
FROM registry.cn-hangzhou.aliyuncs.com/hzbs/eclipse-temurin:17
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# 使用东八区时间环境
|
||||
RUN echo "Asia/Shanghai" > /etc/timezone
|
||||
|
||||
# 将指定目录下的jar包复制到docker容器的/目录下
|
||||
COPY ./playedu-api/target/playedu-api.jar /app/app.jar
|
||||
|
||||
RUN chmod +x /app/app.jar
|
||||
|
||||
# 声明服务运行在8080端口
|
||||
EXPOSE 9898
|
||||
EXPOSE 9898/tcp
|
||||
|
||||
# 指定docker容器启动时运行jar包
|
||||
ENTRYPOINT ["java", "-jar", "app.jar"]
|
||||
|
@ -1,202 +0,0 @@
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright 2023 杭州白书科技有限公司
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
@ -67,6 +67,9 @@ public class LoginBus {
|
||||
public HashMap<String, Object> tokenByLdapTransformUser(LdapTransformUser ldapTransformUser)
|
||||
throws ServiceException {
|
||||
User user = ldapBus.singleUserSync(ldapTransformUser, appConfigService.defaultAvatar());
|
||||
if (user == null) {
|
||||
throw new ServiceException("用户状态异常,无法登录!");
|
||||
}
|
||||
return tokenByUser(user);
|
||||
}
|
||||
}
|
||||
|
@ -119,14 +119,7 @@ public class LoginController {
|
||||
|
||||
try {
|
||||
LdapTransformUser ldapTransformUser =
|
||||
LdapUtil.loginByMailOrUid(
|
||||
ldapConfig.getUrl(),
|
||||
ldapConfig.getAdminUser(),
|
||||
ldapConfig.getAdminPass(),
|
||||
ldapConfig.getBaseDN(),
|
||||
mail,
|
||||
uid,
|
||||
req.getPassword());
|
||||
LdapUtil.loginByMailOrUid(ldapConfig, mail, uid, req.getPassword());
|
||||
if (ldapTransformUser == null) {
|
||||
return JsonResponse.error("登录失败.请检查账号和密码");
|
||||
}
|
||||
|
@ -53,8 +53,6 @@ mybatis:
|
||||
mybatis-plus:
|
||||
global-config:
|
||||
banner: false
|
||||
# configuration:
|
||||
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
|
||||
|
||||
sa-token:
|
||||
token-name: "Authorization"
|
||||
@ -63,7 +61,9 @@ sa-token:
|
||||
is-share: false
|
||||
jwt-secret-key: "playeduxyz"
|
||||
token-prefix: "Bearer"
|
||||
is-log: false
|
||||
is-print: false
|
||||
is-log: true
|
||||
log-level: "warn"
|
||||
|
||||
playedu:
|
||||
core:
|
||||
|
@ -28,7 +28,6 @@ import xyz.playedu.common.exception.NotFoundException;
|
||||
import xyz.playedu.common.service.*;
|
||||
import xyz.playedu.common.types.LdapConfig;
|
||||
import xyz.playedu.common.util.HelperUtil;
|
||||
import xyz.playedu.common.util.StringUtil;
|
||||
import xyz.playedu.common.util.ldap.LdapTransformDepartment;
|
||||
import xyz.playedu.common.util.ldap.LdapTransformUser;
|
||||
import xyz.playedu.common.util.ldap.LdapUtil;
|
||||
@ -63,11 +62,7 @@ public class LDAPBus {
|
||||
LdapConfig ldapConfig = appConfigService.ldapConfig();
|
||||
|
||||
List<LdapTransformDepartment> ouList =
|
||||
LdapUtil.departments(
|
||||
ldapConfig.getUrl(),
|
||||
ldapConfig.getAdminUser(),
|
||||
ldapConfig.getAdminPass(),
|
||||
ldapConfig.getBaseDN());
|
||||
LdapUtil.departments(ldapConfig, ldapConfig.getBaseDN());
|
||||
|
||||
if (ouList == null || ouList.isEmpty()) {
|
||||
return;
|
||||
@ -80,6 +75,7 @@ public class LDAPBus {
|
||||
|
||||
// 本地缓存表
|
||||
HashMap<String, Integer> depIdKeyByName = new HashMap<>();
|
||||
|
||||
// 全局排序计数
|
||||
Integer sort = 0;
|
||||
|
||||
@ -90,20 +86,25 @@ public class LDAPBus {
|
||||
String[] tmpChains = dn.replace("ou=", "").split(",");
|
||||
String prevName = "";
|
||||
|
||||
log.info("#####START#####[dn:{},uuid:{}]", dn, uuid);
|
||||
|
||||
// 同步记录
|
||||
LdapDepartment tmpLdapDepartment = ldapDepartments.get(uuid);
|
||||
if (tmpLdapDepartment != null && tmpLdapDepartment.getDn().equals(dn)) {
|
||||
// 当前部门已经同步 && 未发生改变
|
||||
log.info("LDAP-部门同步处理-未发生改变|dn:{}", dn);
|
||||
continue;
|
||||
}
|
||||
|
||||
// 执行到这里的有两种情况:
|
||||
// 1.部门未同步
|
||||
// 2.部门已同步,但是发生了变化
|
||||
// 2.1 部门名称修改
|
||||
// 2.2 部门上级修改
|
||||
// |-2.1 部门名称修改
|
||||
// |-2.2 部门上级名称修改
|
||||
// |-2.3 层级发生变动(增加层级|减少层级)
|
||||
|
||||
int length = tmpChains.length;
|
||||
|
||||
for (int i = 0; i < length; i++) {
|
||||
sort++;
|
||||
int parentId = 0;
|
||||
@ -118,34 +119,75 @@ public class LDAPBus {
|
||||
parentId = depIdKeyByName.get(prevName);
|
||||
}
|
||||
|
||||
// 最后一个记录 && 已存在部门-发生了变动
|
||||
log.info(
|
||||
"LDAP-部门同步处理-链处理|ctx=[dn={},fullName:{},tmpName:{},parentId:{},sort:{}]",
|
||||
dn,
|
||||
fullName,
|
||||
tmpName,
|
||||
parentId,
|
||||
sort);
|
||||
|
||||
if (i + 1 == length && tmpLdapDepartment != null) {
|
||||
// OU链发生了改变
|
||||
// 1.部门名改变
|
||||
// 2.上级部门名改变
|
||||
// 3.层级改变
|
||||
|
||||
log.info("LDAP-部门同步处理-OU链发生改变|ctx=[新:{},旧:{}]", dn, tmpLdapDepartment.getDn());
|
||||
|
||||
Department tmpDepartment =
|
||||
departmentService.findOrFail(tmpLdapDepartment.getDepartmentId());
|
||||
departmentService.update(tmpDepartment, tmpName, parentId, sort);
|
||||
if (!tmpDepartment.getName().equals(tmpName)
|
||||
|| !tmpLdapDepartment
|
||||
.getDn()
|
||||
.replace("ou=" + tmpName, "")
|
||||
.equals(dn.replaceAll("ou=" + tmpName, ""))) {
|
||||
departmentService.update(tmpDepartment, tmpName, parentId, sort);
|
||||
}
|
||||
|
||||
// 更新同步记录
|
||||
tmpLdapDepartment.setDn(dn); // 最新的DN
|
||||
ldapDepartmentService.updateDnById(tmpLdapDepartment.getId(), dn);
|
||||
// 更新本地缓存
|
||||
ldapDepartments.put(uuid, tmpLdapDepartment);
|
||||
// 更新本地缓存
|
||||
depIdKeyByName.put(fullName, tmpDepartment.getId());
|
||||
} else {
|
||||
// 检查本地是否有缓存
|
||||
Integer depId = depIdKeyByName.get(fullName);
|
||||
log.info("LDAP-部门同步处理-从缓存查询depId|ctx=[fullName:{},depId:{}]", fullName, depId);
|
||||
if (depId == null) {
|
||||
Department tmpDep = departmentService.findByName(tmpName, parentId);
|
||||
if (tmpDep != null) {
|
||||
depId = tmpDep.getId();
|
||||
log.info(
|
||||
"LDAP-部门同步处理-从数据库查询depId|ctx=[fullName:{},depId:{}]",
|
||||
fullName,
|
||||
depId);
|
||||
} else {
|
||||
depId = departmentService.create(tmpName, parentId, sort);
|
||||
// 创建同步记录
|
||||
ldapDepartmentService.create(depId, uuid, dn);
|
||||
log.info(
|
||||
"LDAP-部门同步处理-新建部门|ctx=[fullName:{},depId:{}]", fullName, depId);
|
||||
}
|
||||
|
||||
// 写入本地缓存
|
||||
depIdKeyByName.put(fullName, depId);
|
||||
// 写入本地缓存
|
||||
LdapDepartment storedLdapDepartment = new LdapDepartment();
|
||||
storedLdapDepartment.setUuid(uuid);
|
||||
storedLdapDepartment.setDn(dn);
|
||||
storedLdapDepartment.setDepartmentId(depId);
|
||||
ldapDepartments.put(uuid, storedLdapDepartment);
|
||||
}
|
||||
}
|
||||
|
||||
if (i + 1 == length && tmpLdapDepartment == null) {
|
||||
Integer tmpDepId = depIdKeyByName.get(fullName);
|
||||
// 创建同步记录
|
||||
ldapDepartmentService.create(tmpDepId, uuid, dn);
|
||||
|
||||
// 写入本地缓存
|
||||
LdapDepartment storedLdapDepartment = new LdapDepartment();
|
||||
storedLdapDepartment.setUuid(uuid);
|
||||
storedLdapDepartment.setDn(dn);
|
||||
storedLdapDepartment.setDepartmentId(tmpDepId);
|
||||
ldapDepartments.put(uuid, storedLdapDepartment);
|
||||
}
|
||||
|
||||
// 父级叠加
|
||||
prevName = fullName;
|
||||
}
|
||||
@ -155,23 +197,20 @@ public class LDAPBus {
|
||||
List<String> uuidList = ouList.stream().map(LdapTransformDepartment::getUuid).toList();
|
||||
List<LdapDepartment> ldapDepartmentList =
|
||||
ldapDepartmentService.notChunkByUUIDList(uuidList);
|
||||
for (LdapDepartment ldapDepartment : ldapDepartmentList) {
|
||||
// 删除本地部门
|
||||
departmentService.destroy(ldapDepartment.getDepartmentId());
|
||||
// 删除关联记录
|
||||
ldapDepartmentService.destroy(ldapDepartment.getId());
|
||||
if (ldapDepartmentList != null && !ldapDepartmentList.isEmpty()) {
|
||||
for (LdapDepartment ldapDepartment : ldapDepartmentList) {
|
||||
// 删除本地部门
|
||||
departmentService.destroy(ldapDepartment.getDepartmentId());
|
||||
// 删除同步记录
|
||||
ldapDepartmentService.destroy(ldapDepartment.getId());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void userSync() throws NamingException, IOException {
|
||||
LdapConfig ldapConfig = appConfigService.ldapConfig();
|
||||
|
||||
List<LdapTransformUser> userList =
|
||||
LdapUtil.users(
|
||||
ldapConfig.getUrl(),
|
||||
ldapConfig.getAdminUser(),
|
||||
ldapConfig.getAdminPass(),
|
||||
ldapConfig.getBaseDN());
|
||||
List<LdapTransformUser> userList = LdapUtil.users(ldapConfig, ldapConfig.getBaseDN());
|
||||
|
||||
if (userList == null || userList.isEmpty()) {
|
||||
return;
|
||||
@ -181,6 +220,10 @@ public class LDAPBus {
|
||||
|
||||
for (LdapTransformUser ldapTransformUser : userList) {
|
||||
if (ldapTransformUser.isBan()) {
|
||||
log.info(
|
||||
"LDAP-用户同步-用户被禁止|ctx=[dn:{},uuid={}]",
|
||||
ldapTransformUser.getDn(),
|
||||
ldapTransformUser.getId());
|
||||
continue;
|
||||
}
|
||||
singleUserSync(ldapTransformUser, defaultAvatar);
|
||||
@ -188,6 +231,11 @@ public class LDAPBus {
|
||||
}
|
||||
|
||||
public User singleUserSync(LdapTransformUser ldapTransformUser, String defaultAvatar) {
|
||||
log.info(
|
||||
"*****START*****LDAP-用户同步-开始|ctx=[dn:{},uuid:{}]",
|
||||
ldapTransformUser.getDn(),
|
||||
ldapTransformUser.getId());
|
||||
|
||||
// LDAP用户的名字
|
||||
String ldapUserName = ldapTransformUser.getCn();
|
||||
|
||||
@ -195,23 +243,24 @@ public class LDAPBus {
|
||||
Integer depId = departmentService.createWithChainList(ldapTransformUser.getOu());
|
||||
Integer[] depIds = depId == 0 ? null : new Integer[] {depId};
|
||||
|
||||
// LDAP用户在本地的缓存记录
|
||||
LdapUser ldapUser = ldapUserService.findByUUID(ldapTransformUser.getId());
|
||||
User user;
|
||||
|
||||
// LDAP同步记录
|
||||
LdapUser ldapUser = ldapUserService.findByUUID(ldapTransformUser.getId());
|
||||
|
||||
// 计算将LDAP用户关联到本地users表的email字段值
|
||||
String localUserEmail = ldapTransformUser.getUid();
|
||||
if (StringUtil.isNotEmpty(ldapTransformUser.getEmail())) {
|
||||
localUserEmail = ldapTransformUser.getEmail();
|
||||
}
|
||||
|
||||
if (ldapUser == null) {
|
||||
// 检测localUserEmail是否存在
|
||||
if (userService.find(localUserEmail) != null) {
|
||||
localUserEmail = HelperUtil.randomString(5) + "_" + localUserEmail;
|
||||
log.info("LDAP-用户同步-email重复|ctx=[email:{}]", localUserEmail);
|
||||
return null;
|
||||
}
|
||||
// LDAP用户数据缓存到本地
|
||||
|
||||
// 创建同步记录
|
||||
ldapUser = ldapUserService.store(ldapTransformUser);
|
||||
|
||||
// 创建本地user
|
||||
user =
|
||||
userService.createWithDepIds(
|
||||
@ -221,11 +270,26 @@ public class LDAPBus {
|
||||
HelperUtil.randomString(10),
|
||||
"",
|
||||
depIds);
|
||||
|
||||
// 将LDAP缓存数据与本地user关联
|
||||
ldapUserService.updateUserId(ldapUser.getId(), user.getId());
|
||||
|
||||
log.info(
|
||||
"LDAP-用户同步-录入数据|ctx=[userId:{},ldapUserId:{}]", user.getId(), ldapUser.getId());
|
||||
} else {
|
||||
log.info(
|
||||
"LDAP-用户同步-检测变化值|ctx=[新dn:{},旧dn:{}]",
|
||||
ldapTransformUser.getDn(),
|
||||
ldapUser.getDn());
|
||||
|
||||
user = userService.find(ldapUser.getUserId());
|
||||
|
||||
if (user == null) {
|
||||
// 同步记录创建了,但是user却没创建
|
||||
log.info(
|
||||
"LDAP-用户同步-同步记录存在但user不存在|ctx=[dn:{},ldapUserId:{}]",
|
||||
ldapTransformUser.getDn(),
|
||||
ldapUser.getId());
|
||||
user =
|
||||
userService.createWithDepIds(
|
||||
localUserEmail,
|
||||
@ -235,6 +299,7 @@ public class LDAPBus {
|
||||
"",
|
||||
depIds);
|
||||
}
|
||||
|
||||
// 账号修改[账号有可能是email也有可能是uid]
|
||||
if (!localUserEmail.equals(user.getEmail())) {
|
||||
// 检测localUserEmail是否存在
|
||||
@ -243,19 +308,23 @@ public class LDAPBus {
|
||||
}
|
||||
userService.updateEmail(user.getId(), localUserEmail);
|
||||
}
|
||||
|
||||
// ldap-email的变化
|
||||
if (!ldapUser.getEmail().equals(ldapTransformUser.getEmail())) {
|
||||
ldapUserService.updateEmail(ldapUser.getId(), ldapTransformUser.getEmail());
|
||||
}
|
||||
|
||||
// ldap-uid的变化
|
||||
if (!ldapUser.getUid().equals(ldapTransformUser.getUid())) {
|
||||
ldapUserService.updateUid(ldapUser.getId(), ldapTransformUser.getUid());
|
||||
}
|
||||
|
||||
// 名字同步修改
|
||||
if (!ldapUserName.equals(ldapUser.getCn())) {
|
||||
userService.updateName(user.getId(), ldapUserName);
|
||||
ldapUserService.updateCN(ldapUser.getId(), ldapUserName);
|
||||
}
|
||||
|
||||
// 部门修改同步
|
||||
String newOU = String.join(",", ldapTransformUser.getOu());
|
||||
if (!newOU.equals(ldapUser.getOu())) {
|
||||
|
@ -15,7 +15,9 @@
|
||||
*/
|
||||
package xyz.playedu.common.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
@ -29,6 +31,7 @@ import java.io.Serializable;
|
||||
@TableName(value = "admin_role_permission")
|
||||
@Data
|
||||
public class AdminRolePermission implements Serializable {
|
||||
@TableId(type = IdType.NONE)
|
||||
@JsonProperty("role_id")
|
||||
private Integer roleId;
|
||||
|
||||
|
@ -15,7 +15,9 @@
|
||||
*/
|
||||
package xyz.playedu.common.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
@ -29,6 +31,7 @@ import java.io.Serializable;
|
||||
@TableName(value = "admin_user_role")
|
||||
@Data
|
||||
public class AdminUserRole implements Serializable {
|
||||
@TableId(type = IdType.NONE)
|
||||
@JsonProperty("admin_id")
|
||||
private Integer adminId;
|
||||
|
||||
|
@ -15,7 +15,9 @@
|
||||
*/
|
||||
package xyz.playedu.common.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
@ -29,6 +31,7 @@ import java.io.Serializable;
|
||||
@TableName(value = "user_department")
|
||||
@Data
|
||||
public class UserDepartment implements Serializable {
|
||||
@TableId(type = IdType.NONE)
|
||||
@JsonProperty("user_id")
|
||||
private Integer userId;
|
||||
|
||||
|
@ -30,4 +30,6 @@ public interface LdapDepartmentService extends IService<LdapDepartment> {
|
||||
void destroy(Integer id);
|
||||
|
||||
void create(Integer depId, String uuid, String dn);
|
||||
|
||||
void updateDnById(Integer id, String dn);
|
||||
}
|
||||
|
@ -56,4 +56,12 @@ public class LdapDepartmentServiceImpl extends ServiceImpl<LdapDepartmentMapper,
|
||||
|
||||
save(ldapDepartment);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateDnById(Integer id, String dn) {
|
||||
LdapDepartment ldapDepartment = new LdapDepartment();
|
||||
ldapDepartment.setId(id);
|
||||
ldapDepartment.setDn(dn);
|
||||
updateById(ldapDepartment);
|
||||
}
|
||||
}
|
||||
|
@ -18,6 +18,7 @@ package xyz.playedu.common.util.ldap;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import xyz.playedu.common.exception.ServiceException;
|
||||
import xyz.playedu.common.types.LdapConfig;
|
||||
import xyz.playedu.common.util.StringUtil;
|
||||
|
||||
import java.io.IOException;
|
||||
@ -83,10 +84,11 @@ public class LdapUtil {
|
||||
return new InitialLdapContext(context, null);
|
||||
}
|
||||
|
||||
public static List<LdapTransformUser> users(
|
||||
String url, String adminUser, String adminPass, String baseDN)
|
||||
public static List<LdapTransformUser> users(LdapConfig ldapConfig, String filterScope)
|
||||
throws NamingException, IOException {
|
||||
LdapContext ldapContext = initContext(url, adminUser, adminPass);
|
||||
LdapContext ldapContext =
|
||||
initContext(
|
||||
ldapConfig.getUrl(), ldapConfig.getAdminUser(), ldapConfig.getAdminPass());
|
||||
|
||||
int pageSize = 1000;
|
||||
List<LdapTransformUser> users = new ArrayList<>();
|
||||
@ -111,11 +113,11 @@ public class LdapUtil {
|
||||
}
|
||||
|
||||
NamingEnumeration<SearchResult> result =
|
||||
ldapContext.search(baseDN, USER_OBJECT_CLASS, controls);
|
||||
ldapContext.search(filterScope, USER_OBJECT_CLASS, controls);
|
||||
while (result.hasMoreElements()) {
|
||||
SearchResult item = result.nextElement();
|
||||
if (item != null) {
|
||||
LdapTransformUser ldapTransformUser = parseTransformUser(item, baseDN);
|
||||
LdapTransformUser ldapTransformUser = parseTransformUser(item, filterScope);
|
||||
if (ldapTransformUser != null) {
|
||||
users.add(ldapTransformUser);
|
||||
}
|
||||
@ -153,9 +155,11 @@ public class LdapUtil {
|
||||
return null;
|
||||
}
|
||||
|
||||
public static List<LdapTransformDepartment> departments(
|
||||
String url, String adminUser, String adminPass, String baseDN) throws NamingException {
|
||||
LdapContext ldapContext = initContext(url, adminUser, adminPass);
|
||||
public static List<LdapTransformDepartment> departments(LdapConfig ldapConfig, String baseDN)
|
||||
throws NamingException {
|
||||
LdapContext ldapContext =
|
||||
initContext(
|
||||
ldapConfig.getUrl(), ldapConfig.getAdminUser(), ldapConfig.getAdminPass());
|
||||
|
||||
SearchControls controls = new SearchControls();
|
||||
controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
|
||||
@ -165,15 +169,16 @@ public class LdapUtil {
|
||||
String filter = "(objectClass=organizationalUnit)";
|
||||
NamingEnumeration<SearchResult> result = null;
|
||||
try {
|
||||
log.info("LDAP-部门查询|条件[baseDN={},filter={}]", baseDN, filter);
|
||||
result = ldapContext.search(baseDN, filter, controls);
|
||||
} catch (NamingException e) {
|
||||
log.error("LDAP部门查询失败", e);
|
||||
log.error("LDAP-部门查询-失败|errMsg={}", e.getMessage());
|
||||
} finally {
|
||||
closeContext(ldapContext);
|
||||
}
|
||||
|
||||
if (result == null || !result.hasMoreElements()) {
|
||||
log.info("LDAP部门为空");
|
||||
log.info("LDAP-部门查询-结果为空|条件[baseDN={},filter={}]", baseDN, filter);
|
||||
return null;
|
||||
}
|
||||
|
||||
@ -186,6 +191,7 @@ public class LdapUtil {
|
||||
if (item == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Attributes attributes = item.getAttributes();
|
||||
if (attributes == null) {
|
||||
continue;
|
||||
@ -221,13 +227,7 @@ public class LdapUtil {
|
||||
}
|
||||
|
||||
public static LdapTransformUser loginByMailOrUid(
|
||||
String url,
|
||||
String adminUser,
|
||||
String adminPass,
|
||||
String baseDN,
|
||||
String mail,
|
||||
String uid,
|
||||
String password)
|
||||
LdapConfig ldapConfig, String mail, String uid, String password)
|
||||
throws ServiceException, NamingException {
|
||||
if (StringUtil.isEmpty(mail) && StringUtil.isEmpty(uid)) {
|
||||
throw new ServiceException("mail和Uid不能同时为空");
|
||||
@ -249,10 +249,12 @@ public class LdapUtil {
|
||||
|
||||
String filter = String.format("(&%s%s)", userFilter, USER_OBJECT_CLASS);
|
||||
|
||||
LdapContext ldapContext = initContext(url, adminUser, adminPass);
|
||||
LdapContext ldapContext =
|
||||
initContext(
|
||||
ldapConfig.getUrl(), ldapConfig.getAdminUser(), ldapConfig.getAdminPass());
|
||||
NamingEnumeration<SearchResult> result = null;
|
||||
try {
|
||||
result = ldapContext.search(baseDN, filter, controls);
|
||||
result = ldapContext.search(ldapConfig.getBaseDN(), filter, controls);
|
||||
} catch (NamingException e) {
|
||||
log.error("LDAP-通过mail或uid登录失败", e);
|
||||
} finally {
|
||||
@ -265,7 +267,8 @@ public class LdapUtil {
|
||||
}
|
||||
|
||||
// 根据mail或uid查询出来的用户
|
||||
LdapTransformUser ldapUser = parseTransformUser(result.nextElement(), baseDN);
|
||||
LdapTransformUser ldapUser =
|
||||
parseTransformUser(result.nextElement(), ldapConfig.getBaseDN());
|
||||
if (ldapUser == null) {
|
||||
log.info("LDAP-用户不存在");
|
||||
return null;
|
||||
@ -275,7 +278,11 @@ public class LdapUtil {
|
||||
// 登录成功则意味着密码正确
|
||||
// 登录失败则意味着密码错误
|
||||
try {
|
||||
ldapContext = initContext(url, ldapUser.getDn() + "," + baseDN, password);
|
||||
ldapContext =
|
||||
initContext(
|
||||
ldapConfig.getUrl(),
|
||||
ldapUser.getDn() + "," + ldapConfig.getBaseDN(),
|
||||
password);
|
||||
return ldapUser;
|
||||
} catch (Exception e) {
|
||||
// 无法登录->密码错误
|
||||
|
@ -15,7 +15,9 @@
|
||||
*/
|
||||
package xyz.playedu.course.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
@ -30,6 +32,7 @@ import java.io.Serializable;
|
||||
@Data
|
||||
public class CourseCategory implements Serializable {
|
||||
/** */
|
||||
@TableId(type = IdType.NONE)
|
||||
@JsonProperty("course_id")
|
||||
private Integer courseId;
|
||||
|
||||
|
@ -15,7 +15,9 @@
|
||||
*/
|
||||
package xyz.playedu.course.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
@ -29,6 +31,7 @@ import java.io.Serializable;
|
||||
@TableName(value = "course_department")
|
||||
@Data
|
||||
public class CourseDepartment implements Serializable {
|
||||
@TableId(type = IdType.NONE)
|
||||
@JsonProperty("course_id")
|
||||
private Integer courseId;
|
||||
|
||||
|
@ -15,7 +15,9 @@
|
||||
*/
|
||||
package xyz.playedu.resource.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
|
||||
import lombok.Data;
|
||||
@ -29,6 +31,7 @@ import java.io.Serializable;
|
||||
@Data
|
||||
public class ResourceCategory implements Serializable {
|
||||
/** */
|
||||
@TableId(type = IdType.NONE)
|
||||
private Integer cid;
|
||||
|
||||
/** */
|
||||
|
@ -15,7 +15,9 @@
|
||||
*/
|
||||
package xyz.playedu.resource.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
|
||||
@ -31,6 +33,7 @@ import java.util.Date;
|
||||
@Data
|
||||
public class ResourceVideo implements Serializable {
|
||||
/** */
|
||||
@TableId(type = IdType.NONE)
|
||||
private Integer rid;
|
||||
|
||||
/** 封面 */
|
||||
|
4
playedu-h5/.gitignore
vendored
4
playedu-h5/.gitignore
vendored
@ -31,6 +31,4 @@ yarn.lock
|
||||
.env
|
||||
|
||||
deploy-test.sh
|
||||
deploy-demo.sh
|
||||
|
||||
pnpm-lock.yaml
|
||||
deploy-demo.sh
|
@ -1,202 +0,0 @@
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright 2023 杭州白书科技有限公司
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
@ -1,3 +0,0 @@
|
||||
/node_modules
|
||||
/build
|
||||
/dist
|
4
playedu-pc/.gitignore
vendored
4
playedu-pc/.gitignore
vendored
@ -32,6 +32,4 @@ yarn.lock
|
||||
|
||||
deploy-test.sh
|
||||
deploy-prod.sh
|
||||
deploy-demo.sh
|
||||
|
||||
pnpm-lock.yaml
|
||||
deploy-demo.sh
|
@ -1,13 +0,0 @@
|
||||
FROM node:lts-slim as builder
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY . /app
|
||||
|
||||
RUN yarn config set registry https://registry.npm.taobao.org && yarn && yarn build
|
||||
|
||||
FROM nginx:1.23.4-alpine-slim
|
||||
|
||||
COPY --from=builder /app/dist /usr/share/nginx/html
|
||||
|
||||
COPY --from=builder /app/docker/nginx.conf /etc/nginx/nginx.conf
|
@ -1,202 +0,0 @@
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright 2023 杭州白书科技有限公司
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
@ -1,83 +0,0 @@
|
||||
|
||||
user nginx;
|
||||
worker_processes auto;
|
||||
|
||||
error_log /var/log/nginx/error.log notice;
|
||||
pid /var/run/nginx.pid;
|
||||
|
||||
|
||||
events {
|
||||
worker_connections 32000;
|
||||
}
|
||||
|
||||
|
||||
http {
|
||||
include /etc/nginx/mime.types;
|
||||
default_type application/octet-stream;
|
||||
|
||||
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
||||
'$status $body_bytes_sent "$http_referer" '
|
||||
'"$http_user_agent" "$http_x_forwarded_for"';
|
||||
|
||||
access_log /var/log/nginx/access.log main;
|
||||
|
||||
sendfile on;
|
||||
#tcp_nopush on;
|
||||
|
||||
keepalive_timeout 65;
|
||||
|
||||
#开启gzip
|
||||
gzip on;
|
||||
#低于1kb的资源不压缩
|
||||
gzip_min_length 1k;
|
||||
#压缩级别1-9,越大压缩率越高,同时消耗cpu资源也越多,建议设置在5左右。
|
||||
gzip_comp_level 5;
|
||||
#需要压缩哪些响应类型的资源,多个空格隔开。不建议压缩图片.
|
||||
gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css;
|
||||
#配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
|
||||
gzip_disable "MSIE [1-6]\.";
|
||||
#是否添加“Vary: Accept-Encoding”响应头
|
||||
gzip_vary on;
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
listen [::]:80;
|
||||
server_name localhost;
|
||||
root /usr/share/nginx/html;
|
||||
index index.html index.htm;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
#禁止访问的文件或目录
|
||||
location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md)
|
||||
{
|
||||
return 404;
|
||||
}
|
||||
|
||||
#一键申请SSL证书验证目录相关设置
|
||||
location ~ \.well-known{
|
||||
allow all;
|
||||
}
|
||||
|
||||
#禁止在证书验证目录放入敏感文件
|
||||
if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {
|
||||
return 403;
|
||||
}
|
||||
|
||||
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
|
||||
{
|
||||
expires 30d;
|
||||
error_log /dev/null;
|
||||
access_log /dev/null;
|
||||
}
|
||||
|
||||
location ~ .*\.(js|css)?$
|
||||
{
|
||||
expires 12h;
|
||||
error_log /dev/null;
|
||||
access_log /dev/null;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user