ChatGPT-Shortcut(AiShort)账户体系详解:Google 登录、免密链接登录与账户数据管理的源码级实现
AI 应用提示工程人工智能前端【免费下载链接】ChatGPT-ShortcutStop writing prompts from scratch — a searchable prompt library for ChatGPT, Claude, Gemini and Cursor · Русский 한국어 العربية हिन्दी ไทย 别再从头写提示词现成的拿来就用好用的收进自己的库项目地址https://gitcode.com/gh_mirrors/ch/ChatGPT-Shortcut点击查看免费下载ChatGPT-ShortcutAiShort是一个可搜索的提示词库支持 ChatGPT、Claude、Gemini 与 Cursor 等多个 AI 工具。它允许匿名使用但只有登录后才能收藏提示词、创建自定义提示词、分享到社区并在多台设备间同步「我的收藏」。本文基于仓库中的账户指南文档i18n/de/docusaurus-plugin-content-docs/current/guides/account.md与对应前端源码完整讲解三种登录方式、注册流程、「我的账户」页面的个人资料与密码管理、L0–L9 等级体系以及数据导出/导入/缓存清除的实现细节帮助读者既会用这些功能又理解它们背后的 API 调用链与本地缓存机制。为什么账号是可选的站点本身是无账号可用的浏览提示词、搜索、复制提示词都不需要登录。登录的价值在于收藏精选提示词与社区提示词到「我的收藏」创建、编辑、删除自己的自定义提示词可公开分享或设为私密将上述数据按账户存储实现跨设备、跨浏览器同步。从前端结构看整个身份体系围绕 src/components/AuthContext.tsx 展开登录成功后 JWT 写入localStorage的auth_tokenAuthProvider 再拉取/myspace等用户数据并维护全局状态页面组件收藏视图、用户中心都从该 Context 读取。三种登录方式登录对话框提供「密码登录」和「免密登录」两个 Tab外加一键 Google 登录。在 src/components/user/login.tsx 中对话框通过viewStatelogin/register/forgot-password和loginTypepassword/code两个状态切换不同表单视图所有请求最终汇聚到 src/api/auth.ts 导出的接口函数。密码登录使用用户名或注册邮箱 密码登录。对应源码为login()export async function login(values: { username: string; password: string }) { const response await apiClient.post(/auth/local, { identifier: values.username, password: values.password, }); clearUserCachesOnLogin(); // 清除旧用户的 USER_PROFILE 与 MySpace 缓存 return response; }两个实现细节值得注意identifier 即用户名或邮箱——接口不区分二者用户填哪个后端都能识别这与 UI 中「用户名/邮箱」的占位符提示一致登录后先清缓存——clearUserCachesOnLogin()会同时清掉USER_PROFILE与MySpace两块本地缓存防止上一个账号的残留 ETag 与新账号巧合命中源码注释明确指出这是为避免旧账号数据串到新账号。登录成功后 src/components/user/login.tsx 中的handleSuccess会把 JWT 存入localStorage(auth_token)通过window.postMessage向浏览器扩展页发送{ action: login, username, jwt }消息让浏览器扩展也能感知登录状态然后刷新页面。免密登录登录链接适合「只是偶尔登录一次」的用户无需记忆密码切到「免密登录」Tab输入注册邮箱或用户名点击「获取登录链接」系统向你的邮箱发送一条登录链接点击邮件中的链接完成登录。源码上有两点比文档更细前端 src/components/user/login.tsx 的handleSendPasswordlessLink会用正则/\S\S\.\S/判断输入是否为邮箱格式是邮箱就发{ email }不是就发{ username }所以用户名同样能收到登录链接接口分两步sendPasswordlessLink()向POST /passwordless/send-link发请求取链接用户点击邮件中的链接后页面携带loginToken调loginWithToken()执行GET /passwordless/login?loginToken...拿回jwt后同样执行persistAuthToken 清缓存与密码登录走同一条状态落地路径。Google 一键登录在登录对话框点击「Login via Google」即可首次通过 Google 登录时系统会自动为你创建账户无需单独注册。从 src/api/auth.ts 的实现看Google 登录是一个完整的 OAuth 重定向流程且由USE_LEGACY_GAUTH开关见 src/api/config.ts在两套后端流程间切换配置流程USE_LEGACY_GAUTH false当前默认前端拼接${GAUTH_API_BASE}/api/connect/google?redirectorigin/user/auth由 Strapi 原生 OAuth 路由接管回调时把jwt与user带回前端USE_LEGACY_GAUTH true旧版先请求/strapi-google-auth/init获取跳转 URL授权后用code调/strapi-google-auth/user-profile换取 token再调/me拉取用户信息关键常量与路径均来自 src/api/config.ts 与 src/api/auth.tsexport const API_URL https://api.newzone.top/api; // 主 APIStrapi 后端 export const GAUTH_API_BASE https://gauth.aishort.top; // Google OAuth 入口服务 export const USE_LEGACY_GAUTH false;配置注释解释了为什么需要独立的gauth服务主服务器所在网络无法直连 Google因此 OAuth 入口被拆到独立域名。前端侧handleGoogleLogin会打开一个 520×570 的弹出窗口展示加载动画跳转到认证 URL授权完成后window的message事件监听器捕获回传的jwt/access_token/code等载荷调用googleLogin()完成认证。若弹窗被浏览器拦截会提示「Pop-up window blocked」。登录态的本地校验JWT 并非「存了就算数」。src/components/AuthContext.tsx 中的isValidToken会在本地解码 JWT 的payload.exp并与当前时间比较预留 60 秒时钟偏差余量过期的 token 会被直接删除并视为未登录避免拿着失效凭证反复请求后端解析失败时则保守地认为有效防止误登出。此外 AuthProvider 采用 stale-while-revalidate 策略——刷新页面时先用本地缓存的user_auth立即渲染避免登录状态「闪烁」。注册账户在登录对话框点击「立即注册」切到注册视图填写用户名、邮箱、密码并勾选同意服务条款与隐私政策提交后自动完成登录。表单校验规则src/components/user/login.tsx 顶部的rules给出了具体约束用户名必填密码必填且至少 6 个字符邮箱必填且需通过邮箱格式校验注册必须勾选同意框否则报错「使用前须同意服务条款和隐私政策」。注册请求由 src/api/auth.ts 的register()发出POST /auth/local/register载荷为{ username, email, password }。与密码登录复用同一个handleAuth成功处理器——返回的jwt落盘、postMessage通知扩展、500ms 后刷新页面所以注册完即处于登录态。我的账户页面登录后进入「我的账户」页src/pages/user/index.tsx页面未加载到用户信息时会在 2 秒后自动跳回首页即未登录访问会重定向。页面分为三块用户信息、安全设置、数据管理。修改用户名点击用户名旁的编辑图标输入新用户名并点保存。源码对应submitNewUsername调用 src/api/user.ts 的updateUsername()即PUT /favorites/update-username载荷{ newUsername }成功后重新拉取用户信息刷新页面。接口名带favorites前缀可以推断后端把「显示名」归在收藏/社区可见性相关的控制器里管理改名会同步影响该用户提示词在社区的展示。修改密码与忘记密码修改密码三步填写当前密码 → 填写并确认新密码 → 点「修改密码」对应 src/api/auth.ts 的changePassword()POST /auth/change-password载荷为{ currentPassword, newPassword, confirmPassword }其中新密码以password与passwordConfirmation两个字段提交。这里有一个源码中才能发现的细节src/pages/user/index.tsx 中「当前密码」输入框只在userInfo?.provider local时渲染。也就是说通过 Google 登录的账户provider 不是 local修改密码时无需填写当前密码只需设置新密码——这也意味着 Google 账户可以「补一个密码」之后即可用密码登录。忘记密码有两条入口登录对话框的「忘记密码」以及「我的账户 → 安全设置」右上角的「忘记密码」按钮。两者都调用 src/api/auth.ts 的forgotPassword()POST /auth/forgot-password向注册邮箱发送重置邮件然后点击邮件中的链接由 src/pages/reset-password.tsx 页面处理最终重置对应resetPassword()POST /auth/reset-password载荷{ code, newPassword, confirmPassword }其中code来自邮件链接。等级体系L0–L9账户页会展示你的LevelL0–L9与升到下一级的进度。等级由你分享到社区的提示词数量决定——注意统计的是share为真的自定义提示词src/pages/user/index.tsx 中userprompts.filter((p) p.share).length收藏数、浏览数都不计入。具体阈值曲线定义在 src/components/LevelSystem.tsxexport const LEVEL_THRESHOLDS [0, 1, 3, 8, 18, 35, 60, 100, 160, 260];等级名称所需分享提示词数L0萌新探索者0L1青铜≥ 1L2白银≥ 3L3黄金≥ 8L4铂金≥ 18L5钻石≥ 35L6蓝宝石≥ 60L7红宝石≥ 100L8翡翠≥ 160L9星辉≥ 260相邻等级跨距依次为 1、2、5、10、17、25、40、60、100约 1.6–2 倍递增曲线平滑L9 被定位为「传奇」档。页面显示的进度百分比为min(100, sharedCount / next * 100)达到 L9 后显示「MAX REACHED」。等级图标是一组随等级累积几何元素的 SVG 多边形src/components/LevelSystem.tsx 的LevelIconL7 加中心圆点、L8 加粗描边、L9 加 8 条辐射线纯 stroke 绘制、跨平台不依赖 emoji 字体。数据管理「我的账户 → 数据管理」提供三个操作清除缓存、导出提示词、导入提示词。清除缓存点击「清除所有缓存」带二次确认弹窗会执行 src/pages/user/index.tsx 的handleClearCacheclearUserProfileCache(); // 清除 USER_PROFILE 缓存 clearMySpaceCache(); // 清除 MYSPACE 缓存 await fetchUserInfo(); // 重新拉取用户数据它只刷新本地缓存不会删除任何服务端数据收藏与自定义提示词都保存在账户里清缓存只是丢弃浏览器里的旧副本并重新同步。文档建议的使用场景正是「数据不同步或显示异常」时的第一步自救——因为前端大量使用 ETag TTL 缓存见 src/api/user.ts 中getUserAllInfo对If-None-Match/ 304 的处理偶发不一致时清缓存可强制重新协商。导出提示词点「导出数据」生成一个 JSON 文件并自动下载文件名形如my-prompts-2026-09-24.json当天日期。src/pages/user/index.tsx 的handleExportPrompts会先批量拉取自定义提示词、收藏的精选卡cards与社区提示词commus的完整数据再组装导出结构{ exportTime: ISO8601 时间戳, prompts: [ // 全部自定义提示词 { id: 1, title: …, prompt: …, remark: …, notes: …, share: true } ], favorites: { card: [3, 7], community: [12] }, // 收藏 ID 列表导入用 favoriteDetails: [ /* 收藏的详细内容仅供人工查看导入时忽略 */ ], myspaceOrder: [ /* MySpace 卡片顺序type/source/id 三元组 */ ], customTags: [ /* 自定义标签定义 */ ] }字段含义上值得注意prompts里prompt字段对应后端存储的descriptionshare表示该提示词是否已分享到社区favoriteDetails与myspaceOrder、customTags是备份性质的快照当前联网版导入时不会用它们恢复排序与标签源码注释解释了原因排序/标签中的 ID 属于源用户覆盖式写入会破坏目标用户已有的体系。导入提示词选择 JSON 文件导入handleImportPrompts的实现比文档描述复杂得多兼容三种输入格式纯数组[ { title, prompt, … } ]对象{ prompts: [...], favorites: { card: [], community: [] } }即导出文件本身单个提示词对象{ title, prompt|description }。规范化时以prompt || description作为正文过滤掉缺title或缺正文的条目。冲突处理策略分四种情形情形行为有id且属于当前用户内容与现有完全一致跳过skipped有id且属于当前用户内容有差异按id更新该提示词无id新建share默认取文件值缺省为公开true有id但不属于当前用户作为新的私密提示词创建share: false防止误覆盖他人数据收藏导入采用增量合并只把本地不存在的favorites.card/favorites.communityID 通过PATCH /favoritesloves.add/commLoves.add合并进现有收藏不做删除且服务端按 merge 语义处理以保证多设备并发安全。全部任务用Promise.allSettled并发执行完成后汇总「成功 / 跳过 / 失败」数量并给出「全部成功」「部分导入成功 (x/y)」「导入失败」三档提示最后调用refreshUserAuth()刷新 MySpace 视图。小结账户数据流全景把本文涉及的端点串起来AiShort 账户体系的完整调用链为认证POST /auth/local/register注册、POST /auth/local密码登录、POST /passwordless/send-linkGET /passwordless/login免密、GET /api/connect/googleOAuth、POST /auth/change-password、POST /auth/forgot-passwordPOST /auth/reset-password账户数据GET /users/meETag 缓存、PUT /favorites/update-username改名、GET /myspace收藏 自定义提示词聚合前端职责JWT 本地过期校验、Stale-While-Revalidate 缓存、登录后强制清缓存、乐观更新 失败回滚。所有认证请求集中封装在 src/api/auth.ts端点基址集中在 src/api/config.ts便于整体替换后端页面层则分别是 src/components/user/login.tsx登录/注册/忘记密码对话框与 src/pages/user/index.tsx我的账户。相关文档入门指南基本使用方法我的收藏收藏与自定义标签管理自定义提示词创建、编辑、分享与导出提示词赞分享AI 应用提示工程人工智能前端【免费下载链接】ChatGPT-ShortcutStop writing prompts from scratch — a searchable prompt library for ChatGPT, Claude, Gemini and Cursor · Русский 한국어 العربية हिन्दी ไทย 别再从头写提示词现成的拿来就用好用的收进自己的库项目地址https://gitcode.com/gh_mirrors/ch/ChatGPT-Shortcut点击查看免费下载相关推荐Meteor 用户与账户系统完全指南密码登录、无密码登录、2FA 与 OAuth 集成实战Meteor 用户与账户系统完全指南密码登录、无密码登录、2FA 与 OAuth 集成实战 导读 本文以 Meteor 官方教程 Users and Acc后端前端开发工具移动开发docker-mailserver 的 Dovecot Master Accounts主账户详解跨账户管理登录与热备份实践docker mailserver 的 Dovecot Master Accounts主账户详解跨账户管理登录与热备份实践 导读 本文围绕 docker后端通信云原生downkyi账户登录记录查看检查账号的登录历史downkyi账户登录记录查看检查账号的登录历史 一、登录记录审计的安全价值 B站用户账号面临的登录风险呈现三大特征 | 风险类型 | 技术原理 | 检测难上一篇告别游戏窗口边框Borderless Gaming 终极使用指南下一篇Wasp 语言.wasp DSL完全指南声明式配置与类型系统深度解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

云服务器部署 Docker 实战:为 Lottery 抽奖系统搭建容器环境与 Portainer 面板

云服务器部署 Docker 实战:为 Lottery 抽奖系统搭建容器环境与 Portainer 面板

文档教程后端 【免费下载链接】CodeGuide :books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助,请给予支持(关注、…

2026/9/25 10:52:33 阅读更多 →
Blender-MCP协议:让3D软件真正理解自然语言意图

Blender-MCP协议:让3D软件真正理解自然语言意图

1. 这不是语音控制,而是让Blender真正“听懂”你的话“说话就行!AI 让 Blender 自己动起来”——这句话在Blender社区刷屏时,我第一反应是皱眉。不是怀疑技术可行性,而是太熟悉过去十年里多少“语音驱动3D软件”的Demo&#xff1a…

2026/9/25 10:51:33 阅读更多 →
Kylin V10 SP3 x86 U盘安装避坑指南:Legacy BIOS、inst.repo与MBR分区实战

Kylin V10 SP3 x86 U盘安装避坑指南:Legacy BIOS、inst.repo与MBR分区实战

1. 项目概述:为什么KylinV10SP3-x86的U盘安装不是“点几下就完事”的事你手头有一台x86架构的老式工控机、国产信创台式机,或者一台刚从单位领回来的方正/同方/浪潮整机,系统盘是空的,BIOS里连UEFI/Legacy选项都得翻三页才能找到—…

2026/9/25 10:51:33 阅读更多 →

最新新闻

从免费CRM到独立部署:小团队搭建私人CRM网站全记录

从免费CRM到独立部署:小团队搭建私人CRM网站全记录

上个月我终于把客户资料从微信聊天记录、Excel表格和记事本里统一搬了出来,全部塞进了一套自己部署的CRM系统里。项目代号DeskcommCRM,听起来像个大厂产品,其实是我基于开源组件和一台轻量云服务器搭起来的私人客户关系管理网站。到今天跑了1…

2026/9/25 12:52:24 阅读更多 →
逐行精读Tftpd64的tftpd_thread.c:TFTP状态机、OACK选项协商与重传策略完整实现

逐行精读Tftpd64的tftpd_thread.c:TFTP状态机、OACK选项协商与重传策略完整实现

逐行精读Tftpd64的tftpd_thread.c:TFTP状态机、OACK选项协商与重传策略完整实现 【免费下载链接】tftpd64 The working repository of the famous TFTP server. 项目地址: https://gitcode.com/gh_mirrors/tf/tftpd64 Tftpd64 是 Windows 平台上最著名的 TFT…

2026/9/25 12:52:24 阅读更多 →
Large Language Models for Summarizing Czech Historical Documents and Beyond

Large Language Models for Summarizing Czech Historical Documents and Beyond

文章主要内容与创新点总结 一、主要内容 本文聚焦捷克语文本摘要任务,尤其是历史文献摘要这一研究缺口,展开了系统性研究,具体内容如下: 研究背景:文本摘要旨在精简文本同时保留核心信息,当前该领域研究多集中于英语等资源丰富语言,而捷克语(尤其是历史捷克语)因语言…

2026/9/25 12:52:24 阅读更多 →
Windows 8.1原版镜像下载与校验:MSDN正式版、SHA1验证及UEFI/GPT安装指南

Windows 8.1原版镜像下载与校验:MSDN正式版、SHA1验证及UEFI/GPT安装指南

隔三差五就有人来问我:网上那些 Windows 8.1 纯净版、完美优化版、一键装机版,到底能不能用?我的回答一直没变——如果你需要的是一个稳定的 Windows 8.1 镜像下载,就老老实实找微软官方原版,尤其是带 MSDN 正式版字样…

2026/9/25 12:52:24 阅读更多 →
自建CRM系统全攻略:从LNMP架构到数据安全运维

自建CRM系统全攻略:从LNMP架构到数据安全运维

先说个背景。去年团队规模从三个人扩到十来个人的时候,我们做的第一件事不是换办公室,而是认真解决客户信息管理的问题。之前客户资料全躺在个人微信、Excel 表格和邮箱里,每个人记法还不一样,有人记在备注里,有人单独建了个文档&…

2026/9/25 12:52:24 阅读更多 →
开放式代码评审实践:让每一行代码都被认真读过

开放式代码评审实践:让每一行代码都被认真读过

1. 开放式代码评审:让每一行代码都被认真读过先聊个场景。你花了几个小时写了一个功能,提交了合并请求,两天后评审人才姗姗来迟,留下一句“LGTM”就合入了。你心里清楚,这份代码里有几处设计瑕疵,有些边界条…

2026/9/25 12:51:23 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →