swagger

移除 merchant

swagger

改造首页内容为通用后台管理系统定位

- 修改首页标题从 'LINUX DO Credit' 改为 'Modern Platform'
- 更新副标题为 '为二次开发而生'
- 更新首页描述为通用平台的特点
- 更新首页特性标签为 '开箱即用、高度可扩展、工业级基建'
- 修改展示卡片为技术栈和二次开发相关
- 更新开发者示例代码为通用的注册和 API Key 获取示例
- 更新页脚品牌名为 'Modern Platform'
- 调整页脚导航链接为通用平台相关内容

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

去除遗留

裁剪
移除 /api/v1/user/pay-key 相关代码

- 删除后端 UpdatePayKey 处理器函数和 UpdatePayKeyRequest 结构体
- 删除 User 模型中的 PayKey 字段
- 删除 User.VerifyPayKey 方法
- 删除 EncryptPayKeyFailed 错误常量
- 删除 /api/v1/user/pay-key PUT 路由
- 删除 OAuth 返回中的 IsPayKey 字段
- 删除前端 UserService.updatePayKey 方法
- 删除前端所有支付密钥 UI 和逻辑
- 更新相关的导出和注释

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

去除遗留

api 修正

系统配置

前端裁剪

后端裁剪

init
This commit is contained in:
ryan
2026-06-07 15:32:14 +08:00
parent 8a782525de
commit 48d414e197
180 changed files with 1538 additions and 27463 deletions
+29 -60
View File
@@ -22,88 +22,57 @@ import (
"github.com/gin-gonic/gin"
"github.com/linux-do/credit/internal/model"
"github.com/linux-do/credit/internal/util"
"github.com/shopspring/decimal"
)
// PublicConfigResponse 公共配置响应
type PublicConfigResponse struct {
DisputeTimeWindowHours int `json:"dispute_time_window_hours"` // 争议时间窗口(小时)
RedEnvelopeEnabled bool `json:"red_envelope_enabled"` // 红包功能是否启用
RedEnvelopeMaxAmount decimal.Decimal `json:"red_envelope_max_amount"` // 单个红包的最大积分上限
RedEnvelopeDailyLimit int `json:"red_envelope_daily_limit"` // 每日发红包的个数限制
RedEnvelopeFeeRate decimal.Decimal `json:"red_envelope_fee_rate"` // 红包手续费率
RedEnvelopeMaxRecipients int `json:"red_envelope_max_recipients"` // 每个红包的最大可领取人数上限
SettlementDelayDaysMin int `json:"settlement_delay_days_min"` // 商户收款延迟到账最小天数
SettlementDelayDaysMax int `json:"settlement_delay_days_max"` // 商户收款延迟到账最大天数
UploadAllowedExtensions string `json:"upload_allowed_extensions"` // 允许上传的图片扩展名
SiteName string `json:"site_name"` // 站点名称
RegistrationEnabled bool `json:"registration_enabled"` // 是否允许注册
MaxAPIKeysPerUser int `json:"max_api_keys_per_user"` // 每个用户最大 API Key 数量
}
// GetPublicConfig 获取公共配置
// @Summary 获取公共配置
// @Description 返回对前端公开的系统配置信息,如允许上传的文件类型、站点名称、是否开放注册等
// @Tags config
// @Accept json
// @Produce json
// @Success 200 {object} util.ResponseAny
// @Router /api/v1/config/public [get]
func GetPublicConfig(c *gin.Context) {
// 获取争议时间窗口配置
disputeTimeHours, err := model.GetIntByKey(c.Request.Context(), model.ConfigKeyDisputeTimeWindowHours)
if err != nil {
c.JSON(http.StatusInternalServerError, util.Err(err.Error()))
return
ctx := c.Request.Context()
var sc model.SystemConfig
// 1. upload_allowed_extensions
var uploadExtensions string
if err := sc.GetByKey(ctx, model.ConfigKeyUploadAllowedExtensions); err == nil {
uploadExtensions = sc.Value
}
// 获取红包功能启用状态
redEnvelopeEnabled, err := model.GetBoolByKey(c.Request.Context(), model.ConfigKeyRedEnvelopeEnabled)
if err != nil {
c.JSON(http.StatusInternalServerError, util.Err(err.Error()))
return
// 2. site_name
var siteName string
if err := sc.GetByKey(ctx, model.ConfigKeySiteName); err == nil {
siteName = sc.Value
}
// 获取红包配置
redEnvelopeMaxAmount, err := model.GetDecimalByKey(c.Request.Context(), model.ConfigKeyRedEnvelopeMaxAmount, 2)
if err != nil {
c.JSON(http.StatusInternalServerError, util.Err(err.Error()))
return
// 3. registration_enabled
var registrationEnabled bool
if val, err := model.GetBoolByKey(ctx, model.ConfigKeyRegistrationEnabled); err == nil {
registrationEnabled = val
}
redEnvelopeDailyLimit, err := model.GetIntByKey(c.Request.Context(), model.ConfigKeyRedEnvelopeDailyLimit)
if err != nil {
c.JSON(http.StatusInternalServerError, util.Err(err.Error()))
return
}
redEnvelopeFeeRate, err := model.GetDecimalByKey(c.Request.Context(), model.ConfigKeyRedEnvelopeFeeRate, 2)
if err != nil {
c.JSON(http.StatusInternalServerError, util.Err(err.Error()))
return
}
redEnvelopeMaxRecipients, err := model.GetIntByKey(c.Request.Context(), model.ConfigKeyRedEnvelopeMaxRecipients)
if err != nil {
c.JSON(http.StatusInternalServerError, util.Err(err.Error()))
return
}
settlementDelayDaysMin, err := model.GetIntByKey(c.Request.Context(), model.ConfigKeySettlementDelayDaysMin)
if err != nil {
c.JSON(http.StatusInternalServerError, util.Err(err.Error()))
return
}
settlementDelayDaysMax, err := model.GetIntByKey(c.Request.Context(), model.ConfigKeySettlementDelayDaysMax)
if err != nil {
c.JSON(http.StatusInternalServerError, util.Err(err.Error()))
return
// 4. max_api_keys_per_user
var maxAPIKeys int
if val, err := model.GetIntByKey(ctx, model.ConfigKeyMaxAPIKeysPerUser); err == nil {
maxAPIKeys = val
}
response := PublicConfigResponse{
DisputeTimeWindowHours: disputeTimeHours,
RedEnvelopeEnabled: redEnvelopeEnabled,
RedEnvelopeMaxAmount: redEnvelopeMaxAmount,
RedEnvelopeDailyLimit: redEnvelopeDailyLimit,
RedEnvelopeFeeRate: redEnvelopeFeeRate,
RedEnvelopeMaxRecipients: redEnvelopeMaxRecipients,
SettlementDelayDaysMin: settlementDelayDaysMin,
SettlementDelayDaysMax: settlementDelayDaysMax,
UploadAllowedExtensions: uploadExtensions,
SiteName: siteName,
RegistrationEnabled: registrationEnabled,
MaxAPIKeysPerUser: maxAPIKeys,
}
c.JSON(http.StatusOK, util.OK(response))