宫论App
登录
注册
心乐
lv.2
实名用户
03-14 22:20
iPhone
查看作者
宫论项目开发记录
记录2023年项目进度周期。
刷新置顶
3
255
0
2.18w
请登录之后再进行评论
登录
0
咸鱼梦想
lv.2
实名用户
2023年11月28日开发记录
1、页面page-content容器新增一个子类:grey,其背景颜色为:background:#fbfbfb。如果需要改变页面背景色的时候,在page-content后面追加grey即可。注:默认背景色为白色,但是业务很多场景需要将主色调调整会浅灰色。每次通过style标签样式写入不太方便,主要管理维护麻烦。因此新增一个子类来处理。
2、朋友圈编辑页面新增radio选项,允许发布者或管理员对朋友圈访问权限进行调整。支持三个权限【1、public公开内容(图标样式:jinsom-wancheng)。2、fans粉丝可见(图标样式:jinsom-qunzu1)。3、privacy=仅自己可见(图标:jinsom-biyan)】
3、radio选项显示优化,进入朋友圈编辑页面后会理解通过get_post_meta获取朋友圈的访问权限,然后通过switch进行遍历处理。根据朋友圈内容当前的权限,来设置【checked="checked"】,这样访问编辑页面时,会默认直接选中当前朋友圈的文章权限。这样的显示设置更友好一些,告知用户文章当前的状态。
4、朋友圈权限图标样式做出调整,会设置margin-right 来调整元素的右边距(2vw),避免图标和文字紧促在一起,图标大小从6vw大小调整到4.3vw和文字更搭一些。并且每个权限图标颜色都不一样,公开为:灰色#999、粉丝可见为:浅蓝色#6191e7、私密内容为:浅红色ff8467。最后就是radio的选项容器样式的调整1、首先weui-cells移除元素的上边间距,在移除顶部的边框样式。避免顶栏同时出现两个虚线。2、weui-cells的底部边框虚线会做过滤处理,通过last-child来选中最后一个元素,将其虚线边框改为透明处理。同样是为了避免同时底部出现两个虚线。
5、朋友圈编辑页面新增radio选项,允许发布者或管理员对朋友圈内容(当前文章,非全局)评论进行权限开关调整。开启(允许所有用户对当前朋友圈进行评论)关闭(除了自己可以评论,所有用户都不可以进行评论)。与之前访问权限一样,会通过get_post_meta获取评论状态,然后打开页面即默认选中开启或关闭。
6、radio选项命名调整:朋友圈访问权限的radio为【moments_power】/评论开关权限的radio为【moments_comment】避免因为radio的name参数同名造成两个radio选项被合并成一组。同时所有选项框input表单都新增value属性,属性值为【权限key,比如公开权限为:public,评论关闭为:close】方便前端获取到用户选择参数。
7、评论radio选项框上方新增一个tips提醒框(⚠ 评论关闭后,任何人都不可以对当其评论),同时访问权限radio的box容器右上角新增一个图标(fa-trash:垃圾桶样式、背景颜色为黑色,字体大小为14px)这个图标是预留按钮,当管理员或发布者需要移除朋友圈,可以通过点击这个图标来完成。注:删除事件目前未写,后面会补上。
8、朋友圈编辑页面新增onPageBeforeInit监听,当朋友圈设置为私密(仅自己可见),那么不允许用户关闭评论(提示:私密状态,不需要关闭评论)。具体执行流程如下:首先获取选中的moments_comment和moments_power的ID值。然后使用条件语句来检查是否满足私密状态下不需要关闭评论的条件。如果满足条件,使用 $('input[name="moments_comment"][value="open"]').prop('checked', true) 来将值为"open"的选项设为选中状态。然后通过xc_msg显示错误。
9、朋友圈编辑页面【删除图标fa-trash】控件新增onclick事件(xc_delete_moments),并新增自定义属性post_id朋友圈编号ID。函数会通过this上下文对象获取朋友圈编号,然后构成ajax请求【type=xc_delete_moments、请求变量:post_id】到后端发起删除请求,Ajax请求会通过myApp.showIndicator进行动画拦截,避免出现重复执行。
10、朋友圈删除控件新增自定义属性【action】,这个参数有两个值【1、发布者本人执行参数为:delete(删除)。2、非发布者并且是管理员执行参数为:reject(驳回)】。用户打开朋友圈编辑页面会通过get_post_field获取发布者UID,然后判断是否为作者,然后执行响应的参数赋值。当触发xc_delete_moments事件时,会根据传递变量的不同,执行不同的确认弹窗。【确定要删除当前朋友圈内容吗?、确定要驳回隐藏当前朋友圈内容吗?】
11、朋友圈文章编辑页执行xc_order_access拦截请求时,会通过get_post_status获取文章内容状态,如果status状态不等于(publish公开内容)则表明当前朋友圈内容非正常状态,可能处于回收站(等待删除)。那么将禁止发布者访问 并提示【朋友圈内容已被删除,无法操作!】。注:管理员不受此限制。
12、新增朋友圈内容删除钩子:xc_moments_delete_hook,需要传递朋友圈编号。该钩子集检测(拦截非法请求操作)、删除(负责删除事件处理,包括静态资源处理)、回调(负责朋友圈内容删除后的回调业务处理)。钩子采用标准的result数组结构返回,code为状态码:1代表执行失败,msg代表失败原因。code=0代表执行请求成功,朋友圈内容已被成功移除。
13、朋友圈后台配置页新增字段:xc_moments_delete_limit(朋友圈文章删除限制),发布超过X天后,发布者将无法自行将其删除[管理员不受此限制],如果设置为0,则代表不做限制(不管多久都可以删除)。此字段通过xc_moments_delete_hook钩子来执行,用户删除文章时,会通过检测这个字段来判断是否过了删除有效期。注:一般情况下不建议开启删除保护,具体根据实际情况而定。
14、朋友圈文章删除,拦截事件封装完毕。【1、检测用户是否登录、未登录将拦截处理。2、检测用户是否为管理员或发布者,如果均不是拦截处理。3、检测文章是否存在,不存在则拦截处理。4、检测文章是否属于自定义类型:moments如果不是拦截处理。4、通过get_post_status获取文章的状态,如果是trash则表明文章处于回收站,拦截处理。5、如果删除用户不是管理员,并且后台设置了删除时间限制。那么将会通过get_post_field获取发布日期然后转时间戳,在对比日期是否超过了后台限制,如果超过则拦截处理。
0
心乐
lv.2
实名用户
2023年11月27日开发记录
1、后台朋友圈配置新增开关(xc_moments_video_autoplay)开启后,朋友圈视频会仿微信朋友圈,页面下拉到朋友圈视频会自动播放(静音状态)。装载方式通过Intersection Observer API触发,如果不开启则不会执行页面滚动监听。开放开关选项,是防止低配设备存在性能问题,毕竟页面可能同时存在多个视频初始化。目前未做设备兼容处理,如果到时候出现性能问题,可以通过后台先关闭。
2、宫论前端xc对象新增属性:(moments_video_autoplay)布尔值,后台配置朋友圈视频自动播放选项决定这个属性值。moments_Intersection_Observer函数在触发朋友圈内容变化监听时,会检测xc.moments_video_autoplay是否存在,如果存在才会触发window[视频对象].play()播放事件。
3、朋友圈视频自动播放功能额外新增一个拦截条件,后台新增字段【xc_moments_video_autoplay_size】当开启了视频自动播放后,还可以设置视频尺寸要求。当视频小于XXMB才会被执行自动播放,避免大视频自动播放,消耗过多流量视频。同时封装视频组件容器。会将获取到的视频大小写入到size自定义属性,视频自动播放前会检测size是否大于后台限制,如果不大于则执行自动播放。
4、朋友圈视频播放请求函数优化,现在会Intersection根据变量(布尔值)做彻底分离处理。除了播放器属性有不同外,Intersection为布尔值,才会执行以下事件监听【1、视频播放器click点击事件监听。2、进入全屏事件和退出全屏事件。】用户正常播放视频,这些监听不会执行,避免视频组件出现意外情况。
5、朋友圈视频组件封装完毕,容器采用函数封装 通过传递朋友圈ID即可完成视频的封装(包括各种视频信息采集和输出)。视频支持两种播放加载模式。【1、用户主动播放,通过点击播放按钮图片来加载和初始化播放器。2、页面下拉到视频容器区域自动进行播放和暂停,做了很多事件监听和回调,效果和微信朋友圈大致相同】
6、朋友圈内容新增商品卡片容器,class类:moments_shop,如果用户发布朋友圈的时候选择了商品卡片那么就会存在【shop】字段,此时会在朋友圈内容下发通过do_shortcode转义和解析商品短代码,然后将HTML信息输出到moments_shop容器内部中。注:商品短代码都是通过xc_shortcodes_shop_card函数来解析和处理,如果需要对卡片做样式或内容调整,则修改这个函数即可。
7、新增一个函数方法xc_at_html($content):来对文章内容中的艾特昵称进行处理,并替换为自定义标签。接受一个参数 $content,该参数是文章的内容。函数的目的是在内容中找到以 @ 开头的昵称,并替换为自定义的标签。返回带有自定义属性的标签<xc-post-at>,用于显示艾特用户信息。这个方法绑定于xc_shortcodes_content函数,通过这个函数进行内容处理,会先处理@标签内容,增加对应的标签样式。
8、xc_at_html处理aite用户信息时会通过xc_nickname_uid查询用户是否存在,如果存在有效用户(user_id有返回)则会通过xc_get_avatar获取该用户的主页link链接。然后使用xc_mobile_url构建一个onclick点击事件,事件的link为了防止被转义处理,会先通过addslashes进行斜杠处理。同时xc-post-at增加一个自定义属性user_id,预留给后续业务操作。
,,10、朋友圈内容插入的商品卡片样式优化:【容器上下间距:margin-top: 4vw;margin-bottom: 1vw;边框样式:border-radius: 1vw; border: 1px solid #e5e4e4;】以便适配页面(注:只有朋友圈页面的商品卡片才会神修改哦),朋友圈视频器容器也做进一步调整【max-width: 49vw;max-height: 40vh;】,视频宽度调整到50%左右,观感更好一些。
11、朋友圈内容输出时会检测power字段(朋友圈内容权限),如果非公开(不等于public)并且发布者是当前用户,则会在该条朋友圈的右上角(名字那一行)输出一个<span class="power">样式。内容为:(私密/粉丝可见)图标:fa-low-vision。样式【文字图标靠右对齐、字体大小3vw、浅灰色】。警示作者,当前所看到的朋友圈内容是非公开。
12、新增朋友圈内容管理页面【/module/xc_moments/edit.php】页面唯一标识:moments_edit。短代码地址为[xc_module type=xc_moments]/edit.php,该页面需要传递post_id朋友圈文章编号。在这个页面用户可以对朋友圈内容进行权限操作(评论权限开关、朋友内容访问权限、删除操作)等,注:朋友圈暂不支持编辑,防止二次编辑的内容出现争议。
13、朋友圈内容管理页面支持xc_order_access拦截访问钩子,唯一标识(moments_edit)。需要传递【朋友圈编号post_id】如果用户不是【author_id发布者本人、前台管理员】那么将直接拦截对该页面的访问请求。注:管理员和发布者都可以对朋友圈内容做(删除、访问权限设置),管理员还计划开放(限流操作)权限。
14、文章权限状态除了作者可以看到,前台管理员现在也能够看到(方便对内容进行审查处理),同时新增一个moments_delete标签(垃圾桶删除图标-fa-trash、背景颜色为:#19191a、间距为3vw)在发布时间后面,只有发布者和管理员才能看到。类似朋友圈删除按钮控件。
15、朋友圈删除控件(moments_delete)新增onclick点击事件:xc_moments_edit,需要传递post_id(朋友圈编号)。函数内部会通过xc.moments_url获取到朋友圈路径地址,然后通过传递的朋友圈编号对其进行link封装。最后通过xc_mobile_url完成页面跳转。link指向地址为:朋友圈编辑页面。
1
心乐
lv.2
实名用户
2023年11月25日开发记录
1、moments_video视频容器高度限制最大为60VH(通过max-height标签进行限制),主要是为了避免长视频占据过多页面。time视频时间(分秒)标签间距和样式做出下面调整(top: 3.5vw;right: 3.5vw;padding: 0 1vw;border-radius: 1vw;)对应的字体size从4vw调整到3vw。
2、封装一个方法格式化视频时间xc_video_time($seconds),将秒数转换为格式为 "00:10" 或 "01:10" 的时间表示形式。这个函数接受一个参数 $seconds,表示视频的秒数。它会将秒数转换为分钟和剩余的秒数,并使用 sprintf() 函数将它们格式化为两位数的分钟和秒钟。最后,返回格式化后的时间。
3、宫论视频信息获取函数get_video_info:接受一个参数 $video_url,表示视频的URL。它返回一个包含视频信息的关联数组。函数首先将视频URL存储到结果数组中,然后调用 xc_video_img() 函数获取视频封面图,并将其存储到结果数组中。接下来,函数检查上传信息是否存在,如果存在,则从信息中提取视频时长,并使用 xc_video_time() 函数将其格式化为 "00:10" 或 "01:10" 的时间表示形式。函数还从上传信息中提取帧率、COS URL、高度、宽度和文件大小等信息,并将其存储到结果数组中。最后,函数返回包含视频信息的关联数组。这个信息获取依赖cos媒体信息采集,如果不适用cos对象存储,需要重新适配处理。
4、cos请求视频媒体信息函数优化,如果之前已成功采集,那么将返回exif数组信息。get_video_info函数如果通过xc_is_upload读取到上传记录,但是没有exif记录。那么会通过xc_video_info请求生成,并同步返回媒体信息。不更换是数据表获取,还是实时采集获取,只有$exif['Duration']))字段不为空的情况下,才会返回详细媒体信息(获取失败仅返回图片和视频地址)。
5、朋友圈视频输出封装成函数:moments_video_html,函数接受一个参数 $post_id,表示朋友圈的ID。它从朋友圈文章的元数据中获取视频的URL,并调用 get_video_info() 函数获取视频的信息。然后,函数使用获取到的视频时长、播放按钮图标和封面图等信息,生成一个包含视频HTML代码的字符串。最后,函数返回生成的 HTML 代码。封装成函数的好处,后面涉及到视频解析,可以直接通过函数修改。
6、朋友圈视频播放组件会通过自定义属性将【width=视频宽度、height=视频高度、video_url=视频地址、image=视频封面】写入到容器中,方便后续西瓜播放器组件提取信息,自动初始化播放器。同时播放器按钮新增图标已新增onclick事件,用于用户手动点击播放视频。
7、moments_play_video事件封装完毕,需要传递朋友圈编号和this上下文对象。事件触发后会将视频容器传递给moments_video变量,视频地址、封面图等参数都通过attr请求moments_video获取。考虑到朋友圈页面可能存在多个视频播放,为了更好的管理和维护播放组件,朋友圈视频在初始化西瓜视频播放器时,会将播放器对象赋值到【全局变量:window['moments_video_' + post_id]】,外部可以直接通过 moments_video_朋友圈编号(对播放器进行操作,比如暂停、播放、摧毁、音量、全屏)等交互操作。
8、朋友圈视频组件样式优化,封面背景图img标签移除,改为容器内部background-image:加载图片。避免初始化播放器因为样式不统一造成页面有明显落差。同时播放器西瓜视频播放器组件样式边框全部适配容器,包括不限于:播放状态、暂停状态、重新播放状态。同时朋友圈页面播放器【暂停图标】隐藏处理(播放控件仍旧显示)
9、播放器组件新增自定义属性:post_id,用于监听视频位置。当通过moments_play_video进行视频初始化时,会监听当前视频播放器play(播放)和pause(暂停)事件,如果视频播放。会将页面中正在播放的视频暂停处理 避免页面同时播放多个视频。当视频被暂停或播放完毕,会将视频的播放状态标识移除处理。避免其它播放器判定当前视频处于播放,而主动发起暂停。
10、朋友圈页面新增Intersection Observer API,监听位置:moments_post、threshold值设置为1,朋友圈内容进入设备视图窗口后才会触发执行,可以通过entry.target获取该条朋友圈相关数据信息(比如朋友圈ID、作者、类型等)。为确保页面产生交互后,这个监听始终有效,特定将其封装成一个函数【moments_Intersection_Observer】,页面产生内容变化,只需要执行这个函数即可完成moments_post元素装载。
11、moments_play_video朋友圈视频播放事件增加一个变量:Intersection默认为false,如果为true则表明视频播放器是通过Intersection_Observer触发的。此时会加载全新的播放器组件配置(volume=禁音处理、controls=关闭控制条、loop=开启循环模式、closeVideoClick=将click事件视频切换播放/暂停状态事件关闭处理,点击播放器不会自动暂停或者播放、closeVideoPreventDefault=关闭播放器video元素的阻止默认动作行为)。
12、通过Intersection加载的视频组件增加一个click点击监听,当用户点击视频时触发(原来的暂停播放原生事件已移除处理)。监听首先会检测播放器对象是否处于全屏状态,然后执行不同的业务逻辑。【未处于全屏:将通过getFullscreen进入全屏,将播放器音量打开,通过jquery将当前对象xgplayer-controls样式调整为:flex,以便在全屏模式下显示控制条组件。】【处于全屏,则通过exitFullscreen退出全屏状态,将音量静音处理、将视频控制组件隐藏操作】。注:这里涉及的对象都是播放器,处理的业务逻辑相对比较复杂。
13、朋友圈视频播放事件会在视频加载前将默认背景图(background-image)移除处理,避免视频生成的一瞬间因为播放器和封面图有尺寸偏差,造成轻微卡顿现象。同时moments_Intersection_Observer滚动到视频朋友圈内容时,现在会通过对象检测currentSrc是否存在,如果存在则代表播放器已加载过,此时执行的不是播放moments_play_video函数,而执行play()请求播放器继续播放视频。避免每次加载都会重新播放。
14、修复页面返回监听的一个错误,当页面通过滚动下拉初始了视频播放器后。返回上一页在打开朋友圈会出现一个致命性的错误(原有的同名播放器因未被摧毁,造成页面自动播放的是之前的对象)。解决方案,在播放视频时会在对象容器内部新增一个自定义属性:player值为TRUE,通过Intersection Observer进行页面滚动加载时,除了会判断播放对象存在还会判断player属性是否存在。只有两者条件符合的情况才会执行播放。
15、朋友圈视频新增两个监听【exitFullscreen=退出全屏模式、requestFullscreen=进入全屏模式】,前面通过click点击事件监听进入全屏模式有一个瑕疵,当后退左滑事件返回时,无法被监听到。这导致退出全屏的一些事件无法被执行(比如隐藏播放控件、设置静音等),因此新增原生进出全屏模式来执行控件操作更安全可靠一些。避免手势或物理键返回导致的执行失败。
0
心乐
lv.2
实名用户
2023年11月24日开发记录
1、我的朋友圈页面新增link跳转,如果用户登录状态。那么点击朋友圈大头像可以跳转到朋友圈设置页面。onclick绑定元素:moments_avatar,link链接通过do_shortcode短代码解析生成。用户可以在设置页面对自己朋友圈做出一些基本设置,比如权限设置、屏蔽名单等
2、moments_avatar头像样式优化:width宽度和height高度从68px调整为16vw,border-radius边框设置为2vw,边框样式调整为高度1px颜色:fbfbfb。position布局变更为:absolute,top:62vw,right:3vw。与之对应名字元素(moments_name) 也做出以下调整:top:64.5vw;width: calc(100% - 18vw - 15px);
3、avatar_info边框设置为2像素,背景色固定为白色。同时通过unset移除原生头像border边框效果,调整过后的头像边框和背景上部分有边框,下半部分因为背景色和主色保持一致不会有边框显示。朋友圈名字的间距也靠下偏左处理,调整样式(宽度-82px、top262 Px)个人说明的位置高度间距也从7vw调整为10vw。
4、朋友圈设置页面新增desc配置,用户可以直接在朋友圈设置页面填写自己的个人介绍说明,注:这里的设置和资料设置页是一致的,只是朋友圈提供一个便捷入口 方便用户修改保存自己的个人简介。同时朋友圈设置页为了介绍自定义读取索引,会通过get_userdata获取用户所有字段,然后赋值到user_info。直接通过user_info->字段名称 来输出对应内容。避免页面自定义字段每次都通过get_user_meta来手动查询。
5、info_desc进一步优化处理,显示更多描述的时候会在原有样式基础下做出以下调整【1、 width: 'calc(100% - 5vw)'、left: '3vw'】。这样单行显示的内容更多,基本不会造成换行。同时个人备注新增通用class类:(desc_用户ID)当涉及指定用户的个人描述调整时,可以通过唯一用户标识完成定位锁定。
6、新增js文件hook.js。文件地址【/assets/hook.js】名称标识:xc_hook通过wp_enqueue_script挂载到宫论页面中。这个函数支持延后加载,未加载成功也不会影响页面基本访问。注:这个js负责回调业务处理,比如用户发帖成功了,会预留一个js钩子动作负责后续业务开发,避免每次业务调整,都需要手动去修改原生js函数。
7、开发文档(js内置事件)页面,新增钩子事件专栏。所有创建的js回调事件钩子,都会在这个区域进行记录。文档备注格式【钩子说明、函数示例、使用场景和说明】,以便后续业务维护方便。同时钩子回调js事件命名统一风格为:xc_hook_场景。回调钩子需要特别注意的是,主业务不通过钩子来执行,钩子触发失败,只是页面交互有影响,不影响程序业务的正常执行。
8、新增回调钩子:xc_hook_save_desc(author, content)。author=是更新用户说明成功的用户UID(因为可能是管理员操作,所以需要通过传递用户UID)。content是文本内容,也就是对方新保存的个人说明。(内容后端已效验,既然执行函数就说明这段文本没有问题)钩子执行事件追加:1、通过jquey对(desc_用户UID)的元素进行文本替换操作。页面已显示该用户的个人说明,都会通过回调钩子进行文本更新。
9、新增回调钩子:xc_hook_update_avatar(author,avatar)。关联触发函数为:xc_clip_avatar,当用户上传了裁剪了新的头像,并且后端处理成功。将会触发这个回调事件,author是换头像用户UID、avatar是新的头像图片地址。回调钩子新增第一个事件:当用户头像更新成功,会通过avatar_用户UID元素更新图片地址。这样用户头像完成上传后,已加载的头像会同步更新。
10、xc_get_avatar用户头像信息缓存字段优化:现在会通过get_userdata直接获取用户所有配置信息,避免多个字段重复利用get_user_meta进行单独查询。同时缓存输出数组新增两个额外字段:1、user_desc用户个人说明,如果用户没有填写输出后台默认配置信息。2、verify_desc用户认证简介,如果未认证这个字段默认为空。原有的desc保持不变,优先认证在个人说明。
11、朋友圈页面,info_desc容器【用户个人说明简介】进一步调整,不在优先输出用户认证描述信息。统一改为显示:个人说明,这个用户可以随时自定义修改,认证描述则无法修改(重新认证或管理员才能修改)。朋友圈页面应当允许用户自定义显示一些简介内容(广告、引流坚决杜绝)。
12、xc_get_avatar缓存函数修复一个错误,redis_key写在【uncache==false】内部,导致外部非缓存因为无法获取到KEY,而缓存写入失败。目前已修正 将redis_key放到函数初始头部,同时返回输出缓存的时候额外新增了一个键值redis_data['cache'] ,如果该值存在代表结果为缓存。获取不存在则并非【user_avatar】缓存。
13、朋友圈内容新增视频容器(类名如下:moments_video=朋友圈视频标识、video_朋友圈编号=用于锁定视频,用一个页面会有多个视频存在。需要处理视频播放暂停、释放移除等操作),自定义属性:video_url=视频地址、post_id=朋友圈编号、author=视频发布者UID。注:未加载西瓜视频play的时候,显示视频封面。
14、朋友圈视频待播封面样式组件封装完毕,容器最大宽度69vw(100%视觉体验不好)、top间距2vw、布局方式:position: relative。封面图中心位置为播放按钮控件(会绑定一个play播放事件),右上角通过position: absolute布局(time元素),展示视频的长度时间。样式为:浅黑背景+白字。显示格式:22:12(时分)
0
咸鱼梦想
lv.2
实名用户
2023年11月23日开发记录
1、APP端样式调整:navbar-inner(顶部导航菜单)和subnavbar(顶部菜单切换)新增样式【border-bottom: 0.5px solid #adadad36;】底部新增一个虚线样式的边框,颜色浅灰色透明 像素0.5px。注:因为APP端导航是白色背景,很多页面背景底色是#fff,造成APP导航栏和背景连城一片,有个视觉观感问题。增加一个底部边框相对体验更友好一些。
2、朋友圈页面下拉刷新指示器增加一个子类(moments_pull),onPageBeforeInit监听页面下拉时,如果处于朋友圈页面 会单独检测moments_pull节点是否存在,如果存在才会执行hide()隐藏事件。避免全局隐藏(pull-to-refresh-layer)造成(首页、消息、我的)等几个页面因为指示器消息被收缩,造成视图窗口坍塌问题。
3、沉浸式菜单配色优化调整:新增APP和网页端全局变量navbar-text-color(APP和网页分别设置)当页面属于封面背景图沉浸式 会自动将文字图标颜色标记为白色(透明)。当页面下拉卸载(沉浸式)会通过navbar-text-color重新赋值文字颜色(APP默认为纯白菜单,黑色文字图标)注:经过调整,朋友圈页面打开默认为透明顶部菜单,图标为白色。当页面下拉超过280px,则会恢复白色顶部菜单,图标变为黑色。页面低于280px则恢复透明和白色。兼容其它页面
4、朋友圈后台新增一个按钮选项(发布地址公开),如果开启。那么会通过高德API解析用户的发布地址,然后转换为(XXX省.XX市)并显示在用户朋友圈内容下发。注:不会显示详细地址,仅显示省市。这个设置为全局设置,用户不可控制。如果后台关闭,则直接不显示。这个地址涉及到用户隐私,可根据情况决定是否公开。
5、xc_ip数据表新增字段:fingerprint(VARCHAR(64))记录来访者的设备指纹信息,方便运维跟踪定位用户信息。通过xc_ip_position函数来更新和创建用户IP记录,如果客户端存在指纹信息($_COOKIE['fingerprint']))并且解析的IP和客户端IP保持一致的情况,会写入指纹字段。
6、IP查询函数xc_ip_position重构优化:为了丰富IP库,现在该函数会记录游客IP记录。默认user_id参数为空NULL,当请求IP和客户端IP保持一致且用户客户端处于登录状态,才会将user_id写入其中。注:每次查询都会检索IP,如果存在记录,且用户处于登录状态【查询IP和客户端IP】一致的情况,会更新和同步缓存信息。包括(UA、时间、和用户)三个字段。
7、xc_ip_position处理sql语法调整,不在通过原生wpdb来执行insert插入或更更新update。使用宫论通用sql处理函数:xc_insert_sql和xc_insert_sql,这样可以做到数据表缓存全局统一管理,同时数据表每一个操作记录都可以被相关钩子监听和处理。旧的写法都需要过渡新版sql处理方法。无论是否需要用到内置缓存,都需要做到统一性。
8、封装一个方法来处理朋友圈位置信息moments_ip_city。接受一个名为 $ip 的参数,函数首先检查是否启用了朋友圈【城市隐私选项】,并确保IP地址非空。然后,将会调用 xc_ip_position 函数获取IP地址对应的城市信息,并将结果解码为关联数组。接下来,函数检查城市信息是否存在,并且城市字段不为空。如果满足条件,它会根据城市与省份是否相同,返回相应的格式化字符串。如果未启用城市隐私选项或者IP地址为空,函数返回 false。
9、朋友圈位置输出函数重构,不在传递IP参数,改为传递朋友圈文章编号。并且优先查询朋友圈文章自定义字段【city】是否存在,如果存在则直接输出。不存在则通过get_post_meta来获取发布IP,然后通过调用 xc_ip_position 函数获取IP地址对应的城市信息,并将结果解码为关联数组(处理逻辑和之前没变化),唯一的区别是。获取到成城市地址信息后,会将内容写入到朋友圈【city】字段。并且查询会优先检测这个字段。减少二次执行查询函数请求。
10、高德IPv4定位解析接口新增错误日志记录,当接口出现异常(IP解析失败不算)。会触发xc_log_error_warn日志写入报警。日志KEY标识【ipv4】,错误格式【[IP - ' . $ip . '] [错误 - ' . $ip_data['info'] . '] [时间 - ' . date('Y-m-d H:i:s') . ']】。注:高德API接口目前仅支持国内IP,因此无法解析海外iP.这个日志报错并不会监听IP地理信息,只有接口出现异常,或者账户权限、额度出现问题的错误返回才会触发日志报警。
11、日志报警配置新增(【ip定位】高德接口异常)配置组,参数:日志唯一标识IPv4/触发报警条件(当天连续累计出现20次错误,则触发报警通知)/报警次数上限(2次,每日最多触发两次警告通知)/短信报警(开启状态)。触发函数:xc_ip_position,当IP解析失败,并且返回异常报错。会执行错误日志,并记录错误次数。错误累计到设定次数要求,将触发管理员报警。
12、新增计数器:api:ipv4,记录统计高德ipv4接口调用次数。通过xc_ip_position函数触发,高德成功返回定位信息会通过xc_redis_count完成计数+1(失败不会计数)。注:可以通过get_redis_count($key)获取计数器统计详情,支持查询【总数、今日、昨日、本周、上周、本月、上月、今年、去年】多维度的计数器查询统计。注:该计数器已加入【宫论计数器重置列表】,每天00:01会自动完成重置。【注2:为了方便管理和维护,涉及API外部接口调用的计数器,后续命名方式都要加(api:)。】
13、朋友圈内容css样式调整优化:头像宽高比不在通过px像素固定,改为vw页面百分比来处理。同时认证图标(.moments_post .avatars .custom-verify)做偏移适配处理(position: absolute; bottom: -1vw; right: -0.4vw;),同时定位图标和城市信息(.moments_post .city)字体样式调整到3.3vw。
1
咸鱼梦想
lv.2
实名用户
2023年11月22日开发记录
1、全新的异步执行请求已封装完毕,所有宫论函数都支持异步请求,并且请求支持等待结果返回(默认不返回单向通讯,如果需要等待异步结果只需要将result标记为true即可)。需要注意的是,请求虽然可以执行所有函数事件,但是涉及当前用户处理的业务逻辑,是无法进行的。此类函数禁止通过异步来处理。【每个进程都是内部处理,并不能获取客户端设备信息。无法识别当前登录用户是谁】
2、异步执行函数xc_asyn_execution,现在会通过$GLOBALS['Task_Worker']来判断当前环境是否处于tcp协议进程中。如果处于则拒绝本次请求。避免异步进程触发异步请求,造成死循环。导致服务器出现异常情况。注:如果不做拦截,异步收到请求,会无限下发请求给其它子进程,最终导致进程全部被占用。
3、日志报警中心新增gropu配置组【xc_log_config】日志报警配置:字段包含(name=日志说明,日志的使用场景和用途。key=日志唯一标识,设置后不要变更,具有唯一性。包括日志文件也是通过这个字段记录XXX.log。warn=报警配置开关,关闭后只记录日志不报警。warn_conditions=触发报警条件,连续错误XXX次,则触发报警通知管理员。warn_number=报警次数上限,每天只报警X次,超过次数跳过。phone=是否开启短信通知,考虑到运营成本,特别重要的日志报警才建议开启短信通知)。后续所有报警配置,都通过这个字段来添加或移除。不建议每个日志都以单独字段来写入,维护太难了。之前的配置保留原样,暂不做迁移适配。
4、封装一个方法用于获取后台日志报警配置:xc_get_log_config($key),$key 要查找的配置键(KEY是唯一属性名,不可重复)。函数会遍历整个日志配置数组以查找指定键的配置。返回与指定键匹配的日志报警配置数组,如果找不到则返回 false。
5、新增两个日志报警缓存数值字段:day:log_warn:$key(今日该日志类型报警累计触发次数,每日凌晨重置。触发报警也会重置)day:log_push:$key(已触发报警(通知管理员)的次数)。旧版是每个字段都手动写,维护和清理非常方便。新版的两个缓存日志报警计数器,做到业务统一性。支持一键查询和清理指定日志计数。
6、宫论通用【记录和处理日志报警】:xc_log_error_warn($key, $log) $key 日志配置键,$log 要记录的日志内容内容通过调用 xc_get_log_config($key) 函数获取指定键的日志配置信息。如果未找到对应的日志配置($config 为空),则无法触发报警,函数返回 false。获取累计报警次数和管理通知次数。调用 xc_fwrite($log_filePath, $log) 函数将错误日志写入文件。 获取报警触发条件和每日管理提醒次数。 如果累计报警次数未达到触发条件且管理员通知次数未超限,执行以下操作:管理员报警次数加1,累计报警次数清零。触发报警通知(会区分是否需要启用短信报警)。
7、日志处理报警函数进一步优化,如果检索不到配置文件,仍旧会将错误日志写入到log文件,并通过redis进行错误计数处理。只是不触发管理员报警事件。同时获取【累计报警次数和管理通知次数】方法放到函数初始位置,这样可以确保其它日志也能正确完成计数累计。经过优化后,宫论日志报警适用于全局报错记录,需要报警只需要在后台添加新配置即可。
8、xc_asyn_execution和xc_task_worke两个涉及TCP内部请求的函数,会在请求失败和写入失败时进行日志写入。错误日志如下:【[时间: ] - [错误:' . $errmsg . '] - [用户:' . $user_id . '] - [请求事件:' . $data['type'] . '] - [备注:连接失败]】。方便运营计数人员及时监听和排查问题。
9、xc_asyn_execution异步函数请求失败,或者数据发送失败。会立即执行函数,并返回结果。跳过异步执行的业务逻辑。注:日志还是会记录,只是为了避免业务出现问题,函数会继续执行。相对应的用户可能等待时间更长一点,但是相关事件还是能够准确执行完毕。 避免因为TCP内部出错,导致所有业务出现中断。
10、xc_moments_consult_clear_cache朋友圈分页缓存清理函数成功接入xc_asyn_execution异步处理请求,当asyn=true并且当前环境不是内部进程时,将执行异步业务逻辑处理。需要特别注意的2点【1、执行异步函数事件时,条件允许的情况一定要验证Task_Worker超全局变量,避免死循环问题。2、函数需值执行请求后需要执行return,关闭后续代码执行。避免二次执行(异步和同步)。
11、IS函数库新增一个检测判断(xc_is_asyn),检测当前客户端环境是否处于异步进程(宫论内部脚本)。如果是的话则返回true,否则返回false。函数的检测原理是通过$GLOBALS['Task_Worker'])超全局变量完成的,正常情况下该变量为false,内部进程读取脚本会将标记为true。封装成一个判断函数是为了后期维护方便,因为这个判断方式后面可能会有变更。
12、朋友圈正文容器class类:moments_post(全局样式:用于朋友圈容器包裹),moments_post_朋友圈编号(移除、隐藏朋友圈内容可以通过这个类进行操作、)。author—作者ID(拉黑屏蔽朋友圈内容,可以通过这个类名一键隐藏所有内容)。video/image/audio:朋友圈类型标识,通过这个类做自定义样式输出用。
13、宫论缩略图样式配置中心,新增朋友圈缩略图(xc_thumbnail_moments)。涉及到朋友圈内容图片显示的地方都会读取这个样式(?imageMogr2/thumbnail/500x),旨在减少流量开支,提高页面加载速度。注:打开灯箱加载的仍是原图,只是默认显示缩略图。
14、发布弹出xc_popup组件兼容处理:APP端样式做以下调整【height: calc(100% - 8vw); top: 8vw; position: fixed;】这样(艾特、话题)等弹出窗口组件可以适配APP端沉浸式窗口。避免因为高度变化,popup内置窗口文字无法显示完整的问题
0
心乐
lv.2
实名用户
2023年11月21日开发记录
1、新增异步任务请求:woker_moments_clean($user_id),$user_id是用户UID 当某个用户的朋友圈内容出现更新了,那么必须携带这个UID参数传递给宫论异步进程进行处理。注:redis朋友圈缓存清理涉及到其粉丝用户的缓存列表,场景比较复杂。因此需要重写清理计划。单纯的清理发布者的朋友圈缓存,无法真正解决问题。
2、scan_redis命令优化,不在函数内部主动发起redis实例链接请求。因为有些特定场景,这个函数执行频率会异常频繁(比如朋友圈:有一万粉丝的朋友圈更新,那么可能会通过遍历来全部执行更新)。如果每次都重连redis,会造成大量的性能浪费。改为xc_redis通用处理方式,相对比较友好一些。
3、新增用户元字段:朋友圈内容缓存时间(moments_cache=标准日期),通过分页查询函数构建WP_Query查询条件后(无论是否有结果返回,都会写入时间到该字段)。注,如果查询的条件不是指定用户,那么将不执行。同时时间写入为缓存过期时间。这个字段存在,就表示,用户有朋友分页结果缓存。
4、新增朋友圈缓存清理函数:xc_moments_consult_clear_cache,$user_id 指定用户ID。第一步是清理全局缓存,使用scan_redis()函数扫描以moments_0:开头的键,然后使用delete_redis_array()函数删除扫描到的键。接下来是清理对方粉丝缓存。首先,获取指定用户的粉丝列表,使用get_user_meta()函数获取用户的fanlist元数据。然后,获取当前时间戳作为$news_time。如果粉丝列表不为空,就遍历粉丝列表。对于每个粉丝,获取其朋友圈缓存时间戳,使用get_user_meta()函数获取粉丝的moments_cache元数据,并将其转换为时间戳格式。如果朋友圈缓存时间戳大于当前时间戳,说明缓存仍有效,需要执行清理操作。使用scan_redis()函数扫描以moments_{$key}:开头的键,然后使用delete_redis_array()函数删除扫描到的键。
5、朋友圈清理缓存函数优化,当所有粉丝朋友圈缓存都被清理完成后。会将当前指定用户的缓存记录也一并清理,避免主页朋友圈内容无法更新。同时,在缓存清理成功后,还会主动删除粉丝和当事人的的moments_cache元数据,使用delete_user_meta()函数进行删除操作。
6、xc_moments_consult_clear_cache新增预留变量asyn,默认为false。如果标记为true,则表明函数将通过异步进程去执行。注:目前异步脚本还未接入该函数,只是预留接口。朋友圈缓存清理函数,现在已挂载于xc_moments_publish_hook钩子,只要朋友圈发布就会触发并执行。该清理函数后续还要在以下场景触发【1、朋友圈内容被删除、朋友圈内容被隐藏、朋友圈状态变更(隐私)、用户朋友圈被关闭、朋友圈被被恢复】
7、用户关注钩子:xc_follow_hook和用户取消钩子:xc_unfollow_hook,现在会执行朋友圈查询缓存清理。首先检测用户朋友圈缓存是否存在。如果存在将会检测缓存是否过期。如果未过期,那么将通过scan_redis和delete_redis_array进行缓存清理。这样关注后的用户朋友圈,可以被刷新。移除用户的朋友圈,也会被移除。
8、朋友圈关闭或开钩子xc_moments_toggle_hook:在操作完毕后会立即执行xc_moments_consult_clear_cache朋友圈缓存清理函数,将对方及其粉丝的朋友圈缓存记录全部移除,确保被操作用户的朋友圈可以正常显示或者隐藏。注:操作采用是异步进程,避免粉丝过大造成处理超时。
9、宫论系统计划配置中心新增定时任务:朋友圈缓存过期【用户字段】清理,执行周期(10分钟)。触发函数:xc_corn_moments_cache_usermeta,执行方式:采用异步处理。该函数用于清理用户元数据中的朋友圈缓存字段。首先,通过使用全局变量`$wpdb`获取WordPress数据库对象。然后,构建SQL查询语句,筛选出满足条件的用户ID。执行查询并遍历结果集,对每个结果进行处理。使用`delete_user_meta()`函数删除用户的`moments_cache`元数据。
10、朋友圈分页查询缓存清理会在以下几种场景中执行。【1、朋友圈发布,更新全局朋友圈内容清理(广场)和发布者及其粉丝的朋友圈缓存清理。2、当用户取关或关注某个用户时,会更新自己的朋友圈查询缓存。3、当朋友圈被关闭或恢复访问,会清理自己及其自己粉丝的朋友圈缓存。】清理粉丝缓存的时候,会先检索对方moments_cache字段,如果该字段不存在或者日期过期,则跳过对方的清理。避免执行频率过高。注:这个朋友圈粉丝缓存清理,涉及的场景比较多。虽然已做查询优化,但依旧可能存在性能隐患。需要特别留意。
11、朋友圈过滤名单中添加或移除用户ID操作成功后,会通过clean_redis_key异步进程,更新当前用户的朋友圈缓存。这样被过滤的用户的朋友圈可以在页面刷新后可以正常显示或被隐藏。过滤名单触发事件为:xc_moments_filter_list。注:朋友圈名单过滤添加或移除并没有关联钩子。
12、朋友圈分页函数设计完成:四个变量属性:$user_id:指定用户的ID,如果为0,则获取公共朋友圈内容。$offset:查询偏移量,用于指定从哪个位置开始检索文章。$number:要检索的文章数量。$uncache:是否绕过缓存,如果为true,则忽略缓存直接查询。返回一个包含朋友圈内容的数组,每个帖子包括 post_id(文章ID)、time(发布时间)、content(内容)和 author(作者ID)等信息。 如果没有内容或发生错误,返回 false。使用 Redis 进行结果缓存,缓存时间为 12 小时。 如果未绕过缓存且缓存中有数据,函数将直接返回缓存数据。 如果缓存中标记为 'false',表示没有内容,函数将返回 false。 缓存状态以 cache 键表示,为 false 表示缓存未命中,为 true 表示使用了缓存数据。根据传入的用户ID和相关配置,构建查询参数,包括关注列表、隐私设置等。
使用 WP_Query 执行查询,并处理查询结果。将查询到的文章数据格式化为数组,包含指定字段和元字段信息。
13、封装全新的异步执行函数:【xc_asyn_execution】用于触发异步任务的执行,它向异步任务处理器发送任务,并可以选择是否等待任务完成。 $function_name 参数指定要异步执行的函数的名称。 $function_variable 参数是一个数组,用于传递给 $function_name 函数的参数。默认为空数组。 $result 参数是一个布尔值,用于指定是否需要等待异步任务完成并返回执行结果。如果为 true,函数会等待异步任务完成,并返回任务执行的结果;如果为 false,函数会立即返回 true,不等待任务完成。 函数首先检查指定的函数是否存在,如果不存在,则直接返回 false。 构造了一个包含任务相关信息的数组 $task。 调用 xc_task_worke 函数来处理异步任务。如果 $result 为 true,则函数会返回异步任务的执行结果;如果为 false,函数会立即返回 true,不等待任务完成。
14、宫论异步进程新增请求:【asyn_execution】,负责异步执行函数请求。需要传递函数名 $function_name,和执行函数的参数变量数组 $function_variable,以及是否需要返回消息的标志 $reply。 如果指定的函数不存在,返回一个错误信息。并且通过opcache 会使加载的 PHP 脚本失效,以确保下次加载时新的内容会被读取到。 最后将根据是否有要传递的参数,选择直接调用函数或使用 call_user_func_array 动态调用函数。 执行完函数后,将回复消息给请求源。 完成任务后断开连接,关闭连接对象。
15、异步进程新增一个命令请求:$task_data['type']=reboot。请求子进程执行posix_kill事件,像所有的子进程发起重启请求。注:这个请求是预留事件,后面需要来完善。进程脚本重启是一个非常复杂的场景,操作不当会导致主进程出现意外奔溃的情况,需要做大量测试才能部署使用。
0
心乐
lv.2
实名用户
2023年11月20日开发记录
1、新增朋友圈分页函数:xc_moments_consult,接受三个参数:$user_id表示用户ID,$offset表示偏移量,用于分页,默认为0,$number表示每页显示的文章数量,默认为10。函数中构建了查询参数$args,包括了文章类型为"moments",用户筛选为:发布者的关注列表名单,文章自定义字段"power=public"的条件。【注:获取用户的关注列表,返回关注列表发布的朋友圈内容】
2、朋友圈分页查询函数,现在会排查(moments_close)用户组,处于这个用户组的用户一般为两种。1、用户主动关闭了朋友圈。2、因为涉嫌违规,被平台封禁了朋友圈的用户。这类朋友圈的内容,不应该对外展示,因此在WP_Query构建查询的时候,需要通过author__not_in过滤这些用户名单,在返回结果。注:涉及到朋友圈(禁用停用关闭)一定要同步更新moments_close。
3、朋友圈分页函数进一步优化,通过fanlist获取到用户的关注名单后,会在原有数组名单中通过array_push将当前用户也加入其中。这样用户便可以获取到【自己和关注人的朋友圈内容,之前是只能获取关注列表的内容,并不包含自己。】同时过滤名单,也会移除当前用户,避免用户关闭了朋友圈,看不到自己的内容。
4、分页查询进一步优化查询,现在会将用户手动屏蔽的过的朋友圈加入到过滤名单中。具体操作为:通过get_user_meta读取用户的朋友圈配置信息,检索filter_list用户是否过滤屏蔽了某些用户,如果屏蔽名单数组存在。则会通过array_merge将过滤名单和(已停用关闭朋友圈)名单进行合并数组,然后通过array_unique进行去重处理。最后就得到了真实有效的过滤名单组,注:防止出现意外情况,当前用户过滤会在合并名单之后再进行移除。
5、xc_moments_filter_list(向朋友圈过滤名单中添加或移除用户ID)和xc_moments_block_list(不让指定用户看我的朋友圈)两个函数进行优化,1、返回结果现在采用标准的数组【code=0或1,msg=返回说明】,不在单一返回布尔值。前端无法进行正确响应错误详情。2、处理函数判断现在会过滤用户,如果被操作用户等于当前用户则直接拦截【code=1,msg=你不能对自己朋友圈进行操作。】
6、新增一个朋友圈自定义字段:moments_author(朋友圈作者),这个字段涉及是为了处理一个比较复杂的查询场景。当用户朋友圈部分内容设置为【私密可见】,而我们进行多个用户(当前用户+关注用户)查询时,需要过滤私密内容。要么全部屏蔽,要么全部不屏蔽。WP_Query查询方案似乎无法做到【当前用户的内容不过滤,关注列表用户内容过滤】,目前想到的折中方法是,增加一个字段来锁定过滤名单(即作者)。
7、朋友圈文章发布钩子优化:如果文章不公开,则会追加一个whitelist字段(白名单用户)。文章如果设置为私密可见,那么这个字段会记录发布者的UID,如果设置为粉丝可见,则会以数组的形式写入粉丝列表数据。构建朋友圈分页查询方法的时候,会通过检索白名单的方式来获取隐私内容,主要是用于粉丝可见内容的处理。
8、解决朋友圈分页函数一个筛选难题,返回结果如果过滤屏蔽(她人隐私内容、粉丝可见)。处理方案:使用了两个meta_query子条件。第一个子条件使用了relation参数为AND,表示同时满足power为privacy和author为当前用户UID的条件时才返回。第二个子条件使用了relation参数为OR,表示满足任一条件即可返回。其中,第二个子条件包含了NOT EXISTS比较操作符,用于判断power字段是否不存在。这样,查询结果将返回满足author__in和author__not_in条件,并且满足以下两个条件之一的文章:1) power字段为privacy且author为当前用户;UID) power字段不存在或者不等于privacy。
9、朋友圈分页函数xc_moments_consult:现在支持游客模式(user_id不需要传递,或者刻意将其标记为0),那么将重新构建WP_Query方法。查询条件为:文章类型必须为:moments,朋友圈文章状态必须处于公开(power=public)。过滤条件为:已关闭朋友圈的用户组。其它符合条件的用户朋友圈内容一并返回。注:不传递用户UID,则返回所有公开朋友圈内容(已关闭的朋友圈依旧跳过)
10、朋友圈分页函数如果未指定user_id,那么在返回所有朋友圈内容时 会通过xc_is_login获取当前用户UID,然后赋值到$author。过滤名单数组会过滤当前用户,避免用户在查看朋友圈广场时,自己新发布的内容无法查看。注:过滤名单为:author__not_in,主要为已关闭或已封禁的朋友圈名单数组。
11、朋友圈分页查询新增变量uncache(默认为false,优先查询缓存),如果为true则禁止缓存,直接通过WP_Query来获取朋友圈分页数据。缓存键值为:moments_' . $user_id . ':' . md5('consult|' . $offset . '-' . $number)。注:user_id是指定用户的朋友圈的内容,如果其值为0。则表明这是朋友圈广场(返回所有公开的朋友圈内容)。
12、朋友圈分页函数返回的内容调整,目前仅返回(post_id=朋友圈编号、time=发布时间、content=朋友圈内容、author=发布者UID),其它字段全部丢弃处理,减少非必要的缓存占用。注:朋友圈文章对应的自定义字段(ALL所有)会直接挂载到meta子数组结构中,非及时更新的自定义字段,可以直接通过分页函数结果调用。
13、朋友圈分页查询数据缓存时间调整为12小时,避免长期缓存占用太多内存资源。通过xc_moments_consult函数构建WP_Query文章查询后,无论是否有结果返回都会立即执行wp_reset_postdata(重置查询对象的文章数据),避免对象被溢出,造成其它分页查询出现返回异常。
14、xc_moments_publish_hook朋友圈发布钩子新增业务逻辑:当朋友圈文章发布成功后,会执行两个事件(1、通过clean_redis_key(moments_0:*),清理分页查询缓存(全局所有文章)。2、通过clean_redis_key(moments_发布者UID:*),清理发布者的朋友圈查询缓存。这样分页返回的数据,如果存在缓存会自动被清理。
0
心乐
lv.2
实名用户
2023年11月18日开发记录
1、APP端view视图层优化,之前通过margin-top强行将视图向下调整8vw会导致(内页窗口出现底部显示不完整的情况),新的解决方案是通过position:fixed进行布局,top参数来设置间隔距离。然后通过height来做高度处理,使用calc函数,可以将height的值设置为视窗高度减去8vw的计算结果。这样设置后,view元素的高度将自动适应视窗高度减去8vw的值。
2、plus_immersive_image(APP端调整沉浸式封面背景布局)事件优化,状态为开启(on)时会将view视图height调整到100%、top设置为0。当状态为关闭(off)时会将views视图height调整为:calc(100% - 8vw)、top设置为8vw。其它调整不做更改,仅限于视图样式的处理,以便适配新版视图兼容处理。
3、redis的内核版本升级到7.2.35, 同时将timeout设置为100秒。超过100秒如果客户端未有任何请求则会主动断开处理,避免客户端出现异常,造成连接池资源将无法及时回收。导致各种异常服务,比如协议出错等等。注:这个可能需要做兼容处理,即:重连机制问题,避免用户的redis被断开,导致业务混乱。
4、朋友圈页面新增pull-to-refresh-content组件,通过onPageBeforeInit对其进行refresh监听来实现页面下拉滚动监听,现在可以在朋友圈页面通过下拉背景,来触发这个事件。注:后续会通过下拉滚动事件来执行页面数据更新或加载动作,为了防止下拉滚动被重复执行和触发,会在监听位置坐一个load-post动画拦截,如果已有加载动作在执行,则跳过下拉处理。
5、朋友圈新增一个正文div容器【moments_list】,朋友圈的相关内容加载到这个容器内部处理。同时页面下拉滚动刷新事件也通过此容器来进行触发。注:封面下拉滚动监听存在兼容问题需要解决,暂时不采用该方案。除了下拉滚动,这个容器后面还会集成上拉触发滚动条加载更多事件监听。该容器会通过padding-top进行15vw间距处理。
6、朋友圈页面现在会通过 touchstart、touchmove 和 touchend 事件来监听用户的触摸操作,并相应地执行逻辑。当用户向下拉动时会显示【pull-to-refresh-layer】下拉进度图标动画,取消下拉动作 或手指离开屏幕则会隐藏下进度图标动画。朋友圈页面打开后,动画组件是隐藏不可见的。通过监听用户触摸操作来显示或隐藏。
7、朋友圈个人说明点击事件xc_moments_info_desc_more优化,显示全文时候样式调整:width: calc(100% - 100px);text-align:right;margin-left:100px,其它样式保持不变。调整后,说明依旧能够保持靠右间距对其处理,只是向左显示内容扩充更大一些,如果仍旧太长那么将2行显示。
8、朋友圈page-content现在采用position: relative布局,避免(头部区域,名字、头像、背景、备注)容器随页面滚动。解决页面滚动下拉后,上拉返回上面时会一直触发refresh事件的问题。在触发refresh事件前会获取scrollTop滚动条位置,如果滚动条处于顶部则允许执行下拉动作,否则跳过执行。
9、朋友圈页面发生滚动时,会通过scroll进行监听 监听位置【xc_moments.pull-to-refresh-content】,如果下拉滚动位置大于300PX,则会将navbar-inner背景设置为默认背景色、text-shadow阴影效果移除、文字颜色调整为黑色。如果滚动条位置小于300PX则恢复透明菜单,复原原有样式。
10、新增朋友圈背景背景自定义样式:navbar-inner.color【background-color: var(--jinsom-navbar-bg-color); text-shadow: 0 0 0px rgba(0,0,0,0.5);】用于顶部菜单涉及透明沉浸式处理,之前的处理方式存在瑕疵 如果菜单被透明赋值,上级页面的菜单也会同步处理。即便加了唯一类名仍会存在。新的解决方案是通过jquery进行类名addClass或removeClass操作,做到单一页面顶部菜单动态变化。
11、新增APP端:CSS变量组(自定义属性),像页面菜单,菜单字体颜色等都需要区分APP和H5端,因此单独配置一套CSS变量属性到app.css中,后面需要对页面样式做出全局调整都会通过CSS变量组来做跨段适配处理。目前主要针对APP端沉浸式状态栏做适配兼容处理。
12、朋友圈页面新增两个类名:page_immersive=用于页面唯一标识处理、navbar_immersive=页面导航菜单唯一标识。这个class类主要处理APP沉浸背景图问题,一个是标记页面,一个是标记顶部菜单。后面会通过监听页面访问事件来操作dom对这两个类做出增删处理。
13、朋友圈页面,现在会通过onPageBeforeInit进行页面滚动加载监听,当页面infinite触发事件时,会检测xc_moments_loading变量是否为true,如果不为则将触发ajax请求,请求携带参数为:page分页数据、author当前用户变量。请求发送后会根据后端的返回状态码进行页面数据填充处理。
1
心乐
lv.2
实名用户
2023年11月17日开发记录
1、朋友圈页面,会通过xc_get_moments_background获取用户背景图,然后加载到页面顶部(高度300PX)。同时为了避免页面布局出现错乱问题,朋友圈页面做出以下样式调整:1、内容区域添加自定义类:xc_moments,配合页面标识 对页面进行css调整只生效于该页面。2、padding-top取消向上10vw的间距,新增一个背景容器「background」来加载背景图,避免上下容器始终被包括在page-content里面。
2、朋友圈导航栏背景颜色设置为: rgba(70, 196, 124, 0)(透明隐藏),文字和图标通过text-shadow增加轻微文本的阴影效果(0 0 4px rgba(0,0,0,0.5);)。注:朋友圈会采用背景图模式,后面会做APP适配处理。类似于微信朋友圈一样,背景图覆盖到整个沉浸式状态栏中,此处导航背景设置为透明就是为了适配后续处理。
3、新增容器:avatar_info,加载用户头像、名字、备注,并显示在页面右下角。布局采用position定位元素布局,确保内容始终固定在指定区域。用户的头像、名字、备注的内容获取通过xc_get_avatar完成,该方法支持缓存,减少对sql的读取请求。注:对应的类名分别为(moments_name=名字昵称、moments_avatar=头像img、info_desc=个人说明)
4、全局导航栏右上角图标css优化调整(将I fa 图标固定为6vw),这样大小才能适配返回控件。调整css样式【navbar-inner .right I,navbar-inner .right fa{font-size: 6vw;}】。注:这个图标尺寸调整生效于所有页面导航栏,但原有.jinsom-icon样式图标不受影响。
5、新增朋友圈内容发布弹出窗口事件:moments_publish_layer,onclick点击触发后将会创建一个layer底部弹出窗口。一共有三个菜单选项:(发布图文、分享视频、取消),用户可以通过点击指定菜单进入朋友圈内容分享页面。该事件绑定到(朋友圈页面-右上角)新增一个相机图标(fa-camera)。
6、相册发布弹出layer事件内置一个className【moments_publish_layer】,通过这个类名对弹出发布选项做三个css调整(1、将layui-m-layerbtn的背景颜色调整为白色。2、将layui-m-layercont的背景颜色调整为白色。3、span[no]的文字颜色调整为黑色)。这样窗口的色调更鲜亮一些。
7、朋友圈发布弹出事件追加end回调关闭事件,关闭该窗口会将当前时间戳(毫秒)赋值到layer_close_time变量,使宫论后退事件能够监听捕获,使其支持左滑后退关闭(安卓端)。注:不追加这个监听,用户打开发布窗口后,左滑会返回上一页。同时新增click点击监听,现在点击(发布图文)菜单就可以触发页面跳转,之前点击文字部分才能跳转。
8、封装一个全新的plus事件:plus_background(),通过调用plus.navigator.isBackground()方法,获取当前APP应用是否在后台运行的状态,并将结果返回(true在后台、false不在后台)。这个方法主要是用于消息已读状态处理,如果用户收到消息,但是APP处于后台状态,说明消息是看不到的。这时候不能标记已读。
9、宫论APP开始采用沉浸式导航栏:目前已将navigationStyle字段设置为custom,导航栏样式将通过自定义来处理。注:沉浸式布局后,一些特定场景(朋友圈、个人主页、商户主页)有自定义图片背景铺垫的,会采用状态栏透明以实现沉浸式效果。注:存在一定兼容问题,但是影响很小(Android5及其以下版本目前不支持)。
10、新增沉浸式封面背景处理函数plus_immersive_image:接收唯一变量:status - 沉浸式状态,可选值:'on'(开启)、'off'(关闭),默认为'on',通过传入不同的status参数来控制不同的状态。当status为on时,会开启沉浸式状态,即.view元素的上边距设置为0vw,.navbar元素的上边距设置为8vw。当status为off时,会关闭沉浸式状态,即.view元素的上边距设置为8vw,.navbar元素的上边距设置为0vw。
11、APP端页面访问(onPageBeforeInit)和后退(onPageBeforeRemove)事件都会对特定页面进行跟踪,如果页面为沉浸式图片背景类型,那么将执行plus_immersive_image操作,对页面的元素进行兼容处理。注:打开页面是开启、后退页面是关闭。为了保护页面不被破坏,plus_immersive_image现在会进行plus环境判断,只有支持plus的设备才会执行。
12、朋友圈页面现在通过onPageBeforeInit进行一些特地事件监听,比如分页加载、关注评论等交互行为。这个页面非常复杂,后续会有很多事件要等待处理。目前已集成第一个监听行为:如果页面存在个人说明(info_desc元素存在),那么会通过比较元素的scrollWidth和clientWidth属性,判断文字内容是否溢出。
13、js库新增引入(moments.js),负责朋友圈相关js业务函数逻辑(不包含发布事件和页面路由)。命名方式【xc_moments】,通过wp_enqueue_script加载到宫论项目中。注:这个js库支持延后加载,当页面所有静态资源加载完毕后,在进行加载也不会造成页面错误。后续所有js都尽量做到主加载和次加载的分离,避免一次性全部加载造成性能缓慢问题。
14、朋友圈个人说明新增点击事件:xc_moments_info_desc_more,这个事件会控制.info_desc的文本内容显示更多或收缩。通过判断.info_desc元素的status属性,如果status不等于on,表示当前状态为显示更多,将取消设置宽度、边距和溢出处理方式,更新状态为on。如果status等于on,表示当前状态为收缩,将设置宽度为视窗宽度减去200px,设置边距为100px,设置空白处理方式为不换行,设置溢出处理方式为隐藏,设置溢出文本显示方式为省略号,更新状态为off。
1
心乐
lv.2
实名用户
2023年11月16日开发记录
1、video_info_task优化处理:1、sql查询语句处理,增加对order字段NULL类型的识别。2、内部执行xc_video_info语法时会通过@进行抑制报错,避免因为错误中断后续任务队列。3、重启服务器,并成功调试异步进程脚本 确保任务能够被周期性的被执行。注:视频信息更新一般分两个阶段处理。一、超时系统自动会获取,一般为发布成功一小时。二、后期会有个视频查询函数,同步获取视频信息并更新缓存。
2、朋友圈发布事件钩子,现在会以标准的数组结构返回内容,发布成功【code=0,msg=文章ID】发布失败【code=1,msg=发布失败,服务器异常!】。在处理业务逻辑时,前端可以根据后端返回的状态码来判断文章的发布状态。注:之前仅返回布尔值,没有返回文章ID,对前端响应结果不友好。故而改为数组形式返回。
3、前端朋友圈发布事件【xc_moments_post】,视频发布和图文发布处理逻辑保持一致。唯一的区别在于私密和公开内容的弹窗提示(私密朋友圈发布会有个提示内容,公开没有),后端朋友圈发布成功后,前端有预留一个回调事件 用于处理页面更新变化,比如朋友圈页面直接插入一条新内容。目前暂时为延迟2秒后退到上一页。
4、修复xc_publish_ok_hook钩子无法正确处理【@提醒、粉丝更新标识、草稿清理】的问题,当朋友圈发布成功后 会传递朋友圈编号到这个钩子进行回调通知处理。但因为发布者UID获取异常,导致后续的业务无法被正确触发。目前已修复该问题,改为通过get_post_field来获取朋友圈发布者的UID后,在执行通知提醒。
5、APP启动后会通过onLaunch执行两个PLUS事件【plus.navigator.setStatusBarStyle('light')=设置状态栏的文本和图标颜色为浅色,适用于深色背景。plus.navigator.setStatusBarBackground('#ffffff')=设置状态栏的背景颜色为白色。】APP沉浸式导航栏配色不在沿用后台设置,使用统一的白色背景,图标字体颜色固定黑色。
6、新增APP端层叠样式表,路径地址【assets/assets】。当设备处于APP环境会通过wp_enqueue_style加载该样式。前端唯一标识:xc_app,这个层叠样式表是加载在所有css文件的最末尾,app.css里面写的样式,如果页面已存在同名样式,会因为优先级自动覆盖前面的样式。APP端如果需要自定义样式,通过该样式表来处理即可。
7、现在会通过APP.css接管navbar-inner背景配色(所有顶部状态栏的颜色标记为#FFFFFF,以此适配APP端的沉浸式配色),对应文字、图标、A链接的颜色设置为(#332b2b)以此覆盖原有配色,避免浅色被深色背景覆导致显示不出来。同时首页头部搜索框的背景色调整为:#f7f7f7浅灰色。
8、新增朋友圈页面【global/moments.php】页面唯一标识:xc_moments,短代码地址:【[xc_link type=global]/moments.php】这个页面没有权限拦截(所有人都能访问),但是如果未登录,可能不是加载数据。这个页面属于个人主页,用户会在这个页面看到自己和已关注用户的朋友圈动态。如果没有关注好友,或未发布过朋友圈,那么页面可能会加载其它内容,具体要看分页查询接口的设计。
9、朋友圈后台配置,新增朋友圈背景图设置专栏,提供一个全新group字段【xc_moments_background_defalut】用于添加官方预设背景图,需要配置三个字段:name=背景图名称、url=背景图地址(支持直接上传),尽量不要图片太大,比例:410X300。vip=开启后该背景图只能会员选择。
10、后台临时添加16套朋友圈背景图,作为测试使用,其中两套设置为vip可用。同时现在用户自定义元字段(moments_config)数组配置,现在新增一个键值:background,如果用户自己上传了朋友圈背景图,或主动选择了系统默认背景图,那么这个值会写入图片地址,以便相关函数直接读取。
11、封装一个新的方法来获取用户的朋友圈背景图片 URL:xc_get_moments_background,首先,它会尝试从用户的朋友圈配置中获取用户自定义的背景图片。如果用户配置中包含背景图片,就会返回用户自定义的背景图片 URL。如果用户配置中没有背景图片,函数会从默认的朋友圈背景图片数组中选择背景图片。如果用户是会员,函数会随机选择一张背景图片作为背景。如果用户不是会员,函数会从不包含 vip 字段的背景图片项中随机选择一张作为背景。
12、通过xc_get_moments_background获取用户朋友圈背景图后,如果用户朋友圈配置没有background字段,那么会将随机获取的背景图写入到用户配置,以便下次能够直接读取。注:首先会检测moments_config字段是否存在,如果不存在则会创建一个空数组,在通过update_user_meta进行数组配置更新。如果存在则直接完成更新。
0
心乐
lv.2
实名用户
2023年11月15日开发记录
1、朋友圈发布事件xc_moments_post,新增发布类型:video(允许用户分享视频到朋友圈)。发布事件有两个拦截处理,首先会检测页面是否有视频上传组件,如果没有直接拦截。存在视频上传组件 还需要检测视频是否已完成上传(自定义字段:url),该字段存在则代表页面插入了视频,未上传视频禁止发布。其它拦截标准和朋友圈图文分享保持一致。
2、朋友圈开关提示优化(视频和图文),如果用户关闭了朋友圈 则在发布时提示【朋友圈已被关闭,无法分享内容。<br>请前往朋友圈设置页,重新启用!】。评论开关优化,如果用户关闭了朋友圈全局评论功能,那么默认评论是关闭的,开启会提示【你的朋友圈已禁止评论,无法开启<br>如需评论,请前往朋友圈设置页(取消限制)】
3、xc_moments_publish_check_hook(朋友圈发布拦截钩子),如果发布类型为video 那么将检测video_url字段是否传递,如果不存在则返回【code=1,msg=视频地址为空】。注:视频朋友圈分享发布,那么视频是必选的 如果未上传视频则不允许用户发布朋友圈。前端和后端都要做出拦截判断!
4、朋友圈发布钩子:xc_moments_publish_hook,如果发布的类型为视频(video)那么将创建一个朋友圈自定义字段video_url写入分享的视频地址。并且在发布成功后将执行:xc_upload_media_ok事件,上传数据表回调处理 将上传的视频标记上朋友圈文章ID,避免被系统定时计划清理删除。
5、封装一个方法:xc_delete_local_file()该函数用于删除本地文件。函数接受一个参数 $id,可以是文件媒体ID或文件地址(CDN域名地址)。根据传入的参数类型,函数从数据库中获取文件信息或检查文件是否存在。然后,函数检查文件路径是否存在,并且文件是否存在。如果文件存在,函数使用 unlink() 函数删除文件。如果文件删除成功,函数返回 true,否则返回 false。
6、execution_cos_delete_task:cos文件删除计划新增处理业务逻辑,xc_cos_sdk_delete函数执行成功后 会立即执行xc_delete_local_file函数。这样CDN远程文件删除成功后,如果本地文件存在的话,也会同步移除处理。这个计划函数是系统周期性执行,后台预设间隔时间,超过XX小时仍未有订单标识的文件 都会通过该计划执行移除。【注:这是redis标准任务队列,用到了(定时计划、异步进程),业务逻辑相对比较复杂】
7、xc_upload_hook_success文件上传钩子新增业务逻辑:会通过xc_upload_image_config或xc_upload_video_config来获取当前文件的上传配置,如果后台标记该类型,不保留本地文件 则会直接通过xc_delete_local_file进行服务器文件移除操作。注:之前是采用定时计划去移除,现在是同步方案处理。只要文件上传同步到cos云端,就会移除本地文件。需要特别注意的是,目前仅支持video和image两种类型配置,如果后台未配置,则目前视为保留【主要是聊天图片和聊天视频目前未处理】。
8、xc_delete_local_file继续优化处理:当本地文件删除成功后,会通过xc_update_sql进行数据表回调操作。将local字段设置为空,这样后续业务可以直接通过判断local字段是否存在来获取本地文件的状态。注:涉及本地文件的删除,必须采用xc_delete_local_file函数来执行,这样可以确保业务的统一性。
9、新增钩子:xc_delete_local_file_hook,需要传递两个变量(被操作的媒体ID,和被删除的文件地址local)。当媒体表的服务器本地文件被删除了,将会触发这个钩子。如果有业务涉及到本地图片的调用,那么需要通过这个钩子进行回调处理,避免因为文件不存在,造成业务访问中断。
10、私信发送视频和发送图片,接入新版上传配置。上传参数将通过xc_upload_image_config和xc_upload_video_config配置组获取。这样可以做到全站媒体资源业务逻辑统一化(删除、同步、更新、审核),旧版字段目前仍旧保留,以免出现兼容性的问题产生。后面重构前端私信聊天上传接口时,在移除旧字段。
11、新增钩子:xc_delete_file_hook,需要传递两个变量(被操作的媒体ID,和被删除的文件地址local)。当媒体文件被删除了(非本地文件是指remote字段地址,可以理解为CDN加速图片或视频被存储桶移除后),将会触发这个钩子。如果有业务涉及到该图片的调用,那么需要通过这个钩子进行回调处理,避免因为文件不存在,造成业务访问中断。注:这个钩子目前主要靠xc_cos_sdk_delete这个事件触发,cos移除对象存储文件事件。
12、xc_video_info提供对象存储COS——SDK【获取视频文件信息】优化处理,1、如果媒体表记录状态为delete(已删除),会直接返回flase。2、该接口目前仅支持视频信息采集,如果上传媒体非video类型也会直接false。3、采集结果优化,现在不会读取Audio和Format数组信息,减少对数据表的写入压力。
13、video_info_task,sql语法优化:xc_upload 表中选择所有满足以下条件的记录:【1、state 字段的值为 'ok'。2、order 字段必须存在内容(不为空字符串或NULL)。3、exif 字段内容不存在(为空或为 null)。4、time 字段的值必须在当前时间的1小时之前】,之前的语法存在瑕疵,会造成查询异常。
0
心乐
lv.2
实名用户
2023年11月14日开发记录
1、H5和微信环境通过视频上传组件发起视频视频上传后(已完成字节大小和mime格式的对比验证后),会创建 XMLHttpRequest 对象来进行视频文件发送服务器后端的处理。同时会透过addEventListener进行三个监听(progress=上传进度、load=上传完成、error=返回异常监听)。考虑到兼容问题,目前H5和微信端不支持视频拍摄功能,主要是无法压制视频,原码视频无法处理大小。
2、非APP端视频在进行XHR请求建立前,会封装upload对象数据包,将【type、user_id、order、size、blob、file_name、upload、source、number、remark】等信息封装,然后通过encodeURIComponent进行编码化处理,然后提交到xhr接口。同时移除xc_upload_video事件一开始对upload_json的对象封装,新版上传接口已经用不到这个对象信息了。
3、addEventListener触发progress上传进度监听后,会通过Math.round计算出当前上传百分比,并赋值到percentage变量。如果上传进度大于(99.9%)将判定视频上传成功,如果视频上传组件存在当前页面(xc_publish_video元素大于0)那么页面会将上传进度条标记为100%,提示内容变更为【上传成功:服务器正在转码】,移除上传组件点击事件。如果低于99.99则实时更新页面的上传进度百分比,并且将文字提示更改为【XXXmb/xxxmb】这种上传文字提示。
4、addEventListener触发load(服务器回调事件)后,会解析xhr.responseText参数,并将字符串解析为 JSON 对象【注:上传接口会返回标准的json数据信息,格式为code=0或1、msg=返回详情。0代表文件处理成功,1代表拒绝处理或者发生错误】。XHR现在会正确处理服务器信息,如果code=1那么将执行以下操作(1、xc_upload_video_form上传组件恢复、并且将onclick事件复原。2、上传进度条重置为0%。3、视频链接如果已存在则移除。4、文字信息则变更为:处理失败: 【错误详情】)。
5、通过XHR成功将视频文件上传到服务器(并且同步到了云端COS对象存储)则服务端会返回的code=0,msg即:cdn远程视频地址。此时页面会执行以下变化。(1、隐藏xc_upload_video_form视频上传组件信息。2、显示可移除当前视频的BTN按钮菜单。3、将上传成功的视频地址同步到xc_publish_video的自定义属性url上面。4、通过西瓜视频播放器构建一个播放组件,将当前视频插入到页面中。)注:以上DOM节点变化的前提必须是当前页面存在视频上传组件信息。
6、如果XHR请求存在错误返回(一般为服务端响应错误),会触发addEventListener(error)监听事件。监听事件会捕获xhr.statusText(返回一个包含错误状态文本的字符串)和xhr.status(返回一个表示错误状态码的整数值),如果视频上传组件存在,则会将捕获到的【错误码和错误信息】一并写入到视频组件中。并重置组件的一些元素(1、恢复上传组件和onclick事件。2、上传进度归零处理。3、视频地址的属性设置为空)。
7、避免(H5和微信端)上传组件被重复执行,特地安排了一个变量来控制上传状态,当【isUploading_video为true,则禁止表单被触发和点击】。以下为该变量属性的状态变化,初始化为false,执行上传请求前标记为true。【上传出现错误、服务器返回异常、权限操作失败、文件上传成功】等情况会将其标记为false。相当于一个上锁机制,除非主动解锁,否则不允许用户重复提交请求。
8、APP本地文件上传现在也支持isUploading_video变量来控制重复上传请求(加锁机制),具体表现为:执行APP上传请求前(不区分拍摄还是相册选择),会主动将isUploading_video标记为true。如果其值为true那么plus_upload会组织上传请求,并通过plus_msg告知用户(有进程正在执行上传任务)。当上传任务完成后(无论失败还是成功)都会将属性标记为false。
9、视频上传完成后(西瓜播放器加载到页面成功)时,会使用 offset().top 方法获取 .xc_remove_video_toolbar 元素相对于文档顶部的位置,并将该位置存储在 targetOffset 变量中,然后使用 animate() 方法将 .page-content 元素的滚动位置动画地滚动到 targetOffset 位置。这样在如果加载的是长视频,页面会下拉到最下方。用户体验更友好一些。
10、xc_upload_video_delete事件优化,在移除视频播放器的时候,还会通过removeAttr移除播放器之前留下的style标签(主要是插入高度信息,造成页面下拉存在大量空白)。并且如果操作环境是微信浏览器(user.ua==wx),还会主动讲视频容器的html信息设置为空。注:这是一个环境兼容问题,微信浏览器在视频加载后,会自定义一个容器来包裹播放器。未播放直接通过事件摧毁播放器,会造成移除失败。因此需要手动移除整个视频容器。
11、xc_upload_video在微信环境执行时,无法触发xc_msg消息提示。视频大小超过限制,视频格式不支持,出发消息拦截用户无法收到信息。目前的解决方案是,通过user.ua判断设备环境,如果处于微信中。则会将错误拦截信息写入到上传组件的提示上面,并执行top_msg消息顶部窗口通知,确保上传失败事件能够被用户接受到。注:服务器返回拒绝上传,也会通过top_msg触发消息警告。
12、视频上传成功后会通过xc_upload_hook_success钩子,增加一个计数器【day:video_upload-' . $upload['user_id']】记录今日用户视频上传次数,该计数器每日00:01会自动清零重置。同时xc_upload_block_hook文件上传拦截钩子,现在会检测用户今日视频上传次数,如果超过后台限制 会主动拦截并提示用户。
13、fontawesome字体图标优化,视频播放组件加载的fa图标 margin-bottom:2vw(元素的下边距的空白间距设置为页面2%)。这样在后端返回自定义事件时,页面图标可以对称显示。视频上传组件(xc_publish_video)margin-top:4vw(元素的上边距的空白间距设置为页面4%),避免商品卡片插入时 因为靠右对齐遮挡着上传组件。
14、宫论视频上传组件封装完毕,视频上传配置通过后台预设。需要视频上传的页面只需要通过require_once引入(xc_get_option('xc_publish_component_video'))文件,然后在需要显示视频上传组件的地方执行 【xc_upload_video_html('moments')】函数即可,上传组件触发事件为:xc_upload_video,该事件仅允许登录用户执行。上传请求区分APP端和网页端(微信端也是沿用H5配置选项),触发后将通过原生事件或H5事件发起视频上传请求。上传会在页面(组件内部)进行实时回调,包括进度条、压制状态、返回错误信息等。视频上传完成后,会创建一个自定义属性到组件中url,判断用户是否完成上传,只需要获取这个地址变量即可。这个上传组件是全局可用,需要上传视频的地方,按需引入上传组件即可(权限、安全都已做处理)。
0
心乐
lv.2
实名用户
2023年11月13日开发记录
1、经过反复测试,plus.io.getVideoInfo接口获取相册视频信息时偶尔会出现卡死状态(等待超过10秒才有反应),这对用户体验非常不友好。因此相册完成视频选择后,不在主动通过该API去获取视频信息。改为通过getMetadata来获取来获取size字节,然后进行上传尺寸大小拦截判断。注:如果该函数依旧出现卡死状态,则取消前端size大小判断。
2、xc_upload_video视频上传事件,APP端现在支持视频拍摄(请求事件为:plus_camera('video'))操作流程为:触发视频上传请求时,会判断环境是否处于APP,如果处于则触发layer弹窗(选择拍摄或相册选择视频),如果选择拍摄视频则通过plus_camera发起设备主摄像头录像功能,进行视频录制操作。视频录制时长为最大10分钟。
3、视频拍摄完成后会通过plus.zip.compressVideo进行压缩处理,压缩参数为:(src=拍摄视频文件地址、quality压缩视频质量为中等、fps=帧数设定为60、resolution=分辨率为原视频比例)fps和resolution目前仅支持iOS环境,之所以压缩视频,是因为手机拍摄的视频一般都是比较大的,不经过处理 可能10秒的拍摄就会超过100mb。
4、考虑到APP端如果触发原生组件,无法触发layer弹出窗口。特地封装一个(等待加载指示器)plus_showwaiting函数,content是一个可选参数,用于指定等待加载指示器的显示内容。在函数内部,使用 plus.nativeUI.showWaiting 方法创建等待加载指示器,并将其存储在 plus_showwaiting_ 变量中。通过设置 padlock 为 true,我们禁止了用户手动关闭等待加载指示器。因为用户无法主动关闭,特定封装一个方法(plus_showwaiting_close)进行关闭等待指示器处理。
5、plus_showwaiting新增返回键监听,当用户左滑时将会拦截处理,避免用户在触发等待器时通过左滑关闭窗口。具体参数变量为:【back:none】该拦截只适用于安卓,ios没有返回概念。同时新增一个全局变量plus_showwaiting_,用于监听加载器是否处于运行状态,触发plus_showwaiting_close关闭事件时会该变进行检测。如果存在才执行onclose。
6、plus_camera视频录制请求,现在会根据拍摄的视频的大小来决定是否启用视频压缩。处理流程为:1、通过getMetadata获取拍摄的视频文件大小,如果小于后台设定 那么将允许上传。如果大于后台设定,则触发压缩弹窗指示器,并执行compressVideo压缩请求,完成压缩请求后关闭指示器弹窗。然后在一次验证视频大小(压缩后的视频文件),如果小于后台设定则允许上传,仍旧大于后台设定 那么拒绝并提示用户。
7、xc_upload_video和xc_upload_image两个事件优化,APP端触发【拍摄和相册选择】的弹窗时,直接通过onclick来调用plus_camera摄像头请求接口,就方法是通过监听ayui-m-layercont的点击事件来触发函数,这个方法存在瑕疵,会有概率重复调用摄像头(视频拍摄,会有概率重复拍摄。拍摄完成后需要继续拍摄)
8、视频拍摄完成后(包括压缩后处理),如果尺寸符合要求那么将会触发plus_upload文件上传请求,将拍摄的手机视频传送到宫论统一上传接口。注:上传请求会根据文件信息封装upload_json上传数据包,并且上传事件触发后会同步更新页面的视频进度变化(和相册选择视频)处理的流程基本保持一致。
9、plus_upload上传事件触发时,会根据状态对【xc_upload_video_form】进行onclick绑定或解绑操作。1、当上传服务器请求触发时,会进行解绑操作,避免用户在上传任务执行时,继续点击上传。2、当上传出现异常:服务器拒绝请求,上传中断时,会回复onclick点击事件,以便用户可以重新上传。
10、当拍摄的视频通过plus.zip.compressVideo只想本地压缩处理时,视频上传组件存在时,会将组件页面提示变更为(视频正在压缩处理、同时上方附带一个设置旋转按钮)。视频压缩失败或者压缩成功后则会立即恢复原有的提示信息和图标【选择一个视频 (不能超过XX MB】。
11、视频如果处于压缩时不在执行plus_showwaiting加载指针(强制用户等待,对用户体验不好),改为压缩事件触发时,将上传组件的点击事件变更为消息提示。用户被允许在页面互动行为,但是点击上传组件会提示【视频正在压缩,请耐心等待】。当压缩成功则会恢复为上传进度条,失败则显示原来的提示【选择一个视频(不能超过xxxMB)】。
12、APP端请求宫论统一上传接口,鉴权机制优化。不在通过通用is_api_request函数来拦截请求(全局的请求头加密写到js类容易造成安全隐患),改为自定义请求头处理。具体流程为:plus在处理本地文件上传时仍会发起一个自定义请求头(但不是后台全局白名单的那个)。然后接口会判断是否APP环境,是的话则通过判断自定义请求头来验证安全。其它环境依旧采用传统验证方式。
13、plus_upload上传事件优化,如果服务器接受文件后,判定请求是是非法的。那么将延迟0.1秒(100毫秒)在进行页面回调操作,避免与statechanged回调事件发生冲突,导致页面无法正确响应结果。同时被拒绝上传,页面的文字内容变更为:处理失败: ( ' + responseObj.msg + ' )。后者为实际的拒绝原因。
14、考虑到压缩组件的强大性(安卓端:拍摄视频原码甚至可以压缩的到10/1),现在拍摄的原码视频不管大小是否超过系统限制,都要走压缩流程。1、减少视频的码率,避免十几秒的视频达到几十上百兆,造成用户播放视频卡顿。2、减少不必要的流量开支,高码率视频带宽消耗过大。注:之前是如果拍摄视频低于(100MB,后台设定)那么就不压缩,现在是无论多小,只要是拍摄的就必须压制。
15、xc_upload_video如果时间不是处于APP环境,那么将创建了一个隐藏的文件输入框,用户点击【视频上传组件】将会自动添加了一个 change 事件监听器,并理解执行视频文件选择请求。以此来发起视频上传功能,为了避免监听事件重复执行,会通过 isUploading_video全局变量来判断当前是否处于上传执行状态,如果是,则直接返回,避免重复点击上传。
0
心乐
lv.2
实名用户
2023年11月11日开发记录
1、plus_gallery如果处理的来源为(video=相册选择视频),在接口返回地址后会通过resolveLocalFileSystemURL打开文件对象,然后利用getVideoInfo解析获得视频的(size:视频大小、duration:时长秒数、width:视频宽度、height:视频高度)等信息。其中size要作为上传限制拦截手段。
2、封装一个plus事件(plus_msg)这个函数用于显示提示消息。它接受两个参数:content 和 ToastStyles。content 是消息的内容,而 ToastStyles 是一个可选参数,用于指定消息的样式。函数首先检查是否提供了 ToastStyles 参数。如果没有提供,则使用默认样式显示消息,其中消息居中显示。如果提供了 ToastStyles 参数,则使用指定的样式显示消息。注:这个消息是系统原生窗口样式。
3、相册选择视频后,成功取得文件对象信息后。会进行以下拦截判断(1、检测info.size视频字节大小是否大于后台限制【通过xc_publish_video自定义属性max_size来获取后台限制】。2、检测视频文件MMIE是否是支持的类型【通过xc.mime_video获取支持类型列表】)如果不符合条件,则通过plus_msg发送消息提醒。注:不能通过xc_msg来触发消息发送,因为相册处于打开的状态,内置的layer窗口会被主动关闭。
4、新增APP上传接口请求函数(plus_upload)这个函数接受两个参数:file 是要上传的文件路径,fieldParams 是一个对象,包含自定义字段名和对应的值。函数会请求宫论统一上传接口,根据fieldParams发起一次上传任务请求。该上传请求是通过APP端发起的,并非js处理(js无法读取文件,必须采用plus方案来解决)。这个上传接口主要负责视频的上传,但是可以做出适配调整,原则上来讲 只要是手机的文件都可以通过这个接口上传。
5、APP端上传接口现在支持status状态回调监听,如果服务器故障或请求异常会返回状态错误信息,并通过plus_msg发送错误详情。如果服务器接受到了上传文件(原则上:文件发送成功),但是后端安全效验失败,则会通过upload.responseText返回错误信息。比如:非法请求、上传超过上限、文件格式不支持等。此时也会触发plus_msg窗口提示错误。
6、宫论统一上传接口有个身份拦截器,非法请求都会拒绝。通过plus发起的上传请求,因为是APP设备发起的所以被锁定为异常而拒绝处理。为了解决这个问题,plus_upload会在发送上传请求前会通过setRequestHeader写入一个header标记码,用于安全白名单处理逻辑,使接口做到安全放行处理。
7、plus_gallery执行相册视频选择函数,如果通过了size大小和mmie格式检测后 会封装一个upload上传数据包给plus_upload上传事件。数据包内容包括(type、user_id、order、size、file_name、blob、upload、source、number、remark),一些数据是通过客户端设备信息解析而来,一些则是当前用户信息。这个数据包会通过encodeURIComponent进行编码处理,以便传递给上传接口识别。
8、宫论统一上传接口新增【通用视频上传接口】,配置文件通过xc_upload_video_config来解析获得。通过视频上传组件完成上传的video(无论是:APP、微信、H5)都会通过这里的业务逻辑处理。整个上传流程为:1、创建本地临时文件,2、保存并移动文件。3、视频入库处理。4、建立上传缓存。5、发起视频上传cos同步请求。6、完成视频处理返回前端。
9、视频上传请求remark备注统一标记为:blob。不在区分APP端和H5端,这样处理逻辑可以做到统一,避免一个上传来源做一次请求识别处理。同时上传接口涉及到unlink函数调用的地方,都采用@来移植错误输出。避免因为(文件或目录不存在:权限问题:文件名或路径错误)等情况造成移除失败,导致前端响应异常。注:这个函数一般是删除临时文件,不需要回调监听。就算删除失败,系统也会定期清理。
10、通过对statechanged监听,视频的时候上传组件现在会实时更新进度条状态变化(具体实现为:percent元素,会根据计算已完成的百分比,对宽度百分比进行调整。)其容器背景色会浅色,百分比覆盖颜色为深色,因此视觉上会有个进度条的变化(每秒更新2-3)此进度,如果进度条更新完毕则会调整上传组件提示【旋转加载图标+视频正在转码处理中】。注:视频上传完成,只代表文件后端已接收成功。还需要同步到cos,这个过程需要用户等待。
11、视频同步到云端以后,会返回code:0和msg:视频CDN地址,此时plus上传监听事件会执行以下操作【1、将视频上传组件进行隐藏处理。2、初始化西瓜视频,创建一个播放器到当前视频组件。(播放器属性:视频自动播放、并只允许播放暂停,声音调整、视频宽度适配页面,高度自动调整)】并且视频下方会新增一个菜单(移除当前视频,重新上传);
12、视频加载成功后,会在上传组件容器中通过attr赋值一个变量(url=视频地址),发布时可以通过监听这个字段来判断用户是否已上传视频。当上传失败或后端返回异常错误会将这个字段移除。注:服务器返回错误信息和服务器请求失败,会执行以下操作。【1、视频上传组件通过show恢复显示。2、通过plus_msg弹出错误原因。3、上传组件进度条恢复为0%。4、上传组件的文字信息初始化处理。】
13、新增视频移除事件xc_upload_video_delete,当播放器加载完毕后才可以执行该事件。触发后将依次执行【1、移除隐藏当前操作按钮。2、显示视频上传组件。3、上传组件的文字信息回复如初。4、进度条恢复为0%。5、清空上传组件的url值。6、页面通过scrollTop调整到最上方,有时候有些视频是竖屏,移除视频后会造成页面空白。】
14、APP端通过视频上传组件发送视频除了会显示进度条,还会显示具体上传大小,上传进度从字节单位转换为MB单位,并保留小数点后两位数(示例:23.15MB/98.63MB)。当进度条大于99.9会直接标记为已完成,上传菜单显示控件会切换到(视频正在转码处理中)。原来的通过status监听状态200,有一定延迟。
15、plus_upload上传事件参数配置(超时时间:180秒、每次上传快大小:200KB,上传优先级:100)。APP本地上传请求,所有回调事件都做了事件区分。视频上传组件的处理,不会影响到其他页面结构。注:这个上传函数设计不单是为了上传本地视频,后面很多场景都会用到,是一个通用APP本地上传接口,因此回调处理需要根据实际情况来设定。
1
咸鱼梦想
lv.2
实名用户
2023年11月10日开发记录
1、debug问题修复:xc_update_sql修改函数在涉及ID和id变量属性的判断时会进行isset语法判断,避免出现Notice错误。同时宫论API接口在处理位置选择时,会通过isset检查是否存在post传递变量(region),如果变量不存在则不会执行高德API地址解析请求。这个问题还是蛮严重的,每次请求API,如果没有传递【type参数】变量都会产生Notice错误。
2、DEBUG主要的问题已基本修复,剩下日志报错基本属于Notice类型(Notice 错误是一种较低级别的错误,表示一些潜在的问题或不规范的代码使用,这类错误不会导致脚本崩溃。)此类报错只是语法不规范,并不会影响使用。因此暂不处理(主要报错很多,一一解决起来需要花费大量时间)后续有时间在集中处理。注:后面尽量规范化,在执行变量判断需要善用(is_array、emptty、isset),这样可以规避绝大部分Notice错误。
3、上传配置页面新增视频上传限制(全局),xc_upload_video_limit_size:视频大小限制(Mb),xc_upload_video_limit_number:每日上传限制(XX个视频,注:视频上传未发布也会进行计数),xc_upload_video_detect:启用视频鉴黄审查(不建议开启,成本相对比较高)
4、新增视频上传配置(group),根据业务需要添加视频对应的上传配置。字段:xc_upload_video_config,数组字段包括(name:上传来源说明、key:上传标识,设置后不可变更,具有唯一性。和上传路径挂钩。class:自定义样式,如果组件需要自定义风格可以添加类名来实现。size:视频上传最大尺寸。audit:开启后.视频上传会经过鉴黄机器审核处理)注:这里的配置和上传组件挂钩,传递key唯一标识,获取视频上传配置详情。然后封装对应的视频组件。
5、封装方法:xc_upload_video_config $key 指定的key(上传视频唯一标识),根据指定的key查找xc_upload_video_config字段数组,返回找到的上传视频配置数组,如果没有找到则返回false。这个函数使用场景有两个地方,1、发布页面请求返回上传视频组件。2、宫论统一上传接口执行视频上传请求时。
6、发布配置新增类型(moments_video)发布标识为:moments_video。现在可以通过xc_publish_post('moments_video')正确打开朋友圈视频分享发布页面【xc_moments/publish_video.php】,通过这个页面,用户可以分享发布朋友圈视频内容。对应的朋友圈视频上传配置参数为【moments_video】,上传限制100mb。
7、新增页面【xc_moments/publish_video.php】页面唯一标识:moments_publish_video。通过这个页面用户可以上传视频分享到自己的朋友圈,页面打开监听事件和moments_publish_image保持一致。主要是监听用户草稿保存,和表单填写字数变。注:页面css需要单独做适配处理。
8、xc_publish_post统一发布页面打开事件(所有的发布功能(淘货、拍卖、工单、寄售、回收、朋友圈)都通过这个事件来访问)追加监听:xc_login,如果用户未登录状态则会主动跳转到登录页面。避免游客直接访问发布页面,然后发布页面没有做游客拦截。导致一系列的发布隐患。
9、视频上传组件函数封装完毕:xc_upload_video_html,传递配置标识KEY即可完成组件HTML的封装。内部会通过xc_upload_video_config完成配置解析,将上传尺寸参数写入到上传组件中。同时key会作为一个class类写入到组件中,方便前端对上传组件做样式调整。并且为了兼容【不同的上传视频组件】xc_upload_video_config上传配置组额外新增一个class样式。
10、上传视频组件class类名封装完毕(xc_publish_video、xc_upload_video_form、xc_upload_video_btn、xc_remove_video_toolbar)样式遵循LS原有风格,不过命名都已重新调整。引入发布类型标识类名,支持不同发布类型自定义风格。整体风格样式调整等后期前端来做重新调整。
11、朋友圈发布成功后触发xc_publish_ok_hook钩子后,会检测发布用户的草稿箱,如果其草稿箱存在朋友圈的草稿,将会通过unset移除对应的草稿,最后使用update_user_meta重新更新对方草稿箱数组信息。发布内容成功后,其对应的草稿无需保留,避免用户重新打开发布页面,还显示已发布过的草稿内容。
12、新增宫论统一视频上传事件【xc_upload_video()】,计划支持【微信端原生视频上传组件(支持拍摄和相册选择)、H5通用视频上传选择(仅支持相册,视频拍摄不好控制大小)、APP端原生视频上传组件(支持拍摄和相册选择)】该事件会验证用户是否登录,所在页面是否存在上传视频上传组件。
13、APP端(图片和视频)上传事件优化,如果存在layer弹出窗口。一般为(选择拍摄、或相册中选取)两个弹出菜单时间。追加end回调关闭事件,关闭该窗口会将当前时间戳(毫秒)赋值到layer_close_time变量,使宫论后退事件能够监听捕获,使其支持左滑后退关闭(安卓端)。注:不追加这个监听,用户打开图片视频上传事件,左滑会返回上一页。
14、plus_gallery现在支持video(APP端将通过plus打开视频相册窗口,允许用户选择选择一个视频),相册视图窗口支持查看并预览视频,可现实视频的大小的时长。注:该接口是通过plus调用系统接口,因此获取到的视频地址不支持通过网页浏览器直接播放。如果采用相册的blob方案,因为视频太大,会导致内存溢出。需要想其它方案来解决视频本地预览的问题。
0
心乐
lv.2
实名用户
2023年11月9日开发记录
1、异步进程脚本(start_GongLunTask.php)已解决redis断开问题,目前该脚本启动运行三天未出现进程内部因为redis通讯协议故障,而造成请求缓存对象操作异常的问题。这个问题困扰了好几个月,反复调试无数次。主要的解决办法是,宫论缓存对象【redis-object-cache.php】每次执行redis操作前,会检测是否处于异步进程中,如果处于则会对redis对象进行状态检查 避免因为长时间运行进程redis对象出现通讯故障。如果存在异常则中断抛弃之前的对象,重新进行链接操作。
2、朋友圈发布页面会读取用户moments_config配置,如果用户关闭了朋友圈评论(comment_close为true)。那么页面的评论控件将显示(评论已关闭),点击会提示【你的朋友圈已设置禁止所有评论,无法开启评论<br>如需开放评论,请前往朋友圈设置页面(取消禁止评论限制)】。只有用户开放了朋友圈评论功能,才能切换评论开关状态。
3、如果用户关闭了朋友圈(moments_close为true)那么xc_moments_post发布事件提交前会直接拦截,并提示用户【你的朋友圈已被关闭,无法分享发布内容。<br>如果需要发布请前往朋友圈设置页,重新启用!】,阻止用户提交。注:这是前段拦截,后端为了安全考虑,也会做出相应的拦截检测。只要朋友圈被关闭,那么用户是不允许发布新内容的。
4、当通过GET获取缓存内容时,会依次检测array_cache是否存在缓存、本地cache数组是否存在缓存、redis对象是否存在缓存,如果都没有结果才会返回miss。这里有一个语法错误冲突,没有通过empty检测对象变量或数组是否存在,而是直接进行结果查询。这样导致开的DEBUG模式,页面会出现大量查找未定义的变量异常报错。目前已优化处理。
5、宫论项目启用debug日志模式,开始通过系统原生方法来记录程序语法报错。如果出现语法异常或错误 将会日志记录到【wp-content/debug.log】中,未来几天将主要心力放在BUG修复 语法兼容处理上。此举是为了全面适配php8.X版本,为后面升级提前做适配准备。注:未来等保可能需要高版本PHP,因此需要提前做好处理。
6、debug问题修复:宫论自定义css和js库出现超全局变量失效的问题,该错误导致xc_css_js_cdn(CDN地址)和xc_css_js_version(版本号)获取异常,从而造成DEBUG输出异常。目前已重新定义xc_get_option函数,会先执行isset($GLOBALS['Sets'])检测,如果变量数组不存在则直接返回一个空数组。
7、修复访问后台被重定向upgrade.php页面的问题,页面出现异常报错(开启报错输出也不会显示详细错误,只显示:该站点出现严重错误)通过日志追踪,确定问题所在为配置引入路径错误导致。修复后该页面可以正常访问,显示为:(数据库升级)完成升级后,重新打开后台依旧重定向访问升级页面,但是页面显示已完成升级。(陷入死循环状态)。经过排查处理,最终确定问题所在。数据库升级后会涉及到option字段的更新,如果字段低于远程版本就会强制跳转upgrade页面。之所以陷入死循环重定向,问题源自于完成手动升级后,数据库版本为:56657,但是不知道什么原因,缓存版本为:55853。通过手动重新update_option完成版本同步得以解决问题。注:目前已禁用后台自动升级功能,并且为了兼容考虑 option字段db_version禁止缓存。该字段为数据库版本号。
8、debug问题修复:宫论js和css的引入调用方式错误,通过wp_enqueue_script加载资源时,脚本和样式没有挂载到wp_enqueue_scripts钩子函数中,直接进行加载队列不符合wp的标准。(虽然可用,但是可能会造成一些兼容问题),目前已修复,已定义xc_enqueue_scripts_js函数来挂载所有宫论项目涉及的样式和脚本文件。
9、debug问题修复:APP项目模块几处语法错误的问题。(1、myxinle_uniapp_head函数设计用户调用时,没有通过global来获取用户对象,直接使用current_user来获取ID不符合规范。2、涉及到cookie读取时,没有通过empty来检测是否为空,直接获取并使用造不符合规范。)
10、debug问题修复:sns-show.php首页apply_filters过滤器(home_post_list_advert_hook)存在调用异常问题,目前该过滤器未正常使用,故而移除处理。同时query_posts查询返回结果后,现在会通过wp_reset_query进行重置。避免本次的查询结果影响到后续的业务执行。注:当通过wpdb构建文章内容查询时,可以考虑在内部预留一个ad广告钩子,根据需要进行插入。
11、debug问题修复:首页菜单栏输出时,现在会通过isset依次检查【publish_header_html、jinsom_mobile_tab_publish_custom_type、jinsom_mobile_tab_publish_custom_type、jinsom_mobile_tab_publish_custom_type_html、jinsom_mobile_tab_publish_custom_type_require】数组变量是否存在,如果存在才会进行赋值调用。避免因为访问不存在的属性,造成出现Undefined错误。
12、debug问题修复:APP模块(xinle_weui_css_1=用户协议弹出窗口和xinle_app_ysxy_1隐私协议弹出窗口),使用未定义的变量$home 造成debug日志捕获异常.已进行修复处理,通过home_url函数来获取并输出当前域名的地址,将其替代:$home。注:在开启debug模式后,这个报错会导致后续执行的js全部异常。
13、debug问题修复:popup弹出窗口组件,在封装发布窗口时会检查publish_custom_type变量属性是否存在,如果不存在则将其赋空值。避免因为变量不存在造成debug错误。同时修复xc_websocket_close_hook(wss断开关闭事件),redis_get变量属性未执行isset检查 直接对数组进行if判断,因此产生Notice错误问题的语法瑕疵。
14、debug问题修复:处理websocket通讯消息库,如果$message['type']变量不存在会直接通过return false中断后续脚本执行,避免变量不存在的情况下仍旧执行后续判断。如果client_id_user查询有结果返回,会通过is_array依次检测old_wss和wss_user数组是否存在,如果有一个数组不存在都会直接返回false,不会触发异地登录弹窗警告。
15、debug问题修复:公共库接口现在会直接对post请求变量($_POST['type']和$_POST['order'])进行isste检查,只有传递的变量存在才会进行赋值。同时接口收到指纹事件时会对app_device进行is_array数组检查,只有其值为数组才会执行设备信息详细写入,并且最后会对$app_device['model']执行isset检查来输出对应的结果。
0
心乐
lv.2
实名用户
2023年11月8日开发记录
1、朋友圈权限设置事件:moments_permission_settings新增拦截,如果既不是本人操作又不是超级管理员 则拒绝执行,并提示用户无权操作。同时朋友圈设置页现在会检索用户moments_config字段参数,然后根据用户实置对switch选项进行【checked】标记处理。注:如果用户已之前关闭了朋友圈功能,那么打开选项卡默认是开启的,反过来亦是一样。
2、新增朋友圈关闭启用钩子:xc_moments_toggle_hook()需要传递被操作用户的author_id 变量,考虑到业务的复杂性 这里不主动传递【关闭或开启】状态。通过钩子内部查询用户moments_config字段来获取状态。该钩子有两个场景处罚(1、用户主动开启或关闭朋友圈、管理员封禁用户朋友圈)
3、朋友圈状态、评论状态 两个字段标识重新命名:moments调整为:moments_close、comment调整为comment_close。后面加个close标识,防止以后调用config配置时不知道字段的用意。同时前端页面操作提示语也做出修改(我的朋友圈已关闭/朋友圈对外开放)评论(关闭朋友圈评论/开启朋友圈评论)
4、新增option数组字段(moments_close),当用户主动关闭朋友圈或官方封禁了朋友圈 那么会将用户UID添加到这个数组中。当朋友圈恢复正常 则将用户从数组中移除。在获取朋友圈内容数据时(包括分页查询、话题索引、朋友圈搜索)构建的查询语法,会过滤这些用户发布的内容,避免内容被现实出来。
5、朋友圈发布拦截钩子:xc_moments_publish_check_hook,现在会读取发布者的朋友圈设置,如果用户朋友圈处于封禁状态【moments_close状态为true】那么将阻止用户发布。注:既然用户主动关闭了朋友圈,其内容都是不对外开放的,完全属于个人隐私圈子。那么就不应该允许用户在进行后续发布才合理。
6、朋友圈设置页面新增设置【不让他(她)看我的朋友圈】和【不看她(她)的朋友圈】两个菜单选项,前者相当于朋友圈屏蔽某些用户可见(隐私权限),后者则则是过滤某些用户的朋友圈(相当于屏蔽用户)。这个屏蔽是针对广场朋友圈动态,后面将允许用户一键屏蔽指定用户的朋友圈。注:这里和黑名单类似,但是屏蔽名单不直接采用黑名单 以免信息混乱。
7、朋友圈配置数组新增两个list字段:filter_list(不看某些用户的朋友圈列表)和block_list(指定的用户名单不允许查看我的朋友圈)。后面涉及朋友圈的内容调用时,会通过读取这两个配置字段来获取屏蔽或过滤名单。注:block_list目前属于保留字段,是否需要采用还需商榷。但是filter_list(屏蔽名单)是必须要有的,允许用户屏蔽某些乱发广告的朋友圈。
8、封装一个方法向朋友圈过滤名单中添加或移除用户ID:xc_moments_filter_list()有两个参数:$author_id表示要添加或移除的用户ID,$status表示操作状态,可以是 'add' 或 'remove',默认为 'add'。函数首先获取当前登录用户的ID,并检查是否登录。如果未登录,则直接返回 false。如果操作状态为 'add',则检查要添加的用户ID是否已经存在于过滤名单数组中,如果不存在,则将其添加到数组中。如果操作状态为 'remove',则检查要移除的用户ID是否存在于过滤名单数组中,如果存在,则将其从数组中移除
9、新增页面【xc_moments/filter_list.php】,展示用户朋友圈屏蔽名单列表。页面唯一标识:moments_filter,短代码地址为[xc_module type=xc_moments]/filter_list.php,该页面不做权限拦截,每个人访问看到的都是自己的屏蔽名单列表。因此不需要传递author变量。
10、朋友圈设置页面,如果是超级管理员查看指定用户设置(当前用户非正在查看的用户)则会显示一个tips标签样式容器,输入内容提示:【你正在查看 XXXX 用户的朋友圈设置】。有个页面提示可以避免管理员误操作行为,比如需要设置A用户的权限,但是不小心打开多个设置页面,实际当前配置的是B的朋友圈权限。
11、新增一个函数方法xc_moments_block_list(),向朋友圈屏蔽名单中添加或移除用户ID【指定用户不可看我的朋友圈】,有两个参数:$author_id表示要添加或移除的用户ID,$status表示操作状态,可以是 'add' 或 'remove',默认为 'add'。函数执行相应的操作。如果操作状态为 'add',则检查要添加的用户ID是否已经存在于屏蔽名单数组中,如果不存在,则将其添加到数组中。如果操作状态为 'remove',则检查要移除的用户ID是否存在于屏蔽名单数组中,如果存在,则将其从数组中移除。
1
心乐
lv.2
实名用户
2023年11月7日开发记录
1、新增社交互动消息通知函数:xc_add_tips,这个函数非常复杂,涉及用户聊天记录表更新、APP消息通知、邮件通知、站内信通知。具体而言为:当用户收到评论、点赞、艾特、回复。等互动消息时会触发这个函数,并写入到xc_notice数据表。然后根据后台设定触发与之对应的交互消息。需要传递的变量有【($my_id, $user_id, $post_id, $type, $content, $remark, $link = ''】使用场景非常多,触发即为频繁。
2、通知消息栏【@我的、回复、喜欢】的数据调用调整表改为:xc_notice,该表已全面接管社交互动消息的记录和展示。目前页面读取方式采用的是wpdb查询获取前50条未读记录,暂不支持分页加载 后面再回过头来进行分页加载处理。注:新版的消息跳转逻辑全部采用字段写入方式,不在通过解析type来获取链接。通过xc_add_tips写入消息时 需要将link封装好(支持短代码)
3、新增朋友圈空模版页面【xc_moments/detail.php】,短代码访问方式:[xc_module type=xc_moments]/detail.php,页面唯一标识:moments_detail 这个页面需要传递朋友圈文章(post_id)变量。用于展示朋友圈详情,一般是评论过多 首页不便全文显示,则提供一个link跳转到详情页。注:目前是空页面,只是为了方便调试通知跳转,提前设置页面参数。
4、xc_publish_ok_hook发布钩子触发时,如果类型为朋友圈(moments)则会触发aite检测事件。先通过get_post获取朋友圈文章对象,然后使用xc_aite_uid解析朋友圈内容,如果有返回aite用户名单数组,则遍历数组触发xc_add_tips通知事件,主要变量参数为:【type=aite、content=发布朋友圈@了你、link=短代码访问朋友圈页面】
5、社交消息默认配置新增消息标识(aite),消息说明:收到艾特@通知,【APP通知状态-默认开启、站内弹窗=默认开启】,APP弹窗消息站内消息正文格式为:xxxx:发布朋友圈@了你。注意:aite类型消息是通用的(发布文章、发布朋友圈、发布评论)等内容如果涉及到@艾特。都是采用这里的配置,一开则开,一关则关。需要注意的是,APP通知消息,用户是可选开启的,这里的配置只是默认设置。用户仍旧可以主动开启或关闭。
6、朋友圈发布成功后,如果朋友圈非隐私类型。将会通过get_user_meta获取朋友圈发布者所有粉丝,然后依次遍历执行【get_status_mark】事件。其标识为:moments,这样所有粉丝都会收到朋友圈更新通知(大致理解为:我的朋友圈有内容更新)。注:moments这个标识作用于朋友圈更新,也作用于,朋友圈评论被回复提醒等。
7、xc_moments_publish_hook朋友圈发布钩子新增处理事件,当朋友圈发布成功后(取得$post_id)将会检查上传数组中image_list变量是否存在,如果存在将执行xc_upload_media_ok函数,将所有上传图片进行朋友圈ID关联,并同步到的xc_upload上传数据表。不免因为超时未关联订单号,导致系统任务移除删除图片。
8、当朋友圈发布成功后,将主动触发一个预留钩子:xc_moments_publish_ok_hook,该函数需要传递唯一变量(朋友圈编号ID)。一些特定的回调事件,比如:插件行为接管、计数通知事件等可以通过这个钩子来执行处理。注:这个钩子只负责执行,不负责验证信息,也不进行结果回调。多次执行会重复触发
9、当用户成功发布朋友圈后会通过incr_redis_meta进行今日发布计数+1,计数键名:【day:moments_publish-发布者ID】,计数器会每日00:01自动完成重置清零,这个计数器算用户行为拦截器。朋友圈配置页面可以设定每日朋友圈发布上限(区分会员和非会员)。在发布拦截检测事件中,会检测这个值是否超过限制。如果超过限制则阻止用户发布朋友圈。
10、用户设置中心新增页面:【setting/setting_moments.php】页面唯一标识:setting_moments,短代码地址:[xc_link type=global]/setting/setting_moments.php 用户可以在这个页面对自己的朋友圈做出一些基础设置,比如朋友圈背景图、访问权限、评论权限、我的介绍等
11、优化工单加急状态查询的两个函数count_feedback_audit(统计处于加急工单数量)和xc_feedback_consult_urgent(Api分页请求查询),WP_Query构建查询语法时,会检索工单状态【status】是否不等于ok,如果已完成。则不显示数量或构成查询条件。注:之前有些工单状态回调存在异常,导致已完成的工单,因为未移除audit字段 也会显示在加急列表中。
12、朋友圈设置页新增变量GET传递参数:author_id,访问该页面必须要传递该变量。并且页面支持xc_order_access拦截访问钩子,唯一标识(setting_moments)。如果用户不是【author_id本人、超级管理员】那么将直接拦截对该页面的访问请求。注,考虑到用户隐私的问题,不允许前台管理员设置用户朋友圈。(超级管理员被允许,是为了重置清理朋友圈【违规介绍、违规背景图】。)
13、朋友圈设置页新增两个选项switch开关(关闭我的朋友圈=close_moments、不允许任何评论=close_comment)。关闭朋友圈后,用户所有发布的内容都不可见(用户自己可见,别人打开他(他)的朋友圈直接显示无权限访问)。不允许评论后,所有朋友圈内容任何人都不可以进行评论。这是用户对自己朋友圈的权限隐私设置,属于全局生效(超级管理员,可以接触这个限制)。
14、朋友圈现在会通过onPageBeforeInit进行change监听(close_moments和close_comment)出现状态变化时,会触发ajax请求。携带三个变量(1、input_name(处理类型)2、input_status(开启或关闭)。3、author_id被操作的用户)后端的请求事件为:moments_permission_settings,为了防止用户重复点击,ajax发起后会立即执行myApp.showIndicator动画,当后端有返回在释放动画。
15、新增用户字段:moments_config。通过这个字段记录用户朋友圈设置参数,该字段以数组形式写入。目前集成两个设置(comment=评论权限,布尔值(0或1)此字段为全局配置,如果为1,代表所有朋友圈内容的不允许被人评论)(moments=朋友圈状态。布尔值(0或1),如果为1,代表用户关闭了朋友圈,所有内容不对外开放。)这两个字段目前只能通过(朋友圈功能配置页面进行设置)。
1
心乐
lv.2
实名用户
2023年11月6日开发记录
1、redis-object-cache.php对象缓存脚本新增方法:checkRedisConnection,脚本涉及到redis的请求(get、add、update1、delete)操作时,都会提前执行这个静态内置方法。里面集成isConnected检测和ping检测,如果有一个出现异常都会发起重连处理。注:防止性能耗损的问题,该方法目前仅在$GLOBALS['Task_Worker']变量存在时才会执行。
2、xc_push_hook宫论统一消息推送钩子暂时移除asyn异步进程处理逻辑,目前工单反馈的消息推送如果是异步处理会出现滞后甚至丢弃的情况。尝试排查解决,但是这一块的业务逻辑较为复杂 暂无法处理。目前只能做做全局屏蔽处理,后续时间宽松了 在回过头来解决这个问题。已设置为异步推送的,不会进行移除处理,全部自动转同步。
3、修复工单发布页面(历史)红标无法自动消除的问题,正常情况下,用户如果有工单状态等待处理,那么在工单发布页面会有个红点提示 点击进入历史工单页面后,这个红标会自动消除。但实际情况进入工单历史页在返回发布页面该红点仍旧存在,并未主动移除,这对用户的观感有一点不友好,因此页面访问事件做了兼容修复处理。使其访问历史记录后能够正常移除该红点标识。
4、新增朋友圈发布钩子:xc_moments_publish_hook()需要传递发布数组信息(type、content、power、comment、shop、topic_list、image_list),该钩子不进行权限拦截检测,触发即发布。该发布事件执行前,必须先执行xc_moments_publish_check_hook钩子来进行安全检测处理,避免出现非法发布。
5、发布配置页面新增字段:是否开启敏感词检测(xc_publish_restricted_words),开启后如果内容存在违禁词(本地白名单),那么将返回false 对应的发布事件进行拦截处理。这里是全局发布配置开关,目前朋友圈内容发布已接入敏感词检测,性能速度考虑 敏感词检测是通过本地词库来做处理的。处理的函数为:xc_sensitive_words。注:后续所有内容发布(包括藏品、淘货)都必须采用同一套处理方案。
6、新增添加文章的钩子xc_post_add_hook,该函数接受发布者的用户ID和其他参数,包括文章类型、标题、内容和元字段数组。函数首先检查是否提供了文章类型,如果未提供则默认为 "post"。然后,使用提供的参数构建文章数组 $post_data,包括标题、内容、发布者ID和文章类型。接下来,使用 wp_insert_post() 函数插入文章,并将返回的文章ID存储在 $post_id 变量中。如果插入文章成功,则会检查是否提供了元字段数组,并使用 update_comment_meta() 函数更新文章的元字段。最后,函数返回插入的文章ID,如果插入失败,则返回 false。
7、工单发布钩子xc_feedback_publish_hook不在通过wp_insert_post来完成工单发布,而是通过宫论统一发布事件:xc_post_add_hook来完成数据入库。这样可以做到全局内容缓存管理,方便后续维护和操作对象缓存。注:工单的自定义字段没有直接通过发布钩子来完成,而是在发布成功后取得文章ID 手动写入的。
8、统一发布钩子进一步优化,移除$title(文章标题)和$content(文章内容)两个变量,改为publish数组变量,数组内可以选择性填充内容,比如(标题、正文、分类、发布时间、标签)等。这样灵活性更高,更能满足复杂使用场景。同时发布钩子重新命名,新的钩子为:xc_publish_add_hook。这个钩子计划支持所有发布文章类型,不单是朋友圈、工单、更包含非WordPress类型文章(淘货、保真阁)等。
9、朋友圈发布事件会执行xc_publish_add_hook文章发布(moments文章类型),并将以下字段写入到朋友圈自定义字段中。【1、ip:记录发布者的客户端IP地址。2、UA:记录发布者的设备来访信息。3、fingerprint:当前用户的设别指纹标识信息。4、power:朋友圈访问权限。5、comment:该条朋友圈是否被允许评论。6、type:朋友圈的内容类型(image、video、auido)等。7、shop:商品卡片短代码信息(可选)。8、image:朋友圈图片信息(可选)。9、video:朋友圈视频信息(可选)。】
10、朋友圈发布成功后,获得post_id后。会检测发布数组中是否存在topic_list字段,如果存在代表需要写入标签话题。将通过explode切割字段,然后使用foreach遍历执行insert_moments_topic函数,将话题与朋友圈内容进行关联。注:不通过原生方式wp_set_post_terms来插入,是因为朋友圈话题可能不存在,需要创建处理。原生方法虽然也能创建,但是朋友圈话题创建需要经过内部钩子处理,很多字段要初始化。需要通过特地函数来处理!
11、新增文章发布成功回调钩子:xc_publish_ok_hook()post_id发布成功的文章ID或订单号,type发布的类型,用于识别发布类型。当文章发布成功后,将会自动触发这个钩子。可通过这个回调钩子执行一些业务处理,比如刷新缓存,更新文章数据统计,进行内容审查操作等等。
12、新增计数器【publish_文章类型】挂载于:xc_publish_ok_hook钩子,只要通过内容发布成功,自动会进行计数+1处理(发布后删除、延迟或定时发布都会计数+1)注:可以通过get_redis_count($key)获取计数器统计详情,支持查询【总数、今日、昨日、本周、上周、本月、上月、今年、去年】多维度的计数器查询统计。注:该计数器已加入【宫论计数器重置列表】,每天00:01会自动完成重置。【工单反馈原有的计数自增事件,已移除】
13、xc_redis_count计数器函数优化处理,这个函数默认是通过异步进程处理的。如果调用的该函数本身就处于异步进程中,那么会重新发起异步请求,可能造成脚本异常和 性能浪费。故而在执行异步请求时,会判断$GLOBALS['Task_Worker']超全局变量是否可用,如果可用则跳过异步处理逻辑。这个处理判断很重要。后续所有涉及异步进程的函数都必须做这个判断。
14、封装一个@艾特用户转UID的方法函数:xc_aite_uid()$string 包含@用户昵称的字符串,返回包含唯一用户的UID的数组,如果没有结果则返回false。注:这是个同步函数并且使用场景比较多,涉及到数据检索的问题 需要特别注意性能。目前采用的wpdb查询机制,如果用户量上来了,该查询语法出现瓶颈,需要考虑缓存设计。
15、新增通知表:xc_notice 字段包含【my_id=收信用户、user_id=触发用户、post_id=文章或订单号、notice_type=通知类型、status=是否已读(1或者0)、notice_time=通知时间、notice_content=通知消息文本、link=跳转链接、remark=备注信息】该表主要负责(@、回复、喜欢)三个消息通知记录。
加载更多评论
单栏布局
侧栏位置:
左
你好
天呐
1、页面page-content容器新增一个子类:grey,其背景颜色为:background:#fbfbfb。如果需要改变页面背景色的时候,在page-content后面追加grey即可。注:默认背景色为白色,但是业务很多场景需要将主色调调整会浅灰色。每次通过style标签样式写入不太方便,主要管理维护麻烦。因此新增一个子类来处理。
2、朋友圈编辑页面新增radio选项,允许发布者或管理员对朋友圈访问权限进行调整。支持三个权限【1、public公开内容(图标样式:jinsom-wancheng)。2、fans粉丝可见(图标样式:jinsom-qunzu1)。3、privacy=仅自己可见(图标:jinsom-biyan)】
3、radio选项显示优化,进入朋友圈编辑页面后会理解通过get_post_meta获取朋友圈的访问权限,然后通过switch进行遍历处理。根据朋友圈内容当前的权限,来设置【checked="checked"】,这样访问编辑页面时,会默认直接选中当前朋友圈的文章权限。这样的显示设置更友好一些,告知用户文章当前的状态。
4、朋友圈权限图标样式做出调整,会设置margin-right 来调整元素的右边距(2vw),避免图标和文字紧促在一起,图标大小从6vw大小调整到4.3vw和文字更搭一些。并且每个权限图标颜色都不一样,公开为:灰色#999、粉丝可见为:浅蓝色#6191e7、私密内容为:浅红色ff8467。最后就是radio的选项容器样式的调整1、首先weui-cells移除元素的上边间距,在移除顶部的边框样式。避免顶栏同时出现两个虚线。2、weui-cells的底部边框虚线会做过滤处理,通过last-child来选中最后一个元素,将其虚线边框改为透明处理。同样是为了避免同时底部出现两个虚线。
5、朋友圈编辑页面新增radio选项,允许发布者或管理员对朋友圈内容(当前文章,非全局)评论进行权限开关调整。开启(允许所有用户对当前朋友圈进行评论)关闭(除了自己可以评论,所有用户都不可以进行评论)。与之前访问权限一样,会通过get_post_meta获取评论状态,然后打开页面即默认选中开启或关闭。
6、radio选项命名调整:朋友圈访问权限的radio为【moments_power】/评论开关权限的radio为【moments_comment】避免因为radio的name参数同名造成两个radio选项被合并成一组。同时所有选项框input表单都新增value属性,属性值为【权限key,比如公开权限为:public,评论关闭为:close】方便前端获取到用户选择参数。
7、评论radio选项框上方新增一个tips提醒框(⚠ 评论关闭后,任何人都不可以对当其评论),同时访问权限radio的box容器右上角新增一个图标(fa-trash:垃圾桶样式、背景颜色为黑色,字体大小为14px)这个图标是预留按钮,当管理员或发布者需要移除朋友圈,可以通过点击这个图标来完成。注:删除事件目前未写,后面会补上。
8、朋友圈编辑页面新增onPageBeforeInit监听,当朋友圈设置为私密(仅自己可见),那么不允许用户关闭评论(提示:私密状态,不需要关闭评论)。具体执行流程如下:首先获取选中的moments_comment和moments_power的ID值。然后使用条件语句来检查是否满足私密状态下不需要关闭评论的条件。如果满足条件,使用 $('input[name="moments_comment"][value="open"]').prop('checked', true) 来将值为"open"的选项设为选中状态。然后通过xc_msg显示错误。
9、朋友圈编辑页面【删除图标fa-trash】控件新增onclick事件(xc_delete_moments),并新增自定义属性post_id朋友圈编号ID。函数会通过this上下文对象获取朋友圈编号,然后构成ajax请求【type=xc_delete_moments、请求变量:post_id】到后端发起删除请求,Ajax请求会通过myApp.showIndicator进行动画拦截,避免出现重复执行。
10、朋友圈删除控件新增自定义属性【action】,这个参数有两个值【1、发布者本人执行参数为:delete(删除)。2、非发布者并且是管理员执行参数为:reject(驳回)】。用户打开朋友圈编辑页面会通过get_post_field获取发布者UID,然后判断是否为作者,然后执行响应的参数赋值。当触发xc_delete_moments事件时,会根据传递变量的不同,执行不同的确认弹窗。【确定要删除当前朋友圈内容吗?、确定要驳回隐藏当前朋友圈内容吗?】
11、朋友圈文章编辑页执行xc_order_access拦截请求时,会通过get_post_status获取文章内容状态,如果status状态不等于(publish公开内容)则表明当前朋友圈内容非正常状态,可能处于回收站(等待删除)。那么将禁止发布者访问 并提示【朋友圈内容已被删除,无法操作!】。注:管理员不受此限制。
12、新增朋友圈内容删除钩子:xc_moments_delete_hook,需要传递朋友圈编号。该钩子集检测(拦截非法请求操作)、删除(负责删除事件处理,包括静态资源处理)、回调(负责朋友圈内容删除后的回调业务处理)。钩子采用标准的result数组结构返回,code为状态码:1代表执行失败,msg代表失败原因。code=0代表执行请求成功,朋友圈内容已被成功移除。
13、朋友圈后台配置页新增字段:xc_moments_delete_limit(朋友圈文章删除限制),发布超过X天后,发布者将无法自行将其删除[管理员不受此限制],如果设置为0,则代表不做限制(不管多久都可以删除)。此字段通过xc_moments_delete_hook钩子来执行,用户删除文章时,会通过检测这个字段来判断是否过了删除有效期。注:一般情况下不建议开启删除保护,具体根据实际情况而定。
14、朋友圈文章删除,拦截事件封装完毕。【1、检测用户是否登录、未登录将拦截处理。2、检测用户是否为管理员或发布者,如果均不是拦截处理。3、检测文章是否存在,不存在则拦截处理。4、检测文章是否属于自定义类型:moments如果不是拦截处理。4、通过get_post_status获取文章的状态,如果是trash则表明文章处于回收站,拦截处理。5、如果删除用户不是管理员,并且后台设置了删除时间限制。那么将会通过get_post_field获取发布日期然后转时间戳,在对比日期是否超过了后台限制,如果超过则拦截处理。
1、后台朋友圈配置新增开关(xc_moments_video_autoplay)开启后,朋友圈视频会仿微信朋友圈,页面下拉到朋友圈视频会自动播放(静音状态)。装载方式通过Intersection Observer API触发,如果不开启则不会执行页面滚动监听。开放开关选项,是防止低配设备存在性能问题,毕竟页面可能同时存在多个视频初始化。目前未做设备兼容处理,如果到时候出现性能问题,可以通过后台先关闭。
2、宫论前端xc对象新增属性:(moments_video_autoplay)布尔值,后台配置朋友圈视频自动播放选项决定这个属性值。moments_Intersection_Observer函数在触发朋友圈内容变化监听时,会检测xc.moments_video_autoplay是否存在,如果存在才会触发window[视频对象].play()播放事件。
3、朋友圈视频自动播放功能额外新增一个拦截条件,后台新增字段【xc_moments_video_autoplay_size】当开启了视频自动播放后,还可以设置视频尺寸要求。当视频小于XXMB才会被执行自动播放,避免大视频自动播放,消耗过多流量视频。同时封装视频组件容器。会将获取到的视频大小写入到size自定义属性,视频自动播放前会检测size是否大于后台限制,如果不大于则执行自动播放。
4、朋友圈视频播放请求函数优化,现在会Intersection根据变量(布尔值)做彻底分离处理。除了播放器属性有不同外,Intersection为布尔值,才会执行以下事件监听【1、视频播放器click点击事件监听。2、进入全屏事件和退出全屏事件。】用户正常播放视频,这些监听不会执行,避免视频组件出现意外情况。
5、朋友圈视频组件封装完毕,容器采用函数封装 通过传递朋友圈ID即可完成视频的封装(包括各种视频信息采集和输出)。视频支持两种播放加载模式。【1、用户主动播放,通过点击播放按钮图片来加载和初始化播放器。2、页面下拉到视频容器区域自动进行播放和暂停,做了很多事件监听和回调,效果和微信朋友圈大致相同】
6、朋友圈内容新增商品卡片容器,class类:moments_shop,如果用户发布朋友圈的时候选择了商品卡片那么就会存在【shop】字段,此时会在朋友圈内容下发通过do_shortcode转义和解析商品短代码,然后将HTML信息输出到moments_shop容器内部中。注:商品短代码都是通过xc_shortcodes_shop_card函数来解析和处理,如果需要对卡片做样式或内容调整,则修改这个函数即可。
7、新增一个函数方法xc_at_html($content):来对文章内容中的艾特昵称进行处理,并替换为自定义标签。接受一个参数 $content,该参数是文章的内容。函数的目的是在内容中找到以 @ 开头的昵称,并替换为自定义的标签。返回带有自定义属性的标签<xc-post-at>,用于显示艾特用户信息。这个方法绑定于xc_shortcodes_content函数,通过这个函数进行内容处理,会先处理@标签内容,增加对应的标签样式。
8、xc_at_html处理aite用户信息时会通过xc_nickname_uid查询用户是否存在,如果存在有效用户(user_id有返回)则会通过xc_get_avatar获取该用户的主页link链接。然后使用xc_mobile_url构建一个onclick点击事件,事件的link为了防止被转义处理,会先通过addslashes进行斜杠处理。同时xc-post-at增加一个自定义属性user_id,预留给后续业务操作。
,,10、朋友圈内容插入的商品卡片样式优化:【容器上下间距:margin-top: 4vw;margin-bottom: 1vw;边框样式:border-radius: 1vw; border: 1px solid #e5e4e4;】以便适配页面(注:只有朋友圈页面的商品卡片才会神修改哦),朋友圈视频器容器也做进一步调整【max-width: 49vw;max-height: 40vh;】,视频宽度调整到50%左右,观感更好一些。
11、朋友圈内容输出时会检测power字段(朋友圈内容权限),如果非公开(不等于public)并且发布者是当前用户,则会在该条朋友圈的右上角(名字那一行)输出一个<span class="power">样式。内容为:(私密/粉丝可见)图标:fa-low-vision。样式【文字图标靠右对齐、字体大小3vw、浅灰色】。警示作者,当前所看到的朋友圈内容是非公开。
12、新增朋友圈内容管理页面【/module/xc_moments/edit.php】页面唯一标识:moments_edit。短代码地址为[xc_module type=xc_moments]/edit.php,该页面需要传递post_id朋友圈文章编号。在这个页面用户可以对朋友圈内容进行权限操作(评论权限开关、朋友内容访问权限、删除操作)等,注:朋友圈暂不支持编辑,防止二次编辑的内容出现争议。
13、朋友圈内容管理页面支持xc_order_access拦截访问钩子,唯一标识(moments_edit)。需要传递【朋友圈编号post_id】如果用户不是【author_id发布者本人、前台管理员】那么将直接拦截对该页面的访问请求。注:管理员和发布者都可以对朋友圈内容做(删除、访问权限设置),管理员还计划开放(限流操作)权限。
14、文章权限状态除了作者可以看到,前台管理员现在也能够看到(方便对内容进行审查处理),同时新增一个moments_delete标签(垃圾桶删除图标-fa-trash、背景颜色为:#19191a、间距为3vw)在发布时间后面,只有发布者和管理员才能看到。类似朋友圈删除按钮控件。
15、朋友圈删除控件(moments_delete)新增onclick点击事件:xc_moments_edit,需要传递post_id(朋友圈编号)。函数内部会通过xc.moments_url获取到朋友圈路径地址,然后通过传递的朋友圈编号对其进行link封装。最后通过xc_mobile_url完成页面跳转。link指向地址为:朋友圈编辑页面。
1、moments_video视频容器高度限制最大为60VH(通过max-height标签进行限制),主要是为了避免长视频占据过多页面。time视频时间(分秒)标签间距和样式做出下面调整(top: 3.5vw;right: 3.5vw;padding: 0 1vw;border-radius: 1vw;)对应的字体size从4vw调整到3vw。
2、封装一个方法格式化视频时间xc_video_time($seconds),将秒数转换为格式为 "00:10" 或 "01:10" 的时间表示形式。这个函数接受一个参数 $seconds,表示视频的秒数。它会将秒数转换为分钟和剩余的秒数,并使用 sprintf() 函数将它们格式化为两位数的分钟和秒钟。最后,返回格式化后的时间。
3、宫论视频信息获取函数get_video_info:接受一个参数 $video_url,表示视频的URL。它返回一个包含视频信息的关联数组。函数首先将视频URL存储到结果数组中,然后调用 xc_video_img() 函数获取视频封面图,并将其存储到结果数组中。接下来,函数检查上传信息是否存在,如果存在,则从信息中提取视频时长,并使用 xc_video_time() 函数将其格式化为 "00:10" 或 "01:10" 的时间表示形式。函数还从上传信息中提取帧率、COS URL、高度、宽度和文件大小等信息,并将其存储到结果数组中。最后,函数返回包含视频信息的关联数组。这个信息获取依赖cos媒体信息采集,如果不适用cos对象存储,需要重新适配处理。
4、cos请求视频媒体信息函数优化,如果之前已成功采集,那么将返回exif数组信息。get_video_info函数如果通过xc_is_upload读取到上传记录,但是没有exif记录。那么会通过xc_video_info请求生成,并同步返回媒体信息。不更换是数据表获取,还是实时采集获取,只有$exif['Duration']))字段不为空的情况下,才会返回详细媒体信息(获取失败仅返回图片和视频地址)。
5、朋友圈视频输出封装成函数:moments_video_html,函数接受一个参数 $post_id,表示朋友圈的ID。它从朋友圈文章的元数据中获取视频的URL,并调用 get_video_info() 函数获取视频的信息。然后,函数使用获取到的视频时长、播放按钮图标和封面图等信息,生成一个包含视频HTML代码的字符串。最后,函数返回生成的 HTML 代码。封装成函数的好处,后面涉及到视频解析,可以直接通过函数修改。
6、朋友圈视频播放组件会通过自定义属性将【width=视频宽度、height=视频高度、video_url=视频地址、image=视频封面】写入到容器中,方便后续西瓜播放器组件提取信息,自动初始化播放器。同时播放器按钮新增图标已新增onclick事件,用于用户手动点击播放视频。
7、moments_play_video事件封装完毕,需要传递朋友圈编号和this上下文对象。事件触发后会将视频容器传递给moments_video变量,视频地址、封面图等参数都通过attr请求moments_video获取。考虑到朋友圈页面可能存在多个视频播放,为了更好的管理和维护播放组件,朋友圈视频在初始化西瓜视频播放器时,会将播放器对象赋值到【全局变量:window['moments_video_' + post_id]】,外部可以直接通过 moments_video_朋友圈编号(对播放器进行操作,比如暂停、播放、摧毁、音量、全屏)等交互操作。
8、朋友圈视频组件样式优化,封面背景图img标签移除,改为容器内部background-image:加载图片。避免初始化播放器因为样式不统一造成页面有明显落差。同时播放器西瓜视频播放器组件样式边框全部适配容器,包括不限于:播放状态、暂停状态、重新播放状态。同时朋友圈页面播放器【暂停图标】隐藏处理(播放控件仍旧显示)
9、播放器组件新增自定义属性:post_id,用于监听视频位置。当通过moments_play_video进行视频初始化时,会监听当前视频播放器play(播放)和pause(暂停)事件,如果视频播放。会将页面中正在播放的视频暂停处理 避免页面同时播放多个视频。当视频被暂停或播放完毕,会将视频的播放状态标识移除处理。避免其它播放器判定当前视频处于播放,而主动发起暂停。
10、朋友圈页面新增Intersection Observer API,监听位置:moments_post、threshold值设置为1,朋友圈内容进入设备视图窗口后才会触发执行,可以通过entry.target获取该条朋友圈相关数据信息(比如朋友圈ID、作者、类型等)。为确保页面产生交互后,这个监听始终有效,特定将其封装成一个函数【moments_Intersection_Observer】,页面产生内容变化,只需要执行这个函数即可完成moments_post元素装载。
11、moments_play_video朋友圈视频播放事件增加一个变量:Intersection默认为false,如果为true则表明视频播放器是通过Intersection_Observer触发的。此时会加载全新的播放器组件配置(volume=禁音处理、controls=关闭控制条、loop=开启循环模式、closeVideoClick=将click事件视频切换播放/暂停状态事件关闭处理,点击播放器不会自动暂停或者播放、closeVideoPreventDefault=关闭播放器video元素的阻止默认动作行为)。
12、通过Intersection加载的视频组件增加一个click点击监听,当用户点击视频时触发(原来的暂停播放原生事件已移除处理)。监听首先会检测播放器对象是否处于全屏状态,然后执行不同的业务逻辑。【未处于全屏:将通过getFullscreen进入全屏,将播放器音量打开,通过jquery将当前对象xgplayer-controls样式调整为:flex,以便在全屏模式下显示控制条组件。】【处于全屏,则通过exitFullscreen退出全屏状态,将音量静音处理、将视频控制组件隐藏操作】。注:这里涉及的对象都是播放器,处理的业务逻辑相对比较复杂。
13、朋友圈视频播放事件会在视频加载前将默认背景图(background-image)移除处理,避免视频生成的一瞬间因为播放器和封面图有尺寸偏差,造成轻微卡顿现象。同时moments_Intersection_Observer滚动到视频朋友圈内容时,现在会通过对象检测currentSrc是否存在,如果存在则代表播放器已加载过,此时执行的不是播放moments_play_video函数,而执行play()请求播放器继续播放视频。避免每次加载都会重新播放。
14、修复页面返回监听的一个错误,当页面通过滚动下拉初始了视频播放器后。返回上一页在打开朋友圈会出现一个致命性的错误(原有的同名播放器因未被摧毁,造成页面自动播放的是之前的对象)。解决方案,在播放视频时会在对象容器内部新增一个自定义属性:player值为TRUE,通过Intersection Observer进行页面滚动加载时,除了会判断播放对象存在还会判断player属性是否存在。只有两者条件符合的情况才会执行播放。
15、朋友圈视频新增两个监听【exitFullscreen=退出全屏模式、requestFullscreen=进入全屏模式】,前面通过click点击事件监听进入全屏模式有一个瑕疵,当后退左滑事件返回时,无法被监听到。这导致退出全屏的一些事件无法被执行(比如隐藏播放控件、设置静音等),因此新增原生进出全屏模式来执行控件操作更安全可靠一些。避免手势或物理键返回导致的执行失败。
1、我的朋友圈页面新增link跳转,如果用户登录状态。那么点击朋友圈大头像可以跳转到朋友圈设置页面。onclick绑定元素:moments_avatar,link链接通过do_shortcode短代码解析生成。用户可以在设置页面对自己朋友圈做出一些基本设置,比如权限设置、屏蔽名单等
2、moments_avatar头像样式优化:width宽度和height高度从68px调整为16vw,border-radius边框设置为2vw,边框样式调整为高度1px颜色:fbfbfb。position布局变更为:absolute,top:62vw,right:3vw。与之对应名字元素(moments_name) 也做出以下调整:top:64.5vw;width: calc(100% - 18vw - 15px);
3、avatar_info边框设置为2像素,背景色固定为白色。同时通过unset移除原生头像border边框效果,调整过后的头像边框和背景上部分有边框,下半部分因为背景色和主色保持一致不会有边框显示。朋友圈名字的间距也靠下偏左处理,调整样式(宽度-82px、top262 Px)个人说明的位置高度间距也从7vw调整为10vw。
4、朋友圈设置页面新增desc配置,用户可以直接在朋友圈设置页面填写自己的个人介绍说明,注:这里的设置和资料设置页是一致的,只是朋友圈提供一个便捷入口 方便用户修改保存自己的个人简介。同时朋友圈设置页为了介绍自定义读取索引,会通过get_userdata获取用户所有字段,然后赋值到user_info。直接通过user_info->字段名称 来输出对应内容。避免页面自定义字段每次都通过get_user_meta来手动查询。
5、info_desc进一步优化处理,显示更多描述的时候会在原有样式基础下做出以下调整【1、 width: 'calc(100% - 5vw)'、left: '3vw'】。这样单行显示的内容更多,基本不会造成换行。同时个人备注新增通用class类:(desc_用户ID)当涉及指定用户的个人描述调整时,可以通过唯一用户标识完成定位锁定。
6、新增js文件hook.js。文件地址【/assets/hook.js】名称标识:xc_hook通过wp_enqueue_script挂载到宫论页面中。这个函数支持延后加载,未加载成功也不会影响页面基本访问。注:这个js负责回调业务处理,比如用户发帖成功了,会预留一个js钩子动作负责后续业务开发,避免每次业务调整,都需要手动去修改原生js函数。
7、开发文档(js内置事件)页面,新增钩子事件专栏。所有创建的js回调事件钩子,都会在这个区域进行记录。文档备注格式【钩子说明、函数示例、使用场景和说明】,以便后续业务维护方便。同时钩子回调js事件命名统一风格为:xc_hook_场景。回调钩子需要特别注意的是,主业务不通过钩子来执行,钩子触发失败,只是页面交互有影响,不影响程序业务的正常执行。
8、新增回调钩子:xc_hook_save_desc(author, content)。author=是更新用户说明成功的用户UID(因为可能是管理员操作,所以需要通过传递用户UID)。content是文本内容,也就是对方新保存的个人说明。(内容后端已效验,既然执行函数就说明这段文本没有问题)钩子执行事件追加:1、通过jquey对(desc_用户UID)的元素进行文本替换操作。页面已显示该用户的个人说明,都会通过回调钩子进行文本更新。
9、新增回调钩子:xc_hook_update_avatar(author,avatar)。关联触发函数为:xc_clip_avatar,当用户上传了裁剪了新的头像,并且后端处理成功。将会触发这个回调事件,author是换头像用户UID、avatar是新的头像图片地址。回调钩子新增第一个事件:当用户头像更新成功,会通过avatar_用户UID元素更新图片地址。这样用户头像完成上传后,已加载的头像会同步更新。
10、xc_get_avatar用户头像信息缓存字段优化:现在会通过get_userdata直接获取用户所有配置信息,避免多个字段重复利用get_user_meta进行单独查询。同时缓存输出数组新增两个额外字段:1、user_desc用户个人说明,如果用户没有填写输出后台默认配置信息。2、verify_desc用户认证简介,如果未认证这个字段默认为空。原有的desc保持不变,优先认证在个人说明。
11、朋友圈页面,info_desc容器【用户个人说明简介】进一步调整,不在优先输出用户认证描述信息。统一改为显示:个人说明,这个用户可以随时自定义修改,认证描述则无法修改(重新认证或管理员才能修改)。朋友圈页面应当允许用户自定义显示一些简介内容(广告、引流坚决杜绝)。
12、xc_get_avatar缓存函数修复一个错误,redis_key写在【uncache==false】内部,导致外部非缓存因为无法获取到KEY,而缓存写入失败。目前已修正 将redis_key放到函数初始头部,同时返回输出缓存的时候额外新增了一个键值redis_data['cache'] ,如果该值存在代表结果为缓存。获取不存在则并非【user_avatar】缓存。
13、朋友圈内容新增视频容器(类名如下:moments_video=朋友圈视频标识、video_朋友圈编号=用于锁定视频,用一个页面会有多个视频存在。需要处理视频播放暂停、释放移除等操作),自定义属性:video_url=视频地址、post_id=朋友圈编号、author=视频发布者UID。注:未加载西瓜视频play的时候,显示视频封面。
14、朋友圈视频待播封面样式组件封装完毕,容器最大宽度69vw(100%视觉体验不好)、top间距2vw、布局方式:position: relative。封面图中心位置为播放按钮控件(会绑定一个play播放事件),右上角通过position: absolute布局(time元素),展示视频的长度时间。样式为:浅黑背景+白字。显示格式:22:12(时分)
1、APP端样式调整:navbar-inner(顶部导航菜单)和subnavbar(顶部菜单切换)新增样式【border-bottom: 0.5px solid #adadad36;】底部新增一个虚线样式的边框,颜色浅灰色透明 像素0.5px。注:因为APP端导航是白色背景,很多页面背景底色是#fff,造成APP导航栏和背景连城一片,有个视觉观感问题。增加一个底部边框相对体验更友好一些。
2、朋友圈页面下拉刷新指示器增加一个子类(moments_pull),onPageBeforeInit监听页面下拉时,如果处于朋友圈页面 会单独检测moments_pull节点是否存在,如果存在才会执行hide()隐藏事件。避免全局隐藏(pull-to-refresh-layer)造成(首页、消息、我的)等几个页面因为指示器消息被收缩,造成视图窗口坍塌问题。
3、沉浸式菜单配色优化调整:新增APP和网页端全局变量navbar-text-color(APP和网页分别设置)当页面属于封面背景图沉浸式 会自动将文字图标颜色标记为白色(透明)。当页面下拉卸载(沉浸式)会通过navbar-text-color重新赋值文字颜色(APP默认为纯白菜单,黑色文字图标)注:经过调整,朋友圈页面打开默认为透明顶部菜单,图标为白色。当页面下拉超过280px,则会恢复白色顶部菜单,图标变为黑色。页面低于280px则恢复透明和白色。兼容其它页面
4、朋友圈后台新增一个按钮选项(发布地址公开),如果开启。那么会通过高德API解析用户的发布地址,然后转换为(XXX省.XX市)并显示在用户朋友圈内容下发。注:不会显示详细地址,仅显示省市。这个设置为全局设置,用户不可控制。如果后台关闭,则直接不显示。这个地址涉及到用户隐私,可根据情况决定是否公开。
5、xc_ip数据表新增字段:fingerprint(VARCHAR(64))记录来访者的设备指纹信息,方便运维跟踪定位用户信息。通过xc_ip_position函数来更新和创建用户IP记录,如果客户端存在指纹信息($_COOKIE['fingerprint']))并且解析的IP和客户端IP保持一致的情况,会写入指纹字段。
6、IP查询函数xc_ip_position重构优化:为了丰富IP库,现在该函数会记录游客IP记录。默认user_id参数为空NULL,当请求IP和客户端IP保持一致且用户客户端处于登录状态,才会将user_id写入其中。注:每次查询都会检索IP,如果存在记录,且用户处于登录状态【查询IP和客户端IP】一致的情况,会更新和同步缓存信息。包括(UA、时间、和用户)三个字段。
7、xc_ip_position处理sql语法调整,不在通过原生wpdb来执行insert插入或更更新update。使用宫论通用sql处理函数:xc_insert_sql和xc_insert_sql,这样可以做到数据表缓存全局统一管理,同时数据表每一个操作记录都可以被相关钩子监听和处理。旧的写法都需要过渡新版sql处理方法。无论是否需要用到内置缓存,都需要做到统一性。
8、封装一个方法来处理朋友圈位置信息moments_ip_city。接受一个名为 $ip 的参数,函数首先检查是否启用了朋友圈【城市隐私选项】,并确保IP地址非空。然后,将会调用 xc_ip_position 函数获取IP地址对应的城市信息,并将结果解码为关联数组。接下来,函数检查城市信息是否存在,并且城市字段不为空。如果满足条件,它会根据城市与省份是否相同,返回相应的格式化字符串。如果未启用城市隐私选项或者IP地址为空,函数返回 false。
9、朋友圈位置输出函数重构,不在传递IP参数,改为传递朋友圈文章编号。并且优先查询朋友圈文章自定义字段【city】是否存在,如果存在则直接输出。不存在则通过get_post_meta来获取发布IP,然后通过调用 xc_ip_position 函数获取IP地址对应的城市信息,并将结果解码为关联数组(处理逻辑和之前没变化),唯一的区别是。获取到成城市地址信息后,会将内容写入到朋友圈【city】字段。并且查询会优先检测这个字段。减少二次执行查询函数请求。
10、高德IPv4定位解析接口新增错误日志记录,当接口出现异常(IP解析失败不算)。会触发xc_log_error_warn日志写入报警。日志KEY标识【ipv4】,错误格式【[IP - ' . $ip . '] [错误 - ' . $ip_data['info'] . '] [时间 - ' . date('Y-m-d H:i:s') . ']】。注:高德API接口目前仅支持国内IP,因此无法解析海外iP.这个日志报错并不会监听IP地理信息,只有接口出现异常,或者账户权限、额度出现问题的错误返回才会触发日志报警。
11、日志报警配置新增(【ip定位】高德接口异常)配置组,参数:日志唯一标识IPv4/触发报警条件(当天连续累计出现20次错误,则触发报警通知)/报警次数上限(2次,每日最多触发两次警告通知)/短信报警(开启状态)。触发函数:xc_ip_position,当IP解析失败,并且返回异常报错。会执行错误日志,并记录错误次数。错误累计到设定次数要求,将触发管理员报警。
12、新增计数器:api:ipv4,记录统计高德ipv4接口调用次数。通过xc_ip_position函数触发,高德成功返回定位信息会通过xc_redis_count完成计数+1(失败不会计数)。注:可以通过get_redis_count($key)获取计数器统计详情,支持查询【总数、今日、昨日、本周、上周、本月、上月、今年、去年】多维度的计数器查询统计。注:该计数器已加入【宫论计数器重置列表】,每天00:01会自动完成重置。【注2:为了方便管理和维护,涉及API外部接口调用的计数器,后续命名方式都要加(api:)。】
13、朋友圈内容css样式调整优化:头像宽高比不在通过px像素固定,改为vw页面百分比来处理。同时认证图标(.moments_post .avatars .custom-verify)做偏移适配处理(position: absolute; bottom: -1vw; right: -0.4vw;),同时定位图标和城市信息(.moments_post .city)字体样式调整到3.3vw。
1、全新的异步执行请求已封装完毕,所有宫论函数都支持异步请求,并且请求支持等待结果返回(默认不返回单向通讯,如果需要等待异步结果只需要将result标记为true即可)。需要注意的是,请求虽然可以执行所有函数事件,但是涉及当前用户处理的业务逻辑,是无法进行的。此类函数禁止通过异步来处理。【每个进程都是内部处理,并不能获取客户端设备信息。无法识别当前登录用户是谁】
2、异步执行函数xc_asyn_execution,现在会通过$GLOBALS['Task_Worker']来判断当前环境是否处于tcp协议进程中。如果处于则拒绝本次请求。避免异步进程触发异步请求,造成死循环。导致服务器出现异常情况。注:如果不做拦截,异步收到请求,会无限下发请求给其它子进程,最终导致进程全部被占用。
3、日志报警中心新增gropu配置组【xc_log_config】日志报警配置:字段包含(name=日志说明,日志的使用场景和用途。key=日志唯一标识,设置后不要变更,具有唯一性。包括日志文件也是通过这个字段记录XXX.log。warn=报警配置开关,关闭后只记录日志不报警。warn_conditions=触发报警条件,连续错误XXX次,则触发报警通知管理员。warn_number=报警次数上限,每天只报警X次,超过次数跳过。phone=是否开启短信通知,考虑到运营成本,特别重要的日志报警才建议开启短信通知)。后续所有报警配置,都通过这个字段来添加或移除。不建议每个日志都以单独字段来写入,维护太难了。之前的配置保留原样,暂不做迁移适配。
4、封装一个方法用于获取后台日志报警配置:xc_get_log_config($key),$key 要查找的配置键(KEY是唯一属性名,不可重复)。函数会遍历整个日志配置数组以查找指定键的配置。返回与指定键匹配的日志报警配置数组,如果找不到则返回 false。
5、新增两个日志报警缓存数值字段:day:log_warn:$key(今日该日志类型报警累计触发次数,每日凌晨重置。触发报警也会重置)day:log_push:$key(已触发报警(通知管理员)的次数)。旧版是每个字段都手动写,维护和清理非常方便。新版的两个缓存日志报警计数器,做到业务统一性。支持一键查询和清理指定日志计数。
6、宫论通用【记录和处理日志报警】:xc_log_error_warn($key, $log) $key 日志配置键,$log 要记录的日志内容内容通过调用 xc_get_log_config($key) 函数获取指定键的日志配置信息。如果未找到对应的日志配置($config 为空),则无法触发报警,函数返回 false。获取累计报警次数和管理通知次数。调用 xc_fwrite($log_filePath, $log) 函数将错误日志写入文件。 获取报警触发条件和每日管理提醒次数。 如果累计报警次数未达到触发条件且管理员通知次数未超限,执行以下操作:管理员报警次数加1,累计报警次数清零。触发报警通知(会区分是否需要启用短信报警)。
7、日志处理报警函数进一步优化,如果检索不到配置文件,仍旧会将错误日志写入到log文件,并通过redis进行错误计数处理。只是不触发管理员报警事件。同时获取【累计报警次数和管理通知次数】方法放到函数初始位置,这样可以确保其它日志也能正确完成计数累计。经过优化后,宫论日志报警适用于全局报错记录,需要报警只需要在后台添加新配置即可。
8、xc_asyn_execution和xc_task_worke两个涉及TCP内部请求的函数,会在请求失败和写入失败时进行日志写入。错误日志如下:【[时间: ] - [错误:' . $errmsg . '] - [用户:' . $user_id . '] - [请求事件:' . $data['type'] . '] - [备注:连接失败]】。方便运营计数人员及时监听和排查问题。
9、xc_asyn_execution异步函数请求失败,或者数据发送失败。会立即执行函数,并返回结果。跳过异步执行的业务逻辑。注:日志还是会记录,只是为了避免业务出现问题,函数会继续执行。相对应的用户可能等待时间更长一点,但是相关事件还是能够准确执行完毕。 避免因为TCP内部出错,导致所有业务出现中断。
10、xc_moments_consult_clear_cache朋友圈分页缓存清理函数成功接入xc_asyn_execution异步处理请求,当asyn=true并且当前环境不是内部进程时,将执行异步业务逻辑处理。需要特别注意的2点【1、执行异步函数事件时,条件允许的情况一定要验证Task_Worker超全局变量,避免死循环问题。2、函数需值执行请求后需要执行return,关闭后续代码执行。避免二次执行(异步和同步)。
11、IS函数库新增一个检测判断(xc_is_asyn),检测当前客户端环境是否处于异步进程(宫论内部脚本)。如果是的话则返回true,否则返回false。函数的检测原理是通过$GLOBALS['Task_Worker'])超全局变量完成的,正常情况下该变量为false,内部进程读取脚本会将标记为true。封装成一个判断函数是为了后期维护方便,因为这个判断方式后面可能会有变更。
12、朋友圈正文容器class类:moments_post(全局样式:用于朋友圈容器包裹),moments_post_朋友圈编号(移除、隐藏朋友圈内容可以通过这个类进行操作、)。author—作者ID(拉黑屏蔽朋友圈内容,可以通过这个类名一键隐藏所有内容)。video/image/audio:朋友圈类型标识,通过这个类做自定义样式输出用。
13、宫论缩略图样式配置中心,新增朋友圈缩略图(xc_thumbnail_moments)。涉及到朋友圈内容图片显示的地方都会读取这个样式(?imageMogr2/thumbnail/500x),旨在减少流量开支,提高页面加载速度。注:打开灯箱加载的仍是原图,只是默认显示缩略图。
14、发布弹出xc_popup组件兼容处理:APP端样式做以下调整【height: calc(100% - 8vw); top: 8vw; position: fixed;】这样(艾特、话题)等弹出窗口组件可以适配APP端沉浸式窗口。避免因为高度变化,popup内置窗口文字无法显示完整的问题
1、新增异步任务请求:woker_moments_clean($user_id),$user_id是用户UID 当某个用户的朋友圈内容出现更新了,那么必须携带这个UID参数传递给宫论异步进程进行处理。注:redis朋友圈缓存清理涉及到其粉丝用户的缓存列表,场景比较复杂。因此需要重写清理计划。单纯的清理发布者的朋友圈缓存,无法真正解决问题。
2、scan_redis命令优化,不在函数内部主动发起redis实例链接请求。因为有些特定场景,这个函数执行频率会异常频繁(比如朋友圈:有一万粉丝的朋友圈更新,那么可能会通过遍历来全部执行更新)。如果每次都重连redis,会造成大量的性能浪费。改为xc_redis通用处理方式,相对比较友好一些。
3、新增用户元字段:朋友圈内容缓存时间(moments_cache=标准日期),通过分页查询函数构建WP_Query查询条件后(无论是否有结果返回,都会写入时间到该字段)。注,如果查询的条件不是指定用户,那么将不执行。同时时间写入为缓存过期时间。这个字段存在,就表示,用户有朋友分页结果缓存。
4、新增朋友圈缓存清理函数:xc_moments_consult_clear_cache,$user_id 指定用户ID。第一步是清理全局缓存,使用scan_redis()函数扫描以moments_0:开头的键,然后使用delete_redis_array()函数删除扫描到的键。接下来是清理对方粉丝缓存。首先,获取指定用户的粉丝列表,使用get_user_meta()函数获取用户的fanlist元数据。然后,获取当前时间戳作为$news_time。如果粉丝列表不为空,就遍历粉丝列表。对于每个粉丝,获取其朋友圈缓存时间戳,使用get_user_meta()函数获取粉丝的moments_cache元数据,并将其转换为时间戳格式。如果朋友圈缓存时间戳大于当前时间戳,说明缓存仍有效,需要执行清理操作。使用scan_redis()函数扫描以moments_{$key}:开头的键,然后使用delete_redis_array()函数删除扫描到的键。
5、朋友圈清理缓存函数优化,当所有粉丝朋友圈缓存都被清理完成后。会将当前指定用户的缓存记录也一并清理,避免主页朋友圈内容无法更新。同时,在缓存清理成功后,还会主动删除粉丝和当事人的的moments_cache元数据,使用delete_user_meta()函数进行删除操作。
6、xc_moments_consult_clear_cache新增预留变量asyn,默认为false。如果标记为true,则表明函数将通过异步进程去执行。注:目前异步脚本还未接入该函数,只是预留接口。朋友圈缓存清理函数,现在已挂载于xc_moments_publish_hook钩子,只要朋友圈发布就会触发并执行。该清理函数后续还要在以下场景触发【1、朋友圈内容被删除、朋友圈内容被隐藏、朋友圈状态变更(隐私)、用户朋友圈被关闭、朋友圈被被恢复】
7、用户关注钩子:xc_follow_hook和用户取消钩子:xc_unfollow_hook,现在会执行朋友圈查询缓存清理。首先检测用户朋友圈缓存是否存在。如果存在将会检测缓存是否过期。如果未过期,那么将通过scan_redis和delete_redis_array进行缓存清理。这样关注后的用户朋友圈,可以被刷新。移除用户的朋友圈,也会被移除。
8、朋友圈关闭或开钩子xc_moments_toggle_hook:在操作完毕后会立即执行xc_moments_consult_clear_cache朋友圈缓存清理函数,将对方及其粉丝的朋友圈缓存记录全部移除,确保被操作用户的朋友圈可以正常显示或者隐藏。注:操作采用是异步进程,避免粉丝过大造成处理超时。
9、宫论系统计划配置中心新增定时任务:朋友圈缓存过期【用户字段】清理,执行周期(10分钟)。触发函数:xc_corn_moments_cache_usermeta,执行方式:采用异步处理。该函数用于清理用户元数据中的朋友圈缓存字段。首先,通过使用全局变量`$wpdb`获取WordPress数据库对象。然后,构建SQL查询语句,筛选出满足条件的用户ID。执行查询并遍历结果集,对每个结果进行处理。使用`delete_user_meta()`函数删除用户的`moments_cache`元数据。
10、朋友圈分页查询缓存清理会在以下几种场景中执行。【1、朋友圈发布,更新全局朋友圈内容清理(广场)和发布者及其粉丝的朋友圈缓存清理。2、当用户取关或关注某个用户时,会更新自己的朋友圈查询缓存。3、当朋友圈被关闭或恢复访问,会清理自己及其自己粉丝的朋友圈缓存。】清理粉丝缓存的时候,会先检索对方moments_cache字段,如果该字段不存在或者日期过期,则跳过对方的清理。避免执行频率过高。注:这个朋友圈粉丝缓存清理,涉及的场景比较多。虽然已做查询优化,但依旧可能存在性能隐患。需要特别留意。
11、朋友圈过滤名单中添加或移除用户ID操作成功后,会通过clean_redis_key异步进程,更新当前用户的朋友圈缓存。这样被过滤的用户的朋友圈可以在页面刷新后可以正常显示或被隐藏。过滤名单触发事件为:xc_moments_filter_list。注:朋友圈名单过滤添加或移除并没有关联钩子。
12、朋友圈分页函数设计完成:四个变量属性:$user_id:指定用户的ID,如果为0,则获取公共朋友圈内容。$offset:查询偏移量,用于指定从哪个位置开始检索文章。$number:要检索的文章数量。$uncache:是否绕过缓存,如果为true,则忽略缓存直接查询。返回一个包含朋友圈内容的数组,每个帖子包括 post_id(文章ID)、time(发布时间)、content(内容)和 author(作者ID)等信息。 如果没有内容或发生错误,返回 false。使用 Redis 进行结果缓存,缓存时间为 12 小时。 如果未绕过缓存且缓存中有数据,函数将直接返回缓存数据。 如果缓存中标记为 'false',表示没有内容,函数将返回 false。 缓存状态以 cache 键表示,为 false 表示缓存未命中,为 true 表示使用了缓存数据。根据传入的用户ID和相关配置,构建查询参数,包括关注列表、隐私设置等。
使用 WP_Query 执行查询,并处理查询结果。将查询到的文章数据格式化为数组,包含指定字段和元字段信息。
13、封装全新的异步执行函数:【xc_asyn_execution】用于触发异步任务的执行,它向异步任务处理器发送任务,并可以选择是否等待任务完成。 $function_name 参数指定要异步执行的函数的名称。 $function_variable 参数是一个数组,用于传递给 $function_name 函数的参数。默认为空数组。 $result 参数是一个布尔值,用于指定是否需要等待异步任务完成并返回执行结果。如果为 true,函数会等待异步任务完成,并返回任务执行的结果;如果为 false,函数会立即返回 true,不等待任务完成。 函数首先检查指定的函数是否存在,如果不存在,则直接返回 false。 构造了一个包含任务相关信息的数组 $task。 调用 xc_task_worke 函数来处理异步任务。如果 $result 为 true,则函数会返回异步任务的执行结果;如果为 false,函数会立即返回 true,不等待任务完成。
14、宫论异步进程新增请求:【asyn_execution】,负责异步执行函数请求。需要传递函数名 $function_name,和执行函数的参数变量数组 $function_variable,以及是否需要返回消息的标志 $reply。 如果指定的函数不存在,返回一个错误信息。并且通过opcache 会使加载的 PHP 脚本失效,以确保下次加载时新的内容会被读取到。 最后将根据是否有要传递的参数,选择直接调用函数或使用 call_user_func_array 动态调用函数。 执行完函数后,将回复消息给请求源。 完成任务后断开连接,关闭连接对象。
15、异步进程新增一个命令请求:$task_data['type']=reboot。请求子进程执行posix_kill事件,像所有的子进程发起重启请求。注:这个请求是预留事件,后面需要来完善。进程脚本重启是一个非常复杂的场景,操作不当会导致主进程出现意外奔溃的情况,需要做大量测试才能部署使用。
1、新增朋友圈分页函数:xc_moments_consult,接受三个参数:$user_id表示用户ID,$offset表示偏移量,用于分页,默认为0,$number表示每页显示的文章数量,默认为10。函数中构建了查询参数$args,包括了文章类型为"moments",用户筛选为:发布者的关注列表名单,文章自定义字段"power=public"的条件。【注:获取用户的关注列表,返回关注列表发布的朋友圈内容】
2、朋友圈分页查询函数,现在会排查(moments_close)用户组,处于这个用户组的用户一般为两种。1、用户主动关闭了朋友圈。2、因为涉嫌违规,被平台封禁了朋友圈的用户。这类朋友圈的内容,不应该对外展示,因此在WP_Query构建查询的时候,需要通过author__not_in过滤这些用户名单,在返回结果。注:涉及到朋友圈(禁用停用关闭)一定要同步更新moments_close。
3、朋友圈分页函数进一步优化,通过fanlist获取到用户的关注名单后,会在原有数组名单中通过array_push将当前用户也加入其中。这样用户便可以获取到【自己和关注人的朋友圈内容,之前是只能获取关注列表的内容,并不包含自己。】同时过滤名单,也会移除当前用户,避免用户关闭了朋友圈,看不到自己的内容。
4、分页查询进一步优化查询,现在会将用户手动屏蔽的过的朋友圈加入到过滤名单中。具体操作为:通过get_user_meta读取用户的朋友圈配置信息,检索filter_list用户是否过滤屏蔽了某些用户,如果屏蔽名单数组存在。则会通过array_merge将过滤名单和(已停用关闭朋友圈)名单进行合并数组,然后通过array_unique进行去重处理。最后就得到了真实有效的过滤名单组,注:防止出现意外情况,当前用户过滤会在合并名单之后再进行移除。
5、xc_moments_filter_list(向朋友圈过滤名单中添加或移除用户ID)和xc_moments_block_list(不让指定用户看我的朋友圈)两个函数进行优化,1、返回结果现在采用标准的数组【code=0或1,msg=返回说明】,不在单一返回布尔值。前端无法进行正确响应错误详情。2、处理函数判断现在会过滤用户,如果被操作用户等于当前用户则直接拦截【code=1,msg=你不能对自己朋友圈进行操作。】
6、新增一个朋友圈自定义字段:moments_author(朋友圈作者),这个字段涉及是为了处理一个比较复杂的查询场景。当用户朋友圈部分内容设置为【私密可见】,而我们进行多个用户(当前用户+关注用户)查询时,需要过滤私密内容。要么全部屏蔽,要么全部不屏蔽。WP_Query查询方案似乎无法做到【当前用户的内容不过滤,关注列表用户内容过滤】,目前想到的折中方法是,增加一个字段来锁定过滤名单(即作者)。
7、朋友圈文章发布钩子优化:如果文章不公开,则会追加一个whitelist字段(白名单用户)。文章如果设置为私密可见,那么这个字段会记录发布者的UID,如果设置为粉丝可见,则会以数组的形式写入粉丝列表数据。构建朋友圈分页查询方法的时候,会通过检索白名单的方式来获取隐私内容,主要是用于粉丝可见内容的处理。
8、解决朋友圈分页函数一个筛选难题,返回结果如果过滤屏蔽(她人隐私内容、粉丝可见)。处理方案:使用了两个meta_query子条件。第一个子条件使用了relation参数为AND,表示同时满足power为privacy和author为当前用户UID的条件时才返回。第二个子条件使用了relation参数为OR,表示满足任一条件即可返回。其中,第二个子条件包含了NOT EXISTS比较操作符,用于判断power字段是否不存在。这样,查询结果将返回满足author__in和author__not_in条件,并且满足以下两个条件之一的文章:1) power字段为privacy且author为当前用户;UID) power字段不存在或者不等于privacy。
9、朋友圈分页函数xc_moments_consult:现在支持游客模式(user_id不需要传递,或者刻意将其标记为0),那么将重新构建WP_Query方法。查询条件为:文章类型必须为:moments,朋友圈文章状态必须处于公开(power=public)。过滤条件为:已关闭朋友圈的用户组。其它符合条件的用户朋友圈内容一并返回。注:不传递用户UID,则返回所有公开朋友圈内容(已关闭的朋友圈依旧跳过)
10、朋友圈分页函数如果未指定user_id,那么在返回所有朋友圈内容时 会通过xc_is_login获取当前用户UID,然后赋值到$author。过滤名单数组会过滤当前用户,避免用户在查看朋友圈广场时,自己新发布的内容无法查看。注:过滤名单为:author__not_in,主要为已关闭或已封禁的朋友圈名单数组。
11、朋友圈分页查询新增变量uncache(默认为false,优先查询缓存),如果为true则禁止缓存,直接通过WP_Query来获取朋友圈分页数据。缓存键值为:moments_' . $user_id . ':' . md5('consult|' . $offset . '-' . $number)。注:user_id是指定用户的朋友圈的内容,如果其值为0。则表明这是朋友圈广场(返回所有公开的朋友圈内容)。
12、朋友圈分页函数返回的内容调整,目前仅返回(post_id=朋友圈编号、time=发布时间、content=朋友圈内容、author=发布者UID),其它字段全部丢弃处理,减少非必要的缓存占用。注:朋友圈文章对应的自定义字段(ALL所有)会直接挂载到meta子数组结构中,非及时更新的自定义字段,可以直接通过分页函数结果调用。
13、朋友圈分页查询数据缓存时间调整为12小时,避免长期缓存占用太多内存资源。通过xc_moments_consult函数构建WP_Query文章查询后,无论是否有结果返回都会立即执行wp_reset_postdata(重置查询对象的文章数据),避免对象被溢出,造成其它分页查询出现返回异常。
14、xc_moments_publish_hook朋友圈发布钩子新增业务逻辑:当朋友圈文章发布成功后,会执行两个事件(1、通过clean_redis_key(moments_0:*),清理分页查询缓存(全局所有文章)。2、通过clean_redis_key(moments_发布者UID:*),清理发布者的朋友圈查询缓存。这样分页返回的数据,如果存在缓存会自动被清理。
1、APP端view视图层优化,之前通过margin-top强行将视图向下调整8vw会导致(内页窗口出现底部显示不完整的情况),新的解决方案是通过position:fixed进行布局,top参数来设置间隔距离。然后通过height来做高度处理,使用calc函数,可以将height的值设置为视窗高度减去8vw的计算结果。这样设置后,view元素的高度将自动适应视窗高度减去8vw的值。
2、plus_immersive_image(APP端调整沉浸式封面背景布局)事件优化,状态为开启(on)时会将view视图height调整到100%、top设置为0。当状态为关闭(off)时会将views视图height调整为:calc(100% - 8vw)、top设置为8vw。其它调整不做更改,仅限于视图样式的处理,以便适配新版视图兼容处理。
3、redis的内核版本升级到7.2.35, 同时将timeout设置为100秒。超过100秒如果客户端未有任何请求则会主动断开处理,避免客户端出现异常,造成连接池资源将无法及时回收。导致各种异常服务,比如协议出错等等。注:这个可能需要做兼容处理,即:重连机制问题,避免用户的redis被断开,导致业务混乱。
4、朋友圈页面新增pull-to-refresh-content组件,通过onPageBeforeInit对其进行refresh监听来实现页面下拉滚动监听,现在可以在朋友圈页面通过下拉背景,来触发这个事件。注:后续会通过下拉滚动事件来执行页面数据更新或加载动作,为了防止下拉滚动被重复执行和触发,会在监听位置坐一个load-post动画拦截,如果已有加载动作在执行,则跳过下拉处理。
5、朋友圈新增一个正文div容器【moments_list】,朋友圈的相关内容加载到这个容器内部处理。同时页面下拉滚动刷新事件也通过此容器来进行触发。注:封面下拉滚动监听存在兼容问题需要解决,暂时不采用该方案。除了下拉滚动,这个容器后面还会集成上拉触发滚动条加载更多事件监听。该容器会通过padding-top进行15vw间距处理。
6、朋友圈页面现在会通过 touchstart、touchmove 和 touchend 事件来监听用户的触摸操作,并相应地执行逻辑。当用户向下拉动时会显示【pull-to-refresh-layer】下拉进度图标动画,取消下拉动作 或手指离开屏幕则会隐藏下进度图标动画。朋友圈页面打开后,动画组件是隐藏不可见的。通过监听用户触摸操作来显示或隐藏。
7、朋友圈个人说明点击事件xc_moments_info_desc_more优化,显示全文时候样式调整:width: calc(100% - 100px);text-align:right;margin-left:100px,其它样式保持不变。调整后,说明依旧能够保持靠右间距对其处理,只是向左显示内容扩充更大一些,如果仍旧太长那么将2行显示。
8、朋友圈page-content现在采用position: relative布局,避免(头部区域,名字、头像、背景、备注)容器随页面滚动。解决页面滚动下拉后,上拉返回上面时会一直触发refresh事件的问题。在触发refresh事件前会获取scrollTop滚动条位置,如果滚动条处于顶部则允许执行下拉动作,否则跳过执行。
9、朋友圈页面发生滚动时,会通过scroll进行监听 监听位置【xc_moments.pull-to-refresh-content】,如果下拉滚动位置大于300PX,则会将navbar-inner背景设置为默认背景色、text-shadow阴影效果移除、文字颜色调整为黑色。如果滚动条位置小于300PX则恢复透明菜单,复原原有样式。
10、新增朋友圈背景背景自定义样式:navbar-inner.color【background-color: var(--jinsom-navbar-bg-color); text-shadow: 0 0 0px rgba(0,0,0,0.5);】用于顶部菜单涉及透明沉浸式处理,之前的处理方式存在瑕疵 如果菜单被透明赋值,上级页面的菜单也会同步处理。即便加了唯一类名仍会存在。新的解决方案是通过jquery进行类名addClass或removeClass操作,做到单一页面顶部菜单动态变化。
11、新增APP端:CSS变量组(自定义属性),像页面菜单,菜单字体颜色等都需要区分APP和H5端,因此单独配置一套CSS变量属性到app.css中,后面需要对页面样式做出全局调整都会通过CSS变量组来做跨段适配处理。目前主要针对APP端沉浸式状态栏做适配兼容处理。
12、朋友圈页面新增两个类名:page_immersive=用于页面唯一标识处理、navbar_immersive=页面导航菜单唯一标识。这个class类主要处理APP沉浸背景图问题,一个是标记页面,一个是标记顶部菜单。后面会通过监听页面访问事件来操作dom对这两个类做出增删处理。
13、朋友圈页面,现在会通过onPageBeforeInit进行页面滚动加载监听,当页面infinite触发事件时,会检测xc_moments_loading变量是否为true,如果不为则将触发ajax请求,请求携带参数为:page分页数据、author当前用户变量。请求发送后会根据后端的返回状态码进行页面数据填充处理。
1、朋友圈页面,会通过xc_get_moments_background获取用户背景图,然后加载到页面顶部(高度300PX)。同时为了避免页面布局出现错乱问题,朋友圈页面做出以下样式调整:1、内容区域添加自定义类:xc_moments,配合页面标识 对页面进行css调整只生效于该页面。2、padding-top取消向上10vw的间距,新增一个背景容器「background」来加载背景图,避免上下容器始终被包括在page-content里面。
2、朋友圈导航栏背景颜色设置为: rgba(70, 196, 124, 0)(透明隐藏),文字和图标通过text-shadow增加轻微文本的阴影效果(0 0 4px rgba(0,0,0,0.5);)。注:朋友圈会采用背景图模式,后面会做APP适配处理。类似于微信朋友圈一样,背景图覆盖到整个沉浸式状态栏中,此处导航背景设置为透明就是为了适配后续处理。
3、新增容器:avatar_info,加载用户头像、名字、备注,并显示在页面右下角。布局采用position定位元素布局,确保内容始终固定在指定区域。用户的头像、名字、备注的内容获取通过xc_get_avatar完成,该方法支持缓存,减少对sql的读取请求。注:对应的类名分别为(moments_name=名字昵称、moments_avatar=头像img、info_desc=个人说明)
4、全局导航栏右上角图标css优化调整(将I fa 图标固定为6vw),这样大小才能适配返回控件。调整css样式【navbar-inner .right I,navbar-inner .right fa{font-size: 6vw;}】。注:这个图标尺寸调整生效于所有页面导航栏,但原有.jinsom-icon样式图标不受影响。
5、新增朋友圈内容发布弹出窗口事件:moments_publish_layer,onclick点击触发后将会创建一个layer底部弹出窗口。一共有三个菜单选项:(发布图文、分享视频、取消),用户可以通过点击指定菜单进入朋友圈内容分享页面。该事件绑定到(朋友圈页面-右上角)新增一个相机图标(fa-camera)。
6、相册发布弹出layer事件内置一个className【moments_publish_layer】,通过这个类名对弹出发布选项做三个css调整(1、将layui-m-layerbtn的背景颜色调整为白色。2、将layui-m-layercont的背景颜色调整为白色。3、span[no]的文字颜色调整为黑色)。这样窗口的色调更鲜亮一些。
7、朋友圈发布弹出事件追加end回调关闭事件,关闭该窗口会将当前时间戳(毫秒)赋值到layer_close_time变量,使宫论后退事件能够监听捕获,使其支持左滑后退关闭(安卓端)。注:不追加这个监听,用户打开发布窗口后,左滑会返回上一页。同时新增click点击监听,现在点击(发布图文)菜单就可以触发页面跳转,之前点击文字部分才能跳转。
8、封装一个全新的plus事件:plus_background(),通过调用plus.navigator.isBackground()方法,获取当前APP应用是否在后台运行的状态,并将结果返回(true在后台、false不在后台)。这个方法主要是用于消息已读状态处理,如果用户收到消息,但是APP处于后台状态,说明消息是看不到的。这时候不能标记已读。
9、宫论APP开始采用沉浸式导航栏:目前已将navigationStyle字段设置为custom,导航栏样式将通过自定义来处理。注:沉浸式布局后,一些特定场景(朋友圈、个人主页、商户主页)有自定义图片背景铺垫的,会采用状态栏透明以实现沉浸式效果。注:存在一定兼容问题,但是影响很小(Android5及其以下版本目前不支持)。
10、新增沉浸式封面背景处理函数plus_immersive_image:接收唯一变量:status - 沉浸式状态,可选值:'on'(开启)、'off'(关闭),默认为'on',通过传入不同的status参数来控制不同的状态。当status为on时,会开启沉浸式状态,即.view元素的上边距设置为0vw,.navbar元素的上边距设置为8vw。当status为off时,会关闭沉浸式状态,即.view元素的上边距设置为8vw,.navbar元素的上边距设置为0vw。
11、APP端页面访问(onPageBeforeInit)和后退(onPageBeforeRemove)事件都会对特定页面进行跟踪,如果页面为沉浸式图片背景类型,那么将执行plus_immersive_image操作,对页面的元素进行兼容处理。注:打开页面是开启、后退页面是关闭。为了保护页面不被破坏,plus_immersive_image现在会进行plus环境判断,只有支持plus的设备才会执行。
12、朋友圈页面现在通过onPageBeforeInit进行一些特地事件监听,比如分页加载、关注评论等交互行为。这个页面非常复杂,后续会有很多事件要等待处理。目前已集成第一个监听行为:如果页面存在个人说明(info_desc元素存在),那么会通过比较元素的scrollWidth和clientWidth属性,判断文字内容是否溢出。
13、js库新增引入(moments.js),负责朋友圈相关js业务函数逻辑(不包含发布事件和页面路由)。命名方式【xc_moments】,通过wp_enqueue_script加载到宫论项目中。注:这个js库支持延后加载,当页面所有静态资源加载完毕后,在进行加载也不会造成页面错误。后续所有js都尽量做到主加载和次加载的分离,避免一次性全部加载造成性能缓慢问题。
14、朋友圈个人说明新增点击事件:xc_moments_info_desc_more,这个事件会控制.info_desc的文本内容显示更多或收缩。通过判断.info_desc元素的status属性,如果status不等于on,表示当前状态为显示更多,将取消设置宽度、边距和溢出处理方式,更新状态为on。如果status等于on,表示当前状态为收缩,将设置宽度为视窗宽度减去200px,设置边距为100px,设置空白处理方式为不换行,设置溢出处理方式为隐藏,设置溢出文本显示方式为省略号,更新状态为off。
1、video_info_task优化处理:1、sql查询语句处理,增加对order字段NULL类型的识别。2、内部执行xc_video_info语法时会通过@进行抑制报错,避免因为错误中断后续任务队列。3、重启服务器,并成功调试异步进程脚本 确保任务能够被周期性的被执行。注:视频信息更新一般分两个阶段处理。一、超时系统自动会获取,一般为发布成功一小时。二、后期会有个视频查询函数,同步获取视频信息并更新缓存。
2、朋友圈发布事件钩子,现在会以标准的数组结构返回内容,发布成功【code=0,msg=文章ID】发布失败【code=1,msg=发布失败,服务器异常!】。在处理业务逻辑时,前端可以根据后端返回的状态码来判断文章的发布状态。注:之前仅返回布尔值,没有返回文章ID,对前端响应结果不友好。故而改为数组形式返回。
3、前端朋友圈发布事件【xc_moments_post】,视频发布和图文发布处理逻辑保持一致。唯一的区别在于私密和公开内容的弹窗提示(私密朋友圈发布会有个提示内容,公开没有),后端朋友圈发布成功后,前端有预留一个回调事件 用于处理页面更新变化,比如朋友圈页面直接插入一条新内容。目前暂时为延迟2秒后退到上一页。
4、修复xc_publish_ok_hook钩子无法正确处理【@提醒、粉丝更新标识、草稿清理】的问题,当朋友圈发布成功后 会传递朋友圈编号到这个钩子进行回调通知处理。但因为发布者UID获取异常,导致后续的业务无法被正确触发。目前已修复该问题,改为通过get_post_field来获取朋友圈发布者的UID后,在执行通知提醒。
5、APP启动后会通过onLaunch执行两个PLUS事件【plus.navigator.setStatusBarStyle('light')=设置状态栏的文本和图标颜色为浅色,适用于深色背景。plus.navigator.setStatusBarBackground('#ffffff')=设置状态栏的背景颜色为白色。】APP沉浸式导航栏配色不在沿用后台设置,使用统一的白色背景,图标字体颜色固定黑色。
6、新增APP端层叠样式表,路径地址【assets/assets】。当设备处于APP环境会通过wp_enqueue_style加载该样式。前端唯一标识:xc_app,这个层叠样式表是加载在所有css文件的最末尾,app.css里面写的样式,如果页面已存在同名样式,会因为优先级自动覆盖前面的样式。APP端如果需要自定义样式,通过该样式表来处理即可。
7、现在会通过APP.css接管navbar-inner背景配色(所有顶部状态栏的颜色标记为#FFFFFF,以此适配APP端的沉浸式配色),对应文字、图标、A链接的颜色设置为(#332b2b)以此覆盖原有配色,避免浅色被深色背景覆导致显示不出来。同时首页头部搜索框的背景色调整为:#f7f7f7浅灰色。
8、新增朋友圈页面【global/moments.php】页面唯一标识:xc_moments,短代码地址:【[xc_link type=global]/moments.php】这个页面没有权限拦截(所有人都能访问),但是如果未登录,可能不是加载数据。这个页面属于个人主页,用户会在这个页面看到自己和已关注用户的朋友圈动态。如果没有关注好友,或未发布过朋友圈,那么页面可能会加载其它内容,具体要看分页查询接口的设计。
9、朋友圈后台配置,新增朋友圈背景图设置专栏,提供一个全新group字段【xc_moments_background_defalut】用于添加官方预设背景图,需要配置三个字段:name=背景图名称、url=背景图地址(支持直接上传),尽量不要图片太大,比例:410X300。vip=开启后该背景图只能会员选择。
10、后台临时添加16套朋友圈背景图,作为测试使用,其中两套设置为vip可用。同时现在用户自定义元字段(moments_config)数组配置,现在新增一个键值:background,如果用户自己上传了朋友圈背景图,或主动选择了系统默认背景图,那么这个值会写入图片地址,以便相关函数直接读取。
11、封装一个新的方法来获取用户的朋友圈背景图片 URL:xc_get_moments_background,首先,它会尝试从用户的朋友圈配置中获取用户自定义的背景图片。如果用户配置中包含背景图片,就会返回用户自定义的背景图片 URL。如果用户配置中没有背景图片,函数会从默认的朋友圈背景图片数组中选择背景图片。如果用户是会员,函数会随机选择一张背景图片作为背景。如果用户不是会员,函数会从不包含 vip 字段的背景图片项中随机选择一张作为背景。
12、通过xc_get_moments_background获取用户朋友圈背景图后,如果用户朋友圈配置没有background字段,那么会将随机获取的背景图写入到用户配置,以便下次能够直接读取。注:首先会检测moments_config字段是否存在,如果不存在则会创建一个空数组,在通过update_user_meta进行数组配置更新。如果存在则直接完成更新。
1、朋友圈发布事件xc_moments_post,新增发布类型:video(允许用户分享视频到朋友圈)。发布事件有两个拦截处理,首先会检测页面是否有视频上传组件,如果没有直接拦截。存在视频上传组件 还需要检测视频是否已完成上传(自定义字段:url),该字段存在则代表页面插入了视频,未上传视频禁止发布。其它拦截标准和朋友圈图文分享保持一致。
2、朋友圈开关提示优化(视频和图文),如果用户关闭了朋友圈 则在发布时提示【朋友圈已被关闭,无法分享内容。<br>请前往朋友圈设置页,重新启用!】。评论开关优化,如果用户关闭了朋友圈全局评论功能,那么默认评论是关闭的,开启会提示【你的朋友圈已禁止评论,无法开启<br>如需评论,请前往朋友圈设置页(取消限制)】
3、xc_moments_publish_check_hook(朋友圈发布拦截钩子),如果发布类型为video 那么将检测video_url字段是否传递,如果不存在则返回【code=1,msg=视频地址为空】。注:视频朋友圈分享发布,那么视频是必选的 如果未上传视频则不允许用户发布朋友圈。前端和后端都要做出拦截判断!
4、朋友圈发布钩子:xc_moments_publish_hook,如果发布的类型为视频(video)那么将创建一个朋友圈自定义字段video_url写入分享的视频地址。并且在发布成功后将执行:xc_upload_media_ok事件,上传数据表回调处理 将上传的视频标记上朋友圈文章ID,避免被系统定时计划清理删除。
5、封装一个方法:xc_delete_local_file()该函数用于删除本地文件。函数接受一个参数 $id,可以是文件媒体ID或文件地址(CDN域名地址)。根据传入的参数类型,函数从数据库中获取文件信息或检查文件是否存在。然后,函数检查文件路径是否存在,并且文件是否存在。如果文件存在,函数使用 unlink() 函数删除文件。如果文件删除成功,函数返回 true,否则返回 false。
6、execution_cos_delete_task:cos文件删除计划新增处理业务逻辑,xc_cos_sdk_delete函数执行成功后 会立即执行xc_delete_local_file函数。这样CDN远程文件删除成功后,如果本地文件存在的话,也会同步移除处理。这个计划函数是系统周期性执行,后台预设间隔时间,超过XX小时仍未有订单标识的文件 都会通过该计划执行移除。【注:这是redis标准任务队列,用到了(定时计划、异步进程),业务逻辑相对比较复杂】
7、xc_upload_hook_success文件上传钩子新增业务逻辑:会通过xc_upload_image_config或xc_upload_video_config来获取当前文件的上传配置,如果后台标记该类型,不保留本地文件 则会直接通过xc_delete_local_file进行服务器文件移除操作。注:之前是采用定时计划去移除,现在是同步方案处理。只要文件上传同步到cos云端,就会移除本地文件。需要特别注意的是,目前仅支持video和image两种类型配置,如果后台未配置,则目前视为保留【主要是聊天图片和聊天视频目前未处理】。
8、xc_delete_local_file继续优化处理:当本地文件删除成功后,会通过xc_update_sql进行数据表回调操作。将local字段设置为空,这样后续业务可以直接通过判断local字段是否存在来获取本地文件的状态。注:涉及本地文件的删除,必须采用xc_delete_local_file函数来执行,这样可以确保业务的统一性。
9、新增钩子:xc_delete_local_file_hook,需要传递两个变量(被操作的媒体ID,和被删除的文件地址local)。当媒体表的服务器本地文件被删除了,将会触发这个钩子。如果有业务涉及到本地图片的调用,那么需要通过这个钩子进行回调处理,避免因为文件不存在,造成业务访问中断。
10、私信发送视频和发送图片,接入新版上传配置。上传参数将通过xc_upload_image_config和xc_upload_video_config配置组获取。这样可以做到全站媒体资源业务逻辑统一化(删除、同步、更新、审核),旧版字段目前仍旧保留,以免出现兼容性的问题产生。后面重构前端私信聊天上传接口时,在移除旧字段。
11、新增钩子:xc_delete_file_hook,需要传递两个变量(被操作的媒体ID,和被删除的文件地址local)。当媒体文件被删除了(非本地文件是指remote字段地址,可以理解为CDN加速图片或视频被存储桶移除后),将会触发这个钩子。如果有业务涉及到该图片的调用,那么需要通过这个钩子进行回调处理,避免因为文件不存在,造成业务访问中断。注:这个钩子目前主要靠xc_cos_sdk_delete这个事件触发,cos移除对象存储文件事件。
12、xc_video_info提供对象存储COS——SDK【获取视频文件信息】优化处理,1、如果媒体表记录状态为delete(已删除),会直接返回flase。2、该接口目前仅支持视频信息采集,如果上传媒体非video类型也会直接false。3、采集结果优化,现在不会读取Audio和Format数组信息,减少对数据表的写入压力。
13、video_info_task,sql语法优化:xc_upload 表中选择所有满足以下条件的记录:【1、state 字段的值为 'ok'。2、order 字段必须存在内容(不为空字符串或NULL)。3、exif 字段内容不存在(为空或为 null)。4、time 字段的值必须在当前时间的1小时之前】,之前的语法存在瑕疵,会造成查询异常。
1、H5和微信环境通过视频上传组件发起视频视频上传后(已完成字节大小和mime格式的对比验证后),会创建 XMLHttpRequest 对象来进行视频文件发送服务器后端的处理。同时会透过addEventListener进行三个监听(progress=上传进度、load=上传完成、error=返回异常监听)。考虑到兼容问题,目前H5和微信端不支持视频拍摄功能,主要是无法压制视频,原码视频无法处理大小。
2、非APP端视频在进行XHR请求建立前,会封装upload对象数据包,将【type、user_id、order、size、blob、file_name、upload、source、number、remark】等信息封装,然后通过encodeURIComponent进行编码化处理,然后提交到xhr接口。同时移除xc_upload_video事件一开始对upload_json的对象封装,新版上传接口已经用不到这个对象信息了。
3、addEventListener触发progress上传进度监听后,会通过Math.round计算出当前上传百分比,并赋值到percentage变量。如果上传进度大于(99.9%)将判定视频上传成功,如果视频上传组件存在当前页面(xc_publish_video元素大于0)那么页面会将上传进度条标记为100%,提示内容变更为【上传成功:服务器正在转码】,移除上传组件点击事件。如果低于99.99则实时更新页面的上传进度百分比,并且将文字提示更改为【XXXmb/xxxmb】这种上传文字提示。
4、addEventListener触发load(服务器回调事件)后,会解析xhr.responseText参数,并将字符串解析为 JSON 对象【注:上传接口会返回标准的json数据信息,格式为code=0或1、msg=返回详情。0代表文件处理成功,1代表拒绝处理或者发生错误】。XHR现在会正确处理服务器信息,如果code=1那么将执行以下操作(1、xc_upload_video_form上传组件恢复、并且将onclick事件复原。2、上传进度条重置为0%。3、视频链接如果已存在则移除。4、文字信息则变更为:处理失败: 【错误详情】)。
5、通过XHR成功将视频文件上传到服务器(并且同步到了云端COS对象存储)则服务端会返回的code=0,msg即:cdn远程视频地址。此时页面会执行以下变化。(1、隐藏xc_upload_video_form视频上传组件信息。2、显示可移除当前视频的BTN按钮菜单。3、将上传成功的视频地址同步到xc_publish_video的自定义属性url上面。4、通过西瓜视频播放器构建一个播放组件,将当前视频插入到页面中。)注:以上DOM节点变化的前提必须是当前页面存在视频上传组件信息。
6、如果XHR请求存在错误返回(一般为服务端响应错误),会触发addEventListener(error)监听事件。监听事件会捕获xhr.statusText(返回一个包含错误状态文本的字符串)和xhr.status(返回一个表示错误状态码的整数值),如果视频上传组件存在,则会将捕获到的【错误码和错误信息】一并写入到视频组件中。并重置组件的一些元素(1、恢复上传组件和onclick事件。2、上传进度归零处理。3、视频地址的属性设置为空)。
7、避免(H5和微信端)上传组件被重复执行,特地安排了一个变量来控制上传状态,当【isUploading_video为true,则禁止表单被触发和点击】。以下为该变量属性的状态变化,初始化为false,执行上传请求前标记为true。【上传出现错误、服务器返回异常、权限操作失败、文件上传成功】等情况会将其标记为false。相当于一个上锁机制,除非主动解锁,否则不允许用户重复提交请求。
8、APP本地文件上传现在也支持isUploading_video变量来控制重复上传请求(加锁机制),具体表现为:执行APP上传请求前(不区分拍摄还是相册选择),会主动将isUploading_video标记为true。如果其值为true那么plus_upload会组织上传请求,并通过plus_msg告知用户(有进程正在执行上传任务)。当上传任务完成后(无论失败还是成功)都会将属性标记为false。
9、视频上传完成后(西瓜播放器加载到页面成功)时,会使用 offset().top 方法获取 .xc_remove_video_toolbar 元素相对于文档顶部的位置,并将该位置存储在 targetOffset 变量中,然后使用 animate() 方法将 .page-content 元素的滚动位置动画地滚动到 targetOffset 位置。这样在如果加载的是长视频,页面会下拉到最下方。用户体验更友好一些。
10、xc_upload_video_delete事件优化,在移除视频播放器的时候,还会通过removeAttr移除播放器之前留下的style标签(主要是插入高度信息,造成页面下拉存在大量空白)。并且如果操作环境是微信浏览器(user.ua==wx),还会主动讲视频容器的html信息设置为空。注:这是一个环境兼容问题,微信浏览器在视频加载后,会自定义一个容器来包裹播放器。未播放直接通过事件摧毁播放器,会造成移除失败。因此需要手动移除整个视频容器。
11、xc_upload_video在微信环境执行时,无法触发xc_msg消息提示。视频大小超过限制,视频格式不支持,出发消息拦截用户无法收到信息。目前的解决方案是,通过user.ua判断设备环境,如果处于微信中。则会将错误拦截信息写入到上传组件的提示上面,并执行top_msg消息顶部窗口通知,确保上传失败事件能够被用户接受到。注:服务器返回拒绝上传,也会通过top_msg触发消息警告。
12、视频上传成功后会通过xc_upload_hook_success钩子,增加一个计数器【day:video_upload-' . $upload['user_id']】记录今日用户视频上传次数,该计数器每日00:01会自动清零重置。同时xc_upload_block_hook文件上传拦截钩子,现在会检测用户今日视频上传次数,如果超过后台限制 会主动拦截并提示用户。
13、fontawesome字体图标优化,视频播放组件加载的fa图标 margin-bottom:2vw(元素的下边距的空白间距设置为页面2%)。这样在后端返回自定义事件时,页面图标可以对称显示。视频上传组件(xc_publish_video)margin-top:4vw(元素的上边距的空白间距设置为页面4%),避免商品卡片插入时 因为靠右对齐遮挡着上传组件。
14、宫论视频上传组件封装完毕,视频上传配置通过后台预设。需要视频上传的页面只需要通过require_once引入(xc_get_option('xc_publish_component_video'))文件,然后在需要显示视频上传组件的地方执行 【xc_upload_video_html('moments')】函数即可,上传组件触发事件为:xc_upload_video,该事件仅允许登录用户执行。上传请求区分APP端和网页端(微信端也是沿用H5配置选项),触发后将通过原生事件或H5事件发起视频上传请求。上传会在页面(组件内部)进行实时回调,包括进度条、压制状态、返回错误信息等。视频上传完成后,会创建一个自定义属性到组件中url,判断用户是否完成上传,只需要获取这个地址变量即可。这个上传组件是全局可用,需要上传视频的地方,按需引入上传组件即可(权限、安全都已做处理)。
1、经过反复测试,plus.io.getVideoInfo接口获取相册视频信息时偶尔会出现卡死状态(等待超过10秒才有反应),这对用户体验非常不友好。因此相册完成视频选择后,不在主动通过该API去获取视频信息。改为通过getMetadata来获取来获取size字节,然后进行上传尺寸大小拦截判断。注:如果该函数依旧出现卡死状态,则取消前端size大小判断。
2、xc_upload_video视频上传事件,APP端现在支持视频拍摄(请求事件为:plus_camera('video'))操作流程为:触发视频上传请求时,会判断环境是否处于APP,如果处于则触发layer弹窗(选择拍摄或相册选择视频),如果选择拍摄视频则通过plus_camera发起设备主摄像头录像功能,进行视频录制操作。视频录制时长为最大10分钟。
3、视频拍摄完成后会通过plus.zip.compressVideo进行压缩处理,压缩参数为:(src=拍摄视频文件地址、quality压缩视频质量为中等、fps=帧数设定为60、resolution=分辨率为原视频比例)fps和resolution目前仅支持iOS环境,之所以压缩视频,是因为手机拍摄的视频一般都是比较大的,不经过处理 可能10秒的拍摄就会超过100mb。
4、考虑到APP端如果触发原生组件,无法触发layer弹出窗口。特地封装一个(等待加载指示器)plus_showwaiting函数,content是一个可选参数,用于指定等待加载指示器的显示内容。在函数内部,使用 plus.nativeUI.showWaiting 方法创建等待加载指示器,并将其存储在 plus_showwaiting_ 变量中。通过设置 padlock 为 true,我们禁止了用户手动关闭等待加载指示器。因为用户无法主动关闭,特定封装一个方法(plus_showwaiting_close)进行关闭等待指示器处理。
5、plus_showwaiting新增返回键监听,当用户左滑时将会拦截处理,避免用户在触发等待器时通过左滑关闭窗口。具体参数变量为:【back:none】该拦截只适用于安卓,ios没有返回概念。同时新增一个全局变量plus_showwaiting_,用于监听加载器是否处于运行状态,触发plus_showwaiting_close关闭事件时会该变进行检测。如果存在才执行onclose。
6、plus_camera视频录制请求,现在会根据拍摄的视频的大小来决定是否启用视频压缩。处理流程为:1、通过getMetadata获取拍摄的视频文件大小,如果小于后台设定 那么将允许上传。如果大于后台设定,则触发压缩弹窗指示器,并执行compressVideo压缩请求,完成压缩请求后关闭指示器弹窗。然后在一次验证视频大小(压缩后的视频文件),如果小于后台设定则允许上传,仍旧大于后台设定 那么拒绝并提示用户。
7、xc_upload_video和xc_upload_image两个事件优化,APP端触发【拍摄和相册选择】的弹窗时,直接通过onclick来调用plus_camera摄像头请求接口,就方法是通过监听ayui-m-layercont的点击事件来触发函数,这个方法存在瑕疵,会有概率重复调用摄像头(视频拍摄,会有概率重复拍摄。拍摄完成后需要继续拍摄)
8、视频拍摄完成后(包括压缩后处理),如果尺寸符合要求那么将会触发plus_upload文件上传请求,将拍摄的手机视频传送到宫论统一上传接口。注:上传请求会根据文件信息封装upload_json上传数据包,并且上传事件触发后会同步更新页面的视频进度变化(和相册选择视频)处理的流程基本保持一致。
9、plus_upload上传事件触发时,会根据状态对【xc_upload_video_form】进行onclick绑定或解绑操作。1、当上传服务器请求触发时,会进行解绑操作,避免用户在上传任务执行时,继续点击上传。2、当上传出现异常:服务器拒绝请求,上传中断时,会回复onclick点击事件,以便用户可以重新上传。
10、当拍摄的视频通过plus.zip.compressVideo只想本地压缩处理时,视频上传组件存在时,会将组件页面提示变更为(视频正在压缩处理、同时上方附带一个设置旋转按钮)。视频压缩失败或者压缩成功后则会立即恢复原有的提示信息和图标【选择一个视频 (不能超过XX MB】。
11、视频如果处于压缩时不在执行plus_showwaiting加载指针(强制用户等待,对用户体验不好),改为压缩事件触发时,将上传组件的点击事件变更为消息提示。用户被允许在页面互动行为,但是点击上传组件会提示【视频正在压缩,请耐心等待】。当压缩成功则会恢复为上传进度条,失败则显示原来的提示【选择一个视频(不能超过xxxMB)】。
12、APP端请求宫论统一上传接口,鉴权机制优化。不在通过通用is_api_request函数来拦截请求(全局的请求头加密写到js类容易造成安全隐患),改为自定义请求头处理。具体流程为:plus在处理本地文件上传时仍会发起一个自定义请求头(但不是后台全局白名单的那个)。然后接口会判断是否APP环境,是的话则通过判断自定义请求头来验证安全。其它环境依旧采用传统验证方式。
13、plus_upload上传事件优化,如果服务器接受文件后,判定请求是是非法的。那么将延迟0.1秒(100毫秒)在进行页面回调操作,避免与statechanged回调事件发生冲突,导致页面无法正确响应结果。同时被拒绝上传,页面的文字内容变更为:处理失败: ( ' + responseObj.msg + ' )。后者为实际的拒绝原因。
14、考虑到压缩组件的强大性(安卓端:拍摄视频原码甚至可以压缩的到10/1),现在拍摄的原码视频不管大小是否超过系统限制,都要走压缩流程。1、减少视频的码率,避免十几秒的视频达到几十上百兆,造成用户播放视频卡顿。2、减少不必要的流量开支,高码率视频带宽消耗过大。注:之前是如果拍摄视频低于(100MB,后台设定)那么就不压缩,现在是无论多小,只要是拍摄的就必须压制。
15、xc_upload_video如果时间不是处于APP环境,那么将创建了一个隐藏的文件输入框,用户点击【视频上传组件】将会自动添加了一个 change 事件监听器,并理解执行视频文件选择请求。以此来发起视频上传功能,为了避免监听事件重复执行,会通过 isUploading_video全局变量来判断当前是否处于上传执行状态,如果是,则直接返回,避免重复点击上传。
1、plus_gallery如果处理的来源为(video=相册选择视频),在接口返回地址后会通过resolveLocalFileSystemURL打开文件对象,然后利用getVideoInfo解析获得视频的(size:视频大小、duration:时长秒数、width:视频宽度、height:视频高度)等信息。其中size要作为上传限制拦截手段。
2、封装一个plus事件(plus_msg)这个函数用于显示提示消息。它接受两个参数:content 和 ToastStyles。content 是消息的内容,而 ToastStyles 是一个可选参数,用于指定消息的样式。函数首先检查是否提供了 ToastStyles 参数。如果没有提供,则使用默认样式显示消息,其中消息居中显示。如果提供了 ToastStyles 参数,则使用指定的样式显示消息。注:这个消息是系统原生窗口样式。
3、相册选择视频后,成功取得文件对象信息后。会进行以下拦截判断(1、检测info.size视频字节大小是否大于后台限制【通过xc_publish_video自定义属性max_size来获取后台限制】。2、检测视频文件MMIE是否是支持的类型【通过xc.mime_video获取支持类型列表】)如果不符合条件,则通过plus_msg发送消息提醒。注:不能通过xc_msg来触发消息发送,因为相册处于打开的状态,内置的layer窗口会被主动关闭。
4、新增APP上传接口请求函数(plus_upload)这个函数接受两个参数:file 是要上传的文件路径,fieldParams 是一个对象,包含自定义字段名和对应的值。函数会请求宫论统一上传接口,根据fieldParams发起一次上传任务请求。该上传请求是通过APP端发起的,并非js处理(js无法读取文件,必须采用plus方案来解决)。这个上传接口主要负责视频的上传,但是可以做出适配调整,原则上来讲 只要是手机的文件都可以通过这个接口上传。
5、APP端上传接口现在支持status状态回调监听,如果服务器故障或请求异常会返回状态错误信息,并通过plus_msg发送错误详情。如果服务器接受到了上传文件(原则上:文件发送成功),但是后端安全效验失败,则会通过upload.responseText返回错误信息。比如:非法请求、上传超过上限、文件格式不支持等。此时也会触发plus_msg窗口提示错误。
6、宫论统一上传接口有个身份拦截器,非法请求都会拒绝。通过plus发起的上传请求,因为是APP设备发起的所以被锁定为异常而拒绝处理。为了解决这个问题,plus_upload会在发送上传请求前会通过setRequestHeader写入一个header标记码,用于安全白名单处理逻辑,使接口做到安全放行处理。
7、plus_gallery执行相册视频选择函数,如果通过了size大小和mmie格式检测后 会封装一个upload上传数据包给plus_upload上传事件。数据包内容包括(type、user_id、order、size、file_name、blob、upload、source、number、remark),一些数据是通过客户端设备信息解析而来,一些则是当前用户信息。这个数据包会通过encodeURIComponent进行编码处理,以便传递给上传接口识别。
8、宫论统一上传接口新增【通用视频上传接口】,配置文件通过xc_upload_video_config来解析获得。通过视频上传组件完成上传的video(无论是:APP、微信、H5)都会通过这里的业务逻辑处理。整个上传流程为:1、创建本地临时文件,2、保存并移动文件。3、视频入库处理。4、建立上传缓存。5、发起视频上传cos同步请求。6、完成视频处理返回前端。
9、视频上传请求remark备注统一标记为:blob。不在区分APP端和H5端,这样处理逻辑可以做到统一,避免一个上传来源做一次请求识别处理。同时上传接口涉及到unlink函数调用的地方,都采用@来移植错误输出。避免因为(文件或目录不存在:权限问题:文件名或路径错误)等情况造成移除失败,导致前端响应异常。注:这个函数一般是删除临时文件,不需要回调监听。就算删除失败,系统也会定期清理。
10、通过对statechanged监听,视频的时候上传组件现在会实时更新进度条状态变化(具体实现为:percent元素,会根据计算已完成的百分比,对宽度百分比进行调整。)其容器背景色会浅色,百分比覆盖颜色为深色,因此视觉上会有个进度条的变化(每秒更新2-3)此进度,如果进度条更新完毕则会调整上传组件提示【旋转加载图标+视频正在转码处理中】。注:视频上传完成,只代表文件后端已接收成功。还需要同步到cos,这个过程需要用户等待。
11、视频同步到云端以后,会返回code:0和msg:视频CDN地址,此时plus上传监听事件会执行以下操作【1、将视频上传组件进行隐藏处理。2、初始化西瓜视频,创建一个播放器到当前视频组件。(播放器属性:视频自动播放、并只允许播放暂停,声音调整、视频宽度适配页面,高度自动调整)】并且视频下方会新增一个菜单(移除当前视频,重新上传);
12、视频加载成功后,会在上传组件容器中通过attr赋值一个变量(url=视频地址),发布时可以通过监听这个字段来判断用户是否已上传视频。当上传失败或后端返回异常错误会将这个字段移除。注:服务器返回错误信息和服务器请求失败,会执行以下操作。【1、视频上传组件通过show恢复显示。2、通过plus_msg弹出错误原因。3、上传组件进度条恢复为0%。4、上传组件的文字信息初始化处理。】
13、新增视频移除事件xc_upload_video_delete,当播放器加载完毕后才可以执行该事件。触发后将依次执行【1、移除隐藏当前操作按钮。2、显示视频上传组件。3、上传组件的文字信息回复如初。4、进度条恢复为0%。5、清空上传组件的url值。6、页面通过scrollTop调整到最上方,有时候有些视频是竖屏,移除视频后会造成页面空白。】
14、APP端通过视频上传组件发送视频除了会显示进度条,还会显示具体上传大小,上传进度从字节单位转换为MB单位,并保留小数点后两位数(示例:23.15MB/98.63MB)。当进度条大于99.9会直接标记为已完成,上传菜单显示控件会切换到(视频正在转码处理中)。原来的通过status监听状态200,有一定延迟。
15、plus_upload上传事件参数配置(超时时间:180秒、每次上传快大小:200KB,上传优先级:100)。APP本地上传请求,所有回调事件都做了事件区分。视频上传组件的处理,不会影响到其他页面结构。注:这个上传函数设计不单是为了上传本地视频,后面很多场景都会用到,是一个通用APP本地上传接口,因此回调处理需要根据实际情况来设定。
1、debug问题修复:xc_update_sql修改函数在涉及ID和id变量属性的判断时会进行isset语法判断,避免出现Notice错误。同时宫论API接口在处理位置选择时,会通过isset检查是否存在post传递变量(region),如果变量不存在则不会执行高德API地址解析请求。这个问题还是蛮严重的,每次请求API,如果没有传递【type参数】变量都会产生Notice错误。
2、DEBUG主要的问题已基本修复,剩下日志报错基本属于Notice类型(Notice 错误是一种较低级别的错误,表示一些潜在的问题或不规范的代码使用,这类错误不会导致脚本崩溃。)此类报错只是语法不规范,并不会影响使用。因此暂不处理(主要报错很多,一一解决起来需要花费大量时间)后续有时间在集中处理。注:后面尽量规范化,在执行变量判断需要善用(is_array、emptty、isset),这样可以规避绝大部分Notice错误。
3、上传配置页面新增视频上传限制(全局),xc_upload_video_limit_size:视频大小限制(Mb),xc_upload_video_limit_number:每日上传限制(XX个视频,注:视频上传未发布也会进行计数),xc_upload_video_detect:启用视频鉴黄审查(不建议开启,成本相对比较高)
4、新增视频上传配置(group),根据业务需要添加视频对应的上传配置。字段:xc_upload_video_config,数组字段包括(name:上传来源说明、key:上传标识,设置后不可变更,具有唯一性。和上传路径挂钩。class:自定义样式,如果组件需要自定义风格可以添加类名来实现。size:视频上传最大尺寸。audit:开启后.视频上传会经过鉴黄机器审核处理)注:这里的配置和上传组件挂钩,传递key唯一标识,获取视频上传配置详情。然后封装对应的视频组件。
5、封装方法:xc_upload_video_config $key 指定的key(上传视频唯一标识),根据指定的key查找xc_upload_video_config字段数组,返回找到的上传视频配置数组,如果没有找到则返回false。这个函数使用场景有两个地方,1、发布页面请求返回上传视频组件。2、宫论统一上传接口执行视频上传请求时。
6、发布配置新增类型(moments_video)发布标识为:moments_video。现在可以通过xc_publish_post('moments_video')正确打开朋友圈视频分享发布页面【xc_moments/publish_video.php】,通过这个页面,用户可以分享发布朋友圈视频内容。对应的朋友圈视频上传配置参数为【moments_video】,上传限制100mb。
7、新增页面【xc_moments/publish_video.php】页面唯一标识:moments_publish_video。通过这个页面用户可以上传视频分享到自己的朋友圈,页面打开监听事件和moments_publish_image保持一致。主要是监听用户草稿保存,和表单填写字数变。注:页面css需要单独做适配处理。
8、xc_publish_post统一发布页面打开事件(所有的发布功能(淘货、拍卖、工单、寄售、回收、朋友圈)都通过这个事件来访问)追加监听:xc_login,如果用户未登录状态则会主动跳转到登录页面。避免游客直接访问发布页面,然后发布页面没有做游客拦截。导致一系列的发布隐患。
9、视频上传组件函数封装完毕:xc_upload_video_html,传递配置标识KEY即可完成组件HTML的封装。内部会通过xc_upload_video_config完成配置解析,将上传尺寸参数写入到上传组件中。同时key会作为一个class类写入到组件中,方便前端对上传组件做样式调整。并且为了兼容【不同的上传视频组件】xc_upload_video_config上传配置组额外新增一个class样式。
10、上传视频组件class类名封装完毕(xc_publish_video、xc_upload_video_form、xc_upload_video_btn、xc_remove_video_toolbar)样式遵循LS原有风格,不过命名都已重新调整。引入发布类型标识类名,支持不同发布类型自定义风格。整体风格样式调整等后期前端来做重新调整。
11、朋友圈发布成功后触发xc_publish_ok_hook钩子后,会检测发布用户的草稿箱,如果其草稿箱存在朋友圈的草稿,将会通过unset移除对应的草稿,最后使用update_user_meta重新更新对方草稿箱数组信息。发布内容成功后,其对应的草稿无需保留,避免用户重新打开发布页面,还显示已发布过的草稿内容。
12、新增宫论统一视频上传事件【xc_upload_video()】,计划支持【微信端原生视频上传组件(支持拍摄和相册选择)、H5通用视频上传选择(仅支持相册,视频拍摄不好控制大小)、APP端原生视频上传组件(支持拍摄和相册选择)】该事件会验证用户是否登录,所在页面是否存在上传视频上传组件。
13、APP端(图片和视频)上传事件优化,如果存在layer弹出窗口。一般为(选择拍摄、或相册中选取)两个弹出菜单时间。追加end回调关闭事件,关闭该窗口会将当前时间戳(毫秒)赋值到layer_close_time变量,使宫论后退事件能够监听捕获,使其支持左滑后退关闭(安卓端)。注:不追加这个监听,用户打开图片视频上传事件,左滑会返回上一页。
14、plus_gallery现在支持video(APP端将通过plus打开视频相册窗口,允许用户选择选择一个视频),相册视图窗口支持查看并预览视频,可现实视频的大小的时长。注:该接口是通过plus调用系统接口,因此获取到的视频地址不支持通过网页浏览器直接播放。如果采用相册的blob方案,因为视频太大,会导致内存溢出。需要想其它方案来解决视频本地预览的问题。
1、异步进程脚本(start_GongLunTask.php)已解决redis断开问题,目前该脚本启动运行三天未出现进程内部因为redis通讯协议故障,而造成请求缓存对象操作异常的问题。这个问题困扰了好几个月,反复调试无数次。主要的解决办法是,宫论缓存对象【redis-object-cache.php】每次执行redis操作前,会检测是否处于异步进程中,如果处于则会对redis对象进行状态检查 避免因为长时间运行进程redis对象出现通讯故障。如果存在异常则中断抛弃之前的对象,重新进行链接操作。
2、朋友圈发布页面会读取用户moments_config配置,如果用户关闭了朋友圈评论(comment_close为true)。那么页面的评论控件将显示(评论已关闭),点击会提示【你的朋友圈已设置禁止所有评论,无法开启评论<br>如需开放评论,请前往朋友圈设置页面(取消禁止评论限制)】。只有用户开放了朋友圈评论功能,才能切换评论开关状态。
3、如果用户关闭了朋友圈(moments_close为true)那么xc_moments_post发布事件提交前会直接拦截,并提示用户【你的朋友圈已被关闭,无法分享发布内容。<br>如果需要发布请前往朋友圈设置页,重新启用!】,阻止用户提交。注:这是前段拦截,后端为了安全考虑,也会做出相应的拦截检测。只要朋友圈被关闭,那么用户是不允许发布新内容的。
4、当通过GET获取缓存内容时,会依次检测array_cache是否存在缓存、本地cache数组是否存在缓存、redis对象是否存在缓存,如果都没有结果才会返回miss。这里有一个语法错误冲突,没有通过empty检测对象变量或数组是否存在,而是直接进行结果查询。这样导致开的DEBUG模式,页面会出现大量查找未定义的变量异常报错。目前已优化处理。
5、宫论项目启用debug日志模式,开始通过系统原生方法来记录程序语法报错。如果出现语法异常或错误 将会日志记录到【wp-content/debug.log】中,未来几天将主要心力放在BUG修复 语法兼容处理上。此举是为了全面适配php8.X版本,为后面升级提前做适配准备。注:未来等保可能需要高版本PHP,因此需要提前做好处理。
6、debug问题修复:宫论自定义css和js库出现超全局变量失效的问题,该错误导致xc_css_js_cdn(CDN地址)和xc_css_js_version(版本号)获取异常,从而造成DEBUG输出异常。目前已重新定义xc_get_option函数,会先执行isset($GLOBALS['Sets'])检测,如果变量数组不存在则直接返回一个空数组。
7、修复访问后台被重定向upgrade.php页面的问题,页面出现异常报错(开启报错输出也不会显示详细错误,只显示:该站点出现严重错误)通过日志追踪,确定问题所在为配置引入路径错误导致。修复后该页面可以正常访问,显示为:(数据库升级)完成升级后,重新打开后台依旧重定向访问升级页面,但是页面显示已完成升级。(陷入死循环状态)。经过排查处理,最终确定问题所在。数据库升级后会涉及到option字段的更新,如果字段低于远程版本就会强制跳转upgrade页面。之所以陷入死循环重定向,问题源自于完成手动升级后,数据库版本为:56657,但是不知道什么原因,缓存版本为:55853。通过手动重新update_option完成版本同步得以解决问题。注:目前已禁用后台自动升级功能,并且为了兼容考虑 option字段db_version禁止缓存。该字段为数据库版本号。
8、debug问题修复:宫论js和css的引入调用方式错误,通过wp_enqueue_script加载资源时,脚本和样式没有挂载到wp_enqueue_scripts钩子函数中,直接进行加载队列不符合wp的标准。(虽然可用,但是可能会造成一些兼容问题),目前已修复,已定义xc_enqueue_scripts_js函数来挂载所有宫论项目涉及的样式和脚本文件。
9、debug问题修复:APP项目模块几处语法错误的问题。(1、myxinle_uniapp_head函数设计用户调用时,没有通过global来获取用户对象,直接使用current_user来获取ID不符合规范。2、涉及到cookie读取时,没有通过empty来检测是否为空,直接获取并使用造不符合规范。)
10、debug问题修复:sns-show.php首页apply_filters过滤器(home_post_list_advert_hook)存在调用异常问题,目前该过滤器未正常使用,故而移除处理。同时query_posts查询返回结果后,现在会通过wp_reset_query进行重置。避免本次的查询结果影响到后续的业务执行。注:当通过wpdb构建文章内容查询时,可以考虑在内部预留一个ad广告钩子,根据需要进行插入。
11、debug问题修复:首页菜单栏输出时,现在会通过isset依次检查【publish_header_html、jinsom_mobile_tab_publish_custom_type、jinsom_mobile_tab_publish_custom_type、jinsom_mobile_tab_publish_custom_type_html、jinsom_mobile_tab_publish_custom_type_require】数组变量是否存在,如果存在才会进行赋值调用。避免因为访问不存在的属性,造成出现Undefined错误。
12、debug问题修复:APP模块(xinle_weui_css_1=用户协议弹出窗口和xinle_app_ysxy_1隐私协议弹出窗口),使用未定义的变量$home 造成debug日志捕获异常.已进行修复处理,通过home_url函数来获取并输出当前域名的地址,将其替代:$home。注:在开启debug模式后,这个报错会导致后续执行的js全部异常。
13、debug问题修复:popup弹出窗口组件,在封装发布窗口时会检查publish_custom_type变量属性是否存在,如果不存在则将其赋空值。避免因为变量不存在造成debug错误。同时修复xc_websocket_close_hook(wss断开关闭事件),redis_get变量属性未执行isset检查 直接对数组进行if判断,因此产生Notice错误问题的语法瑕疵。
14、debug问题修复:处理websocket通讯消息库,如果$message['type']变量不存在会直接通过return false中断后续脚本执行,避免变量不存在的情况下仍旧执行后续判断。如果client_id_user查询有结果返回,会通过is_array依次检测old_wss和wss_user数组是否存在,如果有一个数组不存在都会直接返回false,不会触发异地登录弹窗警告。
15、debug问题修复:公共库接口现在会直接对post请求变量($_POST['type']和$_POST['order'])进行isste检查,只有传递的变量存在才会进行赋值。同时接口收到指纹事件时会对app_device进行is_array数组检查,只有其值为数组才会执行设备信息详细写入,并且最后会对$app_device['model']执行isset检查来输出对应的结果。
1、朋友圈权限设置事件:moments_permission_settings新增拦截,如果既不是本人操作又不是超级管理员 则拒绝执行,并提示用户无权操作。同时朋友圈设置页现在会检索用户moments_config字段参数,然后根据用户实置对switch选项进行【checked】标记处理。注:如果用户已之前关闭了朋友圈功能,那么打开选项卡默认是开启的,反过来亦是一样。
2、新增朋友圈关闭启用钩子:xc_moments_toggle_hook()需要传递被操作用户的author_id 变量,考虑到业务的复杂性 这里不主动传递【关闭或开启】状态。通过钩子内部查询用户moments_config字段来获取状态。该钩子有两个场景处罚(1、用户主动开启或关闭朋友圈、管理员封禁用户朋友圈)
3、朋友圈状态、评论状态 两个字段标识重新命名:moments调整为:moments_close、comment调整为comment_close。后面加个close标识,防止以后调用config配置时不知道字段的用意。同时前端页面操作提示语也做出修改(我的朋友圈已关闭/朋友圈对外开放)评论(关闭朋友圈评论/开启朋友圈评论)
4、新增option数组字段(moments_close),当用户主动关闭朋友圈或官方封禁了朋友圈 那么会将用户UID添加到这个数组中。当朋友圈恢复正常 则将用户从数组中移除。在获取朋友圈内容数据时(包括分页查询、话题索引、朋友圈搜索)构建的查询语法,会过滤这些用户发布的内容,避免内容被现实出来。
5、朋友圈发布拦截钩子:xc_moments_publish_check_hook,现在会读取发布者的朋友圈设置,如果用户朋友圈处于封禁状态【moments_close状态为true】那么将阻止用户发布。注:既然用户主动关闭了朋友圈,其内容都是不对外开放的,完全属于个人隐私圈子。那么就不应该允许用户在进行后续发布才合理。
6、朋友圈设置页面新增设置【不让他(她)看我的朋友圈】和【不看她(她)的朋友圈】两个菜单选项,前者相当于朋友圈屏蔽某些用户可见(隐私权限),后者则则是过滤某些用户的朋友圈(相当于屏蔽用户)。这个屏蔽是针对广场朋友圈动态,后面将允许用户一键屏蔽指定用户的朋友圈。注:这里和黑名单类似,但是屏蔽名单不直接采用黑名单 以免信息混乱。
7、朋友圈配置数组新增两个list字段:filter_list(不看某些用户的朋友圈列表)和block_list(指定的用户名单不允许查看我的朋友圈)。后面涉及朋友圈的内容调用时,会通过读取这两个配置字段来获取屏蔽或过滤名单。注:block_list目前属于保留字段,是否需要采用还需商榷。但是filter_list(屏蔽名单)是必须要有的,允许用户屏蔽某些乱发广告的朋友圈。
8、封装一个方法向朋友圈过滤名单中添加或移除用户ID:xc_moments_filter_list()有两个参数:$author_id表示要添加或移除的用户ID,$status表示操作状态,可以是 'add' 或 'remove',默认为 'add'。函数首先获取当前登录用户的ID,并检查是否登录。如果未登录,则直接返回 false。如果操作状态为 'add',则检查要添加的用户ID是否已经存在于过滤名单数组中,如果不存在,则将其添加到数组中。如果操作状态为 'remove',则检查要移除的用户ID是否存在于过滤名单数组中,如果存在,则将其从数组中移除
9、新增页面【xc_moments/filter_list.php】,展示用户朋友圈屏蔽名单列表。页面唯一标识:moments_filter,短代码地址为[xc_module type=xc_moments]/filter_list.php,该页面不做权限拦截,每个人访问看到的都是自己的屏蔽名单列表。因此不需要传递author变量。
10、朋友圈设置页面,如果是超级管理员查看指定用户设置(当前用户非正在查看的用户)则会显示一个tips标签样式容器,输入内容提示:【你正在查看 XXXX 用户的朋友圈设置】。有个页面提示可以避免管理员误操作行为,比如需要设置A用户的权限,但是不小心打开多个设置页面,实际当前配置的是B的朋友圈权限。
11、新增一个函数方法xc_moments_block_list(),向朋友圈屏蔽名单中添加或移除用户ID【指定用户不可看我的朋友圈】,有两个参数:$author_id表示要添加或移除的用户ID,$status表示操作状态,可以是 'add' 或 'remove',默认为 'add'。函数执行相应的操作。如果操作状态为 'add',则检查要添加的用户ID是否已经存在于屏蔽名单数组中,如果不存在,则将其添加到数组中。如果操作状态为 'remove',则检查要移除的用户ID是否存在于屏蔽名单数组中,如果存在,则将其从数组中移除。
1、新增社交互动消息通知函数:xc_add_tips,这个函数非常复杂,涉及用户聊天记录表更新、APP消息通知、邮件通知、站内信通知。具体而言为:当用户收到评论、点赞、艾特、回复。等互动消息时会触发这个函数,并写入到xc_notice数据表。然后根据后台设定触发与之对应的交互消息。需要传递的变量有【($my_id, $user_id, $post_id, $type, $content, $remark, $link = ''】使用场景非常多,触发即为频繁。
2、通知消息栏【@我的、回复、喜欢】的数据调用调整表改为:xc_notice,该表已全面接管社交互动消息的记录和展示。目前页面读取方式采用的是wpdb查询获取前50条未读记录,暂不支持分页加载 后面再回过头来进行分页加载处理。注:新版的消息跳转逻辑全部采用字段写入方式,不在通过解析type来获取链接。通过xc_add_tips写入消息时 需要将link封装好(支持短代码)
3、新增朋友圈空模版页面【xc_moments/detail.php】,短代码访问方式:[xc_module type=xc_moments]/detail.php,页面唯一标识:moments_detail 这个页面需要传递朋友圈文章(post_id)变量。用于展示朋友圈详情,一般是评论过多 首页不便全文显示,则提供一个link跳转到详情页。注:目前是空页面,只是为了方便调试通知跳转,提前设置页面参数。
4、xc_publish_ok_hook发布钩子触发时,如果类型为朋友圈(moments)则会触发aite检测事件。先通过get_post获取朋友圈文章对象,然后使用xc_aite_uid解析朋友圈内容,如果有返回aite用户名单数组,则遍历数组触发xc_add_tips通知事件,主要变量参数为:【type=aite、content=发布朋友圈@了你、link=短代码访问朋友圈页面】
5、社交消息默认配置新增消息标识(aite),消息说明:收到艾特@通知,【APP通知状态-默认开启、站内弹窗=默认开启】,APP弹窗消息站内消息正文格式为:xxxx:发布朋友圈@了你。注意:aite类型消息是通用的(发布文章、发布朋友圈、发布评论)等内容如果涉及到@艾特。都是采用这里的配置,一开则开,一关则关。需要注意的是,APP通知消息,用户是可选开启的,这里的配置只是默认设置。用户仍旧可以主动开启或关闭。
6、朋友圈发布成功后,如果朋友圈非隐私类型。将会通过get_user_meta获取朋友圈发布者所有粉丝,然后依次遍历执行【get_status_mark】事件。其标识为:moments,这样所有粉丝都会收到朋友圈更新通知(大致理解为:我的朋友圈有内容更新)。注:moments这个标识作用于朋友圈更新,也作用于,朋友圈评论被回复提醒等。
7、xc_moments_publish_hook朋友圈发布钩子新增处理事件,当朋友圈发布成功后(取得$post_id)将会检查上传数组中image_list变量是否存在,如果存在将执行xc_upload_media_ok函数,将所有上传图片进行朋友圈ID关联,并同步到的xc_upload上传数据表。不免因为超时未关联订单号,导致系统任务移除删除图片。
8、当朋友圈发布成功后,将主动触发一个预留钩子:xc_moments_publish_ok_hook,该函数需要传递唯一变量(朋友圈编号ID)。一些特定的回调事件,比如:插件行为接管、计数通知事件等可以通过这个钩子来执行处理。注:这个钩子只负责执行,不负责验证信息,也不进行结果回调。多次执行会重复触发
9、当用户成功发布朋友圈后会通过incr_redis_meta进行今日发布计数+1,计数键名:【day:moments_publish-发布者ID】,计数器会每日00:01自动完成重置清零,这个计数器算用户行为拦截器。朋友圈配置页面可以设定每日朋友圈发布上限(区分会员和非会员)。在发布拦截检测事件中,会检测这个值是否超过限制。如果超过限制则阻止用户发布朋友圈。
10、用户设置中心新增页面:【setting/setting_moments.php】页面唯一标识:setting_moments,短代码地址:[xc_link type=global]/setting/setting_moments.php 用户可以在这个页面对自己的朋友圈做出一些基础设置,比如朋友圈背景图、访问权限、评论权限、我的介绍等
11、优化工单加急状态查询的两个函数count_feedback_audit(统计处于加急工单数量)和xc_feedback_consult_urgent(Api分页请求查询),WP_Query构建查询语法时,会检索工单状态【status】是否不等于ok,如果已完成。则不显示数量或构成查询条件。注:之前有些工单状态回调存在异常,导致已完成的工单,因为未移除audit字段 也会显示在加急列表中。
12、朋友圈设置页新增变量GET传递参数:author_id,访问该页面必须要传递该变量。并且页面支持xc_order_access拦截访问钩子,唯一标识(setting_moments)。如果用户不是【author_id本人、超级管理员】那么将直接拦截对该页面的访问请求。注,考虑到用户隐私的问题,不允许前台管理员设置用户朋友圈。(超级管理员被允许,是为了重置清理朋友圈【违规介绍、违规背景图】。)
13、朋友圈设置页新增两个选项switch开关(关闭我的朋友圈=close_moments、不允许任何评论=close_comment)。关闭朋友圈后,用户所有发布的内容都不可见(用户自己可见,别人打开他(他)的朋友圈直接显示无权限访问)。不允许评论后,所有朋友圈内容任何人都不可以进行评论。这是用户对自己朋友圈的权限隐私设置,属于全局生效(超级管理员,可以接触这个限制)。
14、朋友圈现在会通过onPageBeforeInit进行change监听(close_moments和close_comment)出现状态变化时,会触发ajax请求。携带三个变量(1、input_name(处理类型)2、input_status(开启或关闭)。3、author_id被操作的用户)后端的请求事件为:moments_permission_settings,为了防止用户重复点击,ajax发起后会立即执行myApp.showIndicator动画,当后端有返回在释放动画。
15、新增用户字段:moments_config。通过这个字段记录用户朋友圈设置参数,该字段以数组形式写入。目前集成两个设置(comment=评论权限,布尔值(0或1)此字段为全局配置,如果为1,代表所有朋友圈内容的不允许被人评论)(moments=朋友圈状态。布尔值(0或1),如果为1,代表用户关闭了朋友圈,所有内容不对外开放。)这两个字段目前只能通过(朋友圈功能配置页面进行设置)。
1、redis-object-cache.php对象缓存脚本新增方法:checkRedisConnection,脚本涉及到redis的请求(get、add、update1、delete)操作时,都会提前执行这个静态内置方法。里面集成isConnected检测和ping检测,如果有一个出现异常都会发起重连处理。注:防止性能耗损的问题,该方法目前仅在$GLOBALS['Task_Worker']变量存在时才会执行。
2、xc_push_hook宫论统一消息推送钩子暂时移除asyn异步进程处理逻辑,目前工单反馈的消息推送如果是异步处理会出现滞后甚至丢弃的情况。尝试排查解决,但是这一块的业务逻辑较为复杂 暂无法处理。目前只能做做全局屏蔽处理,后续时间宽松了 在回过头来解决这个问题。已设置为异步推送的,不会进行移除处理,全部自动转同步。
3、修复工单发布页面(历史)红标无法自动消除的问题,正常情况下,用户如果有工单状态等待处理,那么在工单发布页面会有个红点提示 点击进入历史工单页面后,这个红标会自动消除。但实际情况进入工单历史页在返回发布页面该红点仍旧存在,并未主动移除,这对用户的观感有一点不友好,因此页面访问事件做了兼容修复处理。使其访问历史记录后能够正常移除该红点标识。
4、新增朋友圈发布钩子:xc_moments_publish_hook()需要传递发布数组信息(type、content、power、comment、shop、topic_list、image_list),该钩子不进行权限拦截检测,触发即发布。该发布事件执行前,必须先执行xc_moments_publish_check_hook钩子来进行安全检测处理,避免出现非法发布。
5、发布配置页面新增字段:是否开启敏感词检测(xc_publish_restricted_words),开启后如果内容存在违禁词(本地白名单),那么将返回false 对应的发布事件进行拦截处理。这里是全局发布配置开关,目前朋友圈内容发布已接入敏感词检测,性能速度考虑 敏感词检测是通过本地词库来做处理的。处理的函数为:xc_sensitive_words。注:后续所有内容发布(包括藏品、淘货)都必须采用同一套处理方案。
6、新增添加文章的钩子xc_post_add_hook,该函数接受发布者的用户ID和其他参数,包括文章类型、标题、内容和元字段数组。函数首先检查是否提供了文章类型,如果未提供则默认为 "post"。然后,使用提供的参数构建文章数组 $post_data,包括标题、内容、发布者ID和文章类型。接下来,使用 wp_insert_post() 函数插入文章,并将返回的文章ID存储在 $post_id 变量中。如果插入文章成功,则会检查是否提供了元字段数组,并使用 update_comment_meta() 函数更新文章的元字段。最后,函数返回插入的文章ID,如果插入失败,则返回 false。
7、工单发布钩子xc_feedback_publish_hook不在通过wp_insert_post来完成工单发布,而是通过宫论统一发布事件:xc_post_add_hook来完成数据入库。这样可以做到全局内容缓存管理,方便后续维护和操作对象缓存。注:工单的自定义字段没有直接通过发布钩子来完成,而是在发布成功后取得文章ID 手动写入的。
8、统一发布钩子进一步优化,移除$title(文章标题)和$content(文章内容)两个变量,改为publish数组变量,数组内可以选择性填充内容,比如(标题、正文、分类、发布时间、标签)等。这样灵活性更高,更能满足复杂使用场景。同时发布钩子重新命名,新的钩子为:xc_publish_add_hook。这个钩子计划支持所有发布文章类型,不单是朋友圈、工单、更包含非WordPress类型文章(淘货、保真阁)等。
9、朋友圈发布事件会执行xc_publish_add_hook文章发布(moments文章类型),并将以下字段写入到朋友圈自定义字段中。【1、ip:记录发布者的客户端IP地址。2、UA:记录发布者的设备来访信息。3、fingerprint:当前用户的设别指纹标识信息。4、power:朋友圈访问权限。5、comment:该条朋友圈是否被允许评论。6、type:朋友圈的内容类型(image、video、auido)等。7、shop:商品卡片短代码信息(可选)。8、image:朋友圈图片信息(可选)。9、video:朋友圈视频信息(可选)。】
10、朋友圈发布成功后,获得post_id后。会检测发布数组中是否存在topic_list字段,如果存在代表需要写入标签话题。将通过explode切割字段,然后使用foreach遍历执行insert_moments_topic函数,将话题与朋友圈内容进行关联。注:不通过原生方式wp_set_post_terms来插入,是因为朋友圈话题可能不存在,需要创建处理。原生方法虽然也能创建,但是朋友圈话题创建需要经过内部钩子处理,很多字段要初始化。需要通过特地函数来处理!
11、新增文章发布成功回调钩子:xc_publish_ok_hook()post_id发布成功的文章ID或订单号,type发布的类型,用于识别发布类型。当文章发布成功后,将会自动触发这个钩子。可通过这个回调钩子执行一些业务处理,比如刷新缓存,更新文章数据统计,进行内容审查操作等等。
12、新增计数器【publish_文章类型】挂载于:xc_publish_ok_hook钩子,只要通过内容发布成功,自动会进行计数+1处理(发布后删除、延迟或定时发布都会计数+1)注:可以通过get_redis_count($key)获取计数器统计详情,支持查询【总数、今日、昨日、本周、上周、本月、上月、今年、去年】多维度的计数器查询统计。注:该计数器已加入【宫论计数器重置列表】,每天00:01会自动完成重置。【工单反馈原有的计数自增事件,已移除】
13、xc_redis_count计数器函数优化处理,这个函数默认是通过异步进程处理的。如果调用的该函数本身就处于异步进程中,那么会重新发起异步请求,可能造成脚本异常和 性能浪费。故而在执行异步请求时,会判断$GLOBALS['Task_Worker']超全局变量是否可用,如果可用则跳过异步处理逻辑。这个处理判断很重要。后续所有涉及异步进程的函数都必须做这个判断。
14、封装一个@艾特用户转UID的方法函数:xc_aite_uid()$string 包含@用户昵称的字符串,返回包含唯一用户的UID的数组,如果没有结果则返回false。注:这是个同步函数并且使用场景比较多,涉及到数据检索的问题 需要特别注意性能。目前采用的wpdb查询机制,如果用户量上来了,该查询语法出现瓶颈,需要考虑缓存设计。
15、新增通知表:xc_notice 字段包含【my_id=收信用户、user_id=触发用户、post_id=文章或订单号、notice_type=通知类型、status=是否已读(1或者0)、notice_time=通知时间、notice_content=通知消息文本、link=跳转链接、remark=备注信息】该表主要负责(@、回复、喜欢)三个消息通知记录。