Skip to content

Commit 934ba3f

Browse files
dhj58369046cnb
authored andcommitted
init
1 parent 23f1128 commit 934ba3f

13 files changed

Lines changed: 1335 additions & 0 deletions

File tree

.gitignore

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# Logs
2+
logs
3+
*.log
4+
npm-debug.log*
5+
yarn-debug.log*
6+
yarn-error.log*
7+
pnpm-debug.log*
8+
lerna-debug.log*
9+
10+
node_modules
11+
.DS_Store
12+
dist
13+
dist-ssr
14+
coverage
15+
*.local
16+
17+
/cypress/videos/
18+
/cypress/screenshots/
19+
20+
# Editor directories and files
21+
.vscode/*
22+
!.vscode/extensions.json
23+
.idea
24+
*.suo
25+
*.ntvs*
26+
*.njsproj
27+
*.sln
28+
*.sw?

AGENTS.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# 🤖 Trae Agent 任务收尾工作流规范
2+
3+
作为本项目的 AI 编程助手,当你在编写完某个任务的代码后,**必须、无条件地**按顺序严格执行以下收尾工作流。绝对不允许遗漏或跳过任何一步。
4+
5+
## 🎯 任务完成后的标准操作流程 (Post-Task SOP)
6+
7+
### 步骤 1: 强制打包与测试 (MANDATORY Testing)
8+
代码编写完成后,必须通过终端执行命令进行验证,满足所有条件才算成功:
9+
- 比如前端项目:
10+
1. 执行 `npm run build`,确保生产环境构建成功。
11+
- 比如后端go项目
12+
1. 执行 `go build -o ../dist` 命令, 确保文件构建到指定目录(一般是dist)成功
13+
14+
### 步骤 2: 更新进度日志 (Update progress.txt)
15+
测试通过后,必须在项目根目录的 `progress.txt` 文件末尾追加本次工作记录。格式必须严格如下:
16+
17+
```text
18+
## [YYYY-MM-DD HH:mm] - Task: [任务描述/标题]
19+
20+
### What was done:
21+
- [列出具体修改的文件和核心业务逻辑]
22+
23+
### Testing:
24+
- [说明你是如何测试的,例如:通过 build 测试无误、浏览器打开并测试了某交互等]
25+
26+
### Notes:
27+
- [给后续开发留下的注意事项,没有则写 None]
28+
```
29+
30+
### 步骤 3: 任务标题回显
31+
- 回复回显"任务描述/标题"

README.md

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
# DJump - 内网Web服务代理
2+
3+
一个简易的内网Web服务代理工具,支持HTTP/HTTPS反向代理,通过Web界面管理站点。
4+
5+
## 功能特性
6+
7+
- HTTP/HTTPS反向代理
8+
- Token认证保护
9+
- Web界面管理站点
10+
- 支持自定义SSL证书
11+
- 支持白天/黑夜主题切换
12+
- Session Cookie认证(浏览器关闭后失效)
13+
14+
## 快速开始
15+
16+
### Windows
17+
18+
```bash
19+
cd dist
20+
djump.exe
21+
```
22+
23+
### Linux/macOS
24+
25+
```bash
26+
cd dist
27+
./djump
28+
```
29+
30+
## 配置说明
31+
32+
程序启动后会在当前目录生成`data.json`文件,包含以下配置:
33+
34+
```json
35+
{
36+
"config": {
37+
"password": "Sys12#$",
38+
"httpPort": 8081,
39+
"httpsPort": 8443,
40+
"activeSiteName": "web",
41+
"domain": "localhost",
42+
"certFile": "",
43+
"keyFile": ""
44+
},
45+
"sites": [
46+
{
47+
"name": "web",
48+
"ip": "127.0.0.1",
49+
"port": 3000,
50+
"scheme": "http"
51+
}
52+
]
53+
}
54+
```
55+
56+
### 配置项说明
57+
58+
- `password`: 管理密码
59+
- `httpPort`: HTTP代理端口
60+
- `httpsPort`: HTTPS代理端口
61+
- `activeSiteName`: 当前激活的站点名称
62+
- `domain`: 证书域名(用于自签名证书)
63+
- `certFile`: SSL证书文件路径(可选,默认使用cert.pem)
64+
- `keyFile`: SSL私钥文件路径(可选,默认使用key.pem)
65+
66+
### 使用自定义证书
67+
68+
`data.json`中配置证书路径:
69+
70+
```json
71+
{
72+
"config": {
73+
"certFile": "/opt/ssl/home.199311.xyz_bundle.pem",
74+
"keyFile": "/opt/ssl/home.199311.xyz.key"
75+
}
76+
}
77+
```
78+
79+
## 使用方式
80+
81+
1. 访问Web管理界面:`http://localhost:42220`
82+
2. 输入密码登录
83+
3. 添加内网站点(名称、IP、端口、协议)
84+
4. 激活站点
85+
5. 点击代理链接访问内网服务
86+
87+
## 认证说明
88+
89+
- 管理界面:Token认证
90+
- 代理端口:Session Cookie认证
91+
- 浏览器关闭后需要重新登录
92+
93+
## 构建
94+
95+
### Windows
96+
97+
```bash
98+
cd backend
99+
go build -o ../dist/djump.exe .
100+
```
101+
102+
### Linux
103+
104+
```bash
105+
cd backend
106+
set GOOS=linux&&set GOARCH=amd64&&go build -o ../dist/djump-linux-amd64 .
107+
```
108+
109+
### macOS
110+
111+
```bash
112+
cd backend
113+
set GOOS=darwin&&set GOARCH=amd64&&go build -o ../dist/djump-darwin-amd64 .
114+
```
115+
116+
## 注意事项
117+
118+
- 修改端口或证书配置后需要重启服务
119+
- HTTPS代理需要证书文件
120+
- 代理端口需要Cookie认证,首次访问会自动设置
121+
- 站点唯一性标识:`协议://IP:端口`
122+
123+
# 其他说明
124+
- 页面效果图见`appimg`目录
125+
- <img src="https://gcore.jsdelivr.net/gh/dhjz/djump@master/appimg/app1.jpg" style="width: 340px;"/>
126+
127+
- 项目地址: [https://github.com/dhjz/djump]( https://github.com/dhjz/djump)

appimg/app1.jpg

97.7 KB
Loading

backend/go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module djump
2+
3+
go 1.24.11

backend/main.go

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package main
2+
3+
import (
4+
"djump/service/router"
5+
"djump/service/utils"
6+
"embed"
7+
"flag"
8+
"fmt"
9+
"io/fs"
10+
"log"
11+
"net/http"
12+
"os"
13+
"path/filepath"
14+
)
15+
16+
//go:embed all:webapp
17+
var f embed.FS
18+
19+
func main() {
20+
webPort := flag.Int("p", 42220, "Web UI port")
21+
flag.Parse()
22+
config := router.GetConfig()
23+
24+
exePath, err := os.Executable()
25+
if err != nil {
26+
log.Printf("Error getting executable path: %v", err)
27+
return
28+
}
29+
exeDir := filepath.Dir(exePath)
30+
31+
certFile := config.CertFile
32+
if certFile == "" {
33+
certFile = filepath.Join(exeDir, "cert.pem")
34+
}
35+
keyFile := config.KeyFile
36+
if keyFile == "" {
37+
keyFile = filepath.Join(exeDir, "key.pem")
38+
}
39+
40+
if _, err := os.Stat(certFile); os.IsNotExist(err) {
41+
if _, err := os.Stat(keyFile); os.IsNotExist(err) {
42+
fmt.Printf("Certificate files not found, generating self-signed certificate for domain: %s...\n", config.Domain)
43+
if err := utils.GenerateSelfSignedCert(certFile, keyFile, config.Domain); err != nil {
44+
fmt.Printf("Failed to generate certificate: %v\n", err)
45+
fmt.Println("HTTPS proxy disabled")
46+
} else {
47+
fmt.Println("Self-signed certificate generated successfully")
48+
}
49+
}
50+
}
51+
52+
go func() {
53+
addr := fmt.Sprintf(":%d", config.HTTPPort)
54+
fmt.Printf("HTTP Proxy starting on %s\n", addr)
55+
log.Fatal(http.ListenAndServe(addr, router.CreateProxyHandler("http")))
56+
}()
57+
58+
if _, err := os.Stat(certFile); err == nil {
59+
if _, err := os.Stat(keyFile); err == nil {
60+
go func() {
61+
addr := fmt.Sprintf(":%d", config.HTTPSPort)
62+
fmt.Printf("HTTPS Proxy starting on %s\n", addr)
63+
log.Fatal(http.ListenAndServeTLS(addr, certFile, keyFile, router.CreateProxyHandler("https")))
64+
}()
65+
} else {
66+
fmt.Println("key.pem not found, HTTPS proxy disabled")
67+
}
68+
} else {
69+
fmt.Println("cert.pem not found, HTTPS proxy disabled")
70+
}
71+
72+
webAddr := fmt.Sprintf(":%d", *webPort)
73+
mux := http.NewServeMux()
74+
75+
st, _ := fs.Sub(f, "webapp")
76+
mux.Handle("/", http.StripPrefix("/", http.FileServer(http.FS(st))))
77+
78+
router.SetupRoutesAPI(mux)
79+
80+
fmt.Printf("Web UI starting on http://localhost%s\n", webAddr)
81+
log.Fatal(http.ListenAndServe(webAddr, mux))
82+
}

0 commit comments

Comments
 (0)