Password security policy (#4765)

* Psw (#4748)

* feat: 添加重置密码功能及相关接口

- 在用户模型中新增 passwordUpdateTime 字段以记录密码更新时间。
- 更新用户模式以支持密码更新时间的存储。
- 新增重置密码的模态框组件,允许用户重置密码。
- 实现重置密码的 API 接口,支持根据用户 ID 更新密码。
- 更新相关国际化文件,添加重置密码的提示信息。

* 更新国际化文件,添加重置密码相关提示信息,并优化重置密码模态框的实现。修复部分代码逻辑,确保用户体验流畅。

* 更新国际化文件,添加重置密码相关提示信息,优化重置密码模态框的实现,修复部分代码逻辑,确保用户体验流畅。新增获取用户密码更新时间的API接口,并调整相关逻辑以支持密码重置功能。

* update

* fix

* fix

* Added environment variables NEXT_PUBLIC_PASSWORD_UPDATETIME to support password update time configuration, update related logic to implement password mandatory update function, and optimize the implementation of reset password modal box to improve user experience.

* update index

* 更新用户密码重置功能,调整相关API接口,优化重置密码模态框的实现,确保用户体验流畅。修复部分代码逻辑,更新国际化提示信息。

* 删除获取用户密码更新时间的API接口,并在布局组件中移除不必要的重置密码模态框。优化代码结构,提升可维护性。

* update

* perf: reset expired password code

* perf: layout child components

* doc

* remove invalid env

* perf: update password code

---------

Co-authored-by: dreamer6680 <1468683855@qq.com>
This commit is contained in:
Archer
2025-05-08 12:11:08 +08:00
committed by GitHub
parent 96e7dd581e
commit c75f154728
24 changed files with 818 additions and 550 deletions

View File

@@ -65,6 +65,7 @@
"type": "类型",
"unlimited": "无限制",
"update_password": "修改密码",
"reset_password": "重置密码",
"update_success_tip": "更新数据成功",
"upgrade_package": "升级套餐",
"usage_balance": "使用余额: 使用余额",

View File

@@ -1,7 +1,28 @@
{
"Action": "操作",
"Add": "添加",
"Add Success": "添加成功",
"Add_new_input": "新增输入",
"All": "全部",
"App": "应用",
"Cancel": "取消",
"Choose": "选择",
"Click_to_expand": "点击查看详情",
"Close": "关闭",
"Code": "源码",
"Config": "配置",
"Confirm": "确认",
"Continue_Adding": "继续添加",
"Copy": "复制",
"Creating": "创建中",
"Delete": "删除",
"Detail": "详情",
"Documents": "文档",
"Done": "完成",
"Download": "下载",
"Edit": "编辑",
"Error": "错误",
"Exit": "退出",
"Export": "导出",
"FAQ.ai_point_a": "每次调用AI模型时都会消耗一定的AI积分。具体的计算标准可参考上方的“AI 积分计算标准”。系统会优先采用模型厂商返回的实际 usage若为空则采用GPT3.5的计算方式进行估算1Token≈0.7中文字符≈0.9英文单词连续出现的字符可能被认为是1个Tokens。",
"FAQ.ai_point_expire_a": "会过期。当前套餐过期后AI积分将会清空并更新为新套餐的AI积分。年度套餐的AI积分时长为1年而不是每个月。",
@@ -19,34 +40,76 @@
"FAQ.package_overlay_q": "额外资源包可以叠加么?",
"FAQ.switch_package_a": "套餐使用规则为优先使用更高级的套餐,因此,购买的新套餐若比当前套餐更高级,则新套餐立即生效:否则将继续使用当前套餐。",
"FAQ.switch_package_q": "是否切换订阅套餐?",
"File": "文件",
"Finish": "完成",
"Folder": "文件夹",
"FullScreen": "全屏",
"FullScreenLight": "全屏预览",
"Import": "导入",
"Input": "输入",
"Instructions": "使用说明",
"Intro": "介绍",
"Loading": "加载中...",
"Login": "登录",
"More": "更多",
"Move": "移动",
"Name": "名称",
"None": "无",
"OK": "好的",
"Open": "打开",
"Operation": "操作",
"Other": "其他",
"Output": "输出",
"Params": "参数",
"Parse": "解析",
"Permission": "权限",
"Permission_tip": "个人权限大于群组权限",
"Please Input Name": "请输入名称",
"Preview": "预览",
"Remove": "移除",
"Rename": "重命名",
"Required_input": "必填",
"Reset": "恢复默认",
"Restart": "重新开始",
"Resume": "恢复",
"Role": "权限",
"Run": "运行",
"Running": "运行中",
"Save": "保存",
"Save_and_exit": "保存并退出",
"Search": "搜索",
"Select_all": "全选",
"Setting": "设置",
"Status": "状态",
"Submit": "提交",
"Success": "成功",
"Team": "团队",
"UnKnow": "未知",
"Unlimited": "无限制",
"Update": "更新",
"Username": "用户名",
"Waiting": "等待中",
"Warning": "警告",
"Website": "网站",
"action_confirm": "操作确认",
"add_new": "新增",
"add_new_param": "新增参数",
"all_quotes": "全部引用",
"templateTags.Image_generation": "图片生成",
"templateTags.Office_services": "办公服务",
"templateTags.Roleplay": "角色扮演",
"templateTags.Web_search": "联网搜索",
"templateTags.Writing": "文本创作",
"all_result": "完整结果",
"back": "返回",
"base_config": "基础配置",
"bill_already_processed": "订单已处理",
"bill_expired": "订单已过期",
"bill_not_pay_processed": "非在线订单",
"button.extra_dataset_size_tip": "您正在购买【额外知识库容量】",
"button.extra_points_tip": "您正在购买【额外 AI 积分】",
"can_copy_content_tip": "无法使用浏览器自动复制,请手动复制下面内容",
"choosable": "可选",
"chose_condition": "选择条件",
"chosen": "已选",
"classification": "分类",
"click_drag_tip": "点我可拖动",
"click_select_avatar": "点击选择头像",
"click_to_copy": "点击复制",
"click_to_resume": "点击恢复",
"code_editor": "代码编辑",
@@ -114,164 +177,20 @@
"code_error.user_error.balance_not_enough": "账号余额不足~",
"code_error.user_error.bin_visitor_guest": "您当前身份为游客,无权操作",
"code_error.user_error.un_auth_user": "找不到该用户",
"commercial_function_tip": "请升级商业版后使用该功能https://doc.fastgpt.cn/docs/commercial/intro/",
"Action": "操作",
"Add": "添加",
"Add Success": "添加成功",
"Add_new_input": "新增输入",
"All": "全部",
"Cancel": "取消",
"Choose": "选择",
"Close": "关闭",
"Code": "源码",
"Config": "配置",
"Confirm": "确认",
"comfirn_create": "确认创建",
"comfirm_import": "确认导入",
"confirm_move": "移动到这",
"confirm_update": "确认更新",
"comfirm_leave_page": "确认离开该页面?",
"Continue_Adding": "继续添加",
"Copy": "复制",
"copy_successful": "复制成功",
"create_failed": "创建异常",
"create_success": "创建成功",
"create_time": "创建时间",
"Creating": "创建中",
"custom_title": "自定义标题",
"Delete": "删除",
"delete_failed": "删除失败",
"delete_success": "删除成功",
"delete_warning": "删除警告",
"delete_folder": "删除文件夹",
"Detail": "详情",
"Documents": "文档",
"Done": "完成",
"Edit": "编辑",
"Error": "错误",
"Exit": "退出",
"exit_directly": "直接退出",
"expired_time": "过期时间",
"File": "文件",
"Finish": "完成",
"FullScreen": "全屏",
"FullScreenLight": "全屏预览",
"Import": "导入",
"import_failed": "导入失败",
"import_success": "导入成功",
"Input": "输入",
"folder_description": "文件夹描述",
"input_name": "取个名字",
"Intro": "介绍",
"last_step": "上一步",
"last_use_time": "最后使用时间",
"load_failed": "加载失败",
"Loading": "加载中...",
"More": "更多",
"Move": "移动",
"no_select_data": "没有可选值",
"Name": "名称",
"next_step": "下一步",
"no_more_data": "没有更多了~",
"not_open": "未开启",
"OK": "好的",
"Open": "打开",
"Other": "其他",
"Output": "输出",
"Params": "参数",
"Parse": "解析",
"psw_inconsistency": "两次密码不一致",
"Permission": "权限",
"Permission_tip": "个人权限大于群组权限",
"Please Input Name": "请输入名称",
"Preview": "预览",
"read_doc": "查看文档",
"Remove": "移除",
"Rename": "重命名",
"request_error": "请求异常",
"Reset": "恢复默认",
"Restart": "重新开始",
"Role": "权限",
"root_folder": "根目录",
"Run": "运行",
"Save": "保存",
"save_failed": "保存异常",
"save_success": "保存成功",
"Save_and_exit": "保存并退出",
"Search": "搜索",
"select_file_failed": "选择文件异常",
"select_template": "选择模板",
"set_avatar": "点击设置头像",
"Setting": "设置",
"Status": "状态",
"submit_failed": "提交失败",
"Success": "成功",
"sync_success": "同步成功",
"Team": "团队",
"un_used": "未使用",
"UnKnow": "未知",
"unknow_source": "未知来源",
"Unlimited": "无限制",
"Update": "更新",
"update_failed": "更新异常",
"update_success": "更新成功",
"Username": "用户名",
"Waiting": "等待中",
"Warning": "警告",
"Website": "网站",
"all_result": "完整结果",
"click_select_avatar": "点击选择头像",
"base_config": "基础配置",
"choosable": "可选",
"action_confirm": "操作确认",
"copy_to_clipboard": "复制到剪贴板",
"read_course": "查看教程",
"error.unKnow": "出现了点意外~",
"export_to_json": "导出为 JSON",
"failed": "失败",
"click_drag_tip": "点我可拖动",
"move_success": "移动成功",
"move_to": "移动到",
"no_child_folder": "没有子目录了,就放这里吧",
"open_folder": "打开文件夹",
"folder.empty": "这个目录已经没东西可选了~",
"folder.open_dataset": "打开知识库",
"have_done": "已完成",
"input.Repeat Value": "有重复的值",
"is_requesting": "请求中……",
"json_parse_error": "JSON 可能有误,请仔细检查",
"json_config": "JSON 配置",
"link.UnValid": "无效的链接",
"month": "月",
"name_is_empty": "名称不能为空",
"no_intro": "暂无介绍",
"not_support": "不支持",
"page_center": "页面居中",
"redo_tip": "恢复 ctrl shift z",
"redo_tip_mac": "恢复 ⌘ shift z",
"request_end": "已加载全部",
"request_more": "点击加载更多",
"speech_error_tip": "语音转文字失败",
"speech_not_support": "您的浏览器不支持语音输入",
"submit_success": "提交成功",
"submitted": "已提交",
"support": "支持",
"system_help_chatbot": "机器人助手",
"use_helper": "使用帮助",
"ui.textarea.Magnifying": "放大",
"undo_tip": "撤销 ctrl z",
"undo_tip_mac": "撤销 ⌘ z ",
"upload_file": "上传文件",
"zoomin_tip": "缩小 ctrl -",
"zoomin_tip_mac": "缩小 ⌘ -",
"zoomout_tip": "放大 ctrl +",
"zoomout_tip_mac": "放大 ⌘ +",
"comfirn_create": "确认创建",
"commercial_function_tip": "请升级商业版后使用该功能https://doc.fastgpt.cn/docs/commercial/intro/",
"comon.Continue_Adding": "继续添加",
"compliance.chat": "内容由第三方 AI 生成,无法确保真实准确,仅供参考",
"compliance.dataset": "请确保您的内容严格遵守相关法律法规,避免包含任何违法或侵权的内容。请谨慎上传可能涉及敏感信息的资料。",
"confirm_choice": "确认选择",
"confirm_move": "移动到这",
"confirm_update": "确认更新",
"contact_way": "通知接收",
"contribute_app_template": "贡献模板",
"copy_successful": "复制成功",
"copy_to_clipboard": "复制到剪贴板",
"core.Chat": "对话",
"core.ai.Max context": "最大上下文",
"core.ai.Model": "AI 模型",
@@ -491,7 +410,6 @@
"core.chat.response.user_select_result": "用户选择结果",
"core.chat.retry": "重新生成",
"core.chat.tts.Stop Speech": "停止",
"core.tip.leave page": "内容已修改,确认离开页面吗?",
"core.dataset.Choose Dataset": "关联知识库",
"core.dataset.Collection": "数据集",
"core.dataset.Create dataset": "创建一个{{name}}",
@@ -567,7 +485,6 @@
"core.dataset.import.Custom text desc": "手动输入一段文本作为数据集",
"core.dataset.import.Data process params": "数据处理参数",
"core.dataset.import.Down load csv template": "点击下载 CSV 模板",
"core.dataset.import.import_success": "导入成功,请等待训练",
"core.dataset.import.Link name": "网络链接",
"core.dataset.import.Link name placeholder": "仅支持静态链接,如果上传后数据为空,可能该链接无法被读取\n每行一个每次最多 10 个链接",
"core.dataset.import.Local file": "本地文件",
@@ -588,6 +505,7 @@
"core.dataset.import.Upload status": "状态",
"core.dataset.import.Web link": "网页链接",
"core.dataset.import.Web link desc": "读取静态网页内容作为数据集",
"core.dataset.import.import_success": "导入成功,请等待训练",
"core.dataset.link": "链接",
"core.dataset.search.Dataset Search Params": "知识库搜索配置",
"core.dataset.search.Empty result response": "空搜索回复",
@@ -768,6 +686,7 @@
"core.plugin.Get Plugin Module Detail Failed": "加载插件异常",
"core.plugin.Http plugin intro placeholder": "仅做展示,无实际效果",
"core.plugin.cost": "积分消耗:",
"core.tip.leave page": "内容已修改,确认离开页面吗?",
"core.view_chat_detail": "查看对话详情",
"core.workflow.Can not delete node": "该节点不允许删除",
"core.workflow.Change input type tip": "修改输入类型会清空已填写的值,请确认!",
@@ -821,7 +740,11 @@
"core.workflow.value": "值",
"core.workflow.variable": "变量",
"create": "去创建",
"create_failed": "创建异常",
"create_success": "创建成功",
"create_time": "创建时间",
"cron_job_run_app": "定时任务",
"custom_title": "自定义标题",
"data_index_custom": "自定义索引",
"data_index_default": "默认索引",
"data_index_image": "图片索引",
@@ -871,6 +794,10 @@
"dataset_text_model_tip": "用于知识库预处理阶段的文本处理,例如自动补充索引、问答对提取。",
"deep_rag_search": "深度搜索",
"delete_api": "确认删除该API密钥删除后该密钥立即失效对应的对话日志不会删除请确认",
"delete_failed": "删除失败",
"delete_folder": "删除文件夹",
"delete_success": "删除成功",
"delete_warning": "删除警告",
"embedding_model_not_config": "检测到没有可用的索引模型",
"error.Create failed": "创建失败",
"error.code_error": "验证码错误",
@@ -880,6 +807,7 @@
"error.missingParams": "参数缺失",
"error.send_auth_code_too_frequently": "请勿频繁获取验证码",
"error.too_many_request": "请求太频繁了,请稍后重试",
"error.unKnow": "出现了点意外~",
"error.upload_file_error_filename": "{{name}} 上传失败",
"error.upload_image_error": "上传文件失败",
"error.username_empty": "账号不能为空",
@@ -889,13 +817,23 @@
"error_llm_not_config": "未配置文件理解模型",
"error_un_permission": "无权操作",
"error_vlm_not_config": "未配置图片理解模型",
"exit_directly": "直接退出",
"expired_time": "过期时间",
"export_to_json": "导出为 JSON",
"extraction_results": "提取结果",
"failed": "失败",
"field_name": "字段名",
"folder.empty": "这个目录已经没东西可选了~",
"folder.open_dataset": "打开知识库",
"folder_description": "文件夹描述",
"free": "免费",
"get_QR_failed": "获取二维码失败",
"get_app_failed": "获取应用失败",
"get_laf_failed": "获取Laf函数列表失败",
"has_verification": "已验证,点击取消绑定",
"have_done": "已完成",
"import_failed": "导入失败",
"import_success": "导入成功",
"info.buy_extra": "购买额外套餐",
"info.csv_download": "点击下载批量测试模板",
"info.csv_message": "读取 CSV 文件第一列进行批量测试,单次最多支持 100 组数据。",
@@ -907,14 +845,23 @@
"info.open_api_notice": "可以填写 OpenAI/OneAPI的相关密钥。如果你填写了该内容在线上平台使用【AI对话】、【问题分类】和【内容提取】将会走你填写的Key不会计费。请注意你的Key 是否有访问对应模型的权限。GPT模型可以选择 FastAI。",
"info.open_api_placeholder": "请求地址,默认为 openai 官方。可填中转地址,未自动补全 \"v1\"",
"info.resource": "资源用量",
"input.Repeat Value": "有重复的值",
"input_name": "取个名字",
"invalid_variable": "无效变量",
"is_open": "是否开启",
"is_requesting": "请求中……",
"is_using": "正在使用",
"item_description": "字段描述",
"item_name": "字段名",
"json_config": "JSON 配置",
"json_parse_error": "JSON 可能有误,请仔细检查",
"just_now": "刚刚",
"key_repetition": "key 重复",
"last_step": "上一步",
"last_use_time": "最后使用时间",
"link.UnValid": "无效的链接",
"llm_model_not_config": "检测到没有可用的语言模型",
"load_failed": "加载失败",
"max_quote_tokens": "引用上限",
"max_quote_tokens_tips": "单次搜索最大的 token 数量,中文约 1 字=1.7 tokens英文约 1 字=1 token",
"mcp_server": "MCP 服务",
@@ -947,7 +894,11 @@
"model_sparkdesk": "讯飞星火",
"model_stepfun": "阶跃星辰",
"model_yi": "零一万物",
"month": "月",
"move.confirm": "确认移动",
"move_success": "移动成功",
"move_to": "移动到",
"name_is_empty": "名称不能为空",
"navbar.Account": "账号",
"navbar.Chat": "聊天",
"navbar.Datasets": "知识库",
@@ -955,13 +906,22 @@
"navbar.Toolkit": "工具箱",
"navbar.Tools": "工具",
"new_create": "新建",
"next_step": "下一步",
"no": "否",
"no_child_folder": "没有子目录了,就放这里吧",
"no_intro": "暂无介绍",
"no_laf_env": "系统未配置Laf环境",
"no_more_data": "没有更多了~",
"no_pay_way": "系统无合适的支付渠道",
"no_select_data": "没有可选值",
"not_model_config": "未配置相关模型",
"not_open": "未开启",
"not_permission": "当前订阅套餐不支持团队操作日志",
"not_support": "不支持",
"not_yet_introduced": "暂无介绍",
"open_folder": "打开文件夹",
"option": "选项",
"page_center": "页面居中",
"pay.amount": "金额",
"pay.error_desc": "转换支付途径时出现了问题",
"pay.noclose": "支付完成后,请等待系统自动更新",
@@ -1024,14 +984,34 @@
"plugin.path": "路径",
"price_over_wx_limit": "超出支付提供商限额:微信支付仅支持 6000 元以下",
"prompt_input_placeholder": "请输入提示词",
"psw_inconsistency": "两次密码不一致",
"question_feedback": "工单咨询",
"read_course": "查看教程",
"read_doc": "查看文档",
"read_quote": "查看引用",
"redo_tip": "恢复 ctrl shift z",
"redo_tip_mac": "恢复 ⌘ shift z",
"request_end": "已加载全部",
"request_error": "请求异常",
"request_more": "点击加载更多",
"required": "必须",
"rerank_weight": "重排权重",
"resume_failed": "恢复失败",
"root_folder": "根目录",
"save_failed": "保存异常",
"save_success": "保存成功",
"scan_code": "扫码支付",
"select_file_failed": "选择文件异常",
"select_reference_variable": "选择引用变量",
"select_template": "选择模板",
"set_avatar": "点击设置头像",
"share_link": "分享链接",
"speech_error_tip": "语音转文字失败",
"speech_not_support": "您的浏览器不支持语音输入",
"submit_failed": "提交失败",
"submit_success": "提交成功",
"submitted": "已提交",
"support": "支持",
"support.account.Individuation": "个性化",
"support.inform.Read": "已读",
"support.openapi.Api baseurl": "API 根地址",
@@ -1209,18 +1189,34 @@
"support.wallet.usage.Usage Detail": "使用详情",
"support.wallet.usage.Whisper": "语音输入",
"sync_link": "同步链接",
"sync_success": "同步成功",
"system.Concat us": "联系我们",
"system.Help Document": "帮助文档",
"system_help_chatbot": "机器人助手",
"tag_list": "标签列表",
"team_tag": "团队标签",
"templateTags.Image_generation": "图片生成",
"templateTags.Office_services": "办公服务",
"templateTags.Roleplay": "角色扮演",
"templateTags.Web_search": "联网搜索",
"templateTags.Writing": "文本创作",
"template_market": "模板市场",
"textarea_variable_picker_tip": "输入\"/\"可选择变量",
"ui.textarea.Magnifying": "放大",
"un_used": "未使用",
"unauth_token": "凭证已过期,请重新登录",
"undo_tip": "撤销 ctrl z",
"undo_tip_mac": "撤销 ⌘ z ",
"unit.character": "字符",
"unit.minute": "分钟",
"unit.seconds": "秒",
"unknow_source": "未知来源",
"unusable_variable": "无可用变量",
"update_failed": "更新异常",
"update_success": "更新成功",
"upload_file": "上传文件",
"upload_file_error": "上传文件失败",
"use_helper": "使用帮助",
"user.Account": "账号",
"user.Amount of earnings": "收益(¥)",
"user.Amount of inviter": "累计邀请人数",
@@ -1234,11 +1230,13 @@
"user.Laf Account Setting": "laf 账号配置",
"user.Language": "语言",
"user.Member Name": "昵称",
"user.No_right_to_reset_password": "没有重置密码的权限",
"user.Notification Receive": "通知接收",
"user.Notification Receive Bind": "请先绑定通知接收途径",
"user.Old password is error": "旧密码错误",
"user.OpenAI Account Setting": "OpenAI 账号配置",
"user.Password": "密码",
"user.Password has no change": "新密码和旧密码重复",
"user.Pay": "充值",
"user.Promotion": "促销",
"user.Promotion Rate": "返现比例",
@@ -1253,12 +1251,16 @@
"user.Update password successful": "修改密码成功",
"user.apikey.key": "API 密钥",
"user.confirm_password": "确认密码",
"user.init_password": "请初始化密码",
"user.new_password": "新密码",
"user.no_invite_records": "暂无邀请记录",
"user.no_notice": "暂无通知",
"user.no_usage_records": "暂无使用记录",
"user.old_password": "旧密码",
"user.password_message": "密码最少 4 位最多 60 位",
"user.password_tip": "密码至少 6 位,且至少包含两种组合:数字、字母或特殊字符",
"user.reset_password": "重置密码",
"user.reset_password_tip": "未设置初始密码/长时间未修改密码,请重置密码",
"user.team.Balance": "团队余额",
"user.team.Check Team": "切换",
"user.team.Leave Team": "离开团队",
@@ -1293,5 +1295,9 @@
"xx_search_result": "{{key}} 的搜索结果",
"yes": "是",
"yesterday": "昨天",
"yesterday_detail_time": "昨天 {{time}}"
"yesterday_detail_time": "昨天 {{time}}",
"zoomin_tip": "缩小 ctrl -",
"zoomin_tip_mac": "缩小 ⌘ -",
"zoomout_tip": "放大 ctrl +",
"zoomout_tip_mac": "放大 ⌘ +"
}

View File

@@ -28,6 +28,7 @@
"login.success": "登录成功",
"manage_team": "管理团队",
"name": "名称",
"new_password": "新密码",
"notification.remind_owner_bind": "请提醒创建者绑定通知账号",
"operations": "操作",
"owner": "所有者",