refactor: 移除二维码和交叉编译,改为列出所有 LAN IP 地址;清理依赖

This commit is contained in:
2026-03-01 04:45:27 +08:00
parent 5d17e2e9ac
commit 2dbc916652
6 changed files with 34 additions and 83 deletions

View File

@@ -22,48 +22,11 @@ tasks:
cmds:
- go run .
build:darwin-arm64:
desc: Build for macOS ARM64
env:
GOOS: darwin
GOARCH: arm64
CGO_ENABLED: "1"
cmds:
- go build -ldflags "-s -w -X main.version={{.VERSION}}" -o dist/{{.APP_NAME}}-darwin-arm64 .
build:darwin-amd64:
desc: Build for macOS AMD64
env:
GOOS: darwin
GOARCH: amd64
CGO_ENABLED: "1"
cmds:
- go build -ldflags "-s -w -X main.version={{.VERSION}}" -o dist/{{.APP_NAME}}-darwin-amd64 .
build:linux-amd64:
desc: Build for Linux AMD64
env:
GOOS: linux
GOARCH: amd64
CGO_ENABLED: "1"
cmds:
- go build -ldflags "-s -w -X main.version={{.VERSION}}" -o dist/{{.APP_NAME}}-linux-amd64 .
build:windows-amd64:
desc: Build for Windows AMD64
env:
GOOS: windows
GOARCH: amd64
CGO_ENABLED: "1"
cmds:
- go build -ldflags "-s -w -X main.version={{.VERSION}}" -o dist/{{.APP_NAME}}-windows-amd64.exe .
build:all:
desc: Build for all platforms
cmds:
- mkdir -p dist
- task: build:linux-amd64
- task: default
clean:
desc: Clean build artifacts
cmds:

3
go.mod
View File

@@ -9,7 +9,6 @@ require (
github.com/gofiber/contrib/v3/websocket v1.0.0
github.com/gofiber/fiber/v3 v3.1.0
github.com/google/uuid v1.6.0
github.com/mdp/qrterminal/v3 v3.2.1
golang.design/x/clipboard v0.7.1
gopkg.in/yaml.v3 v3.0.1
)
@@ -55,7 +54,5 @@ require (
golang.org/x/mobile v0.0.0-20250606033058-a2a15c67f36f // indirect
golang.org/x/net v0.50.0 // indirect
golang.org/x/sys v0.41.0 // indirect
golang.org/x/term v0.40.0 // indirect
golang.org/x/text v0.34.0 // indirect
rsc.io/qr v0.2.0 // indirect
)

6
go.sum
View File

@@ -50,8 +50,6 @@ github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHP
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mdp/qrterminal/v3 v3.2.1 h1:6+yQjiiOsSuXT5n9/m60E54vdgFsw0zhADHhHLrFet4=
github.com/mdp/qrterminal/v3 v3.2.1/go.mod h1:jOTmXvnBsMy5xqLniO0R++Jmjs2sTm9dFSuQ5kpz/SU=
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
github.com/otiai10/gosseract/v2 v2.4.1 h1:G8AyBpXEeSlcq8TI85LH/pM5SXk8Djy2GEXisgyblRw=
@@ -129,8 +127,6 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k=
golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/term v0.40.0 h1:36e4zGLqU4yhjlmxEaagx2KuYbJq3EwY8K943ZsHcvg=
golang.org/x/term v0.40.0/go.mod h1:w2P8uVp06p2iyKKuvXIm7N/y0UCRt3UfJTfZ7oOpglM=
golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk=
golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -138,5 +134,3 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
rsc.io/qr v0.2.0 h1:6vBLea5/NRMVTz8V66gipeLycZMl/+UlFmk8DvqQ6WY=
rsc.io/qr v0.2.0/go.mod h1:IF+uZjkb9fqyeF/4tlBoynqmQxUoPfWEKh921coOuXs=

View File

@@ -5,17 +5,21 @@ import (
"net"
)
// GetLANIP returns the first non-loopback IPv4 address.
func GetLANIP() (string, error) {
// GetLANIPs returns all non-loopback IPv4 addresses.
func GetLANIPs() ([]string, error) {
addrs, err := net.InterfaceAddrs()
if err != nil {
return "", err
return nil, err
}
var ips []string
for _, addr := range addrs {
if ipNet, ok := addr.(*net.IPNet); ok && !ipNet.IP.IsLoopback() && ipNet.IP.To4() != nil {
return ipNet.IP.String(), nil
ips = append(ips, ipNet.IP.String())
}
}
return "", fmt.Errorf("no LAN IP found")
if len(ips) == 0 {
return nil, fmt.Errorf("no LAN IP found")
}
return ips, nil
}

37
main.go
View File

@@ -42,12 +42,13 @@ func main() {
if err := paste.Init(); err != nil {
slog.Warn("clipboard init failed, paste will be unavailable", "err", err)
}
// Detect LAN IP
lanIP, err := server.GetLANIP()
// Detect LAN IPs
lanIPs, err := server.GetLANIPs()
if err != nil {
slog.Error("failed to detect LAN IP", "error", err)
os.Exit(1)
}
lanIP := lanIPs[0] // Use first IP for TLS and server binding
// Read token from config (empty = no auth required)
token := cfg.Security.Token
@@ -66,20 +67,26 @@ func main() {
scheme = "https"
host = tlsResult.Host
}
// Build URL
var url string
if token != "" {
url = fmt.Sprintf("%s://%s:%d/?token=%s", scheme, host, cfg.Server.Port, token)
} else {
url = fmt.Sprintf("%s://%s:%d/", scheme, host, cfg.Server.Port)
}
// Print connection info
fmt.Println()
fmt.Println("╔══════════════════════════════════════╗")
fmt.Println("║ VoicePaste 就绪 ║")
fmt.Println("╚══════════════════════════════════════╝")
fmt.Println()
fmt.Printf(" 地址: %s\n", url)
// Print all accessible addresses
if len(lanIPs) == 1 {
fmt.Printf(" 地址: %s\n", buildURL(scheme, host, cfg.Server.Port, token))
} else {
fmt.Println(" 地址:")
for _, ip := range lanIPs {
h := ip
if tlsResult != nil {
h = tlsResult.Host
}
fmt.Printf(" - %s\n", buildURL(scheme, h, cfg.Server.Port, token))
}
}
if tlsResult != nil && tlsResult.AnyIP {
fmt.Println(" 证书: AnyIP浏览器信任")
} else if cfg.Server.TLSAuto {
@@ -91,9 +98,7 @@ func main() {
fmt.Println(" 认证: 未启用(无需 token")
}
fmt.Println()
printQRCode(url)
fmt.Println()
fmt.Println(" 用手机扫描二维码连接")
fmt.Println(" 在手机浏览器中打开上方地址")
fmt.Println(" 按 Ctrl+C 停止服务")
fmt.Println()
// Create and start server
@@ -143,3 +148,9 @@ func main() {
os.Exit(1)
}
}
func buildURL(scheme, host string, port int, token string) string {
if token != "" {
return fmt.Sprintf("%s://%s:%d/?token=%s", scheme, host, port, token)
}
return fmt.Sprintf("%s://%s:%d/", scheme, host, port)
}

View File

@@ -1,18 +0,0 @@
package main
import (
"os"
"github.com/mdp/qrterminal/v3"
)
// printQRCode prints a QR code to the terminal.
func printQRCode(url string) {
qrterminal.GenerateWithConfig(url, qrterminal.Config{
Level: qrterminal.L,
Writer: os.Stdout,
BlackChar: qrterminal.BLACK,
WhiteChar: qrterminal.WHITE,
QuietZone: 2,
})
}