宫论App
登录
注册
小小乐
lv.2
实名用户
2023-03-14 22:20
iPhone
查看作者
宫论项目开发记录
记录2023年项目进度周期。
刷新置顶
2
772
0
25.64w
请登录之后再进行评论
登录
0
小小乐
lv.2
实名用户
2025年10月24日
1、xinle_push_app_hook集成了日志记录和计数器功能,用于全面监控消息推送的成功与失败。当用户成功推送消息后,系统会通过xinle_redis_count记录成功次数(计数器标识为app_push),该计数器支持按年、月、日等指定时间范围查询,从而统计APP消息的发送总量,便于后续分析与追踪。如果消息推送失败,系统会通过xinle_log_error_warn记录错误日志,详细描述推送失败的相关信息。日志的格式如下:[错误时间: " . date("Y-m-d H:i:s") . "] - [收信用户: {$userId}] - [推送编号: {$result_id}] - [错误信息: {$errorMsg}]。这种设计既能帮助开发者快速定位问题,又能实现推送数据的高效统计和管理,为后续优化提供了可靠的支持。
2、xinle_push_app_hook 函数执行流程 整体遵循 “先检查→再执行→后收尾” 逻辑,核心是确保推送有效且可追溯,异常情况全拦截。 参数检查:先看必填参数(用户 ID、通知类型 / 标题 / 内容)是否齐、格式对,不对直接返回错误。 用户推送码验证:获取用户的 APP 推送码,没有或无效就终止,返回 “未绑定推送码” 错误。 存数据库待推记录:把推送信息(用户 ID、内容、状态 “待推送” 等)写入数据库,存失败就报错。 调 API 推送:拿配置好的 API 地址、APP 密钥等,发推送请求;请求失败或返回错误,就更新数据库为 “推送失败”,记日志,返回错误。 推送成功处理:更新数据库为 “推送成功”,累加推送统计,返回成功结果。 异常兜底:遇到没预料到的错,记详细日志,返回 “系统异常” 的友好提示。
3、当前项目已集成以下三类消息推送功能,分别为公众号模板消息推送函数(xinle_gzh_push($gzh))、手机短信发送模板推送函数(xinle_sms_push($sms))以及APP消息推送发送函数(xinle_app_push($app))。这三个消息推送功能均支持异步处理,以提升推送效率,并结合redis缓存技术优化数据存储与访问性能。此外,系统还集成了日志追踪功能,用于记录推送过程中的详细信息,方便后续问题排查。同时,每次推送操作会记录至相关数据表中,确保推送数据的完整性与可追溯性。这些推送功能既支持系统自动执行,也支持手动触发执行,为项目的消息推送功能提供了高度的灵活性和可靠性,有效提升了用户消息通知的体验和运维效率。
4、xinle_email_push方法已进行重构设计,优化了参数传递方式,由原来的变量传参调整为数组结构传参,以提高扩展性和可读性。当前支持的数组字段包括以下内容:email(邮箱账户,与用户UID为二选一必填项)、user_id(用户UID,与邮箱账户二选一必填项)、title(邮件标题,必填项)、content(邮件内容,必填项)、type(邮件类型,默认为default)、以及attachment(附件路径,默认为空)。通过这种设计,方法可以更加灵活地处理邮件发送请求,同时支持多种业务场景。执行结果以数组形式返回,其中包含code(状态码)和msg(提示信息),用于标识邮件发送的成功与否及相关反馈内容。这种设计不仅提高了方法的可维护性,还增强了邮件发送功能的适配性和稳定性。
5、重构后xinle_email_push整个执行流程如下:参数处理阶段从输入数组$email_push中提取所有必要参数(邮箱、用户 ID、标题等),并进行类型校验和过滤(如字符串去空),同时设置默认值(如type默认为default,asyn默认为false)。 基础验证阶段 校验收件人信息:邮箱和用户 ID 不能同时为空(至少需要一个定位收件人)。 校验核心内容:标题和内容不能为空(二者为邮件必需项)。 收件人信息转换阶段 若仅提供用户 ID,则通过xinle_is_user_email()获取其绑定的邮箱;若用户未绑定邮箱,直接返回错误。 若仅提供邮箱,则通过xinle_is_uid_by_email()获取对应的用户 ID(用于数据库记录)。 格式与频率校验阶段 校验邮箱格式是否有效(通过xinle_is_email())。 限制发送频率:通过xinle_lock()实现 “5 秒内不允许向同一邮箱发送相同标题的邮件”,防止重复发送。 数据库记录阶段准备邮件数据(包含收件人信息、标题、内容、时间等),若有有效附件则一并记录,然后写入数据库并获取记录 ID。若写入失败,返回错误。 发送方式处理阶段 若为异步发送(asyn=true):直接返回 “加入队列” 的成功结果,不执行实际发送。 若为同步发送(asyn=false):初始化 PHPMailer,配置 SMTP 服务器参数,准备邮件内容(通过模板生成 HTML),执行发送操作。 发送结果处理阶段 发送成功:更新数据库记录状态为 “success”,记录统计信息,返回成功结果。 发送失败:记录错误日志,更新数据库状态为 “fail” 并保存错误信息,返回失败结果。
6、新增方法:xinle_notify_hook_service,这是一个统一的消息发送接口,用于服务号消息通知的钩子服务函数。该方法需要传递以下三个变量: $user_id:用户ID,标识具体的接收用户。 $type:通知类型,用于区分不同的消息类型。 $template:通知模板数组,包含消息内容的具体模板。 当 $template 为空时,函数会直接返回错误,提示“服务号消息发送失败:传递template空数组”。
7、新增方法:xinle_is_push_service,该方法用于检查是否允许发送服务号消息,主要依据用户的状态、推送配置和全局设置来判断。方法需要传递两个参数: $user_id:用户ID,用于识别具体用户。 $type:推送类型,用于判断该类型的消息是否允许发送。 函数将返回一个包含结果代码和消息的数组,具体逻辑如下: 如果允许发送站内信,结果代码为 0,消息为“允许发送APP通知”,同时返回的数组中还会包含服务ID和标题(前提是该类型的服务已配置)。 如果不允许发送站内信,结果代码为 1,消息将详细说明失败原因。 如果推送配置不存在、推送功能已被全局禁用,或者APP已被禁用,函数会返回一个包含错误代码和消息的数组,提示具体的错误原因。
8、后台新增功能模块:服务号消息模板(xinle_public_account)。该模块旨在实现公众号消息助理的管理功能,允许根据业务需求添加对应的消息服务号。不同的服务号可以独立负责不同类型的消息推送,以满足多样化的消息通知需求,同时支持灵活扩展。功能设计如下:模块名称:服务号消息模板(xinle_public_account)。主要功能:服务号管理:支持添加、编辑、删除服务号,定义每个服务号的职责范围。消息模板配置:每个服务号可以绑定不同的消息模板,用于定义推送的内容样式,例如标题、正文、消息链接等。消息类型分组:通过服务号对消息类型进行分组管理,使推送逻辑更加清晰。灵活扩展:支持动态添加新的服务号和消息模板,满足业务扩展需求。应用场景:交易助手:专门负责处理与交易相关的订单信息推送,例如订单状态更新、支付成功通知、退款进度等。余额助手:用于处理账户余额变动的通知,如充值成功提醒、提现到账提示、余额不足警告等。系统助理:管理与账户安全或系统相关的消息推送,例如密码修改通知、登录异常提醒、系统维护通知等。功能实现:后台提供一个界面用于创建和管理服务号。管理员可以为每个服务号设置名称、描述、绑定的消息类型以及对应的消息模板。服务号与消息模板之间可以一对一或一对多绑定,确保不同服务号能够灵活处理不同的消息内容。系统支持动态扩展,管理员可以根据业务需求随时新增服务号和对应的消息模板。
9、xinle_public_account 配置字段说明:该配置字段主要用于定义服务号的基本信息和功能属性,确保服务号的行为符合预期,同时为前后端联动提供必要的约束条件和接口支持。具体字段及说明如下: name:服务号的名称及使用场景介绍。该字段用于简要说明服务号的功能定位,例如“交易助手:用于处理交易订单相关通知”或“余额助手:负责账户余额变动提醒”。管理员在设置时需确保描述清晰,方便后续管理与用户识别。 key:服务号的唯一标识符。该字段在服务号创建时需设定,并且一旦确定后绝不可修改。key 是服务号的核心标识,前后端通过该字段进行数据关联和逻辑处理,因此必须确保唯一性和不可变性。任何修改都需经过前后端的协同调整,避免引发数据异常。 user_id:服务号绑定的虚拟用户 ID。系统会为每个服务号自动生成一个虚拟用户 ID,用于模拟消息的发送者身份。该字段一旦设定后同样不可更改,修改会导致历史消息记录及关联逻辑出现问题。前后端需共同保证该字段的唯一性和稳定性。 服务号介绍:用户在打开服务号时可见的内容,用于展示服务号的基本信息和功能说明。例如,“本服务号负责通知您的订单状态更新、余额变动等信息,请关注相关提醒”。该字段内容需清晰明了,方便用户快速理解服务号的用途。 pop(站内弹窗通知):用于控制站内弹窗消息的开关状态。开启时,服务号可向用户推送站内弹窗通知;关闭后,即使用户在线,系统也不会再发送弹窗消息。该字段的设计旨在平衡用户体验与消息推送的干扰程度,适用于不需要频繁提醒的服务号。 msg(私信功能):用于控制用户是否可以通过服务号发送私信。开启时,用户可通过服务号与后台进行私信交互;关闭后,用户无法发送消息,仅能接收服务号的通知。该字段适用于消息单向通知的场景,例如系统公告、账户变动提醒等。 api(消息转发接口):用于配置服务号的消息转发功能。开启后,用户发送的消息将按照标准格式转发到指定的接口地址,便于后端系统处理用户请求。接口的具体使用规则需参照相关文档,确保消息的转发逻辑正确无误。
10、后端新增了 is 语法(xinle_is_public_account($key)),用于检测某个 key 或指定的 user_id 是否为服务号消息。当检测结果为服务号消息时,系统会返回该服务号的具体配置信息;若检测结果不是服务号消息,则返回 false。服务号是平台的虚拟账户,主要用于系统消息的下发与处理。在消息接收与处理的过程中,系统需要对消息的类型和来源进行判断,若识别为服务号消息,则需进行单独的处理,以确保服务号消息的处理逻辑与其他消息区分开来,从而实现更精准的消息分发与响应。
11、xinle_is_push_service完成封装处理,整个执行流程如下:初始化结果数组 创建一个空的 $result 数组,用于存储函数的返回结果。 获取推送配置 通过调用 xinle_is_config 函数,根据通知类型 $type 获取对应的推送配置 $push。 检查推送配置是否存在 如果未找到与通知类型匹配的推送配置,直接返回错误:通知场景未配置。 检查推送是否全局禁用 如果推送配置中的 open 值为空或为 false,表示当前通知场景已全局禁用,返回错误。 检查服务号通知是否启用 如果推送配置中的 service_open 值为空或为 false,表示当前通知场景禁用了服务号通知,返回错误。 检查服务号参数是否存在 如果推送配置中的 service_id 值为空,表示服务号参数未正确配置,返回错误。 获取服务号配置信息 调用 xinle_is_public_account 函数,使用 service_id 获取服务号的配置信息 $public_account。 检查服务号是否存在 如果 $public_account 为空,说明服务号不存在,返回错误,包含服务号的 service_id 信息。 返回成功结果 如果所有检查通过,则返回允许发送服务号通知的结果,包含: 状态码 code 为 0。 成功消息。 服务号标题 service_title。 服务号标识 source。 服务号的用户ID user_id。
0
小小乐
lv.2
实名用户
2025年10月23日
1、新增了一个 Redis 计数器 gzh_push,用于记录公众号模板消息发送成功的次数。该计数器通过 xinle_redis_count 方法完成计数统计的处理,能够支持按时间区域进行查询,比如查询昨天、本周、上月的公众号消息推送成功次数。计数器的更新仅在接口明确返回推送成功时才会触发,确保统计数据的准确性。
2、在通过 xinle_gzh_push 发送公众号模板消息的过程中,如果 API 接口发生异常或者推送失败,系统会触发日志记录操作,以便后续分析问题原因和排查故障。日志的标识为 gzh_push,通过 xinle_log_error_warn 方法完成日志的写入处理。日志的记录格式规范如下:模版ID(temp_id):标识本次发送的模板消息的唯一 ID,便于确定具体的消息模板。 返回码(result['code']):记录接口返回的状态码,如果状态码不存在,则默认为 0。 失败详情(res['errmsg']):记录 API 返回的失败描述信息,如果失败原因未知,则默认为 未知错误。 错误码(res['code']):记录 API 返回的具体错误码,用于进一步定位问题原因。 接收用户(user_id):记录本次消息的接收用户 ID,便于追踪特定用户的推送问题。
3、在 xinle_gzh_push 数据表中新增了一个 error 字段,用于存储推送失败时的详细错误信息。该字段采用 TEXT 类型,能够支持存储较长的文本内容,以满足复杂错误场景的记录需求,尤其是在微信接口返回较为详细的错误描述时,可以完整记录相关信息,便于后续问题排查和分析。 字段设计说明: 字段名称: error:用于记录推送失败的详细错误信息。 字段类型: TEXT:选择 TEXT 类型,允许存储大段文本内容,能够适应微信接口返回的复杂错误信息,例如错误码、错误描述、调用栈等。 默认值: 设置默认值为 NULL(允许为空),这样可以节省存储空间。只有在推送失败时(status='fail')才会填充该字段,成功或等待状态下该字段保持为空。 使用场景: 当推送状态为失败(status='fail')时,将错误信息写入 error 字段,以便后续分析和追踪问题原因。 推送成功(status='success')或处于等待状态(status='pending')时,该字段为空,避免冗余数据存储。
4、为了避免因并发或系统异常导致重复发送公众号模板消息,加入了 Redis 上锁保护机制。这种机制通过对业务逻辑的加锁控制,确保同一个用户在一定时间内不会重复接收到相同的消息。具体实现过程如下:系统在执行业务之前,会对传递的数组变量进行处理,首先使用 serialize 函数将数组序列化为字符串格式,确保数组的结构和内容能够完整保存。随后,使用 md5 对序列化后的字符串进行加密处理,生成唯一的哈希值。这个哈希值作为锁的标识,确保不同用户或不同消息能够独立区分。
接着,系统通过 xinle_lock 执行取锁动作。锁的有效期设定为 180 秒,即在锁定期间(180 秒内),同一个用户无法收到重复的模板消息。这样可以有效避免因系统异常或并发操作导致的重复触发问题。具体来说,当系统试图发送消息时,会先检查 Redis 中是否存在对应的锁。如果锁存在,则表示该消息已在锁定时间内被发送过,此时系统将跳过消息发送逻辑,避免重复发送。如果锁不存在,则说明该消息可以正常发送,并在发送完成后立即设置锁,锁的有效期为 180 秒。
5、xinle_sms_push方法重构设计,之前是通过变量传参,每个参数都需要通过变量来传参,这维护和扩展非常麻烦,因此决定对其进行重构,所有的变量都通过数组方式进行传参,需要什么就通过数组进行处理。内部方法进行全部重构设计,一些user_id和phone的逻辑进行重构,不在合并为一个,而是数组进行选择传参。支持手机号直接处理,也支持用户发送发送短信。
6、整个xinle_sms_push函数的执行流程可分为以下 10 个核心步骤,按顺序梳理如下: 1. 参数初始校验与提取 首先校验传入的sms是否为非空数组,若不是则返回 “参数格式错误”。 从sms数组中提取参数并设置默认值: phone(手机号或用户 ID,默认为空)、type(短信类型,默认为default)、templId(模板 ID,默认为空)、variable_1~variable_3(模板变量,前 1 个必填)、user_id(用户 ID,默认为空)。 2. 必传参数校验 校验templId(模板 ID)是否为空,为空则返回 “模板 ID 不能为空”。 校验variable_1(主要模板变量)是否为空,为空则返回 “主要变量不能为空”。 3. 手机号获取逻辑处理 若未传递phone但提供了user_id,尝试通过get_user_meta从用户元数据中获取绑定的手机号。 若phone仍为空(未传递且无法通过user_id获取),返回 “手机号不能为空”。 4. 手机号格式初步校验 校验phone是否为数字(排除非数字字符串),若不是则返回 “传递非法字符串”。 5. 用户 ID 转手机号处理 若phone不是有效的手机号(通过xinle_is_phone判断)但为数字(可能是用户 ID),尝试通过xinle_is_user_phone函数查询该用户 ID 绑定的手机号,若查询到则更新phone为实际手机号。 6. 手机号最终校验 再次通过xinle_is_phone校验phone是否为有效手机号,若不是则返回 “手机号错误”。 7. 用户 ID 关联处理 若未传递user_id,通过xinle_is_uid_by_phone函数根据手机号反向查询用户 ID,确保user_id与phone关联。 最终校验:若user_id和phone均为空,返回 “主要参数为空”。 8. 频率限制检查 生成唯一键(phone + templId),通过xinle_lock函数检查 “5 秒内同一手机号 + 同一模板” 是否已发送过短信。 若触发限制(未获取到锁),返回 “超速限制”。 9. 数据库记录与模板变量处理 准备短信记录数据(包含手机号、模板 ID、变量、发送时间、状态等),插入到xinle_sms_push表,获取记录 ID。 处理模板变量:去除空格、HTML 特殊字符和换行符,整理为腾讯云 API 要求的参数格式。 10. 调用腾讯云 API 并处理结果 准备腾讯云短信 API 参数(appid、appkey、签名、时间戳等),构造符合 API 格式的请求数据(包含手机号、模板 ID、变量、签名等)。 调用 API 发送请求,解析返回结果: 若返回errmsg = OK(发送成功):更新数据库记录状态为 “成功”,记录短信 ID,返回成功信息(包含记录 ID)。 若发送失败:记录错误日志(时间、模板 ID、手机号、错误信息),更新数据库状态为 “失败”,解除频率限制锁,返回错误信息。 整个流程从参数校验到 API 调用、结果处理形成闭环,确保了短信发送的合法性、安全性和可追溯性。
7、系统中原有短信发送的旧接口已全面迁移至新版本方法进行统一处理。目前已完成的适配内容包括以下几项:1、短信注册功能已通过登录接口实现,确保用户在注册时能够顺利接收短信验证码;2、短信登录功能已通过登录接口适配,优化了用户登录时的验证码发送流程;3、换绑手机号页面新增了针对新手机重新获取验证码的功能,提升了用户在换绑操作中的体验;4、换绑手机号页面支持获取新手机号验证码,保障了用户信息修改的安全性;5、换绑手机号页面新增验证旧号码的功能,进一步加强了用户账户安全;6、绑定手机号页面已完成获取验证码功能的迁移,确保绑定流程更加稳定;7、修改密码时的验证码获取功能已适配至新版本方法,优化了用户操作的便捷性与安全性。以上功能的迁移和适配,有效提升了短信服务的稳定性和统一性,同时为用户提供了更加流畅的交互体验。
8、新增APP消息的推送方法:xinle_app_push($app),该方法通过传递包含相关参数的APP数组来实现消息推送功能。目前已集成的字段属性包括以下内容:1、user_id:用于指定接收消息的用户,此字段为必填项,仅支持单体推送,即每次只能向一个用户发送通知;2、type:表示推送通知的类型,用于区分消息类别;3、$title:推送通知的标题,显示在用户端的消息列表中;4、$content:推送通知的内容,作为消息的主体信息展示;5、$payload:透传消息内容,该字段为可选项,主要用于传递一些后台数据或特定指令,不直接显示给用户。该函数通过调用特定的API端点实现消息发送,并在执行过程中会检查目标用户是否已绑定APP推送码,确保推送通知能够正确到达用户终端。此方法的引入进一步完善了消息通知机制,为用户提供了更加便捷和高效的消息推送服务。
9、新增数据表:xinle_app_push:负责记录APP消息的推送记录。字段说明: id:自增主键,唯一标识每条推送记录 user_id:关联用户表的用户 ID,用于定位推送对象 cid:存储用户的推送标识(clientid),用于实际推送操作 time:记录推送发起时间,默认值为当前时间 type:推送类型分类(如系统通知、私信等) title:推送标题(对应代码中的$title) content:推送内容(对应代码中的$content) payload:存储透传数据,以 JSON 格式保存(对应代码中的$payload) state:推送状态,默认为wait(等待推送),可后续更新为success或fail
10、xinle_push_app_hook在执行APP消息推送前,会先将推送信息写入推送记录表,以便进行后续的追踪和管理。写入记录后,函数会调用内置的API接口,发起APP消息的推送请求。推送过程结束后,系统会根据返回结果对记录的状态进行更新:如果推送成功,则会将状态字段status标记为success,表示消息已成功发送;如果推送失败,则会将状态字段标记为fail,同时将具体的错误信息详细记录到error字段中,以便后续分析和处理。该流程确保了消息推送的全程可追溯性,同时为异常情况提供了有效的记录支持,有助于提升消息推送的可靠性和问题排查效率。
11、xinle_push_app_hook在发起API请求时,由于涉及外部请求,系统会通过try-catch机制捕获可能出现的各种异常,从而确保不会因为意外错误而导致整个执行流程发生崩溃。在请求过程中,系统会优先处理官方接口返回的错误信息,并对这些报错进行识别和解析。如果官方返回的错误信息无法被系统识别或解析,则会启用内置的方法捕获系统级报错,确保所有异常信息都能被记录和处理。最终,所有的错误信息会被统一整理为数组结构返回给后续的接收对象,以便接收方能够高效地进行错误处理和问题追踪。这种机制不仅提升了系统的稳定性和容错能力,还为外部接口交互提供了可靠的异常管理方案。
0
小小乐
lv.2
实名用户
2025年10月22日
1、新增后端方法xinle_is_user_email,用于检测用户是否已绑定邮箱。该方法的主要功能是通过用户的唯一标识user_id,判断用户是否已完成邮箱绑定操作。如果检测到用户已绑定邮箱,则直接返回用户的邮箱地址;若未绑定,则返回false。为了增强方法的灵活性,当未显式传递user_id参数时,系统会通过xinle_is_login方法自动获取当前登录用户的uid,确保能够动态适配不同场景下的调用需求。
2、xinle_is_push_email的处理流程如下: 构建 Redis 键名: 根据用户 ID 和通知类型生成 Redis 键名,格式为:day:push_{user_id}|email_{type}。 该键用于记录当前用户当天发送指定类型邮件的次数,便于后续的发送限制校验。 获取已发送邮件数量: 调用 get_redis_meta($redis_key) 获取 Redis 中记录的邮件发送数量,存储为 email_limit。 将获取的结果强制转换为整数类型,确保后续逻辑判断时数据的准确性和一致性。 初始化结果数组: 创建一个空的 $result 数组,用于存储最终的返回数据,便于后续结构化输出。 获取推送配置: 调用 xinle_is_config('xinle_push_config', $type) 方法,根据 $type 参数获取当前通知场景的配置,并存储为 $push。 使用 $type 参数过滤出对应类型的推送配置。 检查推送配置是否存在: 如果 $push 为空,说明当前通知场景未配置相关推送规则,返回错误信息。 检查场景是否已全局禁用: 如果 $push['open'] 为空或为 false,说明该通知场景已被全局禁用,返回错误信息。 检查邮件功能是否禁用: 如果 $push['config']['email_open'] 为空或为 false,说明该通知场景禁用了邮件功能,返回错误信息。 获取用户电子邮件地址: 调用 xinle_is_user_email($user_id) 方法,根据用户 ID 获取其绑定的电子邮件地址,存储为 $email。 检查用户是否绑定电子邮件: 如果 $email 为空,说明用户未绑定邮箱,返回错误信息。 检查是否达到每日邮件发送上限: 如果 email_limit 的值大于或等于 $push['config']['email_limit'],说明用户当天该类型邮件的发送次数已达到上限,返回错误信息。 返回成功结果: 如果以上所有检查均通过,表示允许发送邮件。 返回包含以下内容的结果:用户的邮箱地址 $email 和邮件标题(从 $push 中获取)。
3、新增方法:xinle_notify_hook_gzh,该方法旨在统一消息发送接口,主要负责封装模板消息的业务逻辑。具体实现流程如下: 方法功能: 该方法负责处理微信公众平台模板消息的发送,通过解析消息场景和对应的后台配置,结合用户信息和模板结构,实现消息发送的统一管理。 方法参数: $user_id:用户 ID,用于标识消息发送的目标用户。 $type:消息类型,通过解析消息场景来获取对应的后台配置信息。 $template:模板的组件结构,包含完整的消息内容和格式定义。
4、新增方法:xinle_is_push_gzh,检查是否允许发送公众号模版消息。如果推送配置不存在,或者推送已被全局禁用,或者模版消息已被禁用,或者公众号模版ID为空,或者用户的公众号模版推送UID有问题,或者已达到每日模版消息发送上限,函数将返回一个包含错误代码和消息的数组。返回一个包含结果代码和消息的数组。如果允许发送模版消息,结果代码为0,消息为'允许发送模版消息',并且返回的数组中还会包含模版消息ID和用户推送标识。如果不允许发送模版消息,结果代码为1,消息将包含失败的原因。
5、新增方法:xinle_is_push_gzh,该方法用于封装公众号消息推送的逻辑处理,确保在满足配置要求的情况下对用户进行模板消息的发送操作。具体的执行流程如下: 构建 Redis 键名: 根据用户 ID 和通知类型生成 Redis 键名,格式为:day:push_{user_id}|gzh_{type}。 该键用于记录当前用户在当天发送指定类型的公众号消息的次数,以便对消息发送频率进行限制。 获取已发送的公众号消息次数: 调用 get_redis_meta($redis_key) 从 Redis 中获取记录的公众号消息发送次数,赋值给变量 gzh_limit。 使用强制类型转换将 gzh_limit 转换为整数类型,确保在后续的逻辑处理中数字比较的正确性,避免因数据类型问题引发错误。 初始化结果数组: 创建一个空的 $result 数组,用于存储最终的返回结果。该数组将在整个方法执行完成后返回,包含处理的状态及相关信息。 获取推送配置: 调用 xinle_is_config('xinle_push_config', $type) 获取通知场景配置,将结果存储到 $push 中。 根据 $type 参数过滤出当前类型对应的推送配置,确保后续逻辑处理的针对性。 检查推送配置是否存在: 如果 $push 为空,说明当前通知场景未配置,返回错误信息,提示配置缺失。 检查场景是否已全局禁用: 如果 $push['open'] 为空或为 false,说明该通知场景已全局禁用,返回错误信息,提示该类型消息推送已关闭。 检查公众号模板消息功能是否禁用: 如果 $push['config']['gzh_open'] 为空或为 false,说明当前通知场景禁用了公众号模板消息功能,返回错误信息,提示模板消息不可用。 检查公众号模板消息 ID 是否存在: 如果 $push['config']['gzh_id'] 为空,说明模板消息 ID 未配置,返回错误信息,提示配置不完整。 获取用户的公众号 UID: 调用 get_user_meta($user_id, 'weixin_uid', true) 获取用户的公众号 UID(即 weixin_uid),用于标识用户在公众号中的唯一身份。 检查用户是否关联公众号 UID: 如果 weixin_uid 为空,说明用户未关联公众号 UID,返回错误信息,提示用户未完成公众号关联,无法进行消息推送。 检查是否达到每日模板消息发送上限: 如果 gzh_limit 的值超过 $push['config']['gzh_limit'],说明用户当天该类型模板消息的发送次数已达上限,返回错误信息,提示发送频率受限。 返回成功结果: 如果以上所有检查均通过,说明满足模板消息发送的条件,返回允许发送的结果。 返回结果中包含关键信息,如用户 ID、模板消息类型、模板 ID 等,为后续的消息发送操作提供支持。
6、新增方法:xinle_gzh_push,该方法主要负责项目中公众号模板消息的统一发送,旨在实现业务逻辑的一致性和接口的高扩展性。为了便于后续维护和功能扩展,该接口采用数组传参的方式进行调用。具体逻辑及参数说明如下: 接口功能说明: xinle_gzh_push 作为一个统一的模板消息发送接口,主要用于向用户推送公众号模板消息,支持用户 ID 和 openid 两种方式指定消息接收者,并通过动态参数实现消息内容的灵活配置。 必须传递的参数: user_id(接收消息的用户 ID,与 openid 二选一): 指定接收消息的用户,通过用户 ID 关联用户信息。 如果未传递 user_id,则需传递 openid。 openid(接收消息的标识,与 user_id 二选一): 用于直接指定接收消息的公众号用户标识,通常在用户未绑定 user_id 时使用。 如果未传递 openid,则需传递 user_id。 temp_id(消息模板 ID 标记): 必须传递的模板消息 ID,用于标识需要发送的模板消息类型。 该 ID 通常与模板消息配置的类型一一对应。 first(内容标题描述,已被系统禁用): 此参数已被禁用,传递内容不会生效。 keyword1(第一个模板菜单内容): 模板消息的第一个关键字内容,支持动态传参,用于个性化消息内容的展示。 keyword2(第二个模板菜单内容): 模板消息的第二个关键字内容,支持动态传参,用于补充信息。 keyword3(第三个模板菜单内容): 模板消息的第三个关键字内容,支持动态传参,用于展示更多细节。 keyword4(第四个模板菜单内容): 模板消息的第四个关键字内容,支持动态传参,进一步丰富消息内容。 keyword5(第五个模板菜单内容): 模板消息的第五个关键字内容,支持动态传参,用于展示额外信息。 remark(底部详细描述,已被系统禁用): 此参数已被禁用,传递内容不会生效。 link(点击菜单的跳转链接): 用户点击模板消息后跳转的链接地址,可配置为具体的业务页面或外部链接,用于引导用户进一步操作。
7、xinle_gzh_push 方法在处理 openid 的逻辑上进行了严格的校验和补充机制,以确保消息推送的准确性与稳定性。具体处理流程如下: 逻辑处理说明: openid 的优先读取与补充机制: 系统会优先读取传递的 openid 值,作为消息推送的接收标识。 如果调用方未传递 openid,但提供了 user_id,系统会通过 get_user_meta 方法根据 user_id 获取用户的 weixin_uid(微信唯一标识),并将该值赋给 openid。 如果经过上述补充后,openid 依然为空,则终止消息推送处理,并返回错误信息。 temp_id 模板标识的校验: 推送前会检测是否传递了 temp_id 模板标识,用于确定需要发送的模板消息类型。 如果 temp_id 为空,则主动跳过消息推送处理,并返回相应的错误提示。 消息发送与结果返回: 消息推送操作完成后,方法将返回一个标准的数组结构,方便调用方进行后续处理。 返回数组中包含以下字段: code:表示操作状态,code=0 代表推送成功,code=1 代表推送失败。 msg:具体的错误或成功信息,用于描述操作结果。
8、新增数据表:xinle_gzh_push:每次公众号模版消息推送(单向推送,非集体推送)都会在这个表写入推送记录,该表可以查看到消息是否推送成功,如果失败则会记录具体失败的原因。字段结构如下:id:自增主键,唯一标识每条推送记录 user_id:整数类型,关联系统用户表的用户 ID openid:字符串类型,存储微信用户的 openid tempid:字符串类型,存储使用的模板消息编号 json:TEXT 类型,存储推送的消息内容(JSON 格式) time:DATETIME 类型,记录发送时间 status:字符串类型,默认值为 'wait',记录推送状态。
9、xinle_gzh_push 数据表新增字段 type,用于记录模板消息的推送场景来源,旨在为后期的溯源操作提供更精准的依据。在实际应用中,type 字段的设置与消息推送的具体场景密切相关,以下是详细说明: 字段设计与使用逻辑: 字段功能: type 字段用于标识模板消息的推送场景来源,例如订单通知、活动提醒、系统公告等。 通过该字段的记录,后续可快速定位消息的来源场景,便于数据分析、问题排查或业务优化。 字段赋值逻辑: 用户可以在调用接口时选择性传递 type 参数,用于明确指定模板消息的具体推送场景。 如果用户未主动传递 type 参数,系统会自动将其标记为默认值 default,以表示该消息为统一发送场景或未明确指定来源。 与公众号模板消息的关联: 在实际推送模板消息时,type 的值可以与对应的公众号模板消息类型进行绑定,以便在推送时区分不同的业务场景。 通过这种绑定机制,可以更高效地实现模板消息的分类管理,满足多场景的需求。
10、修复 xinle_sms_push 方法在完成短信发送处理动作后,写入消息数据表记录时错误地将 user_id 标记为 0 的问题。此问题的根本原因在于内部调用了 xinle_is_uid_by_phone 方法,通过手机号获取 user_id 时,由于参数传递错误,导致未能正确获取用户 ID,从而将 user_id 错误地记录为 0。
11、xinle_gzh_push 数据表的处理逻辑如下:在发起公众号模板消息推送之前,系统会通过 xinle_insert_sql 方法将本次推送记录写入数据表 xinle_gzh_push,并将其状态标记为 wait(表示等待发送)。随后,通过调用 API 接口向用户发送模板消息。如果发送成功,则将记录的状态更新为 success,若发送失败,则将状态更新为 fail。在处理公众号消息发送请求时,系统采用 try-catch 机制捕获可能的异常,确保无论发送结果如何,均能返回可供后续方法追踪的结果,从而保证推送过程的完整性与可追溯性。
0
小小乐
lv.2
实名用户
2025年10月21日
1、新增了通知配置组字段:全局Push通知管理(xinle_push_config),采用数组结构设计以便于后续功能的扩展和维护。具体设计结构如下:name字段用于标识使用场景的简称,例如【订单发货 - (通知卖家)】,直观且便于快速了解配置用途;content字段用于记录场景的详细描述及备注信息,例如明确哪些具体场景或代码逻辑会触发该消息的调用,确保配置的可追溯性和准确性;key字段作为唯一标识,通过该标识可以精准读取相关配置,避免重复或冲突;open字段用于控制通知的启用状态,当该字段关闭时,系统将停止下发对应类型的通知。这一设计结构清晰且规范,既满足了对通知场景的灵活管理需求,又为后续功能的扩展提供了良好的兼容性,同时也提高了配置的可读性和操作的便捷性。
2、在xinle_push_config中新增了子数组config,采用tabbed菜单切换结构设计,旨在进一步细化和优化通知配置功能。具体包含以下配置项:手机短信配置部分增加了多个关键字段,首先是sms_open,用于控制是否开启短信通知功能,方便灵活管理短信发送;其次是sms_id,作为短信模板的唯一标识,用于快速匹配和调用对应的模板;sms_template字段存储模板内容,若短信服务失效,可根据该模板内容重新申请或切换至其他短信平台,起到模板备份的作用,同时为平台迁移提供便捷支持;sms_limit字段设置每日发送短信的数量上限,以防止短信功能被滥用,确保每位用户每日仅能接收规定数量的通知,提升资源使用效率;最后,新增sms_vip字段,用于区分会员权限,开启后只有开通会员的用户才能收到相关短信通知,满足个性化服务需求。整体设计兼具功能性与扩展性,为短信通知管理提供了高效、灵活的解决方案。
3、在xinle_push_config中新增了公众号模板配置,旨在为绑定微信公众号的账户提供更加高效的通知机制。具体功能设计如下:当账户成功绑定微信公众号后,用户即可通过公众号接收通知,但严格限制通知类型,仅允许与账户相关的资金或交易变动信息下发,不支持任何社交互动消息,确保通知内容精准且不冗杂。为避免用户错过关键信息,建议商户和工作人员强制绑定微信公众号,进一步提升通知的及时性和重要性。
新增字段包括:gzh_open,用于控制公众号通知开关,关闭后将完全停止公众号模板通知的触发;gzh_id,表示公众号模板的唯一标识,通过公众号后台获取,若模板失效需及时更新以保证通知的正常发送;gzh_link,为模板消息的跳转链接,用户点击通知后将跳转到指定页面,支持短代码自动转义处理,若该字段为空,则默认跳转到首页,确保用户体验的一致性;gzh_limit,每日通知发送限制,用于防止消息滥用,每个用户每日最多接收规定数量的公众号通知,确保平台资源使用的规范性和高效性
4、在xinle_push_config中新增了APP通知配置,旨在为用户提供更加便捷的应用消息推送功能。当用户开启【应用通知推送】权限后,系统将向其发送一条APP应用通知。不过,由于APP消息推送受厂商过滤、离线渠道等多方面因素影响,通知的下发并不完全保证用户能够收到消息,因此需结合实际情况优化推送策略。
新增字段包括:app_open,用于控制APP通知的开关,关闭后将完全停止手机通知的触发;app_title,表示APP消息标题,如果通知函数未自定义标题,则系统将自动调用此处配置的内容,支持使用EMOJI符号以增强通知的表现力;app_content,用于定义消息正文内容,当通知函数未自定义正文时,系统将调用此处的配置,但涉及动态参数(如订单号、用户名、商品信息)时,必须通过通知函数进行自定义,确保消息内容的准确性和针对性;app_link,为APP通知的点击跳转链接,若通知函数未定义跳转链接,则调用此处配置的链接,支持短代码自动转义处理。不过需要注意的是,若需直接跳转到商品页或订单页等具体页面,则必须在通知函数内进行相关定义。
5、在xinle_push_config中新增了站内服务号配置,该功能类似于微信公众号的通知机制,旨在通过服务号向用户推送订单或交易变化信息,并记录相关订单状态的变更。此功能为用户提供了及时了解订单动态的便捷渠道,同时增强了平台的服务通知能力。
新增字段包括:service_open,用于控制服务号通知的开关,关闭后将停止所有服务号相关的手机通知,确保用户在关闭状态下不会受到干扰;service_title,用于定义服务号消息的标题,支持根据不同应用场景预先设置标题参数,确保通知内容能够清晰地表达当前场景;service_id,用于指定启用的服务号,所有[APP站内信]的通知将由该服务号统一下发,方便管理和追踪消息来源。
6、在xinle_push_config中新增了Email邮件配置,该功能旨在为绑定邮箱的用户提供邮件通知服务,用户在相关场景下将收到对应的邮件提醒。这一功能的引入为用户提供了更多样化的通知方式,但为了避免消息滥用,建议一般消息场景下不要开启邮件提醒,以免造成用户不必要的干扰。
新增字段包括:email_open,用于控制邮件通知的开关,关闭后将停止所有邮件通知的发送,用户可根据需求灵活调整;email_limit,用于限制邮件发送频率,以防止消息滥用,每位用户每日最多接收XX条此类消息,保障邮件通知的合理性和规范性;email_title,用于定义邮件通知的标题,支持根据不同应用场景预设标题参数,确保邮件内容主题清晰、简洁明了。
7、在xinle_push_config消息配置组中,新增了对消息类型的集成处理功能,对不同类型的消息进行了归类和规范化管理。目前支持的消息类型包括以下几种:account(账户安全通知),主要用于提醒用户账户相关的安全动态;funds(资金变动通知),用于通知用户资金相关的变化或交易信息;goods(交易订单通知),针对用户交易订单的状态更新进行推送;system(系统类型通知),用于发送平台的系统公告或重要通知;review(审核处理通知),涉及用户提交的资料或申请的审核状态;sns(社交互动通知),用于提示用户社交互动的动态信息;chat(聊天消息通知),为用户提供实时的聊天消息提醒。此外,后续将进一步优化消息通知功能,集成消息通知入口,为用户提供更灵活的消息管理方式。用户可以根据个人需求,自主选择接收或屏蔽某些类型的消息,并支持多种通知渠道的设置,包括短信、公众号和APP推送等。通过这种精细化的消息管理机制,用户能够更高效地获取重要信息,同时避免不必要的消息干扰,全面提升消息通知的使用体验和平台服务质量。
8、新增方法xinle_notify_hook_sms,负责push消息通知(手机短信)的消息处理,该方法负责统一消息发送接口-短信业务的封装。需要传递 $type 类型,$user_id 用户ID。 * @param string $variable_1 变量1$variable_2 变量2。内部会将消息转发到xinle_sms_push接口响应处理。该方法属于中间层,负责接管后续的处理动作,便于维护处理。
9、新增xinle_is_push_sms方法,检查是否可以向指定用户发送特定类型的短信通知。$user_id 用户的ID。$type 通知的类型。。返回一个包含结果代码、消息和(如果允许发送短信)电话号码的数组。如果结果代码为0,表示允许发送短信。如果结果代码为1,表示不允许发送短信,消息字段将包含失败的原因。如果无法连接到Redis服务器,或者无法从WordPress选项中获取推送配置。
10、xinle_is_push_sms完成封装处理,整个执行流程如下初始化:生成 Redis 键 day:push_{user_id}|sms_{type},用于存储和获取短信发送次数限制。 读取 Redis 数据: 从 Redis 中获取该用户和短信类型的已发送次数 sms_limit。 获取配置: 调用 xinle_is_config 函数获取通知场景的配置 push,根据 type 参数指定的通知场景。 配置检查: 未配置检查:如果 push 为空,返回错误信息 "短信发送失败:通知场景未配置"。 全局禁用检查:如果 push['open'] 为空,返回错误信息 "短信发送失败:通知场景已全局禁用"。 短信功能禁用检查:如果 push['config']['sms_open'] 为空,返回错误信息 "短信发送失败:通知场景禁用短信"。 短信模板 ID 检查:如果 push['config']['sms_id'] 为空,返回错误信息 "短信发送失败:短信模版ID为空"。 手机号检查: 通过 get_user_meta 获取用户的手机号 phone。 如果 phone 为空,返回错误信息 "短信发送失败:对方账户未绑定手机号"。 会员权限检查: 如果 push['config']['sms_vip'] 为真且用户不是会员(xinle_is_vip($user_id) 返回假),返回错误信息 "短信发送失败:该类型短信仅限会员可用"。 发送限制检查: 如果 sms_limit 超过 push['config']['sms_limit'],返回错误信息 "短信发送失败:今日该类型短信发送超上限"。 允许发送: 如果所有检查通过,返回成功信息,包含允许发送短信的标志、用户手机号 phone 和短信模板 ID
11、新增了xinle_notify_hook_email方法,该方法专门用于统一消息发送接口中邮件业务的封装处理,旨在实现高效、灵活的邮件推送功能。此方法的设计充分考虑了异步执行的需求,因此在调用时需主动传递相关参数,包括以下几个关键点:user_id,表示需要接收邮件的用户标识,这是邮件发送的目标对象,确保消息能够准确送达;type,用于明确消息的来源和类型,这是邮件内容分类和处理的核心,能够根据不同类型执行定制化的逻辑;template,指邮件的模版结构,通常用于定义邮件正文的内容及参数传递,支持动态数据填充,同时也可包含附件等其他资源,满足多样化的邮件发送需求。
0
小小乐
lv.2
实名用户
2025年10月20日
1、营业执照识别完善错误处理,结合了腾讯云官方输出参数规范、错误码体系,新增了错误类型细分、关键字段提取,并优化了异常场景的覆盖范围(如欠费、资源耗尽、服务未开通等): 新增bizErrorMap映射官方错误码(如ResourceUnavailable.InArrears→账号欠费),避免用户看到技术化错误码 细分错误类型:系统配置错误(密钥空)、参数错误(URL 非法)、HTTP 错误(429 频率超限)、解析错误、腾讯云业务错误 覆盖全异常场景: 包含官方文档所有错误码(欠费、资源耗尽、服务未开通等) 补充 URL 格式验证、CURL 连接超时、SSL 验证等细节场景 保留原始错误码和响应内容,便于后端调试。
2、通过API发起相应接口请求的时候,会对返回的营业执照的数组结构进行接管重构处理:系统会按业务分类字段: core_info:核心业务字段(统一信用代码、公司名称等,前端直接展示用) aux_info:辅助信息(是否副本、是否电子执照等) warn_info:告警信息(明确是否为复印件 / 翻拍件,风险提示用) raw_response:保留原始响应,便于后续扩展 新增关键标识: 携带腾讯云request_id,方便对接官方技术支持时定位问题 has_warn布尔值,前端可直接判断是否需要显示告警提示。
3、API目前支持的错误解析包括如下:图片下载失败,请检查URL有效性或网络连通性图片解码失败,仅支持PNG/JPG/JPEG格式且Base64编码后不超过7M识别结果非营业执照,请上传正确的营业执照图片OCR识别失败,可能是图片模糊、遮挡或格式不支持未知错误,请联系腾讯云技术支持腾讯云营业执照识别服务未开通,请先在控制台开通服务参数值错误,如URL格式非法或图片大小超限图片文件过大,Base64编码后需小于7M腾讯云账号已欠费,请充值后再使用服务账号OCR资源包已耗尽,请购买资源包或切换计费模式账号计费状态异常,请检查控制台计费配置。
4、xinle_api_ocr_recognizeBizLicense 方法新增集成了 Redis 缓存机制,优化了接口的调用效率。在执行解析操作之前,系统会优先检查 Redis 缓存是否存在结果。缓存的键名通过对 URL 进行 MD5 加密处理,有效避免了因特殊字符引发的潜在问题。当缓存命中时,直接返回结果,同时在返回数据中附加缓存标识,并补充必要字段以确保数据完整性,防止因旧缓存导致字段缺失的情况发生。如果缓存未命中,系统将通过 API 接口发起实时查询,并在响应成功时将结果写入 Redis 缓存。需要注意的是,缓存仅存储成功的查询结果,对于失败的查询结果则不会进行缓存处理。每条缓存数据的有效期为 30 天,超过期限的缓存会被系统自动释放,确保缓存数据的时效性与准确性。
5、后台新增计数器功能:api_ocr_recognizeBizLicense(API-营业执照识别)。当通过该API接口成功解析并获取到营业执照信息时,系统会自动调用 xinle_redis_count($key) 发起计数。此计数器支持按照时间区间统计调用次数,例如昨日、上周、本月的识别次数等。需要注意的是,计数器仅在解析成功的情况下才会触发计数逻辑。如果系统读取的是缓存数据,或者解析过程出现失败,则计数操作将会被跳过,从而确保计数结果的准确性和有效性。
6、考虑到接口的异常,增加了日志的写入。具体处理如下:使用数组构建日志数据,包含时间戳、错误类型、错误码等关键信息 转换为 JSON 格式,便于 ELK 等日志分析系统解析和检索 增加JSON_PRETTY_PRINT参数,确保日志可读性。新增关键信息: image_url_hash:URL 的 MD5 哈希值,方便统计重复出现的错误 URL execution_time:接口执行时间,可识别超时相关问题(需在函数开头定义$startTime = time()) server_ip:服务器 IP,在分布式部署环境中定位具体服务器 php_version:PHP 版本信息,避免因版本差异导致的兼容性问题 request_id:保留腾讯云请求 ID(部分错误场景可能存在) 上下文完整性: 包含函数名、错误类型等元数据,便于快速筛选日志 错误信息与业务上下文(如处理的图片 URL)关联,加速问题定位 日志可用性: 中文使用JSON_UNESCAPED_UNICODE避免转义,保证日志可读性 结构化数据支持按字段筛选(如按错误类型统计数量)。
7、腾讯云营业执照识别接口(带Redis缓存+日志统计):完成封装,整个执行流程如下:阶段 1:初始化与缓存读取(优先复用缓存) 初始化基础信息:记录函数开始时间$startTime,初始化$responseData避免未定义警告。 生成 Redis 缓存键:用函数名+MD5(URL)作为键(MD5 处理避免 URL 特殊字符影响 Redis 键合法性)。 读取缓存:调用get_redis_meta($redisKey)获取缓存数据。 缓存命中处理: 若缓存非空且为数组,标准化返回格式(补充code/msg等必选字段),标记cache=true后返回。 缓存未命中则进入后续 API 调用流程。 阶段 2:基础配置与前置验证(防无效调用) 定义错误码映射:将腾讯云官方错误码(如ResourceUnavailable.InArrears)转换为用户易懂的提示(如 “账号已欠费”)。 API 固定配置:设置域名、版本、区域、超时时间等(区域默认广州,可按需切换)。 密钥验证:从系统配置xinle_get_option读取SecretId/SecretKey,为空则抛出 “系统错误”。 URL 参数验证: 检查 URL 非空,为空则抛出 “参数错误”。 用filter_var严格验证 URL 格式(必须含http/https协议和主机名),非法则抛出 “参数错误”。 阶段 3:请求参数组装与签名(遵循腾讯云规范) 组装公共参数:包含Action(接口名)、Version(版本)、SecretId、时间戳Timestamp、随机数Nonce(防重放攻击)。 组装业务参数:传入ImageUrl,开启EnableCopyWarn(返回复印件告警)、EnablePeriodComplete(拼接营业期限)。 生成签名(核心步骤,签名错误会导致 401): 合并参数并按Key字典序排序(腾讯云签名必需)。 参数字符串按RFC3986编码(空格转%20)。 签名原文格式:POST+域名+/+?+参数字符串,用HMAC-SHA1加密后 Base64 编码,作为Signature参数。 阶段 4:发送 HTTP 请求与分层错误处理(防异常崩溃) CURL 配置:开启 SSL 证书验证(防劫持)、重定向跟随(应对 URL 跳转)、超时限制(避免长期阻塞)。 执行请求:获取响应内容、CURL 错误码、HTTP 状态码,关闭 CURL 资源。 分层错误处理: CURL 错误(如连接超时):抛出 “网络错误”,含错误码。 HTTP 状态码错误(非 200):按状态码(如 429 = 频率超限、503 = 服务过载)抛出对应错误,截断响应内容防日志过大。 JSON 解析错误:响应非合法 JSON(如腾讯云返回 HTML 错误页),抛出 “数据解析错误”。 API 业务错误:响应含Error字段(如识别失败、账号欠费),用错误码映射抛出友好提示。 阶段 5:成功结果结构化与后续处理(便于使用 + 统计) 结果结构化:将腾讯云返回的Response拆分为 3 类字段: core_info:核心业务字段(如公司名称、信用代码,前端直接展示)。 aux_info:辅助字段(如是否电子执照、是否有印章,扩展场景用)。 warn_info:告警字段(如复印件提示,风险控制用)。 封装成功结果:含code=0、msg=识别成功、cache=false(实时数据)、执行耗时等。 写入缓存:调用update_redis_meta将成功结果缓存 30 天(失败结果不缓存,避免复用错误数据)。 调用统计:调用xinle_redis_count计数,用于监控接口调用量。 返回成功结果。 阶段 6:异常捕获与错误处理(标准化 + 日志) 捕获所有异常:进入catch块,获取异常的错误码和消息。 错误类型分类:按错误码前缀将错误分为system(系统)、param(参数)、http(网络)等类型。 结构化日志:记录错误级别、时间戳、上下文(URL、服务器 IP、PHP 版本等),JSON 格式便于日志系统解析。 写入错误日志:调用xinle_log_error_warn保存日志。 封装错误结果:含code=1、错误消息、error_info(错误类型、原始码),返回给调用方。 三、核心特性总结 缓存优化:优先读取 Redis 缓存,减少 API 调用成本;仅缓存成功结果,避免错误复用。 错误友好:分层错误处理 + 错误码映射,用户无需理解技术术语(如 “429”→“请求频率超限”)。 安全可靠:SSL 证书验证、签名规范、参数严格校验,防劫持、防非法调用。 可运维性:结构化日志(含上下文)、调用统计、执行耗时,便于问题排查与监控。 兼容性:处理 URL 重定向、PHP 版本兼容、响应截断,适配多种场景。
8、对xinle_api_ocr_recognizeBizLicense方法进行了优化升级,签名方式由原来的V1模式更新为更高效的V3新版处理。此前的V1模式要求先获取签名信息,再执行识别请求,流程相对繁琐且增加了额外的请求消耗。而V3模式通过简化流程,直接支持接口发起识别,无需额外的二次请求生成签名,大幅提升了执行效率与处理速度,为用户带来更流畅的使用体验。
9、xinle_erp_application_callback回调接口现已新增营业执照上传检测功能。当系统检测到用户已上传营业执照时,将通过xinle_api_ocr_recognizeBizLicense接口发起OCR解析请求,解析营业执照中的关键信息。如果解析成功,系统会触发update_sql数组的更新请求,将法人信息、营业地址、税号、有效期等关键信息回调并更新至xinle_erp数据表中,同时通过xinle_update_sql完成数据更新操作。这一流程实现了营业执照信息的自动识别与同步更新,简化了数据录入流程,提升了信息处理效率。如果未检测到营业执照上传,则会跳过上述处理步骤,确保流程的灵活性与适应性。
10、回调接口新增了对自定义字段的处理功能:系统会通过get_user_meta方法获取申请用户的药店客户列表。如果该用户的客户列表不存在,则系统会自动构建一个空数组,并以客户的ID作为数组的键名,逐步构建包含id、status、name、trust_valid、type等字段信息的字典数据结构。这一处理逻辑的核心是将申请客户的相关信息写入到用户资料中,便于前端在后续操作中快速读取用户的客户列表。这种设计不仅优化了客户信息的存储结构,也为前端展示与交互提供了更高效的数据支持。
11、后端新增了通知配置页面,并在其下新增了一个子页面:消息配置。未来所有类型的消息,包括APP消息、站内信、短信以及公众号消息,都将通过这一配置页面进行统一管理与处理。此设计旨在实现消息处理的集中化和标准化,不仅简化了后期的维护工作,还为扩展新功能提供了便利。消息采用统一的结构进行设计,确保各类消息能够被统一接管和维护,避免因消息类型多样而导致的管理混乱。这种集中化的处理方式有效提升了系统的灵活性与可维护性,同时为后续功能迭代提供了稳定的基础。
0
小小乐
lv.2
实名用户
2025年10月17日
1、我的页面通过xinle_get_option函数来读取xinle_profile_tab_help_config的配置信息,并在页面底部的容器区域中以foreach的方式遍历输出对应的菜单项(如帮助、客服、反馈)。与功能菜单的展示方式不同,该容器区域以列表的形式对菜单项进行呈现,具体细节如下:数据读取:页面通过调用xinle_get_option获取后台配置的xinle_profile_tab_help_config字段数据。该字段包含的菜单项信息(如name、key、content、icon、onclick)会被完整读取并传递至前端。数据遍历:在前端的底部容器区域,使用foreach对读取到的配置数据进行逐一遍历。每个菜单项根据配置的内容进行动态渲染,确保展示的内容与后台配置保持一致。展示形式:底部容器区域以列表的形式对菜单项进行展示,每一项以清晰的结构呈现,方便用户快速找到所需的功能入口。列表中不仅包含菜单名称和描述信息,还会显示对应的图标(由icon字段定义),并根据onclick字段配置实现点击后的交互逻辑(如页面跳转或弹窗提示)。
2、在xinle_profile_tab_help_config(客服与服务中心的配置)和xinle_profile_tab_config(我的页面菜单功能)的父级容器中,新增了两个可选字段:右侧文字按钮(right_title)和右侧文字点击事件(right_onclick)。这两个字段的引入为菜单容器的功能拓展提供了更大的灵活性和交互能力。具体实现逻辑如下:字段定义与设置:right_title:用于配置右侧文字按钮的显示内容,例如“更多”、“帮助”、“联系客服”等。该字段为可选,只有在后台配置了具体内容后,前端才会渲染对应的按钮文字。right_onclick:用于定义右侧文字按钮的点击事件,可以设置具体的交互逻辑,比如页面跳转、弹窗提示、API请求等。该字段同样为可选,只有在后台配置了具体事件时,按钮才会具备交互功能。前端渲染逻辑:当right_title和right_onclick字段未配置时,菜单容器的右侧区域保持默认状态,不显示任何额外内容。如果right_title字段有值,前端会在对应的菜单项右侧区域渲染一个文字按钮,并将样式设计为简洁、易点击的形式,确保与整体页面风格一致。如果同时配置了right_onclick字段,前端会为该按钮绑定点击事件,支持灵活的交互功能。用户点击该按钮后,会触发相应的逻辑(如跳转到指定页面或执行某些操作)。
3、在“我的”页面的头部区域,右侧新增一个切换按钮,用于预留账户切换功能。通过该按钮,用户可以方便地进入子账户列表页面,实现关联或切换账户的操作,进一步满足多账户用户的管理需求。用户点击切换按钮后,页面会跳转至子账户列表页面。在子账户列表页面,用户可以查看已关联的子账户列表,可以通过点击某个子账户进行切换,完成登录状态的切换操作。切换后,页面会返回“我的”页面,并显示切换后的账户信息。
4、修复了实名认证页面中初始化加载器的异常问题。此前,后端数据响应完成后加载提示器未能正确移除,导致用户体验受影响。经排查,问题源于全局变量 `page_content` 的错误赋值,导致页面状态未能及时更新。针对该问题,优化了 `page_content` 的赋值逻辑,确保后端数据响应完成后加载提示器能够正确移除,从而恢复页面的正常交互功能。更新后,实名认证页面的加载流程更加流畅稳定。
5、为 `xinle_callback_nickname` 回调钩子新增优化处理逻辑:用户修改昵称后,系统会自动定位到“我的页面”中的昵称显示元素,并对其进行实时更新操作。此改动确保用户昵称更新后,“我的页面”中的昵称信息能够即时同步,避免因页面刷新或手动操作导致的信息显示滞后问题,显著提升用户体验的流畅性与便捷性。
6、在后台管理页面的xinle_appkey模块中,新增了两个配置字段:xinle_appkey_tencent_SecretId和xinle_appkey_tencent_SecretKey,用于存储腾讯云的账户信息。这两个字段分别用于配置腾讯云的SecretId和SecretKey,以便系统能够通过鉴权签名安全地调用腾讯云相关接口。需要注意的是,如果使用腾讯云子用户的AccessKey进行配置,请务必为其分配相应功能的权限,以确保接口调用的正常运行。未来,所有涉及腾讯云的接口请求将统一通过内部API进行调用,鉴权签名也将基于此处的账户信息生成。为了提升系统的稳定性,建议尽量减少直接调用云厂商的接口次数,集中化管理接口调用逻辑,从而确保系统整体运行的高效与稳定。
7、新增了一个API接口方法:xinle_api_ocr_recognizeBizLicense(),用于实现营业执照识别功能。该方法的主要作用是通过OCR技术对营业执照信息进行精准识别。使用时需要传入参数 $imageUrl,即图片的URL地址。系统会基于传递的图片地址进行识别操作,若识别成功,则直接返回对应的卡证信息接口,包含识别出的营业执照详细内容;若识别失败,则返回 false,以便调用方及时获知处理结果并采取后续操作。此功能的上线为相关业务提供了更加智能化的支持,同时提升了数据处理的效率和准确性。
8、xinle_api_ocr_recognizeBizLicense 是一个基于腾讯云对象存储服务实现的营业执照识别功能模块。在实际操作中,该功能需要进行内部鉴权处理,以确保调用的安全性和准确性。系统通过调用 xinle_get_option 方法获取必要的鉴权信息,包括 secretId 和 secretKey,然后结合接口所需的核心配置参数(如 domain、version、action、region)进行签名生成。在签名的生成过程中,系统会对相关参数进行排序(ksort),并通过 base64_encode 方法对数据进行编码处理,最终生成符合腾讯云接口要求的签名信息。如果在签名生成过程中出现任何异常或失败情况,系统会立即返回对应的错误信息,以便开发者快速定位和解决问题,确保整体服务的稳定性与可靠性。
9、xinle_api_ocr_recognizeBizLicense 在成功获取前置信息后,会通过 curl_init 方法发起请求,并对相关参数进行初始化设置。随后,该接口将请求转发至腾讯云 OCR 服务,携带以下核心参数:第一,提前生成的签名,用于鉴权校验,确保请求的合法性和安全性;第二,待处理的目标图片地址,主要用于解析识别营业执照的具体信息;第三,公共参数集合,包括请求头、接口版本、时间戳等相关配置信息,以满足腾讯云接口调用的规范要求。在具体实现中,curl 的超时时间被设置为 30 秒,若在超时时限内仍未完成处理,系统会主动中断请求,以避免资源占用过久的情况发生,从而提升服务的稳定性与响应效率。
10、xinle_api_ocr_recognizeBizLicense 函数的执行流程: 1. 获取腾讯云API密钥 函数开始,先通过 xinle_get_option 获取腾讯云的 SecretId 和 SecretKey,用于API签名和鉴权。 2. 配置API相关参数 设置接口域名、API版本、接口名称(BizLicenseOCR,即营业执照OCR识别)、区域(ap-guangzhou)。 3. 参数校验 检查 $imageUrl 是否为空,如果为空,直接抛出异常,终止流程。 4. 构建公共参数 组装腾讯云接口所需的公共参数,包括: Action(接口动作名称) Version(接口版本) SecretId(API密钥ID) Timestamp(当前时间戳) Nonce(随机数,防止重放攻击) Region(区域) 5. 构建业务参数 组装实际业务参数(营业执照OCR识别接口只需要ImageUrl),可以根据需要增加其它参数。 6. 合并所有参数 将公共参数和业务参数合并为一个请求参数数组。 7. 生成签名 对参数数组按照键名进行升序排序。 拼接成参数字符串(key1=value1&key2=value2...)。 构造待签名字符串:POST + 域名 + / + ? + 参数字符串。 使用 secretKey 进行 HMAC-SHA1 加密,结果再用 base64 编码,生成签名。 将签名放入请求参数中。 8. 发送HTTP请求 使用curl初始化请求,目标地址为
链接
请求方式为POST,参数用http_build_query编码。 设置返回内容为字符串、SSL验证、超时时间等。 9. 处理请求结果 如果curl请求有错误,抛出异常并返回错误信息。 检查HTTP状态码,如果不是200,抛出异常,包含响应内容。 10. 解析响应内容 用 json_decode 将返回内容解析为数组。 如果解析失败,抛出异常。 11. 检查API业务错误 如果API返回结果包含 Error 字段,抛出异常,包含错误码和错误信息。 12. 返回最终结果 如果没有错误,返回API解析后的结果数组。
11、针对营业执照识别功能的优化,重点考虑到该功能依赖外部API接口,因此可能面临多种失败原因。为提升系统的稳定性和容错性,特地在整个业务逻辑中新增了 try-catch 块,对所有可能的异常进行捕获与处理。同时,为避免因密钥未配置导致的调用失败,新增了密钥验证步骤,从根源上规避此类问题的发生。在结果返回方面,统一设计了返回格式,包含 code、msg 和 data 三个字段:当识别成功时,code 值为 0,msg 显示“识别成功”,data 则包含接口返回的识别结果;当识别失败时,code 值为 1,msg 显示具体的错误信息,data 则为空数组。此外,错误信息的覆盖范围更加全面,涵盖了密钥未配置、参数错误、网络问题等多种可能的异常情况,确保问题能够被快速定位和解决。
0
小小乐
lv.2
实名用户
2025年10月16日
1、新增用户自定义字段 points(消费积分),该字段用于记录用户在平台消费后所累积的积分,积分单位为1:1,即消费金额与积分比例为1:1。积分支持小数点精度,计算时按照消费金额直接累加,返回时进行四舍五入处理,确保显示数据的简洁性与准确性。比如,当账户积分为200,用户完成一笔金额为30.3元的消费后,累计消费积分将更新为230.3分;在调用或展示积分时,系统会对结果进行四舍五入处理,显示为230。
2、新增方法 xinle_is_level_config,用于根据用户的消费积分获取其对应的消费等级配置。该方法需要传入 user_id 参数,并通过用户的 UID 查询相关数据。具体实现流程如下: 方法逻辑: 查询等级配置: 调用 xinle_get_option 方法获取后台的等级配置信息。如果未能成功获取配置,则直接返回 false,表示无法获取等级数据。 获取用户积分: 读取用户的 points 字段以获取当前消费积分。如果积分读取失败,则默认将积分设置为 1,以确保流程继续执行。 匹配等级配置: 遍历等级配置数据,找到与用户当前积分相匹配的等级范围,并返回对应的等级配置。 处理异常情况: 如果未能匹配到任何等级配置,则返回一个空数组,表示用户的积分未能满足任何等级要求。
3、新增数据表:xinle_points_notes(用户消费积分变化数据表),字段结构如下:id(记录 ID): 主键字段,自动递增,唯一标识每条记录。 user_id(用户 ID): 关联系统用户的唯一标识,便于跟踪具体用户的积分变动情况。 status(操作类型): 操作类型字段,用于标识当前记录是增加积分(add)还是减少积分(cut)。 number(积分数量): 记录积分的变动数量,始终为正数。具体是增加还是减少由 status 决定。 remark(操作备注): 操作的备注信息,记录积分变动的原因或说明(如“完成订单奖励积分”或“订单退款扣除积分”)。 type(来源类型): 表示积分变动的来源类型,支持以下枚举值: order:积分变动来源于订单(如下单奖励、退款扣减等)。 activity:积分变动来源于活动(如签到奖励、抽奖活动等)。 other:其他来源类型,可根据实际需求扩展。 order_id(关联订单号): 如果积分变动与订单相关,则记录关联的订单号;如果与订单无关,则保持为空。 time(操作时间): 记录积分变动的具体时间,便于后续统计和查询。
4、数据表xinle_points_notes具备如下特性:高效查询: 为 user_id 创建索引,可快速查询某用户的所有积分变动记录。 为 type 创建索引,便于按来源类型进行统计。 为 order_id 创建索引,便于通过订单号快速定位积分变动记录。 数据完整性: 使用枚举类型约束 status 和 type 字段,确保数据合法性。 积分数量始终为正数,避免负值逻辑混乱。 灵活性: 支持多种来源类型,方便后续扩展(如新增来源类型 promotion 等)。 备注字段允许自定义说明,增强记录的描述性。 扩展性: 可根据业务需求增加字段,例如添加操作人 ID(记录是谁执行了积分变动)。 如果未来需要更多类型或来源,可扩展 type 枚举值。
5、xinle_is_level_config方法优化,新增了经验百分比计算逻辑,通过 (当前积分 - 等级起始积分) / (等级上限积分 - 等级起始积分) * 100% 计算进度 处理了等级区间为 0 的特殊情况(避免除以零错误),此时直接返回 100% 使用 max(0, min(100, $percent)) 确保百分比始终在 0-100 之间 用 round($percent, 2) 保留两位小数,使结果更直观 新增的 percent 字段将包含在返回的等级配置中,直接反映当前等级的完成进度。
6、我的页面现在会通过 xinle_is_level_config 动态获取用户当前消费等级的配置信息,并在头部页面中直观展示用户的消费情况。页面设计包括以下内容:首先,通过清晰的文字显示用户的消费等级,让用户快速了解自己的当前身份,例如“青铜采购”“白银采购”等;其次,采用进度条的形式展示用户消费经验的百分比,进度条设计结合消费等级的配色方案,确保视觉效果与等级标识一致,既美观又直观。此外,消费标识的颜色标记会与用户当前的消费等级相匹配,通过背景色和文字色的合理搭配增强辨识度与视觉层次感。
7、我的页面目前通过 xinle_is_profile 接口获取用户的详细资料信息,并结合内置字段对用户的认证状态进行判断。具体展示逻辑如下:系统会判断用户是否已完成实名认证,如果用户已实名,则在页面中清晰地显示“已实名”的标识,增强用户信任感;如果用户尚未实名,则会提示“未实名”,以便提醒用户尽快完成认证流程。此外,页面还会判断用户是否拥有认证图标,若用户具备认证图标,该图标将直接展示在用户头像区域,与头像结合形成一体化的视觉效果。
8、后台新增了 xinle_profile_tab_config 配置组,用于灵活管理和生成我的页面功能菜单。通过该配置组,页面的功能菜单可实现动态构建,并支持二级菜单的结构扩展,具备无限添加功能菜单的能力。每个子菜单包含多个字段参数,以满足不同的定制化需求。具体字段参数包括:name,用于定义菜单名称,字数限制在四个字以内,确保简洁明了;key,作为菜单的唯一标识,便于系统精准定位和管理;onclick,用于设置菜单的点击事件,可关联具体操作逻辑;icon,用于图标的个性化设置,增强菜单的视觉表现力;color,用于定义菜单的背景颜色,使菜单风格更加多样化且符合整体设计需求。通过该配置组的灵活性和可扩展性,页面功能菜单的管理变得更加高效,同时也能满足不同场景的个性化定制需求,进一步提升用户体验。
9、xinle_profile_tab_config 配置组新增了两个权限控制功能,以进一步增强菜单管理的灵活性和安全性: 一级主菜单容器权限控制:支持设置为仅管理员可见。启用该选项后,如果用户身份不是前台管理员或超级管理员,则无法查看或访问该主菜单。这一功能能够有效保障敏感功能的权限分级,避免普通用户误操作或访问不必要的功能模块。 二级子菜单启用状态设置:允许对二级子菜单进行启用或禁用的操作。如果某些功能需要临时停用,可以通过该配置轻松关闭对应的子菜单,无需删除或修改核心代码,随时恢复使用。这一功能为菜单的动态管理提供了便利,适合应对功能迭代或特殊场景需求。 通过这两个权限配置的新增,xinle_profile_tab_config的功能更加完善,既满足了管理员对权限管控的需求,又提升了菜单管理的灵活性,确保系统运行更加安全、高效。
10、在我的页面底部区域新增了一个 帮助与支持中心 模块,用于集中展示与用户使用相关的辅助功能。该区域包含以下内容:APP使用帮助、意见反馈、客服中心等功能菜单,旨在为用户提供便捷的服务入口,帮助用户快速查找和解决问题。通过将这些功能集中在底部区域,用户可以更轻松地定位到相关支持服务,无需在页面中反复查找,提高了用户体验。同时,这一设计也为平台与用户之间的沟通搭建了高效桥梁,方便用户反馈问题、获取帮助或联系客服,进一步增强了产品的服务性与用户粘性。
11、为了实现灵活的扩展性,帮助与支持中心采用后台配置的方式进行管理。新增了一个字段:xinle_profile_tab_help_config,用于支持模块的动态配置。字段设计如下:name:菜单名称,用于展示在页面上的具体功能名称,例如“常见问题与使用指南”。key:唯一标识,每个菜单项必须具备独立的标识符,便于后台数据管理和前端调用。content:描述文字信息,简要介绍菜单功能或内容,帮助用户快速了解该选项的用途,例如“提供常见问题解答及操作指南”。icon:对应的图标,支持使用FontAwesome图标组,提升菜单的视觉表现力,使用户能够快速识别功能。onclick:点击事件,用于定义用户点击菜单项时的具体交互行为,可触发页面跳转、弹窗提示或其他交互逻辑,确保功能的便捷性和可操作性。
0
小小乐
lv.2
实名用户
2025年10月15日
1、新增方法:build_customer_service_member_html,构建客服团队成员HTML。整个执行流程如下:1. 获取成员基础信息 从 $member 数组中提取以下字段: name:成员名称。如果为空,则使用默认值(空字符串)。 desc:职位描述或个人简介。如果为空,则使用默认值“客服专员”。 user_id:用户 ID,用于获取详细信息。如果为空,则跳过相关用户详细信息处理逻辑。 phone:联系电话。如果为空,则使用默认值(空字符串)。 2. 获取用户详细信息 如果 user_id 不为空,执行以下操作: 调用函数 xinle_is_profile($user_id) 获取用户详细信息,包括: verify_html:认证图标 HTML。 avatar 或 avatar_url:用户头像。 调用函数 xinle_is_online($user_id) 检查用户是否在线,返回在线状态。 3. 处理用户头像 根据以下优先级决定显示的头像: 如果用户详细信息中有 avatar,则使用用户头像。 如果用户详细信息中有 avatar_url,则使用头像 URL。 如果没有头像,则使用系统配置的默认头像: 调用函数 xinle_get_option('xinle_security_login_avatar_default') 获取默认头像。 如果配置为空,使用预定义的系统默认头像路径。 4. 构建 HTML 结构 按照以下层级生成 HTML: 成员卡片容器:整体卡片容器 <div class="team-member-card">。 成员头部:包含头像、认证图标、成员姓名和职位描述。 头像:显示成员头像或姓名首字母(默认头像)。 认证图标:显示认证图标(如果有)。 职位描述:显示成员职位或默认文本“客服专员”。 折叠图标:用于展开或收起详细信息的图标。 成员详细信息(默认隐藏):包含以下内容: 职位描述:显示成员描述(如果有)。 联系方式: 电话:显示电话,并提供拨号链接。
2、返回的客服名单 HTML 页面集成了微信功能和在线状态,具体实现流程如下: 在通过 build_customer_service_member_html 方法获取用户相关信息时,系统会提取以下字段用于构建页面内容: weixin:用户的微信号。 weixin_image:微信二维码图片,用于展示用户的微信二维码。 构建微信功能部分 当 weixin_image 字段不为空时,系统会动态生成包含微信二维码的 HTML。页面会提供一个按钮(如“查看微信二维码”),用户点击后即可弹出微信二维码图片,方便扫码添加好友或进行交流。 在线状态指示器 为了实时反映客服的在线状态,系统会调用 xinle_is_online($user_id) 方法,根据传入的用户 ID 检查该用户当前是否在线。随后,系统会根据检查结果动态生成在线状态指示器的 HTML: 如果用户在线,显示绿色指示器,并标注“在线”状态。 如果用户离线,显示灰色指示器,并标注“离线”状态。
3、客服中心新增监听器 bindCollapseEvents,用于实现客服列表的折叠与展开逻辑。该监听器的核心功能是根据用户的操作动态控制列表卡片的展开状态,同时确保当前操作的卡片在页面中完全可见,并在必要时触发滚动处理。 功能描述 折叠逻辑:当用户点击某个客服卡片时,系统会检查该卡片的当前状态: 如果卡片已展开,则将其收起。 如果卡片处于折叠状态,则收起所有其他已展开的卡片,同时展开当前卡片。 滚动处理:在展开当前卡片后,系统会检查该卡片是否完全可见。如果卡片的部分内容被遮挡,则延迟 300 毫秒将其滚动到页面的可见位置,确保用户能够完整查看展开的内容。
4、客服中心中,每位客服对应的展示区域提供了三个功能菜单,分别是“在线交流”、“拨打电话”和“微信”,旨在满足用户的不同沟通需求。以下是具体功能描述及实现方式:在线交流: 功能描述:点击“在线交流”后,调用 xinle_open_chat 方法,进入与对应客服的聊天会话窗口。用户可以通过该窗口进行实时在线沟通,也可选择留言方式,方便处理异步交流。 实现逻辑:xinle_open_chat 方法需要接受当前客服的唯一标识(如客服 ID)作为参数,以确保跳转到正确的会话窗口。拨打电话: 功能描述:点击“拨打电话”后,通过 tel: 协议触发系统拨号功能。部分设备会弹出拨号确认提示,部分设备(如部分手机)会直接跳转至拨号界面,自动填充客服的电话号码。 实现逻辑:电话号码需要动态绑定到 tel: 协议的链接中,以确保拨号目标的准确性。微信:功能描述:点击“微信”后,通过内置方法弹出包含客服微信好友二维码的图片弹窗。用户可以通过扫描二维码添加客服微信好友,便于进一步沟通。
5、在微信图片弹出时,为了提升用户体验,新增了一个“保存图片”按钮,位于微信二维码图片的下方,方便用户直接保存二维码至本地。用户点击该按钮后,会触发 saveWechatImage 监听器,通过获取当前二维码图片的地址,调用 xinle_download_image 函数实现图片的保存功能。
6、针对客服中心和问答教程中心页面,为了优化用户体验,在页面初始化和交互逻辑上进行了以下调整:初始化时不再触发 $f7.preloader.show() 加载指示器,同时在页面刷新或后退返回时,也不会重新加载请求数据。由于这两个页面的交互元素较少,数据加载的实时性需求不高,因此可以避免不必要的资源消耗和重复请求,从而提升页面的响应速度和操作流畅性。
7、在客服列表中心页面的初始化逻辑中,通过调用 xinle_api_post 获取数据后,将执行一系列处理流程,以确保页面功能正常运行并提升用户体验。具体逻辑如下: 当成功获取到初始化页面数据后,将依次执行以下步骤: 绑定折叠事件(bindCollapseEvents): 为页面中的可折叠区域绑定事件,确保用户能够通过点击展开或收起相关内容区域。 此功能可以优化页面布局,使信息呈现更加简洁,同时提升用户操作的便利性。 显示客服团队信息: 在数据加载成功后,将页面中的客服团队信息动态渲染到对应的展示区域。 确保内容展示清晰、完整,方便用户查看相关信息。 绑定图片加载错误事件(bindImageErrorEvents): 针对页面中的客服头像或团队图片,绑定错误处理事件。如果图片加载失败,将自动替换为默认占位图或提示用户图片无法显示。
8、在消息页面的右上角新增了一个名为“在线客服”的按钮,用户点击该按钮后,将跳转至 客服中心页面(customer_service_team),以便用户可以更快捷地获取帮助和支持。这个功能的设计旨在提升用户体验,方便用户随时联系在线客服,解决问题。用户在注册成功时,系统会默认向用户发送一封站内信。这封站内信通常包括欢迎信息、平台使用指南以及客服联系方式等内容,旨在帮助用户快速熟悉平台的基本功能。然而,为了让用户在后续使用中能够更方便地获取帮助,“在线客服”按钮的引入使得用户即便未保存站内信或需要更进一步的支持时,也能通过消息页面快速访问客服中心,获取更多帮助。
9、在问题中心页面的右上角新增一个“投诉”按钮,用户点击该按钮后,将触发一个弹出对话框,展示投诉或合作联系的相关信息,包括联系人、手机号以及地址等内容,方便用户快速获取投诉或合作联系的渠道。弹出层支持点击遮掩层进行关闭,也支持内部按钮按钮进行关闭处理。
10、对“我的页面”进行重构设计,将现有页面模板 view_profile 推到重构处理。新版“我的页面”模板将支持展示更多、更完整的内容,优化用户体验,并实现功能模块的高效整合与布局。新版页面将包含常用工具、交易订单、帮助与支持等板块,满足用户多样化需求,提升页面信息的全面性和功能的实用性。
11、后台用户中心新增字段配置组:xinle_user_lv_config,用于平台账户等级配置。根据用户交易实付款(完成交易)计算经验值,达到区间后自动升级,该配置组包含的字段信息包括:name:等级名称、key:唯一标识:color:对应的等级颜色标识、sort:权重数值越小越靠前(如1=铜牌,2=银牌)。initial:起始经验值m包含当前值(如等级1填0),需与上一等级的「上限经验值」严格衔接。highest:上限经验值:不包含当前值(如等级1填1000,代表0≤经验<1000),最高等级可填0表示无上限。
0
小小乐
lv.2
实名用户
2025年10月14日
1、新增方法:xinle_help_tutorial_list,该方法用于查询指定分类下的文章列表,支持分页功能,并按照发布时间降序排列(即最新的文章显示在最前面)。具体实现逻辑如下: 方法功能: 通过提供的 WordPress 分类ID,查询该分类下的所有文章。 支持分页功能,通过传入页码参数实现按页加载文章。 查询结果按文章的发布时间从新到旧排序,确保最新发布的文章优先显示。 方法参数: $category_id:分类ID,必填参数,用于指定查询的文章分类。 $page:页码,可选参数,默认为1。如果未传入页码,则默认查询第一页内容。 返回结果: 查询成功且有数据时,返回一个包含文章信息的数组。 查询失败(如分类ID不存在)或无数据时,返回 false。
2、新增方法:xinle_get_category_name($category_id),获取分类名称。传递对应的 $category_id 分类ID,获取分类名称。如果获取失败则直接返回论坛列表。在列表页,会在头部标题区域显示论坛名称,方便用户区分当前所处的位置的。因此后端需要封装一个方法来获取对应的名称。
3、新增方法:xinle_get_excerpt获取文章摘要。需要传递两个变量:$content 文章内容,$length 摘要长度(默认100)。返回对应的文章摘要。该方法的处理流程如下:首先通过wp_strip_all_tags来去除html字符串,然后通过preg_replace去除所有的空格,最后mb_substr使用进行截断字符串处理。
4、help_tutorial_list_initialization分页请求已完成封装处理:当用户进入问答论坛的分类列表页的时候,会依次执行以下处理:接收参数 接收两个参数: category_id:文章分类的 ID。 page:分页页码。 如果 category_id 为空或非法,返回错误提示并终止执行。 2. 获取分类信息 根据 category_id 获取分类名称,并将其存入结果中($result['category_name'])。 3. 获取文章列表 调用 xinle_help_tutorial_list 方法,根据 category_id 和 page 获取文章列表数据。 4. 检查文章列表 如果文章列表为空,返回不同的提示: 如果是第一页,显示“暂无问答教程”的占位内容。 如果是其他页,显示“没有更多内容”的占位内容。 5. 配置分页数量 获取每页显示的文章数量(默认 10),并确保其值大于等于 1。 6. 生成文章 HTML 遍历文章列表,生成对应的 HTML 内容: 文章标题:通过 esc_html 转义后输出。 文章摘要:调用 xinle_get_excerpt 截取文章内容的前 80 个字符。 最后更新时间:格式化文章的最后修改时间为“年-月-日”。 浏览量:获取文章的浏览次数(views)。 每篇文章生成一个完整的 HTML 结构,追加到 $html 中。 7. 返回结果 将生成的 HTML 存入 $result['html']。 设置返回状态为成功($result['code'] = 0)。 设置返回信息为“获取成功”($result['msg’])。
5、后台新增字段:xinle_customer_service_team_config,该字段用于配置客服团队成员的详细信息,便于管理和展示客服团队成员的相关资料,同时方便用户与客服进行在线沟通或联系。具体字段及功能说明如下:字段名称:xinle_customer_service_team_config,用于存储客服团队成员的配置信息。包含字段及说明:员工名称:字段类型:字符串说明:记录客服团队成员的姓名,便于识别和展示。唯一标识:字段类型:字符串说明:每位客服成员的唯一标识符,用于系统内部区分不同成员,确保数据的唯一性。描述信息:字段类型:文本说明:存储该成员负责的职责详情或相关描述,例如负责的服务范围、专业领域等。方便用户了解该成员的职责分工。站内UID:字段类型:整数说明:对应系统内的用户ID,方便进行站内在线沟通或交易。手机号:字段类型:字符串说明:记录客服成员的联系手机号,方便用户通过电话联系。微信号:字段类型:字符串说明:存储客服成员的微信号,便于用户通过微信添加好友联系。微信图片:字段类型:图片上传字段说明:用于上传客服成员的微信二维码图片,方便用户保存图片后通过扫码加好友。
6、在前端xinle对象中新增属性:customer_service_team,通过js_css脚本将后台的客服团队成员信息集成到xinle对象中,前端页面可直接读取此配置属性进行展示或操作,从而减少后端API交互,优化加载性能和用户体验。具体实现及说明如下:新增属性:customer_service_team,用于存储后台配置的客服团队成员信息,前端直接通过xinle.customer_service_team访问。
7、前端新增页面:customer_service_team:APP客服团队成员名单列表,该页面旨在展示平台的客服团队成员信息,包括成员的姓名、职责、联系方式等内容,用户可以通过页面提供的方式直接与客服人员联系。页面对所有用户开放,包括未登录的游客。模板文件存储路径为:customer_service/customer_service_team.html,该文件将定义页面的结构和样式,并通过集成的xinle.customer_service_team属性动态加载数据。
8、后台客服中心配置新增3个字段,用于完善客服中心的信息展示及页面调用。这三个字段分别是: xinle_support_company_desc:客服中心描述简介 功能:用于描述客服中心的服务宗旨或功能介绍,帮助用户快速了解客服中心的定位和服务范围。 示例内容:使用过程中,遇到问题都可以与我们取得联系。 应用场景:该字段主要用于前端页面展示,作为客服中心的简介文本,便于用户了解如何与平台联系。 字段类型:字符串类型,支持中英文内容输入,最大长度建议为255字符。 xinle_support_work_time:我们的工作时间 功能:用于展示客服团队的工作时间信息,方便用户在合适的时间与客服人员取得联系。 示例内容:周一至周五 9:00 - 18:00 应用场景:该字段可在客服相关页面或通知中调用,帮助用户明确平台客服的服务时间,避免用户在非工作时间联系时产生误解。 字段类型:字符串类型,支持时间段描述,最大长度建议为100字符。 xinle_support_company_address:公司的详细地址 功能:用于存储公司的办公地址信息,便于用户在需要线下联系或寄送文件时获取具体地址。 示例内容:北京市朝阳区望京街道XX大厦XX楼XX室 应用场景:该字段将在部分页面(如“关于我们”页面或客服信息展示页面)调用,帮助用户了解公司的实际位置。 字段类型:字符串类型,支持详细地址输入,最大长度建议为255字符。
9、customer_service_team团队页面模板结构设计如下,旨在全面展示客服团队信息,同时提供便捷的功能入口,提升用户体验:页面结构说明:头部区域内容展示:显示客服中心的工作时间和描述简介,直接读取后台配置的字段内容。设计思路:头部区域作为页面的引导部分,需简洁明了,突出平台服务宗旨,帮助用户快速了解客服中心的服务时间及功能。动态数据来源:后台配置字段xinle_support_work_time和xinle_support_company_desc。正文区域内容展示:从后台读取配置,动态展示平台的客服团队名单列表,包括客服人员姓名、职务、联系方式等信息。设计思路:正文区域是页面的核心部分,通过清晰的列表展示客服团队信息,方便用户快速找到对应的联系人。动态数据来源:后台数据库中存储的客服团队信息,可通过API接口或直接读取数据表内容。
10、在展示客服团队名单时,为了优化页面空间利用率和用户体验,采用收缩设计(手风琴式布局)。在初始状态下,仅显示客服头像、姓名和单行描述,超出部分以省略号形式呈现。用户可通过手风琴开关展开完整信息,包括客服的详细描述、在线聊天入口、手机号等内容。页面设计说明:初始状态展示内容显示:客服头像、姓名、单行描述(超出部分以省略号形式显示)。设计思路:初始状态下简洁直观,减少页面占用空间,用户可以快速浏览客服名单。展开状态展示内容显示:客服的完整描述信息、在线聊天入口(如“立即沟通”按钮)、手机号等。设计思路:通过手风琴开关交互,用户可根据需求查看详细信息,避免信息冗余。
11、在进入客服团队页面时,系统会执行一个初始化动作:customer_service_team_initialization,其核心流程如下: 系统会通过调用配置接口 xinle_customer_service_team_config 来读取客服名单列表,并对返回的原始数据进行解析处理。同时,会读取客服中心的相关字段信息(如标题、描述、菜单配置等),以动态生成页面内容。初始化完成后,系统会构建页面的 HTML 结构,具体包括以下几个部分: 头部信息区域 包含页面标题(如“客服团队”)、简要介绍或说明,旨在帮助用户快速了解页面功能。 服务菜单区域 提供快捷导航功能,包括“反馈中心”、“问答中心”等常见服务入口,便于用户快速切换到其他服务模块。 客服团队容器 该容器是页面的主要展示区域,包含客服团队标题及成员列表。标题区域可展示团队名称或简介,成员列表则动态展示所有客服的基本信息。 客服团队成员列表 列表内容基于解析后的客服数据动态生成,初始状态下展示客服头像、姓名及单行简要描述;展开后可查看详细信息(如在线聊天入口、手机号等)。
0
小小乐
lv.2
实名用户
2025年10月13日
1、新增了API接口和模板目录 customer_service,该模块专为客服售后中心设计,旨在统一管理与用户沟通、问题求助及反馈处理相关的所有页面与功能。凡是涉及到客服沟通的媒介、用户问题反馈的处理流程,均通过此目录进行集中管理,确保逻辑清晰、维护便捷。 现有的服务中心功能也已全面迁移至 customer_service 模块,包括所有响应的接口调用,形成统一的管理架构。通过此模块的整合,不仅提升了开发与维护的效率,还为后续功能的扩展提供了更高的灵活性。 需要特别注意的是,所有与用户沟通相关的媒介(如在线客服、问题反馈、工单处理等)均依赖此模块进行调用。
2、在客服中心的配置页面中,新增了一个字段:xinle_problem_help_bbs_id(问题教程分类ID),用于指定客服中心读取的文章列表所对应的论坛分类。通过该字段配置,客服中心展示的所有文章内容均来源于指定的论坛分类,以确保内容的统一性与规范性。需要特别注意的是,该字段配置的必须是父级论坛分类ID,不能直接使用子论坛分类ID。这样设计的目的是为了确保客服中心能够准确调用该父级分类下的所有子分类内容,从而实现更全面的文章覆盖,避免遗漏或调用范围过窄的情况。
3、新增方法:xinle_problem_help_cousult,用于查询指定分类下的文章列表。该方法通过传入WordPress分类ID(即 bbs_id),实现对该分类下文章的精准检索,同时支持分页和搜索功能,提供更灵活的查询方式。 具体功能说明如下: 分类查询:根据提供的分类ID(bbs_id)检索对应分类下的文章,确保数据来源的准确性。 分页支持:通过参数 $page 控制分页功能,默认值为 1,方便处理大规模数据时的分段展示。 搜索功能:支持通过 $search 参数输入搜索关键词,默认值为空。搜索时优先匹配文章标题,若标题中无匹配内容,则进一步匹配正文内容,以确保搜索结果的精准性。 排序规则:所有查询结果按照文章的发布时间升序排列(即先发布的文章排在前),以便用户能够按时间顺序浏览内容。 返回值:成功查询
4、xinle_problem_help_cousul,完成封装处理:整个执行流程如下:初始化:声明 WordPress 数据库全局变量,处理输入参数(页码转为正整数、搜索词去空格)。 配置获取:读取每页显示数量(默认 10),计算分页偏移量,获取并验证分类 ID(无效则返回 false)。 构建查询:基础 SQL 关联文章表与分类关系表,筛选指定分类的已发布文章;有搜索词时添加标题 / 正文模糊匹配条件(标题匹配优先),按发布时间升序排序;无搜索时直接按发布时间排序。 执行查询:添加分页限制,预处理 SQL(防注入)并执行,获取结果。 结果处理:有有效文章数组则返回数组,否则返回 false。
5、问答中心页面集成了 xinle_infinite_hook 事件,旨在实现分页加载问题列表的功能。页面在用户访问时,会自动触发初始化加载,向对应的 API 接口发起查询请求以获取数据,提升用户体验和内容展示的效率。 具体功能描述如下: 自动初始化加载:当用户首次访问问答中心页面时,系统会主动触发事件,通过 API 接口查询当前页的问题列表,确保页面能够在加载时直接展示内容,无需用户额外操作。 分页处理:在请求过程中,系统会通过内置方法动态获取当前页码,并在数据返回后对页码进行更新处理,确保分页逻辑的准确性和连续性,避免数据重复或遗漏。 下拉滚动加载扩展:页面集成了下拉滚动加载的扩展功能,用户在浏览页面时可以通过向下滚动触发事件,自动加载更多问题列表,进一步增强用户浏览的流畅性和交互体验。 数据请求与展示:每次加载都会通过 API 查询最新的分页数据,并将结果动态渲染到页面,确保内容的实时性与完整性。
6、xinle_infinite_hook 新增了一个状态标记(status),用于区分页面数据请求的不同来源,包括初始化加载(pageInit)和下拉加载(infinite)。通过引入该状态标记,系统能够在内部执行分页加载时,根据请求来源精准验证并匹配对应的业务逻辑,从而确保数据处理的正确性与合理性。 具体功能描述如下: 状态标记区分加载类型:新增的 status 参数可以明确区分两种加载方式:初始化加载(pageInit)和下拉滚动加载(infinite)。这种区分使得系统能够在处理数据请求时根据不同场景执行相应的逻辑。 业务逻辑的差异化处理: 初始化加载(pageInit):当状态标记为 pageInit 时,系统会执行页面的初始数据加载逻辑,通常用于用户首次进入页面或刷新页面的场景。返回结果会以覆盖方式处理,即清空当前数据并重新填充最新内容,确保页面始终展示最新的完整数据。 分页加载(infinite):当状态标记为 infinite 时,系统会执行分页加载逻辑,通常用于用户滚动页面触发的加载场景。返回结果以填充方式处理,将新获取的数据追加到已有数据列表中,确保用户能够连续浏览更多内容。 请求来源验证:在内部执行分页加载时,系统会通过 status 标记验证请求的来源,从而确保每种加载方式对应的业务逻辑能够准确执行,避免逻辑混乱或数据处理错误。 数据处理灵活性:通过区分加载类型,系统能够针对不同的加载场景采取最适合的处理方式,不仅提高了数据加载的效率,还优化了用户浏览体验。
7、xinle_infinite_hook的大致处理流程如下:检查加载状态 如果是初始化加载(pageInit),重置页码为 1,允许加载。 如果当前正在加载(page_infinite === true),直接退出,避免重复加载。 准备请求参数 设置当前页码、加载状态和搜索关键词,作为请求参数。 显示加载动画 初始化加载时替换页面内容为加载动画。 下拉加载时在页面末尾追加加载动画。 发起数据请求 调用 API 获取分页数据,并等待返回结果。 处理返回数据 成功:更新页面内容(替换或追加),增加页码,允许继续加载。 失败:显示错误内容,禁止继续加载。 处理网络错误 如果请求失败,弹出错误提示,并允许重新加载。 移除加载动画 无论成功或失败,都移除加载动画。
8、problem_help 页面新增了搜索框功能,旨在提升用户查找问题的效率与便捷性。用户可以通过在搜索框中输入关键词(如“发票”),系统将根据输入内容检索问题分类中的相关数据,包括文章标题和正文内容,并将匹配结果返回到问题列表中。整个搜索流程和结果呈现经过精细化设计,支持多种场景的优化处理。 功能详情如下: 关键词检索:用户在搜索框中输入关键词后,系统会对问题分类中的数据进行深度匹配。匹配范围包括文章标题和正文内容,确保搜索结果覆盖尽可能多的相关内容。 结果优先级排序: 标题优先匹配:系统将优先返回标题中包含关键词的结果,这样可以帮助用户快速定位到主题明确的问题。 正文匹配补充:对于标题中未包含关键词的情况,系统会返回正文内容中匹配到关键词的结果,作为补充,以最大化搜索的有效性。 空结果提示:当用户输入的关键词未能匹配到任何内容时,系统会显示友好的错误提示,告知用户当前没有相关问题,避免用户产生困惑。 分页加载支持:为避免一次性加载过多数据造成页面性能问题,搜索结果支持分页加载。用户可以通过滚动或翻页逐步查看更多匹配内容,提升浏览体验。
9、problem_help 页面新增了防抖保护措施,旨在优化用户操作体验并有效减少频繁触发请求对系统资源的消耗。该功能主要应用于分页下拉加载和搜索输入框的实时查询结果返回,并通过设置不同的防抖保护时间,确保用户操作的流畅性与系统的稳定性。 功能详情如下: 防抖机制的应用场景: 分页下拉加载:当用户在问题列表页面进行下拉操作加载更多内容时,系统会启用防抖保护,设置保护期为400毫秒。在此时间内禁止重复触发API请求,避免因用户快速连续操作导致的重复加载问题。 搜索输入框实时查询:用户在搜索框中输入关键词时,系统会启用防抖保护,设置保护期为1秒。只有在用户停止输入并超过1秒后,系统才会触发API请求进行数据检索,防止频繁请求对服务器造成压力,同时减少不必要的查询。
10、前端新增了页面组件:help_tutorial_list,该页面是专门用于展示问题教程分类的列表页,主要功能是呈现当前分类下的所有教程文章。页面设计简洁直观,方便用户快速浏览和查找相关内容。具体实现细节如下: 页面功能与特点: 该页面用于展示某一问题教程分类下的所有文章,帮助用户快速了解该分类的内容。 页面支持游客访问,无需登录即可查看,提升了内容的可见性与传播性。 页面设计注重结构清晰和内容聚合,确保用户能够便捷地获取所需信息。 模版路径与调用方式: 模版文件路径为:bbs/help_tutorial_list.html。 页面访问时需要通过URL传递一个 ID 变量,该变量为论坛的分类ID,用于后台根据ID查询对应分类下的文章数据并返回给前端展示。
11、当用户进入 help_tutorial_list 页面时,系统会通过 pagenit 触发一个初始化加载请求,该请求的主要目的是获取当前页面传递过来的分类ID,并根据该ID加载对应分类下的论坛文章列表。具体实现逻辑如下: 初始化加载逻辑: 页面通过 pageInit 方法在加载时自动获取URL中传递的分类ID变量。 随后,调用前端定义的 xinle_help_tutorial_list_hook 方法,向后端发起数据请求,以加载当前分类下的文章列表。 请求的状态与区分: 请求参数中包含一个 status 标识符,用于区分不同的加载场景: 初始化加载(pageInit):当 status 标识为初始化加载时,系统会加载当前分类下的第一页文章数据,完成页面的初始渲染。 分页加载(infinite 下拉加载):当用户向下滚动页面并触发无限下拉加载时,系统会将 status 标识为分页加载,并加载当前分类下的下一页文章数据。 后端会根据 status 的值执行不同的业务逻辑处理: 初始化加载时,后端返回第一页完整的文章数据。 分页加载时,后端根据当前页码返回后续文章数据,避免一次性加载全部内容,提升页面加载性能。
0
小小乐
lv.2
实名用户
2025年10月10日
1、论坛内容页的模块页面展示层级设计如下:首先是页面的头部区域,默认显示“论坛中心”作为占位标题,待后端返回具体参数后,动态更新为论坛的真实名称,以确保页面信息的准确性和一致性。接下来是标题正文部分,该区域用于展示文章的主标题,初始状态为空,待后端处理并返回数据后进行内容填充,以提供用户所需的核心信息。第三部分是副标题区域,包含文章的浏览总量、作者名称以及具体的发布时间(年月日),这些信息不仅能增强文章的可读性,还为用户提供了内容的背景和来源,提升页面的整体信息价值。最后是正文内容区域,该部分负责展示文章的详细内容,输出经过转义处理的 HTML 实体,以确保内容的正确渲染和安全性。页面初始状态下,正文内容会显示加载图标,提示用户正在获取数据,当后端返回完整的内容后,页面会自动更新相关元素,动态展示文章的完整信息。
2、新增系统接管函数:xinle_wrap_images_with_custom_fancybox,旨在为文章正文中的图片自动添加 Fancybox 灯箱效果。该函数采用全局接管的方式,确保所有文章中的图片都能统一实现灯箱功能,其执行流程如下:首先,通过过滤器介入文章正文的处理流程,接收并解析原始的正文内容。为了确保每篇文章中的图片能够正确分组显示灯箱效果,系统会优先使用文章的唯一 ID 作为灯箱组的标识。如果文章 ID 不存在,则生成一个随机数作为组标识,以保证灯箱分组的独立性和唯一性。
接下来,函数会匹配正文中所有的 <img> 标签,逐一对图片进行处理。处理流程包括以下几个步骤:从图片标签中提取图片的地址,去除可能存在的缩略图参数,从而获取图片的原图地址;为图片添加一个名为 chat_image 的自定义类,用于后续样式控制;然后,用一个带有灯箱属性(data-fancybox)的 <a> 标签将图片包裹起来,同时为 <a> 标签添加 link external 类以及居中的样式,以确保图片链接具备良好的视觉效果和交互体验。最终,函数会返回经过处理后的正文内容,其中所有图片均被自动赋予了灯箱功能。通过这种方式,文章中的图片不仅能够支持放大查看,还具备分享和下载的功能。
3、前端新增方法 xinle_load_script,这是一个动态加载 JavaScript 脚本的工具函数,旨在为特定页面按需加载对应的 JS 脚本,以实现灵活高效的资源管理。某些页面可能需要集成特定的 JS 脚本来处理对应的业务逻辑,但如果在页面初始化时直接加载所有可能的脚本,不仅会显得笨重,还会对页面性能造成一定的影响。因此,xinle_load_script 的引入,可以实现脚本的动态按需加载,优化页面资源的使用。
4、xinle_load_script 方法拥有四个关键变量和一个返回值,设计简洁而实用,能够满足动态加载脚本的各种需求,具体说明如下: url(必填):脚本的 URL 地址,用于指定需要加载的 JavaScript 文件的路径。该参数是方法的核心,决定了要加载的脚本资源。 id(必填):脚本标签的唯一标识 ID,用于避免重复加载相同的脚本。通过设置唯一的 ID,可以确保同一个脚本不会被重复插入到页面中,这不仅优化了资源管理,还避免了潜在的逻辑冲突。 position(可选,默认值 'body'):脚本插入的位置。支持两个值:'header'(插入到页面的 <head> 中)和 'body'(插入到页面的 <body> 中)。默认值为 'body',通常用于脚本加载不会阻塞页面渲染的场景;而当脚本需要优先加载或依赖某些头部资源时,可以选择 'header'。 callback(可选):脚本加载成功后的回调函数。当脚本加载完成后,可以通过此回调函数执行后续逻辑,比如初始化某些功能或触发相关事件。该参数提供了灵活的扩展性,方便开发者根据业务需求进行定制化处理。 返回值(Promise 对象):方法的执行结果是一个 Promise 对象,支持现代的 async/await 语法,便于异步操作。通过返回 Promise,开发者可以更方便地控制脚本加载的流程,例如等待脚本加载完成后再执行后续逻辑,从而进一步提升代码的可读性和可维护性。
5、xinle_load_script的执行流程机制如下:参数校验: 检查是否提供了 url 和 id。 如果缺少必填参数,打印错误信息并返回失败。 检查是否已加载: 通过 id 查找是否已有相同脚本。 如果已加载,直接执行回调并返回成功。 动态加载脚本: 创建一个 <script> 标签,设置脚本地址(src)和唯一标识(id)。 监听加载成功(onload)或失败(onerror)事件。 兼容旧浏览器(如 IE)通过 readyState 检测状态。 插入到页面: 根据 position 参数选择插入到 <head> 或 <body>。 默认插入到 <body>。 返回结果: 使用 Promise 支持异步调用: 加载成功时,resolve()。 加载失败时,reject()。
6、新增页面:problem_help,作为客服问答中心,旨在为用户提供便捷的帮助与问题解答。页面的模板文件路径为 settings/problem_help.html,此页面对所有游客开放,无需登录即可访问,提升了平台的友好性与服务可及性。页面的主要功能是汇总平台所有的相关问题,并进行集中展示,方便用户快速浏览和获取所需信息。同时,页面还将提供一个功能强大的搜索控件,允许用户通过输入关键词来精准查找相关问题。这一功能不仅提高了用户查找信息的效率,还为用户解决问题提供了更直观的路径。此外,该页面将与问题教程论坛进行关联,确保内容的统一性和分类的精准性。后续从后台读取的问题列表将受到分类的限制,仅展示与指定分类相关的问题。这种设计既能保证内容的针对性,又避免了信息的冗杂,使用户能够更专注于自己关心的问题领域。
7、后台新增字段配置:xinle_problem_help_btn_config,此字段用于问答中心页面头部菜单功能的动态管理与配置。通过该字段,管理员可以灵活定义页面顶部菜单的各项内容,为用户提供直观且便捷的导航入口,提升问答中心的功能性与交互体验。 字段具体包含以下配置项: name:菜单名称,用于展示在页面头部菜单栏中,支持自定义文本内容。例如:支付问题、账户安全等,方便用户快速识别菜单功能。 key:KEY标识,作为菜单的唯一参数值,用于后台逻辑处理或前端页面的精准定位。每个菜单项都需要配置一个唯一的 key 值,以确保不会出现重复或冲突。 onclick:页面操作事件,支持通过 onclick 方法实现功能触发。此字段允许管理员定义菜单点击后的具体行为,例如跳转到对应的分类页面、触发搜索操作或执行其他相关功能,增强菜单的动态交互能力。 icon:图标名称,用于在菜单项中展示对应的图标,支持 FontAwesome 图标库。管理员可以根据菜单内容选择合适的图标进行配置,例如 fa-credit-card(支付图标)、fa-lock(安全图标)等,使菜单更加直观且美观。
8、问题教程分类新增了四个子分类,旨在更细致地归纳和整理用户可能遇到的各类问题,以便用户能够快速定位到所需的帮助内容。这四个子分类具体如下:账户相关(3):该分类主要负责汇总与账户信息相关的一系列问题,包括但不限于修改密码、绑定手机号、解除风控冻结等账户信息的变更与异常处理。通过此分类,用户可以便捷地找到与账户管理和安全相关的解决方案,确保账户的正常使用。交易售后(4):此分类涵盖从支付环节到售后服务的各类问题,包括支付失败、退款流程、运费结算等交易中可能出现的情况。通过该分类,用户能够快速了解交易中每个环节的处理方式,及时解决售后纠纷和资金相关问题。认证资质(5):该分类专注于账户资质与认证相关的内容,主要包括资质过期处理、账户实名认证、资质信息更新等问题。该分类的设置有助于用户在资质审核和维护过程中获得清晰的指引,确保账户资质符合平台要求。其它问题(6):该分类用于汇总不属于上述分类的杂项问题,覆盖范围更广,解决一些相对零散但同样重要的用户需求。通过该分类,用户可以找到一些难以归类的问题的处理方式,确保所有问题都能得到妥善解决。通过新增这四个子分类,平台的问答教程体系得以更加清晰和全面地覆盖用户可能遇到的各类问题,
9、前端 xinle 对象新增了一个属性:problem_help_config,该属性主要用于配置问答中心的客服服务菜单入库口功能。通过集成该属性,开发者可以直接通过 xinle.problem_help_config 获取与问答中心相关的完整配置数据,而无需再通过调用 API 进行额外的读取和处理。
10、客服服务中心新增了一个初始化事件:generateServiceItems,该事件的主要作用是用户打开页面时,根据 xinle.problem_help_config 配置动态解析并生成服务项菜单。整个执行流程包括以下步骤:首先清空页面中现有的服务项内容,确保数据的更新不会受到旧内容的影响;然后根据配置生成新的服务项菜单,并根据每个服务项的具体需求添加相应的功能逻辑,例如检测是否存在 onclick 属性,并为其绑定点击事件。此功能的核心在于通过后台对菜单栏的配置实时生效,开发者或管理员可以直接修改配置而无需重新部署,从而实现灵活的动态更新。整个事件的执行监听是通过 pageInit 完成的,即页面初始化时自动触发,无需用户手动操作。
11、问答中心页面新增了菜单功能,基于 xinle_user_protocol_config 配置,预留了四个菜单选项,分别是: 客服咨询:该菜单为用户提供在线客服咨询的入口,用户可以通过点击此菜单快速与平台客服进行实时沟通,解决问题或获取帮助。 寻求合作:此菜单旨在为有合作意向的企业或个人提供一个便捷的入口。后续将开放一个专属页面,用于展示合作相关信息,用户可通过该页面与平台建立联系,推进合作事宜。 在线反馈:针对用户在使用过程中遇到的特殊问题,此菜单提供了一个提交工单的途径。用户可以通过填写反馈表单,将问题直接提交给官方进行处理,确保问题能够及时响应并得到解决。 关于我们:该菜单将在后期开放,主要用于展示平台的公司介绍,包括企业背景、发展历程、核心价值等内容,帮助用户更好地了解平台的定位与服务宗旨。
0
小小乐
lv.2
实名用户
2025年10月9日
1、后端新增了发票信息页面组件,页面路径为:/settings/Invoice_info.html。该页面仅允许已登录的用户访问,若未登录用户尝试访问,则系统会自动拦截并阻止访问,以确保用户数据的安全性和隐私性。账户发票页面的访问入口位于设置模块的“更多设置”功能子区域,具体访问路径为:“我的页面”-“资料设置”-“更多设置”-“发票抬头信息”。
2、开票信息页面(Invoice_info)主要包含两个内容展示模块:第一部分为“注意事项”,用于向用户说明发票抬头设置的相关细节以及发票的应用场景信息,帮助用户更清晰地了解如何正确填写和使用发票抬头;第二部分为“开票的具体信息”,当用户尚未设置开票信息时,页面会通过提示标签(tips)向用户展示相关提示信息,指导其完成开票信息的填写。页面底部还设计了功能按钮(btn),根据用户是否已填写开票信息动态显示为“新增开票信息”或“修改开票信息”,以便用户可以快速完成信息的新增或编辑操作。
3、后台新增了一个名为“教程中心”的论坛,其别名为“help_tutorial”。该论坛的主要功能是将所有与问题解答和教程相关的内容以帖子的形式记录和展示,方便用户查阅和学习。同时,为了更好地管理和分类,新增了一个对应的BSS目录,用于存储和组织相关内容。不同的论坛类型将使用不同的模板进行渲染,例如,“教程中心”将采用名为“help_tutorial”的专属模板,而其他论坛则根据其别名命名和使用对应的模板。未来,包括隐私协议、活动公告等内容都将通过论坛的形式发布和记录,这种方式不仅便于管理,还能保证内容更新的高效性和统一性。
4、新增了一个页面模板“help_tutorial”,对应的访问路径为:/mobile/bbs/help_tutorial.html。此模板主要用于展示平台的交易教程、售后问题以及平台功能介绍等内容,这些内容将以文章形式记录在论坛中,并通过该模板进行打开和访问。为提高用户的便捷性和内容的可达性,该模板页面支持游客直接查看和访问,无需登录即可获取相关信息。
5、help_tutorial页面设计包含四个动态变量,具体如下:1、id:文章的唯一编号,用于标识具体内容,需通过传参动态获取,且不可更改,确保数据的唯一性与准确性;2、bbs_title:论坛名称,由后端返回并动态加载,用于统一页面风格及标识平台属性;3、title:文章标题,通过动态变量获取并展示,直观呈现文章内容主题;4、文章正文:包含具体内容的部分,可支持短代码和HTML格式,以满足多样化的内容展示需求,实现页面的灵活性与丰富性。
6、当用户进入help_tutorial页面时,会触发一个初始化请求动作,通过pageInit监听器自动发起API初始化请求。该请求连接到论坛的接口中心(bbs接口),并主动传递页面的动态变量id,在请求过程中将其转换为post_id,以便后端进行文章的解析与处理。后端通过post_id获取对应文章的详情数据,包括标题、正文内容以及其他相关信息,并将结果返回前端,完成页面的动态加载与渲染。这一流程确保了页面内容的精准性与实时性,同时通过监听器的自动化操作提高了用户访问的流畅性。
7、项目新增了一个专门的API接口中心:bbs/api.php,主要负责处理论坛、分类、帖子、教程、问答等模块的相关接口请求。该接口默认调用ajax_api模块,以确保所有请求在传输过程中的安全性与可靠性。同时,该接口会加载自定义的函数脚本库,将与这些模块相关的所有自定义脚本集中集成到这个独立的函数库中,以保持代码的模块化和清晰性,尽量避免将这些自定义脚本混入主函数库,从而降低主库的复杂度。这种设计不仅提升了代码维护的便捷性,还增强了项目的扩展性和功能模块的独立性。
8、后端在响应help_tutorial_initialization初始化请求时,将按照以下步骤依次处理:首先,通过POST方式接收post_id参数,用以获取对应的文章编号。如果post_id获取失败,则立即返回错误信息,终止后续操作;如果成功获取post_id,则调用get_post方法尝试获取该文章的完整数组信息。若文章信息查找失败,则返回“抱歉,文章查找失败”的提示;如果成功获取文章信息,则对文章数据进行解析,并提取以下关键参数:id(文章编号)、content(文章内容)、title(文章标题)、date(发布时间)、modified(最后修改时间)、post_author(作者ID)、categories(分类信息)、views(浏览量)、nickname(作者昵称)、code(状态码)、msg(返回信息)。通过以上处理,确保初始化请求能够正确获取并解析文章数据,为后续操作提供可靠的基础。
9、新增了一个文章访问回调统一事件:xinle_page_visit_callback,该事件采用异步回调的方式执行,旨在对文章访问行为进行统一管理。触发该事件时,需要主动传递两个关键变量:user_id和post_id。其中,user_id用于标识访问者的UID,如果访问者未登录,则将其设置为0或空值;post_id则表示文章的唯一编号,用于定位具体的文章。通过此回调钩子,可以实现对用户访问行为的记录与统计,包括用户的访问次数、页面的总访问量以及文章的阅读量等数据。这一事件为后端提供了灵活的扩展能力,同时也为后续的访问数据分析和优化提供了重要依据。
10、新增了 xinle_page_visit_callback 页面访问回调钩子的两个处理动作,用于进一步完善文章访问统计逻辑和全站访问量的统一管理。具体实现如下:
第一步,通过 get_post_meta 获取文章的自定义字段 views,用于读取当前文章的访问量。如果获取失败或字段不存在,则将访问量标记为 1,表示该文章的首次访问。随后,使用 update_post_meta 对 views 字段进行更新操作,将当前访问量加 1,从而实现文章访问量的实时累加。
第二步,调用 xinle_redis_count 系统计数器,向其发起计数请求,更新全站页面的总访问量,将总访问量加 1。该计数器功能强大,支持按区域和时间段进行查询统计。例如,可以通过此计数器获取当天(今日)、上周、本周或上月的页面访问量统计数据,从而为页面访问分析提供精确的时间维度支持。
通过这两个动作的结合,不仅实现了文章访问量的单独记录,还统一管理了全站的访问统计,提供了灵活的数据查询和分析能力,为后续的运营优化和数据挖掘奠定了基础。
11、修复了 xinle_fingerprint_callback 指纹回调动作执行失败的问题。该问题的核心在于,当用户访问时,系统会通过指纹事件检查用户的资料缓存是否需要更新,如果需要更新,则会主动清理 Redis 缓存以确保数据的一致性。然而,由于内部参数传递出现异常,导致回调逻辑未能正常执行,从而引发缓存刷新失败的问题。
0
小小乐
lv.2
实名用户
2025年10月8日
1、新增了一个异步回调接口:xinle_update_password_callback,用于处理用户密码变更后的相关逻辑。当用户密码成功变更时,该接口会通过 Swoole 异步触发并执行,确保操作的高效性和系统性能的稳定性。在触发时,系统会将用户的唯一标识 user_id 作为参数传递给该接口。此回调接口被设计为预留接口,具备高度的可扩展性,可以根据业务需求灵活实现特定的功能处理。
2、当后端确认密码修改成功后,前端会通过 xinle_msg 触发对应的提示消息:“密码修改成功”,以明确告知用户操作结果。随后,前端会隐藏整个密码修改输入表单(update_password_form),以防止用户重复修改,确保流程的完整性与安全性。同时,页面中会动态新增一个专门用于显示结果的表单(update_password_success),用于进一步告知用户密码已成功修改,并提供必要的确认信息,提升用户体验。如果密码修改失败,前端则会弹出一个对话框,直观地告知用户失败的具体原因,例如密码格式不符合要求、服务器异常或其他错误提示,以便用户根据提示进行后续操作。
3、新增了一个名为 update_password_clear_resend_countdown 的方法,用于在修改密码流程中清理定时器。该方法的主要功能是通过内置机制将正在运行的倒计时重置,并恢复验证码获取框的点击功能,确保用户可以正常重新获取验证码。此方法目前会在以下两个场景中触发:第一,当倒计时自动结束时,系统会自动调用该方法进行重置,以便用户无需手动操作即可再次点击获取验证码;第二,当用户退出当前页面时,为了避免定时器继续运行造成不必要的资源占用或内存泄漏,系统会主动执行该方法进行清理。通过这种设计,既能提升用户体验,保证功能的流畅性,又能优化资源管理,确保程序运行的稳定性和高效性。
4、在用户密码修改成功后,系统会主动调用 wp_destroy_other_sessions 方法,以销毁除当前会话外的所有其他会话,从而确保账户的安全性。为了避免执行过程中出现异常或失败,该方法在运行前会先检测 wp_destroy_other_sessions 对象是否存在。如果该对象不存在,系统会自动引入 WordPress 的用户会话管理功能,以确保方法能够正常执行。这种设计不仅有效防止了因对象缺失导致的功能异常,同时也进一步提升了密码修改后的安全性,避免用户因旧会话未销毁而可能面临的安全风险。通过这一机制,系统在功能执行的可靠性和用户账户安全性方面得到了双重保障。
5、在前端新增了一个回调脚本动作 xinle_callback_update_password,该动作会在用户密码修改成功后(由 update_pass 页面发起的修改请求)被主动触发执行。该回调接口目前处于预留状态,尚未与任何具体事件进行集成,但为后续功能扩展提供了灵活性和可操作性。通过该接口,未来可以轻松实现与其他功能模块的联动,例如通知用户密码修改成功、更新相关安全日志或同步到第三方服务等操作。
6、新增页面:settings_more,即“设置更多”页面。随着系统功能的不断扩展和复杂化,原有的设置页面逐渐显得过于拥挤,尤其是一些自定义设置参数和次要功能菜单堆积在页面上,影响了用户的操作体验。为了解决这一问题,单独设计了“设置更多”页面,将一些重要性较低或使用频率较低的设置选项集中到该页面进行管理。这不仅优化了原设置页面的布局,使其更加简洁明了,同时也提升了用户在复杂系统中的操作效率。、
7、在“更多设置”页面新增了一个菜单项:退出其它设备。此功能与内置事件 logout_other_devices 关联,当用户点击该菜单时,将弹出一个确认对话框,提示用户:“确定要登出其他所有设备吗?此操作将使其他设备上的登录状态失效,但当前设备不会受到影响。” 如果用户选择“确定”,系统将触发 xinle_api_post 请求动作,与后端进行交互以完成该操作。为避免用户重复点击导致的多次请求,点击后会显示加载提示器,直至后端完成处理并返回响应结果后,加载提示器将自动移除。
8、后端在处理 logout_other_devices(登出其它设备)请求时,首先会对当前用户的登录状态进行校验。如果检测到用户未登录,则直接返回错误信息,终止后续操作;如果用户已登录,则继续检查 wp_destroy_other_sessions 方法是否可用。如果该方法不存在,后端会通过 require_once 动态加载核心用户扩展,以确保所需功能的可用性。加载完成后,调用 wp_destroy_other_sessions 方法执行具体的登出操作,清除当前用户在其他设备上的登录会话。整个流程的设计充分考虑了安全性与稳定性,确保只有在用户身份有效的前提下才会触发操作。
9、settings_more 页面目前包含两个核心菜单,均与账户安全相关:其一是“登出其它设备”,用于用户管理多设备登录状态,保障账户安全;其二是“修改账户密码”,通过页面跳转实现密码更新功能。这两个菜单已完成基础集成,旨在提升用户的账户安全管理体验。未来,该页面将逐步扩展功能,计划集成更多自定义设置选项,例如通知开关、交易设置等,以满足用户在个性化操作和账户管理方面的需求。
10、在设置更多页面中新增了 settings_link 事件,用于实现内页跳转功能。此事件的实现通过 cost 进行定义,从而有效防止内存泄漏问题。当事件被触发时,会通过 this 对象获取用户点击菜单项时所绑定的自定义属性【data-link】。随后,事件会调用全局页面跳转事件 xinle_page_open,以发起目标页面的访问请求,完成跳转操作。通过这一机制,不仅提高了页面跳转的灵活性和可维护性,同时也确保了事件在处理过程中资源的高效利用和内存安全性。
11、前端新增了一个名为“发票信息”(Invoice_info.html)的页面,用户可以通过该页面查看或修改自己的电子发票信息。此页面的唯一标识为:Invoice_info。当前系统规定每个账户只能设置一个发票抬头信息,并且该发票信息需与用户的下单户头进行关联处理,以确保数据的一致性和准确性。此外,发票类型支持“普通发票”和“专用发票”的区分,用户可根据需求选择适合的发票类型。页面设计旨在提供直观、便捷的操作体验,同时满足发票管理的多样化需求。
0
小小乐
lv.2
实名用户
2025年10月07日
1、在返回is_get_email字段时,xinle_is_profile将不再使用xinle_maskString进行脱敏处理,而是直接完整地返回对应的邮箱账户。因为邮箱账户只是用于接受通知的辅助媒介,并不具备开放登录或修改密码的权限,因此不需要进行隐私保护处理。这一改变确保了在接收通知时用户可以清楚地知道通知发送到哪个邮箱。
2、新增页面:update_pass,用于实现账户密码的修改功能。该页面的地址路径为 /settings/update_pass.html,用户可以通过 <a> 标签的链接方式直接访问此页面。为了确保账户安全性,该页面启用了登录限制机制,即如果用户未登录,则会自动重定向到登录页面,强制用户完成登录操作后才能访问该页面。此外,该页面涉及的所有相关 API 接口都要求验证用户的登录状态,确保操作仅限于经过身份验证的用户,从而有效保障账户信息的安全性和操作的合法性。
3、update_pass 页面采用标准的应用程序结构进行设计,界面内容清晰直观,方便用户操作,具体包含以下元素:首先,页面提供一个验证码输入框,用户可以在此输入从系统获取的验证码,用于验证身份;其次,页面包含一个获取验证码的选项表单,用户可通过该表单请求发送验证码至绑定的邮箱或手机号码;接着,页面设置了两个密码输入框,包括新密码输入框和确认新密码输入框,用户需在两处输入一致的新密码以完成修改;此外,页面还展示密码设置的提示信息,帮助用户了解密码的格式要求,如长度限制和字符类型等;最后,页面提供一个确认修改的表单按钮,用户点击后提交所有信息以完成密码修改操作。整个页面设计简洁实用,注重用户体验,同时确保操作的安全性和规范性。
4、页面的路由组件在访问请求时设置了 beforeEnter 守卫,负责对访问来源进行逻辑判断与验证,确保用户访问的安全性和页面功能的完整性。具体流程如下:首先,系统会通过 route['key'] 检测当前访问来源是否为 update_pass 页面,如果确认来源为 update_pass,则进一步通过 user.is_user_phone 验证用户是否已绑定手机号。如果检测到用户尚未绑定手机号,则会立即触发一个对话框,提醒用户绑定手机号后才能继续访问该页面。在对话框中,用户点击“确定”按钮后,系统会自动将用户跳转到绑定验证手机号的页面,指导用户完成手机号绑定操作。整个流程设计充分考虑了用户信息安全和页面访问的逻辑性,既保证了用户操作的规范性,又提升了应用的安全性和交互体验。
5、新增了 get_code_btn 的点击事件监听器,用于处理用户点击“获取验证码”按钮时的交互逻辑。具体流程如下:当用户点击按钮后,事件处理器会首先将按钮设置为 disabled 状态,避免用户短时间内重复点击导致请求冲突或逻辑异常。随后,系统会显示加载指示器,以提示用户当前正在进行后端交互处理。接着,通过 xinle_api_post 方法向后端发起 API 请求,调用 get_password_verification_code 接口,用于生成并发送修改账户密码的验证码到用户的绑定手机。整个流程设计确保了操作的安全性和交互的流畅性,同时通过视觉反馈让用户清楚地了解当前操作状态,有效提升了用户体验。
6、新增了通用验证码配置场景(xinle_sms_verification_code_config),增加了一个专用于修改密码的验证码来源。该验证码来源的唯一标识为 update_password,用于明确区分此场景下的验证码请求。当前阶段,模版ID暂时沿用系统默认设置,满足基础功能需求;后续将根据实际业务需求和用户场景,逐步调整为自定义的短信模版,以便提供更精准、个性化的短信内容。
7、get_password_verification_code:用于获取修改密码验证码,其执行流程设计如下:首先检查用户的登录状态,确保用户已登录后才能继续操作。接着验证验证码发送频率是否符合限制要求,避免频繁请求。随后生成一个新的验证码,并获取用户绑定的手机号和邮箱信息。系统优先使用手机号发送验证码,若用户未绑定手机号,则会尝试通过邮箱发送验证码。如果用户既未绑定手机号也未绑定邮箱,则返回错误提示,提醒用户绑定相关信息。验证码生成后会与相关信息一起保存到 Redis 中,并设置有效期为 5 分钟,以确保验证码的时效性和安全性。最后,返回验证码发送成功的提示信息,告知用户操作完成并可继续下一步流程。
8、在成功获取修改密码验证码后,系统会自动触发 update_password_start_resend_countdown 来执行验证码的倒计时处理。倒计时默认设置为60秒,并以每秒为单位自动更新显示。在倒计时进行期间,验证码的获取功能会被暂时禁用,以防止频繁请求。当倒计时结束时,系统会清除计时器,并将获取验证码的按钮恢复为可点击状态,同时将按钮文字更新为“已重新获取”,提示用户可以再次获取验证码。如果在验证码获取过程中出现失败情况,系统会及时触发相应的错误提示,以告知用户问题所在。
9、在修改密码页面中,系统设计了三个核心监听器,分别负责监测新密码输入事件、确认密码输入事件以及密码显示/隐藏切换事件,以确保用户操作的流畅性与功能的完整性。密码长度限制为6到20个字符,用户在输入时必须满足该范围要求。虽然当前未强制设置复杂密码规则,但页面会通过提示引导用户尽量设置较为复杂的密码,例如建议使用字母、数字及特殊字符的组合,以提升账户安全性。通过这些监听器的实时监控与交互设计,用户不仅可以方便地输入密码,还能随时切换密码显示状态,进一步优化用户体验,同时增强安全提示的效果。
10、新增了一个submit_btn按钮的提交监听器,该按钮在页面加载时默认处于不可点击状态,只有在用户依次正确输入流验证码、新密码和确认密码,并且这些字段均满足基本校验条件后,按钮才会被激活,允许用户点击提交。当用户点击submit_btn时,系统会对流验证码和密码的表单信息进行初步校验。如果输入的信息不存在或不符合要求,则会返回相应的错误提示,帮助用户及时修正填写内容;如果校验通过,则会触发API接口请求,将用户输入的参数提交至后端。后端会对收到的参数进行进一步的验证和处理,以确保数据的合法性与安全性。
11 、后端核验密码修改请求的时候,会依次执行以下的处理:检查操作类型是否为验证码修改密码。 检查用户是否已登录。 接收用户提交的参数(验证码、新密码、确认密码),并验证参数合法性: 验证码必须为数字; 两次输入的密码必须一致; 密码长度至少为6位。 检查验证码的有效性: 验证码是否存在; 验证码是否已过期; 验证码的 IP 是否匹配; 验证码是否正确。 修改用户密码: 调用 WordPress 的 wp_update_user 函数更新密码。 清理 Redis 缓存: 删除验证码缓存; 删除用户资料缓存。 返回密码修改成功的提示信息。
0
小小乐
lv.2
实名用户
2025年10月06日
1、新增xinle_get_email_template模版,用于生成通用的HTML邮件模板,该邮件模版采用响应式设计:能在桌面和移动设备上良好显示。 内联CSS:将CSS直接写在<style>标签中,这是邮件客户端兼容性最好的方式。 优雅的视觉风格:使用了柔和的色彩和清晰的布局。 通用页脚:包含了版权信息、网站链接以及您要求的“请勿回复”提示。 兼容性代码:<!--[if (gte mso 9)|(IE)]>部分是为了兼容旧版的Outlook客户端。
2、后端接口在执行email_update在绑定邮箱的时候,会先进行基础拦截,如果拦截通过的情况会通过xinle_redis_security检查用户获取验证码的次数是否超限,该限制频率和手机短信一致。如果符合获取条件则通过mt_rand来生成验证码,并通过xinle_email_push发送验证码邮件到指定邮箱,如果发送失败会返回对应错误。如果发送成功,则通过redis记录本次的发送信息数据。
3、后台配置页面新增一个字段:xinle_mobile_defalut_logo,网站或者APP的logo。很多地方都会用到这个logo的调用,因此后台集成一个字段进行处理,方便后期进行动态维护和更新。邮件发送模版已集成该logo的使用。
4、在邮箱绑定页面上,用户完成邮箱输入后可点击获取验证码功能,会自动触发后端邮件发送请求。若发送失败,则会返回相应错误信息;若发送成功,则会将验证码表单设置为倒计时状态,在倒计时期间,用户不可重新获取验证码。倒计时结束后用户可以重新获取验证码。为防止监听器异常,系统会在关闭窗口或退出页面时主动重置整个倒计时。
5、在邮箱绑定页面中,新增了一个名为confirm-btn的点击监听动作。当用户点击该按钮时,系统会通过jQuery选择器获取弹出层中的邮箱账户和验证码表单内容,并对这两个字段进行验证。如果其中任一字段为空或核验不通过,系统将返回相应的错误提示,以指导用户修正输入错误。若输入符合要求,则会触发名为is_binding_email_code的接口,通过xinle_api_post方法向服务器发送请求,以对邮箱和验证码进行核验处理。为了防止用户在与后端交互过程中因误操作而导致的异常情况,发起请求后,系统会调用app.preloader.show();加载指示器,以提示用户正在处理中,待响应完成后再关闭该指示器,从而提升用户体验。
6、后端在响应邮箱绑定验证码的核验请求时,会对提交的参数执行核验处理。首先从 POST 请求中获取 $email 和 $code。 检查用户是否已登录: 如果 $user_id 为空,设置 result['code'] 为 1,表示错误。 设置 result['msg'] 为 "错误:请登录后进行操作"。 设置 result['jump'] 为 'login'。 调用 xinle_exit() 函数终止执行。 检查邮箱绑定情况: 如果 xinle_is_uid_by_email($email) 为真,表示邮箱已绑定其他账户。 设置 result['code'] 为 1。 设置 result['msg'] 为 "该邮箱已绑定其它账户"。 终止执行并返回结果。 验证邮箱格式: 如果 xinle_is_email($email) 为假,表示邮箱格式不正确。 设置 result['code'] 为 1。 设置 result['msg'] 为 "错误:请输入正确的邮箱账户"。 终止执行并返回结果。 验证验证码格式: 如果 $code 不是数字,设置 result['code'] 为 1。 设置 result['msg'] 为 "验证码非法参数"。 终止执行并返回结果。
7、在绑定邮箱的过程中,完成了基础参数的核验处理后,系统会读取Redis中的缓存信息,并进一步进行安全检查处理。具体流程如下:首先,系统会检查缓存记录是否存在,若不存在,则会返回错误提示:失败:验证码已过期!其次,系统会通过xinle_is_ip方法获取当前客户端IP,并与Redis缓存中的IP进行对比,若不一致,则会返回提示:环境异常,请重新获取验证码。接着,系统会利用xinle_redis_security方法检测核验次数,若超过限制则会返回相应错误信息。然后,系统会将用户提交的邮箱账户与Redis中的邮件接收账户进行对比,若不一致则会返回错误提示:失败:验证码错误(1)!最后,系统会进行验证码核对处理,确保验证码的一致性,若不符合则返回错误提示:失败:验证码错误(2)!若上述五个安全拦截条件均符合,系统将允许进行下一步处理。
8、如果用户提交的邮箱账户及验证码与Redis缓存中的信息一致,并且通过了所有的安全核验检查,系统将会使用wp_update_user函数对邮箱账户进行更新操作。同时,系统会对这一更新过程进行错误跟踪,如果更新失败,将直接返回相应的错误信息。如果更新成功,则表示邮箱绑定已完成,系统将返回code=0,msg=邮箱绑定成功,标志着整个邮箱更新同步工作圆满结束。
9、新增回调事件:xinle_update_email_callback。当用户的邮箱修改成功后,系统将通过异步接口调用此回调。在处理过程中,将传递两个变量:user_id和email(新绑定的邮箱账户)。目前集成的处理方式是清空对应的xinle_is_profile用户缓存,因为该字段涉及到邮箱的调用处理,因此一旦邮箱发生更新,就需要同步清理缓存,以避免返回不正确的个人资料,从而导致一系列潜在的问题。
10、前端在发起邮箱绑定验证请求时,根据后端返回的结果执行不同的处理:不论成功与否,都会调用app.preloader.hide来关闭加载提示层。如果后端响应失败,将直接弹出对话框提示用户绑定失败,并说明原因。而如果操作成功,将依次进行以下步骤:(1)关闭弹出层;(2)重置倒计时;(3)触发消息提醒;(4)更新页面容器,确保页面内容和按钮得到相应处理,以防止用户重新提交。
11、前端新增xinle_callback_update_email回调动作,当用户成功绑定邮箱账户后会主动触发该动作,同时传递新邮箱账户信息。目前该回调动作包含以下处理:(1)将user.is_user_email标记为true,明确用户已完成邮箱账户的绑定;(2)将绑定的邮箱赋值给user.is_get_email,以确保页面正确显示;(3)若用户正在设置页面,将同步更新设置页面的邮箱至最新绑定的邮箱。
0
小小乐
lv.2
实名用户
2025年10月03日
1、新增方法:xinle_is_uid_by_email ,用 wpdb 实现:通过邮箱获取用户ID。$email 要查询的用户邮箱。存在则返回用户ID,不存在则返回false。该方法会 构造 SQL 查询(关键:用 $wpdb->users 调用用户表,自动适配表前缀)。核心安全操作:$wpdb->prepare() 处理参数,%s 表示字符串类型,执行查询:$wpdb->get_var() 用于获取“单个值”(这里是用户ID)。
2、后端新增方法:xinle_is_email。该方法用于验证传入的邮箱地址(string $email)格式是否合法。方法通过正则表达式进行匹配校验,能够支持常见邮箱格式,包括字母、数字,以及常用特殊字符,并兼容多级域名。具体规则为:本地部分允许字母、数字、点号、下划线、减号和加号;域名部分允许字母、数字、点和减号,同时保证顶级域名不少于2个字符。方法执行时,若传入邮箱地址符合正则规则,则返回 true,表示合法;否则返回 false。该方法可有效提升系统对邮箱输入的准确性校验,适用于账号注册、邮箱绑定等多种应用场景。
3、新增数据表:xinle_email_push,用于记录系统中所有通过项目产生的邮件发送记录。该表包含多个字段:id(主键,唯一标识每条发送记录),user_id(收信人ID,便于追踪邮件归属用户),email(收信人邮箱地址,记录邮件发送目标账户),title(邮件标题,用于标识邮件主要内容),content(邮件正文,存储邮件具体内容),attachment(附件地址,记录邮件所带附件的存储路径或链接),error(错误日志信息,用于保存发送邮件过程中出现的异常或失败原因),time(发送时间,记录邮件实际发送的时间点),status(执行状态,用于标识邮件发送是否成功及其处理进度),type(邮件发送场景,用以区分不同业务场景下的邮件类别)。所有由项目自动生成且发送的邮件,均会同步写入该日志表,确保邮件发送行为可追溯,便于后期运维、监控和问题排查。
4、后台appkey新增配置子页面,专用于邮箱相关参数的集中管理配置,便于灵活调整邮件发送的基础信息与安全策略。目前页面内集成以下配置项:xinle_appkey_mail_name(发件人名称,用于自定义邮件的显示身份)、xinle_appkey_mail_host(SMTP服务地址,指定邮件发送服务器的连接地址)、xinle_appkey_mail_port(端口地址,用于指定SMTP的服务端口,确保邮件通讯的畅通与安全)、xinle_appkey_mail_user(SMTP用户名,用于验证身份,保障邮件发送权限)、xinle_appkey_mail_password(SMTP密码,确保身份认证信息安全)、xinle_appkey_mail_token(随机生成的接口秘钥,有效防止接口被非法访问攻击,建议定期轮换以提升整体系统安全性)。通过此配置页面,可集中高效地对邮件系统参数进行维护和调整,保障系统邮件功能的正常运作与信息安全。
5、push接口新增方法:xinle_email_push,负责系统内的邮件推送功能。该函数需传入以下参数:email(收件人邮箱地址,指定邮件接收方)、title(邮件标题,明确邮件主题)、content(邮件内容,支持富文本格式)、attachment(附件路径,可选,支持发送包含附件的邮件)、asyn(是否异步处理,布尔值,默认为false)。方法执行后返回标准数组结构,code字段表示邮件发送状态,0表示发送成功,1表示发送失败,msg字段为具体的错误原因或成功提示,方便调用方了解邮件推送结果及故障详情。
6、xinle_email_push方法对传入的email参数进行了优化处理。若email参数经过is_numeric判断为纯数字,则视其为用户UID,此时会通过get_userdata方法获取对应用户的对象信息。若用户信息获取失败,则直接返回相应的错误提示,表明邮件发送失败,原因是未能获取到目标用户的信息;若用户信息获取成功,则进一步提取该用户对象中的user_email属性,将其赋值给email参数以实现UID到实际邮箱地址的转换。若在此过程中用户未绑定邮箱地址导致获取失败,则返回错误提示,指出邮件发送失败,原因为“对方未绑定邮箱”。
7、xinle_email_push具备基础拦截处理,在发送邮件前会依次执行以下处理:邮箱获取: 如果$email是数字,认为是用户ID,通过get_userdata()函数获取用户信息,然后提取user_email。 如果找不到有效的邮箱,返回错误信息:“邮件发送失败:对方未绑定邮箱”。 防止重复发送: 通过md5($email . $title)生成一个唯一的键,用于锁定发送。 使用xinle_lock函数设置一个5秒的锁。如果无法获得锁,说明操作过于频繁,返回错误信息:“邮件发送失败:超速限制!” 基本校验: 检查邮箱、标题和内容是否为空。如果任一为空,返回错误信息:“(收件邮箱/邮件标题/邮件内容)不能为空”。 再次确认邮箱是否为空,如果是,说明用户可能未绑定邮箱,返回错误信息。 邮箱格式验证: 使用xinle_is_email验证邮箱格式。 如果格式无效,返回错误信息:“邮件发送失败:邮箱无效,无法发送”。
8、在邮件发送的过程中,当完成所有拦截校验处理后,会调用xinle_insert_sql方法将该次邮件发送的详细记录插入到xinle_email_push数据表中。插入的数据字段包括:user_id,此值是通过xinle_is_uid_by_email方法解析邮箱地址获取到的用户UID;email,即本次接收邮件的用户邮箱账号;title,为邮件标题(通常会包含APP名称以便于识别);content,邮件的正文内容;time,记录邮件发送时的当前时间和日期;status,状态标记为wait,表示该邮件处于待发送队列;如果存在附件,则会额外写入attachment字段,并记录本地文件的地址路径;type,为邮件发送的具体场景类型,如果未传递该参数则会自动跳过此字段的写入。通过这些字段的详细记录,能够完整追踪每一封邮件的发送流程,便于后续的管理和问题排查。
9、xinle_email_push方法的邮件发送功能不在依赖外部SDK处理,而是直接通过内置方式进行处理。整个执行流程如下:初始化邮件服务: 检查并确保WordPress的邮件发送功能(PHPMailer)已准备就绪。如果未就绪,则手动加载并创建实例。 配置并发送邮件: 从系统设置中读取SMTP服务器信息(地址、端口、用户名、密码等)。 设置邮件的收件人、发件人、标题、HTML格式的正文,并处理可能存在的附件。 调用send()方法尝试发送邮件。 处理发送结果: 如果发送成功: 在数据库中将该邮件记录的状态更新为 ok(成功)。 返回一个表示成功的消息。 如果发送失败: 捕获错误信息。 将失败原因写入错误日志文件。 在数据库中将该邮件记录的状态更新为 fail(失败),并记录错误详情。 返回一个包含具体失败原因的消息。
10、通过xinle_email_push发送邮件成功后,会使用xinle_redis_count触发计数器:email_push,记录邮件的发送成功次数。该计数器支持年月日按区域进行统计。如果发送失败,则会触发日志写入:通过xinle_log_error_warn执行错误的写入,日志格式如下:[发送时间:' . date("Y-m-d H:i:s") . '] - [失败原因:' . $error_msg . '] - [收信邮箱:' . $email . '] - [邮件标题:' . $title . ‘]。
11、xinle_email_push完成封装处理,整个执行的流程如下:发送前检查与准备参数处理:将ID转为邮箱地址。防刷机制:使用锁机制限制重复请求。参数验证:检查邮箱、标题、内容是否为空。邮箱格式验证:确保邮箱格式合法。数据库记录:创建邮件发送记录。核心邮件发送初始化:加载PHPMailer库。配置SMTP:设置SMTP服务器及相关配置。邮件设置:配置发件人、收件人、邮件格式、标题及正文。发送邮件:执行邮件发送。发送后结果处理成功处理:更新数据库记录状态为“发送成功”,并更新Redis计数。失败处理:记录错误日志,更新数据库记录状态为“发送失败”,并记录错误信息。
0
小小乐
lv.2
实名用户
2025年10月02日
1、前端在发起 update_nickname 处理事件时,如果后端响应 code=1,则表示昵称修改失败,此时系统会触发 app.dialog.alert 弹出错误对话框,告知用户错误原因。若修改成功,则系统会提示“昵称修改成功”,并主动关闭相应的输入框。不论操作成功还是失败,系统都会通过 finally 监听器执行 app.preloader.hide() 来关闭加载提示框。
2、前端新增了一个回调事件:xinle_callback_nickname。当用户通过 update_nickname 成功修改昵称后,会自动触发该回调事件。这个事件是为预留的处理机制设计的,未来需要任何页面交互的处理都将通过这个预留事件来实现。目前,该事件会自动将 user.nickname 更新为最新修改的昵称。因此,当用户访问其他页面时,涉及昵称的读取操作将展示最新更新的姓名。需要注意的是,该回调事件会传递一个固定的变量值:nickname。
3、对 profile_settings 页面进行了监听器和全局变量的重构处理,确保该页面支持 page、page_content 变量的内部处理。在原有页面的基础上,新增了多个生命周期行为监听器:pageInit(初始化阶段),pageBeforeIn(页面即将进入),pageAfterIn(页面进入后),pageBeforeOut(页面即将离开),pageAfterOut(页面离开后),pageBeforeRemove(页面即将被销毁)。这些改动是为了确保资料设置页面符合应用程序的结构设计标准,从而能够执行相应的前后端响应动作。
4、修复并解决在用户通过前端修改昵称后,重新访问页面时出现的错误问题:Uncaught TypeError: Cannot access offset of type string on string。这一错误导致整个应用程序崩溃。通过对栈的追踪发现问题源自于xinle_is_profile在处理 real 异常时出现的问题。错误发生在调用 meta 读取 real 实名信息的过程中,因为数组识别和解析处理不当。因此,需要加强对数组的识别和解析,避免异常错误导致系统崩溃。
5、前端通过update_nickname发起昵称修改请求。如果后端响应修改成功,系统不仅会通过xinle_callback_nickname触发相关的业务回调处理,还将使用page_content选择器,将设置页面中的昵称更新为新设置的昵称。此外,系统会触发xinle_msg消息提醒,告知用户昵称已成功修改。另外,修复了app.dialog.prompt输入框在点击取消时未能关闭对应弹出层的问题。具体实现为,通过callbackCancel回调执行关闭动作事件的监听处理。
6、update_nickname的整个处理流程完成封装处理:权限检查:如果xinle.nickname_limit为false且xinle.is_admin_x不是true,则直接返回false,不允许修改昵称。昵称验证函数:创建自定义的输入验证函数validateNickname,用于验证用户输入的昵称是否符合要求:昵称不能为空。昵称长度不能超过xinle.nickname_length。打开输入框:使用app.dialog.prompt打开输入框,让用户输入新的昵称。输入框会显示提示信息包括允许的最大字数。用户输入处理(确定按钮):用户点击“确定”按钮后,使用validateNickname验证输入的昵称。如果验证失败,弹出错误提示,不进行后续操作。如果验证通过,显示加载动画,开始请求处理。发送请求:调用xinle_api_post发送请求,更新用户昵称。请求包含必要的参数,如nickname和用户id。响应处理:如果请求成功(res.code为0),更新页面中的昵称显示。调用xinle_callback_nickname并传递新的昵称,同时显示“修改成功”消息。如果请求失败,弹出错误提示,显示失败原因。隐藏加载动画:无论请求成功或失败,最后都会隐藏加载动画。用户取消处理:如果用户选择取消,不进行操作,输入框自动关闭。
7、APP页面组件(xinle_page_config)现已新增“email_update”页面配置,该页面为邮箱修改或绑定页面,对应的componentUrl地址为/settings/email_update.html。前端支持通过“email_update”路径访问该页面,方便用户进行邮箱的修改或绑定操作。为保障账户安全,访问该页面时系统将强制校验用户登录状态,若检测到用户未登录,则会自动进行拦截并跳转至登录页面,确保只有已登录用户才能进入邮箱修改/绑定页面。
8、binding_email页面已完成页面结构的搭建,整体采用标准APP的结构进行设计。当用户已绑定邮箱时,页面将提示:“您的账户已绑定邮箱({user.is_get_email}),可正常使用。如需更换绑定,请点击下方按钮操作。”如果用户尚未绑定邮箱,则会显示:“绑定邮箱后,您即可使用${xinle.app_title}的邮件通知功能。”无论是首次绑定邮箱还是更换绑定邮箱,均通过showEmailInputPopup方法唤起弹出层,便于用户输入新的邮箱信息并完成操作。值得说明的是,邮箱绑定流程无需单独的解绑环节,若需更换绑定邮箱,仅需通过验证码验证新邮箱即可,无需复杂的操作步骤,整体流程简洁高效。
9、新增showEmailInputPopup弹出层事件:该弹出层居中显示,界面设计简洁美观。标题为“设置邮箱”,副标题提示“验证码将发送至您填写的邮箱,请及时查收”,有效引导用户操作。输入区域包含带邮箱图标的输入框,输入框内显示提示语“请输入邮箱地址”,便于用户明确填写内容。下方为验证码输入区域,要求用户输入6位验证码,右侧配有“重新获取验证码”按钮,便于在未收到验证码时及时重新获取,保障用户体验。弹出层底部设有“确认绑定”按钮,用于提交绑定请求。为防止误操作,弹出层禁止通过点击遮罩层关闭,提升操作的安全性与流程的严谨程度。页面右上角显眼位置设置有“X”图标,用户可通过点击该图标自主关闭弹出层,整体交互设计既便捷又高效。
10、showEmailInputPopup 弹出层增加以下点击监听逻辑:1、popup-close 关闭弹窗逻辑,通过点击右上角的 X 图标触发。弹窗关闭时,会主动调用 clearInterval 方法清除内部定时器,避免因定时器未清理导致用户下次打开弹窗时出现异常或数据污染。2、send-code-btn 获取验证码操作,用户点击后会首先校验邮箱输入框内容,验证是否已填写邮箱地址及其格式是否符合规范,只有在邮箱格式正确的情况下才会发起验证码请求,并可启动倒计时功能,防止频繁获取验证码。3、confirm-btn 确认绑定操作,在用户点击“确认绑定”按钮时,会对输入的邮箱地址及验证码进行非空校验,确保邮箱已填写且格式正确,同时验证码已填写且为有效格式。在所有校验通过后,才会发起邮箱绑定请求,提升操作的可靠性和严谨性。
11、当用户进行邮箱账户的绑定或更换操作时,监听器会监控点击获取验证码的行为。一旦用户点击获取验证码按钮,系统将首先获取当前输入的邮箱地址,并对该邮箱地址进行格式与有效性校验。只有在邮箱地址输入正确且符合规范的情况下,才会调用 xinle_api_post 方法发起 API 请求,将邮箱地址提交至后端进行下一步处理。为了提升操作的交互体验并防止用户在等待响应期间发生误操作,系统会在请求发起前自动执行 app.preloader.show,展示加载中的提示,并临时禁用用户其他交互操作。待后端 API 响应结果返回后,系统会主动关闭加载提示,恢复正常交互,确保操作流程的顺畅与安全。
0
小小乐
lv.2
实名用户
2025年10月01日
1、后台用户基础配置中新增了一个字段:xinle_user_basic_nickname_permissions,该字段用于控制是否允许用户修改昵称,类型为开关选项。虽然超级管理员和前台管理员不受此限制,但普通用户的昵称修改权限将依据此配置进行控制。需要注意的是,允许用户修改昵称可能涉及多方面因素,因此,一般不建议开启此权限,默认设置为关闭状态。
2、考虑到用户修改昵称时需要统一长度限制,因此引入了一个新字段:xinle_user_basic_nickname_length,用于设定昵称长度的限制。一个中文字符或者一个英文字符均计算为一个字。默认情况下,昵称最大长度设定为10个字。如果业务需求需要更长或更短的限制,可以通过此字段进行调整,且会自动在全局生效。为提供灵活性,该设置可以通过开关进行调整,以便于根据后续业务需求灵活变化。基本的拦截类型(例如非法字符限制)将自动支持该设定。
3、前端xinle对象,新增一个属性:nickname_length(昵称的最大长度限制),读取后台的配置xinle_user_basic_nickname_length。当前端用户尝试修改昵称的时候,会通过这个字段去负责长度的检查和提醒处理。xinle对象是首页初始化过程中,通过内部事件进行加载。该对象是冻结状态,不可二次修改。防止出现安全的问题。
4、后台禁止用户修改昵称,但前端页面必须输入用户昵称后才能知道被禁用,这对用户体验极为不佳。因此,xinle对象新增了一个nickname_limit属性,该属性读取后台字段:xinle_user_basic_nickname_permissions,其类型为布尔值。如果为true,则允许修改;如果为false,则不允许修改。在不允许修改的情况下,系统将在设置页面进行相应的拦截处理。
5、在 profile_settings 资料设置页面,新增了一些调整措施。首先,增加了一个 update_nickname 点击监听器,该监听器会通过 xinle.nickname_limit 检查普通用户修改昵称功能是否被启用。如果未启用,且当前用户不是管理员,则该点击操作将被忽略。此外,输入昵称的字数限制和拦截检测将通过 xinle.nickname_length 动态处理,后台设置的参数将被读取并应用。
6、后端API接口在接收到【update_nickname】响应请求动作的时候,会执行以下拦截检测。1、如果用户未登录则直接返回错误:错误:请登录后进行操作。2、如果昵称为空则返回错误:新昵称不能为空。3、通过正则匹配检查新昵称内容,检查非法字符,只允许中文、英文、数字。如果存在非法字符则返回:昵称只能包含中文、英文、数字。4、通过mb_strlen获取昵称的长度,如果长度小于2或者大于后台限制,则返回错误:昵称长度必须在2到' . $max_length . '个字符之间。5、检测是否开启普通用户昵称修改功能,如果未开启,并且用户不是管理员则返回错误:管理员才能修改昵称。上述条件都符合则基础拦截完成效验。
7、新增方法:xinle_is_nickname_exists,检查指定昵称是否已存在。$nickname 要检查的昵称、 存在返回true,否则返回false。执行流程如下:参数验证: 检查传入的昵称是否为空。 如果昵称为空,则返回 false,表示没有重名。 构建查询参数: 设置查询时所需的参数,用于查找用户自定义字段中匹配的昵称。 meta_key 为 'nickname',指定要查询的用户自定义字段。 meta_value 为传入的 $nickname,这是需要匹配的值。 meta_compare 设为 '=',表示精确匹配。 number 设为 1,只需找到一个匹配结果即可。 count_total 设为 false,以不计算总数来提高查询效率。 查询用户: 使用 get_users() 函数按照前面指定的参数查询用户。 返回结果: 检查查询结果是否为空。 如果查询返回结果不为空,则说明昵称已存在,返回 true。 否则返回 false,表示不存在重名。
8、在用户修改个人昵称时,增加了两个拦截处理机制。首先,通过 get_user_meta 获取当前用户的昵称,并与用户想要修改的新昵称进行比较。如果两者一致,则返回错误信息:“之前的昵称与现在保持一致”。其次,利用 xinle_is_nickname_exists 函数检查新昵称是否已被其他用户占用。如果该昵称已被占用,则返回错误信息:“该昵称已被占用”。此机制有效防止昵称的重复和无效更改,提升用户体验。
9、在通过 update_nickname 接口发起昵称修改请求时,完成基础参数校验后,将使用 update_user_meta 方法来更新用户昵称。成功更新后,将返回 code=0 和 msg=昵称修改成功。至此,整个用户的昵称修改流程基本完成。后续处理将交由前端来进行交互操作。大致流程如下:获取昵称: 从 $_POST 中获取用户提交的新昵称。 用户身份验证: 检查用户是否已登录,如果没有登录,返回错误信息并引导至登录页面。 昵称验证: 检查昵称是否为空,如果为空,返回错误信息。 使用正则表达式检查昵称是否只包含中文、英文或数字,如果包含非法字符,返回错误信息。 检查昵称的长度是否在规定范围内(2到最大长度),如果不符合,返回错误信息。 修改权限检查: 检查用户是否有权限修改昵称,非管理员用户需要特定权限,否则返回错误信息。 昵称一致性检查: 获取用户原来的昵称,如果新昵称与原昵称相同,则返回错误信息,表示无需修改。 昵称唯一性检查: 调用 xinle_is_nickname_exists 函数检查昵称是否已存在,如果已存在,返回错误信息。 更新昵称: 使用 update_user_meta 函数更新用户的昵称信息。 返回成功信息。
10、新增一个后端回调处理方法:xinle_nickname_callback。当用户的昵称修改成功后,该方法将在异步 swoole 脚本的触发下被调用,用于处理内部事件记录或通知第三方业务系统。由于该方法以异步方式执行,因此需要主动传递 user_id 参数以进行身份识别。对于新昵称的获取,将通过调用 get_user_meta 来读取相应的昵称,从而完成相关处理。
11、xinle_update_user_meta_hook 监听器中新增了几个处理部分。当用户通过 update_user_meta 更新指定的用户字段时,该监听器会主动触发并在内部执行相应的异步回调处理。目前新增的两项监听分别为:1. 当更新用户昵称时,触发 xinle_nickname_callback 回调动作,该处理为异步执行行为。2. 当更新用户实名认证信息时,触发 xinle_real_callback 回调动作。
0
小小乐
lv.2
实名用户
2025年9月30日
1、在real_update_initialization的后端初始化过程中,如果用户已经完成实名验证:将会构建一个HTML模块,包含以下内容:标题为“您的账号信息已三要素实名认证”;手机号码将不进行脱敏处理;姓名直接显示为XXX;身份证号码通过xinle_mask_IdCard方法进行脱敏显示。尾部信息说明:上述信息仅用于身份验证以及审查您的使用权限,平台将确保您的信息安全。目前,平台暂不支持更换实名制,如有疑问请联系客服处理。
2、xinle_mask_IdCard方法进行重构处理,之前的处理逻辑无法正确识别末尾X字母,正则匹配规则存在异常问题。新版本进行优化移除正则匹配机制,改为阶段处理,具体流程如下:去除空格:使用 trim() 方法去除身份证号字符串两端可能存在的空格。 检查长度:判断身份证号是否为18位。 字符串截取: 使用 substr() 截取身份证号的前4位。 使用 substr() 截取身份证号的后4位。 组合结果: 将前4位与10个星号和后4位组合,形成最终的遮盖字符串。 返回结果: 如果身份证号是18位,返回遮盖后的字符串。 如果身份证号不是18位,直接返回原始字符串。
3、当进入账户实名页面时,会通过pageBeforeIn触发初始化操作。如果用户已完成实名验证,则系统将直接返回对应的实名信息,并在页面展示账户的实名信息。若用户尚未实名,则会返回相应的表单结构参数,允许用户填写身份信息,并通过绑定手机号发起实名请求。系统支持跳转到手机号绑定,并在实名操作前,会提示用户核对相关表单信息,以确保三要素信息的一致性。
4、考虑到实名认证页面初始化时加载默认的实名认证表单结构,当用户已实名的情况下,页面会先加载此表单。待后端响应出结果后,页面再切换到实名信息的展示,这种操作导致用户在访问时必然会体验到页面的视觉切换,显得略突兀。因此,进行优化处理:进入页面时,应隐藏实名表单的展示模块,若用户已实名,则直接加载对应的实名信息模块进行展示;若未实名,则显示实名表单。此外,在初始化过程中,页面会展示加载状态条。后端响应完成后,无论用户是否已实名化,该加载进度条都会被移除,从而提升整体用户体验。
5、xinle_is_profile 现在会额外返回一个字段:is_real_name,用于显示实名用户的姓名信息。如果账户已实名,则该字段显示用户的真实姓名,例如:张文军,这一信息来源于 real 数组中的 name 字段。如果用户未实名,则该字段为空白。此字段将用于资料设置页面中,展示用户的实名信息。此外,当用户通过实名认证时,该字段会实时更新为用户的实名姓名。这样,用户无须刷新页面即可看到信息的更新,有助于提升用户体验。
6、资料设置页面新增了一个 "li" 资料展示栏:(个人实名)。该栏会读取字段:user.is_real_name,如果用户已完成实名认证,则显示用户的实名姓名;如果未实名,则显示(未实名/空白)。无论是否完成实名认证,用户点击此菜单都会跳转至(real_update)实名认证页面。在这个页面上,用户可以进行实名认证或查看自己的账户实名信息。通过这种方式,用户能够更方便地管理和查看自己的身份信息。
7、用户完成实名认证后,前端将主动触发(xinle_callback_real)回调钩子。借助这个钩子,系统会更新两个对象:首先,将 user.real 标记为 true,指出用户已完成实名验证;其次,设置 user.is_real_name 为用户的真实姓名。在用户未完成实名的情况下,返回的将是空值或“未实名”。由于用户可能是从设置页面进入,因此需要实时回调 xinle_settings_real_name.value 菜单名称,将其动态更新为用户的身份证姓名。这确保了用户信息展示的准确性和及时性。
8、在用户资料设置页面中新增了昵称点击监听器:update_nickname,并通过@click="${update_nickname}"进行关联监听。用户点击其昵称时,会触发app.dialog.prompt,弹出一个原生输入对话框。对话框的标题为“修改昵称”,副标题为“请输入您的新昵称(最多10个字)”。默认情况下,输入框会显示用户当前的昵称信息(user.nickname)。弹窗提供两个选项:1、确认,将继续执行后续的后端业务逻辑;2、取消,关闭输入对话框并终止本次操作。
9、在资料设置页面中,当用户点击修改昵称时,将触发一个自定义函数:validateNickname。该函数用于验证输入框中的昵称信息。首先,通过value.trim()去除空格后,如果返回的字符是空的,将提示错误信息:昵称不能为空。接着,检查输入内容的长度,如果字符数超过10,则会返回错误:昵称不能超过10个字符。若输入符合条件,则进入下一步处理。如果以上错误发生,将通过xinle_msg弹出错误提示,要求用户重新输入,并阻止关闭输入框。
10、在用户通过update_nickname提交昵称修改请求后,系统会首先执行基础的参数验证。验证完成后,系统将触发API接口进行服务器端交互请求,以执行相应的业务逻辑。在请求开始前,会调用app.preloader.show方法来显示加载层,待响应结束后再进行关闭。在执行过程中,用户输入的昵称将被获取并异步发送到后端进行处理。
11、在后台用户设置中心(xinle_user)新增一个子页面:用户基础设置。常见的功能配置和个人操作权限将在此通用基础页面进行管理。该页面的图标标识为fa-chrome。功能配置尽量细化,例如下单权限、交易权限及昵称修改等设置,均可根据实际需求场景决定功能启用或关闭。
0
小小乐
lv.2
实名用户
2025年9月29日
1、用户在完成实名成功后会触发一个名为 xinle_real_callback 的回调,该回调用于处理一些异步操作,目前是一个预留事件。无论是现在的手机号三要素实名,还是将来的面部识别实名认证,这个回调钩子都会被触发。在回调触发时,会传递 user_id,内部通过读取用户自定义字段 real 来获取用户的实名信息,以进行相应的业务处理。该回调通过 xinle_swoole_asyn 异步执行,不会阻塞当前进程,因而不会影响系统的响应性能。
2、xinle_is_api_phone_real的整个执行流程如下:用户登录验证 检查 $user_id 是否为空:如果用户未登录,返回错误代码 1,提示用户需要登录 (错误:请登录后进行操作)。 获取用户绑定手机号 从用户元数据获取手机号:使用 get_user_meta($user_id, 'phone', true) 函数。 验证手机号是否存在:如果不存在,返回错误代码 1,提示绑定手机号 (错误:请先绑定手机号再进行核验)。 实名验证检查 检查用户是否已实名:通过 get_user_meta($user_id, 'real', true)。 已实名则返回:若已经实名,返回错误代码 1,提示已经完成实名验证 (错误:该账户已完成实名验证)。 姓名格式验证 使用正则表达式检查姓名格式:preg_match('/^[\x{4e00}-\x{9fa5}]{1,7}$/u', $name) 确保是 1 到 7 个中文字符。 格式不符则返回:返回错误代码 1,提示姓名格式错误 (错误:姓名必须为中文且长度不超过7个字符)。 身份证号格式验证 使用正则表达式检查身份证号格式:preg_match('/^\d{17}[\dXx]$/', $code) 确保是合规的 18 位身份证号。 格式不符则返回:返回错误代码 1,提示身份证号格式错误 (错误:请提供有效的18位身份证号码)。 Redis缓存检查 生成缓存键:$redis_key = __FUNCTION__ . ':' . $phone . $name . $code。 获取缓存:get_redis_meta($redis_key) 检查缓存中是否已有验证结果。 每日行为限制检查 检查每日限制:调用 xinle_is_user_daily($user_id, 'phone_real')。 超出限制则返回:如果每日请求超出限制,则直接返回对应结果。 获取API密钥 获取 SecretID 和 SecretKey:通过 xinle_get_option('xinle_appkey_tx_real_SecretID') 和 xinle_get_option('xinle_appkey_tx_real_SecretKey') 获取。 密钥缺失则返回:若任一缺失,返回错误代码 1,提示密钥配置不完整 (错误:API密钥配置不完整)。 API请求准备 生成请求签名:通过 hash_hmac 生成签名。 准备请求头和参数:设置请求方法、URL和头部信息。 使用 curl_init() 初始化 CURL 请求。 执行API请求 配置 CURL 选项:设置请求 URL、返回类型、超时时间、请求方法、参数及 HTTP 头。 执行请求并处理响应:通过 curl_exec() 执行请求,并获取 HTTP 状态码与响应数据。 处理API响应 解析JSON响应:使用 json_decode()。 根据返回的数据处理结果:通过结果码进行不同处理: 信息一致:进行数据存储和更新,调用回调函数。 信息不一致:返回错误信息。 无记录:返回无匹配信息的错误。 异常处理 捕捉并处理异常:使用 try-catch 结构捕捉执行过程中的异常,返回错误信息。 返回结果 返回给调用者:最终返回 $result。
3、新增方法:xinle_is_real,用于验证用户是否已经完成了实名认证。如果用户已经完成实名认证,该方法将返回一个包含认证信息的数组,其中包括以下字段: time:实名核验通过的时间。 name:用户的真实姓名。 code:身份证号码。 sex:性别(男、女)。 address:地址(包括省、市、区)。 birthday:出生日期。 phone:实行实名核验的手机号。 fingerprint:指纹信息。 如果用户未完成实名认证,则该方法将直接返回 false。特别需要注意的是,在显示身份证号码时,建议对其进行脱敏处理,以保护用户隐私。
4、在 xinle_is_profile 方法中增加一个新字段【is_real:账户是否已完成实名认证。若已完成,则返回 true;否则,返回 false】。在方法内部,借助三元运算符来检查字段 real,根据其结果返回相应的布尔值。前端可以通过 xinle.is_real 直接验证用户是否已实名认证,且返回的结果为布尔值。
5、在新增 is_real 字段之后,必须调整 xinle_is_profile 的缓存刷新机制,以确保当用户完成实名认证后,可以及时清除缓存查询结果,返回准确可靠的用户资料信息。具体处理方案如下:通过 xinle_update_user_meta_hook 来监听用户自定义元字段的动态变化。当 real 字段发生变动时,立即调用 delete_redis_meta 清理 user_profile 缓存。这一机制确保用户的最新认证状态能够及时反映在系统中,提供最新的用户信息给前端。
6、前端在发起实名验证请求时,为了在等待响应期间避免用户退出或执行其他操作,会通过 app.preloader.show() 显示加载指示器,提醒用户操作正在进行中。在指示器显示期间,用户无法进行其他操作。当后端返回响应后,无论结果如何,都会关闭指示器。如果验证失败,将弹出 app.dialog.alert 错误对话框,让用户了解具体原因;如果验证成功,则会触发 xinle_msg 文字提示,告知用户实名成功。为防止重复操作,认证按钮将被设为不可点击,文字更改为“账户实名成功”,按钮背景色修改为 #f22db7。此外,两个输入框(身份证号码、姓名)也会设为不可点击。不论成功或失败,都会通过 closeSheet 关闭弹出层。
7、前端新增了一个通用回调方法:xinle_callback_real(real)。该方法会接收实名认证对象信息 real(由后端返回),包括以下字段:time、name、code、sex、address、birthday、phone。这个回调是为全局事件处理预留的。目前的实现方式是将 user.real 对象标记为 true,以便在不刷新页面的情况下,用户完成实名认证后,检测机制能够判断其已完成实名。
8、xinle_callback_real 方法进行了重要更新:当用户完成实名认证后,将用户的昵称更改为“实名主体姓名+UID”。例如,张文军32。加入UID是为了应对常见的重名情况,保证昵称的唯一性。后续可以考虑开放用户昵称的重置功能,具体需评估昵称在平台中的使用方式。如果昵称不涉及社交的唯一性,则可以允许重名。
9、手机三要素实名流程完成封装,整个前端页面的执行流程如下:页面初始化: 执行 pageInit 和 pageBeforeIn 事件,在页面加载时获取并设置用户数据,例如手机号。 用户输入信息: 用户在表单中输入姓名和身份证号码。 系统显示提示信息,要求信息真实且与运营商登记信息一致。 输入验证: 验证姓名必须为1到7个中文字符。 验证身份证号为标准的18位(前17位为数字,最后一位为数字或'X')。 显示验证信息: 填充弹出层,将用户的输入信息展示给用户进行核对。 确认弹出层: 用户核对信息后,确认执行实名认证。 提交认证请求: 用户确认后,通过API将数据提交到服务器进行身份验证。 在验证成功后,界面更新为"账户实名成功",并使输入框和提交按钮不可编辑。 认证结果处理: 成功:更新页面提示信息为成功状态,并调用相关回调操作。 失败:显示错误信息,提示用户重新尝试或联系支持。 异常处理: 系统提供错误提示,如发生请求异常或者网络问题,提醒用户稍后重试。 页面清理: 执行 pageBeforeRemove 事件清理页面相关变量以便释放资源。
10、实名认证页面(real_update_initialization)在初始化请求时,会通过get_user_meta来检查用户是否已完成实名认证。如果用户已完成实名认证,则构建并返回对应的HTML结构;如果未实名认证,则按照原计划构建相应的认证申请表单。这样,无论用户是否已实名认证,访问认证页面时都能看到对应的内容:已实名用户会看到相关信息,而未实名用户则会看到实名认证的相关表单。
11、新增方法 xinle_mask_IdCard:这个方法用于对身份证号码进行脱敏处理。首先,会检查传入的身份证号码是否为18位数字。如果是,将中间的10位数字替换为星号,以此保护用户的隐私。如果身份证号码不是18位,则直接返回原始号码。根据具体需求,该方法可以进行调整,或者在必要时抛出异常。
加载更多评论
单栏布局
侧栏位置:
左
你好
天呐
1、xinle_push_app_hook集成了日志记录和计数器功能,用于全面监控消息推送的成功与失败。当用户成功推送消息后,系统会通过xinle_redis_count记录成功次数(计数器标识为app_push),该计数器支持按年、月、日等指定时间范围查询,从而统计APP消息的发送总量,便于后续分析与追踪。如果消息推送失败,系统会通过xinle_log_error_warn记录错误日志,详细描述推送失败的相关信息。日志的格式如下:[错误时间: " . date("Y-m-d H:i:s") . "] - [收信用户: {$userId}] - [推送编号: {$result_id}] - [错误信息: {$errorMsg}]。这种设计既能帮助开发者快速定位问题,又能实现推送数据的高效统计和管理,为后续优化提供了可靠的支持。
2、xinle_push_app_hook 函数执行流程 整体遵循 “先检查→再执行→后收尾” 逻辑,核心是确保推送有效且可追溯,异常情况全拦截。 参数检查:先看必填参数(用户 ID、通知类型 / 标题 / 内容)是否齐、格式对,不对直接返回错误。 用户推送码验证:获取用户的 APP 推送码,没有或无效就终止,返回 “未绑定推送码” 错误。 存数据库待推记录:把推送信息(用户 ID、内容、状态 “待推送” 等)写入数据库,存失败就报错。 调 API 推送:拿配置好的 API 地址、APP 密钥等,发推送请求;请求失败或返回错误,就更新数据库为 “推送失败”,记日志,返回错误。 推送成功处理:更新数据库为 “推送成功”,累加推送统计,返回成功结果。 异常兜底:遇到没预料到的错,记详细日志,返回 “系统异常” 的友好提示。
3、当前项目已集成以下三类消息推送功能,分别为公众号模板消息推送函数(xinle_gzh_push($gzh))、手机短信发送模板推送函数(xinle_sms_push($sms))以及APP消息推送发送函数(xinle_app_push($app))。这三个消息推送功能均支持异步处理,以提升推送效率,并结合redis缓存技术优化数据存储与访问性能。此外,系统还集成了日志追踪功能,用于记录推送过程中的详细信息,方便后续问题排查。同时,每次推送操作会记录至相关数据表中,确保推送数据的完整性与可追溯性。这些推送功能既支持系统自动执行,也支持手动触发执行,为项目的消息推送功能提供了高度的灵活性和可靠性,有效提升了用户消息通知的体验和运维效率。
4、xinle_email_push方法已进行重构设计,优化了参数传递方式,由原来的变量传参调整为数组结构传参,以提高扩展性和可读性。当前支持的数组字段包括以下内容:email(邮箱账户,与用户UID为二选一必填项)、user_id(用户UID,与邮箱账户二选一必填项)、title(邮件标题,必填项)、content(邮件内容,必填项)、type(邮件类型,默认为default)、以及attachment(附件路径,默认为空)。通过这种设计,方法可以更加灵活地处理邮件发送请求,同时支持多种业务场景。执行结果以数组形式返回,其中包含code(状态码)和msg(提示信息),用于标识邮件发送的成功与否及相关反馈内容。这种设计不仅提高了方法的可维护性,还增强了邮件发送功能的适配性和稳定性。
5、重构后xinle_email_push整个执行流程如下:参数处理阶段从输入数组$email_push中提取所有必要参数(邮箱、用户 ID、标题等),并进行类型校验和过滤(如字符串去空),同时设置默认值(如type默认为default,asyn默认为false)。 基础验证阶段 校验收件人信息:邮箱和用户 ID 不能同时为空(至少需要一个定位收件人)。 校验核心内容:标题和内容不能为空(二者为邮件必需项)。 收件人信息转换阶段 若仅提供用户 ID,则通过xinle_is_user_email()获取其绑定的邮箱;若用户未绑定邮箱,直接返回错误。 若仅提供邮箱,则通过xinle_is_uid_by_email()获取对应的用户 ID(用于数据库记录)。 格式与频率校验阶段 校验邮箱格式是否有效(通过xinle_is_email())。 限制发送频率:通过xinle_lock()实现 “5 秒内不允许向同一邮箱发送相同标题的邮件”,防止重复发送。 数据库记录阶段准备邮件数据(包含收件人信息、标题、内容、时间等),若有有效附件则一并记录,然后写入数据库并获取记录 ID。若写入失败,返回错误。 发送方式处理阶段 若为异步发送(asyn=true):直接返回 “加入队列” 的成功结果,不执行实际发送。 若为同步发送(asyn=false):初始化 PHPMailer,配置 SMTP 服务器参数,准备邮件内容(通过模板生成 HTML),执行发送操作。 发送结果处理阶段 发送成功:更新数据库记录状态为 “success”,记录统计信息,返回成功结果。 发送失败:记录错误日志,更新数据库状态为 “fail” 并保存错误信息,返回失败结果。
6、新增方法:xinle_notify_hook_service,这是一个统一的消息发送接口,用于服务号消息通知的钩子服务函数。该方法需要传递以下三个变量: $user_id:用户ID,标识具体的接收用户。 $type:通知类型,用于区分不同的消息类型。 $template:通知模板数组,包含消息内容的具体模板。 当 $template 为空时,函数会直接返回错误,提示“服务号消息发送失败:传递template空数组”。
7、新增方法:xinle_is_push_service,该方法用于检查是否允许发送服务号消息,主要依据用户的状态、推送配置和全局设置来判断。方法需要传递两个参数: $user_id:用户ID,用于识别具体用户。 $type:推送类型,用于判断该类型的消息是否允许发送。 函数将返回一个包含结果代码和消息的数组,具体逻辑如下: 如果允许发送站内信,结果代码为 0,消息为“允许发送APP通知”,同时返回的数组中还会包含服务ID和标题(前提是该类型的服务已配置)。 如果不允许发送站内信,结果代码为 1,消息将详细说明失败原因。 如果推送配置不存在、推送功能已被全局禁用,或者APP已被禁用,函数会返回一个包含错误代码和消息的数组,提示具体的错误原因。
8、后台新增功能模块:服务号消息模板(xinle_public_account)。该模块旨在实现公众号消息助理的管理功能,允许根据业务需求添加对应的消息服务号。不同的服务号可以独立负责不同类型的消息推送,以满足多样化的消息通知需求,同时支持灵活扩展。功能设计如下:模块名称:服务号消息模板(xinle_public_account)。主要功能:服务号管理:支持添加、编辑、删除服务号,定义每个服务号的职责范围。消息模板配置:每个服务号可以绑定不同的消息模板,用于定义推送的内容样式,例如标题、正文、消息链接等。消息类型分组:通过服务号对消息类型进行分组管理,使推送逻辑更加清晰。灵活扩展:支持动态添加新的服务号和消息模板,满足业务扩展需求。应用场景:交易助手:专门负责处理与交易相关的订单信息推送,例如订单状态更新、支付成功通知、退款进度等。余额助手:用于处理账户余额变动的通知,如充值成功提醒、提现到账提示、余额不足警告等。系统助理:管理与账户安全或系统相关的消息推送,例如密码修改通知、登录异常提醒、系统维护通知等。功能实现:后台提供一个界面用于创建和管理服务号。管理员可以为每个服务号设置名称、描述、绑定的消息类型以及对应的消息模板。服务号与消息模板之间可以一对一或一对多绑定,确保不同服务号能够灵活处理不同的消息内容。系统支持动态扩展,管理员可以根据业务需求随时新增服务号和对应的消息模板。
9、xinle_public_account 配置字段说明:该配置字段主要用于定义服务号的基本信息和功能属性,确保服务号的行为符合预期,同时为前后端联动提供必要的约束条件和接口支持。具体字段及说明如下: name:服务号的名称及使用场景介绍。该字段用于简要说明服务号的功能定位,例如“交易助手:用于处理交易订单相关通知”或“余额助手:负责账户余额变动提醒”。管理员在设置时需确保描述清晰,方便后续管理与用户识别。 key:服务号的唯一标识符。该字段在服务号创建时需设定,并且一旦确定后绝不可修改。key 是服务号的核心标识,前后端通过该字段进行数据关联和逻辑处理,因此必须确保唯一性和不可变性。任何修改都需经过前后端的协同调整,避免引发数据异常。 user_id:服务号绑定的虚拟用户 ID。系统会为每个服务号自动生成一个虚拟用户 ID,用于模拟消息的发送者身份。该字段一旦设定后同样不可更改,修改会导致历史消息记录及关联逻辑出现问题。前后端需共同保证该字段的唯一性和稳定性。 服务号介绍:用户在打开服务号时可见的内容,用于展示服务号的基本信息和功能说明。例如,“本服务号负责通知您的订单状态更新、余额变动等信息,请关注相关提醒”。该字段内容需清晰明了,方便用户快速理解服务号的用途。 pop(站内弹窗通知):用于控制站内弹窗消息的开关状态。开启时,服务号可向用户推送站内弹窗通知;关闭后,即使用户在线,系统也不会再发送弹窗消息。该字段的设计旨在平衡用户体验与消息推送的干扰程度,适用于不需要频繁提醒的服务号。 msg(私信功能):用于控制用户是否可以通过服务号发送私信。开启时,用户可通过服务号与后台进行私信交互;关闭后,用户无法发送消息,仅能接收服务号的通知。该字段适用于消息单向通知的场景,例如系统公告、账户变动提醒等。 api(消息转发接口):用于配置服务号的消息转发功能。开启后,用户发送的消息将按照标准格式转发到指定的接口地址,便于后端系统处理用户请求。接口的具体使用规则需参照相关文档,确保消息的转发逻辑正确无误。
10、后端新增了 is 语法(xinle_is_public_account($key)),用于检测某个 key 或指定的 user_id 是否为服务号消息。当检测结果为服务号消息时,系统会返回该服务号的具体配置信息;若检测结果不是服务号消息,则返回 false。服务号是平台的虚拟账户,主要用于系统消息的下发与处理。在消息接收与处理的过程中,系统需要对消息的类型和来源进行判断,若识别为服务号消息,则需进行单独的处理,以确保服务号消息的处理逻辑与其他消息区分开来,从而实现更精准的消息分发与响应。
11、xinle_is_push_service完成封装处理,整个执行流程如下:初始化结果数组 创建一个空的 $result 数组,用于存储函数的返回结果。 获取推送配置 通过调用 xinle_is_config 函数,根据通知类型 $type 获取对应的推送配置 $push。 检查推送配置是否存在 如果未找到与通知类型匹配的推送配置,直接返回错误:通知场景未配置。 检查推送是否全局禁用 如果推送配置中的 open 值为空或为 false,表示当前通知场景已全局禁用,返回错误。 检查服务号通知是否启用 如果推送配置中的 service_open 值为空或为 false,表示当前通知场景禁用了服务号通知,返回错误。 检查服务号参数是否存在 如果推送配置中的 service_id 值为空,表示服务号参数未正确配置,返回错误。 获取服务号配置信息 调用 xinle_is_public_account 函数,使用 service_id 获取服务号的配置信息 $public_account。 检查服务号是否存在 如果 $public_account 为空,说明服务号不存在,返回错误,包含服务号的 service_id 信息。 返回成功结果 如果所有检查通过,则返回允许发送服务号通知的结果,包含: 状态码 code 为 0。 成功消息。 服务号标题 service_title。 服务号标识 source。 服务号的用户ID user_id。
Warning: Trying to access array offset on value of type bool in /www/wwwroot/www.acocoa.com/wp-content/module/public/function/acocoa/function/jinsom.php on line 163
拉黑 举报 打赏 回复772楼
1、新增了一个 Redis 计数器 gzh_push,用于记录公众号模板消息发送成功的次数。该计数器通过 xinle_redis_count 方法完成计数统计的处理,能够支持按时间区域进行查询,比如查询昨天、本周、上月的公众号消息推送成功次数。计数器的更新仅在接口明确返回推送成功时才会触发,确保统计数据的准确性。
2、在通过 xinle_gzh_push 发送公众号模板消息的过程中,如果 API 接口发生异常或者推送失败,系统会触发日志记录操作,以便后续分析问题原因和排查故障。日志的标识为 gzh_push,通过 xinle_log_error_warn 方法完成日志的写入处理。日志的记录格式规范如下:模版ID(temp_id):标识本次发送的模板消息的唯一 ID,便于确定具体的消息模板。 返回码(result['code']):记录接口返回的状态码,如果状态码不存在,则默认为 0。 失败详情(res['errmsg']):记录 API 返回的失败描述信息,如果失败原因未知,则默认为 未知错误。 错误码(res['code']):记录 API 返回的具体错误码,用于进一步定位问题原因。 接收用户(user_id):记录本次消息的接收用户 ID,便于追踪特定用户的推送问题。
3、在 xinle_gzh_push 数据表中新增了一个 error 字段,用于存储推送失败时的详细错误信息。该字段采用 TEXT 类型,能够支持存储较长的文本内容,以满足复杂错误场景的记录需求,尤其是在微信接口返回较为详细的错误描述时,可以完整记录相关信息,便于后续问题排查和分析。 字段设计说明: 字段名称: error:用于记录推送失败的详细错误信息。 字段类型: TEXT:选择 TEXT 类型,允许存储大段文本内容,能够适应微信接口返回的复杂错误信息,例如错误码、错误描述、调用栈等。 默认值: 设置默认值为 NULL(允许为空),这样可以节省存储空间。只有在推送失败时(status='fail')才会填充该字段,成功或等待状态下该字段保持为空。 使用场景: 当推送状态为失败(status='fail')时,将错误信息写入 error 字段,以便后续分析和追踪问题原因。 推送成功(status='success')或处于等待状态(status='pending')时,该字段为空,避免冗余数据存储。
4、为了避免因并发或系统异常导致重复发送公众号模板消息,加入了 Redis 上锁保护机制。这种机制通过对业务逻辑的加锁控制,确保同一个用户在一定时间内不会重复接收到相同的消息。具体实现过程如下:系统在执行业务之前,会对传递的数组变量进行处理,首先使用 serialize 函数将数组序列化为字符串格式,确保数组的结构和内容能够完整保存。随后,使用 md5 对序列化后的字符串进行加密处理,生成唯一的哈希值。这个哈希值作为锁的标识,确保不同用户或不同消息能够独立区分。
接着,系统通过 xinle_lock 执行取锁动作。锁的有效期设定为 180 秒,即在锁定期间(180 秒内),同一个用户无法收到重复的模板消息。这样可以有效避免因系统异常或并发操作导致的重复触发问题。具体来说,当系统试图发送消息时,会先检查 Redis 中是否存在对应的锁。如果锁存在,则表示该消息已在锁定时间内被发送过,此时系统将跳过消息发送逻辑,避免重复发送。如果锁不存在,则说明该消息可以正常发送,并在发送完成后立即设置锁,锁的有效期为 180 秒。
5、xinle_sms_push方法重构设计,之前是通过变量传参,每个参数都需要通过变量来传参,这维护和扩展非常麻烦,因此决定对其进行重构,所有的变量都通过数组方式进行传参,需要什么就通过数组进行处理。内部方法进行全部重构设计,一些user_id和phone的逻辑进行重构,不在合并为一个,而是数组进行选择传参。支持手机号直接处理,也支持用户发送发送短信。
6、整个xinle_sms_push函数的执行流程可分为以下 10 个核心步骤,按顺序梳理如下: 1. 参数初始校验与提取 首先校验传入的sms是否为非空数组,若不是则返回 “参数格式错误”。 从sms数组中提取参数并设置默认值: phone(手机号或用户 ID,默认为空)、type(短信类型,默认为default)、templId(模板 ID,默认为空)、variable_1~variable_3(模板变量,前 1 个必填)、user_id(用户 ID,默认为空)。 2. 必传参数校验 校验templId(模板 ID)是否为空,为空则返回 “模板 ID 不能为空”。 校验variable_1(主要模板变量)是否为空,为空则返回 “主要变量不能为空”。 3. 手机号获取逻辑处理 若未传递phone但提供了user_id,尝试通过get_user_meta从用户元数据中获取绑定的手机号。 若phone仍为空(未传递且无法通过user_id获取),返回 “手机号不能为空”。 4. 手机号格式初步校验 校验phone是否为数字(排除非数字字符串),若不是则返回 “传递非法字符串”。 5. 用户 ID 转手机号处理 若phone不是有效的手机号(通过xinle_is_phone判断)但为数字(可能是用户 ID),尝试通过xinle_is_user_phone函数查询该用户 ID 绑定的手机号,若查询到则更新phone为实际手机号。 6. 手机号最终校验 再次通过xinle_is_phone校验phone是否为有效手机号,若不是则返回 “手机号错误”。 7. 用户 ID 关联处理 若未传递user_id,通过xinle_is_uid_by_phone函数根据手机号反向查询用户 ID,确保user_id与phone关联。 最终校验:若user_id和phone均为空,返回 “主要参数为空”。 8. 频率限制检查 生成唯一键(phone + templId),通过xinle_lock函数检查 “5 秒内同一手机号 + 同一模板” 是否已发送过短信。 若触发限制(未获取到锁),返回 “超速限制”。 9. 数据库记录与模板变量处理 准备短信记录数据(包含手机号、模板 ID、变量、发送时间、状态等),插入到xinle_sms_push表,获取记录 ID。 处理模板变量:去除空格、HTML 特殊字符和换行符,整理为腾讯云 API 要求的参数格式。 10. 调用腾讯云 API 并处理结果 准备腾讯云短信 API 参数(appid、appkey、签名、时间戳等),构造符合 API 格式的请求数据(包含手机号、模板 ID、变量、签名等)。 调用 API 发送请求,解析返回结果: 若返回errmsg = OK(发送成功):更新数据库记录状态为 “成功”,记录短信 ID,返回成功信息(包含记录 ID)。 若发送失败:记录错误日志(时间、模板 ID、手机号、错误信息),更新数据库状态为 “失败”,解除频率限制锁,返回错误信息。 整个流程从参数校验到 API 调用、结果处理形成闭环,确保了短信发送的合法性、安全性和可追溯性。
7、系统中原有短信发送的旧接口已全面迁移至新版本方法进行统一处理。目前已完成的适配内容包括以下几项:1、短信注册功能已通过登录接口实现,确保用户在注册时能够顺利接收短信验证码;2、短信登录功能已通过登录接口适配,优化了用户登录时的验证码发送流程;3、换绑手机号页面新增了针对新手机重新获取验证码的功能,提升了用户在换绑操作中的体验;4、换绑手机号页面支持获取新手机号验证码,保障了用户信息修改的安全性;5、换绑手机号页面新增验证旧号码的功能,进一步加强了用户账户安全;6、绑定手机号页面已完成获取验证码功能的迁移,确保绑定流程更加稳定;7、修改密码时的验证码获取功能已适配至新版本方法,优化了用户操作的便捷性与安全性。以上功能的迁移和适配,有效提升了短信服务的稳定性和统一性,同时为用户提供了更加流畅的交互体验。
8、新增APP消息的推送方法:xinle_app_push($app),该方法通过传递包含相关参数的APP数组来实现消息推送功能。目前已集成的字段属性包括以下内容:1、user_id:用于指定接收消息的用户,此字段为必填项,仅支持单体推送,即每次只能向一个用户发送通知;2、type:表示推送通知的类型,用于区分消息类别;3、$title:推送通知的标题,显示在用户端的消息列表中;4、$content:推送通知的内容,作为消息的主体信息展示;5、$payload:透传消息内容,该字段为可选项,主要用于传递一些后台数据或特定指令,不直接显示给用户。该函数通过调用特定的API端点实现消息发送,并在执行过程中会检查目标用户是否已绑定APP推送码,确保推送通知能够正确到达用户终端。此方法的引入进一步完善了消息通知机制,为用户提供了更加便捷和高效的消息推送服务。
9、新增数据表:xinle_app_push:负责记录APP消息的推送记录。字段说明: id:自增主键,唯一标识每条推送记录 user_id:关联用户表的用户 ID,用于定位推送对象 cid:存储用户的推送标识(clientid),用于实际推送操作 time:记录推送发起时间,默认值为当前时间 type:推送类型分类(如系统通知、私信等) title:推送标题(对应代码中的$title) content:推送内容(对应代码中的$content) payload:存储透传数据,以 JSON 格式保存(对应代码中的$payload) state:推送状态,默认为wait(等待推送),可后续更新为success或fail
10、xinle_push_app_hook在执行APP消息推送前,会先将推送信息写入推送记录表,以便进行后续的追踪和管理。写入记录后,函数会调用内置的API接口,发起APP消息的推送请求。推送过程结束后,系统会根据返回结果对记录的状态进行更新:如果推送成功,则会将状态字段status标记为success,表示消息已成功发送;如果推送失败,则会将状态字段标记为fail,同时将具体的错误信息详细记录到error字段中,以便后续分析和处理。该流程确保了消息推送的全程可追溯性,同时为异常情况提供了有效的记录支持,有助于提升消息推送的可靠性和问题排查效率。
11、xinle_push_app_hook在发起API请求时,由于涉及外部请求,系统会通过try-catch机制捕获可能出现的各种异常,从而确保不会因为意外错误而导致整个执行流程发生崩溃。在请求过程中,系统会优先处理官方接口返回的错误信息,并对这些报错进行识别和解析。如果官方返回的错误信息无法被系统识别或解析,则会启用内置的方法捕获系统级报错,确保所有异常信息都能被记录和处理。最终,所有的错误信息会被统一整理为数组结构返回给后续的接收对象,以便接收方能够高效地进行错误处理和问题追踪。这种机制不仅提升了系统的稳定性和容错能力,还为外部接口交互提供了可靠的异常管理方案。
Warning: Trying to access array offset on value of type bool in /www/wwwroot/www.acocoa.com/wp-content/module/public/function/acocoa/function/jinsom.php on line 163
拉黑 举报 打赏 回复771楼
1、新增后端方法xinle_is_user_email,用于检测用户是否已绑定邮箱。该方法的主要功能是通过用户的唯一标识user_id,判断用户是否已完成邮箱绑定操作。如果检测到用户已绑定邮箱,则直接返回用户的邮箱地址;若未绑定,则返回false。为了增强方法的灵活性,当未显式传递user_id参数时,系统会通过xinle_is_login方法自动获取当前登录用户的uid,确保能够动态适配不同场景下的调用需求。
2、xinle_is_push_email的处理流程如下: 构建 Redis 键名: 根据用户 ID 和通知类型生成 Redis 键名,格式为:day:push_{user_id}|email_{type}。 该键用于记录当前用户当天发送指定类型邮件的次数,便于后续的发送限制校验。 获取已发送邮件数量: 调用 get_redis_meta($redis_key) 获取 Redis 中记录的邮件发送数量,存储为 email_limit。 将获取的结果强制转换为整数类型,确保后续逻辑判断时数据的准确性和一致性。 初始化结果数组: 创建一个空的 $result 数组,用于存储最终的返回数据,便于后续结构化输出。 获取推送配置: 调用 xinle_is_config('xinle_push_config', $type) 方法,根据 $type 参数获取当前通知场景的配置,并存储为 $push。 使用 $type 参数过滤出对应类型的推送配置。 检查推送配置是否存在: 如果 $push 为空,说明当前通知场景未配置相关推送规则,返回错误信息。 检查场景是否已全局禁用: 如果 $push['open'] 为空或为 false,说明该通知场景已被全局禁用,返回错误信息。 检查邮件功能是否禁用: 如果 $push['config']['email_open'] 为空或为 false,说明该通知场景禁用了邮件功能,返回错误信息。 获取用户电子邮件地址: 调用 xinle_is_user_email($user_id) 方法,根据用户 ID 获取其绑定的电子邮件地址,存储为 $email。 检查用户是否绑定电子邮件: 如果 $email 为空,说明用户未绑定邮箱,返回错误信息。 检查是否达到每日邮件发送上限: 如果 email_limit 的值大于或等于 $push['config']['email_limit'],说明用户当天该类型邮件的发送次数已达到上限,返回错误信息。 返回成功结果: 如果以上所有检查均通过,表示允许发送邮件。 返回包含以下内容的结果:用户的邮箱地址 $email 和邮件标题(从 $push 中获取)。
3、新增方法:xinle_notify_hook_gzh,该方法旨在统一消息发送接口,主要负责封装模板消息的业务逻辑。具体实现流程如下: 方法功能: 该方法负责处理微信公众平台模板消息的发送,通过解析消息场景和对应的后台配置,结合用户信息和模板结构,实现消息发送的统一管理。 方法参数: $user_id:用户 ID,用于标识消息发送的目标用户。 $type:消息类型,通过解析消息场景来获取对应的后台配置信息。 $template:模板的组件结构,包含完整的消息内容和格式定义。
4、新增方法:xinle_is_push_gzh,检查是否允许发送公众号模版消息。如果推送配置不存在,或者推送已被全局禁用,或者模版消息已被禁用,或者公众号模版ID为空,或者用户的公众号模版推送UID有问题,或者已达到每日模版消息发送上限,函数将返回一个包含错误代码和消息的数组。返回一个包含结果代码和消息的数组。如果允许发送模版消息,结果代码为0,消息为'允许发送模版消息',并且返回的数组中还会包含模版消息ID和用户推送标识。如果不允许发送模版消息,结果代码为1,消息将包含失败的原因。
5、新增方法:xinle_is_push_gzh,该方法用于封装公众号消息推送的逻辑处理,确保在满足配置要求的情况下对用户进行模板消息的发送操作。具体的执行流程如下: 构建 Redis 键名: 根据用户 ID 和通知类型生成 Redis 键名,格式为:day:push_{user_id}|gzh_{type}。 该键用于记录当前用户在当天发送指定类型的公众号消息的次数,以便对消息发送频率进行限制。 获取已发送的公众号消息次数: 调用 get_redis_meta($redis_key) 从 Redis 中获取记录的公众号消息发送次数,赋值给变量 gzh_limit。 使用强制类型转换将 gzh_limit 转换为整数类型,确保在后续的逻辑处理中数字比较的正确性,避免因数据类型问题引发错误。 初始化结果数组: 创建一个空的 $result 数组,用于存储最终的返回结果。该数组将在整个方法执行完成后返回,包含处理的状态及相关信息。 获取推送配置: 调用 xinle_is_config('xinle_push_config', $type) 获取通知场景配置,将结果存储到 $push 中。 根据 $type 参数过滤出当前类型对应的推送配置,确保后续逻辑处理的针对性。 检查推送配置是否存在: 如果 $push 为空,说明当前通知场景未配置,返回错误信息,提示配置缺失。 检查场景是否已全局禁用: 如果 $push['open'] 为空或为 false,说明该通知场景已全局禁用,返回错误信息,提示该类型消息推送已关闭。 检查公众号模板消息功能是否禁用: 如果 $push['config']['gzh_open'] 为空或为 false,说明当前通知场景禁用了公众号模板消息功能,返回错误信息,提示模板消息不可用。 检查公众号模板消息 ID 是否存在: 如果 $push['config']['gzh_id'] 为空,说明模板消息 ID 未配置,返回错误信息,提示配置不完整。 获取用户的公众号 UID: 调用 get_user_meta($user_id, 'weixin_uid', true) 获取用户的公众号 UID(即 weixin_uid),用于标识用户在公众号中的唯一身份。 检查用户是否关联公众号 UID: 如果 weixin_uid 为空,说明用户未关联公众号 UID,返回错误信息,提示用户未完成公众号关联,无法进行消息推送。 检查是否达到每日模板消息发送上限: 如果 gzh_limit 的值超过 $push['config']['gzh_limit'],说明用户当天该类型模板消息的发送次数已达上限,返回错误信息,提示发送频率受限。 返回成功结果: 如果以上所有检查均通过,说明满足模板消息发送的条件,返回允许发送的结果。 返回结果中包含关键信息,如用户 ID、模板消息类型、模板 ID 等,为后续的消息发送操作提供支持。
6、新增方法:xinle_gzh_push,该方法主要负责项目中公众号模板消息的统一发送,旨在实现业务逻辑的一致性和接口的高扩展性。为了便于后续维护和功能扩展,该接口采用数组传参的方式进行调用。具体逻辑及参数说明如下: 接口功能说明: xinle_gzh_push 作为一个统一的模板消息发送接口,主要用于向用户推送公众号模板消息,支持用户 ID 和 openid 两种方式指定消息接收者,并通过动态参数实现消息内容的灵活配置。 必须传递的参数: user_id(接收消息的用户 ID,与 openid 二选一): 指定接收消息的用户,通过用户 ID 关联用户信息。 如果未传递 user_id,则需传递 openid。 openid(接收消息的标识,与 user_id 二选一): 用于直接指定接收消息的公众号用户标识,通常在用户未绑定 user_id 时使用。 如果未传递 openid,则需传递 user_id。 temp_id(消息模板 ID 标记): 必须传递的模板消息 ID,用于标识需要发送的模板消息类型。 该 ID 通常与模板消息配置的类型一一对应。 first(内容标题描述,已被系统禁用): 此参数已被禁用,传递内容不会生效。 keyword1(第一个模板菜单内容): 模板消息的第一个关键字内容,支持动态传参,用于个性化消息内容的展示。 keyword2(第二个模板菜单内容): 模板消息的第二个关键字内容,支持动态传参,用于补充信息。 keyword3(第三个模板菜单内容): 模板消息的第三个关键字内容,支持动态传参,用于展示更多细节。 keyword4(第四个模板菜单内容): 模板消息的第四个关键字内容,支持动态传参,进一步丰富消息内容。 keyword5(第五个模板菜单内容): 模板消息的第五个关键字内容,支持动态传参,用于展示额外信息。 remark(底部详细描述,已被系统禁用): 此参数已被禁用,传递内容不会生效。 link(点击菜单的跳转链接): 用户点击模板消息后跳转的链接地址,可配置为具体的业务页面或外部链接,用于引导用户进一步操作。
7、xinle_gzh_push 方法在处理 openid 的逻辑上进行了严格的校验和补充机制,以确保消息推送的准确性与稳定性。具体处理流程如下: 逻辑处理说明: openid 的优先读取与补充机制: 系统会优先读取传递的 openid 值,作为消息推送的接收标识。 如果调用方未传递 openid,但提供了 user_id,系统会通过 get_user_meta 方法根据 user_id 获取用户的 weixin_uid(微信唯一标识),并将该值赋给 openid。 如果经过上述补充后,openid 依然为空,则终止消息推送处理,并返回错误信息。 temp_id 模板标识的校验: 推送前会检测是否传递了 temp_id 模板标识,用于确定需要发送的模板消息类型。 如果 temp_id 为空,则主动跳过消息推送处理,并返回相应的错误提示。 消息发送与结果返回: 消息推送操作完成后,方法将返回一个标准的数组结构,方便调用方进行后续处理。 返回数组中包含以下字段: code:表示操作状态,code=0 代表推送成功,code=1 代表推送失败。 msg:具体的错误或成功信息,用于描述操作结果。
8、新增数据表:xinle_gzh_push:每次公众号模版消息推送(单向推送,非集体推送)都会在这个表写入推送记录,该表可以查看到消息是否推送成功,如果失败则会记录具体失败的原因。字段结构如下:id:自增主键,唯一标识每条推送记录 user_id:整数类型,关联系统用户表的用户 ID openid:字符串类型,存储微信用户的 openid tempid:字符串类型,存储使用的模板消息编号 json:TEXT 类型,存储推送的消息内容(JSON 格式) time:DATETIME 类型,记录发送时间 status:字符串类型,默认值为 'wait',记录推送状态。
9、xinle_gzh_push 数据表新增字段 type,用于记录模板消息的推送场景来源,旨在为后期的溯源操作提供更精准的依据。在实际应用中,type 字段的设置与消息推送的具体场景密切相关,以下是详细说明: 字段设计与使用逻辑: 字段功能: type 字段用于标识模板消息的推送场景来源,例如订单通知、活动提醒、系统公告等。 通过该字段的记录,后续可快速定位消息的来源场景,便于数据分析、问题排查或业务优化。 字段赋值逻辑: 用户可以在调用接口时选择性传递 type 参数,用于明确指定模板消息的具体推送场景。 如果用户未主动传递 type 参数,系统会自动将其标记为默认值 default,以表示该消息为统一发送场景或未明确指定来源。 与公众号模板消息的关联: 在实际推送模板消息时,type 的值可以与对应的公众号模板消息类型进行绑定,以便在推送时区分不同的业务场景。 通过这种绑定机制,可以更高效地实现模板消息的分类管理,满足多场景的需求。
10、修复 xinle_sms_push 方法在完成短信发送处理动作后,写入消息数据表记录时错误地将 user_id 标记为 0 的问题。此问题的根本原因在于内部调用了 xinle_is_uid_by_phone 方法,通过手机号获取 user_id 时,由于参数传递错误,导致未能正确获取用户 ID,从而将 user_id 错误地记录为 0。
11、xinle_gzh_push 数据表的处理逻辑如下:在发起公众号模板消息推送之前,系统会通过 xinle_insert_sql 方法将本次推送记录写入数据表 xinle_gzh_push,并将其状态标记为 wait(表示等待发送)。随后,通过调用 API 接口向用户发送模板消息。如果发送成功,则将记录的状态更新为 success,若发送失败,则将状态更新为 fail。在处理公众号消息发送请求时,系统采用 try-catch 机制捕获可能的异常,确保无论发送结果如何,均能返回可供后续方法追踪的结果,从而保证推送过程的完整性与可追溯性。
Warning: Trying to access array offset on value of type bool in /www/wwwroot/www.acocoa.com/wp-content/module/public/function/acocoa/function/jinsom.php on line 163
拉黑 举报 打赏 回复770楼
1、新增了通知配置组字段:全局Push通知管理(xinle_push_config),采用数组结构设计以便于后续功能的扩展和维护。具体设计结构如下:name字段用于标识使用场景的简称,例如【订单发货 - (通知卖家)】,直观且便于快速了解配置用途;content字段用于记录场景的详细描述及备注信息,例如明确哪些具体场景或代码逻辑会触发该消息的调用,确保配置的可追溯性和准确性;key字段作为唯一标识,通过该标识可以精准读取相关配置,避免重复或冲突;open字段用于控制通知的启用状态,当该字段关闭时,系统将停止下发对应类型的通知。这一设计结构清晰且规范,既满足了对通知场景的灵活管理需求,又为后续功能的扩展提供了良好的兼容性,同时也提高了配置的可读性和操作的便捷性。
2、在xinle_push_config中新增了子数组config,采用tabbed菜单切换结构设计,旨在进一步细化和优化通知配置功能。具体包含以下配置项:手机短信配置部分增加了多个关键字段,首先是sms_open,用于控制是否开启短信通知功能,方便灵活管理短信发送;其次是sms_id,作为短信模板的唯一标识,用于快速匹配和调用对应的模板;sms_template字段存储模板内容,若短信服务失效,可根据该模板内容重新申请或切换至其他短信平台,起到模板备份的作用,同时为平台迁移提供便捷支持;sms_limit字段设置每日发送短信的数量上限,以防止短信功能被滥用,确保每位用户每日仅能接收规定数量的通知,提升资源使用效率;最后,新增sms_vip字段,用于区分会员权限,开启后只有开通会员的用户才能收到相关短信通知,满足个性化服务需求。整体设计兼具功能性与扩展性,为短信通知管理提供了高效、灵活的解决方案。
3、在xinle_push_config中新增了公众号模板配置,旨在为绑定微信公众号的账户提供更加高效的通知机制。具体功能设计如下:当账户成功绑定微信公众号后,用户即可通过公众号接收通知,但严格限制通知类型,仅允许与账户相关的资金或交易变动信息下发,不支持任何社交互动消息,确保通知内容精准且不冗杂。为避免用户错过关键信息,建议商户和工作人员强制绑定微信公众号,进一步提升通知的及时性和重要性。
新增字段包括:gzh_open,用于控制公众号通知开关,关闭后将完全停止公众号模板通知的触发;gzh_id,表示公众号模板的唯一标识,通过公众号后台获取,若模板失效需及时更新以保证通知的正常发送;gzh_link,为模板消息的跳转链接,用户点击通知后将跳转到指定页面,支持短代码自动转义处理,若该字段为空,则默认跳转到首页,确保用户体验的一致性;gzh_limit,每日通知发送限制,用于防止消息滥用,每个用户每日最多接收规定数量的公众号通知,确保平台资源使用的规范性和高效性
4、在xinle_push_config中新增了APP通知配置,旨在为用户提供更加便捷的应用消息推送功能。当用户开启【应用通知推送】权限后,系统将向其发送一条APP应用通知。不过,由于APP消息推送受厂商过滤、离线渠道等多方面因素影响,通知的下发并不完全保证用户能够收到消息,因此需结合实际情况优化推送策略。
新增字段包括:app_open,用于控制APP通知的开关,关闭后将完全停止手机通知的触发;app_title,表示APP消息标题,如果通知函数未自定义标题,则系统将自动调用此处配置的内容,支持使用EMOJI符号以增强通知的表现力;app_content,用于定义消息正文内容,当通知函数未自定义正文时,系统将调用此处的配置,但涉及动态参数(如订单号、用户名、商品信息)时,必须通过通知函数进行自定义,确保消息内容的准确性和针对性;app_link,为APP通知的点击跳转链接,若通知函数未定义跳转链接,则调用此处配置的链接,支持短代码自动转义处理。不过需要注意的是,若需直接跳转到商品页或订单页等具体页面,则必须在通知函数内进行相关定义。
5、在xinle_push_config中新增了站内服务号配置,该功能类似于微信公众号的通知机制,旨在通过服务号向用户推送订单或交易变化信息,并记录相关订单状态的变更。此功能为用户提供了及时了解订单动态的便捷渠道,同时增强了平台的服务通知能力。
新增字段包括:service_open,用于控制服务号通知的开关,关闭后将停止所有服务号相关的手机通知,确保用户在关闭状态下不会受到干扰;service_title,用于定义服务号消息的标题,支持根据不同应用场景预先设置标题参数,确保通知内容能够清晰地表达当前场景;service_id,用于指定启用的服务号,所有[APP站内信]的通知将由该服务号统一下发,方便管理和追踪消息来源。
6、在xinle_push_config中新增了Email邮件配置,该功能旨在为绑定邮箱的用户提供邮件通知服务,用户在相关场景下将收到对应的邮件提醒。这一功能的引入为用户提供了更多样化的通知方式,但为了避免消息滥用,建议一般消息场景下不要开启邮件提醒,以免造成用户不必要的干扰。
新增字段包括:email_open,用于控制邮件通知的开关,关闭后将停止所有邮件通知的发送,用户可根据需求灵活调整;email_limit,用于限制邮件发送频率,以防止消息滥用,每位用户每日最多接收XX条此类消息,保障邮件通知的合理性和规范性;email_title,用于定义邮件通知的标题,支持根据不同应用场景预设标题参数,确保邮件内容主题清晰、简洁明了。
7、在xinle_push_config消息配置组中,新增了对消息类型的集成处理功能,对不同类型的消息进行了归类和规范化管理。目前支持的消息类型包括以下几种:account(账户安全通知),主要用于提醒用户账户相关的安全动态;funds(资金变动通知),用于通知用户资金相关的变化或交易信息;goods(交易订单通知),针对用户交易订单的状态更新进行推送;system(系统类型通知),用于发送平台的系统公告或重要通知;review(审核处理通知),涉及用户提交的资料或申请的审核状态;sns(社交互动通知),用于提示用户社交互动的动态信息;chat(聊天消息通知),为用户提供实时的聊天消息提醒。此外,后续将进一步优化消息通知功能,集成消息通知入口,为用户提供更灵活的消息管理方式。用户可以根据个人需求,自主选择接收或屏蔽某些类型的消息,并支持多种通知渠道的设置,包括短信、公众号和APP推送等。通过这种精细化的消息管理机制,用户能够更高效地获取重要信息,同时避免不必要的消息干扰,全面提升消息通知的使用体验和平台服务质量。
8、新增方法xinle_notify_hook_sms,负责push消息通知(手机短信)的消息处理,该方法负责统一消息发送接口-短信业务的封装。需要传递 $type 类型,$user_id 用户ID。 * @param string $variable_1 变量1$variable_2 变量2。内部会将消息转发到xinle_sms_push接口响应处理。该方法属于中间层,负责接管后续的处理动作,便于维护处理。
9、新增xinle_is_push_sms方法,检查是否可以向指定用户发送特定类型的短信通知。$user_id 用户的ID。$type 通知的类型。。返回一个包含结果代码、消息和(如果允许发送短信)电话号码的数组。如果结果代码为0,表示允许发送短信。如果结果代码为1,表示不允许发送短信,消息字段将包含失败的原因。如果无法连接到Redis服务器,或者无法从WordPress选项中获取推送配置。
10、xinle_is_push_sms完成封装处理,整个执行流程如下初始化:生成 Redis 键 day:push_{user_id}|sms_{type},用于存储和获取短信发送次数限制。 读取 Redis 数据: 从 Redis 中获取该用户和短信类型的已发送次数 sms_limit。 获取配置: 调用 xinle_is_config 函数获取通知场景的配置 push,根据 type 参数指定的通知场景。 配置检查: 未配置检查:如果 push 为空,返回错误信息 "短信发送失败:通知场景未配置"。 全局禁用检查:如果 push['open'] 为空,返回错误信息 "短信发送失败:通知场景已全局禁用"。 短信功能禁用检查:如果 push['config']['sms_open'] 为空,返回错误信息 "短信发送失败:通知场景禁用短信"。 短信模板 ID 检查:如果 push['config']['sms_id'] 为空,返回错误信息 "短信发送失败:短信模版ID为空"。 手机号检查: 通过 get_user_meta 获取用户的手机号 phone。 如果 phone 为空,返回错误信息 "短信发送失败:对方账户未绑定手机号"。 会员权限检查: 如果 push['config']['sms_vip'] 为真且用户不是会员(xinle_is_vip($user_id) 返回假),返回错误信息 "短信发送失败:该类型短信仅限会员可用"。 发送限制检查: 如果 sms_limit 超过 push['config']['sms_limit'],返回错误信息 "短信发送失败:今日该类型短信发送超上限"。 允许发送: 如果所有检查通过,返回成功信息,包含允许发送短信的标志、用户手机号 phone 和短信模板 ID
11、新增了xinle_notify_hook_email方法,该方法专门用于统一消息发送接口中邮件业务的封装处理,旨在实现高效、灵活的邮件推送功能。此方法的设计充分考虑了异步执行的需求,因此在调用时需主动传递相关参数,包括以下几个关键点:user_id,表示需要接收邮件的用户标识,这是邮件发送的目标对象,确保消息能够准确送达;type,用于明确消息的来源和类型,这是邮件内容分类和处理的核心,能够根据不同类型执行定制化的逻辑;template,指邮件的模版结构,通常用于定义邮件正文的内容及参数传递,支持动态数据填充,同时也可包含附件等其他资源,满足多样化的邮件发送需求。
Warning: Trying to access array offset on value of type bool in /www/wwwroot/www.acocoa.com/wp-content/module/public/function/acocoa/function/jinsom.php on line 163
拉黑 举报 打赏 回复769楼
1、营业执照识别完善错误处理,结合了腾讯云官方输出参数规范、错误码体系,新增了错误类型细分、关键字段提取,并优化了异常场景的覆盖范围(如欠费、资源耗尽、服务未开通等): 新增bizErrorMap映射官方错误码(如ResourceUnavailable.InArrears→账号欠费),避免用户看到技术化错误码 细分错误类型:系统配置错误(密钥空)、参数错误(URL 非法)、HTTP 错误(429 频率超限)、解析错误、腾讯云业务错误 覆盖全异常场景: 包含官方文档所有错误码(欠费、资源耗尽、服务未开通等) 补充 URL 格式验证、CURL 连接超时、SSL 验证等细节场景 保留原始错误码和响应内容,便于后端调试。
2、通过API发起相应接口请求的时候,会对返回的营业执照的数组结构进行接管重构处理:系统会按业务分类字段: core_info:核心业务字段(统一信用代码、公司名称等,前端直接展示用) aux_info:辅助信息(是否副本、是否电子执照等) warn_info:告警信息(明确是否为复印件 / 翻拍件,风险提示用) raw_response:保留原始响应,便于后续扩展 新增关键标识: 携带腾讯云request_id,方便对接官方技术支持时定位问题 has_warn布尔值,前端可直接判断是否需要显示告警提示。
3、API目前支持的错误解析包括如下:图片下载失败,请检查URL有效性或网络连通性图片解码失败,仅支持PNG/JPG/JPEG格式且Base64编码后不超过7M识别结果非营业执照,请上传正确的营业执照图片OCR识别失败,可能是图片模糊、遮挡或格式不支持未知错误,请联系腾讯云技术支持腾讯云营业执照识别服务未开通,请先在控制台开通服务参数值错误,如URL格式非法或图片大小超限图片文件过大,Base64编码后需小于7M腾讯云账号已欠费,请充值后再使用服务账号OCR资源包已耗尽,请购买资源包或切换计费模式账号计费状态异常,请检查控制台计费配置。
4、xinle_api_ocr_recognizeBizLicense 方法新增集成了 Redis 缓存机制,优化了接口的调用效率。在执行解析操作之前,系统会优先检查 Redis 缓存是否存在结果。缓存的键名通过对 URL 进行 MD5 加密处理,有效避免了因特殊字符引发的潜在问题。当缓存命中时,直接返回结果,同时在返回数据中附加缓存标识,并补充必要字段以确保数据完整性,防止因旧缓存导致字段缺失的情况发生。如果缓存未命中,系统将通过 API 接口发起实时查询,并在响应成功时将结果写入 Redis 缓存。需要注意的是,缓存仅存储成功的查询结果,对于失败的查询结果则不会进行缓存处理。每条缓存数据的有效期为 30 天,超过期限的缓存会被系统自动释放,确保缓存数据的时效性与准确性。
5、后台新增计数器功能:api_ocr_recognizeBizLicense(API-营业执照识别)。当通过该API接口成功解析并获取到营业执照信息时,系统会自动调用 xinle_redis_count($key) 发起计数。此计数器支持按照时间区间统计调用次数,例如昨日、上周、本月的识别次数等。需要注意的是,计数器仅在解析成功的情况下才会触发计数逻辑。如果系统读取的是缓存数据,或者解析过程出现失败,则计数操作将会被跳过,从而确保计数结果的准确性和有效性。
6、考虑到接口的异常,增加了日志的写入。具体处理如下:使用数组构建日志数据,包含时间戳、错误类型、错误码等关键信息 转换为 JSON 格式,便于 ELK 等日志分析系统解析和检索 增加JSON_PRETTY_PRINT参数,确保日志可读性。新增关键信息: image_url_hash:URL 的 MD5 哈希值,方便统计重复出现的错误 URL execution_time:接口执行时间,可识别超时相关问题(需在函数开头定义$startTime = time()) server_ip:服务器 IP,在分布式部署环境中定位具体服务器 php_version:PHP 版本信息,避免因版本差异导致的兼容性问题 request_id:保留腾讯云请求 ID(部分错误场景可能存在) 上下文完整性: 包含函数名、错误类型等元数据,便于快速筛选日志 错误信息与业务上下文(如处理的图片 URL)关联,加速问题定位 日志可用性: 中文使用JSON_UNESCAPED_UNICODE避免转义,保证日志可读性 结构化数据支持按字段筛选(如按错误类型统计数量)。
7、腾讯云营业执照识别接口(带Redis缓存+日志统计):完成封装,整个执行流程如下:阶段 1:初始化与缓存读取(优先复用缓存) 初始化基础信息:记录函数开始时间$startTime,初始化$responseData避免未定义警告。 生成 Redis 缓存键:用函数名+MD5(URL)作为键(MD5 处理避免 URL 特殊字符影响 Redis 键合法性)。 读取缓存:调用get_redis_meta($redisKey)获取缓存数据。 缓存命中处理: 若缓存非空且为数组,标准化返回格式(补充code/msg等必选字段),标记cache=true后返回。 缓存未命中则进入后续 API 调用流程。 阶段 2:基础配置与前置验证(防无效调用) 定义错误码映射:将腾讯云官方错误码(如ResourceUnavailable.InArrears)转换为用户易懂的提示(如 “账号已欠费”)。 API 固定配置:设置域名、版本、区域、超时时间等(区域默认广州,可按需切换)。 密钥验证:从系统配置xinle_get_option读取SecretId/SecretKey,为空则抛出 “系统错误”。 URL 参数验证: 检查 URL 非空,为空则抛出 “参数错误”。 用filter_var严格验证 URL 格式(必须含http/https协议和主机名),非法则抛出 “参数错误”。 阶段 3:请求参数组装与签名(遵循腾讯云规范) 组装公共参数:包含Action(接口名)、Version(版本)、SecretId、时间戳Timestamp、随机数Nonce(防重放攻击)。 组装业务参数:传入ImageUrl,开启EnableCopyWarn(返回复印件告警)、EnablePeriodComplete(拼接营业期限)。 生成签名(核心步骤,签名错误会导致 401): 合并参数并按Key字典序排序(腾讯云签名必需)。 参数字符串按RFC3986编码(空格转%20)。 签名原文格式:POST+域名+/+?+参数字符串,用HMAC-SHA1加密后 Base64 编码,作为Signature参数。 阶段 4:发送 HTTP 请求与分层错误处理(防异常崩溃) CURL 配置:开启 SSL 证书验证(防劫持)、重定向跟随(应对 URL 跳转)、超时限制(避免长期阻塞)。 执行请求:获取响应内容、CURL 错误码、HTTP 状态码,关闭 CURL 资源。 分层错误处理: CURL 错误(如连接超时):抛出 “网络错误”,含错误码。 HTTP 状态码错误(非 200):按状态码(如 429 = 频率超限、503 = 服务过载)抛出对应错误,截断响应内容防日志过大。 JSON 解析错误:响应非合法 JSON(如腾讯云返回 HTML 错误页),抛出 “数据解析错误”。 API 业务错误:响应含Error字段(如识别失败、账号欠费),用错误码映射抛出友好提示。 阶段 5:成功结果结构化与后续处理(便于使用 + 统计) 结果结构化:将腾讯云返回的Response拆分为 3 类字段: core_info:核心业务字段(如公司名称、信用代码,前端直接展示)。 aux_info:辅助字段(如是否电子执照、是否有印章,扩展场景用)。 warn_info:告警字段(如复印件提示,风险控制用)。 封装成功结果:含code=0、msg=识别成功、cache=false(实时数据)、执行耗时等。 写入缓存:调用update_redis_meta将成功结果缓存 30 天(失败结果不缓存,避免复用错误数据)。 调用统计:调用xinle_redis_count计数,用于监控接口调用量。 返回成功结果。 阶段 6:异常捕获与错误处理(标准化 + 日志) 捕获所有异常:进入catch块,获取异常的错误码和消息。 错误类型分类:按错误码前缀将错误分为system(系统)、param(参数)、http(网络)等类型。 结构化日志:记录错误级别、时间戳、上下文(URL、服务器 IP、PHP 版本等),JSON 格式便于日志系统解析。 写入错误日志:调用xinle_log_error_warn保存日志。 封装错误结果:含code=1、错误消息、error_info(错误类型、原始码),返回给调用方。 三、核心特性总结 缓存优化:优先读取 Redis 缓存,减少 API 调用成本;仅缓存成功结果,避免错误复用。 错误友好:分层错误处理 + 错误码映射,用户无需理解技术术语(如 “429”→“请求频率超限”)。 安全可靠:SSL 证书验证、签名规范、参数严格校验,防劫持、防非法调用。 可运维性:结构化日志(含上下文)、调用统计、执行耗时,便于问题排查与监控。 兼容性:处理 URL 重定向、PHP 版本兼容、响应截断,适配多种场景。
8、对xinle_api_ocr_recognizeBizLicense方法进行了优化升级,签名方式由原来的V1模式更新为更高效的V3新版处理。此前的V1模式要求先获取签名信息,再执行识别请求,流程相对繁琐且增加了额外的请求消耗。而V3模式通过简化流程,直接支持接口发起识别,无需额外的二次请求生成签名,大幅提升了执行效率与处理速度,为用户带来更流畅的使用体验。
9、xinle_erp_application_callback回调接口现已新增营业执照上传检测功能。当系统检测到用户已上传营业执照时,将通过xinle_api_ocr_recognizeBizLicense接口发起OCR解析请求,解析营业执照中的关键信息。如果解析成功,系统会触发update_sql数组的更新请求,将法人信息、营业地址、税号、有效期等关键信息回调并更新至xinle_erp数据表中,同时通过xinle_update_sql完成数据更新操作。这一流程实现了营业执照信息的自动识别与同步更新,简化了数据录入流程,提升了信息处理效率。如果未检测到营业执照上传,则会跳过上述处理步骤,确保流程的灵活性与适应性。
10、回调接口新增了对自定义字段的处理功能:系统会通过get_user_meta方法获取申请用户的药店客户列表。如果该用户的客户列表不存在,则系统会自动构建一个空数组,并以客户的ID作为数组的键名,逐步构建包含id、status、name、trust_valid、type等字段信息的字典数据结构。这一处理逻辑的核心是将申请客户的相关信息写入到用户资料中,便于前端在后续操作中快速读取用户的客户列表。这种设计不仅优化了客户信息的存储结构,也为前端展示与交互提供了更高效的数据支持。
11、后端新增了通知配置页面,并在其下新增了一个子页面:消息配置。未来所有类型的消息,包括APP消息、站内信、短信以及公众号消息,都将通过这一配置页面进行统一管理与处理。此设计旨在实现消息处理的集中化和标准化,不仅简化了后期的维护工作,还为扩展新功能提供了便利。消息采用统一的结构进行设计,确保各类消息能够被统一接管和维护,避免因消息类型多样而导致的管理混乱。这种集中化的处理方式有效提升了系统的灵活性与可维护性,同时为后续功能迭代提供了稳定的基础。
Warning: Trying to access array offset on value of type bool in /www/wwwroot/www.acocoa.com/wp-content/module/public/function/acocoa/function/jinsom.php on line 163
拉黑 举报 打赏 回复768楼
1、我的页面通过xinle_get_option函数来读取xinle_profile_tab_help_config的配置信息,并在页面底部的容器区域中以foreach的方式遍历输出对应的菜单项(如帮助、客服、反馈)。与功能菜单的展示方式不同,该容器区域以列表的形式对菜单项进行呈现,具体细节如下:数据读取:页面通过调用xinle_get_option获取后台配置的xinle_profile_tab_help_config字段数据。该字段包含的菜单项信息(如name、key、content、icon、onclick)会被完整读取并传递至前端。数据遍历:在前端的底部容器区域,使用foreach对读取到的配置数据进行逐一遍历。每个菜单项根据配置的内容进行动态渲染,确保展示的内容与后台配置保持一致。展示形式:底部容器区域以列表的形式对菜单项进行展示,每一项以清晰的结构呈现,方便用户快速找到所需的功能入口。列表中不仅包含菜单名称和描述信息,还会显示对应的图标(由icon字段定义),并根据onclick字段配置实现点击后的交互逻辑(如页面跳转或弹窗提示)。
2、在xinle_profile_tab_help_config(客服与服务中心的配置)和xinle_profile_tab_config(我的页面菜单功能)的父级容器中,新增了两个可选字段:右侧文字按钮(right_title)和右侧文字点击事件(right_onclick)。这两个字段的引入为菜单容器的功能拓展提供了更大的灵活性和交互能力。具体实现逻辑如下:字段定义与设置:right_title:用于配置右侧文字按钮的显示内容,例如“更多”、“帮助”、“联系客服”等。该字段为可选,只有在后台配置了具体内容后,前端才会渲染对应的按钮文字。right_onclick:用于定义右侧文字按钮的点击事件,可以设置具体的交互逻辑,比如页面跳转、弹窗提示、API请求等。该字段同样为可选,只有在后台配置了具体事件时,按钮才会具备交互功能。前端渲染逻辑:当right_title和right_onclick字段未配置时,菜单容器的右侧区域保持默认状态,不显示任何额外内容。如果right_title字段有值,前端会在对应的菜单项右侧区域渲染一个文字按钮,并将样式设计为简洁、易点击的形式,确保与整体页面风格一致。如果同时配置了right_onclick字段,前端会为该按钮绑定点击事件,支持灵活的交互功能。用户点击该按钮后,会触发相应的逻辑(如跳转到指定页面或执行某些操作)。
3、在“我的”页面的头部区域,右侧新增一个切换按钮,用于预留账户切换功能。通过该按钮,用户可以方便地进入子账户列表页面,实现关联或切换账户的操作,进一步满足多账户用户的管理需求。用户点击切换按钮后,页面会跳转至子账户列表页面。在子账户列表页面,用户可以查看已关联的子账户列表,可以通过点击某个子账户进行切换,完成登录状态的切换操作。切换后,页面会返回“我的”页面,并显示切换后的账户信息。
4、修复了实名认证页面中初始化加载器的异常问题。此前,后端数据响应完成后加载提示器未能正确移除,导致用户体验受影响。经排查,问题源于全局变量 `page_content` 的错误赋值,导致页面状态未能及时更新。针对该问题,优化了 `page_content` 的赋值逻辑,确保后端数据响应完成后加载提示器能够正确移除,从而恢复页面的正常交互功能。更新后,实名认证页面的加载流程更加流畅稳定。
5、为 `xinle_callback_nickname` 回调钩子新增优化处理逻辑:用户修改昵称后,系统会自动定位到“我的页面”中的昵称显示元素,并对其进行实时更新操作。此改动确保用户昵称更新后,“我的页面”中的昵称信息能够即时同步,避免因页面刷新或手动操作导致的信息显示滞后问题,显著提升用户体验的流畅性与便捷性。
6、在后台管理页面的xinle_appkey模块中,新增了两个配置字段:xinle_appkey_tencent_SecretId和xinle_appkey_tencent_SecretKey,用于存储腾讯云的账户信息。这两个字段分别用于配置腾讯云的SecretId和SecretKey,以便系统能够通过鉴权签名安全地调用腾讯云相关接口。需要注意的是,如果使用腾讯云子用户的AccessKey进行配置,请务必为其分配相应功能的权限,以确保接口调用的正常运行。未来,所有涉及腾讯云的接口请求将统一通过内部API进行调用,鉴权签名也将基于此处的账户信息生成。为了提升系统的稳定性,建议尽量减少直接调用云厂商的接口次数,集中化管理接口调用逻辑,从而确保系统整体运行的高效与稳定。
7、新增了一个API接口方法:xinle_api_ocr_recognizeBizLicense(),用于实现营业执照识别功能。该方法的主要作用是通过OCR技术对营业执照信息进行精准识别。使用时需要传入参数 $imageUrl,即图片的URL地址。系统会基于传递的图片地址进行识别操作,若识别成功,则直接返回对应的卡证信息接口,包含识别出的营业执照详细内容;若识别失败,则返回 false,以便调用方及时获知处理结果并采取后续操作。此功能的上线为相关业务提供了更加智能化的支持,同时提升了数据处理的效率和准确性。
8、xinle_api_ocr_recognizeBizLicense 是一个基于腾讯云对象存储服务实现的营业执照识别功能模块。在实际操作中,该功能需要进行内部鉴权处理,以确保调用的安全性和准确性。系统通过调用 xinle_get_option 方法获取必要的鉴权信息,包括 secretId 和 secretKey,然后结合接口所需的核心配置参数(如 domain、version、action、region)进行签名生成。在签名的生成过程中,系统会对相关参数进行排序(ksort),并通过 base64_encode 方法对数据进行编码处理,最终生成符合腾讯云接口要求的签名信息。如果在签名生成过程中出现任何异常或失败情况,系统会立即返回对应的错误信息,以便开发者快速定位和解决问题,确保整体服务的稳定性与可靠性。
9、xinle_api_ocr_recognizeBizLicense 在成功获取前置信息后,会通过 curl_init 方法发起请求,并对相关参数进行初始化设置。随后,该接口将请求转发至腾讯云 OCR 服务,携带以下核心参数:第一,提前生成的签名,用于鉴权校验,确保请求的合法性和安全性;第二,待处理的目标图片地址,主要用于解析识别营业执照的具体信息;第三,公共参数集合,包括请求头、接口版本、时间戳等相关配置信息,以满足腾讯云接口调用的规范要求。在具体实现中,curl 的超时时间被设置为 30 秒,若在超时时限内仍未完成处理,系统会主动中断请求,以避免资源占用过久的情况发生,从而提升服务的稳定性与响应效率。
10、xinle_api_ocr_recognizeBizLicense 函数的执行流程: 1. 获取腾讯云API密钥 函数开始,先通过 xinle_get_option 获取腾讯云的 SecretId 和 SecretKey,用于API签名和鉴权。 2. 配置API相关参数 设置接口域名、API版本、接口名称(BizLicenseOCR,即营业执照OCR识别)、区域(ap-guangzhou)。 3. 参数校验 检查 $imageUrl 是否为空,如果为空,直接抛出异常,终止流程。 4. 构建公共参数 组装腾讯云接口所需的公共参数,包括: Action(接口动作名称) Version(接口版本) SecretId(API密钥ID) Timestamp(当前时间戳) Nonce(随机数,防止重放攻击) Region(区域) 5. 构建业务参数 组装实际业务参数(营业执照OCR识别接口只需要ImageUrl),可以根据需要增加其它参数。 6. 合并所有参数 将公共参数和业务参数合并为一个请求参数数组。 7. 生成签名 对参数数组按照键名进行升序排序。 拼接成参数字符串(key1=value1&key2=value2...)。 构造待签名字符串:POST + 域名 + / + ? + 参数字符串。 使用 secretKey 进行 HMAC-SHA1 加密,结果再用 base64 编码,生成签名。 将签名放入请求参数中。 8. 发送HTTP请求 使用curl初始化请求,目标地址为
11、针对营业执照识别功能的优化,重点考虑到该功能依赖外部API接口,因此可能面临多种失败原因。为提升系统的稳定性和容错性,特地在整个业务逻辑中新增了 try-catch 块,对所有可能的异常进行捕获与处理。同时,为避免因密钥未配置导致的调用失败,新增了密钥验证步骤,从根源上规避此类问题的发生。在结果返回方面,统一设计了返回格式,包含 code、msg 和 data 三个字段:当识别成功时,code 值为 0,msg 显示“识别成功”,data 则包含接口返回的识别结果;当识别失败时,code 值为 1,msg 显示具体的错误信息,data 则为空数组。此外,错误信息的覆盖范围更加全面,涵盖了密钥未配置、参数错误、网络问题等多种可能的异常情况,确保问题能够被快速定位和解决。
Warning: Trying to access array offset on value of type bool in /www/wwwroot/www.acocoa.com/wp-content/module/public/function/acocoa/function/jinsom.php on line 163
拉黑 举报 打赏 回复767楼
1、新增用户自定义字段 points(消费积分),该字段用于记录用户在平台消费后所累积的积分,积分单位为1:1,即消费金额与积分比例为1:1。积分支持小数点精度,计算时按照消费金额直接累加,返回时进行四舍五入处理,确保显示数据的简洁性与准确性。比如,当账户积分为200,用户完成一笔金额为30.3元的消费后,累计消费积分将更新为230.3分;在调用或展示积分时,系统会对结果进行四舍五入处理,显示为230。
2、新增方法 xinle_is_level_config,用于根据用户的消费积分获取其对应的消费等级配置。该方法需要传入 user_id 参数,并通过用户的 UID 查询相关数据。具体实现流程如下: 方法逻辑: 查询等级配置: 调用 xinle_get_option 方法获取后台的等级配置信息。如果未能成功获取配置,则直接返回 false,表示无法获取等级数据。 获取用户积分: 读取用户的 points 字段以获取当前消费积分。如果积分读取失败,则默认将积分设置为 1,以确保流程继续执行。 匹配等级配置: 遍历等级配置数据,找到与用户当前积分相匹配的等级范围,并返回对应的等级配置。 处理异常情况: 如果未能匹配到任何等级配置,则返回一个空数组,表示用户的积分未能满足任何等级要求。
3、新增数据表:xinle_points_notes(用户消费积分变化数据表),字段结构如下:id(记录 ID): 主键字段,自动递增,唯一标识每条记录。 user_id(用户 ID): 关联系统用户的唯一标识,便于跟踪具体用户的积分变动情况。 status(操作类型): 操作类型字段,用于标识当前记录是增加积分(add)还是减少积分(cut)。 number(积分数量): 记录积分的变动数量,始终为正数。具体是增加还是减少由 status 决定。 remark(操作备注): 操作的备注信息,记录积分变动的原因或说明(如“完成订单奖励积分”或“订单退款扣除积分”)。 type(来源类型): 表示积分变动的来源类型,支持以下枚举值: order:积分变动来源于订单(如下单奖励、退款扣减等)。 activity:积分变动来源于活动(如签到奖励、抽奖活动等)。 other:其他来源类型,可根据实际需求扩展。 order_id(关联订单号): 如果积分变动与订单相关,则记录关联的订单号;如果与订单无关,则保持为空。 time(操作时间): 记录积分变动的具体时间,便于后续统计和查询。
4、数据表xinle_points_notes具备如下特性:高效查询: 为 user_id 创建索引,可快速查询某用户的所有积分变动记录。 为 type 创建索引,便于按来源类型进行统计。 为 order_id 创建索引,便于通过订单号快速定位积分变动记录。 数据完整性: 使用枚举类型约束 status 和 type 字段,确保数据合法性。 积分数量始终为正数,避免负值逻辑混乱。 灵活性: 支持多种来源类型,方便后续扩展(如新增来源类型 promotion 等)。 备注字段允许自定义说明,增强记录的描述性。 扩展性: 可根据业务需求增加字段,例如添加操作人 ID(记录是谁执行了积分变动)。 如果未来需要更多类型或来源,可扩展 type 枚举值。
5、xinle_is_level_config方法优化,新增了经验百分比计算逻辑,通过 (当前积分 - 等级起始积分) / (等级上限积分 - 等级起始积分) * 100% 计算进度 处理了等级区间为 0 的特殊情况(避免除以零错误),此时直接返回 100% 使用 max(0, min(100, $percent)) 确保百分比始终在 0-100 之间 用 round($percent, 2) 保留两位小数,使结果更直观 新增的 percent 字段将包含在返回的等级配置中,直接反映当前等级的完成进度。
6、我的页面现在会通过 xinle_is_level_config 动态获取用户当前消费等级的配置信息,并在头部页面中直观展示用户的消费情况。页面设计包括以下内容:首先,通过清晰的文字显示用户的消费等级,让用户快速了解自己的当前身份,例如“青铜采购”“白银采购”等;其次,采用进度条的形式展示用户消费经验的百分比,进度条设计结合消费等级的配色方案,确保视觉效果与等级标识一致,既美观又直观。此外,消费标识的颜色标记会与用户当前的消费等级相匹配,通过背景色和文字色的合理搭配增强辨识度与视觉层次感。
7、我的页面目前通过 xinle_is_profile 接口获取用户的详细资料信息,并结合内置字段对用户的认证状态进行判断。具体展示逻辑如下:系统会判断用户是否已完成实名认证,如果用户已实名,则在页面中清晰地显示“已实名”的标识,增强用户信任感;如果用户尚未实名,则会提示“未实名”,以便提醒用户尽快完成认证流程。此外,页面还会判断用户是否拥有认证图标,若用户具备认证图标,该图标将直接展示在用户头像区域,与头像结合形成一体化的视觉效果。
8、后台新增了 xinle_profile_tab_config 配置组,用于灵活管理和生成我的页面功能菜单。通过该配置组,页面的功能菜单可实现动态构建,并支持二级菜单的结构扩展,具备无限添加功能菜单的能力。每个子菜单包含多个字段参数,以满足不同的定制化需求。具体字段参数包括:name,用于定义菜单名称,字数限制在四个字以内,确保简洁明了;key,作为菜单的唯一标识,便于系统精准定位和管理;onclick,用于设置菜单的点击事件,可关联具体操作逻辑;icon,用于图标的个性化设置,增强菜单的视觉表现力;color,用于定义菜单的背景颜色,使菜单风格更加多样化且符合整体设计需求。通过该配置组的灵活性和可扩展性,页面功能菜单的管理变得更加高效,同时也能满足不同场景的个性化定制需求,进一步提升用户体验。
9、xinle_profile_tab_config 配置组新增了两个权限控制功能,以进一步增强菜单管理的灵活性和安全性: 一级主菜单容器权限控制:支持设置为仅管理员可见。启用该选项后,如果用户身份不是前台管理员或超级管理员,则无法查看或访问该主菜单。这一功能能够有效保障敏感功能的权限分级,避免普通用户误操作或访问不必要的功能模块。 二级子菜单启用状态设置:允许对二级子菜单进行启用或禁用的操作。如果某些功能需要临时停用,可以通过该配置轻松关闭对应的子菜单,无需删除或修改核心代码,随时恢复使用。这一功能为菜单的动态管理提供了便利,适合应对功能迭代或特殊场景需求。 通过这两个权限配置的新增,xinle_profile_tab_config的功能更加完善,既满足了管理员对权限管控的需求,又提升了菜单管理的灵活性,确保系统运行更加安全、高效。
10、在我的页面底部区域新增了一个 帮助与支持中心 模块,用于集中展示与用户使用相关的辅助功能。该区域包含以下内容:APP使用帮助、意见反馈、客服中心等功能菜单,旨在为用户提供便捷的服务入口,帮助用户快速查找和解决问题。通过将这些功能集中在底部区域,用户可以更轻松地定位到相关支持服务,无需在页面中反复查找,提高了用户体验。同时,这一设计也为平台与用户之间的沟通搭建了高效桥梁,方便用户反馈问题、获取帮助或联系客服,进一步增强了产品的服务性与用户粘性。
11、为了实现灵活的扩展性,帮助与支持中心采用后台配置的方式进行管理。新增了一个字段:xinle_profile_tab_help_config,用于支持模块的动态配置。字段设计如下:name:菜单名称,用于展示在页面上的具体功能名称,例如“常见问题与使用指南”。key:唯一标识,每个菜单项必须具备独立的标识符,便于后台数据管理和前端调用。content:描述文字信息,简要介绍菜单功能或内容,帮助用户快速了解该选项的用途,例如“提供常见问题解答及操作指南”。icon:对应的图标,支持使用FontAwesome图标组,提升菜单的视觉表现力,使用户能够快速识别功能。onclick:点击事件,用于定义用户点击菜单项时的具体交互行为,可触发页面跳转、弹窗提示或其他交互逻辑,确保功能的便捷性和可操作性。
Warning: Trying to access array offset on value of type bool in /www/wwwroot/www.acocoa.com/wp-content/module/public/function/acocoa/function/jinsom.php on line 163
拉黑 举报 打赏 回复766楼
1、新增方法:build_customer_service_member_html,构建客服团队成员HTML。整个执行流程如下:1. 获取成员基础信息 从 $member 数组中提取以下字段: name:成员名称。如果为空,则使用默认值(空字符串)。 desc:职位描述或个人简介。如果为空,则使用默认值“客服专员”。 user_id:用户 ID,用于获取详细信息。如果为空,则跳过相关用户详细信息处理逻辑。 phone:联系电话。如果为空,则使用默认值(空字符串)。 2. 获取用户详细信息 如果 user_id 不为空,执行以下操作: 调用函数 xinle_is_profile($user_id) 获取用户详细信息,包括: verify_html:认证图标 HTML。 avatar 或 avatar_url:用户头像。 调用函数 xinle_is_online($user_id) 检查用户是否在线,返回在线状态。 3. 处理用户头像 根据以下优先级决定显示的头像: 如果用户详细信息中有 avatar,则使用用户头像。 如果用户详细信息中有 avatar_url,则使用头像 URL。 如果没有头像,则使用系统配置的默认头像: 调用函数 xinle_get_option('xinle_security_login_avatar_default') 获取默认头像。 如果配置为空,使用预定义的系统默认头像路径。 4. 构建 HTML 结构 按照以下层级生成 HTML: 成员卡片容器:整体卡片容器 <div class="team-member-card">。 成员头部:包含头像、认证图标、成员姓名和职位描述。 头像:显示成员头像或姓名首字母(默认头像)。 认证图标:显示认证图标(如果有)。 职位描述:显示成员职位或默认文本“客服专员”。 折叠图标:用于展开或收起详细信息的图标。 成员详细信息(默认隐藏):包含以下内容: 职位描述:显示成员描述(如果有)。 联系方式: 电话:显示电话,并提供拨号链接。
2、返回的客服名单 HTML 页面集成了微信功能和在线状态,具体实现流程如下: 在通过 build_customer_service_member_html 方法获取用户相关信息时,系统会提取以下字段用于构建页面内容: weixin:用户的微信号。 weixin_image:微信二维码图片,用于展示用户的微信二维码。 构建微信功能部分 当 weixin_image 字段不为空时,系统会动态生成包含微信二维码的 HTML。页面会提供一个按钮(如“查看微信二维码”),用户点击后即可弹出微信二维码图片,方便扫码添加好友或进行交流。 在线状态指示器 为了实时反映客服的在线状态,系统会调用 xinle_is_online($user_id) 方法,根据传入的用户 ID 检查该用户当前是否在线。随后,系统会根据检查结果动态生成在线状态指示器的 HTML: 如果用户在线,显示绿色指示器,并标注“在线”状态。 如果用户离线,显示灰色指示器,并标注“离线”状态。
3、客服中心新增监听器 bindCollapseEvents,用于实现客服列表的折叠与展开逻辑。该监听器的核心功能是根据用户的操作动态控制列表卡片的展开状态,同时确保当前操作的卡片在页面中完全可见,并在必要时触发滚动处理。 功能描述 折叠逻辑:当用户点击某个客服卡片时,系统会检查该卡片的当前状态: 如果卡片已展开,则将其收起。 如果卡片处于折叠状态,则收起所有其他已展开的卡片,同时展开当前卡片。 滚动处理:在展开当前卡片后,系统会检查该卡片是否完全可见。如果卡片的部分内容被遮挡,则延迟 300 毫秒将其滚动到页面的可见位置,确保用户能够完整查看展开的内容。
4、客服中心中,每位客服对应的展示区域提供了三个功能菜单,分别是“在线交流”、“拨打电话”和“微信”,旨在满足用户的不同沟通需求。以下是具体功能描述及实现方式:在线交流: 功能描述:点击“在线交流”后,调用 xinle_open_chat 方法,进入与对应客服的聊天会话窗口。用户可以通过该窗口进行实时在线沟通,也可选择留言方式,方便处理异步交流。 实现逻辑:xinle_open_chat 方法需要接受当前客服的唯一标识(如客服 ID)作为参数,以确保跳转到正确的会话窗口。拨打电话: 功能描述:点击“拨打电话”后,通过 tel: 协议触发系统拨号功能。部分设备会弹出拨号确认提示,部分设备(如部分手机)会直接跳转至拨号界面,自动填充客服的电话号码。 实现逻辑:电话号码需要动态绑定到 tel: 协议的链接中,以确保拨号目标的准确性。微信:功能描述:点击“微信”后,通过内置方法弹出包含客服微信好友二维码的图片弹窗。用户可以通过扫描二维码添加客服微信好友,便于进一步沟通。
5、在微信图片弹出时,为了提升用户体验,新增了一个“保存图片”按钮,位于微信二维码图片的下方,方便用户直接保存二维码至本地。用户点击该按钮后,会触发 saveWechatImage 监听器,通过获取当前二维码图片的地址,调用 xinle_download_image 函数实现图片的保存功能。
6、针对客服中心和问答教程中心页面,为了优化用户体验,在页面初始化和交互逻辑上进行了以下调整:初始化时不再触发 $f7.preloader.show() 加载指示器,同时在页面刷新或后退返回时,也不会重新加载请求数据。由于这两个页面的交互元素较少,数据加载的实时性需求不高,因此可以避免不必要的资源消耗和重复请求,从而提升页面的响应速度和操作流畅性。
7、在客服列表中心页面的初始化逻辑中,通过调用 xinle_api_post 获取数据后,将执行一系列处理流程,以确保页面功能正常运行并提升用户体验。具体逻辑如下: 当成功获取到初始化页面数据后,将依次执行以下步骤: 绑定折叠事件(bindCollapseEvents): 为页面中的可折叠区域绑定事件,确保用户能够通过点击展开或收起相关内容区域。 此功能可以优化页面布局,使信息呈现更加简洁,同时提升用户操作的便利性。 显示客服团队信息: 在数据加载成功后,将页面中的客服团队信息动态渲染到对应的展示区域。 确保内容展示清晰、完整,方便用户查看相关信息。 绑定图片加载错误事件(bindImageErrorEvents): 针对页面中的客服头像或团队图片,绑定错误处理事件。如果图片加载失败,将自动替换为默认占位图或提示用户图片无法显示。
8、在消息页面的右上角新增了一个名为“在线客服”的按钮,用户点击该按钮后,将跳转至 客服中心页面(customer_service_team),以便用户可以更快捷地获取帮助和支持。这个功能的设计旨在提升用户体验,方便用户随时联系在线客服,解决问题。用户在注册成功时,系统会默认向用户发送一封站内信。这封站内信通常包括欢迎信息、平台使用指南以及客服联系方式等内容,旨在帮助用户快速熟悉平台的基本功能。然而,为了让用户在后续使用中能够更方便地获取帮助,“在线客服”按钮的引入使得用户即便未保存站内信或需要更进一步的支持时,也能通过消息页面快速访问客服中心,获取更多帮助。
9、在问题中心页面的右上角新增一个“投诉”按钮,用户点击该按钮后,将触发一个弹出对话框,展示投诉或合作联系的相关信息,包括联系人、手机号以及地址等内容,方便用户快速获取投诉或合作联系的渠道。弹出层支持点击遮掩层进行关闭,也支持内部按钮按钮进行关闭处理。
10、对“我的页面”进行重构设计,将现有页面模板 view_profile 推到重构处理。新版“我的页面”模板将支持展示更多、更完整的内容,优化用户体验,并实现功能模块的高效整合与布局。新版页面将包含常用工具、交易订单、帮助与支持等板块,满足用户多样化需求,提升页面信息的全面性和功能的实用性。
11、后台用户中心新增字段配置组:xinle_user_lv_config,用于平台账户等级配置。根据用户交易实付款(完成交易)计算经验值,达到区间后自动升级,该配置组包含的字段信息包括:name:等级名称、key:唯一标识:color:对应的等级颜色标识、sort:权重数值越小越靠前(如1=铜牌,2=银牌)。initial:起始经验值m包含当前值(如等级1填0),需与上一等级的「上限经验值」严格衔接。highest:上限经验值:不包含当前值(如等级1填1000,代表0≤经验<1000),最高等级可填0表示无上限。
Warning: Trying to access array offset on value of type bool in /www/wwwroot/www.acocoa.com/wp-content/module/public/function/acocoa/function/jinsom.php on line 163
拉黑 举报 打赏 回复765楼
1、新增方法:xinle_help_tutorial_list,该方法用于查询指定分类下的文章列表,支持分页功能,并按照发布时间降序排列(即最新的文章显示在最前面)。具体实现逻辑如下: 方法功能: 通过提供的 WordPress 分类ID,查询该分类下的所有文章。 支持分页功能,通过传入页码参数实现按页加载文章。 查询结果按文章的发布时间从新到旧排序,确保最新发布的文章优先显示。 方法参数: $category_id:分类ID,必填参数,用于指定查询的文章分类。 $page:页码,可选参数,默认为1。如果未传入页码,则默认查询第一页内容。 返回结果: 查询成功且有数据时,返回一个包含文章信息的数组。 查询失败(如分类ID不存在)或无数据时,返回 false。
2、新增方法:xinle_get_category_name($category_id),获取分类名称。传递对应的 $category_id 分类ID,获取分类名称。如果获取失败则直接返回论坛列表。在列表页,会在头部标题区域显示论坛名称,方便用户区分当前所处的位置的。因此后端需要封装一个方法来获取对应的名称。
3、新增方法:xinle_get_excerpt获取文章摘要。需要传递两个变量:$content 文章内容,$length 摘要长度(默认100)。返回对应的文章摘要。该方法的处理流程如下:首先通过wp_strip_all_tags来去除html字符串,然后通过preg_replace去除所有的空格,最后mb_substr使用进行截断字符串处理。
4、help_tutorial_list_initialization分页请求已完成封装处理:当用户进入问答论坛的分类列表页的时候,会依次执行以下处理:接收参数 接收两个参数: category_id:文章分类的 ID。 page:分页页码。 如果 category_id 为空或非法,返回错误提示并终止执行。 2. 获取分类信息 根据 category_id 获取分类名称,并将其存入结果中($result['category_name'])。 3. 获取文章列表 调用 xinle_help_tutorial_list 方法,根据 category_id 和 page 获取文章列表数据。 4. 检查文章列表 如果文章列表为空,返回不同的提示: 如果是第一页,显示“暂无问答教程”的占位内容。 如果是其他页,显示“没有更多内容”的占位内容。 5. 配置分页数量 获取每页显示的文章数量(默认 10),并确保其值大于等于 1。 6. 生成文章 HTML 遍历文章列表,生成对应的 HTML 内容: 文章标题:通过 esc_html 转义后输出。 文章摘要:调用 xinle_get_excerpt 截取文章内容的前 80 个字符。 最后更新时间:格式化文章的最后修改时间为“年-月-日”。 浏览量:获取文章的浏览次数(views)。 每篇文章生成一个完整的 HTML 结构,追加到 $html 中。 7. 返回结果 将生成的 HTML 存入 $result['html']。 设置返回状态为成功($result['code'] = 0)。 设置返回信息为“获取成功”($result['msg’])。
5、后台新增字段:xinle_customer_service_team_config,该字段用于配置客服团队成员的详细信息,便于管理和展示客服团队成员的相关资料,同时方便用户与客服进行在线沟通或联系。具体字段及功能说明如下:字段名称:xinle_customer_service_team_config,用于存储客服团队成员的配置信息。包含字段及说明:员工名称:字段类型:字符串说明:记录客服团队成员的姓名,便于识别和展示。唯一标识:字段类型:字符串说明:每位客服成员的唯一标识符,用于系统内部区分不同成员,确保数据的唯一性。描述信息:字段类型:文本说明:存储该成员负责的职责详情或相关描述,例如负责的服务范围、专业领域等。方便用户了解该成员的职责分工。站内UID:字段类型:整数说明:对应系统内的用户ID,方便进行站内在线沟通或交易。手机号:字段类型:字符串说明:记录客服成员的联系手机号,方便用户通过电话联系。微信号:字段类型:字符串说明:存储客服成员的微信号,便于用户通过微信添加好友联系。微信图片:字段类型:图片上传字段说明:用于上传客服成员的微信二维码图片,方便用户保存图片后通过扫码加好友。
6、在前端xinle对象中新增属性:customer_service_team,通过js_css脚本将后台的客服团队成员信息集成到xinle对象中,前端页面可直接读取此配置属性进行展示或操作,从而减少后端API交互,优化加载性能和用户体验。具体实现及说明如下:新增属性:customer_service_team,用于存储后台配置的客服团队成员信息,前端直接通过xinle.customer_service_team访问。
7、前端新增页面:customer_service_team:APP客服团队成员名单列表,该页面旨在展示平台的客服团队成员信息,包括成员的姓名、职责、联系方式等内容,用户可以通过页面提供的方式直接与客服人员联系。页面对所有用户开放,包括未登录的游客。模板文件存储路径为:customer_service/customer_service_team.html,该文件将定义页面的结构和样式,并通过集成的xinle.customer_service_team属性动态加载数据。
8、后台客服中心配置新增3个字段,用于完善客服中心的信息展示及页面调用。这三个字段分别是: xinle_support_company_desc:客服中心描述简介 功能:用于描述客服中心的服务宗旨或功能介绍,帮助用户快速了解客服中心的定位和服务范围。 示例内容:使用过程中,遇到问题都可以与我们取得联系。 应用场景:该字段主要用于前端页面展示,作为客服中心的简介文本,便于用户了解如何与平台联系。 字段类型:字符串类型,支持中英文内容输入,最大长度建议为255字符。 xinle_support_work_time:我们的工作时间 功能:用于展示客服团队的工作时间信息,方便用户在合适的时间与客服人员取得联系。 示例内容:周一至周五 9:00 - 18:00 应用场景:该字段可在客服相关页面或通知中调用,帮助用户明确平台客服的服务时间,避免用户在非工作时间联系时产生误解。 字段类型:字符串类型,支持时间段描述,最大长度建议为100字符。 xinle_support_company_address:公司的详细地址 功能:用于存储公司的办公地址信息,便于用户在需要线下联系或寄送文件时获取具体地址。 示例内容:北京市朝阳区望京街道XX大厦XX楼XX室 应用场景:该字段将在部分页面(如“关于我们”页面或客服信息展示页面)调用,帮助用户了解公司的实际位置。 字段类型:字符串类型,支持详细地址输入,最大长度建议为255字符。
9、customer_service_team团队页面模板结构设计如下,旨在全面展示客服团队信息,同时提供便捷的功能入口,提升用户体验:页面结构说明:头部区域内容展示:显示客服中心的工作时间和描述简介,直接读取后台配置的字段内容。设计思路:头部区域作为页面的引导部分,需简洁明了,突出平台服务宗旨,帮助用户快速了解客服中心的服务时间及功能。动态数据来源:后台配置字段xinle_support_work_time和xinle_support_company_desc。正文区域内容展示:从后台读取配置,动态展示平台的客服团队名单列表,包括客服人员姓名、职务、联系方式等信息。设计思路:正文区域是页面的核心部分,通过清晰的列表展示客服团队信息,方便用户快速找到对应的联系人。动态数据来源:后台数据库中存储的客服团队信息,可通过API接口或直接读取数据表内容。
10、在展示客服团队名单时,为了优化页面空间利用率和用户体验,采用收缩设计(手风琴式布局)。在初始状态下,仅显示客服头像、姓名和单行描述,超出部分以省略号形式呈现。用户可通过手风琴开关展开完整信息,包括客服的详细描述、在线聊天入口、手机号等内容。页面设计说明:初始状态展示内容显示:客服头像、姓名、单行描述(超出部分以省略号形式显示)。设计思路:初始状态下简洁直观,减少页面占用空间,用户可以快速浏览客服名单。展开状态展示内容显示:客服的完整描述信息、在线聊天入口(如“立即沟通”按钮)、手机号等。设计思路:通过手风琴开关交互,用户可根据需求查看详细信息,避免信息冗余。
11、在进入客服团队页面时,系统会执行一个初始化动作:customer_service_team_initialization,其核心流程如下: 系统会通过调用配置接口 xinle_customer_service_team_config 来读取客服名单列表,并对返回的原始数据进行解析处理。同时,会读取客服中心的相关字段信息(如标题、描述、菜单配置等),以动态生成页面内容。初始化完成后,系统会构建页面的 HTML 结构,具体包括以下几个部分: 头部信息区域 包含页面标题(如“客服团队”)、简要介绍或说明,旨在帮助用户快速了解页面功能。 服务菜单区域 提供快捷导航功能,包括“反馈中心”、“问答中心”等常见服务入口,便于用户快速切换到其他服务模块。 客服团队容器 该容器是页面的主要展示区域,包含客服团队标题及成员列表。标题区域可展示团队名称或简介,成员列表则动态展示所有客服的基本信息。 客服团队成员列表 列表内容基于解析后的客服数据动态生成,初始状态下展示客服头像、姓名及单行简要描述;展开后可查看详细信息(如在线聊天入口、手机号等)。
Warning: Trying to access array offset on value of type bool in /www/wwwroot/www.acocoa.com/wp-content/module/public/function/acocoa/function/jinsom.php on line 163
拉黑 举报 打赏 回复764楼
1、新增了API接口和模板目录 customer_service,该模块专为客服售后中心设计,旨在统一管理与用户沟通、问题求助及反馈处理相关的所有页面与功能。凡是涉及到客服沟通的媒介、用户问题反馈的处理流程,均通过此目录进行集中管理,确保逻辑清晰、维护便捷。 现有的服务中心功能也已全面迁移至 customer_service 模块,包括所有响应的接口调用,形成统一的管理架构。通过此模块的整合,不仅提升了开发与维护的效率,还为后续功能的扩展提供了更高的灵活性。 需要特别注意的是,所有与用户沟通相关的媒介(如在线客服、问题反馈、工单处理等)均依赖此模块进行调用。
2、在客服中心的配置页面中,新增了一个字段:xinle_problem_help_bbs_id(问题教程分类ID),用于指定客服中心读取的文章列表所对应的论坛分类。通过该字段配置,客服中心展示的所有文章内容均来源于指定的论坛分类,以确保内容的统一性与规范性。需要特别注意的是,该字段配置的必须是父级论坛分类ID,不能直接使用子论坛分类ID。这样设计的目的是为了确保客服中心能够准确调用该父级分类下的所有子分类内容,从而实现更全面的文章覆盖,避免遗漏或调用范围过窄的情况。
3、新增方法:xinle_problem_help_cousult,用于查询指定分类下的文章列表。该方法通过传入WordPress分类ID(即 bbs_id),实现对该分类下文章的精准检索,同时支持分页和搜索功能,提供更灵活的查询方式。 具体功能说明如下: 分类查询:根据提供的分类ID(bbs_id)检索对应分类下的文章,确保数据来源的准确性。 分页支持:通过参数 $page 控制分页功能,默认值为 1,方便处理大规模数据时的分段展示。 搜索功能:支持通过 $search 参数输入搜索关键词,默认值为空。搜索时优先匹配文章标题,若标题中无匹配内容,则进一步匹配正文内容,以确保搜索结果的精准性。 排序规则:所有查询结果按照文章的发布时间升序排列(即先发布的文章排在前),以便用户能够按时间顺序浏览内容。 返回值:成功查询
4、xinle_problem_help_cousul,完成封装处理:整个执行流程如下:初始化:声明 WordPress 数据库全局变量,处理输入参数(页码转为正整数、搜索词去空格)。 配置获取:读取每页显示数量(默认 10),计算分页偏移量,获取并验证分类 ID(无效则返回 false)。 构建查询:基础 SQL 关联文章表与分类关系表,筛选指定分类的已发布文章;有搜索词时添加标题 / 正文模糊匹配条件(标题匹配优先),按发布时间升序排序;无搜索时直接按发布时间排序。 执行查询:添加分页限制,预处理 SQL(防注入)并执行,获取结果。 结果处理:有有效文章数组则返回数组,否则返回 false。
5、问答中心页面集成了 xinle_infinite_hook 事件,旨在实现分页加载问题列表的功能。页面在用户访问时,会自动触发初始化加载,向对应的 API 接口发起查询请求以获取数据,提升用户体验和内容展示的效率。 具体功能描述如下: 自动初始化加载:当用户首次访问问答中心页面时,系统会主动触发事件,通过 API 接口查询当前页的问题列表,确保页面能够在加载时直接展示内容,无需用户额外操作。 分页处理:在请求过程中,系统会通过内置方法动态获取当前页码,并在数据返回后对页码进行更新处理,确保分页逻辑的准确性和连续性,避免数据重复或遗漏。 下拉滚动加载扩展:页面集成了下拉滚动加载的扩展功能,用户在浏览页面时可以通过向下滚动触发事件,自动加载更多问题列表,进一步增强用户浏览的流畅性和交互体验。 数据请求与展示:每次加载都会通过 API 查询最新的分页数据,并将结果动态渲染到页面,确保内容的实时性与完整性。
6、xinle_infinite_hook 新增了一个状态标记(status),用于区分页面数据请求的不同来源,包括初始化加载(pageInit)和下拉加载(infinite)。通过引入该状态标记,系统能够在内部执行分页加载时,根据请求来源精准验证并匹配对应的业务逻辑,从而确保数据处理的正确性与合理性。 具体功能描述如下: 状态标记区分加载类型:新增的 status 参数可以明确区分两种加载方式:初始化加载(pageInit)和下拉滚动加载(infinite)。这种区分使得系统能够在处理数据请求时根据不同场景执行相应的逻辑。 业务逻辑的差异化处理: 初始化加载(pageInit):当状态标记为 pageInit 时,系统会执行页面的初始数据加载逻辑,通常用于用户首次进入页面或刷新页面的场景。返回结果会以覆盖方式处理,即清空当前数据并重新填充最新内容,确保页面始终展示最新的完整数据。 分页加载(infinite):当状态标记为 infinite 时,系统会执行分页加载逻辑,通常用于用户滚动页面触发的加载场景。返回结果以填充方式处理,将新获取的数据追加到已有数据列表中,确保用户能够连续浏览更多内容。 请求来源验证:在内部执行分页加载时,系统会通过 status 标记验证请求的来源,从而确保每种加载方式对应的业务逻辑能够准确执行,避免逻辑混乱或数据处理错误。 数据处理灵活性:通过区分加载类型,系统能够针对不同的加载场景采取最适合的处理方式,不仅提高了数据加载的效率,还优化了用户浏览体验。
7、xinle_infinite_hook的大致处理流程如下:检查加载状态 如果是初始化加载(pageInit),重置页码为 1,允许加载。 如果当前正在加载(page_infinite === true),直接退出,避免重复加载。 准备请求参数 设置当前页码、加载状态和搜索关键词,作为请求参数。 显示加载动画 初始化加载时替换页面内容为加载动画。 下拉加载时在页面末尾追加加载动画。 发起数据请求 调用 API 获取分页数据,并等待返回结果。 处理返回数据 成功:更新页面内容(替换或追加),增加页码,允许继续加载。 失败:显示错误内容,禁止继续加载。 处理网络错误 如果请求失败,弹出错误提示,并允许重新加载。 移除加载动画 无论成功或失败,都移除加载动画。
8、problem_help 页面新增了搜索框功能,旨在提升用户查找问题的效率与便捷性。用户可以通过在搜索框中输入关键词(如“发票”),系统将根据输入内容检索问题分类中的相关数据,包括文章标题和正文内容,并将匹配结果返回到问题列表中。整个搜索流程和结果呈现经过精细化设计,支持多种场景的优化处理。 功能详情如下: 关键词检索:用户在搜索框中输入关键词后,系统会对问题分类中的数据进行深度匹配。匹配范围包括文章标题和正文内容,确保搜索结果覆盖尽可能多的相关内容。 结果优先级排序: 标题优先匹配:系统将优先返回标题中包含关键词的结果,这样可以帮助用户快速定位到主题明确的问题。 正文匹配补充:对于标题中未包含关键词的情况,系统会返回正文内容中匹配到关键词的结果,作为补充,以最大化搜索的有效性。 空结果提示:当用户输入的关键词未能匹配到任何内容时,系统会显示友好的错误提示,告知用户当前没有相关问题,避免用户产生困惑。 分页加载支持:为避免一次性加载过多数据造成页面性能问题,搜索结果支持分页加载。用户可以通过滚动或翻页逐步查看更多匹配内容,提升浏览体验。
9、problem_help 页面新增了防抖保护措施,旨在优化用户操作体验并有效减少频繁触发请求对系统资源的消耗。该功能主要应用于分页下拉加载和搜索输入框的实时查询结果返回,并通过设置不同的防抖保护时间,确保用户操作的流畅性与系统的稳定性。 功能详情如下: 防抖机制的应用场景: 分页下拉加载:当用户在问题列表页面进行下拉操作加载更多内容时,系统会启用防抖保护,设置保护期为400毫秒。在此时间内禁止重复触发API请求,避免因用户快速连续操作导致的重复加载问题。 搜索输入框实时查询:用户在搜索框中输入关键词时,系统会启用防抖保护,设置保护期为1秒。只有在用户停止输入并超过1秒后,系统才会触发API请求进行数据检索,防止频繁请求对服务器造成压力,同时减少不必要的查询。
10、前端新增了页面组件:help_tutorial_list,该页面是专门用于展示问题教程分类的列表页,主要功能是呈现当前分类下的所有教程文章。页面设计简洁直观,方便用户快速浏览和查找相关内容。具体实现细节如下: 页面功能与特点: 该页面用于展示某一问题教程分类下的所有文章,帮助用户快速了解该分类的内容。 页面支持游客访问,无需登录即可查看,提升了内容的可见性与传播性。 页面设计注重结构清晰和内容聚合,确保用户能够便捷地获取所需信息。 模版路径与调用方式: 模版文件路径为:bbs/help_tutorial_list.html。 页面访问时需要通过URL传递一个 ID 变量,该变量为论坛的分类ID,用于后台根据ID查询对应分类下的文章数据并返回给前端展示。
11、当用户进入 help_tutorial_list 页面时,系统会通过 pagenit 触发一个初始化加载请求,该请求的主要目的是获取当前页面传递过来的分类ID,并根据该ID加载对应分类下的论坛文章列表。具体实现逻辑如下: 初始化加载逻辑: 页面通过 pageInit 方法在加载时自动获取URL中传递的分类ID变量。 随后,调用前端定义的 xinle_help_tutorial_list_hook 方法,向后端发起数据请求,以加载当前分类下的文章列表。 请求的状态与区分: 请求参数中包含一个 status 标识符,用于区分不同的加载场景: 初始化加载(pageInit):当 status 标识为初始化加载时,系统会加载当前分类下的第一页文章数据,完成页面的初始渲染。 分页加载(infinite 下拉加载):当用户向下滚动页面并触发无限下拉加载时,系统会将 status 标识为分页加载,并加载当前分类下的下一页文章数据。 后端会根据 status 的值执行不同的业务逻辑处理: 初始化加载时,后端返回第一页完整的文章数据。 分页加载时,后端根据当前页码返回后续文章数据,避免一次性加载全部内容,提升页面加载性能。
Warning: Trying to access array offset on value of type bool in /www/wwwroot/www.acocoa.com/wp-content/module/public/function/acocoa/function/jinsom.php on line 163
拉黑 举报 打赏 回复763楼
1、论坛内容页的模块页面展示层级设计如下:首先是页面的头部区域,默认显示“论坛中心”作为占位标题,待后端返回具体参数后,动态更新为论坛的真实名称,以确保页面信息的准确性和一致性。接下来是标题正文部分,该区域用于展示文章的主标题,初始状态为空,待后端处理并返回数据后进行内容填充,以提供用户所需的核心信息。第三部分是副标题区域,包含文章的浏览总量、作者名称以及具体的发布时间(年月日),这些信息不仅能增强文章的可读性,还为用户提供了内容的背景和来源,提升页面的整体信息价值。最后是正文内容区域,该部分负责展示文章的详细内容,输出经过转义处理的 HTML 实体,以确保内容的正确渲染和安全性。页面初始状态下,正文内容会显示加载图标,提示用户正在获取数据,当后端返回完整的内容后,页面会自动更新相关元素,动态展示文章的完整信息。
2、新增系统接管函数:xinle_wrap_images_with_custom_fancybox,旨在为文章正文中的图片自动添加 Fancybox 灯箱效果。该函数采用全局接管的方式,确保所有文章中的图片都能统一实现灯箱功能,其执行流程如下:首先,通过过滤器介入文章正文的处理流程,接收并解析原始的正文内容。为了确保每篇文章中的图片能够正确分组显示灯箱效果,系统会优先使用文章的唯一 ID 作为灯箱组的标识。如果文章 ID 不存在,则生成一个随机数作为组标识,以保证灯箱分组的独立性和唯一性。
接下来,函数会匹配正文中所有的 <img> 标签,逐一对图片进行处理。处理流程包括以下几个步骤:从图片标签中提取图片的地址,去除可能存在的缩略图参数,从而获取图片的原图地址;为图片添加一个名为 chat_image 的自定义类,用于后续样式控制;然后,用一个带有灯箱属性(data-fancybox)的 <a> 标签将图片包裹起来,同时为 <a> 标签添加 link external 类以及居中的样式,以确保图片链接具备良好的视觉效果和交互体验。最终,函数会返回经过处理后的正文内容,其中所有图片均被自动赋予了灯箱功能。通过这种方式,文章中的图片不仅能够支持放大查看,还具备分享和下载的功能。
3、前端新增方法 xinle_load_script,这是一个动态加载 JavaScript 脚本的工具函数,旨在为特定页面按需加载对应的 JS 脚本,以实现灵活高效的资源管理。某些页面可能需要集成特定的 JS 脚本来处理对应的业务逻辑,但如果在页面初始化时直接加载所有可能的脚本,不仅会显得笨重,还会对页面性能造成一定的影响。因此,xinle_load_script 的引入,可以实现脚本的动态按需加载,优化页面资源的使用。
4、xinle_load_script 方法拥有四个关键变量和一个返回值,设计简洁而实用,能够满足动态加载脚本的各种需求,具体说明如下: url(必填):脚本的 URL 地址,用于指定需要加载的 JavaScript 文件的路径。该参数是方法的核心,决定了要加载的脚本资源。 id(必填):脚本标签的唯一标识 ID,用于避免重复加载相同的脚本。通过设置唯一的 ID,可以确保同一个脚本不会被重复插入到页面中,这不仅优化了资源管理,还避免了潜在的逻辑冲突。 position(可选,默认值 'body'):脚本插入的位置。支持两个值:'header'(插入到页面的 <head> 中)和 'body'(插入到页面的 <body> 中)。默认值为 'body',通常用于脚本加载不会阻塞页面渲染的场景;而当脚本需要优先加载或依赖某些头部资源时,可以选择 'header'。 callback(可选):脚本加载成功后的回调函数。当脚本加载完成后,可以通过此回调函数执行后续逻辑,比如初始化某些功能或触发相关事件。该参数提供了灵活的扩展性,方便开发者根据业务需求进行定制化处理。 返回值(Promise 对象):方法的执行结果是一个 Promise 对象,支持现代的 async/await 语法,便于异步操作。通过返回 Promise,开发者可以更方便地控制脚本加载的流程,例如等待脚本加载完成后再执行后续逻辑,从而进一步提升代码的可读性和可维护性。
5、xinle_load_script的执行流程机制如下:参数校验: 检查是否提供了 url 和 id。 如果缺少必填参数,打印错误信息并返回失败。 检查是否已加载: 通过 id 查找是否已有相同脚本。 如果已加载,直接执行回调并返回成功。 动态加载脚本: 创建一个 <script> 标签,设置脚本地址(src)和唯一标识(id)。 监听加载成功(onload)或失败(onerror)事件。 兼容旧浏览器(如 IE)通过 readyState 检测状态。 插入到页面: 根据 position 参数选择插入到 <head> 或 <body>。 默认插入到 <body>。 返回结果: 使用 Promise 支持异步调用: 加载成功时,resolve()。 加载失败时,reject()。
6、新增页面:problem_help,作为客服问答中心,旨在为用户提供便捷的帮助与问题解答。页面的模板文件路径为 settings/problem_help.html,此页面对所有游客开放,无需登录即可访问,提升了平台的友好性与服务可及性。页面的主要功能是汇总平台所有的相关问题,并进行集中展示,方便用户快速浏览和获取所需信息。同时,页面还将提供一个功能强大的搜索控件,允许用户通过输入关键词来精准查找相关问题。这一功能不仅提高了用户查找信息的效率,还为用户解决问题提供了更直观的路径。此外,该页面将与问题教程论坛进行关联,确保内容的统一性和分类的精准性。后续从后台读取的问题列表将受到分类的限制,仅展示与指定分类相关的问题。这种设计既能保证内容的针对性,又避免了信息的冗杂,使用户能够更专注于自己关心的问题领域。
7、后台新增字段配置:xinle_problem_help_btn_config,此字段用于问答中心页面头部菜单功能的动态管理与配置。通过该字段,管理员可以灵活定义页面顶部菜单的各项内容,为用户提供直观且便捷的导航入口,提升问答中心的功能性与交互体验。 字段具体包含以下配置项: name:菜单名称,用于展示在页面头部菜单栏中,支持自定义文本内容。例如:支付问题、账户安全等,方便用户快速识别菜单功能。 key:KEY标识,作为菜单的唯一参数值,用于后台逻辑处理或前端页面的精准定位。每个菜单项都需要配置一个唯一的 key 值,以确保不会出现重复或冲突。 onclick:页面操作事件,支持通过 onclick 方法实现功能触发。此字段允许管理员定义菜单点击后的具体行为,例如跳转到对应的分类页面、触发搜索操作或执行其他相关功能,增强菜单的动态交互能力。 icon:图标名称,用于在菜单项中展示对应的图标,支持 FontAwesome 图标库。管理员可以根据菜单内容选择合适的图标进行配置,例如 fa-credit-card(支付图标)、fa-lock(安全图标)等,使菜单更加直观且美观。
8、问题教程分类新增了四个子分类,旨在更细致地归纳和整理用户可能遇到的各类问题,以便用户能够快速定位到所需的帮助内容。这四个子分类具体如下:账户相关(3):该分类主要负责汇总与账户信息相关的一系列问题,包括但不限于修改密码、绑定手机号、解除风控冻结等账户信息的变更与异常处理。通过此分类,用户可以便捷地找到与账户管理和安全相关的解决方案,确保账户的正常使用。交易售后(4):此分类涵盖从支付环节到售后服务的各类问题,包括支付失败、退款流程、运费结算等交易中可能出现的情况。通过该分类,用户能够快速了解交易中每个环节的处理方式,及时解决售后纠纷和资金相关问题。认证资质(5):该分类专注于账户资质与认证相关的内容,主要包括资质过期处理、账户实名认证、资质信息更新等问题。该分类的设置有助于用户在资质审核和维护过程中获得清晰的指引,确保账户资质符合平台要求。其它问题(6):该分类用于汇总不属于上述分类的杂项问题,覆盖范围更广,解决一些相对零散但同样重要的用户需求。通过该分类,用户可以找到一些难以归类的问题的处理方式,确保所有问题都能得到妥善解决。通过新增这四个子分类,平台的问答教程体系得以更加清晰和全面地覆盖用户可能遇到的各类问题,
9、前端 xinle 对象新增了一个属性:problem_help_config,该属性主要用于配置问答中心的客服服务菜单入库口功能。通过集成该属性,开发者可以直接通过 xinle.problem_help_config 获取与问答中心相关的完整配置数据,而无需再通过调用 API 进行额外的读取和处理。
10、客服服务中心新增了一个初始化事件:generateServiceItems,该事件的主要作用是用户打开页面时,根据 xinle.problem_help_config 配置动态解析并生成服务项菜单。整个执行流程包括以下步骤:首先清空页面中现有的服务项内容,确保数据的更新不会受到旧内容的影响;然后根据配置生成新的服务项菜单,并根据每个服务项的具体需求添加相应的功能逻辑,例如检测是否存在 onclick 属性,并为其绑定点击事件。此功能的核心在于通过后台对菜单栏的配置实时生效,开发者或管理员可以直接修改配置而无需重新部署,从而实现灵活的动态更新。整个事件的执行监听是通过 pageInit 完成的,即页面初始化时自动触发,无需用户手动操作。
11、问答中心页面新增了菜单功能,基于 xinle_user_protocol_config 配置,预留了四个菜单选项,分别是: 客服咨询:该菜单为用户提供在线客服咨询的入口,用户可以通过点击此菜单快速与平台客服进行实时沟通,解决问题或获取帮助。 寻求合作:此菜单旨在为有合作意向的企业或个人提供一个便捷的入口。后续将开放一个专属页面,用于展示合作相关信息,用户可通过该页面与平台建立联系,推进合作事宜。 在线反馈:针对用户在使用过程中遇到的特殊问题,此菜单提供了一个提交工单的途径。用户可以通过填写反馈表单,将问题直接提交给官方进行处理,确保问题能够及时响应并得到解决。 关于我们:该菜单将在后期开放,主要用于展示平台的公司介绍,包括企业背景、发展历程、核心价值等内容,帮助用户更好地了解平台的定位与服务宗旨。
Warning: Trying to access array offset on value of type bool in /www/wwwroot/www.acocoa.com/wp-content/module/public/function/acocoa/function/jinsom.php on line 163
拉黑 举报 打赏 回复762楼
1、后端新增了发票信息页面组件,页面路径为:/settings/Invoice_info.html。该页面仅允许已登录的用户访问,若未登录用户尝试访问,则系统会自动拦截并阻止访问,以确保用户数据的安全性和隐私性。账户发票页面的访问入口位于设置模块的“更多设置”功能子区域,具体访问路径为:“我的页面”-“资料设置”-“更多设置”-“发票抬头信息”。
2、开票信息页面(Invoice_info)主要包含两个内容展示模块:第一部分为“注意事项”,用于向用户说明发票抬头设置的相关细节以及发票的应用场景信息,帮助用户更清晰地了解如何正确填写和使用发票抬头;第二部分为“开票的具体信息”,当用户尚未设置开票信息时,页面会通过提示标签(tips)向用户展示相关提示信息,指导其完成开票信息的填写。页面底部还设计了功能按钮(btn),根据用户是否已填写开票信息动态显示为“新增开票信息”或“修改开票信息”,以便用户可以快速完成信息的新增或编辑操作。
3、后台新增了一个名为“教程中心”的论坛,其别名为“help_tutorial”。该论坛的主要功能是将所有与问题解答和教程相关的内容以帖子的形式记录和展示,方便用户查阅和学习。同时,为了更好地管理和分类,新增了一个对应的BSS目录,用于存储和组织相关内容。不同的论坛类型将使用不同的模板进行渲染,例如,“教程中心”将采用名为“help_tutorial”的专属模板,而其他论坛则根据其别名命名和使用对应的模板。未来,包括隐私协议、活动公告等内容都将通过论坛的形式发布和记录,这种方式不仅便于管理,还能保证内容更新的高效性和统一性。
4、新增了一个页面模板“help_tutorial”,对应的访问路径为:/mobile/bbs/help_tutorial.html。此模板主要用于展示平台的交易教程、售后问题以及平台功能介绍等内容,这些内容将以文章形式记录在论坛中,并通过该模板进行打开和访问。为提高用户的便捷性和内容的可达性,该模板页面支持游客直接查看和访问,无需登录即可获取相关信息。
5、help_tutorial页面设计包含四个动态变量,具体如下:1、id:文章的唯一编号,用于标识具体内容,需通过传参动态获取,且不可更改,确保数据的唯一性与准确性;2、bbs_title:论坛名称,由后端返回并动态加载,用于统一页面风格及标识平台属性;3、title:文章标题,通过动态变量获取并展示,直观呈现文章内容主题;4、文章正文:包含具体内容的部分,可支持短代码和HTML格式,以满足多样化的内容展示需求,实现页面的灵活性与丰富性。
6、当用户进入help_tutorial页面时,会触发一个初始化请求动作,通过pageInit监听器自动发起API初始化请求。该请求连接到论坛的接口中心(bbs接口),并主动传递页面的动态变量id,在请求过程中将其转换为post_id,以便后端进行文章的解析与处理。后端通过post_id获取对应文章的详情数据,包括标题、正文内容以及其他相关信息,并将结果返回前端,完成页面的动态加载与渲染。这一流程确保了页面内容的精准性与实时性,同时通过监听器的自动化操作提高了用户访问的流畅性。
7、项目新增了一个专门的API接口中心:bbs/api.php,主要负责处理论坛、分类、帖子、教程、问答等模块的相关接口请求。该接口默认调用ajax_api模块,以确保所有请求在传输过程中的安全性与可靠性。同时,该接口会加载自定义的函数脚本库,将与这些模块相关的所有自定义脚本集中集成到这个独立的函数库中,以保持代码的模块化和清晰性,尽量避免将这些自定义脚本混入主函数库,从而降低主库的复杂度。这种设计不仅提升了代码维护的便捷性,还增强了项目的扩展性和功能模块的独立性。
8、后端在响应help_tutorial_initialization初始化请求时,将按照以下步骤依次处理:首先,通过POST方式接收post_id参数,用以获取对应的文章编号。如果post_id获取失败,则立即返回错误信息,终止后续操作;如果成功获取post_id,则调用get_post方法尝试获取该文章的完整数组信息。若文章信息查找失败,则返回“抱歉,文章查找失败”的提示;如果成功获取文章信息,则对文章数据进行解析,并提取以下关键参数:id(文章编号)、content(文章内容)、title(文章标题)、date(发布时间)、modified(最后修改时间)、post_author(作者ID)、categories(分类信息)、views(浏览量)、nickname(作者昵称)、code(状态码)、msg(返回信息)。通过以上处理,确保初始化请求能够正确获取并解析文章数据,为后续操作提供可靠的基础。
9、新增了一个文章访问回调统一事件:xinle_page_visit_callback,该事件采用异步回调的方式执行,旨在对文章访问行为进行统一管理。触发该事件时,需要主动传递两个关键变量:user_id和post_id。其中,user_id用于标识访问者的UID,如果访问者未登录,则将其设置为0或空值;post_id则表示文章的唯一编号,用于定位具体的文章。通过此回调钩子,可以实现对用户访问行为的记录与统计,包括用户的访问次数、页面的总访问量以及文章的阅读量等数据。这一事件为后端提供了灵活的扩展能力,同时也为后续的访问数据分析和优化提供了重要依据。
10、新增了 xinle_page_visit_callback 页面访问回调钩子的两个处理动作,用于进一步完善文章访问统计逻辑和全站访问量的统一管理。具体实现如下:
第一步,通过 get_post_meta 获取文章的自定义字段 views,用于读取当前文章的访问量。如果获取失败或字段不存在,则将访问量标记为 1,表示该文章的首次访问。随后,使用 update_post_meta 对 views 字段进行更新操作,将当前访问量加 1,从而实现文章访问量的实时累加。
第二步,调用 xinle_redis_count 系统计数器,向其发起计数请求,更新全站页面的总访问量,将总访问量加 1。该计数器功能强大,支持按区域和时间段进行查询统计。例如,可以通过此计数器获取当天(今日)、上周、本周或上月的页面访问量统计数据,从而为页面访问分析提供精确的时间维度支持。
通过这两个动作的结合,不仅实现了文章访问量的单独记录,还统一管理了全站的访问统计,提供了灵活的数据查询和分析能力,为后续的运营优化和数据挖掘奠定了基础。
11、修复了 xinle_fingerprint_callback 指纹回调动作执行失败的问题。该问题的核心在于,当用户访问时,系统会通过指纹事件检查用户的资料缓存是否需要更新,如果需要更新,则会主动清理 Redis 缓存以确保数据的一致性。然而,由于内部参数传递出现异常,导致回调逻辑未能正常执行,从而引发缓存刷新失败的问题。
Warning: Trying to access array offset on value of type bool in /www/wwwroot/www.acocoa.com/wp-content/module/public/function/acocoa/function/jinsom.php on line 163
拉黑 举报 打赏 回复761楼
1、新增了一个异步回调接口:xinle_update_password_callback,用于处理用户密码变更后的相关逻辑。当用户密码成功变更时,该接口会通过 Swoole 异步触发并执行,确保操作的高效性和系统性能的稳定性。在触发时,系统会将用户的唯一标识 user_id 作为参数传递给该接口。此回调接口被设计为预留接口,具备高度的可扩展性,可以根据业务需求灵活实现特定的功能处理。
2、当后端确认密码修改成功后,前端会通过 xinle_msg 触发对应的提示消息:“密码修改成功”,以明确告知用户操作结果。随后,前端会隐藏整个密码修改输入表单(update_password_form),以防止用户重复修改,确保流程的完整性与安全性。同时,页面中会动态新增一个专门用于显示结果的表单(update_password_success),用于进一步告知用户密码已成功修改,并提供必要的确认信息,提升用户体验。如果密码修改失败,前端则会弹出一个对话框,直观地告知用户失败的具体原因,例如密码格式不符合要求、服务器异常或其他错误提示,以便用户根据提示进行后续操作。
3、新增了一个名为 update_password_clear_resend_countdown 的方法,用于在修改密码流程中清理定时器。该方法的主要功能是通过内置机制将正在运行的倒计时重置,并恢复验证码获取框的点击功能,确保用户可以正常重新获取验证码。此方法目前会在以下两个场景中触发:第一,当倒计时自动结束时,系统会自动调用该方法进行重置,以便用户无需手动操作即可再次点击获取验证码;第二,当用户退出当前页面时,为了避免定时器继续运行造成不必要的资源占用或内存泄漏,系统会主动执行该方法进行清理。通过这种设计,既能提升用户体验,保证功能的流畅性,又能优化资源管理,确保程序运行的稳定性和高效性。
4、在用户密码修改成功后,系统会主动调用 wp_destroy_other_sessions 方法,以销毁除当前会话外的所有其他会话,从而确保账户的安全性。为了避免执行过程中出现异常或失败,该方法在运行前会先检测 wp_destroy_other_sessions 对象是否存在。如果该对象不存在,系统会自动引入 WordPress 的用户会话管理功能,以确保方法能够正常执行。这种设计不仅有效防止了因对象缺失导致的功能异常,同时也进一步提升了密码修改后的安全性,避免用户因旧会话未销毁而可能面临的安全风险。通过这一机制,系统在功能执行的可靠性和用户账户安全性方面得到了双重保障。
5、在前端新增了一个回调脚本动作 xinle_callback_update_password,该动作会在用户密码修改成功后(由 update_pass 页面发起的修改请求)被主动触发执行。该回调接口目前处于预留状态,尚未与任何具体事件进行集成,但为后续功能扩展提供了灵活性和可操作性。通过该接口,未来可以轻松实现与其他功能模块的联动,例如通知用户密码修改成功、更新相关安全日志或同步到第三方服务等操作。
6、新增页面:settings_more,即“设置更多”页面。随着系统功能的不断扩展和复杂化,原有的设置页面逐渐显得过于拥挤,尤其是一些自定义设置参数和次要功能菜单堆积在页面上,影响了用户的操作体验。为了解决这一问题,单独设计了“设置更多”页面,将一些重要性较低或使用频率较低的设置选项集中到该页面进行管理。这不仅优化了原设置页面的布局,使其更加简洁明了,同时也提升了用户在复杂系统中的操作效率。、
7、在“更多设置”页面新增了一个菜单项:退出其它设备。此功能与内置事件 logout_other_devices 关联,当用户点击该菜单时,将弹出一个确认对话框,提示用户:“确定要登出其他所有设备吗?此操作将使其他设备上的登录状态失效,但当前设备不会受到影响。” 如果用户选择“确定”,系统将触发 xinle_api_post 请求动作,与后端进行交互以完成该操作。为避免用户重复点击导致的多次请求,点击后会显示加载提示器,直至后端完成处理并返回响应结果后,加载提示器将自动移除。
8、后端在处理 logout_other_devices(登出其它设备)请求时,首先会对当前用户的登录状态进行校验。如果检测到用户未登录,则直接返回错误信息,终止后续操作;如果用户已登录,则继续检查 wp_destroy_other_sessions 方法是否可用。如果该方法不存在,后端会通过 require_once 动态加载核心用户扩展,以确保所需功能的可用性。加载完成后,调用 wp_destroy_other_sessions 方法执行具体的登出操作,清除当前用户在其他设备上的登录会话。整个流程的设计充分考虑了安全性与稳定性,确保只有在用户身份有效的前提下才会触发操作。
9、settings_more 页面目前包含两个核心菜单,均与账户安全相关:其一是“登出其它设备”,用于用户管理多设备登录状态,保障账户安全;其二是“修改账户密码”,通过页面跳转实现密码更新功能。这两个菜单已完成基础集成,旨在提升用户的账户安全管理体验。未来,该页面将逐步扩展功能,计划集成更多自定义设置选项,例如通知开关、交易设置等,以满足用户在个性化操作和账户管理方面的需求。
10、在设置更多页面中新增了 settings_link 事件,用于实现内页跳转功能。此事件的实现通过 cost 进行定义,从而有效防止内存泄漏问题。当事件被触发时,会通过 this 对象获取用户点击菜单项时所绑定的自定义属性【data-link】。随后,事件会调用全局页面跳转事件 xinle_page_open,以发起目标页面的访问请求,完成跳转操作。通过这一机制,不仅提高了页面跳转的灵活性和可维护性,同时也确保了事件在处理过程中资源的高效利用和内存安全性。
11、前端新增了一个名为“发票信息”(Invoice_info.html)的页面,用户可以通过该页面查看或修改自己的电子发票信息。此页面的唯一标识为:Invoice_info。当前系统规定每个账户只能设置一个发票抬头信息,并且该发票信息需与用户的下单户头进行关联处理,以确保数据的一致性和准确性。此外,发票类型支持“普通发票”和“专用发票”的区分,用户可根据需求选择适合的发票类型。页面设计旨在提供直观、便捷的操作体验,同时满足发票管理的多样化需求。
Warning: Trying to access array offset on value of type bool in /www/wwwroot/www.acocoa.com/wp-content/module/public/function/acocoa/function/jinsom.php on line 163
拉黑 举报 打赏 回复760楼
1、在返回is_get_email字段时,xinle_is_profile将不再使用xinle_maskString进行脱敏处理,而是直接完整地返回对应的邮箱账户。因为邮箱账户只是用于接受通知的辅助媒介,并不具备开放登录或修改密码的权限,因此不需要进行隐私保护处理。这一改变确保了在接收通知时用户可以清楚地知道通知发送到哪个邮箱。
2、新增页面:update_pass,用于实现账户密码的修改功能。该页面的地址路径为 /settings/update_pass.html,用户可以通过 <a> 标签的链接方式直接访问此页面。为了确保账户安全性,该页面启用了登录限制机制,即如果用户未登录,则会自动重定向到登录页面,强制用户完成登录操作后才能访问该页面。此外,该页面涉及的所有相关 API 接口都要求验证用户的登录状态,确保操作仅限于经过身份验证的用户,从而有效保障账户信息的安全性和操作的合法性。
3、update_pass 页面采用标准的应用程序结构进行设计,界面内容清晰直观,方便用户操作,具体包含以下元素:首先,页面提供一个验证码输入框,用户可以在此输入从系统获取的验证码,用于验证身份;其次,页面包含一个获取验证码的选项表单,用户可通过该表单请求发送验证码至绑定的邮箱或手机号码;接着,页面设置了两个密码输入框,包括新密码输入框和确认新密码输入框,用户需在两处输入一致的新密码以完成修改;此外,页面还展示密码设置的提示信息,帮助用户了解密码的格式要求,如长度限制和字符类型等;最后,页面提供一个确认修改的表单按钮,用户点击后提交所有信息以完成密码修改操作。整个页面设计简洁实用,注重用户体验,同时确保操作的安全性和规范性。
4、页面的路由组件在访问请求时设置了 beforeEnter 守卫,负责对访问来源进行逻辑判断与验证,确保用户访问的安全性和页面功能的完整性。具体流程如下:首先,系统会通过 route['key'] 检测当前访问来源是否为 update_pass 页面,如果确认来源为 update_pass,则进一步通过 user.is_user_phone 验证用户是否已绑定手机号。如果检测到用户尚未绑定手机号,则会立即触发一个对话框,提醒用户绑定手机号后才能继续访问该页面。在对话框中,用户点击“确定”按钮后,系统会自动将用户跳转到绑定验证手机号的页面,指导用户完成手机号绑定操作。整个流程设计充分考虑了用户信息安全和页面访问的逻辑性,既保证了用户操作的规范性,又提升了应用的安全性和交互体验。
5、新增了 get_code_btn 的点击事件监听器,用于处理用户点击“获取验证码”按钮时的交互逻辑。具体流程如下:当用户点击按钮后,事件处理器会首先将按钮设置为 disabled 状态,避免用户短时间内重复点击导致请求冲突或逻辑异常。随后,系统会显示加载指示器,以提示用户当前正在进行后端交互处理。接着,通过 xinle_api_post 方法向后端发起 API 请求,调用 get_password_verification_code 接口,用于生成并发送修改账户密码的验证码到用户的绑定手机。整个流程设计确保了操作的安全性和交互的流畅性,同时通过视觉反馈让用户清楚地了解当前操作状态,有效提升了用户体验。
6、新增了通用验证码配置场景(xinle_sms_verification_code_config),增加了一个专用于修改密码的验证码来源。该验证码来源的唯一标识为 update_password,用于明确区分此场景下的验证码请求。当前阶段,模版ID暂时沿用系统默认设置,满足基础功能需求;后续将根据实际业务需求和用户场景,逐步调整为自定义的短信模版,以便提供更精准、个性化的短信内容。
7、get_password_verification_code:用于获取修改密码验证码,其执行流程设计如下:首先检查用户的登录状态,确保用户已登录后才能继续操作。接着验证验证码发送频率是否符合限制要求,避免频繁请求。随后生成一个新的验证码,并获取用户绑定的手机号和邮箱信息。系统优先使用手机号发送验证码,若用户未绑定手机号,则会尝试通过邮箱发送验证码。如果用户既未绑定手机号也未绑定邮箱,则返回错误提示,提醒用户绑定相关信息。验证码生成后会与相关信息一起保存到 Redis 中,并设置有效期为 5 分钟,以确保验证码的时效性和安全性。最后,返回验证码发送成功的提示信息,告知用户操作完成并可继续下一步流程。
8、在成功获取修改密码验证码后,系统会自动触发 update_password_start_resend_countdown 来执行验证码的倒计时处理。倒计时默认设置为60秒,并以每秒为单位自动更新显示。在倒计时进行期间,验证码的获取功能会被暂时禁用,以防止频繁请求。当倒计时结束时,系统会清除计时器,并将获取验证码的按钮恢复为可点击状态,同时将按钮文字更新为“已重新获取”,提示用户可以再次获取验证码。如果在验证码获取过程中出现失败情况,系统会及时触发相应的错误提示,以告知用户问题所在。
9、在修改密码页面中,系统设计了三个核心监听器,分别负责监测新密码输入事件、确认密码输入事件以及密码显示/隐藏切换事件,以确保用户操作的流畅性与功能的完整性。密码长度限制为6到20个字符,用户在输入时必须满足该范围要求。虽然当前未强制设置复杂密码规则,但页面会通过提示引导用户尽量设置较为复杂的密码,例如建议使用字母、数字及特殊字符的组合,以提升账户安全性。通过这些监听器的实时监控与交互设计,用户不仅可以方便地输入密码,还能随时切换密码显示状态,进一步优化用户体验,同时增强安全提示的效果。
10、新增了一个submit_btn按钮的提交监听器,该按钮在页面加载时默认处于不可点击状态,只有在用户依次正确输入流验证码、新密码和确认密码,并且这些字段均满足基本校验条件后,按钮才会被激活,允许用户点击提交。当用户点击submit_btn时,系统会对流验证码和密码的表单信息进行初步校验。如果输入的信息不存在或不符合要求,则会返回相应的错误提示,帮助用户及时修正填写内容;如果校验通过,则会触发API接口请求,将用户输入的参数提交至后端。后端会对收到的参数进行进一步的验证和处理,以确保数据的合法性与安全性。
11 、后端核验密码修改请求的时候,会依次执行以下的处理:检查操作类型是否为验证码修改密码。 检查用户是否已登录。 接收用户提交的参数(验证码、新密码、确认密码),并验证参数合法性: 验证码必须为数字; 两次输入的密码必须一致; 密码长度至少为6位。 检查验证码的有效性: 验证码是否存在; 验证码是否已过期; 验证码的 IP 是否匹配; 验证码是否正确。 修改用户密码: 调用 WordPress 的 wp_update_user 函数更新密码。 清理 Redis 缓存: 删除验证码缓存; 删除用户资料缓存。 返回密码修改成功的提示信息。
Warning: Trying to access array offset on value of type bool in /www/wwwroot/www.acocoa.com/wp-content/module/public/function/acocoa/function/jinsom.php on line 163
拉黑 举报 打赏 回复759楼
1、新增xinle_get_email_template模版,用于生成通用的HTML邮件模板,该邮件模版采用响应式设计:能在桌面和移动设备上良好显示。 内联CSS:将CSS直接写在<style>标签中,这是邮件客户端兼容性最好的方式。 优雅的视觉风格:使用了柔和的色彩和清晰的布局。 通用页脚:包含了版权信息、网站链接以及您要求的“请勿回复”提示。 兼容性代码:<!--[if (gte mso 9)|(IE)]>部分是为了兼容旧版的Outlook客户端。
2、后端接口在执行email_update在绑定邮箱的时候,会先进行基础拦截,如果拦截通过的情况会通过xinle_redis_security检查用户获取验证码的次数是否超限,该限制频率和手机短信一致。如果符合获取条件则通过mt_rand来生成验证码,并通过xinle_email_push发送验证码邮件到指定邮箱,如果发送失败会返回对应错误。如果发送成功,则通过redis记录本次的发送信息数据。
3、后台配置页面新增一个字段:xinle_mobile_defalut_logo,网站或者APP的logo。很多地方都会用到这个logo的调用,因此后台集成一个字段进行处理,方便后期进行动态维护和更新。邮件发送模版已集成该logo的使用。
4、在邮箱绑定页面上,用户完成邮箱输入后可点击获取验证码功能,会自动触发后端邮件发送请求。若发送失败,则会返回相应错误信息;若发送成功,则会将验证码表单设置为倒计时状态,在倒计时期间,用户不可重新获取验证码。倒计时结束后用户可以重新获取验证码。为防止监听器异常,系统会在关闭窗口或退出页面时主动重置整个倒计时。
5、在邮箱绑定页面中,新增了一个名为confirm-btn的点击监听动作。当用户点击该按钮时,系统会通过jQuery选择器获取弹出层中的邮箱账户和验证码表单内容,并对这两个字段进行验证。如果其中任一字段为空或核验不通过,系统将返回相应的错误提示,以指导用户修正输入错误。若输入符合要求,则会触发名为is_binding_email_code的接口,通过xinle_api_post方法向服务器发送请求,以对邮箱和验证码进行核验处理。为了防止用户在与后端交互过程中因误操作而导致的异常情况,发起请求后,系统会调用app.preloader.show();加载指示器,以提示用户正在处理中,待响应完成后再关闭该指示器,从而提升用户体验。
6、后端在响应邮箱绑定验证码的核验请求时,会对提交的参数执行核验处理。首先从 POST 请求中获取 $email 和 $code。 检查用户是否已登录: 如果 $user_id 为空,设置 result['code'] 为 1,表示错误。 设置 result['msg'] 为 "错误:请登录后进行操作"。 设置 result['jump'] 为 'login'。 调用 xinle_exit() 函数终止执行。 检查邮箱绑定情况: 如果 xinle_is_uid_by_email($email) 为真,表示邮箱已绑定其他账户。 设置 result['code'] 为 1。 设置 result['msg'] 为 "该邮箱已绑定其它账户"。 终止执行并返回结果。 验证邮箱格式: 如果 xinle_is_email($email) 为假,表示邮箱格式不正确。 设置 result['code'] 为 1。 设置 result['msg'] 为 "错误:请输入正确的邮箱账户"。 终止执行并返回结果。 验证验证码格式: 如果 $code 不是数字,设置 result['code'] 为 1。 设置 result['msg'] 为 "验证码非法参数"。 终止执行并返回结果。
7、在绑定邮箱的过程中,完成了基础参数的核验处理后,系统会读取Redis中的缓存信息,并进一步进行安全检查处理。具体流程如下:首先,系统会检查缓存记录是否存在,若不存在,则会返回错误提示:失败:验证码已过期!其次,系统会通过xinle_is_ip方法获取当前客户端IP,并与Redis缓存中的IP进行对比,若不一致,则会返回提示:环境异常,请重新获取验证码。接着,系统会利用xinle_redis_security方法检测核验次数,若超过限制则会返回相应错误信息。然后,系统会将用户提交的邮箱账户与Redis中的邮件接收账户进行对比,若不一致则会返回错误提示:失败:验证码错误(1)!最后,系统会进行验证码核对处理,确保验证码的一致性,若不符合则返回错误提示:失败:验证码错误(2)!若上述五个安全拦截条件均符合,系统将允许进行下一步处理。
8、如果用户提交的邮箱账户及验证码与Redis缓存中的信息一致,并且通过了所有的安全核验检查,系统将会使用wp_update_user函数对邮箱账户进行更新操作。同时,系统会对这一更新过程进行错误跟踪,如果更新失败,将直接返回相应的错误信息。如果更新成功,则表示邮箱绑定已完成,系统将返回code=0,msg=邮箱绑定成功,标志着整个邮箱更新同步工作圆满结束。
9、新增回调事件:xinle_update_email_callback。当用户的邮箱修改成功后,系统将通过异步接口调用此回调。在处理过程中,将传递两个变量:user_id和email(新绑定的邮箱账户)。目前集成的处理方式是清空对应的xinle_is_profile用户缓存,因为该字段涉及到邮箱的调用处理,因此一旦邮箱发生更新,就需要同步清理缓存,以避免返回不正确的个人资料,从而导致一系列潜在的问题。
10、前端在发起邮箱绑定验证请求时,根据后端返回的结果执行不同的处理:不论成功与否,都会调用app.preloader.hide来关闭加载提示层。如果后端响应失败,将直接弹出对话框提示用户绑定失败,并说明原因。而如果操作成功,将依次进行以下步骤:(1)关闭弹出层;(2)重置倒计时;(3)触发消息提醒;(4)更新页面容器,确保页面内容和按钮得到相应处理,以防止用户重新提交。
11、前端新增xinle_callback_update_email回调动作,当用户成功绑定邮箱账户后会主动触发该动作,同时传递新邮箱账户信息。目前该回调动作包含以下处理:(1)将user.is_user_email标记为true,明确用户已完成邮箱账户的绑定;(2)将绑定的邮箱赋值给user.is_get_email,以确保页面正确显示;(3)若用户正在设置页面,将同步更新设置页面的邮箱至最新绑定的邮箱。
Warning: Trying to access array offset on value of type bool in /www/wwwroot/www.acocoa.com/wp-content/module/public/function/acocoa/function/jinsom.php on line 163
拉黑 举报 打赏 回复758楼
1、新增方法:xinle_is_uid_by_email ,用 wpdb 实现:通过邮箱获取用户ID。$email 要查询的用户邮箱。存在则返回用户ID,不存在则返回false。该方法会 构造 SQL 查询(关键:用 $wpdb->users 调用用户表,自动适配表前缀)。核心安全操作:$wpdb->prepare() 处理参数,%s 表示字符串类型,执行查询:$wpdb->get_var() 用于获取“单个值”(这里是用户ID)。
2、后端新增方法:xinle_is_email。该方法用于验证传入的邮箱地址(string $email)格式是否合法。方法通过正则表达式进行匹配校验,能够支持常见邮箱格式,包括字母、数字,以及常用特殊字符,并兼容多级域名。具体规则为:本地部分允许字母、数字、点号、下划线、减号和加号;域名部分允许字母、数字、点和减号,同时保证顶级域名不少于2个字符。方法执行时,若传入邮箱地址符合正则规则,则返回 true,表示合法;否则返回 false。该方法可有效提升系统对邮箱输入的准确性校验,适用于账号注册、邮箱绑定等多种应用场景。
3、新增数据表:xinle_email_push,用于记录系统中所有通过项目产生的邮件发送记录。该表包含多个字段:id(主键,唯一标识每条发送记录),user_id(收信人ID,便于追踪邮件归属用户),email(收信人邮箱地址,记录邮件发送目标账户),title(邮件标题,用于标识邮件主要内容),content(邮件正文,存储邮件具体内容),attachment(附件地址,记录邮件所带附件的存储路径或链接),error(错误日志信息,用于保存发送邮件过程中出现的异常或失败原因),time(发送时间,记录邮件实际发送的时间点),status(执行状态,用于标识邮件发送是否成功及其处理进度),type(邮件发送场景,用以区分不同业务场景下的邮件类别)。所有由项目自动生成且发送的邮件,均会同步写入该日志表,确保邮件发送行为可追溯,便于后期运维、监控和问题排查。
4、后台appkey新增配置子页面,专用于邮箱相关参数的集中管理配置,便于灵活调整邮件发送的基础信息与安全策略。目前页面内集成以下配置项:xinle_appkey_mail_name(发件人名称,用于自定义邮件的显示身份)、xinle_appkey_mail_host(SMTP服务地址,指定邮件发送服务器的连接地址)、xinle_appkey_mail_port(端口地址,用于指定SMTP的服务端口,确保邮件通讯的畅通与安全)、xinle_appkey_mail_user(SMTP用户名,用于验证身份,保障邮件发送权限)、xinle_appkey_mail_password(SMTP密码,确保身份认证信息安全)、xinle_appkey_mail_token(随机生成的接口秘钥,有效防止接口被非法访问攻击,建议定期轮换以提升整体系统安全性)。通过此配置页面,可集中高效地对邮件系统参数进行维护和调整,保障系统邮件功能的正常运作与信息安全。
5、push接口新增方法:xinle_email_push,负责系统内的邮件推送功能。该函数需传入以下参数:email(收件人邮箱地址,指定邮件接收方)、title(邮件标题,明确邮件主题)、content(邮件内容,支持富文本格式)、attachment(附件路径,可选,支持发送包含附件的邮件)、asyn(是否异步处理,布尔值,默认为false)。方法执行后返回标准数组结构,code字段表示邮件发送状态,0表示发送成功,1表示发送失败,msg字段为具体的错误原因或成功提示,方便调用方了解邮件推送结果及故障详情。
6、xinle_email_push方法对传入的email参数进行了优化处理。若email参数经过is_numeric判断为纯数字,则视其为用户UID,此时会通过get_userdata方法获取对应用户的对象信息。若用户信息获取失败,则直接返回相应的错误提示,表明邮件发送失败,原因是未能获取到目标用户的信息;若用户信息获取成功,则进一步提取该用户对象中的user_email属性,将其赋值给email参数以实现UID到实际邮箱地址的转换。若在此过程中用户未绑定邮箱地址导致获取失败,则返回错误提示,指出邮件发送失败,原因为“对方未绑定邮箱”。
7、xinle_email_push具备基础拦截处理,在发送邮件前会依次执行以下处理:邮箱获取: 如果$email是数字,认为是用户ID,通过get_userdata()函数获取用户信息,然后提取user_email。 如果找不到有效的邮箱,返回错误信息:“邮件发送失败:对方未绑定邮箱”。 防止重复发送: 通过md5($email . $title)生成一个唯一的键,用于锁定发送。 使用xinle_lock函数设置一个5秒的锁。如果无法获得锁,说明操作过于频繁,返回错误信息:“邮件发送失败:超速限制!” 基本校验: 检查邮箱、标题和内容是否为空。如果任一为空,返回错误信息:“(收件邮箱/邮件标题/邮件内容)不能为空”。 再次确认邮箱是否为空,如果是,说明用户可能未绑定邮箱,返回错误信息。 邮箱格式验证: 使用xinle_is_email验证邮箱格式。 如果格式无效,返回错误信息:“邮件发送失败:邮箱无效,无法发送”。
8、在邮件发送的过程中,当完成所有拦截校验处理后,会调用xinle_insert_sql方法将该次邮件发送的详细记录插入到xinle_email_push数据表中。插入的数据字段包括:user_id,此值是通过xinle_is_uid_by_email方法解析邮箱地址获取到的用户UID;email,即本次接收邮件的用户邮箱账号;title,为邮件标题(通常会包含APP名称以便于识别);content,邮件的正文内容;time,记录邮件发送时的当前时间和日期;status,状态标记为wait,表示该邮件处于待发送队列;如果存在附件,则会额外写入attachment字段,并记录本地文件的地址路径;type,为邮件发送的具体场景类型,如果未传递该参数则会自动跳过此字段的写入。通过这些字段的详细记录,能够完整追踪每一封邮件的发送流程,便于后续的管理和问题排查。
9、xinle_email_push方法的邮件发送功能不在依赖外部SDK处理,而是直接通过内置方式进行处理。整个执行流程如下:初始化邮件服务: 检查并确保WordPress的邮件发送功能(PHPMailer)已准备就绪。如果未就绪,则手动加载并创建实例。 配置并发送邮件: 从系统设置中读取SMTP服务器信息(地址、端口、用户名、密码等)。 设置邮件的收件人、发件人、标题、HTML格式的正文,并处理可能存在的附件。 调用send()方法尝试发送邮件。 处理发送结果: 如果发送成功: 在数据库中将该邮件记录的状态更新为 ok(成功)。 返回一个表示成功的消息。 如果发送失败: 捕获错误信息。 将失败原因写入错误日志文件。 在数据库中将该邮件记录的状态更新为 fail(失败),并记录错误详情。 返回一个包含具体失败原因的消息。
10、通过xinle_email_push发送邮件成功后,会使用xinle_redis_count触发计数器:email_push,记录邮件的发送成功次数。该计数器支持年月日按区域进行统计。如果发送失败,则会触发日志写入:通过xinle_log_error_warn执行错误的写入,日志格式如下:[发送时间:' . date("Y-m-d H:i:s") . '] - [失败原因:' . $error_msg . '] - [收信邮箱:' . $email . '] - [邮件标题:' . $title . ‘]。
11、xinle_email_push完成封装处理,整个执行的流程如下:发送前检查与准备参数处理:将ID转为邮箱地址。防刷机制:使用锁机制限制重复请求。参数验证:检查邮箱、标题、内容是否为空。邮箱格式验证:确保邮箱格式合法。数据库记录:创建邮件发送记录。核心邮件发送初始化:加载PHPMailer库。配置SMTP:设置SMTP服务器及相关配置。邮件设置:配置发件人、收件人、邮件格式、标题及正文。发送邮件:执行邮件发送。发送后结果处理成功处理:更新数据库记录状态为“发送成功”,并更新Redis计数。失败处理:记录错误日志,更新数据库记录状态为“发送失败”,并记录错误信息。
Warning: Trying to access array offset on value of type bool in /www/wwwroot/www.acocoa.com/wp-content/module/public/function/acocoa/function/jinsom.php on line 163
拉黑 举报 打赏 回复757楼
1、前端在发起 update_nickname 处理事件时,如果后端响应 code=1,则表示昵称修改失败,此时系统会触发 app.dialog.alert 弹出错误对话框,告知用户错误原因。若修改成功,则系统会提示“昵称修改成功”,并主动关闭相应的输入框。不论操作成功还是失败,系统都会通过 finally 监听器执行 app.preloader.hide() 来关闭加载提示框。
2、前端新增了一个回调事件:xinle_callback_nickname。当用户通过 update_nickname 成功修改昵称后,会自动触发该回调事件。这个事件是为预留的处理机制设计的,未来需要任何页面交互的处理都将通过这个预留事件来实现。目前,该事件会自动将 user.nickname 更新为最新修改的昵称。因此,当用户访问其他页面时,涉及昵称的读取操作将展示最新更新的姓名。需要注意的是,该回调事件会传递一个固定的变量值:nickname。
3、对 profile_settings 页面进行了监听器和全局变量的重构处理,确保该页面支持 page、page_content 变量的内部处理。在原有页面的基础上,新增了多个生命周期行为监听器:pageInit(初始化阶段),pageBeforeIn(页面即将进入),pageAfterIn(页面进入后),pageBeforeOut(页面即将离开),pageAfterOut(页面离开后),pageBeforeRemove(页面即将被销毁)。这些改动是为了确保资料设置页面符合应用程序的结构设计标准,从而能够执行相应的前后端响应动作。
4、修复并解决在用户通过前端修改昵称后,重新访问页面时出现的错误问题:Uncaught TypeError: Cannot access offset of type string on string。这一错误导致整个应用程序崩溃。通过对栈的追踪发现问题源自于xinle_is_profile在处理 real 异常时出现的问题。错误发生在调用 meta 读取 real 实名信息的过程中,因为数组识别和解析处理不当。因此,需要加强对数组的识别和解析,避免异常错误导致系统崩溃。
5、前端通过update_nickname发起昵称修改请求。如果后端响应修改成功,系统不仅会通过xinle_callback_nickname触发相关的业务回调处理,还将使用page_content选择器,将设置页面中的昵称更新为新设置的昵称。此外,系统会触发xinle_msg消息提醒,告知用户昵称已成功修改。另外,修复了app.dialog.prompt输入框在点击取消时未能关闭对应弹出层的问题。具体实现为,通过callbackCancel回调执行关闭动作事件的监听处理。
6、update_nickname的整个处理流程完成封装处理:权限检查:如果xinle.nickname_limit为false且xinle.is_admin_x不是true,则直接返回false,不允许修改昵称。昵称验证函数:创建自定义的输入验证函数validateNickname,用于验证用户输入的昵称是否符合要求:昵称不能为空。昵称长度不能超过xinle.nickname_length。打开输入框:使用app.dialog.prompt打开输入框,让用户输入新的昵称。输入框会显示提示信息包括允许的最大字数。用户输入处理(确定按钮):用户点击“确定”按钮后,使用validateNickname验证输入的昵称。如果验证失败,弹出错误提示,不进行后续操作。如果验证通过,显示加载动画,开始请求处理。发送请求:调用xinle_api_post发送请求,更新用户昵称。请求包含必要的参数,如nickname和用户id。响应处理:如果请求成功(res.code为0),更新页面中的昵称显示。调用xinle_callback_nickname并传递新的昵称,同时显示“修改成功”消息。如果请求失败,弹出错误提示,显示失败原因。隐藏加载动画:无论请求成功或失败,最后都会隐藏加载动画。用户取消处理:如果用户选择取消,不进行操作,输入框自动关闭。
7、APP页面组件(xinle_page_config)现已新增“email_update”页面配置,该页面为邮箱修改或绑定页面,对应的componentUrl地址为/settings/email_update.html。前端支持通过“email_update”路径访问该页面,方便用户进行邮箱的修改或绑定操作。为保障账户安全,访问该页面时系统将强制校验用户登录状态,若检测到用户未登录,则会自动进行拦截并跳转至登录页面,确保只有已登录用户才能进入邮箱修改/绑定页面。
8、binding_email页面已完成页面结构的搭建,整体采用标准APP的结构进行设计。当用户已绑定邮箱时,页面将提示:“您的账户已绑定邮箱({user.is_get_email}),可正常使用。如需更换绑定,请点击下方按钮操作。”如果用户尚未绑定邮箱,则会显示:“绑定邮箱后,您即可使用${xinle.app_title}的邮件通知功能。”无论是首次绑定邮箱还是更换绑定邮箱,均通过showEmailInputPopup方法唤起弹出层,便于用户输入新的邮箱信息并完成操作。值得说明的是,邮箱绑定流程无需单独的解绑环节,若需更换绑定邮箱,仅需通过验证码验证新邮箱即可,无需复杂的操作步骤,整体流程简洁高效。
9、新增showEmailInputPopup弹出层事件:该弹出层居中显示,界面设计简洁美观。标题为“设置邮箱”,副标题提示“验证码将发送至您填写的邮箱,请及时查收”,有效引导用户操作。输入区域包含带邮箱图标的输入框,输入框内显示提示语“请输入邮箱地址”,便于用户明确填写内容。下方为验证码输入区域,要求用户输入6位验证码,右侧配有“重新获取验证码”按钮,便于在未收到验证码时及时重新获取,保障用户体验。弹出层底部设有“确认绑定”按钮,用于提交绑定请求。为防止误操作,弹出层禁止通过点击遮罩层关闭,提升操作的安全性与流程的严谨程度。页面右上角显眼位置设置有“X”图标,用户可通过点击该图标自主关闭弹出层,整体交互设计既便捷又高效。
10、showEmailInputPopup 弹出层增加以下点击监听逻辑:1、popup-close 关闭弹窗逻辑,通过点击右上角的 X 图标触发。弹窗关闭时,会主动调用 clearInterval 方法清除内部定时器,避免因定时器未清理导致用户下次打开弹窗时出现异常或数据污染。2、send-code-btn 获取验证码操作,用户点击后会首先校验邮箱输入框内容,验证是否已填写邮箱地址及其格式是否符合规范,只有在邮箱格式正确的情况下才会发起验证码请求,并可启动倒计时功能,防止频繁获取验证码。3、confirm-btn 确认绑定操作,在用户点击“确认绑定”按钮时,会对输入的邮箱地址及验证码进行非空校验,确保邮箱已填写且格式正确,同时验证码已填写且为有效格式。在所有校验通过后,才会发起邮箱绑定请求,提升操作的可靠性和严谨性。
11、当用户进行邮箱账户的绑定或更换操作时,监听器会监控点击获取验证码的行为。一旦用户点击获取验证码按钮,系统将首先获取当前输入的邮箱地址,并对该邮箱地址进行格式与有效性校验。只有在邮箱地址输入正确且符合规范的情况下,才会调用 xinle_api_post 方法发起 API 请求,将邮箱地址提交至后端进行下一步处理。为了提升操作的交互体验并防止用户在等待响应期间发生误操作,系统会在请求发起前自动执行 app.preloader.show,展示加载中的提示,并临时禁用用户其他交互操作。待后端 API 响应结果返回后,系统会主动关闭加载提示,恢复正常交互,确保操作流程的顺畅与安全。
Warning: Trying to access array offset on value of type bool in /www/wwwroot/www.acocoa.com/wp-content/module/public/function/acocoa/function/jinsom.php on line 163
拉黑 举报 打赏 回复756楼
1、后台用户基础配置中新增了一个字段:xinle_user_basic_nickname_permissions,该字段用于控制是否允许用户修改昵称,类型为开关选项。虽然超级管理员和前台管理员不受此限制,但普通用户的昵称修改权限将依据此配置进行控制。需要注意的是,允许用户修改昵称可能涉及多方面因素,因此,一般不建议开启此权限,默认设置为关闭状态。
2、考虑到用户修改昵称时需要统一长度限制,因此引入了一个新字段:xinle_user_basic_nickname_length,用于设定昵称长度的限制。一个中文字符或者一个英文字符均计算为一个字。默认情况下,昵称最大长度设定为10个字。如果业务需求需要更长或更短的限制,可以通过此字段进行调整,且会自动在全局生效。为提供灵活性,该设置可以通过开关进行调整,以便于根据后续业务需求灵活变化。基本的拦截类型(例如非法字符限制)将自动支持该设定。
3、前端xinle对象,新增一个属性:nickname_length(昵称的最大长度限制),读取后台的配置xinle_user_basic_nickname_length。当前端用户尝试修改昵称的时候,会通过这个字段去负责长度的检查和提醒处理。xinle对象是首页初始化过程中,通过内部事件进行加载。该对象是冻结状态,不可二次修改。防止出现安全的问题。
4、后台禁止用户修改昵称,但前端页面必须输入用户昵称后才能知道被禁用,这对用户体验极为不佳。因此,xinle对象新增了一个nickname_limit属性,该属性读取后台字段:xinle_user_basic_nickname_permissions,其类型为布尔值。如果为true,则允许修改;如果为false,则不允许修改。在不允许修改的情况下,系统将在设置页面进行相应的拦截处理。
5、在 profile_settings 资料设置页面,新增了一些调整措施。首先,增加了一个 update_nickname 点击监听器,该监听器会通过 xinle.nickname_limit 检查普通用户修改昵称功能是否被启用。如果未启用,且当前用户不是管理员,则该点击操作将被忽略。此外,输入昵称的字数限制和拦截检测将通过 xinle.nickname_length 动态处理,后台设置的参数将被读取并应用。
6、后端API接口在接收到【update_nickname】响应请求动作的时候,会执行以下拦截检测。1、如果用户未登录则直接返回错误:错误:请登录后进行操作。2、如果昵称为空则返回错误:新昵称不能为空。3、通过正则匹配检查新昵称内容,检查非法字符,只允许中文、英文、数字。如果存在非法字符则返回:昵称只能包含中文、英文、数字。4、通过mb_strlen获取昵称的长度,如果长度小于2或者大于后台限制,则返回错误:昵称长度必须在2到' . $max_length . '个字符之间。5、检测是否开启普通用户昵称修改功能,如果未开启,并且用户不是管理员则返回错误:管理员才能修改昵称。上述条件都符合则基础拦截完成效验。
7、新增方法:xinle_is_nickname_exists,检查指定昵称是否已存在。$nickname 要检查的昵称、 存在返回true,否则返回false。执行流程如下:参数验证: 检查传入的昵称是否为空。 如果昵称为空,则返回 false,表示没有重名。 构建查询参数: 设置查询时所需的参数,用于查找用户自定义字段中匹配的昵称。 meta_key 为 'nickname',指定要查询的用户自定义字段。 meta_value 为传入的 $nickname,这是需要匹配的值。 meta_compare 设为 '=',表示精确匹配。 number 设为 1,只需找到一个匹配结果即可。 count_total 设为 false,以不计算总数来提高查询效率。 查询用户: 使用 get_users() 函数按照前面指定的参数查询用户。 返回结果: 检查查询结果是否为空。 如果查询返回结果不为空,则说明昵称已存在,返回 true。 否则返回 false,表示不存在重名。
8、在用户修改个人昵称时,增加了两个拦截处理机制。首先,通过 get_user_meta 获取当前用户的昵称,并与用户想要修改的新昵称进行比较。如果两者一致,则返回错误信息:“之前的昵称与现在保持一致”。其次,利用 xinle_is_nickname_exists 函数检查新昵称是否已被其他用户占用。如果该昵称已被占用,则返回错误信息:“该昵称已被占用”。此机制有效防止昵称的重复和无效更改,提升用户体验。
9、在通过 update_nickname 接口发起昵称修改请求时,完成基础参数校验后,将使用 update_user_meta 方法来更新用户昵称。成功更新后,将返回 code=0 和 msg=昵称修改成功。至此,整个用户的昵称修改流程基本完成。后续处理将交由前端来进行交互操作。大致流程如下:获取昵称: 从 $_POST 中获取用户提交的新昵称。 用户身份验证: 检查用户是否已登录,如果没有登录,返回错误信息并引导至登录页面。 昵称验证: 检查昵称是否为空,如果为空,返回错误信息。 使用正则表达式检查昵称是否只包含中文、英文或数字,如果包含非法字符,返回错误信息。 检查昵称的长度是否在规定范围内(2到最大长度),如果不符合,返回错误信息。 修改权限检查: 检查用户是否有权限修改昵称,非管理员用户需要特定权限,否则返回错误信息。 昵称一致性检查: 获取用户原来的昵称,如果新昵称与原昵称相同,则返回错误信息,表示无需修改。 昵称唯一性检查: 调用 xinle_is_nickname_exists 函数检查昵称是否已存在,如果已存在,返回错误信息。 更新昵称: 使用 update_user_meta 函数更新用户的昵称信息。 返回成功信息。
10、新增一个后端回调处理方法:xinle_nickname_callback。当用户的昵称修改成功后,该方法将在异步 swoole 脚本的触发下被调用,用于处理内部事件记录或通知第三方业务系统。由于该方法以异步方式执行,因此需要主动传递 user_id 参数以进行身份识别。对于新昵称的获取,将通过调用 get_user_meta 来读取相应的昵称,从而完成相关处理。
11、xinle_update_user_meta_hook 监听器中新增了几个处理部分。当用户通过 update_user_meta 更新指定的用户字段时,该监听器会主动触发并在内部执行相应的异步回调处理。目前新增的两项监听分别为:1. 当更新用户昵称时,触发 xinle_nickname_callback 回调动作,该处理为异步执行行为。2. 当更新用户实名认证信息时,触发 xinle_real_callback 回调动作。
Warning: Trying to access array offset on value of type bool in /www/wwwroot/www.acocoa.com/wp-content/module/public/function/acocoa/function/jinsom.php on line 163
拉黑 举报 打赏 回复755楼
1、在real_update_initialization的后端初始化过程中,如果用户已经完成实名验证:将会构建一个HTML模块,包含以下内容:标题为“您的账号信息已三要素实名认证”;手机号码将不进行脱敏处理;姓名直接显示为XXX;身份证号码通过xinle_mask_IdCard方法进行脱敏显示。尾部信息说明:上述信息仅用于身份验证以及审查您的使用权限,平台将确保您的信息安全。目前,平台暂不支持更换实名制,如有疑问请联系客服处理。
2、xinle_mask_IdCard方法进行重构处理,之前的处理逻辑无法正确识别末尾X字母,正则匹配规则存在异常问题。新版本进行优化移除正则匹配机制,改为阶段处理,具体流程如下:去除空格:使用 trim() 方法去除身份证号字符串两端可能存在的空格。 检查长度:判断身份证号是否为18位。 字符串截取: 使用 substr() 截取身份证号的前4位。 使用 substr() 截取身份证号的后4位。 组合结果: 将前4位与10个星号和后4位组合,形成最终的遮盖字符串。 返回结果: 如果身份证号是18位,返回遮盖后的字符串。 如果身份证号不是18位,直接返回原始字符串。
3、当进入账户实名页面时,会通过pageBeforeIn触发初始化操作。如果用户已完成实名验证,则系统将直接返回对应的实名信息,并在页面展示账户的实名信息。若用户尚未实名,则会返回相应的表单结构参数,允许用户填写身份信息,并通过绑定手机号发起实名请求。系统支持跳转到手机号绑定,并在实名操作前,会提示用户核对相关表单信息,以确保三要素信息的一致性。
4、考虑到实名认证页面初始化时加载默认的实名认证表单结构,当用户已实名的情况下,页面会先加载此表单。待后端响应出结果后,页面再切换到实名信息的展示,这种操作导致用户在访问时必然会体验到页面的视觉切换,显得略突兀。因此,进行优化处理:进入页面时,应隐藏实名表单的展示模块,若用户已实名,则直接加载对应的实名信息模块进行展示;若未实名,则显示实名表单。此外,在初始化过程中,页面会展示加载状态条。后端响应完成后,无论用户是否已实名化,该加载进度条都会被移除,从而提升整体用户体验。
5、xinle_is_profile 现在会额外返回一个字段:is_real_name,用于显示实名用户的姓名信息。如果账户已实名,则该字段显示用户的真实姓名,例如:张文军,这一信息来源于 real 数组中的 name 字段。如果用户未实名,则该字段为空白。此字段将用于资料设置页面中,展示用户的实名信息。此外,当用户通过实名认证时,该字段会实时更新为用户的实名姓名。这样,用户无须刷新页面即可看到信息的更新,有助于提升用户体验。
6、资料设置页面新增了一个 "li" 资料展示栏:(个人实名)。该栏会读取字段:user.is_real_name,如果用户已完成实名认证,则显示用户的实名姓名;如果未实名,则显示(未实名/空白)。无论是否完成实名认证,用户点击此菜单都会跳转至(real_update)实名认证页面。在这个页面上,用户可以进行实名认证或查看自己的账户实名信息。通过这种方式,用户能够更方便地管理和查看自己的身份信息。
7、用户完成实名认证后,前端将主动触发(xinle_callback_real)回调钩子。借助这个钩子,系统会更新两个对象:首先,将 user.real 标记为 true,指出用户已完成实名验证;其次,设置 user.is_real_name 为用户的真实姓名。在用户未完成实名的情况下,返回的将是空值或“未实名”。由于用户可能是从设置页面进入,因此需要实时回调 xinle_settings_real_name.value 菜单名称,将其动态更新为用户的身份证姓名。这确保了用户信息展示的准确性和及时性。
8、在用户资料设置页面中新增了昵称点击监听器:update_nickname,并通过@click="${update_nickname}"进行关联监听。用户点击其昵称时,会触发app.dialog.prompt,弹出一个原生输入对话框。对话框的标题为“修改昵称”,副标题为“请输入您的新昵称(最多10个字)”。默认情况下,输入框会显示用户当前的昵称信息(user.nickname)。弹窗提供两个选项:1、确认,将继续执行后续的后端业务逻辑;2、取消,关闭输入对话框并终止本次操作。
9、在资料设置页面中,当用户点击修改昵称时,将触发一个自定义函数:validateNickname。该函数用于验证输入框中的昵称信息。首先,通过value.trim()去除空格后,如果返回的字符是空的,将提示错误信息:昵称不能为空。接着,检查输入内容的长度,如果字符数超过10,则会返回错误:昵称不能超过10个字符。若输入符合条件,则进入下一步处理。如果以上错误发生,将通过xinle_msg弹出错误提示,要求用户重新输入,并阻止关闭输入框。
10、在用户通过update_nickname提交昵称修改请求后,系统会首先执行基础的参数验证。验证完成后,系统将触发API接口进行服务器端交互请求,以执行相应的业务逻辑。在请求开始前,会调用app.preloader.show方法来显示加载层,待响应结束后再进行关闭。在执行过程中,用户输入的昵称将被获取并异步发送到后端进行处理。
11、在后台用户设置中心(xinle_user)新增一个子页面:用户基础设置。常见的功能配置和个人操作权限将在此通用基础页面进行管理。该页面的图标标识为fa-chrome。功能配置尽量细化,例如下单权限、交易权限及昵称修改等设置,均可根据实际需求场景决定功能启用或关闭。
Warning: Trying to access array offset on value of type bool in /www/wwwroot/www.acocoa.com/wp-content/module/public/function/acocoa/function/jinsom.php on line 163
拉黑 举报 打赏 回复754楼
1、用户在完成实名成功后会触发一个名为 xinle_real_callback 的回调,该回调用于处理一些异步操作,目前是一个预留事件。无论是现在的手机号三要素实名,还是将来的面部识别实名认证,这个回调钩子都会被触发。在回调触发时,会传递 user_id,内部通过读取用户自定义字段 real 来获取用户的实名信息,以进行相应的业务处理。该回调通过 xinle_swoole_asyn 异步执行,不会阻塞当前进程,因而不会影响系统的响应性能。
2、xinle_is_api_phone_real的整个执行流程如下:用户登录验证 检查 $user_id 是否为空:如果用户未登录,返回错误代码 1,提示用户需要登录 (错误:请登录后进行操作)。 获取用户绑定手机号 从用户元数据获取手机号:使用 get_user_meta($user_id, 'phone', true) 函数。 验证手机号是否存在:如果不存在,返回错误代码 1,提示绑定手机号 (错误:请先绑定手机号再进行核验)。 实名验证检查 检查用户是否已实名:通过 get_user_meta($user_id, 'real', true)。 已实名则返回:若已经实名,返回错误代码 1,提示已经完成实名验证 (错误:该账户已完成实名验证)。 姓名格式验证 使用正则表达式检查姓名格式:preg_match('/^[\x{4e00}-\x{9fa5}]{1,7}$/u', $name) 确保是 1 到 7 个中文字符。 格式不符则返回:返回错误代码 1,提示姓名格式错误 (错误:姓名必须为中文且长度不超过7个字符)。 身份证号格式验证 使用正则表达式检查身份证号格式:preg_match('/^\d{17}[\dXx]$/', $code) 确保是合规的 18 位身份证号。 格式不符则返回:返回错误代码 1,提示身份证号格式错误 (错误:请提供有效的18位身份证号码)。 Redis缓存检查 生成缓存键:$redis_key = __FUNCTION__ . ':' . $phone . $name . $code。 获取缓存:get_redis_meta($redis_key) 检查缓存中是否已有验证结果。 每日行为限制检查 检查每日限制:调用 xinle_is_user_daily($user_id, 'phone_real')。 超出限制则返回:如果每日请求超出限制,则直接返回对应结果。 获取API密钥 获取 SecretID 和 SecretKey:通过 xinle_get_option('xinle_appkey_tx_real_SecretID') 和 xinle_get_option('xinle_appkey_tx_real_SecretKey') 获取。 密钥缺失则返回:若任一缺失,返回错误代码 1,提示密钥配置不完整 (错误:API密钥配置不完整)。 API请求准备 生成请求签名:通过 hash_hmac 生成签名。 准备请求头和参数:设置请求方法、URL和头部信息。 使用 curl_init() 初始化 CURL 请求。 执行API请求 配置 CURL 选项:设置请求 URL、返回类型、超时时间、请求方法、参数及 HTTP 头。 执行请求并处理响应:通过 curl_exec() 执行请求,并获取 HTTP 状态码与响应数据。 处理API响应 解析JSON响应:使用 json_decode()。 根据返回的数据处理结果:通过结果码进行不同处理: 信息一致:进行数据存储和更新,调用回调函数。 信息不一致:返回错误信息。 无记录:返回无匹配信息的错误。 异常处理 捕捉并处理异常:使用 try-catch 结构捕捉执行过程中的异常,返回错误信息。 返回结果 返回给调用者:最终返回 $result。
3、新增方法:xinle_is_real,用于验证用户是否已经完成了实名认证。如果用户已经完成实名认证,该方法将返回一个包含认证信息的数组,其中包括以下字段: time:实名核验通过的时间。 name:用户的真实姓名。 code:身份证号码。 sex:性别(男、女)。 address:地址(包括省、市、区)。 birthday:出生日期。 phone:实行实名核验的手机号。 fingerprint:指纹信息。 如果用户未完成实名认证,则该方法将直接返回 false。特别需要注意的是,在显示身份证号码时,建议对其进行脱敏处理,以保护用户隐私。
4、在 xinle_is_profile 方法中增加一个新字段【is_real:账户是否已完成实名认证。若已完成,则返回 true;否则,返回 false】。在方法内部,借助三元运算符来检查字段 real,根据其结果返回相应的布尔值。前端可以通过 xinle.is_real 直接验证用户是否已实名认证,且返回的结果为布尔值。
5、在新增 is_real 字段之后,必须调整 xinle_is_profile 的缓存刷新机制,以确保当用户完成实名认证后,可以及时清除缓存查询结果,返回准确可靠的用户资料信息。具体处理方案如下:通过 xinle_update_user_meta_hook 来监听用户自定义元字段的动态变化。当 real 字段发生变动时,立即调用 delete_redis_meta 清理 user_profile 缓存。这一机制确保用户的最新认证状态能够及时反映在系统中,提供最新的用户信息给前端。
6、前端在发起实名验证请求时,为了在等待响应期间避免用户退出或执行其他操作,会通过 app.preloader.show() 显示加载指示器,提醒用户操作正在进行中。在指示器显示期间,用户无法进行其他操作。当后端返回响应后,无论结果如何,都会关闭指示器。如果验证失败,将弹出 app.dialog.alert 错误对话框,让用户了解具体原因;如果验证成功,则会触发 xinle_msg 文字提示,告知用户实名成功。为防止重复操作,认证按钮将被设为不可点击,文字更改为“账户实名成功”,按钮背景色修改为 #f22db7。此外,两个输入框(身份证号码、姓名)也会设为不可点击。不论成功或失败,都会通过 closeSheet 关闭弹出层。
7、前端新增了一个通用回调方法:xinle_callback_real(real)。该方法会接收实名认证对象信息 real(由后端返回),包括以下字段:time、name、code、sex、address、birthday、phone。这个回调是为全局事件处理预留的。目前的实现方式是将 user.real 对象标记为 true,以便在不刷新页面的情况下,用户完成实名认证后,检测机制能够判断其已完成实名。
8、xinle_callback_real 方法进行了重要更新:当用户完成实名认证后,将用户的昵称更改为“实名主体姓名+UID”。例如,张文军32。加入UID是为了应对常见的重名情况,保证昵称的唯一性。后续可以考虑开放用户昵称的重置功能,具体需评估昵称在平台中的使用方式。如果昵称不涉及社交的唯一性,则可以允许重名。
9、手机三要素实名流程完成封装,整个前端页面的执行流程如下:页面初始化: 执行 pageInit 和 pageBeforeIn 事件,在页面加载时获取并设置用户数据,例如手机号。 用户输入信息: 用户在表单中输入姓名和身份证号码。 系统显示提示信息,要求信息真实且与运营商登记信息一致。 输入验证: 验证姓名必须为1到7个中文字符。 验证身份证号为标准的18位(前17位为数字,最后一位为数字或'X')。 显示验证信息: 填充弹出层,将用户的输入信息展示给用户进行核对。 确认弹出层: 用户核对信息后,确认执行实名认证。 提交认证请求: 用户确认后,通过API将数据提交到服务器进行身份验证。 在验证成功后,界面更新为"账户实名成功",并使输入框和提交按钮不可编辑。 认证结果处理: 成功:更新页面提示信息为成功状态,并调用相关回调操作。 失败:显示错误信息,提示用户重新尝试或联系支持。 异常处理: 系统提供错误提示,如发生请求异常或者网络问题,提醒用户稍后重试。 页面清理: 执行 pageBeforeRemove 事件清理页面相关变量以便释放资源。
10、实名认证页面(real_update_initialization)在初始化请求时,会通过get_user_meta来检查用户是否已完成实名认证。如果用户已完成实名认证,则构建并返回对应的HTML结构;如果未实名认证,则按照原计划构建相应的认证申请表单。这样,无论用户是否已实名认证,访问认证页面时都能看到对应的内容:已实名用户会看到相关信息,而未实名用户则会看到实名认证的相关表单。
11、新增方法 xinle_mask_IdCard:这个方法用于对身份证号码进行脱敏处理。首先,会检查传入的身份证号码是否为18位数字。如果是,将中间的10位数字替换为星号,以此保护用户的隐私。如果身份证号码不是18位,则直接返回原始号码。根据具体需求,该方法可以进行调整,或者在必要时抛出异常。
Warning: Trying to access array offset on value of type bool in /www/wwwroot/www.acocoa.com/wp-content/module/public/function/acocoa/function/jinsom.php on line 163
拉黑 举报 打赏 回复753楼