From 950a9aef9df9674bf1d6a964512e5ddfc1616b7e Mon Sep 17 00:00:00 2001 From: hxuanyu <2252193204@qq.com> Date: Mon, 26 Jan 2026 22:48:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=BC=96=E8=AF=91=E8=84=9A?= =?UTF-8?q?=E6=9C=AC=E5=92=8C=20github=20=E5=B7=A5=E4=BD=9C=E6=B5=81?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/release.yml | 43 +++++++++++++++ .github/workflows/verify.yml | 27 ++++++++++ .gitignore | 1 + Dockerfile | 2 +- README.md | 32 ++++++++--- go.mod | 54 +++++++++---------- go.sum | 59 ++++++++++++++------- internal/http/handlers/image.go | 8 +-- internal/repo/db.go | 2 +- internal/service/fetcher/fetcher.go | 23 -------- scripts/build.bat | 53 +++++++++++++++++++ scripts/build.ps1 | 67 +++++++++++++++++++++++ scripts/build.sh | 82 +++++++++++++++++++++++++++++ scripts/tag.sh | 44 ++++++++++++++++ web/index.html | 2 +- 15 files changed, 416 insertions(+), 83 deletions(-) create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/verify.yml create mode 100644 scripts/build.bat create mode 100644 scripts/build.ps1 create mode 100755 scripts/build.sh create mode 100755 scripts/tag.sh diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..b45b47a --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,43 @@ +name: Release + +on: + push: + tags: + - 'v*' + +jobs: + release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: '1.23' + + - name: Build and Package + run: | + chmod +x scripts/build.sh + ./scripts/build.sh ${{ github.ref_name }} + + - name: Generate Changelog + id: changelog + run: | + PREV_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "") + if [ -z "$PREV_TAG" ]; then + git log --pretty=format:"* %s (%h)" > CHANGELOG.md + else + git log --pretty=format:"* %s (%h)" $PREV_TAG..HEAD > CHANGELOG.md + fi + echo "CHANGELOG_PATH=CHANGELOG.md" >> $GITHUB_ENV + + - name: Create Release + uses: softprops/action-gh-release@v2 + with: + body_path: CHANGELOG.md + files: output/*.tar.gz + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml new file mode 100644 index 0000000..20042ef --- /dev/null +++ b/.github/workflows/verify.yml @@ -0,0 +1,27 @@ +name: Verify + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + verify: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: '1.23' + + - name: Install dependencies + run: go mod download + + - name: Build + run: CGO_ENABLED=0 go build -v ./... + + - name: Test + run: CGO_ENABLED=0 go test -v ./... diff --git a/.gitignore b/.gitignore index 4aaa3e2..22532b2 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ /dist/ /build/ /out/ +/output/ # Go workspace files /go.work diff --git a/Dockerfile b/Dockerfile index 2410469..3586de7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,7 +5,7 @@ COPY go.mod go.sum ./ RUN go mod download COPY . . -RUN go build -o BingPaper . +RUN CGO_ENABLED=0 go build -o BingPaper . FROM alpine:latest diff --git a/README.md b/README.md index 6c2cd31..c8035d2 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ - **自动抓取**:每日定时抓取 Bing 每日一图,支持 UHD 探测降级。 - **补抓能力**:支持手动或 API 触发抓取最近 N 天(默认 8 天)的图片。 -- **多分辨率管理**:自动生成 UHD, 1920x1080, 1366x768 等分辨率,支持 WebP 和 JPG 格式。 +- **多分辨率管理**:自动生成 UHD, 1920x1080, 1366x768 等分辨率,支持 JPG 格式。 - **灵活存储**:支持本地磁盘、S3 对象存储、WebDAV 存储。 - **数据库支持**:支持 SQLite, MySQL, PostgreSQL。 - **公共 API**:提供今日图片、随机图片、指定日期图片的纯图及元数据接口。 @@ -53,7 +53,7 @@ go run . - `GET /api/v1/image/date/:yyyy-mm-dd`:返回指定日期图片 - **查询参数**: - `variant`:分辨率 (UHD, 1920x1080, 1366x768),默认 `UHD` - - `format`:格式 (jpg, webp),默认 `jpg` + - `format`:格式 (jpg),默认 `jpg` ### 管理接口 (需 Bearer Token) @@ -69,11 +69,31 @@ go run . ## 开发与构建 -```bash -# 构建二进制 -go build -o BingPaper . +### 本地构建 +您可以使用提供的脚本进行多平台构建: -# 构建 Docker 镜像 +```bash +# Unix/Linux/macOS +./scripts/build.sh [version] + +# Windows (CMD) +.\scripts\build.bat [version] + +# Windows (PowerShell) +.\scripts\build.ps1 [version] +``` + +编译后的打包文件将生成在 `output` 目录下。 + +### 发布流程 +本项目集成了 GitHub Actions,可通过以下步骤发布新版本: + +1. 确保在 `master` 分支且代码已提交。 +2. 运行标签脚本:`./scripts/tag.sh v1.0.0` (替换为实际版本号)。 +3. 脚本会自动推送标签,触发 GitHub Actions 进行构建并发布 Release。 + +### Docker 构建 +```bash docker build -t bing-paper . ``` diff --git a/go.mod b/go.mod index 0a65186..7081167 100644 --- a/go.mod +++ b/go.mod @@ -2,23 +2,37 @@ module BingPaper go 1.25.5 +require ( + github.com/aws/aws-sdk-go v1.55.8 + github.com/disintegration/imaging v1.6.2 + github.com/fsnotify/fsnotify v1.9.0 + github.com/gin-gonic/gin v1.11.0 + github.com/glebarez/sqlite v1.11.0 + github.com/robfig/cron/v3 v3.0.1 + github.com/spf13/viper v1.21.0 + github.com/studio-b12/gowebdav v0.12.0 + github.com/swaggo/files v1.0.1 + github.com/swaggo/gin-swagger v1.6.1 + github.com/swaggo/swag v1.16.6 + go.uber.org/zap v1.27.1 + golang.org/x/crypto v0.47.0 + gorm.io/driver/mysql v1.6.0 + gorm.io/driver/postgres v1.6.0 + gorm.io/gorm v1.31.1 +) + require ( filippo.io/edwards25519 v1.1.0 // indirect github.com/KyleBanks/depth v1.2.1 // indirect github.com/PuerkitoBio/purell v1.1.1 // indirect github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect - github.com/aws/aws-sdk-go v1.55.8 // indirect github.com/bytedance/sonic v1.14.0 // indirect github.com/bytedance/sonic/loader v0.3.0 // indirect - github.com/chai2010/webp v1.4.0 // indirect github.com/cloudwego/base64x v0.1.6 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/disintegration/imaging v1.6.2 // indirect - github.com/fsnotify/fsnotify v1.9.0 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect github.com/gabriel-vasile/mimetype v1.4.8 // indirect github.com/gin-contrib/sse v1.1.0 // indirect - github.com/gin-gonic/gin v1.11.0 // indirect + github.com/glebarez/go-sqlite v1.21.2 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect github.com/go-openapi/jsonreference v0.19.6 // indirect github.com/go-openapi/spec v0.20.4 // indirect @@ -30,6 +44,7 @@ require ( github.com/go-viper/mapstructure/v2 v2.4.0 // indirect github.com/goccy/go-json v0.10.2 // indirect github.com/goccy/go-yaml v1.18.0 // indirect + github.com/google/uuid v1.3.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/pgx/v5 v5.6.0 // indirect @@ -43,37 +58,24 @@ require ( github.com/leodido/go-urn v1.4.0 // indirect github.com/mailru/easyjson v0.7.6 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-sqlite3 v1.14.22 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pelletier/go-toml/v2 v2.2.4 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect github.com/quic-go/qpack v0.5.1 // indirect github.com/quic-go/quic-go v0.54.0 // indirect - github.com/robfig/cron/v3 v3.0.1 // indirect - github.com/russross/blackfriday/v2 v2.0.1 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/sagikazarmark/locafero v0.11.0 // indirect - github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect github.com/spf13/afero v1.15.0 // indirect github.com/spf13/cast v1.10.0 // indirect github.com/spf13/pflag v1.0.10 // indirect - github.com/spf13/viper v1.21.0 // indirect - github.com/stretchr/testify v1.11.1 // indirect - github.com/studio-b12/gowebdav v0.12.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect - github.com/swaggo/files v1.0.1 // indirect - github.com/swaggo/gin-swagger v1.6.1 // indirect - github.com/swaggo/swag v1.16.6 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.3.0 // indirect - github.com/urfave/cli/v2 v2.3.0 // indirect go.uber.org/mock v0.5.0 // indirect go.uber.org/multierr v1.10.0 // indirect - go.uber.org/zap v1.27.1 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/arch v0.20.0 // indirect - golang.org/x/crypto v0.47.0 // indirect golang.org/x/image v0.0.0-20211028202545-6944b10bf410 // indirect golang.org/x/mod v0.31.0 // indirect golang.org/x/net v0.48.0 // indirect @@ -83,10 +85,8 @@ require ( golang.org/x/tools v0.40.0 // indirect google.golang.org/protobuf v1.36.9 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - gorm.io/driver/mysql v1.6.0 // indirect - gorm.io/driver/postgres v1.6.0 // indirect - gorm.io/driver/sqlite v1.6.0 // indirect - gorm.io/gorm v1.31.1 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + modernc.org/libc v1.22.5 // indirect + modernc.org/mathutil v1.5.0 // indirect + modernc.org/memory v1.5.0 // indirect + modernc.org/sqlite v1.23.1 // indirect ) diff --git a/go.sum b/go.sum index cf3ed49..d60e03b 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,5 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= @@ -13,26 +12,32 @@ github.com/bytedance/sonic v1.14.0 h1:/OfKt8HFw0kh2rj8N0F6C/qPGRESq0BbaNZgcNXXzQ github.com/bytedance/sonic v1.14.0/go.mod h1:WoEbx8WTcFJfzCe0hbmyTGrfjt8PzNEBdxlNUO24NhA= github.com/bytedance/sonic/loader v0.3.0 h1:dskwH8edlzNMctoruo8FPTJDF3vLtDT0sXZwvZJyqeA= github.com/bytedance/sonic/loader v0.3.0/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= -github.com/chai2010/webp v1.4.0 h1:6DA2pkkRUPnbOHvvsmGI3He1hBKf/bkRlniAiSGuEko= -github.com/chai2010/webp v1.4.0/go.mod h1:0XVwvZWdjjdxpUEIf7b9g9VkHFnInUSYujwqTLEuldU= github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M= github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c= github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8= +github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4= +github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk= github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w= github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM= github.com/gin-gonic/gin v1.11.0 h1:OW/6PLjyusp2PPXtyxKHU0RbX6I/l28FTdDlae5ueWk= github.com/gin-gonic/gin v1.11.0/go.mod h1:+iq/FyxlGzII0KHiBGjuNn4UNENUlKbGlNmc+W50Dls= +github.com/glebarez/go-sqlite v1.21.2 h1:3a6LFC4sKahUunAmynQKLZceZCOzUthkRkEAl9gAXWo= +github.com/glebarez/go-sqlite v1.21.2/go.mod h1:sfxdZyhQjTM2Wry3gVYWaW072Ri1WMdWJi0k6+3382k= +github.com/glebarez/sqlite v1.11.0 h1:wSG0irqzP6VurnMEpFGer5Li19RpIRi2qvQz++w0GMw= +github.com/glebarez/sqlite v1.11.0/go.mod h1:h8/o8j5wiAsqSPoWELDUdJXhjAhsVliSn7bWZjOhrgQ= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= @@ -43,6 +48,8 @@ github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7 github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= @@ -57,7 +64,13 @@ github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= @@ -72,6 +85,7 @@ github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= @@ -80,8 +94,11 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= @@ -91,9 +108,6 @@ github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= 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/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= -github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -108,14 +122,15 @@ github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= github.com/quic-go/quic-go v0.54.0 h1:6s1YB9QotYI6Ospeiguknbp2Znb/jZYjZLRXn9kMQBg= github.com/quic-go/quic-go v0.54.0/go.mod h1:e68ZEaCdyviluZmy44P6Iey98v/Wfz6HCjQEm+l8zTY= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= -github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDcg+AAIFXc= github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik= -github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw= github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U= github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= @@ -151,9 +166,9 @@ github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go/codec v1.3.0 h1:Qd2W2sQawAfG8XSvzwhBeoGq71zXOC/Q1E9y/wUcsUA= github.com/ugorji/go/codec v1.3.0/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4= -github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M= -github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= @@ -168,7 +183,6 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8= golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A= -golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8 h1:hVwzHzIUGRjiF7EcUjqNxk3NCfkPxbDKRdnNE1Rpg0U= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20211028202545-6944b10bf410 h1:hTftEOvwiOq2+O8k2D5/Q7COC7k5Qcrgc2TFURJYnvQ= golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= @@ -217,8 +231,9 @@ google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXn gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= @@ -230,9 +245,13 @@ gorm.io/driver/mysql v1.6.0 h1:eNbLmNTpPpTOVZi8MMxCi2aaIm0ZpInbORNXDwyLGvg= gorm.io/driver/mysql v1.6.0/go.mod h1:D/oCC2GWK3M/dqoLxnOlaNKmXz8WNTfcS9y5ovaSqKo= gorm.io/driver/postgres v1.6.0 h1:2dxzU8xJ+ivvqTRph34QX+WrRaJlmfyPqXmoGVjMBa4= gorm.io/driver/postgres v1.6.0/go.mod h1:vUw0mrGgrTK+uPHEhAdV4sfFELrByKVGnaVRkXDhtWo= -gorm.io/driver/sqlite v1.6.0 h1:WHRRrIiulaPiPFmDcod6prc4l2VGVWHz80KspNsxSfQ= -gorm.io/driver/sqlite v1.6.0/go.mod h1:AO9V1qIQddBESngQUKWL9yoH93HIeA1X6V633rBwyT8= gorm.io/gorm v1.31.1 h1:7CA8FTFz/gRfgqgpeKIBcervUn3xSyPUmr6B2WXJ7kg= gorm.io/gorm v1.31.1/go.mod h1:XyQVbO2k6YkOis7C2437jSit3SsDK72s7n7rsSHd+Gs= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +modernc.org/libc v1.22.5 h1:91BNch/e5B0uPbJFgqbxXuOnxBQjlS//icfQEGmvyjE= +modernc.org/libc v1.22.5/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY= +modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= +modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/sqlite v1.23.1 h1:nrSBg4aRQQwq59JpvGEQ15tNxoO5pX/kUjcRNwSAGQM= +modernc.org/sqlite v1.23.1/go.mod h1:OrDj17Mggn6MhE+iPbBNf7RGKODDE9NFT0f3EwDzJqk= diff --git a/internal/http/handlers/image.go b/internal/http/handlers/image.go index 40a3605..02b786d 100644 --- a/internal/http/handlers/image.go +++ b/internal/http/handlers/image.go @@ -19,8 +19,8 @@ import ( // @Description 根据参数返回今日必应图片流或重定向 // @Tags image // @Param variant query string false "分辨率 (UHD, 1920x1080, 1366x768)" default(UHD) -// @Param format query string false "格式 (jpg, webp)" default(jpg) -// @Produce image/jpeg,image/webp +// @Param format query string false "格式 (jpg)" default(jpg) +// @Produce image/jpeg // @Success 200 {file} binary // @Router /image/today [get] func GetToday(c *gin.Context) { @@ -54,7 +54,7 @@ func GetTodayMeta(c *gin.Context) { // @Tags image // @Param variant query string false "分辨率" default(UHD) // @Param format query string false "格式" default(jpg) -// @Produce image/jpeg,image/webp +// @Produce image/jpeg // @Success 200 {file} binary // @Router /image/random [get] func GetRandom(c *gin.Context) { @@ -89,7 +89,7 @@ func GetRandomMeta(c *gin.Context) { // @Param date path string true "日期 (yyyy-mm-dd)" // @Param variant query string false "分辨率" default(UHD) // @Param format query string false "格式" default(jpg) -// @Produce image/jpeg,image/webp +// @Produce image/jpeg // @Success 200 {file} binary // @Router /image/date/{date} [get] func GetByDate(c *gin.Context) { diff --git a/internal/repo/db.go b/internal/repo/db.go index 6c7a33b..d7578c2 100644 --- a/internal/repo/db.go +++ b/internal/repo/db.go @@ -6,10 +6,10 @@ import ( "BingPaper/internal/util" "fmt" + "github.com/glebarez/sqlite" "go.uber.org/zap" "gorm.io/driver/mysql" "gorm.io/driver/postgres" - "gorm.io/driver/sqlite" "gorm.io/gorm" "gorm.io/gorm/logger" ) diff --git a/internal/service/fetcher/fetcher.go b/internal/service/fetcher/fetcher.go index f5c5d4b..c8c70c9 100644 --- a/internal/service/fetcher/fetcher.go +++ b/internal/service/fetcher/fetcher.go @@ -18,8 +18,6 @@ import ( "BingPaper/internal/repo" "BingPaper/internal/storage" "BingPaper/internal/util" - - "github.com/chai2010/webp" "github.com/disintegration/imaging" "go.uber.org/zap" ) @@ -146,19 +144,6 @@ func (f *Fetcher) processImage(ctx context.Context, bingImg BingImage) error { util.Logger.Error("Failed to save variant", zap.String("variant", v.name), zap.Error(err)) } - // 保存 WebP (可选或默认) - webpBuf := new(bytes.Buffer) - var webpImg image.Image - if v.width == 0 { - webpImg = srcImg - } else { - webpImg = imaging.Fill(srcImg, v.width, v.height, imaging.Center, imaging.Lanczos) - } - if err := webp.Encode(webpBuf, webpImg, &webp.Options{Quality: 80}); err == nil { - if err := f.saveVariant(ctx, &dbImg, v.name, "webp", webpBuf.Bytes()); err != nil { - util.Logger.Error("Failed to save webp variant", zap.String("variant", v.name), zap.Error(err)) - } - } } // 保存今日额外文件 @@ -221,14 +206,6 @@ func (f *Fetcher) saveDailyFiles(srcImg image.Image, originalData []byte) { } os.MkdirAll(filepath.Join(localRoot, "static"), 0755) - // daily.webp (quality 80) - webpPath := filepath.Join(localRoot, "static", "daily.webp") - fWebp, _ := os.Create(webpPath) - if fWebp != nil { - webp.Encode(fWebp, srcImg, &webp.Options{Quality: 80}) - fWebp.Close() - } - // daily.jpeg (quality 95) jpegPath := filepath.Join(localRoot, "static", "daily.jpeg") fJpeg, _ := os.Create(jpegPath) diff --git a/scripts/build.bat b/scripts/build.bat new file mode 100644 index 0000000..29c675e --- /dev/null +++ b/scripts/build.bat @@ -0,0 +1,53 @@ +@echo off +setlocal enabledelayedexpansion + +set APP_NAME=BingPaper +set OUTPUT_DIR=output + +echo 开始构建 %APP_NAME% 多平台二进制文件... + +if exist %OUTPUT_DIR% rd /s /q %OUTPUT_DIR% +mkdir %OUTPUT_DIR% + +set PLATFORMS=linux/amd64 linux/arm64 windows/amd64 windows/arm64 darwin/amd64 darwin/arm64 + +for %%p in (%PLATFORMS%) do ( + for /f "tokens=1,2 delims=/" %%a in ("%%p") do ( + set GOOS=%%a + set GOARCH=%%b + + set OUTPUT_NAME=%APP_NAME%-%%a-%%b + set BINARY_NAME=!OUTPUT_NAME! + if "%%a"=="windows" set BINARY_NAME=!OUTPUT_NAME!.exe + + echo 正在编译 %%a/%%b... + + set PACKAGE_DIR=%OUTPUT_DIR%\!OUTPUT_NAME! + if not exist !PACKAGE_DIR! mkdir !PACKAGE_DIR! + + env GOOS=%%a GOARCH=%%b CGO_ENABLED=0 go build -o !PACKAGE_DIR!\!BINARY_NAME! main.go + + if !errorlevel! equ 0 ( + echo %%a/%%b 编译成功 + + xcopy /e /i /y web !PACKAGE_DIR!\web >nul + copy /y config.example.yaml !PACKAGE_DIR!\ >nul + copy /y README.md !PACKAGE_DIR!\ >nul + + pushd %OUTPUT_DIR% + tar -czf !OUTPUT_NAME!.tar.gz !OUTPUT_NAME! + rd /s /q !OUTPUT_NAME! + popd + + echo %%a/%%b 打包完成: !OUTPUT_NAME!.tar.gz + ) else ( + echo %%a/%%b 编译失败 + if exist !PACKAGE_DIR! rd /s /q !PACKAGE_DIR! + ) + ) +) + +echo ---------------------------------------- +echo 多平台打包完成!输出目录: %OUTPUT_DIR% +dir /s /b %OUTPUT_DIR% +pause diff --git a/scripts/build.ps1 b/scripts/build.ps1 new file mode 100644 index 0000000..9076ac6 --- /dev/null +++ b/scripts/build.ps1 @@ -0,0 +1,67 @@ +$AppName = "BingPaper" +$OutputDir = "output" + +Write-Host "开始构建 $AppName 多平台二进制文件..." + +if (Test-Path $OutputDir) { + Remove-Item -Recurse -Force $OutputDir +} +New-Item -ItemType Directory -Path $OutputDir | Out-Null + +$Platforms = @( + "linux/amd64", + "linux/arm64", + "windows/amd64", + "windows/arm64", + "darwin/amd64", + "darwin/arm64" +) + +foreach ($Platform in $Platforms) { + $parts = $Platform.Split("/") + $OS = $parts[0] + $Arch = $parts[1] + + $OutputName = "$AppName-$OS-$Arch" + $BinaryName = $OutputName + if ($OS -eq "windows") { + $BinaryName = "$OutputName.exe" + } + + Write-Host "正在编译 $OS/$Arch..." + + $PackageDir = Join-Path $OutputDir $OutputName + if (-not (Test-Path $PackageDir)) { + New-Item -ItemType Directory -Path $PackageDir | Out-Null + } + + $env:GOOS = $OS + $env:GOARCH = $Arch + $env:CGO_ENABLED = "0" + go build -o (Join-Path $PackageDir $BinaryName) main.go + + if ($LASTEXITCODE -eq 0) { + Write-Host " $OS/$Arch 编译成功" + + Copy-Item -Recurse "web" $PackageDir\ + Copy-Item "config.example.yaml" $PackageDir\ + Copy-Item "README.md" $PackageDir\ + + $CurrentDir = Get-Location + Set-Location $OutputDir + tar -czf "${OutputName}.tar.gz" $OutputName + Remove-Item -Recurse -Force $OutputName + Set-Location $CurrentDir + + Write-Host " $OS/$Arch 打包完成: ${OutputName}.tar.gz" + } else { + Write-Host " $OS/$Arch 编译失败" + if (Test-Path $PackageDir) { + Remove-Item -Recurse -Force $PackageDir + } + } +} + +Write-Host "----------------------------------------" +Write-Host "多平台打包完成!输出目录: $OutputDir" +Get-ChildItem -Recurse $OutputDir diff --git a/scripts/build.sh b/scripts/build.sh new file mode 100755 index 0000000..31d6168 --- /dev/null +++ b/scripts/build.sh @@ -0,0 +1,82 @@ +#!/bin/bash + +# 获取脚本所在目录并切换到项目根目录 +cd "$(dirname "$0")/.." + +# 设置变量 +APP_NAME="BingPaper" +OUTPUT_DIR="output" + +# 定义目标平台 +PLATFORMS=( + "linux/amd64" + "linux/arm64" + "windows/amd64" + "windows/arm64" + "darwin/amd64" + "darwin/arm64" +) + +# 需要包含的额外文件/目录 +EXTRA_FILES=("web" "config.example.yaml" "README.md") + +echo "开始构建 $APP_NAME 多平台二进制文件..." + +# 清理 output 目录 +if [ -d "$OUTPUT_DIR" ]; then + echo "正在清理 $OUTPUT_DIR 目录..." + rm -rf "$OUTPUT_DIR" +fi + +mkdir -p "$OUTPUT_DIR" + +# 循环编译各平台 +for PLATFORM in "${PLATFORMS[@]}"; do + # 分离 OS 和 ARCH + OS=$(echo $PLATFORM | cut -d'/' -f1) + ARCH=$(echo $PLATFORM | cut -d'/' -f2) + + # 设置输出名称 + OUTPUT_NAME="${APP_NAME}-${OS}-${ARCH}" + if [ "$OS" = "windows" ]; then + BINARY_NAME="${OUTPUT_NAME}.exe" + else + BINARY_NAME="${OUTPUT_NAME}" + fi + + echo "正在编译 ${OS}/${ARCH}..." + + # 创建临时打包目录 + PACKAGE_DIR="${OUTPUT_DIR}/${OUTPUT_NAME}" + mkdir -p "$PACKAGE_DIR" + + # 现在已移除 CGO 依赖,使用 CGO_ENABLED=0 以支持轻松的跨平台编译 + GOOS=$OS GOARCH=$ARCH CGO_ENABLED=0 go build -o "${PACKAGE_DIR}/${BINARY_NAME}" main.go + + if [ $? -eq 0 ]; then + echo " ${OS}/${ARCH} 编译成功" + + # 复制额外文件 + for file in "${EXTRA_FILES[@]}"; do + if [ -e "$file" ]; then + cp -r "$file" "$PACKAGE_DIR/" + fi + done + + # 压缩为 tar.gz + tar -czf "${OUTPUT_DIR}/${OUTPUT_NAME}.tar.gz" -C "${OUTPUT_DIR}" "${OUTPUT_NAME}" + + # 删除临时打包目录 + rm -rf "$PACKAGE_DIR" + + echo " ${OS}/${ARCH} 打包完成: ${OUTPUT_NAME}.tar.gz" + else + echo " ${OS}/${ARCH} 编译失败" + # 编译失败时清理临时目录 + rm -rf "$PACKAGE_DIR" + fi +done + +echo "----------------------------------------" +echo "多平台打包完成!输出目录: $OUTPUT_DIR" +ls -R "$OUTPUT_DIR" diff --git a/scripts/tag.sh b/scripts/tag.sh new file mode 100755 index 0000000..4da601d --- /dev/null +++ b/scripts/tag.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +# 获取版本号 +TAG_NAME=$1 + +if [ -z "$TAG_NAME" ]; then + echo "Usage: ./scripts/tag.sh " + exit 1 +fi + +# 确保在 master 分支 +CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD) +if [ "$CURRENT_BRANCH" != "master" ]; then + echo "Error: Must be on master branch to tag. Current branch: $CURRENT_BRANCH" + exit 1 +fi + +# 检查是否有未提交的代码 +if [ -n "$(git status --porcelain)" ]; then + echo "Error: You have uncommitted changes. Please commit or stash them first." + exit 1 +fi + +# 拉取最新代码 +echo "Updating master branch..." +git pull origin master + +# 检查本地和远端是否一致 +LOCAL=$(git rev-parse @) +REMOTE=$(git rev-parse @{u}) + +if [ "$LOCAL" != "$REMOTE" ]; then + echo "Error: Local branch is not in sync with remote. Please push your changes first." + exit 1 +fi + +# 创建并推送 tag +echo "Creating tag $TAG_NAME..." +git tag -f "$TAG_NAME" + +echo "Pushing tag $TAG_NAME to remote..." +git push origin "$TAG_NAME" -f + +echo "Done! GitHub Action should be triggered shortly." diff --git a/web/index.html b/web/index.html index e435f91..fd92c9e 100644 --- a/web/index.html +++ b/web/index.html @@ -87,7 +87,7 @@
  • 随机图片:/api/v1/image/random
  • 指定日期:/api/v1/image/date/2026-01-26
  • -

    参数支持:variant=UHD|1920x1080|1366x768format=jpg|webp

    +

    参数支持:variant=UHD|1920x1080|1366x768format=jpg