Initial commit: 风影 OA 全栈源码(API/Web/Flutter/IM)

含 Phase 1.1 IM seq 排序、断线重连、多端已读同步与微信式语音转文字 UI。
排除 node_modules、构建产物、安装包与 .env 密钥。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-02 10:04:03 +00:00
commit 76f266645d
507 changed files with 99891 additions and 0 deletions
+58
View File
@@ -0,0 +1,58 @@
services:
postgres:
image: postgres:16.8-alpine
container_name: fengying-postgres
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER:-ops}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB:-enterprise_ops}
ports:
- "127.0.0.1:15432:5432"
volumes:
- /data/docker/pg:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-ops} -d ${POSTGRES_DB:-enterprise_ops}"]
interval: 5s
timeout: 5s
retries: 20
redis:
image: redis:7.4-alpine
container_name: fengying-redis
restart: unless-stopped
command: ["redis-server", "--appendonly", "yes"]
ports:
- "127.0.0.1:16379:6379"
volumes:
- /data/docker/redis:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 20
minio:
image: minio/minio:RELEASE.2025-04-22T22-12-26Z
container_name: fengying-minio
restart: unless-stopped
command: server /data --console-address ":19001"
environment:
MINIO_ROOT_USER: ${MINIO_ACCESS_KEY:-fengying}
MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY}
ports:
- "127.0.0.1:19000:9000"
- "127.0.0.1:19001:19001"
volumes:
- /data/docker/minio:/data
npm:
image: jc21/nginx-proxy-manager:latest
container_name: fengying-npm
restart: unless-stopped
network_mode: host
environment:
DISABLE_IPV6: "true"
volumes:
- /data/npm/data:/data
- /data/npm/letsencrypt:/etc/letsencrypt
+16
View File
@@ -0,0 +1,16 @@
[Unit]
Description=Fengying OA API
After=network.target docker.service
Requires=docker.service
[Service]
Type=simple
WorkingDirectory=/data/fengying-oa/apps/api
EnvironmentFile=/data/fengying-oa/apps/api/.env
ExecStart=/usr/bin/node dist/main
Restart=always
RestartSec=3
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
+16
View File
@@ -0,0 +1,16 @@
[Unit]
Description=Fengying MobileIMSDK
After=network.target fengying-api.service
[Service]
Type=simple
WorkingDirectory=/data/fengying-oa/apps/im-server
EnvironmentFile=/data/fengying-oa/apps/api/.env
Environment=OA_API_URL=http://127.0.0.1:3010/api/v1
ExecStart=/usr/bin/node server.js
Restart=always
RestartSec=3
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
+73
View File
@@ -0,0 +1,73 @@
server {
listen 127.0.0.1:8088;
server_name oa.fysxkj.com;
client_max_body_size 32m;
root /data/fengying-oa/apps/web/dist;
index index.html;
location = /index.html {
add_header Cache-Control "no-cache, no-store, must-revalidate";
add_header Pragma "no-cache";
add_header Expires "0";
}
location = /fengying-oa.apk {
default_type application/vnd.android.package-archive;
add_header Content-Disposition 'attachment; filename="fengying-oa.apk"';
add_header Cache-Control "no-cache";
}
location = /fengying-oa-setup.exe {
default_type application/octet-stream;
add_header Content-Disposition 'attachment; filename="fengying-oa-setup.exe"';
add_header Cache-Control "no-cache";
}
location = /fengying-oa-linux.tar.gz {
default_type application/gzip;
add_header Content-Disposition 'attachment; filename="fengying-oa-linux.tar.gz"';
add_header Cache-Control "no-cache";
}
location = /fengying-oa_amd64.deb {
default_type application/vnd.debian.binary-package;
add_header Content-Disposition 'attachment; filename="fengying-oa_amd64.deb"';
add_header Cache-Control "no-cache";
}
location /api/ {
client_max_body_size 32m;
proxy_pass http://127.0.0.1:3010;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header Authorization $http_authorization;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 120s;
proxy_send_timeout 120s;
}
location ~* \.mjs$ {
default_type application/javascript;
add_header Cache-Control "public, max-age=31536000, immutable";
try_files $uri =404;
}
location /assets/ {
try_files $uri =404;
add_header Cache-Control "public, max-age=31536000, immutable";
}
location /pdfjs/ {
default_type application/octet-stream;
try_files $uri =404;
add_header Cache-Control "public, max-age=31536000";
}
location / {
try_files $uri $uri/ /index.html;
}
}