From 539eac217f3464e5121141bbf51ab02dcb71fdd2 Mon Sep 17 00:00:00 2001
From: JustSong
Date: Sat, 22 Apr 2023 21:14:09 +0800
Subject: [PATCH] Rename to One API
---
.github/workflows/docker-image-amd64.yml | 2 +-
.github/workflows/docker-image-arm64.yml | 2 +-
.github/workflows/linux-release.yml | 8 ++--
.github/workflows/macos-release.yml | 4 +-
.github/workflows/windows-release.yml | 4 +-
Dockerfile | 6 +--
README.en.md | 40 +++++++++----------
README.md | 44 ++++++++++-----------
common/constants.go | 4 +-
controller/file.go | 4 +-
controller/github.go | 4 +-
controller/misc.go | 4 +-
controller/option.go | 4 +-
controller/user.go | 4 +-
controller/wechat.go | 4 +-
go.mod | 2 +-
main.go | 8 ++--
middleware/auth.go | 4 +-
middleware/cors.go | 2 +-
middleware/rate-limit.go | 2 +-
middleware/turnstile-check.go | 2 +-
model/file.go | 2 +-
model/main.go | 2 +-
model/option.go | 2 +-
model/user.go | 2 +-
router/api-router.go | 4 +-
router/web-router.go | 6 +--
web/public/favicon.ico | Bin 3870 -> 4286 bytes
web/public/index.html | 2 +-
web/public/logo.png | Bin 5347 -> 8085 bytes
web/src/components/Footer.js | 4 +-
web/src/components/Header.js | 4 +-
web/src/components/LoginForm.js | 6 +--
web/src/components/OtherSetting.js | 4 +-
web/src/components/PasswordResetConfirm.js | 4 +-
web/src/components/PasswordResetForm.js | 4 +-
web/src/components/PersonalSetting.js | 4 +-
web/src/components/RegisterForm.js | 4 +-
web/src/pages/About/index.js | 4 +-
39 files changed, 108 insertions(+), 108 deletions(-)
diff --git a/.github/workflows/docker-image-amd64.yml b/.github/workflows/docker-image-amd64.yml
index 1a77775c..e3b8439a 100644
--- a/.github/workflows/docker-image-amd64.yml
+++ b/.github/workflows/docker-image-amd64.yml
@@ -42,7 +42,7 @@ jobs:
uses: docker/metadata-action@v4
with:
images: |
- justsong/gin-template
+ justsong/one-api
ghcr.io/${{ github.repository }}
- name: Build and push Docker images
diff --git a/.github/workflows/docker-image-arm64.yml b/.github/workflows/docker-image-arm64.yml
index 5ffd1555..7304e5c9 100644
--- a/.github/workflows/docker-image-arm64.yml
+++ b/.github/workflows/docker-image-arm64.yml
@@ -48,7 +48,7 @@ jobs:
uses: docker/metadata-action@v4
with:
images: |
- justsong/gin-template
+ justsong/one-api
ghcr.io/${{ github.repository }}
- name: Build and push Docker images
diff --git a/.github/workflows/linux-release.yml b/.github/workflows/linux-release.yml
index ac84675d..2696fbfb 100644
--- a/.github/workflows/linux-release.yml
+++ b/.github/workflows/linux-release.yml
@@ -30,20 +30,20 @@ jobs:
- name: Build Backend (amd64)
run: |
go mod download
- go build -ldflags "-s -w -X 'gin-template/common.Version=$(git describe --tags)' -extldflags '-static'" -o gin-template
+ go build -ldflags "-s -w -X 'one-api/common.Version=$(git describe --tags)' -extldflags '-static'" -o one-api
- name: Build Backend (arm64)
run: |
sudo apt-get update
sudo apt-get install gcc-aarch64-linux-gnu
- CC=aarch64-linux-gnu-gcc CGO_ENABLED=1 GOOS=linux GOARCH=arm64 go build -ldflags "-s -w -X 'gin-template/common.Version=$(git describe --tags)' -extldflags '-static'" -o gin-template-arm64
+ CC=aarch64-linux-gnu-gcc CGO_ENABLED=1 GOOS=linux GOARCH=arm64 go build -ldflags "-s -w -X 'one-api/common.Version=$(git describe --tags)' -extldflags '-static'" -o one-api-arm64
- name: Release
uses: softprops/action-gh-release@v1
if: startsWith(github.ref, 'refs/tags/')
with:
files: |
- gin-template
- gin-template-arm64
+ one-api
+ one-api-arm64
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
\ No newline at end of file
diff --git a/.github/workflows/macos-release.yml b/.github/workflows/macos-release.yml
index 39850d86..7f4e48b1 100644
--- a/.github/workflows/macos-release.yml
+++ b/.github/workflows/macos-release.yml
@@ -30,11 +30,11 @@ jobs:
- name: Build Backend
run: |
go mod download
- go build -ldflags "-X 'gin-template/common.Version=$(git describe --tags)'" -o gin-template-macos
+ go build -ldflags "-X 'one-api/common.Version=$(git describe --tags)'" -o one-api-macos
- name: Release
uses: softprops/action-gh-release@v1
if: startsWith(github.ref, 'refs/tags/')
with:
- files: gin-template-macos
+ files: one-api-macos
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/windows-release.yml b/.github/workflows/windows-release.yml
index e9877f87..525f0524 100644
--- a/.github/workflows/windows-release.yml
+++ b/.github/workflows/windows-release.yml
@@ -33,11 +33,11 @@ jobs:
- name: Build Backend
run: |
go mod download
- go build -ldflags "-s -w -X 'gin-template/common.Version=$(git describe --tags)'" -o gin-template.exe
+ go build -ldflags "-s -w -X 'one-api/common.Version=$(git describe --tags)'" -o one-api.exe
- name: Release
uses: softprops/action-gh-release@v1
if: startsWith(github.ref, 'refs/tags/')
with:
- files: gin-template.exe
+ files: one-api.exe
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
index 7b2dc9ae..a8df7683 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -16,7 +16,7 @@ WORKDIR /build
COPY . .
COPY --from=builder /build/build ./web/build
RUN go mod download
-RUN go build -ldflags "-s -w -X 'gin-template/common.Version=$(cat VERSION)' -extldflags '-static'" -o gin-template
+RUN go build -ldflags "-s -w -X 'one-api/common.Version=$(cat VERSION)' -extldflags '-static'" -o one-api
FROM alpine
@@ -25,7 +25,7 @@ RUN apk update \
&& apk add --no-cache ca-certificates tzdata \
&& update-ca-certificates 2>/dev/null || true
ENV PORT=3000
-COPY --from=builder2 /build/gin-template /
+COPY --from=builder2 /build/one-api /
EXPOSE 3000
WORKDIR /data
-ENTRYPOINT ["/gin-template"]
+ENTRYPOINT ["/one-api"]
diff --git a/README.en.md b/README.en.md
index eb98bc16..7387244e 100644
--- a/README.en.md
+++ b/README.en.md
@@ -3,7 +3,7 @@
-
+
@@ -15,28 +15,28 @@ _✨ Template for Gin & React projects ✨_
-
-
+
+
-
-
+
+
-
-
+
+
-
+
- Download
+ Download
·
- Tutorial
+ Tutorial
·
- Feedback
+ Feedback
·
- Demo
+ Demo
## Features
@@ -54,23 +54,23 @@ _✨ Template for Gin & React projects ✨_
## Deployment
### Manual deployment
-1. Download built binary from [GitHub Releases](https://github.com/songquanpeng/gin-template/releases/latest) or build from source:
+1. Download built binary from [GitHub Releases](https://github.com/songquanpeng/one-api/releases/latest) or build from source:
```shell
- git clone https://github.com/songquanpeng/gin-template.git
+ git clone https://github.com/songquanpeng/one-api.git
go mod download
- go build -ldflags "-s -w" -o gin-template
+ go build -ldflags "-s -w" -o one-api
````
2. Run it:
```shell
- chmod u+x gin-template
- ./gin-template --port 3000 --log-dir ./logs
+ chmod u+x one-api
+ ./one-api --port 3000 --log-dir ./logs
```
3. Visit [http://localhost:3000/](http://localhost:3000/) and login. The username for the initial account is `root` and the password is `123456`.
### Deploy with Docker
-Execute: `docker run -d --restart always -p 3000:3000 -v /home/ubuntu/data/gin-template:/data -v /etc/ssl/certs:/etc/ssl/certs:ro justsong/gin-template`
+Execute: `docker run -d --restart always -p 3000:3000 -v /home/ubuntu/data/one-api:/data -v /etc/ssl/certs:/etc/ssl/certs:ro justsong/one-api`
-Data will be saved in `/home/ubuntu/data/gin-template`.
+Data will be saved in `/home/ubuntu/data/one-api`.
## Configurations
The system works out of the box.
@@ -85,7 +85,7 @@ After the system starts, use `root` user to log in to the system and do further
2. `SESSION_SECRET`: when set, a fixed session key will be used so that the logged-in users' cookie remains valid across system reboots.
+ Example: `SESSION_SECRET=random_string`
3. `SQL_DSN`: when set, the target SQL database will be used instead of SQLite.
- + Example: `SQL_DSN=root:123456@tcp(localhost:3306)/gin-template`
+ + Example: `SQL_DSN=root:123456@tcp(localhost:3306)/one-api`
### Command line Arguments
1. `--port `: specify the port number, the default value is `3000`.
diff --git a/README.md b/README.md
index ca31553d..316f7ed4 100644
--- a/README.md
+++ b/README.md
@@ -3,40 +3,40 @@
-
+
-# Gin 项目模板
+# Gin One API
_✨ 用于 Gin & React 项目的模板 ✨_
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
- 程序下载
+ 程序下载
·
- 部署教程
+ 部署教程
·
- 意见反馈
+ 意见反馈
·
- 在线演示
+ 在线演示
## 功能
@@ -54,25 +54,25 @@ _✨ 用于 Gin & React 项目的模板 ✨_
## 部署
### 手动部署
-1. 从 [GitHub Releases](https://github.com/songquanpeng/gin-template/releases/latest) 下载可执行文件或者从源码编译:
+1. 从 [GitHub Releases](https://github.com/songquanpeng/one-api/releases/latest) 下载可执行文件或者从源码编译:
```shell
- git clone https://github.com/songquanpeng/gin-template.git
+ git clone https://github.com/songquanpeng/one-api.git
go mod download
- go build -ldflags "-s -w" -o gin-template
+ go build -ldflags "-s -w" -o one-api
````
2. 运行:
```shell
- chmod u+x gin-template
- ./gin-template --port 3000 --log-dir ./logs
+ chmod u+x one-api
+ ./one-api --port 3000 --log-dir ./logs
```
3. 访问 [http://localhost:3000/](http://localhost:3000/) 并登录。初始账号用户名为 `root`,密码为 `123456`。
更加详细的部署教程[参见此处](https://iamazing.cn/page/how-to-deploy-a-website)。
### 基于 Docker 进行部署
-执行:`docker run -d --restart always -p 3000:3000 -v /home/ubuntu/data/gin-template:/data -v /etc/ssl/certs:/etc/ssl/certs:ro justsong/gin-template`
+执行:`docker run -d --restart always -p 3000:3000 -v /home/ubuntu/data/one-api:/data -v /etc/ssl/certs:/etc/ssl/certs:ro justsong/one-api`
-数据将会保存在宿主机的 `/home/ubuntu/data/gin-template` 目录。
+数据将会保存在宿主机的 `/home/ubuntu/data/one-api` 目录。
## 配置
系统本身开箱即用。
@@ -87,7 +87,7 @@ _✨ 用于 Gin & React 项目的模板 ✨_
2. `SESSION_SECRET`:设置之后将使用固定的会话密钥,这样系统重新启动后已登录用户的 cookie 将依旧有效。
+ 例子:`SESSION_SECRET=random_string`
3. `SQL_DSN`:设置之后将使用指定数据库而非 SQLite。
- + 例子:`SQL_DSN=root:123456@tcp(localhost:3306)/gin-template`
+ + 例子:`SQL_DSN=root:123456@tcp(localhost:3306)/one-api`
### 命令行参数
1. `--port `: 指定服务器监听的端口号,默认为 `3000`。
diff --git a/common/constants.go b/common/constants.go
index 15bdba0c..f3294a42 100644
--- a/common/constants.go
+++ b/common/constants.go
@@ -8,14 +8,14 @@ import (
var StartTime = time.Now().Unix() // unit: second
var Version = "v0.0.0" // this hard coding will be replaced automatically when building, no need to manually change
-var SystemName = "项目模板"
+var SystemName = "One API"
var ServerAddress = "http://localhost:3000"
var Footer = ""
// Any options with "Secret", "Token" in its key won't be return by GetOptions
var SessionSecret = uuid.New().String()
-var SQLitePath = "gin-template.db"
+var SQLitePath = "one-api.db"
var OptionMap map[string]string
var OptionMapRWMutex sync.RWMutex
diff --git a/controller/file.go b/controller/file.go
index 0c1e2efb..64523622 100644
--- a/controller/file.go
+++ b/controller/file.go
@@ -2,10 +2,10 @@ package controller
import (
"fmt"
- "gin-template/common"
- "gin-template/model"
"github.com/gin-gonic/gin"
"net/http"
+ "one-api/common"
+ "one-api/model"
"path/filepath"
"strconv"
"strings"
diff --git a/controller/github.go b/controller/github.go
index 780de43b..93c2e8d3 100644
--- a/controller/github.go
+++ b/controller/github.go
@@ -5,11 +5,11 @@ import (
"encoding/json"
"errors"
"fmt"
- "gin-template/common"
- "gin-template/model"
"github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin"
"net/http"
+ "one-api/common"
+ "one-api/model"
"strconv"
"time"
)
diff --git a/controller/misc.go b/controller/misc.go
index 8cda624c..aa5a77f8 100644
--- a/controller/misc.go
+++ b/controller/misc.go
@@ -3,10 +3,10 @@ package controller
import (
"encoding/json"
"fmt"
- "gin-template/common"
- "gin-template/model"
"github.com/gin-gonic/gin"
"net/http"
+ "one-api/common"
+ "one-api/model"
)
func GetStatus(c *gin.Context) {
diff --git a/controller/option.go b/controller/option.go
index 394f2896..b5b675c6 100644
--- a/controller/option.go
+++ b/controller/option.go
@@ -2,10 +2,10 @@ package controller
import (
"encoding/json"
- "gin-template/common"
- "gin-template/model"
"github.com/gin-gonic/gin"
"net/http"
+ "one-api/common"
+ "one-api/model"
"strings"
)
diff --git a/controller/user.go b/controller/user.go
index 7cbef9f7..ce5f2862 100644
--- a/controller/user.go
+++ b/controller/user.go
@@ -2,12 +2,12 @@ package controller
import (
"encoding/json"
- "gin-template/common"
- "gin-template/model"
"github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
"net/http"
+ "one-api/common"
+ "one-api/model"
"strconv"
"strings"
)
diff --git a/controller/wechat.go b/controller/wechat.go
index f7d8dfc2..5620e8d3 100644
--- a/controller/wechat.go
+++ b/controller/wechat.go
@@ -4,10 +4,10 @@ import (
"encoding/json"
"errors"
"fmt"
- "gin-template/common"
- "gin-template/model"
"github.com/gin-gonic/gin"
"net/http"
+ "one-api/common"
+ "one-api/model"
"strconv"
"time"
)
diff --git a/go.mod b/go.mod
index 047dabb2..7da19284 100644
--- a/go.mod
+++ b/go.mod
@@ -1,4 +1,4 @@
-module gin-template
+module one-api
// +heroku goVersion go1.18
go 1.18
diff --git a/main.go b/main.go
index 42fadbbb..3fd87c1c 100644
--- a/main.go
+++ b/main.go
@@ -2,16 +2,16 @@ package main
import (
"embed"
- "gin-template/common"
- "gin-template/middleware"
- "gin-template/model"
- "gin-template/router"
"github.com/gin-contrib/gzip"
"github.com/gin-contrib/sessions"
"github.com/gin-contrib/sessions/cookie"
"github.com/gin-contrib/sessions/redis"
"github.com/gin-gonic/gin"
"log"
+ "one-api/common"
+ "one-api/middleware"
+ "one-api/model"
+ "one-api/router"
"os"
"strconv"
)
diff --git a/middleware/auth.go b/middleware/auth.go
index 488bf02b..427217e2 100644
--- a/middleware/auth.go
+++ b/middleware/auth.go
@@ -1,11 +1,11 @@
package middleware
import (
- "gin-template/common"
- "gin-template/model"
"github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin"
"net/http"
+ "one-api/common"
+ "one-api/model"
)
func authHelper(c *gin.Context, minRole int) {
diff --git a/middleware/cors.go b/middleware/cors.go
index 170cca3e..39c05697 100644
--- a/middleware/cors.go
+++ b/middleware/cors.go
@@ -7,6 +7,6 @@ import (
func CORS() gin.HandlerFunc {
config := cors.DefaultConfig()
- config.AllowOrigins = []string{"https://gin-template.vercel.app", "http://localhost:3000/"}
+ config.AllowOrigins = []string{"https://one-api.vercel.app", "http://localhost:3000/"}
return cors.New(config)
}
diff --git a/middleware/rate-limit.go b/middleware/rate-limit.go
index 410ed19e..8e5cff6c 100644
--- a/middleware/rate-limit.go
+++ b/middleware/rate-limit.go
@@ -3,9 +3,9 @@ package middleware
import (
"context"
"fmt"
- "gin-template/common"
"github.com/gin-gonic/gin"
"net/http"
+ "one-api/common"
"time"
)
diff --git a/middleware/turnstile-check.go b/middleware/turnstile-check.go
index b7401b79..26688810 100644
--- a/middleware/turnstile-check.go
+++ b/middleware/turnstile-check.go
@@ -2,11 +2,11 @@ package middleware
import (
"encoding/json"
- "gin-template/common"
"github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin"
"net/http"
"net/url"
+ "one-api/common"
)
type turnstileCheckResponse struct {
diff --git a/model/file.go b/model/file.go
index 2ff7a1f8..390b2e2e 100644
--- a/model/file.go
+++ b/model/file.go
@@ -1,9 +1,9 @@
package model
import (
- "gin-template/common"
_ "gorm.io/driver/sqlite"
"gorm.io/gorm"
+ "one-api/common"
"os"
"path"
)
diff --git a/model/main.go b/model/main.go
index 0a64651f..d8f7ac3a 100644
--- a/model/main.go
+++ b/model/main.go
@@ -1,10 +1,10 @@
package model
import (
- "gin-template/common"
"gorm.io/driver/mysql"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
+ "one-api/common"
"os"
)
diff --git a/model/option.go b/model/option.go
index 881d0282..a30a8b1d 100644
--- a/model/option.go
+++ b/model/option.go
@@ -1,7 +1,7 @@
package model
import (
- "gin-template/common"
+ "one-api/common"
"strconv"
"strings"
)
diff --git a/model/user.go b/model/user.go
index b5dd9900..496417b4 100644
--- a/model/user.go
+++ b/model/user.go
@@ -2,7 +2,7 @@ package model
import (
"errors"
- "gin-template/common"
+ "one-api/common"
"strings"
)
diff --git a/router/api-router.go b/router/api-router.go
index e43665af..57775431 100644
--- a/router/api-router.go
+++ b/router/api-router.go
@@ -1,9 +1,9 @@
package router
import (
- "gin-template/controller"
- "gin-template/middleware"
"github.com/gin-gonic/gin"
+ "one-api/controller"
+ "one-api/middleware"
)
func SetApiRouter(router *gin.Engine) {
diff --git a/router/web-router.go b/router/web-router.go
index 1cb06633..8201b09e 100644
--- a/router/web-router.go
+++ b/router/web-router.go
@@ -2,12 +2,12 @@ package router
import (
"embed"
- "gin-template/common"
- "gin-template/controller"
- "gin-template/middleware"
"github.com/gin-contrib/static"
"github.com/gin-gonic/gin"
"net/http"
+ "one-api/common"
+ "one-api/controller"
+ "one-api/middleware"
)
func setWebRouter(router *gin.Engine, buildFS embed.FS, indexPage []byte) {
diff --git a/web/public/favicon.ico b/web/public/favicon.ico
index a11777cc471a4344702741ab1c8a588998b1311a..c2c8de0c5435fe2ffd94ef6da10fa2662cd9ea17 100644
GIT binary patch
literal 4286
zcmcK5f2@^r9KiAC+*_U7FZW6~P3jh@`708|s#_stq~%w{YHS)?zeHKdJr#E}G5Uj<
zG0jq=#@JY~drMOMW1_Nf?hXB}tDm>rI^OT&e(l-WJ#IC9>~;G-&-p&zAD{2%c|=iy
z|H{iF|3>eXMbSl36!ihOq6&CF7yR}=MT&7IV+{`A6pmptUPXT-a4upPgVvxCSu|ij
z4mDkSuMRWO5oa6idGK01ggKan+4v34u@%o^1g^sMn1oeuZCZ>DIFo2a=TZ0s=GM9L
z{mH$D(Oix_W%q8Mzc2$uIGt!qC-+(p=iGzUcoT19EgaY1cH%``f&3`uhPiV7TJ%Os
z;WMuLc$2sI*E(tk!@YW*p8xwe2G`*^OoL?~k4{{ygMHpWKO|8o2JwUYJ%KdLMWJv_
zcjHSqzMRW@VZAhSH4}c{$MrG{^oP7?&Gi!4cLnlm#`7~5LlIw>dv@>Uz-P_LYp`~W
z(eMm>N5Z*TzYic@6Fs^1oP2&H;^Eo7gxxrbE(E
z{k#q_oW^ndgf2}t-P_|$_rl(+#cgmc&esbeT+c$dzwS*p!~8#ReLk#-kmqk{hjosj
z?Hn7B!aev3-jnBi7d#i|Tm-*4=H2{X2xB%1%^&)d(`OSJ@f3`k;r@TeXNcGKRIbCb
zG;=lVT0Advdj#t-7F96+&Fw!v#$5WiuZ=J~zdsQ6yNh;n`Sly;`5%OHj)OJ74&L**
z3|gB1Ci+;DK4Vy?esfOZV>nNKeVKE|cYoG}^%0^ojVZ{W4lT{!pFX}1&Swo+3+{a>
z;(2n8>9FPw!85Bup_tDP@$>gwJ)<8HA9n=T;hnSw9CtG=gOR`}Sa+^-8SaJkF%N~}
zX?}42u4soR;l4a)|GyBzF}%M4{$@Kqu64e)>Atyci%Vec-D9Dc!w=Tc{rCW`{R^0f
zA{dur3*7TeSOeDnNQ5Y*;hEUSXN^lyhZnpk5U$N<4#PPfLnnl|n8tF1oH(X6;2H)X
zg!6v`$MPFu*f#_7YhF_b;kf3>_3gm(=!p=;GzQ~SoPxD}I}CHw-2R)J|5y4tzR&yn
zc-)8eaGa&M4%SbIJ~UpzUbt`Vg!c_=z=D
z*Nw363UonxG?#zZZZ2CPL=PHO*nte3s{xL;1(VSkhBF;@;jK9
zkf*M+YZ2com$^vr_Zlq0VeCTw_nTX}ckCGdI!?Ski?|+-?Qji8;Tk>LJ7BcM%W!=A
z`~uI;e1%BT7=(Us%y@LnS}3QA9M8)JgYLechAIm-IM3y+zpt4Vzd;!=wObm
zfi&VZ$7L?c`Rl&IxgDbIdf$aPuEsvN#{HOu5}Z!B{wZ*8p7~r{fc&uEMEL!2o_x;l
zd+&GrboNcRf1@3(MKE{1$7?VR!!Qt|VV(aB=dFd`oayiz{UEM}wR^VV8m7Xt2z&D#
zGS|Kz-gAA{K%DzRZ%Icz2Iz2DdCRvv%NoG>1WTq@NA~PX1G@VXW
z6em&@9TFusQv1WB9+g8YYbz@z)?_AhpI<*9DsJo+B^yhlQVw!RHY&|#tGj3a29D#m
A;s5{u
literal 3870
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
baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@
diff --git a/web/public/index.html b/web/public/index.html
index ea91592b..b7134f53 100644
--- a/web/public/index.html
+++ b/web/public/index.html
@@ -9,7 +9,7 @@
name="description"
content="Web site created using create-react-app"
/>
- 项目模板
+ One API
You need to enable JavaScript to run this app.
diff --git a/web/public/logo.png b/web/public/logo.png
index fc44b0a3796c0e0a64c3d858ca038bd4570465d9..0f237a226583e08f89f14a15d86aa330a11151ae 100644
GIT binary patch
literal 8085
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
literal 5347
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
X@eDJUQo;Ye2mwlRs {
{Footer === '' ? (