• 注册
  • 查看作者
  • 宫论项目开发记录

    记录2023年项目进度周期。

    刷新置顶
  • 2
  • 767
  • 0
  • 24.99w
  • 小小乐小可鸭鸭

    请登录之后再进行评论

    登录
  • 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位,则直接返回原始号码。根据具体需求,该方法可以进行调整,或者在必要时抛出异常。
  • 0
    小小乐lv.2实名用户
    2025年9月26日
    1、用户在点击认证按钮时,会触发内部的点击监听动作(submitAuth)。系统将通过 page_content 内部选择器获取用户的姓名和身份证号码。系统会检查姓名是否为中文,且长度不超过7个字符。如果不符合这些条件,会返回错误提示。接着,系统验证身份证号码是否符合标准的18位格式,即前17位是数字,通过正则表达式进行匹配。如果不符合要求,也会弹出相应的错误提示。所有条件符合后,系统将进行下一步操作。
    2、在认证过程中,由于实名一旦完成,将无法修改或重新认证。因此,在执行认证前,需要增加一个弹出层以确保用户进一步确认操作。在弹出层中将显示以下信息:1. 标题为“手机三要素身份实名”;副标题为“请您认证核对以下信息,并查看注意事项”。2. 身份信息部分:该部分将读取页面表单参数,展示姓名、身份证号码和手机号,以便于用户核对信息的准确性。3. 注意事项包括:1)实名认证限额为3次,请核对用户信息以避免失败。2)手机号码的实名信息需与上述信息一致。3)账户实名核验完成后,将无法更改或重新认证。4. 取消按钮用于关闭弹出层。5. 认证按钮用于执行核验API的交互操作。
    3、后端在发起实名认证信息核验的时候,会执行以下参数检查:获取输入: 从 $_POST 中获取 name 和 code。 验证姓名: 使用正则表达式验证姓名必须是1到7个中文字符。 如果不符合,调用 xinle_exit(1, '姓名必须为中文且长度不超过7个字符') 退出。 验证身份证号: 使用正则表达式验证身份证号必须是18位,前17位为数字,最后一位可以是数字或 'X'。 如果不符合,调用 xinle_exit(1, '请输入有效的18位身份证号码') 退出。 检查用户登录状态: 检查用户是否已登录 (empty($user_id))。 如果未登录,设置错误信息并调用 xinle_exit 退出。 检查实名认证状态: 获取用户实名信息 get_user_meta($user_id, 'real', true)。 如果已完成实名认证,设置相应错误信息并退出。 检查手机号绑定状态: 获取手机号信息 get_user_meta($user_id, 'phone', true)。 如果未绑定手机号,设置错误信息并提示需要绑定手机号,然后退出。
    4、在后台的xinle_appkey配置页面中,需要新增两个字段:xinle_appkey_tx_real_SecretID,用于存储云市场分配的密钥Id;xinle_appkey_tx_real_SecretKey,用于存储云市场分配的密钥。这两个字段是为了接入腾讯云市场的第三方API接口,该接口用于手机三要素实名验证,主要用于核验姓名、身份证号码和手机号是否匹配。此接口为付费接口,每次调用的成本大约为0.16元。相比之下,如果通过APP原生的支付宝人脸扫描进行核验,每次成本大约为0.7元。因此,新版实名认证接口暂时采用三要素的验证方法进行处理。
    5、为方便接口的维护,需新增一个脚本函数库:functions/api.php。所有涉及第三方接口的功能(如消息推送、快递查询、实名认证处理、短信发送等)都将整合到这个脚本中进行处理。接口函数需进行命名规范化处理,采用前缀为xinle_api_XXXXX的形式,以表明该函数是API外部请求。虽然已有的API请求函数不必强制遵循此命名规则,但需尽量将其全部迁移至此脚本库,以实现统一的管理和维护。
    6、为了有效防止用户频繁调用API接口,需要在用户的每日行为限制规则(xinle_user_daily_limit)中增加一个新场景:手机号三要素核验,唯一标识为phone_real,该操作的每日上限为3次。在调用API接口时,可通过xinle_is_user_daily($user_id, $type)方法检查用户是否超过每日允许的验证次数。若超出限制,系统将进行拦截并阻止此请求。此拦截器会在每天00:00自动重置用户的计数,将次数归零。
    7、优化xinle_is_user_daily方法,如果用户的行为次数检查未达到上限,函数除了返回code=0外,还需附带返回number字段,表示剩余的调用次数。通过这个字段,调用方可以清晰地了解用户剩余的操作次数,以便执行相应的业务处理。此外,在函数的内部逻辑中,需要新增一个判断语句:如果VIP用户的操作次数与普通用户一致,则不再触发VIP用户的特殊检测逻辑,而是直接返回系统拦截信息,并提示“今日' . $limit['name'] . '已达上限”。
    8、xinle_is_api_phone_real完成封装处理,整个执行流程如下:验证用户登录状态: 检查 user_id 是否为空,若为空返回错误信息要求登录。 获取用户手机号: 从用户元数据中取得号码,若未绑定,返回错误提醒用户绑定手机号。 检查实名验证状态: 从用户元数据中检查实名状态,若已实名,返回提示信息。 验证姓名格式: 检查 name 是否为1至7个字符的中文。 验证身份证号格式: 检查 code 是否为17位数字加最后一位数字或X构成。 检查缓存以避免重复验证: 通过 Redis 缓存防止重复验证。 用户每日行为限制检查: 确认用户是否超过每日操作限制。 获取API密钥: 检查API密钥是否完整。 发送API请求进行实名验证: 构建请求签名。 配置并发送CURL请求。 处理各种错误情况(如超时、异常HTTP状态码、解析错误)。 处理API返回结果: 检查结果码是否表明成功。 根据返回的结果处理验证状态并写入用户数据。 错误处理: 捕获异常并返回相应的错误信息。
    9、xinle_is_api_phone_real 一旦调用API接口并通过用户实名核验,将构建real_data数组,按顺序写入以下字段: time:实名核验通过的时间。 name:用户的真实姓名。 code:身份证号码。 sex:性别(男、女)。 address:地址(包括省、市、区)。 birthday:出生日期。 phone:实行实名核验的手机号。 fingerprint:指纹信息,通过xinle_is_fingerprint获取,用于溯源操作来源,指纹为设备的唯一标识。 real_data数组将被写入到用户自定义字段real中,以标记用户完成认证。
    10、如果 API 接口返回的 $apiResult['code'] 为200,表示接口已成功完成扣费操作。这时将会触发两个计数器的动作:首先,通过调用 xinle_redis_user_statistics_update 更新用户的认证计数器,以配合每日行为拦截器,防止用户无限制地发起 API 请求。其次,通过调用 xinle_redis_count 增加 API 计数器,以记录 api_real_phone 的请求次数,为后期进行 API 接口的实时统计提供依据。
    11、在 xinle_is_api_phone_real 中增加了 Redis 缓存设计。无论手机实名的三要素验证成功与否,只要扣费成功,结果都将保存到 Redis 缓存中。在基础拦截效验后,会检查是否存在与本次请求相同的缓存记录(匹配手机号、姓名和身份证号)。如果缓存记录存在,则直接返回缓存内容,以避免重复执行导致不必要的扣费。缓存的有效期设置为30天,虽然原则上可以设置为永久,但考虑到实际需求,一个较长的有效期已经够用。值得注意的是,当从缓存中返回结果时,不会触发行为计数器的递增,也不会占用用户的实名额度。
  • 0
    小小乐lv.2实名用户
    2025年9月25日
    1、在保存地址的过程中,前端现在会额外传递一个名为number的变量。如果number存在,这意味着此次操作是修改现有地址,而不是创建新地址。number是需要修改的地址的唯一标识。在处理修改地址的情况下,在原有的保存逻辑基础上新增了两个步骤。首先,新地址的number不再使用uniqid生成,而是直接采用传递过来的number。其次,在保存地址之前,会读取现有的address字段,通过遍历的方式找到与number匹配的记录,并将其删除。这样,修改后的地址作为新地址保存,确保不会与旧地址发生冲突。
    2、当用户点击区域(TAB)选项卡时,系统会自动执行清理操作,以确保数据的正确性和逻辑的一致性。例如,当用户点击“省份”选项卡时,会清空“区县”和“街道”的数据;点击“城市”选项卡时,会清空“街道”的数据。这种处理方式可以有效防止上级TAB内容的遗留问题,避免因数据未及时更新而导致用户选择错误的情况。举个例子,假如用户之前选择的是“湖北省-武汉市-XX区”,但当用户将“省份”切换为“江西省”后,如果没有清理机制,手动切换到“城市”TAB时,仍会显示湖北省的城市列表,而非江西省的城市列表,继续选择下去必然会导致数据错误。正确的处理方式是在用户更改上级选项时,自动重置所有相关的下级列表,确保每一步的选择都与当前的区域逻辑保持一致。
    3、用户收件地址页面已全面封装构建,采用了省、市、区县、街道/乡镇四级结构,所有的行政区域查询均通过内置数据表完成,避免对第三方数据的依赖,确保系统的稳定性和可靠性。在收货地址列表页中,用户可以进行新建、修改、复制和删除地址等操作。新建地址页面还支持导入功能,允许用户复制地址信息,并通过一键识别地址实现参数的自动写入,简化操作流程。用户可以设置地址为默认或非默认状态,以便快速使用常用地址。地区选择通过TAB弹出层引导用户逐级选择,用户首先选择省份,然后系统跳转至对应省份的城市列表;选择城市后,页面会跳转至该城市的区县列表;选择区县后,再跳转至街道或乡镇选择。完成街道选择后,系统将收集所有已选地区信息,并展示在页面上。为了管理地址数量,系统支持后台设置地址保存上限,比如最多允许保存五个地址。地区字段结构包含了ID和名称,用户可以通过ID查询数据表以获取详细的地理位置信息,如城市的GPS经纬度、上级行政单位以及行政区域编号等,为用户提供全面的地址信息服务。
    4、每当用户访问时,系统都会触发指纹事件,将用户的指纹信息传送至后端。后端接收到指纹后,会执行一系列处理流程,并将启动来访的数据返回给前端。目前已集成一个异步回调机制:xinle_fingerprint_callback,当所有事件处理完毕后,系统将利用Swoole服务器执行复杂的回调任务。这种架构设计不仅提升了系统的响应效率,还确保了用户数据处理的准确性与及时性。通过异步回调的方式,后端能够在完成主要处理任务后,继续执行其他复杂操作,从而优化整体性能和用户体验。
    5、新增用户自定义字段:新增了一个名为“real”的用户自定义字段,用于存储用户的实名制信息。该字段采取数组结构,预设包括以下字段参数:姓名(name)、身份证号码(code)、认证手机号(phone)、认证时间(time)。当用户完成实名制认证后,这个字段将用于存储对应的认证信息。实现实名制认证的判断时,只需验证该字段即可。由于线上交易大多需要用户进行实名制认证,此设计符合法律规定,并为未来业务需求做好了准备。
    6、新增页面模板:update_real:创建用户实名认证页面。在后台同样地新增页面在xinle_page_config中的配置,并同步增加该页面组件。模板地址位于:/settings/real_update.html。启用登录限制功能,如果用户未进行登录,将强制跳转至对应的登录页面。需要注意的是,基于页面模板的设计,所有页面的集成都需要通过后台进行注册,以便于管理和维护。在首页初始化时,该列表会挂载至路由,完成页面的集成和初始化。
    7、real_update用户实名页面的结构采用APP模板设计,引入全局变量page_name作为页面的动态标识,所有的CSS或交互行为都是通过这一动态变量进行构建和设计。认证页面采用(姓名、身份证、手机号)三要素进行实名验证。单次实名验证的成本为0.15元,如采用支付宝人脸识别,成本则为0.7元。后续可能会采用后者。用户在实名认证页面中需要手动填写的内容仅包括:姓名和身份证号码,手机号则从账户已绑定的手机号中自动读取,以确保账户的最终归属权。
    8、新增了用户协议配置组(xinle_user_protocol_config),特别加入了实名认证协议,该协议的唯一标识为 "real"。此协议将会在用户实名认证页面进行展示,用户在提交实名认证时需要同意并认可此协议方可进行下一步操作。为了在前端更为便捷的提取对象参数属性,封装了一个全新方法 xinle_is_config。该方法可用于在配置数组中查找特定键的配置项,如果找到则返回该项,否则返回 null。配置项数组 $configArray 内的每个元素均为包含 key 键的对象,而 $key 则表示要查找的键。此函数的具体使用方式与后端的 xinle_is_config 保持一致。
    9、在动态构建 Framework7 路由组件时,会通过 beforeEnter 监听器检查用户的请求访问情况。如果用户访问的是“用户实名页面”,系统会通过 user.is_phone 来检测用户是否已经绑定手机号。如果未绑定,系统将触发 app.dialog.confirm 提示对话框,要求用户绑定手机号才能继续访问页面,提示框标题为“拦截提示”。在用户点击后,系统会触发 xinle_page_open,将用户页面跳转至 binding_phone,引导用户完成手机号绑定。这个过程确保了用户信息的安全性和操作的顺畅性。
    10、当进入 real_update 页面时,会通过 pageBeforeIn 监听器触发后端的初始化 API 请求。目前,该初始化请求会使用 xinle_is_profile 获取用户资料。如果用户未登录,系统将通过 jump 导向登录页面;如果用户未绑定手机号,则会打开绑定手机号页面。接着,通过 get_user_meta 读取 real 字段,如果返回为空,则表示未进行实名制验证;若不为空,则通过 $profile['is_get_phone'] 输出脱敏后的手机号,并返回 code=0。这种机制确保用户信息的完整性和安全性,有助于用户更顺畅体验应用的功能。
    11、实名制页面目前提供三个表单选项。首先是手机号表单,该表单默认情况下是只读状态,无法进行修改,后端会写入脱敏处理后的手机号,例如:136****5953。接下来是身份证姓名,标记为 real_update_name,以及身份证号码,标记为 real_update_code。实名制流程相对简单:用户需先绑定手机号,然后通过该手机号填写姓名和身份证号码,系统会进行三要素实名验证。如果验证成功,则标识为已实名;若未通过,会返回相应的错误信息。需要注意的是,手机号可以随时更换绑定,但实名制信息一经填写则不可更改。
  • 0
    小小乐lv.2实名用户
    2025年9月24日
    1、鉴于部分安卓设备的WebView组件不支持浏览器的navigator.clipboard复制方法,为了彻底解决此类问题,决定在APP端使用uni.setClipboardData来实现跨设备的复制功能。具体的解决方案是,通过WebView向APP发起通信请求,APP接收到请求后,使用原生方法处理复制操作。这种方式不仅能确保在所有设备上实现稳定的复制功能,还能提升用户在使用过程中的体验和便利性。获取id(收件地址身份标识)。然后执行xinle_api_post后端交互处理)
    2、xinle_copy方法进行彻底重构,现在支持APP端和非APP端的处理。具体处理流程:如果检测到当前环境是 APP(通过 xinle_is_app() 判断): 构造一个数据对象(包含 type、content、successMsg)。 调用 xinle_plus_app(data) 进行 APP 原生的复制处理。 直接 return,不再执行后续 Web 端逻辑。 Web端处理 新浏览器(支持 navigator.clipboard) 使用 navigator.clipboard.writeText(text) 异步复制文本。 复制成功后,调用 xinle_msg(successMsg) 显示“复制成功”提示。 复制失败,调用 xinle_msg('复制失败')。 老浏览器(不支持 navigator.clipboard) 创建一个不可见的 <input> 元素,把待复制的文本放进去。 追加到页面 body。 选中 input 内容,然后用 document.execCommand('copy') 复制。 复制成功,显示“复制成功”;失败,显示“复制失败”。 无论成功或失败,都要移除临时 input 元素。
    3、收件地址列表页面,新增btn.copy点击监听器。当用户点击每个地址卡片里的“复制”按钮(.btn.copy),会触发事件委托监听:通过 $(this).closest('.address-card'),找到用户点击的“复制”按钮所在的整个地址卡片元素,确保后续采集的是当前卡片的信息。通过 .address-info 节点,去掉其中的手机号 <span class="phone">,只留下收件人姓名。获取 .address-info 里的 <span class="phone"> 的文本内容。获取 .address-meta(区域+街道)和 .address-main(具体门牌号)的文本,拼接成完整地址。将收集到的姓名、手机号、地址,按照格式拼接成一段完整的文本。将组装好的文本和提示语传入你写的 xinle_copy 复制函数,执行复制操作:复制成功会有“收件地址复制成功”提示;复制失败会有“复制失败”提示。xinle_copy 会自动判断当前是 App 端还是 Web 端,并选择合适的方式将文本复制到剪贴板,同时弹出提示信息。
    4、由于复制功能的重构,需要对data-fancybox监听器(灯箱弹出后,会有下载、复制功能菜单按钮)进行优化处理,以适应新的逻辑。此前,APP端是通过弹出系统组件进行分享,而网页端则执行内置的复制逻辑。现在,所有的复制操作统一改为通过xinle_copy进行处理,并在复制成功后,触发提示信息:“图片地址已复制”。
    5、在地址列表页面新增了一个按钮点击监听事件(btn.update)。当用户点击地址修改按钮时,该监听器将被触发。点击后,系统会获取对应地址的number编码,并通过xinle_page_open方法执行页面访问请求,打开“address_update”页面,即新建或修改收货地址页面。在这个过程中,number编码会通过props参数传递到新页面。在地址新建页面中,系统会使用$f7route.params.number来获取传递过来的地址编号。如果没有传递number,则系统会将其设置为空,这意味着用户正在创建一个新地址;如果传递了number,则表示用户正在修改现有的地址。
    6、在地址新建页面初始化请求时,系统会自动传递一个number变量到后端。后端在处理业务逻辑时,会利用这个number变量判断当前操作是否为修改地址。如果是修改地址,系统会尝试通过get_user_meta函数获取用户的自定义字段:address。如果获取自定义字段失败,则跳过这部分处理;如果成功获取到自定义字段,系统会根据number变量获取相应的收货地址,并将获取到的地址存入address_result数组中。如果获取地址失败,系统将返回相应的错误信息以提示用户。
    7、如果成功获取 address_result,系统将进行一系列数据处理,以确保地址信息的完整性与前端交互的流畅性。首先,从获取的地址中提取详细地址、收件人姓名及手机号,并将这些信息分别赋值到 $result 数组中,以便后续调用。接着,按照省、市、区、街道的层级顺序,提取对应的名称和ID,组装成 $xinle_areas 数组,并存储到 $result['xinle_areas'] 中,确保区域信息结构清晰且易于操作。随后,系统会获取所有省份的选项列表,通过遍历生成对应的HTML结构,其中已选中的省份会加上 on 类并置于最前,其余省份按顺序拼接在后面,最终将生成的HTML代码存储到 $result['province_htm'] 中。紧接着,系统根据当前选中的省份查询其下属的所有城市,并生成城市的下拉选项列表,同样对已选中的城市添加 on 类并优先显示,其余城市依次拼接,最终存储到 $result['city_htm'] 中。对于区县的处理逻辑与城市类似,系统会查询当前城市下的所有区县,生成区县的下拉选项,已选中项加上 on 类,其余项按顺序拼接,存储到 $result['area_html'] 中。街道信息的处理也是如此,系统会进一步查询当前区县下的所有街道,生成街道的下拉选项列表,已选中的街道加上 on 类,其余街道依次拼接,最终存储到 $result['street_html'] 中。
    最后,系统将省、市、区、街道的信息按层级拼接为一个完整的字符串,以便前端能够直观地显示地区选择器的内容,提升用户体验。函数执行完成后,系统将输出 $result 数组的内容,通常以JSON格式返回给前端,确保数据传递的标准化与高效性。
    8、如果返回了xinle_areas对象,那么说明后端已成功取得了修改地址的参数信息。此时页面会发生以下交互处理:1. 地址信息回显 如果有收件人姓名,则自动填充到昵称输入框。 如果有手机号,则自动填充到手机输入框。 如果有详细地址,则自动填充到地址输入框。 2. 地区选项渲染与交互 2.1 省份列表渲染与选择 如果有省份列表数据,则渲染到省份选择区域。 用户点击省份后,记录选中的省份ID,并将当前项高亮显示且移到列表首位。 省份选择后,清空城市、区县、街道的选中状态,并触发城市列表渲染,切换到城市选择标签。 2.2 城市列表渲染与选择 如果有城市列表数据,则渲染到城市选择区域。 用户点击城市后,记录选中的城市ID,当前项高亮并移到列表首位。 城市选择后,清空区县、街道的选中状态,触发区县列表渲染,切换到区县选择标签。 2.3 区县列表渲染与选择 如果有区县列表数据,则渲染到区县选择区域。 用户点击区县后,记录选中的区县ID,当前项高亮并移到列表首位。 区县选择后,清空街道的选中状态,触发街道列表渲染,切换到街道选择标签。 2.4 街道列表渲染与选择 如果有街道列表数据,则渲染到街道选择区域。 用户点击街道后,记录选中的街道ID,当前项高亮并移到列表首位。 省、市、区、街道的ID和名称会组成一个对象,拼接成完整的地区字符串,填入地区选择框,并关闭地区选择弹窗。 3. 地区选择结果回显 如果有完整的地区字符串,则直接填充到地区选择框。 如果有地区对象,则同步省、市、区、街道的ID为当前选中项,并输出到控制台,便于调试。
    9、在修改地址的功能中,对返回的数据结构进行了优化,新增了一个名为default的字段。该字段用于标识当前地址是否为默认地址,其值为布尔类型:如果该地址是默认地址,则返回true;否则,返回false。前端在接收到该字段后,会进行逻辑判断:当default字段的值为true时,将使用jQuery将xinle_address_defalut开关选项卡设置为开启状态,以直观地告知用户该地址是默认地址。这一改进不仅提升了用户体验,使用户能够更加方便地识别默认地址,同时也增强了系统的交互性和响应能力。
    10、地址页面新增了两个let作用域的动态变量:page_name_title和page_name_btn。page_name_title用于设置页面标题,默认显示为“新建地址”;page_name_btn则用于页面操作按钮的文字显示,默认显示为“添加新的收货地址”。为了优化用户体验,当检测到变量number存在时,page_name_title会自动更新为“修改地址”,而page_name_btn则会变更为“修改保存”。这种设计使得用户在编辑或修改地址时能够更加清晰地识别当前操作,提升了页面的易用性和交互效果。
    11、在用户管理地址功能中,为了确保始终有一个默认地址存在,设置了一些规则。当用户尝试修改地址时,如果该地址是默认地址,则系统会隐藏取消默认状态的选项,以防止用户误操作导致没有默认地址的情况出现。如果用户要设置一个新的默认地址,他们可以通过选择非默认地址来进行设置,此时系统会自动将新的选择覆盖原有的默认地址。这样设计的目的是避免出现用户没有默认地址的情况,同时也尊重用户的选择,不会在未经同意的情况下随意更改默认地址。
  • 0
    小小乐lv.2实名用户
    2025年9月23日
    1、在完成基础表单的写入后,会对【province_htm、city_htm、area_html、street_html】这四个字段进行检查,确保它们全部存在。这一步骤的目的是确认后端已经成功渲染了tab内容。确认无误后,系统会直接将生成的HTML写入到相应的tab中。这样一来,当用户打开tab弹出层选择城市和区域位置时,相关的列表会立即显示,大大提升了用户的操作体验。此外,在将HTML内容写入页面后,系统会重新设置对点击事件的监听,以确保用户在选择城市和区域时,能够触发相应的监听行为并作出正确的响应。
    2、前端响应后端地址响应结果的处理流程如下:一、导入地址及解析流程用户触发导入操作用户在页面上点击“导入地址”按钮,弹出一个输入框或弹窗,让用户粘贴或输入一段包含收件人、电话、地址等信息的文本。提交地址文本用户输入完成后,点击“解析”按钮,前端将输入的地址文本通过Ajax请求发送给后端接口。后端返回解析结果后端解析成功后,返回结构化的地址信息,通常包括收件人姓名、手机号、省市区街道等地区信息、详细地址、以及可能的错误或提示信息。二、解析结果处理及表单自动填充弹窗关闭与提示反馈前端收到解析结果后,会首先关闭导入弹窗,并通过消息提示(如layer.msg、alert等)反馈解析结果(成功或失败、原因等)给用户。自动填充基础信息若解析结果正确,前端会自动将“收件人姓名”、“手机号”、“详细地址”等字段填充到表单对应输入框内,用户无需手动输入,提升效率。三、地区四级联动交互地区选择的渲染与初始化如果解析结果带有地区相关信息(如省、市、区、街道的名称和ID),前端会自动渲染地区选择组件(四级联动),并将解析到的省、市、区、街道作为初始选中项高亮显示。地区选择的交互体验用户可以修改地区,每一级(省、市、区、街道)点击后,都会自动加载下一级的可选项。列表中已选中的地区会高亮显示,并通常会置顶,方便用户一目了然已选内容。若上一级地区发生变化,下一级及以下的选项会自动重置,避免数据不一致。地区名称自动组合当用户选择完成到最后一级(街道)后,系统会将省、市、区、街道的名称自动拼接成完整的地区字符串,填充到地区输入框中,直观展示当前所选地址。关闭地区选择弹窗地区选择完毕后,地区选择弹窗会自动关闭,用户回到主表单页面继续操作。四、数据同步与后续处理地区数据同步存储解析结果中如果带有地区对象的详细数据(比如省市区街道的ID、名称等),页面会将这些数据同步存储在表单的隐藏字段或内存中,便于后续表单提交时直接带上这些结构化数据。错误处理与人工干预如果解析失败,或部分信息无法准确识别,系统会提示用户手动补充或修改相关内容,确保最终提交的数据完整准确。表单提交用户检查并确认所有信息无误后,点击“提交”按钮,所有结构化的地址信息(包括姓名、电话、省市区街道ID和名称、详细地址等)会一并提交到后端,完成整个导入与编辑流程。五、交互优化细节输入框防抖与校验地址输入框会有基本的格式校验,避免空内容提交,提升用户体验。异常提示友好如遇到解析错误或接口异常,系统会用友好的方式提示用户具体原因及建议。联动组件兼容性地区选择组件支持多种数据结构,兼容常见的省市区库和第三方接口返回的数据格式。
    3、当用户进入新建地址页面时,系统会自动初始化各个选项卡的内容。这样一来,即使用户尚未选择上级选项卡的内容,打开下级选项卡时也不会出现空白页面,而是会显示提示信息,如【省份列表初始化失败,请先选择所在省份、请先选择所在城市、请先选择所在区县】。一旦用户选择了相应的选项卡内容,这些提示信息将自动被用户的选择覆盖,从而提升用户体验并减少误操作的可能性。
    4、用户收件地址字段(address)结构进行了优化和补充,以提升系统的稳定性和灵活性。首先,新增了一个名为“number”的字段,用于存储唯一身份编码。这一编码通过uniqid()函数生成,确保每个收件地址都有一个独特的标识符,避免了原本依赖数组序号定位收货地址的潜在问题。因为在修改或删除地址时,如果没有重新刷新数组结构,可能会导致数据操作与实际需求不匹配。通过这种编码方式,可以有效避免这些问题。其次,增加了一个名为“detailed”的字段,用于存储收货地址的详细信息,除了省市区和街道之外的其他细节。这一改进特别适用于需要更精细地址信息的场景,提升了系统的灵活性和用户体验。
    5、在收货地址列表页上进行了两项优化处理。第一,将初始化后端请求的触发时机从pageInit改为pageBeforeIn。pageInit仅在页面首次加载时执行,而pageBeforeIn则在每次进入页面前都会执行初始化操作。由于该页面涉及二级跳转,每次创建新地址后返回页面时需要更新地址列表。通过pageBeforeIn监听器,可以自动更新列表,避免手动维护,因为返回页面时会自动触发更新操作。第二,在页面初始化期间,加入一个加载动态指示器,以提示用户列表信息正在加载。由于初始化操作在进入页面时执行,正常情况下用户不会看到加载提示,只有在网络延迟导致请求时间较长时,加载指示器才会出现,以确保用户知道页面正在处理请求。
    6、后端在执行address_list_initialization初始化请求时,会执行以下处理:判断用户是否已登录 检查 $user_id 是否为空。 如果为空,说明用户未登录,返回错误信息(请登录后进行操作),并指示前端跳转到登录页,代码终止。 获取用户收货地址 调用 get_user_meta($user_id, 'address', true) 获取当前用户的收货地址信息。 如果收货地址为空,返回错误信息(您还没有设置过收货地址),并生成空地址提示HTML,代码终止。 遍历并渲染地址信息 初始化变量 $i 和 $html。 遍历每一个地址数据 $address as $data: 拼接省市区街道的地址元数据 $ddress_meta。 获取详细地址 $address_main。 根据地址是否为默认地址,渲染“设为默认”或“已设为默认”按钮。 拼接每一条地址的HTML片段,包含:地址元数据、详细地址、联系人信息、操作按钮(设为默认、删除、复制、修改)。 递增计数器 $i(可用于统计条数)。 返回地址信息 设置返回码为0,消息为“获取成功”,并将拼接好的HTML赋值给$result['html']。 通过 xinle_exit($result) 返回结果并终止脚本。
    7、在收货地址列表页中新增了【默认地址】的点击监听器,使用pageAfterIn来监听set-default元素的点击事件。用户可以通过点击“设置为默认”按钮来触发内部事件。当点击发生时,首先通过hasClass方法检测当前对象是否已经包含类名active,如果存在该类名,则说明该地址已经是默认收货地址,从而跳过后续处理,避免不必要的操作。若未包含active类名,则通过data属性获取当前地址的ID(即收件地址的身份标识)。接着,执行xinle_api_post后端交互处理,将该地址设为默认。这种处理方式确保了用户体验的流畅性和系统操作的准确性。
    8、当前端接收到后端关于更改默认收件地址的响应结果后,会根据响应结果执行相应的业务逻辑处理。如果响应结果的code为1,则会触发错误提示,提示用户操作未成功。如果code为0,则按照以下步骤进行处理:首先,找到所有当前已被设置为默认的按钮(即带有active类的.set-default按钮)。对这些按钮进行操作:移除active类(表示该地址不再是默认地址),将按钮的文本更改为“设为默认”,并显示空心圆圈图标。接下来,将用户当前点击的.set-default按钮设置为默认:添加active类(标识该地址为新的默认地址),将按钮文本更改为“已设为默认”,并显示实心对勾圆圈图标。最后,将用户当前点击的.address-card(即这条地址)移动到地址列表的最前面:使用prependTo方法,将$card插入到.address-list的第一个位置,使其成为数组/列表的第一项。这样一来,UI界面上默认地址始终位于最上方,符合用户常见的使用体验。
    9、在收货地址列表页新增了一个删除按钮(.btn.delete)的点击监听事件,当用户点击这个按钮时,将会触发删除地址的事件处理。由于删除操作较为敏感,系统会弹出一个确认对话框,询问用户“确定要删除该地址吗?”只有在用户点击确认后,才会执行删除逻辑。在用户确认后,系统将会发起一个API请求,携带需要删除的地址标识number发送至后端,以执行相应的请求。在此过程中,会显示一个加载指示器,提示用户正在进行处理。必须等待后端完成响应处理后,才可以进行下一步操作,以确保删除操作的安全性和准确性。,将会触发api请求,携带被删除的number(收货地址标识)到后端执行响应请求。
    10、后端收到地址删除请求后,会依次执行以下处理动作:1. 检查用户是否登录 如果$user_id为空,说明用户未登录。 返回错误信息“请登录后进行操作”,并终止后续执行。 2. 获取要删除的地址编号和地址列表 从POST请求中获取要删除的地址number。 从用户元数据中读取所有收货地址address。 3. 检查地址列表有效性 如果地址列表为空或不是数组,返回错误“收货地址列表为空”,并终止。 4. 判断地址数量 如果地址列表数量小于等于1,说明只有一个地址。 返回错误“至少保留一个收货地址”,并终止。 5. 查找要删除的地址 遍历所有地址,找到number等于要删除编号的地址。 如果没找到,返回“未找到该地址”并终止。 6. 检查是否为默认地址 如果要删除的地址是默认地址(default不为空), 返回错误“默认地址不能删除,请先更换默认地址”,并终止。 7. 删除地址并保存 用array_splice删除找到的那条地址。 用update_user_meta保存新的地址列表。 8. 返回成功信息 返回删除成功。
    11、当前端收到删除请求的响应结果后,将根据返回的code来执行相应的页面交互操作:如果code=1,则表示删除请求被拒绝,此时会触发xinle_msg来加载错误信息并展示给用户;如果code=0,则表示删除成功,系统将获取对应的父级address-card元素,并通过remove方法来删除该卡片。在执行删除操作时,会应用slideUp动画效果,使卡片在页面上以滑动的方式消失,提升用户体验。
  • 0
    小小乐lv.2实名用户
    2025年9月22日
    1、xinle_parse_address_hook已完成封装,整个处理流程如下:1. 检查缓存 生成redis缓存key:xinle_parse_address_hook: + md5($address) 调用get_redis_meta($redis_key)从Redis获取该地址的解析缓存。 如果缓存命中(即$redis_meta非空),直接返回缓存内容,函数结束。 2. 初始化参数 初始化空数组$result用于存储返回数据。 获取腾讯云市场分配的SecretID和SecretKey(从系统配置读取)。 生成当前GMT时间字符串$datetime。 构造签名字符串$signStr,用$secretKey做HMAC-SHA1加密并base64编码,得到$sign。 构造授权信息$auth,包含id、x-date、signature。 3. 组装请求参数 设置请求方法为POST。 组装请求头$headers,包含Authorization和Content-Type。 组装POST的body参数,只有一个字段address。 把参数用http_build_query编码为字符串$sendData。 设置API请求地址$url。 4. 发送HTTP请求 初始化curl,设置curl选项: URL、返回内容、超时时间、请求方法、请求头、POST内容等。 执行curl请求,获取返回内容$data。 5. 处理返回结果 如果curl报错,设置$result['code']=1,$result['msg']为curl错误信息。 否则,尝试用json_decode将返回内容转为数组$dataArray。 如果不是有效的JSON,设置$result['code']=1,$result['msg']为"Invalid JSON response"。 如果返回数组code为200,说明解析成功: 设置$result['code']=0,$result['msg']='地址解析成功',$result['data']为API返回的数据。 同时把解析结果缓存到redis,缓存1天(86400秒)。 否则,说明API返回失败: 设置$result['code']=1,$result['msg']为API返回的错误消息,$result['error']为API错误码。 6. 关闭curl、返回结果 关闭curl连接。 返回$result数组。
    2、在使用xinle_parse_address_hook进行地址解析时,如果返回的状态码为200,则表示接口响应成功。此时,系统会触发Redis计数器功能,通过xinle_redis_count对API请求接口【api_parse_address】进行计数加1处理。这一机制可以帮助通过相应的方法获取每日、每周、每月以及总的接口调用次数,提供详尽的使用统计数据。未来,该功能还将支持账单统计,以记录和分析API接口的费用支出,便于更好地进行成本管理和预算规划。
    3、新增了一种方法xinle_is_area_code_query,用于通过行政编码获取对应的城市信息。该方法仅返回层级1-2-3的信息,即省、市、区的相关数据,无法直接处理街道和乡镇的查询。如果需要获取街道和乡镇的信息,则需先通过县区进行查询,获取相应的数据结构后,再进行名称匹配处理以获得具体结果。为了提高查询效率,该方法支持Redis缓存,缓存的数据有效期为30天,从而减少重复查询的开销并提高系统性能。
    4、在处理地址解析请求时,address_parse首先通过xinle_is_login检查用户的登录状态。如果用户未登录,系统会立即返回错误信息。若用户已登录,系统则调用xinle_parse_address_hook来请求API,以获取相应的地址数据。如果API请求失败,系统会将错误信息直接反馈给前端进行响应处理;如果请求成功,系统将构建一个包含以下字段的结果:result(code=0)、msg(地址解析成功)、detail(详细地址)、name(收件人姓名)、phone(手机号)。这些是必定返回的字段。对于地区位置的返回,需要进行更复杂的交互处理,是否能够成功返回仍需进一步验证。
    5、在通过地址解析接口获取基础数据后,会对town字段进行验证检查,这个字段用于存储街道信息。如果该字段不存在或获取失败,系统将立即终止后续的处理流程,并返回用户的姓名、手机号和详细地址。同时,系统会附加一个error字段,提示解析失败的原因:“解析失败:街道乡镇获取失败。” 因为在进行区域位置筛选时,必须同时具备省份、城市、区县和街道这四个要素,缺少任何一个都会导致筛选组件无法正常运作,从而需要用户手动选择。为了简化判断过程,只需验证最后一个字段是否存在即可。
    6、如果town存在,则会构建:xinle_areas数组,用于前端可识别的解析数组结构。然后依次执行xinle_is_area_code_query($data['provinceCode']); //省份对应ID主键获取、xinle_is_area_code_query($data['cityCode']); //城市对应ID主键获取、xinle_is_area_code_query($data['countyCode']); //区县对应ID主键获取、xinle_is_areas_query($area['id’]);对应街道的获取处理。如果有一个获取失败,则会直接返回错误,终止所在地的筛选组件封装。
    7、在实现省份、城市、区县和街道与数据表的ID映射之后,便为前端筛选组件的生成奠定了基础。在这一阶段,会创建一个名为xinle_areas的对象,其中包含province、city、area、street四个属性,并将它们的名称和ID分别赋值。接着,这些属性将被添加到result的返回列表中,确保在前端响应处理中可以正确使用。需要注意的是,如果这个对象没有在后端完成封装,用户在前端导入地址后直接进行保存操作时,可能会因为对象为空而导致操作失败。因此,确保对象在后端的完整性和准确性是至关重要的,以避免前端数据处理中的潜在问题。
    8、在成功封装了xinle_areas对象之后,接下来要处理的便是生成tab内容的HTML组件,这部分工作是整个流程中最复杂的。我们需要为四个tab生成对应的HTML,并确保选中的li元素被赋予"ON"类,以便在前端高亮显示。tab的生成流程始于调用xinle_is_areas_query方法获取子列表。例如,可以通过省级行政区号获取该省份下的所有地级市,然后生成一个列表,并在解析的城市li中加入"ON"类以实现高亮展示。按照这样的步骤,依次生成province_html、city_html、area_html和street_html,最终将生成的HTML返回至前端进行统一的交互处理。通过这样的机制,用户能够在界面上清晰地看到选中的区域信息,提升用户体验。
    9、后端处理地址解析的流程已完成封装处理:1. 基本判断和准备 判断请求类型$type是否为address_parse,确认是进行地址解析操作。 获取前端传递的address_parse(用户输入的地址字符串)。 生成一个redis_key(这里没用到,可能用于缓存)。 2. 登录校验 判断$user_id是否为空,未登录则直接返回错误和跳转提示。 3. 地址解析主逻辑 调用xinle_parse_address_hook($address)进行地址解析。 这个函数一般会返回解析后的结构,如:姓名、手机号、省市区街道等。 判断解析结果: 如果返回的code为1,表示解析有错误,直接返回错误。 如果data为空,也直接报错返回。 4. 解析数据提取 从解析结果里提取:详细地址、收件人姓名、手机号,分别填入$result数组返回给前端。 判断解析结果中town(街道/乡镇)是否存在,如果没有,报错返回。 5. 省市区街道信息进一步解析 省份校验: 用xinle_is_area_code_query($data['provinceCode'])根据解析出来的省份code查省份主键和名称。找不到报错。 城市校验: 用xinle_is_area_code_query($data['cityCode'])查城市主键和名称。找不到报错。 区县校验: 用xinle_is_area_code_query($data['countyCode'])查区县主键和名称。找不到报错。 街道/乡镇校验: 用xinle_is_areas_query($area['id'])查区县下所有街道,对比名称匹配,找到对应的街道信息。找不到报错。 6. 构建返回数据结构 $xinle_areas数组组装: 省、市、区、街道的名称和ID都放进$xinle_areas,用于前端组件的联动选择。 7. 生成前端下拉选项HTML 省份列表: 遍历所有省份,生成HTML <li> 结构,当前省份加on类。 城市列表: 查询当前省份下的所有城市,生成HTML <li>,当前城市加on类。 区县列表: 查询当前城市下的所有区县,生成HTML <li>,当前区县加on类。 街道列表: 查询当前区县下的所有街道,生成HTML <li>,当前街道加on类。 这些HTML片段都放入$result,便于前端直接渲染。 8. 组装最终结果 拼接地区选择器显示字符串(如“广东省-广州市-天河区-车陂街道”)。 调用xinle_exit($result)返回所有解析和生成的数据。
    10、在地址编辑页面,如果通过$f7.popup.create打出了导入弹出层,会触发opened监听器,当用户执行导入,后端完成相应处理后,前端会根据code值来判断是否完成解析工作。如果code=1,则说明解析失败,直接会返回对应错误。如果是code=0则说明解析成,此时会主动关闭弹出层,然后根据返回的具体参数执行对应的页面交互处理。
    11、在解析地址成功后,系统会优先将解析结果填入xinle_address_nickname、xinle_address_phone和xc_address_address这三个基础表单字段中。这些字段的值在解析成功的情况下一定会存在,不会出现缺失。因此,处理流程为:后端首先提取出解析出的手机号、姓名和详细地址,并将这些信息直接写入页面对应的表单字段中。完成这一步后,系统将继续进行更为复杂的区域信息处理,以确保地址信息的准确性和完整性。
  • 加载更多评论
    单栏布局 侧栏位置: