1. 16 Jun, 2025 2 commits
  2. 15 Jun, 2025 2 commits
    • feat: add admin-only "remark" support for users · 1f6ec017
      * backend
        - model: add `Remark` field (varchar 255, `json:"remark,omitempty"`); AutoMigrate handles schema change automatically
        - controller:
          * accept `remark` on user create/update endpoints
          * hide remark from regular users (`GetSelf`) by zero-ing the field before JSON marshalling
          * clarify inline comment explaining the omitempty behaviour
      
      * frontend (React / Semi UI)
        - AddUser.js & EditUser.js: add “Remark” input for admins
        - UsersTable.js:
          * remove standalone “Remark” column
          * show remark as a truncated Tag next to username with Tooltip for full text
          * import Tooltip component
        - i18n: reuse existing translations where applicable
      
      This commit enables administrators to label users with private notes while ensuring those notes are never exposed to the users themselves.
      Apple\Apple committed
  3. 14 Jun, 2025 11 commits
  4. 13 Jun, 2025 13 commits
    • 🎛️ feat(dashboard): add per-panel enable switches & conditional backend payload · 882cdbd3
      Backend:
      • ConsoleSetting
        - Introduce `ApiInfoEnabled`, `UptimeKumaEnabled`, `AnnouncementsEnabled`, `FAQEnabled` (default true).
      • misc.GetStatus
        - Refactor to build response map dynamically.
        - Return the four *_enabled flags.
        - Only append `api_info`, `announcements`, `faq` when their respective flags are true.
      
      Frontend:
      • Detail page
        - Remove all `self_use_mode_enabled` checks.
        - Render API, Announcement, FAQ and Uptime panels based on the new *_enabled flags.
      • Dashboard → Settings
        - Added `Switch` controls in:
          · SettingsAPIInfo.js
          · SettingsAnnouncements.js
          · SettingsFAQ.js
          · SettingsUptimeKuma.js
        - Each switch persists its state via `/api/option` to the corresponding
          `console_setting.<panel>_enabled` key and reflects current status on load.
        - DashboardSetting.js now initialises and refreshes the four *_enabled keys so
          child components receive accurate panel states.
      
      Fixes:
      • Switches previously defaulted to “on” because *_enabled keys were missing.
        They are now included, ensuring correct visual state when panels are disabled.
      
      No breaking changes; existing functionality remains untouched aside from the
      new per-panel visibility control.
      Apple\Apple committed
    • feat: Add `controller/console_migrate.go` providing… · bccb87fe
       feat: Add `controller/console_migrate.go` providing `/api/option/migrate_console_setting` endpoint for one-off data migration.
      Apple\Apple committed
    • 🧹 refactor: drop obsolete ValidateApiInfo API & update callers · ce0ff679
      Backend
      • Removed the exported function `ValidateApiInfo` from `setting/console_setting/validation.go`; it was only a legacy wrapper and is no longer required.
      • Updated `controller/option.go` to call `ValidateConsoleSettings(value, "ApiInfo")` directly when validating `console_setting.api_info`.
      • Confirmed there are no remaining references to `ValidateApiInfo` in the codebase.
      
      This commit eliminates the last piece of compatibility code related to the old validation interface, keeping the API surface clean and consistent.
      Apple\Apple committed
    • refactor(console_setting): migrate console settings to model_setting auto-injection · 9d384f97
      Backend
      - Introduce `setting/console_setting` package that defines `ConsoleSetting` struct with JSON tags and validation rules.
      - Register the new module with `config.GlobalConfig` to enable automatic injection/export of configuration values.
      - Remove legacy `setting/console.go` and the manual `OptionMap` hooks; clean up `model/option.go`.
      - Add `controller/console_migrate.go` providing `/api/option/migrate_console_setting` endpoint for one-off data migration.
      - Update controllers (`misc`, `option`, `uptime_kuma`) and router to consume namespaced keys `console_setting.*`.
      
      Frontend
      - Refactor dashboard pages (`SettingsAPIInfo`, `SettingsAnnouncements`, `SettingsFAQ`, `SettingsUptimeKuma`) and detail page to read/write the new keys.
      - Simplify `DashboardSetting.js` state to only include namespaced options.
      
      BREAKING CHANGE: All console-related option keys are now stored under `console_setting.*`. Run the migration endpoint once after deployment to preserve existing data.
      Apple\Apple committed
    • 🎫 feat: Enhance redemption code expiry handling & improve UI responsiveness · f5e3617c
      Backend
      • Introduced `validateExpiredTime` helper in `controller/redemption.go`; reused in both Add & Update endpoints to enforce “expiry time must not be earlier than now”, eliminating duplicated checks
      • Removed `RedemptionCodeStatusExpired` constant and all related references – expiry is now determined exclusively by the `expired_time` field for simpler, safer state management
      • Simplified `DeleteInvalidRedemptions`: deletes codes that are `used` / `disabled` or `enabled` but already expired, without relying on extra status codes
      • Controller no longer mutates `status` when listing or fetching redemption codes; clients derive expiry status from timestamp
      
      Frontend
      • Added reusable `isExpired` helper in `RedemptionsTable.js`; leveraged for:
        – status rendering (orange “Expired” tag)
        – action-menu enable/disable logic
        – row styling
      • Removed duplicated inline expiry logic, improving readability and performance
      • Adjusted toolbar layout: on small screens the “Clear invalid codes” button now wraps onto its own line, while “Add” & “Copy” remain grouped
      
      Result
      The codebase is now more maintainable, secure, and performant with no redundant constants, centralized validation, and cleaner UI behaviour across devices.
      Apple\Apple committed
    • 🎨 feat(ui): enhance table headers with descriptive titles and semantic icons · 8c5f46ce
      - Add informative header section to TokensTable with Key icon and description
      - Replace generic eye icon with semantic Ticket icon in RedemptionsTable header
      - Import additional UI components (Divider, Typography) for better layout structure
      - Improve user experience with contextual information about token and redemption functionality
      - Maintain consistent styling and layout between both table components
      
      The changes provide users with clear understanding of each table's purpose:
      - Tokens: "令牌用于API访问认证,可以设置额度限制和模型权限" with Key icon
      - Redemptions: "兑换码可以批量生成和分发,适合用于推广活动或批量充值" with Ticket icon
      Apple\Apple committed
    • feat(ui): add incremental-add feedback & translations for model lists (#1218) · f4874c2c
      Front-end enhancements around “Add custom models”:
      
      • EditChannel.js / EditTagModal.js
        – Skip models that already exist instead of blocking the action.
        – Collect actually inserted items and display:
            • Success toast: “Added N models: model1, model2 …”
            • Info toast when no new model detected.
        – Keeps UX smooth while preserving deduplication logic.
      
      • i18n
        – en.json: added keys
            • "已新增 {{count}} 个模型:{{list}}"
            • "未发现新增模型"
        – Fixed a broken JSON string containing smart quotes to maintain valid syntax.
      
      Result:
      Users can bulk-paste model names; duplicates are silently ignored and the UI clearly lists what was incrementally appended. All messages are fully internationalised.
      
      Closes #1218
      Apple\Apple committed
    • 🐛 fix(ability): keep case-sensitive (group, model) keys during deduplication · 0c34eb43
      The previous patch lower-cased `group` and `model` when building the
      temporary `abilitySet` used to prevent duplicate inserts.
      This merged models that differ only by letter case, e.g.
      `GPT-3.5-turbo` vs `gpt-3.5-turbo`, causing them to disappear from the
      user’s available-models list and pricing page.
      
      Change:
      • ability.go – removed all `strings.ToLower` calls when composing the
        deduplication key (`group|model`), so duplicates are checked in a
        case-sensitive manner while preserving the original data.
      
      Result:
      • `GPT-3.5-turbo` and `gpt-3.5-turbo` are now treated as distinct
        models throughout the system.
      Apple\Apple committed
    • 🐛 fix(ability): prevent duplicate (group, model) pairs when saving channels · 21523833
      When importing large model lists (≈700+) an attempt to save a channel
      could fail with:
      
          Error 1062 (23000): Duplicate entry 'default-DeepSeek-1' for key 'abilities.PRIMARY'
      
      Root cause: AddAbilities / UpdateAbilities inserted the same
      (group, model) pair multiple times if the input list contained
      duplicates or case-variants (e.g. `default` vs `Default`).
      
      Changes:
      • ability.go
        – AddAbilities: introduced `abilitySet` to deduplicate by
          lower-cased `group|model` key before batch-inserting.
        – UpdateAbilities: applied the same deduplication logic when
          rebuilding abilities inside a transaction.
      
      Notes:
      • The lower-casing is only for set comparison; the original
        `group` and `model` values are preserved when persisting to DB,
        so case sensitivity of stored data is unchanged.
      • Batch chunking logic (lo.Chunk) and performance characteristics
        remain unaffected.
      
      Fixes #1215
      Apple\Apple committed
    • 🐛 fix(setup): enforce username length ≤ 12 during initial system setup · bbeaa6a2
      The User model applies `validate:"max=12"` to the `Username` field, but the
      initial setup flow did not validate this constraint. This allowed creation
      of a root user with an overly long username (e.g. "Uselessly1344"), which
      later caused every update request to fail with:
      
        Field validation for 'Username' failed on the 'max' tag
      
      This patch adds an explicit length check in `controller/setup.go` to reject
      usernames longer than 12 characters during setup, keeping validation rules
      consistent across the entire application.
      
      Refs: #1214
      Apple\Apple committed
  5. 12 Jun, 2025 12 commits
    • Update README.md · 671dcea9
      Calcium-Ion committed
    • 💬 fix(PersonalSetting): improve notification message accuracy for settings save operation · ee2679b9
      - Change success message from "通知设置已更新" to "设置保存成功"
      - Change error message from "更新通知设置失败" to "设置保存失败"
      - Makes messages more generic since the function saves multiple types of settings (notification, pricing, IP logging) not just notification settings
      Apple\Apple committed
    • 🔒 feat: Add user-configurable IP logging for consume and error logs · 28c3aef7
      - Add IP field to Log model with database index and default empty value
      - Implement conditional IP recording based on user setting in RecordConsumeLog and RecordErrorLog
      - Add UserSettingRecordIpLog constant and update user settings API to handle record_ip_log field
      - Create dedicated "IP记录" tab in personal settings under "其他设置" section
      - Add IP column to logs table with help tooltip explaining recording conditions
      - Make IP column visible to all users (not admin-only) with proper filtering for consume/error log types
      - Restrict display of use_time and retry columns to consume and error log types only
      - Update personal settings UI structure: rename "通知设置" to "其他设置" to accommodate new functionality
      - Add proper translation support and maintain consistent styling across components
      
      The IP logging feature is disabled by default and only records client IP addresses
      for consume (type 2) and error (type 5) logs when explicitly enabled by users
      in their personal settings.
      Apple\Apple committed
    • Merge pull request #1207 from QuantumNous/user_group_ratio · 158d621f
      feat: 分组特殊倍率
      Calcium-Ion committed
    • 🔧 refactor(LogsTable, render): remove undefined parameters for improved clarity… · 0e974418
      🔧 refactor(LogsTable, render): remove undefined parameters for improved clarity and consistency in function signatures
      CaIon committed
    • 🔧 fix(token hooks): adapt token key fetcher to new paginated API · b1176d02
      Changes
      1. web/src/helpers/token.js
         • `fetchTokenKeys` now calls `/api/token/?p=1&size=10` (1-based paging).
         • Supports new response shape `{ items, total, page, page_size }`; falls back gracefully if array is returned.
         • Filters active tokens from `tokenItems`, not `data` directly.
      
      `useTokenKeys` remains unchanged—its consumer code receives the same list of active keys.
      Apple\Apple committed
    • 🐛 fix: correct loading state for search button in TokensTable · 3f67ef2d
      Fix the search button loading state to be consistent with other table components.
      The search button now properly shows loading animation when the table data is
      being fetched.
      
      Changes:
      - Update search button loading prop from `loading={searching}` to
        `loading={loading || searching}` in TokensTable.js
      - This ensures loading state is shown both when searching with keywords
        (searching=true) and when loading default data (loading=true)
      - Aligns with the behavior of other table components like ChannelsTable,
        UsersTable, and RedemptionsTable
      
      Before: Search button only showed loading when searching with keywords
      After: Search button shows loading for all table data fetch operations
      Apple\Apple committed
    • 🎨style: Standardize pagination text format in Dashboard components · f7b870c1
      - Replace `showTotal` with `formatPageText` in Dashboard table components
      - Unify pagination text format to match table components pattern
      - Update SettingsAnnouncements.js, SettingsAPIInfo.js, and SettingsFAQ.js
      - Change from "共 X 条记录,显示第 Y-Z 条" to "第 Y - Z 条,共 X 条" format
      - Ensure consistent user experience across all table components
      
      This change improves UI consistency by standardizing the pagination
      text format across Dashboard and table components.
      Apple\Apple committed
    • 🚀 feat(pagination): unify backend-driven pagination & improve channel tag aggregation · a5060129
      SUMMARY
      • Migrated Token, Task, Midjourney, Channel, Redemption tables to true server-side pagination.
      • Added total / page / page_size metadata in API responses; switched all affected React tables to consume new structure.
      • Implemented counting helpers:
        – model/token.go CountUserTokens
        – model/task.go TaskCountAllTasks / TaskCountAllUserTask
        – model/midjourney.go CountAllTasks / CountAllUserTask
        – model/channel.go CountAllChannels / CountAllTags
      • Refactored controllers (token, task, midjourney, channel) for 1-based paging & aggregated returns.
      • Redesigned `ChannelsTable.js`:
        – `loadChannels`, `syncPageData`, `enrichChannels` for tag-mode grouping without recursion.
        – Fixed runtime white-screen (maximum call-stack) by removing child duplication.
        – Pagination, search, tag-mode, idSort all hot-reload correctly.
      • Removed unused `log` import in controller/midjourney.go.
      
      BREAKING CHANGES
      Front-end consumers must now expect data.items / total / page / page_size from list endpoints (`/api/channel`, `/api/task`, `/api/mj`, `/api/token`, etc.).
      Apple\Apple committed