wangliang_wd

Merge branch 'main' of http://192.168.1.42/developOne/harmonyPool into main

* 'main' of http://192.168.1.42/developOne/harmonyPool: (23 commits)
  ref |> 阿里播放器设置配置默认开启硬解码
  ref |> 更新最新的H5模板
  fix |> 20784 搜索结果,粗分割线应通道左右两侧,不应留间距,见截图。
  fix:  我的评论列表,点击评论的视频稿件后,偶发不能弹出评论列表
  feat: 20527 【折叠屏】搜索 点击庆祝人民政协成立七十五周年,图片截断了
  fix: 早晚报详情中,语音播报动效,背景色看不清楚,特别是在白色图片上
  fix: 沉浸式视频页,视频的简介超长时,末尾展示的... 颜色需要和简介一致
  feat: 20563 折叠屏没有展开的情况下,查看号主动态稿件详情,关注按钮没有右对齐
  fix: 对电子报进行语音播放,切换到视频频道,视频开始播放后、语音没有暂停
  feat: 19239 功能缺陷 直播跳转
  feat: 20771 搜索结果的4个tab列表以及我的预约列表、意见反馈列表,左右两侧边距,需要修改为16
  ref |> 解决从我的评论列表进入文章或动态后,立即返回时存在潜在崩溃问题
  ref |> 因为友盟SDK打包被混淆,临时关闭wdKit模块混淆
  fix: 沉浸式播放,断网后上滑,视频无法加载和上滑,恢复网络后视频重新播放,无法上滑切换下一个视频
  ref |> 文章详情页复用模板是调用交互接口显示骨架屏
  ref |> 新增设备,更新profile
  fix |> 20764 【网络切换】断网后访问新闻频道,频道展示无网络的默认缺省页,网络恢复后再次访问该频道,频道数据未自动加载,不应一直显示无网络的默认缺省页。
  fix: 横屏视频左侧上下滑动调节屏幕亮度,右侧上下滑动调节音量逻辑优化
  cleanup |> 多余的H5模板资源
  ref |> 文章详情页Web容器复用02
  ...
Showing 49 changed files with 1275 additions and 1592 deletions

Too many changes to show.

To preserve performance only 49 of 49+ files are displayed.

... ... @@ -13,7 +13,7 @@
"arkOptions": {
"obfuscation": {
"ruleOptions": {
"enable": true,
"enable": false,
"files": [
"./obfuscation-rules.txt"
]
... ...
export { WdWebComponent } from './src/main/ets/pages/WdWebComponent'
export { WdWebLocalComponent } from './src/main/ets/pages/WdWebLocalComponent'
\ No newline at end of file
export { WdWebLocalComponent } from './src/main/ets/pages/WdWebLocalComponent'
export { WebEvents, WebNodeController } from './src/main/ets/webPool/WebLocalPool'
export { WebPoolManager } from './src/main/ets/webPool/WebPoolManager'
export { WebArticleEventHandler } from './src/main/ets/webPool/WebArticleEventHandler'
\ No newline at end of file
... ...
... ... @@ -26,6 +26,7 @@ export const enum NativeCallH5Event {
export const enum NativeCallH5Type {
jsCall_receiveAppData = 'jsCall_receiveAppData',
jsCall_appNotifyEvent = 'jsCall_appNotifyEvent',
jsCall_clearAppData = 'jsCall_clearAppData',
// TODO 业务自行新增类型,自行调用,例:
// TODO this.webviewControl.callHandle(NativeCallH5Type.jsCall_receiveAppData,xxxx)
... ...
... ... @@ -9,18 +9,20 @@ import { window } from '@kit.ArkUI';
import { NativeCallH5Type,NativeCallH5Event,eventParams } from './NativeCallH5Type';
import { AudioSuspensionModel } from '../viewmodel/AudioSuspensionModel'
import { BusinessError } from '@kit.BasicServicesKit';
import { WebPoolManager } from '../webPool/WebPoolManager';
import { WebEvents } from '../webPool/WebLocalPool';
const TAG = 'WdWebLocalComponent';
@Component
export struct WdWebLocalComponent {
webPoolTargetId: string = ''
webviewControl: BridgeWebViewControl = new BridgeWebViewControl()
onWebPrepared: () => void = () => {
}
@Prop backVisibility: boolean = false
@Prop webResource: Resource = {} as Resource
@Prop @Watch('onReloadStateChanged') reload: number = 0
@State webHeight: string | number = '100%'
@State webHeight: Length = '100%'
@Link isPageEnd: boolean
@State videoUrl: string = ''
@State positionWidth: number = 0
... ... @@ -75,6 +77,21 @@ export struct WdWebLocalComponent {
}
aboutToAppear(): void {
let eventHandler = WebPoolManager.sharedInstance().getWebEventHandler(this.webPoolTargetId)
if (!eventHandler) {
Logger.error(TAG, '当前target不应拿不到nodeController');
} else {
eventHandler.pageEndBlock = this.onPageEnd.bind(this)
if (eventHandler.pageLoadEnd) {
this.onPageEnd()
// 开始复用
this.startResuse()
}
eventHandler.currentPageOperateBlock = this.currentPageOperate.bind(this)
}
EmitterUtils.receiveEvent(EmitterEventId.AUDIO_CHANGE_STATUS, (status) => {
Logger.debug(TAG, "接收音频播放状态 = " + status);
if (!this.isPause) {
... ... @@ -101,50 +118,7 @@ export struct WdWebLocalComponent {
Row() {
RelativeContainer() {
Web({
src: this.webResource,
controller: this.webviewControl,
renderMode: RenderMode.SYNC_RENDER
})// Web({ src: this.webResource, controller: this.webviewControl })
.backgroundColor(Color.White)
.domStorageAccess(true)
.databaseAccess(true)
.javaScriptAccess(true)
.imageAccess(true)
.mixedMode(MixedMode.All)
.onlineImageAccess(true)
.cacheMode(this.mode)
// .enableNativeEmbedMode(true)
// .layoutMode(WebLayoutMode.FIT_CONTENT)
.nestedScroll({
scrollForward: NestedScrollMode.SELF_FIRST,
scrollBackward: NestedScrollMode.PARENT_FIRST
})
.width('100%')
.height(this.webHeight)
.onPageBegin((event) => {
this.onPageBegin(event?.url);
})
.onPageEnd((event) => {
this.onPageEnd(event?.url)
})
.onLoadIntercept((event) => {
let url: string = event.data.getRequestUrl().toString()
url = url.replace("%(?![0-9a-fA-F]{2})", "%25")
.replace("\\+", "%2B");
url = decodeURIComponent(url)
Logger.debug(TAG, 'Web onLoadIntercept url: ' + url);
if (url.startsWith(BridgeUtil.YY_RETURN_DATA)) {
this.webviewControl.handlerReturnData(url)
return true
}
if (url.startsWith(BridgeUtil.YY_OVERRIDE_SCHEMA)) {
// this.webviewControl.flushMessageQueue()
this.webviewControl.receiveDataFromH5(url)
return true
}
return this.onLoadIntercept(event.data.getRequestUrl().toString());
})
NodeContainer(WebPoolManager.sharedInstance().getWebNodeController(this.webPoolTargetId))
.id('web')
.alignRules({
top: { anchor: "__container__", align: VerticalAlign.Top },
... ... @@ -171,20 +145,6 @@ export struct WdWebLocalComponent {
}
}
private registerHandlers(): void {
// 注册h5调用js相关
for (let i = 0; i < H5CallNativeType.JsCallTypeList.length; i++) {
let handleName = H5CallNativeType.JsCallTypeList[i];
let handle = (data: Message, f: Callback) => {
Logger.debug('registerHandlers handlerName: ' + JSON.stringify(data.data))
this.setCurrentPageOperate8(data)
this.setCurrentPageOperate9(data)
this.defaultPerformJSCallNative(data, f)
};
this.webviewControl.registerHandler(handleName, { handle: handle });
}
}
//webview 高度设置
private setCurrentPageOperate8: (data: Message) => void = (data) => {
... ... @@ -198,20 +158,22 @@ export struct WdWebLocalComponent {
{
this.webHeight = Number(data?.data?.webViewHeight) || '100%'
}
WebPoolManager.sharedInstance().getWebNodeController(this.webPoolTargetId)?.updateWebHeight(this.webHeight)
}
}
// 暂停音频悬浮窗
pauseAudioCom() {
// 判断当前窗口是否已显示,使用callback异步回调。
this.AudioSuspension.floatWindowClass.get().isShowing((err: BusinessError, data) => {
const errCode: number = err.code;
if (errCode) {
return;
}
try {
let data = this.AudioSuspension.floatWindowClass.get().isWindowShowing();
// console.info(TAG, 'window is showing: ' + data);
if(data) {
this.AudioSuspension.playerController.get()?.pause();
}
});
} catch (exception) {
console.error(TAG, `Failed to check whether the window is showing. Cause code: ${exception.code}, message: ${exception.message}`);
}
}
//播放视频
private setCurrentPageOperate9: (data: Message) => void = (data) => {
... ... @@ -228,29 +190,18 @@ export struct WdWebLocalComponent {
/**
* 默认【CallNative】逻辑处理
*/
private defaultPerformJSCallNative: (data: Message, f: Callback) => void = (data: Message, f: Callback) => {
private currentPageOperate: (data: Message, f: Callback) => void = (data: Message, f: Callback) => {
this.setCurrentPageOperate8(data)
this.setCurrentPageOperate9(data)
performJSCallNative(data, f)
}
onPageBegin: (url?: string) => void = () => {
Logger.debug(TAG, 'onPageBegin');
this.registerHandlers();
//有时序问题 必须延时执行
setTimeout(() => {
BridgeUtil.webViewLoadLocalJs(getContext(this), this.webviewControl)
}, 200)
}
onPageEnd: (url?: string) => void = () => {
Logger.debug(TAG, 'onPageEnd');
this.onWebPrepared()
this.isPageEnd = true
}
onLoadIntercept: (url?: string) => boolean = () => {
Logger.debug(TAG, 'onLoadIntercept return false');
return false
}
onReloadStateChanged() {
Logger.info(TAG, `onReloadStateChanged:::refresh, this.reload: ${this.reload}`);
if (this.reload > 0) {
... ... @@ -258,6 +209,14 @@ export struct WdWebLocalComponent {
}
}
startResuse() {
let params = {'event':NativeCallH5Event.NativeCallH5EventStartLoadingOnReuse} as eventParams;
let jsonString = JSON.stringify(params);
this.webviewControl.callHandle(NativeCallH5Type.jsCall_appNotifyEvent, jsonString, (data: string) => {
Logger.debug(TAG, "开始复用,H5回调" + data);
})
}
startPlay() {
this.cancelProgressTimer()
this.controller.start()
... ...
import { BridgeUtil, BridgeWebViewControl, Callback } from "wdJsBridge";
import { Message } from "wdJsBridge/src/main/ets/bean/Message";
import { Logger } from "wdKit";
import { H5CallNativeType } from "../pages/H5CallNativeType";
import { NativeCallH5Type } from "../pages/NativeCallH5Type";
import { WebEvents } from "./WebLocalPool";
const TAG = 'WebArticleEventHandler'
export class WebArticleEventHandler implements WebEvents {
webviewControl?: BridgeWebViewControl
pageLoadEnd: boolean = false
pageEndBlock?:(event: OnPageEndEvent) => void
currentPageOperateBlock?: (data: Message, f: Callback) => void
constructor(webviewControl: BridgeWebViewControl) {
this.webviewControl = webviewControl
}
//MARK: ----
onPrepareForReuse(): boolean {
if (!this.webviewControl || this.pageLoadEnd == false) {
return false
}
this.webviewControl?.callHandle(NativeCallH5Type.jsCall_clearAppData, '', (data) => {
})
return true
}
onPageBegin(event: OnPageBeginEvent): void {
Logger.debug(TAG, 'onPageBegin');
this.registerHandlers();
//有时序问题 必须延时执行
setTimeout(() => {
BridgeUtil.webViewLoadLocalJs(getContext(this), this.webviewControl!)
}, 200)
}
onPageEnd(event: OnPageEndEvent): void {
Logger.debug(TAG, 'onPageEnd');
this.pageLoadEnd = true
if (this.pageEndBlock) {
this.pageEndBlock(event)
}
}
onLoadIntercept(event: OnLoadInterceptEvent): boolean {
let url: string = event.data.getRequestUrl().toString()
url = url.replace("%(?![0-9a-fA-F]{2})", "%25")
.replace("\\+", "%2B");
url = decodeURIComponent(url)
Logger.debug(TAG, 'Web onLoadIntercept url: ' + url);
if (url.startsWith(BridgeUtil.YY_RETURN_DATA)) {
this.webviewControl?.handlerReturnData(url)
return true
}
if (url.startsWith(BridgeUtil.YY_OVERRIDE_SCHEMA)) {
// this.webviewControl.flushMessageQueue()
this.webviewControl?.receiveDataFromH5(url)
return true
}
return false;
}
private registerHandlers(): void {
// 注册h5调用js相关
for (let i = 0; i < H5CallNativeType.JsCallTypeList.length; i++) {
let handleName = H5CallNativeType.JsCallTypeList[i];
let handle = (data: Message, f: Callback) => {
Logger.debug('registerHandlers handlerName: ' + JSON.stringify(data.data))
if (this.currentPageOperateBlock) {
this.currentPageOperateBlock(data, f)
}
};
this.webviewControl?.registerHandler(handleName, { handle: handle });
}
}
}
\ No newline at end of file
... ...
import { UIContext } from '@ohos.arkui.UIContext';
import { NodeController, BuilderNode, FrameNode } from '@ohos.arkui.node';
import { BusinessError } from '@ohos.base';
import { WebNetErrorList } from '@ohos.web.netErrorList';
import { Logger } from 'wdKit';
// @Builder中为动态组件的具体组件内容
// WebViewPoolData为入参封装类
class WebViewPoolData {
target: string = ''
webOption: WebOptions = { } as WebOptions
webEvents?: WebEvents = undefined
webHeight: Length = 0
constructor(webOption: WebOptions, target: string, webHeight: Length, webEvent?:WebEvents) {
this.webOption = webOption
this.webEvents = webEvent
this.target = target
this.webHeight = webHeight
}
}
const TAG = 'WebViewPool';
// 影响web组件加载的网络错误码
class webLoadFail {
static ERR_TIMED_OUT = WebNetErrorList.ERR_TIMED_OUT;
static ERR_NETWORK_CHANGED = WebNetErrorList.ERR_NETWORK_CHANGED;
}
// 不需要重试刷新的网络错误码
class excludeRetryLoad {
static ERR_FAILED = WebNetErrorList.ERR_FAILED;
}
function isErrorCode(code: string) {
return Object.keys(webLoadFail).includes(code);
}
@Component
export struct DynamicWebView {
target: string = '';
private webOption: WebOptions = { } as WebOptions
private webEvents?: WebEvents = undefined
@Prop webHeight: Length
aboutToAppear(): void {
}
build() {
Row() {
Web(this.webOption)
.backgroundColor(Color.White)
.domStorageAccess(true)
.databaseAccess(true)
.javaScriptAccess(true)
.imageAccess(true)
.mixedMode(MixedMode.All)
.onlineImageAccess(true)
.nestedScroll({
scrollForward: NestedScrollMode.SELF_FIRST,
scrollBackward: NestedScrollMode.PARENT_FIRST
})
.width('100%')
.height('100%')
.onPageBegin((event) => {
this.webEvents?.onPageBegin(event)
})
.onPageEnd((event) => {
this.webEvents?.onPageEnd(event)
})
.onLoadIntercept((event) => {
if (!this.webEvents) {
return false
}
return this.webEvents?.onLoadIntercept(event);
})
}.width('100%')
.height(this.webHeight)
}
}
@Builder
export function webBuilder(data: WebViewPoolData) {
DynamicWebView({
webOption: data.webOption,
target: data.target,
webEvents: data.webEvents,
webHeight: data.webHeight
})
}
export class WebNodeController extends NodeController {
private rootNode: BuilderNode<[WebViewPoolData]> | null = null;
public webOption: WebOptions = { } as WebOptions
public webEvents?: WebEvents = undefined
private webHeight: Length = 0
private target: string = '';
public webNodeInTree:boolean = false;
constructor(webOption: WebOptions, target: string, webHeight: Length, webEvent?:WebEvents) {
super();
this.webOption = webOption
this.webEvents = webEvent
this.target = target
this.webHeight = webHeight
}
aboutToAppear(): void {
this.webNodeInTree = true;
Logger.debug(TAG, `WebNodeController aboutToAppear target: ${this.target} ==> url:${this.webOption.src.toString()}`);
}
aboutToDisappear(): void {
try {
this.webNodeInTree = false;
// 下树时给commonWebView加载空白页面
// if (!getNWeb(this.target)) {
// this.webOption.controller?.loadData(
// "<html><body bgcolor=\"#18181A\"></body></html>",
// "text/html",
// "UTF-8"
// );
// }
Logger.debug(TAG, `WebNodeController aboutToDisappear target: ${this.target} ==> url:${this.webOption.src.toString()}`);
} catch (error) {
Logger.error(TAG,`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`);
}
}
makeNode(context: UIContext): FrameNode | null {
if (!context) {
Logger.error(TAG, " uicontext is undifined : " + (context === undefined));
}
if (this.rootNode != null) {
// 返回FrameNode节点
return this.rootNode.getFrameNode();
}
// 返回null控制动态组件脱离绑定节点
return null;
}
// 此函数为自定义函数,可作为初始化函数使用
// 通过UIContext初始化BuilderNode,再通过BuilderNode中的build接口初始化@Builder中的内容
initWeb(uiContext: UIContext) {
if (this.rootNode != null) {
return;
}
this.rootNode = new BuilderNode(uiContext);
this.rootNode.build(wrapBuilder<[WebViewPoolData]>(webBuilder),
new WebViewPoolData(this.webOption, this.target, this.webHeight, this.webEvents));
}
prepareForReuse(): boolean | undefined {
return this.webEvents?.onPrepareForReuse()
}
destoryWeb() {
this.rootNode?.dispose()
this.rootNode = null
}
updateWebHeight(webHeight: Length) {
try {
if (this.rootNode !== null) {
this.webHeight = webHeight
this.rootNode.update(new WebViewPoolData(this.webOption, this.target, this.webHeight, this.webEvents));
}
} catch (err) {
Logger.warn(TAG, `commonWebView update error : ${err}`);
}
}
updateWebEvents(webEvent: WebEvents) {
try {
if (this.rootNode !== null) {
this.webEvents = webEvent
this.rootNode.update(new WebViewPoolData(this.webOption, this.target, this.webHeight, this.webEvents));
}
} catch (err) {
Logger.warn(TAG, `commonWebView update error : ${err}`);
}
}
}
export interface WebEvents {
onPrepareForReuse(): boolean
onPageBegin(event: OnPageBeginEvent): void;
onPageEnd(event: OnPageEndEvent): void;
onLoadIntercept(event: OnLoadInterceptEvent): boolean;
}
// 创建Map保存所需要的NodeController
const nodeMap: Map<string, WebNodeControllerInfo> = new Map();
// NodeController内容和创建时间戳
class WebNodeControllerInfo {
webNodeController?: WebNodeController;
createTime: number = 0;
constructor(webNodeController: WebNodeController, createTime: number) {
this.webNodeController = webNodeController;
this.createTime = createTime;
}
}
// 自定义获取NodeController接口
export const getPoolWebNodeController = (target: string): WebNodeController | undefined => {
return nodeMap.get(target)?.webNodeController;
}
// 自定义获取WebviewController接口
export const getPoolWebController = (target: string): WebviewController | undefined => {
return nodeMap.get(target)?.webNodeController?.webOption.controller as WebviewController;
}
// 初始化需要UIContext 需在Ability获取
export const createReuseableWeb = (uiContext: UIContext, webOption: WebOptions, target: string, webHeight: Length, webEvent?:WebEvents) => {
// 创建NodeController
let baseNode = new WebNodeController(webOption, target, webHeight, webEvent);
// 初始化自定义Web组件
baseNode.initWeb(uiContext);
nodeMap.set(target, new WebNodeControllerInfo(baseNode, Date.now()));
}
export const destoryReuseableWeb = (target: string) => {
if (nodeMap.get(target)) {
getPoolWebNodeController(target)?.destoryWeb()
nodeMap.delete(target)
}
}
\ No newline at end of file
... ...
import { BridgeWebViewControl } from "wdJsBridge"
import { AppUtils } from "wdKit"
import { createReuseableWeb, destoryReuseableWeb, getPoolWebNodeController, WebNodeController } from "./WebLocalPool"
import { util } from "@kit.ArkTS"
import { WebArticleEventHandler } from "./WebArticleEventHandler"
interface ArticleWebInterface {
uiContext: UIContext,
webSrc: string | Resource,
webController: BridgeWebViewControl
webArticleEventHandler: WebArticleEventHandler
}
const MAX_POOL_COUNT = 2
export class WebPoolManager {
private webTargets: string[] = []
private constructor() {
}
private static manager: WebPoolManager
static sharedInstance() : WebPoolManager {
if (!WebPoolManager.manager) {
WebPoolManager.manager = new WebPoolManager()
}
return WebPoolManager.manager
}
createArticleWeb(param: ArticleWebInterface, taking?: boolean) : string {
let target = util.generateRandomUUID()
createReuseableWeb(param.uiContext,
{src: param.webSrc, controller: param.webController, renderMode: RenderMode.SYNC_RENDER},
target,
800,
param.webArticleEventHandler
)
if (taking != true && this.webTargets.length < MAX_POOL_COUNT) {
this.webTargets.push(target)
}
return target
}
// 取一个可用的target,不存在则根据参数创建
// 当使用完成,需要调用recycleTarget()
takeAvaiableArticleWebTarget(param: ArticleWebInterface): string {
if (this.webTargets.length) {
let target = this.webTargets.splice(0, 1).pop()!
// 当pool里没有缓存,主动提前加载一个
if (this.webTargets.length == 0) {
setTimeout(() => {
this.createArticleWeb(param)
}, 500)
}
return target
}
return this.createArticleWeb(param, true)
}
// 回收target
recycleTarget(target: string) {
let nodeController = getPoolWebNodeController(target)
if (!nodeController) {
let index = this.webTargets.indexOf(target)
if (index >= 0) {
this.webTargets.splice(index, 1)
}
return
}
if (this.webTargets.length < MAX_POOL_COUNT) {
if (nodeController.prepareForReuse() == true) {
this.webTargets.push(target)
return
}
}
this.destoryTarget(target)
}
// 撤底销毁
destoryTarget(target: string) {
destoryReuseableWeb(target)
let index = this.webTargets.indexOf(target)
if (index >= 0) {
this.webTargets.splice(index, 1)
}
}
getWebNodeController(target: string) : WebNodeController | undefined {
return getPoolWebNodeController(target)
}
getWebController(target: string) : BridgeWebViewControl | undefined {
return getPoolWebNodeController(target)?.webOption.controller as BridgeWebViewControl
}
getWebEventHandler(target: string) : WebArticleEventHandler | undefined {
return getPoolWebNodeController(target)?.webEvents as WebArticleEventHandler
}
}
\ No newline at end of file
... ...
... ... @@ -111,4 +111,6 @@ export { GrayManageModel } from './src/main/ets/viewmodel/GrayManageModel'
export { VoiceInputView } from './src/main/ets/components/comment/view/VoiceInputView'
export { ComponentModule } from './src/main/ets/ComponentModule'
// export {voicese}
\ No newline at end of file
... ...
import { BridgeUtil, BridgeWebViewControl } from "wdJsBridge";
import { WebArticleEventHandler, WebPoolManager } from "wdWebComponent";
export class ComponentModule {
static preInitArticleWebTemplate(context: UIContext) {
let webviewControl = new BridgeWebViewControl()
WebPoolManager.sharedInstance().createArticleWeb({
uiContext: context,
webSrc: $rawfile("apph5/index.html"),
webController: webviewControl,
webArticleEventHandler: new WebArticleEventHandler(webviewControl)
})
}
}
\ No newline at end of file
... ...
... ... @@ -129,7 +129,11 @@ export struct DynamicDetailComponent {
})
}
aboutToDisappear() {
if (this.lastTimeoutId) {
clearTimeout(this.lastTimeoutId)
}
this.viewBlogInsightIntentShare()
}
... ... @@ -171,11 +175,13 @@ export struct DynamicDetailComponent {
color: '#0D000000', // 5% 透明度的黑色
style: BorderStyle.Solid
})
Image(this.contentDetailData.rmhInfo?.honoraryIcon)
.width($r('app.float.margin_48'))
.height($r('app.float.margin_48'))
.objectFit(ImageFit.Cover)
.borderRadius($r('app.float.margin_24'))
if (!!this.contentDetailData.rmhInfo?.honoraryIcon) {
Image(this.contentDetailData.rmhInfo?.honoraryIcon)
.width($r('app.float.margin_48'))
.height($r('app.float.margin_48'))
.objectFit(ImageFit.Cover)
.borderRadius($r('app.float.margin_24'))
}
if (!StringUtils.isEmpty(this.contentDetailData.rmhInfo?.authIcon)) {
Stack() {
Image(this.contentDetailData.rmhInfo?.authIcon)
... ... @@ -188,8 +194,8 @@ export struct DynamicDetailComponent {
.alignContent(Alignment.BottomEnd)
}
}
.width($r('app.float.margin_48'))
.height($r('app.float.margin_48'))
.width(!!this.contentDetailData.rmhInfo?.honoraryIcon ? $r('app.float.margin_48') : $r('app.float.margin_36'))
.height(!!this.contentDetailData.rmhInfo?.honoraryIcon ? $r('app.float.margin_48') : $r('app.float.margin_36'))
.alignContent(Alignment.Center)
.onClick(async () => {
let retvalue = await FastClickUtil.isMinDelayTime()
... ... @@ -199,6 +205,7 @@ export struct DynamicDetailComponent {
ProcessUtils.gotoPeopleShipHomePage(this.contentDetailData.rmhInfo == null ? "" :
this.contentDetailData.rmhInfo.rmhId)
})
.margin({right: 6})
Column() {
//昵称
... ... @@ -225,8 +232,6 @@ export struct DynamicDetailComponent {
.height(14)
.lineHeight(14)
}
.width('70%')
.margin({ right: $r('app.float.margin_6') })
Blank()
if ((this.contentDetailData.rmhPlatform == 1 && this.contentDetailData?.rmhInfo?.userType != "5") && !StringUtils.isEmpty(this.followStatus)) {
... ... @@ -274,10 +279,13 @@ export struct DynamicDetailComponent {
})
}
}
}.padding({
left: $r('app.float.vp_16')
, right: $r('app.float.vp_16')
}).width('100%')
}
.margin({
left: $r('app.float.vp_16'),
right: $r('app.float.vp_16')
})
.width('calc(100% - 32vp)')
//标题
Text(this.titleText())
.fontColor($r('app.color.color_222222'))
... ... @@ -640,7 +648,9 @@ export struct DynamicDetailComponent {
}
.width(CommonConstants.FULL_WIDTH)
.height(CommonConstants.FULL_HEIGHT)
.padding({ bottom: 100 })
.padding({
bottom: 100,
})
.scrollBar(BarState.Off)
.alignSelf(ItemAlign.Start)
}
... ... @@ -674,7 +684,7 @@ export struct DynamicDetailComponent {
.height(100)
}
.margin({bottom: 65})
.margin({bottom: 65, top: 10})
}
.alignSelf(ItemAlign.Start)
.backgroundColor('#FFFFFFFF')
... ...
... ... @@ -75,65 +75,71 @@ export struct FeedBackActivity {
Stack({ alignContent: Alignment.Bottom }) {
Scroll(this.scroller) {
Column() {
Text($r('app.string.feedback_opinion_type'))
.fontColor($r('app.color.color_222222'))
.fontSize($r('app.float.font_size_14_5'))
.fontWeight(600)
.width('100%')
.margin({ left: 24, top: $r('app.float.vp_14') })
Blank()
.height(0.5)
.width('94%')
.margin({ top: $r('app.float.vp_12') })
.backgroundColor($r('app.color.color_EDEDED'))
GridRow({
columns:3,
}) {
ForEach(this.feedbackTypeBeans, (feedbackTypeBean: FeedbackTypeBean, index: number) => {
GridCol({
}) {
Row(){
Image(feedbackTypeBean.isSelect ? $r('app.media.checkbox_true') : $r('app.media.checkbox_false'))
.width(17)
.height(17)
Text(feedbackTypeBean.classifyName)
.fontColor($r('app.color.color_222222'))
.fontSize($r('app.float.font_size_14'))
.margin({ left: $r('app.float.vp_4') })
}
.width($r('app.float.margin_115'))
.height($r('app.float.vp_22'))
.margin({bottom:$r('app.float.margin_16')})
.backgroundColor($r('app.color.color_fff'))
.onClick(() => {
let temp = {} as FeedbackTypeBean
temp.id = feedbackTypeBean.id
temp.classifyName = feedbackTypeBean.classifyName
if(feedbackTypeBean.isSelect){
temp.isSelect = false
}else{
temp.isSelect = true
Column() {
Text($r('app.string.feedback_opinion_type'))
.fontColor($r('app.color.color_222222'))
.fontSize($r('app.float.font_size_14_5'))
.fontWeight(600)
.width('100%')
.margin({ left: 24, top: $r('app.float.vp_14') })
Blank()
.height(0.5)
.width('94%')
.margin({ top: $r('app.float.vp_12') })
.backgroundColor($r('app.color.color_EDEDED'))
GridRow({
columns: 3,
}) {
ForEach(this.feedbackTypeBeans, (feedbackTypeBean: FeedbackTypeBean, index: number) => {
GridCol({}) {
Row() {
Image(feedbackTypeBean.isSelect ? $r('app.media.checkbox_true') : $r('app.media.checkbox_false'))
.width(17)
.height(17)
Text(feedbackTypeBean.classifyName)
.fontColor($r('app.color.color_222222'))
.fontSize($r('app.float.font_size_14'))
.margin({ left: $r('app.float.vp_4') })
}
this.feedbackTypeBeans[index] = temp
this.canSubmit = this.checkSubmit()
TrackingButton.click('submit_feedback',TrackConstants.PageName.FeedbackPage,TrackConstants.PageName.FeedbackPage,{
'feedback_type':feedbackTypeBean.id+''
.width($r('app.float.margin_115'))
.height($r('app.float.vp_22'))
.margin({ bottom: $r('app.float.margin_16') })
.backgroundColor($r('app.color.color_fff'))
.onClick(() => {
let temp = {} as FeedbackTypeBean
temp.id = feedbackTypeBean.id
temp.classifyName = feedbackTypeBean.classifyName
if (feedbackTypeBean.isSelect) {
temp.isSelect = false
} else {
temp.isSelect = true
}
this.feedbackTypeBeans[index] = temp
this.canSubmit = this.checkSubmit()
TrackingButton.click('submit_feedback', TrackConstants.PageName.FeedbackPage,
TrackConstants.PageName.FeedbackPage, {
'feedback_type': feedbackTypeBean.id + ''
})
})
})
}
})
}
})
}
.width('90%')
.margin({ top: $r('app.float.vp_16') })
}
.width('90%')
.margin({top:$r('app.float.vp_16')})
.padding({left: 6, right: 6})
Blank()
.height($r('app.float.margin_5'))
.backgroundColor($r('app.color.color_F5F5F5'))
Text($r('app.string.feedback_opinion_tv'))
.fontColor($r('app.color.color_222222'))
.fontSize($r('app.float.font_size_14_5'))
.fontWeight(600)
.width(CommonConstants.FULL_WIDTH)
.margin({ left: 24, top: $r('app.float.vp_12') })
Column() {
Text($r('app.string.feedback_opinion_tv'))
.fontColor($r('app.color.color_222222'))
.fontSize($r('app.float.font_size_14_5'))
.fontWeight(600)
.width(CommonConstants.FULL_WIDTH)
.margin({ left: 24, top: $r('app.float.vp_12') })
Stack({ alignContent: Alignment.BottomEnd }) {
TextArea({ placeholder: $r('app.string.feedback_comments'),text: this.editValue.classifyName})
.width(CommonConstants.FULL_WIDTH)
... ... @@ -158,7 +164,7 @@ export struct FeedBackActivity {
}
// Logger.debug(TAG, "onChange " + value)
this.textNumLabel = value.length
this.canSubmit = this.checkSubmit()
this.canSubmit = this.checkSubmit()
})
GridRow({
columns:5,
... ... @@ -231,8 +237,8 @@ export struct FeedBackActivity {
}
}
}
.margin({bottom: $r('app.float.vp_12'), right: $r('app.float.vp_11')})
.fontSize($r('app.float.font_size_13_5'))
.margin({bottom: $r('app.float.vp_12'), right: $r('app.float.vp_11')})
.fontSize($r('app.float.font_size_13_5'))
}
.height(200)
.width('94%')
... ... @@ -243,52 +249,54 @@ export struct FeedBackActivity {
Text($r('app.string.feedback_email'))
.fontColor($r('app.color.color_222222'))
.fontSize($r('app.float.font_size_13_2'))
.width('94%')
.margin({ top: $r('app.float.margin_24') })
Row() {
Blank().width('3%')
Text($r('app.string.feedback_mail'))
.height(CommonConstants.FULL_HEIGHT)
Text($r('app.string.feedback_email'))
.fontColor($r('app.color.color_222222'))
.fontSize($r('app.float.font_size_13_2'))
.fontWeight(600)
.padding({left: $r('app.float.margin_12') })
.backgroundColor($r('app.color.color_F5F5F5'))
.borderRadius({
topLeft: 4,
topRight: 0,
bottomLeft: 4,
bottomRight: 0,
})
.width('94%')
.margin({ top: $r('app.float.margin_24') })
TextInput({ placeholder: $r('app.string.feedback_hideemail') })
.width(0)
.layoutWeight(1)
.height(CommonConstants.FULL_HEIGHT)
.fontColor($r('app.color.color_222222'))
.fontSize($r('app.float.font_size_13_2'))
.placeholderColor($r('app.color.color_CCCCCC'))
.placeholderFont({size:$r('app.float.font_size_13_2')})
.backgroundColor($r('app.color.color_F5F5F5'))
.borderRadius({
topLeft: 0,
topRight: 4,
bottomLeft: 0,
bottomRight: 4,
})
.onChange((value) => {
this.email = value
})
Blank().width('3%')
Row() {
Blank().width('3%')
Text($r('app.string.feedback_mail'))
.height(CommonConstants.FULL_HEIGHT)
.fontColor($r('app.color.color_222222'))
.fontSize($r('app.float.font_size_13_2'))
.fontWeight(600)
.padding({left: $r('app.float.margin_12') })
.backgroundColor($r('app.color.color_F5F5F5'))
.borderRadius({
topLeft: 4,
topRight: 0,
bottomLeft: 4,
bottomRight: 0,
})
TextInput({ placeholder: $r('app.string.feedback_hideemail') })
.width(0)
.layoutWeight(1)
.height(CommonConstants.FULL_HEIGHT)
.fontColor($r('app.color.color_222222'))
.fontSize($r('app.float.font_size_13_2'))
.placeholderColor($r('app.color.color_CCCCCC'))
.placeholderFont({size:$r('app.float.font_size_13_2')})
.backgroundColor($r('app.color.color_F5F5F5'))
.borderRadius({
topLeft: 0,
topRight: 4,
bottomLeft: 0,
bottomRight: 4,
})
.onChange((value) => {
this.email = value
})
Blank().width('3%')
}
.height(42)
.width(CommonConstants.FULL_WIDTH)
.margin({top: $r('app.float.margin_16')})
Blank().layoutWeight(1)
}
.height(42)
.width(CommonConstants.FULL_WIDTH)
.margin({top: $r('app.float.margin_16')})
Blank().layoutWeight(1)
.padding({left: 6, right: 6})
}
}
.width(CommonConstants.FULL_WIDTH)
... ... @@ -313,6 +321,7 @@ export struct FeedBackActivity {
})
.margin({ bottom: 64+64+15 })
}
.padding({left: 6, right: 6})
}
}
.backgroundColor($r('app.color.color_fff'))
... ...
... ... @@ -558,6 +558,9 @@ export struct ImageAndTextPageComponent {
}
aboutToDisappear() {
if (this.lastTimeoutId) {
clearTimeout(this.lastTimeoutId)
}
//意图上报
this.viewBlogInsightIntentShare()
}
... ...
... ... @@ -8,7 +8,7 @@ import {
} from 'wdBean';
import { Logger, SPHelper, NetworkUtil, DisplayUtils } from 'wdKit';
import { SpConstants } from 'wdConstant';
import { WdWebLocalComponent } from 'wdWebComponent';
import { WdWebLocalComponent, WebArticleEventHandler, WebPoolManager } from 'wdWebComponent';
import { NativeCallH5Type } from 'wdWebComponent/src/main/ets/pages/NativeCallH5Type';
import { BridgeWebViewControl } from 'wdJsBridge/Index';
... ... @@ -19,6 +19,7 @@ export struct ImageAndTextWebComponent {
@State reload: number = 0;
@Link isPageEnd: boolean
@Prop @Watch('onDetailDataUpdated') contentDetailData: ContentDetailDTO [] = [] as ContentDetailDTO []
webPoolTargetId: string = ''
webviewControl: BridgeWebViewControl = new BridgeWebViewControl()
private h5ReceiveAppData: H5ReceiveDetailBean = { dataSource: '2' } as H5ReceiveDetailBean
private webPrepared = false;
... ... @@ -95,14 +96,27 @@ export struct ImageAndTextWebComponent {
aboutToAppear(): void {
Logger.debug(TAG, 'H5模板加载控件 aboutToAppear');
this.webPoolTargetId = WebPoolManager.sharedInstance().takeAvaiableArticleWebTarget({
uiContext: this.getUIContext(),
webSrc: $rawfile("apph5/index.html"),
webController: this.webviewControl,
webArticleEventHandler: new WebArticleEventHandler(this.webviewControl)
})
this.webviewControl = WebPoolManager.sharedInstance().getWebController(this.webPoolTargetId)!
}
aboutToDisappear(): void {
Logger.debug(TAG, 'H5模板加载控件 aboutToDisappear');
WebPoolManager.sharedInstance().recycleTarget(this.webPoolTargetId)
}
build() {
Column() {
WdWebLocalComponent({
webPoolTargetId: this.webPoolTargetId,
webviewControl: this.webviewControl,
reload:this.reload,
webResource: $rawfile('apph5/index.html'),
backVisibility: false,
onWebPrepared: this.onWebPrepared.bind(this),
isPageEnd: $isPageEnd
... ...
... ... @@ -34,7 +34,7 @@ export struct Card19Component {
}
titleInit() {
const titleInitRes:titleInitRes = SearchShowRed.titleInit(this.contentDTO.title);
const titleInitRes:titleInitRes = SearchShowRed.titleInit(this.contentDTO.title || this.contentDTO.newsTitle);
this.titleMarked = titleInitRes.titleMarked;
this.textArr = titleInitRes.textArr;
}
... ... @@ -52,8 +52,9 @@ export struct Card19Component {
pageName: this.pageName,
isPeopleShipHome:this.isPeopleShipHome, loadImg: this.loadImg
}
) // 标题
if (this.contentDTO.newsTitle) {
)
// 标题
if (this.contentDTO.title || this.contentDTO.newsTitle ) {
Text() {
if (this.titleMarked) {
ForEach(this.textArr, (textItem: textItem) => {
... ... @@ -292,9 +293,7 @@ struct createImg {
.backgroundColor(0xf5f5f5)
// .aspectRatio(this.onePicW > this.onePicH ? 343 / 198 : 228 / 305)
.width('100%')
.constraintSize({
maxHeight: this.onePicW > this.onePicH ? 198 : 305
})
.aspectRatio(this.onePicW / this.onePicH < 1.5 ? 343 / 198 : 343 / 305)
.autoResize(true)
.borderRadius(this.caclImageRadius(index))
.borderStyle(BorderStyle.Solid)
... ...
... ... @@ -23,48 +23,60 @@ export struct MoreComponent {
build() {
if (this.showDetail) {
ForEach(this.contentDTO.sameContentList, (item: ContentDTO, index: number) => {
if (item.appStyle !== "9") {
CardParser({compDTO:new CompDTO, contentDTO: item })
} else {
Column(){
Card9Component({ compDTO: new CompDTO, contentDTO:item, pageId: "", pageName: "" })
Divider()
.width('100%')
.color($r('app.color.color_F5F5F5'))
.strokeWidth(4)
Column(){
ForEach(this.contentDTO.sameContentList, (item: ContentDTO, index: number) => {
if (item.appStyle !== "9") {
CardParser({compDTO:new CompDTO, contentDTO: item ,isNeedDivider:index === this.contentDTO.sameContentList.length -1 ? false:true})
.padding({left: 6, right: 6})
} else {
Column(){
Card9Component({ compDTO: new CompDTO, contentDTO:item, pageId: "", pageName: "" })
if(index != this.contentDTO.sameContentList.length -1){
Divider()
.width('100%')
.color($r('app.color.color_F5F5F5'))
.strokeWidth(4)
}
}
.padding({left: 6, right: 6})
}
}
})
} else {
Column() {
Row() {
Text('点击展开更多相似')
.fontSize(16)
Text(`(${this.contentDTO.sameContentListSize})`)
.fontSize(16)
Image($r('app.media.comment_unfold'))
.width(16)
.height(16)
}
.justifyContent(FlexAlign.Center)
.width('100%')
.height(48)
.backgroundColor(0xffffff)
.onClick(() => {
this.showDetail = true;
})
Divider()
.width('100%')
.width('100%' )
.color($r('app.color.color_F5F5F5'))
.strokeWidth(5)
}
} else {
Column(){
Column() {
Row() {
Text('点击展开更多相似')
.fontSize(16)
Text(`(${this.contentDTO.sameContentListSize})`)
.fontSize(16)
Image($r('app.media.comment_unfold'))
.width(16)
.height(16)
}
.justifyContent(FlexAlign.Center)
.width('100%')
.height(48)
.backgroundColor(0xffffff)
.onClick(() => {
this.showDetail = true;
})
}
.padding({left: 10 + 6 , right: 10 + 6})
}
Divider()
.width('100%' )
.color($r('app.color.color_F5F5F5'))
.strokeWidth(5)
}
... ... @@ -72,6 +84,11 @@ export struct MoreComponent {
}
dealSearchSameList() {
//来回返回,会重新触发 dealSearchSameList,如果已经获取过 sameList 不再重新获取
if(this.contentDTO.sameContentList.length > 0){
return
}
let resultData : SearchDescription[] = JSON.parse(this.contentDTO.sameContentListJson) as SearchDescription[]
let data: contentListParams = {
... ...
... ... @@ -140,7 +140,7 @@ export struct AppointmentListUI {
.cachedCount(4)
.scrollBar(BarState.Off)
.edgeEffect(EdgeEffect.None)
.margin({ top: 4, left: 12, right: 12})
.margin({ top: 4, left: 16, right: 16})
.layoutWeight(1)
}
... ...
import { BottomNavi, CommonConstants, ViewType } from 'wdConstant';
import { EmitterEventId, EmitterUtils, Logger, NetworkUtil } from 'wdKit';
import { EmptyComponent } from '../view/EmptyComponent';
import { EmptyComponent, WDViewDefaultType } from '../view/EmptyComponent';
import PageModel from '../../viewmodel/PageModel';
import { autoRefresh, onActionEnd, onActionStart, onActionUpdate } from '../../utils/PullDownRefresh';
import LoadMoreLayout from './LoadMoreLayout';
... ... @@ -317,6 +317,11 @@ export struct PageComponent {
// console.log(TAG, 'page onAutoRefresh111 ' + this.needload)
if (this.needload) {
this.getData();
}else{
let netStatus = NetworkUtil.isNetConnected()
if(this.pageModel.emptyType === WDViewDefaultType.WDViewDefaultType_NoNetwork && netStatus ){
this.onAutoRefresh()
}
}
this.needload = false;
}
... ...
... ... @@ -24,9 +24,9 @@ export struct SearchHotsComponent{
}
}).catch((err:Error)=>{
console.log(TAG,JSON.stringify(err))
if(this.searchHotsData.length === 0){
this.searchHotsData.push(new SearchHotContentItem("二十大",0,1))
}
// if(this.searchHotsData.length === 0){
// this.searchHotsData.push(new SearchHotContentItem("二十大",0,1))
// }
})
}
... ...
... ... @@ -283,13 +283,13 @@ export struct SearchResultContentComponent {
if (this.data_rmh.length === 1) {
ListItem() {
FollowChildComponent({ data: this.bean, type: 1 ,searchText: decodeURI(this.keywords)})
}.padding({ left: "31lpx", right: "31lpx" })
}.padding({ left: 10 + 6 , right: 10 + 6})
} else {
ListItem() {
Column() {
this.SearchListUI()
}
}
}.padding({left: 6, right: 6})
}
}
LazyForEach(this.data, (item: ContentDTO, index: number) => {
... ... @@ -297,6 +297,7 @@ export struct SearchResultContentComponent {
Column() {
if (this.searchType == "activity") {
ActivityItemComponent({ contentDTO: item })
.padding({left: 6, right: 6})
} else if (item.sameContentListSize > 0) {
MoreComponent({ contentDTO: item })
} else if (item.appStyle == "9") {
... ... @@ -309,8 +310,10 @@ export struct SearchResultContentComponent {
})
Divider().strokeWidth(5).color('#f5f5f5').padding({ left: 0, right: 0 })
}
.padding({left: 6, right: 6})
} else {
CardParser({ compDTO: new CompDTO, contentDTO: item })
.padding({left: 6, right: 6})
}
}
}
... ... @@ -321,6 +324,7 @@ export struct SearchResultContentComponent {
ListItem() {
ListHasNoMoreDataUI()
}
.padding({left: 6, right: 6})
}
}
.cachedCount(5)
... ... @@ -338,6 +342,7 @@ export struct SearchResultContentComponent {
.backgroundColor($r('app.color.white'))
.height('100%')
.width('100%')
}
@Builder
... ...
... ... @@ -73,13 +73,9 @@ export class AudioSuspensionModel {
// 显示悬浮窗。
public showWindow() {
// 判断当前窗口是否已显示,使用callback异步回调。
this.floatWindowClass.get().isShowing((err: BusinessError, data) => {
const errCode: number = err.code;
if (errCode) {
// console.error(TAG, 'Failed window is showing Cause:' + JSON.stringify(err));
return;
}
// console.info(TAG, 'window is showing: ' + JSON.stringify(data));
try {
let data = this.floatWindowClass.get().isWindowShowing();
// console.info(TAG, 'window is showing: ' + data);
if(data === false) {
// 显示当前窗口,使用callback异步回调。
this.floatWindowClass.get().showWindow((err: BusinessError) => {
... ... @@ -91,7 +87,9 @@ export class AudioSuspensionModel {
// console.info(TAG, 'floatWindowClass Succeeded in showing the window.');
});
}
});
} catch (exception) {
console.error(TAG, `Failed to check whether the window is showing. Cause code: ${exception.code}, message: ${exception.message}`);
}
}
// 设置悬浮窗尺寸
... ...
... ... @@ -120,6 +120,7 @@ export class PageHelper {
pageModel.emptyType = WDViewDefaultType.WDViewDefaultType_NoContent1;
return;
} else {
pageModel.emptyType = WDViewDefaultType.WDViewDefaultType_Default
//更新数据
pageModel.compList.addItems(liveReviewDTO.list);
this.refreshUIEnd(pageModel, true);
... ... @@ -138,6 +139,7 @@ export class PageHelper {
this.refreshUIEnd(pageModel, false)
return;
}
pageModel.emptyType = WDViewDefaultType.WDViewDefaultType_Default
pageModel.pageInfo = pageInfo;
if (pageInfo.md5 == pageModel.displayPageInfoMd5) {
// 缓存一致,不解析
... ...
... ... @@ -199,7 +199,7 @@
<div class="head-link-block" v-if="hasHeadLink" @click="moreInformationClick">
<img v-if="darkMode === 'light'" src="./image/headLinkIcon.svg" alt="">
<img v-if="darkMode === 'dark'" src="./image/dark/headLinkIcon.svg" alt="">
<span class="head-link-block-str" v-html="details.newLinkObject.newsTitle"></span>
<span class="head-link-block-str" v-html="details.newLinkObject ? details.newLinkObject.newsTitle : ''"></span>
</div>
<!-- 导读 -->
<div class="new-intro-box droidSerif" v-if="details.newIntroduction">
... ... @@ -219,7 +219,7 @@
<div class="cdescrip_text" v-if="details.rmhDesc" @click="skipCustomerNumberPage">{{details.rmhDesc}}</div>
</div>
<!-- @click.stop阻止事件冒泡 -->
<template v-if="!isOwer && showButton">
<template v-if="!isOwer">
<div class="clook-btn clook" @click.stop="clookBtn" v-if="clookStatusSee || showClook">
<template v-if="clookBtnActive">
<img class="clook-loading anticon-spin" src="./image/loading_clock.svg" alt="">
... ... @@ -276,14 +276,8 @@
<div class="aft anmite-vote" v-if="voteState.status == 1 || !details.endTimePoint">
<div class="jdat" v-if="optionList.length">
<div class="pkjd-box" v-if="optionList[0].votesBf != 0 || optionList[1].votesBf != 0">
<span
class="s s1"
:style="optionList.length ? optionList[0].oneStyleAfter : undefined"
></span>
<spsn
class="s s2"
:style="optionList.length ? optionList[1].twoStyleAfter : undefined"
></spsn>
<span class="s s1" :style="optionList.length ? optionList[0].oneStyleAfter : undefined"></span>
<spsn class="s s2" :style="optionList.length ? optionList[1].twoStyleAfter : undefined"></spsn>
</div>
<span
v-if="optionList[0].votesBf === 0 && optionList[1].votesBf === 0"
... ... @@ -427,7 +421,7 @@
</div>
<!-- 分享 -->
<!-- <div class="share" v-if="shareOpen" :style="{ marginTop: actieInfo.show ? '0.64rem' : undefined }">
<div class="share" v-if="shareOpen" :style="{ marginTop: actieInfo.show ? '0.64rem' : undefined }">
<div
v-if="details.shareInfo.sharePosterOpen == 1"
class="sharePoster share-wrapper share-box"
... ... @@ -506,7 +500,7 @@
<span>微博</span>
</div>
</div>
</div> -->
</div>
<div class="reload-page" v-if="baseNode == 'dev'" @click="mockAppClearData">模拟app复用重新加载</div>
</div>
... ... @@ -533,6 +527,7 @@
<div id="hidden"></div>
<div id="hiddenArticle"></div>
<!-- Plugin 的 JS 文件 -->
<script src="./js/plugin/error-stack-parser.min.js"></script>
<script src="./js/plugin/jquery.min.js"></script>
<script src="./js/plugin/vue3.min.js"></script>
<script src="./js/plugin/day.min.js"></script>
... ...
... ... @@ -18,7 +18,7 @@ function useAudio(audioState, details) {
play: [],
pause: [],
error: [],
ended: [],
ended: []
}
const start = () => {
... ... @@ -69,7 +69,6 @@ function useAudio(audioState, details) {
audioEvent.error.push(errorFun)
audioEvent.ended.push(endedFun)
const playFun = function () {
if (item_audio) {
audioPlayNum.value += 1
... ... @@ -150,32 +149,39 @@ function useAudio(audioState, details) {
audioStylePlay.style.display = 'block'
}
if (audioEvent.duration.length) {
if (audioEvent.duration && audioEvent.duration.length) {
item_audio.removeEventListener('durationchange', audioEvent.duration[key])
}
if (audioEvent.time.length) {
if (audioEvent.time && audioEvent.time.length) {
item_audio.removeEventListener('timeupdate', audioEvent.time[key])
}
if (audioEvent.ended.length) {
if (audioEvent.ended && audioEvent.ended.length) {
item_audio.removeEventListener('ended', audioEvent.ended[key])
}
if (audioEvent.error.length) {
if (audioEvent.error && audioEvent.error.length) {
item_audio.removeEventListener('error', audioEvent.error[key])
}
if (audioEvent.play.length) {
if (audioEvent.play && audioEvent.play.length) {
audioStylePlay.removeEventListener('click', audioEvent.play[key])
}
if (audioEvent.pause.length) {
if (audioEvent.pause && audioEvent.pause.length) {
audioStylePause.removeEventListener('click', audioEvent.pause[key])
}
})
audioEvent = {}
audioEvent = {
duration: [],
time: [],
play: [],
pause: [],
error: [],
ended: []
}
}
return {
... ...
... ... @@ -189,7 +189,6 @@ function useEditorContent(details, netstutas, audioState, loadlmageOnlyWifiSwitc
str = str.replace(/<VIDEO(.*?)poster="(.*?)"(.*?)>/g, '<VIDEO$1poster="" data-poster="$2"$3>')
str = str.replace(/<p>\s*<\/p>/g, '')
str = str.replace(/[\u200B-\u200D\uFEFF]/g, '')
str = str.replace(/‘/g, '\'')
str = htmlDecode(str)
// 这一步去除元素与元素之间的空格
str = str.replace(/>\s+</g, '><')
... ... @@ -220,6 +219,10 @@ function useEditorContent(details, netstutas, audioState, loadlmageOnlyWifiSwitc
jqHtml('#newsContent', { type: 'set', str })
const realHtml = jqHtml('#newsContent', { type: 'get' })
jqHtml('#newsContent', { type: 'set', str: '' })
mainProcessProgress['8'] = {
status:'success',
message: '准备调用:handleArticleStr方法'
}
domUtil.handleArticleStr(realHtml, (type, option) => {
if (type === 1) {
addPreview()
... ... @@ -235,13 +238,23 @@ function useEditorContent(details, netstutas, audioState, loadlmageOnlyWifiSwitc
}, details.value, netstutas.value, loadlmageOnlyWifiSwitch.value)
clearEmptyPel()
// errorBlock(
// './image/content_fail.svg',
// '获取内容失败,请重试',
// true
// )
changeContentHtmlHeight({ type: 'done-before' })
// setTimeout(() => {
// if (document.querySelector('.error-block').style.display !== 'block') {
// mainProcessProgress['9'] = {
// status:'success',
// message: '页面开始展示,去除骨架屏'
// }
// appBlock(true)
// mobileApp(true)
// startShowArticle = true
// }
// }, 4000)
if (document.querySelector('.error-block').style.display !== 'block') {
mainProcessProgress['9'] = {
status:'success',
message: '页面开始展示,去除骨架屏'
}
appBlock(true)
mobileApp(true)
startShowArticle = true
... ... @@ -306,8 +319,6 @@ function useEditorContent(details, netstutas, audioState, loadlmageOnlyWifiSwitc
const inner = dataInfo && (typeof dataInfo === 'undefined'
? 'undefined'
: typeof dataInfo === 'object' && dataInfo.jumpType && dataInfo.jumpType == 'internal')
console.log(inner)
console.log(dataInfo)
if (inner && url) {
jumpAppInnerFun(dataInfo, url)
} else if (url) {
... ...
... ... @@ -20,7 +20,7 @@ function useImage(details, netstutas, loadlmageOnlyWifiSwitch) {
imageLoadedLen.value += 1
}
if (hasPreview) {
if (hasPreview && record.parentNode) {
record.parentNode.setAttribute('status', 'success')
record.parentNode.classList.remove('error')
record.parentNode.classList.remove('minHeight')
... ... @@ -43,7 +43,7 @@ function useImage(details, netstutas, loadlmageOnlyWifiSwitch) {
}
if (hasPreview) {
if (hasPreview && record.parentNode) {
record.parentNode.setAttribute('status', 'error')
record.parentNode.classList.remove('success')
record.parentNode.classList.remove('loading')
... ... @@ -82,7 +82,7 @@ function useImage(details, netstutas, loadlmageOnlyWifiSwitch) {
imageLoadedLen.value += 1
}
if (hasPreview) {
if (hasPreview && record.parentNode) {
record.parentNode.setAttribute('status', 'error')
record.parentNode.classList.remove('success')
record.parentNode.classList.remove('loading')
... ...
... ... @@ -61,8 +61,10 @@ function useVideo() {
const isGiveWidth = !!height
videoItem.setAttribute('data-height', `${styleHeight}px`)
videoItem.style.height = `${styleHeight}px`
if (videoItem) {
videoItem.setAttribute('data-height', `${styleHeight}px`)
videoItem.style.height = `${styleHeight}px`
}
videoItem.parentNode.style.width = `100%`
videoItem.parentNode.style.height = `${styleHeight}px`
... ... @@ -87,8 +89,10 @@ function useVideo() {
if (isGiveWidth) return
const newHeight = !!playerWdith && !!playerHieght ? Number(width) * Number(playerHieght) / Number(
playerWdith) : 300
videoItem.setAttribute('data-height', `${newHeight}px`)
videoItem.style.height = `${newHeight}px`
if (videoItem) {
videoItem.setAttribute('data-height', `${newHeight}px`)
videoItem.style.height = `${newHeight}px`
}
videoItem.parentNode.style.width = `100%`
videoItem.parentNode.style.height = `${newHeight}px`
callback(newHeight)
... ...
dayjs.extend(dayjs_plugin_localizedFormat)
dayjs.extend(dayjs_plugin_relativeTime)
const { onMounted, onUnmounted, toRefs, nextTick, watchEffect, toRef } = Vue
const { toRefs, nextTick, toRef } = Vue
function compareTimeArray(obj1, obj2, key, sort) {
const val1 = obj1[key]
... ... @@ -50,7 +50,6 @@ const app = Vue.createApp({
const isRmh = ref(null)
const isNewspaper = ref(null)
const browseStr = ref('')
const showButton = ref(false)
const state = reactive({
clientHeight: 0,
... ... @@ -217,8 +216,8 @@ const app = Vue.createApp({
// document.documentElement.setAttribute('data-size', state.appFontSize)
state.environment = window.config.VUE_BASE_HEADER.environment
// channelId.value = 2038
state.relId = 500004384175
state.contentId = 30037827178
// state.relId = 500005771692
state.contentId = 30037846595
contentId = state.contentId
clearInterval(time.value)
setTimeout(() => {
... ... @@ -235,16 +234,13 @@ const app = Vue.createApp({
}
document.querySelector('.error-block').style.display = 'none'
setRemUnit()
/*config数据是由H5预埋,App加载完成后 app主动传递的方法名请求数据 */
/* config数据是由H5预埋,App加载完成后 app主动传递的方法名请求数据 */
const config = window.config.VUE_CONTENT_CONFIG
try {
const data =
typeof config === 'object' ? config : JSON.parse(config)
if (data.dataJson) {
const dataJson =
typeof data.dataJson === 'object'
? data.dataJson
: JSON.parse(data.dataJson)
const dataJson = handleAppData(config)
if (dataJson) {
state.sourcePage = dataJson.sourcePage
clearInterval(time.value)
// console.log(`详情接口完成:${dayjs().format('HH:mm:ss:SSS')} - ${dayjs()
... ... @@ -269,7 +265,6 @@ const app = Vue.createApp({
//通用设备imei
state.deviceId = state.appHeader.device_id
state.userId = state.appHeader.userId
logInfo(state.userId)
// App服务协议
state.agreementURL = state.appHeader.agreementURL
//0:无网 1:Wi-Fi 2:2G 3:3G 4:4G 5:5G
... ... @@ -278,7 +273,6 @@ const app = Vue.createApp({
state.environment = state.appHeader.environment
})
} catch (e) {
}
try {
... ... @@ -286,7 +280,6 @@ const app = Vue.createApp({
} catch (e) {}
try {
// console.log('详情初始数据', data)
if (data.dataExt) {
hasAppLoginExtra = true
... ... @@ -317,12 +310,11 @@ const app = Vue.createApp({
}
// 处理详情
let initialRes = dataJson.responseMap
initialRes =
typeof initialRes === 'object'
? initialRes
: JSON.parse(initialRes)
initData(initialRes, dataJson.contentId)
mainProcessProgress['3'] = {
status:'success',
message: '准备调用:initData方法'
}
initData(handleAppDetails(dataJson.responseMap), dataJson.contentId)
} else {
errorResponse()
errorBlock(
... ... @@ -331,6 +323,13 @@ const app = Vue.createApp({
true
)
}
} else {
errorResponse()
errorBlock(
'./image/no_net.svg',
'网络出小差了,请检查网络后重试',
true
)
}
} catch (e) { }
}
... ... @@ -339,7 +338,16 @@ const app = Vue.createApp({
if (window.config.VUE_BASE_NODE === 'dev') {
if (devApp || window.config.devApp) {
const details = res.data ? res.data.length > 0 ? res.data[0] : {} : {}
mainProcessProgress['1'] = {
status:'success',
message: 'App给到的数据',
appData: res
}
hasDetails = true
mainProcessProgress['4'] = {
status:'success',
message: '准备调用:handleArticle方法'
}
handleArticle(details)
return
... ... @@ -347,9 +355,9 @@ const app = Vue.createApp({
const response = await axiosRequest({
url: '/content/zh/c/content/detail',
methot: 'post',
methot: 'get',
appStatus: false,
isMock: true,
// isMock: true,
// weakNetwork: true,
// mockTimeOut: 10,
//环境
... ... @@ -357,14 +365,9 @@ const app = Vue.createApp({
//接口前缀
prefix: '/api/rmrb-bff-display-zh',
//给接口传的数据
data: {
contents: [
{
//内容id
contentId: id,
relId: state.relId
}
]
params: {
contentId: id,
relId: state.relId
},
//请求头信息
headers: state.appHeader
... ... @@ -375,7 +378,16 @@ const app = Vue.createApp({
if (response.success) {
if (response.data) {
const details = response.data.length > 0 ? response.data[0] : {}
mainProcessProgress['1'] = {
status:'success',
message: 'App给到的数据',
appData: response
}
hasDetails = true
mainProcessProgress['4'] = {
status:'success',
message: '准备调用:handleArticle方法'
}
handleArticle(details)
} else {
errorResponse()
... ... @@ -399,6 +411,10 @@ const app = Vue.createApp({
hasDetails = true
// 获取用户登录状态
if (hasAppLoginExtra) {
mainProcessProgress['4'] = {
status:'success',
message: '准备调用:handleArticle方法'
}
handleArticle(details)
} else {
// const nowDate = dayjs()
... ... @@ -413,6 +429,10 @@ const app = Vue.createApp({
state.creatorID = loginStatusResponse && loginStatusResponse.creatorID
state.isLogined =
loginStatusResponse && loginStatusResponse.isLogined
mainProcessProgress['4'] = {
status:'success',
message: '准备调用:handleArticle方法'
}
handleArticle(details)
})
} catch (e) { }
... ... @@ -453,8 +473,16 @@ const app = Vue.createApp({
state.details = deepCopy(details)
state.originDataSource = deepCopy(details)
if (window.config.VUE_BASE_NODE === 'dev') {
mainProcessProgress['5'] = {
status:'success',
message: '准备调用:initApp方法'
}
initApp(details)
} else {
mainProcessProgress['5'] = {
status:'success',
message: '准备调用:initApp方法'
}
initApp(details)
try {
// H5传递数据至App
... ... @@ -531,6 +559,10 @@ const app = Vue.createApp({
if (pageError) {
changeAppError()
}
mainProcessProgress['7'] = {
status:'success',
message: '准备调用:initEditorStr方法'
}
initEditorStr(isNewspaper.value)
})
}
... ... @@ -642,13 +674,11 @@ const app = Vue.createApp({
if (state.isLogined == 1) {
// 已登录
if (window.config.VUE_BASE_NODE === 'dev') {
showButton.value = true
showClook.value = true
} else {
clookStatus(true) // 查"关注"状态 , 更新按钮上的文字
}
} else {
showButton.value = true
showClook.value = true
}
}
... ... @@ -674,6 +704,10 @@ const app = Vue.createApp({
if (actieInfo.title) { actieInfo.show = true }
}
mainProcessProgress['6'] = {
status:'success',
message: '准备调用:getOthersStatus回调方法'
}
if (callBack) callBack()
}
... ... @@ -1052,13 +1086,11 @@ const app = Vue.createApp({
headers: state.appHeader,
showError: false
})
showButton.value = true
if (response.success) {
clookStatusSee.value = response.data[0].status == '1' ? false : true // '1' 是已关注 '0'是未关注
}
} else {
if (state.creatorID == state.details.rmhId) {
showButton.value = true
isOwer.value = true
clookStatusSee.value = false
nextTick(() => {
... ... @@ -1093,7 +1125,6 @@ const app = Vue.createApp({
const code = statusResponseMap.code
const data = statusResponseMap.data
if ([ 200, '0' ].includes(code)) {
showButton.value = true
if (data) {
if (data[0].status == '1') {
state.initClockStatus = !initStatus
... ... @@ -1356,24 +1387,7 @@ const app = Vue.createApp({
data: [
{
voteInfo: shallowMergeObj(state.originDataSource.voteInfo, {
options: [
{
backColor: '#486FFF',
index: 1,
optionId: 8537,
summary: 2,
totalVotes: 1,
wordColor: '#FFFFFF'
},
{
backColor: '#486FFF',
index: 2,
optionId: 8538,
summary: 1,
totalVotes: 0,
wordColor: '#FFFFFF'
}
]
options: voteOtions.value
})
}
]
... ... @@ -1407,16 +1421,14 @@ const app = Vue.createApp({
sendNative(
'jsCall_callAppService',
{
method: 'post',
method: 'get',
url: '/api/rmrb-bff-display-zh/content/zh/c/content/detail',
parameters: {
contents: shallowMergeObj({
contentId: eq
}, reLInfo)
contentId: eq,
...reLInfo
}
},
(res) => {
logInfo('res', res)
try {
const refResponse =
typeof res === 'object' ? res : JSON.parse(res)
... ... @@ -1456,6 +1468,7 @@ const app = Vue.createApp({
const voteStatus = async (vId, index, callBack) => {
if (window.config.VUE_BASE_NODE === 'dev') {
voteInit.value = true
state.voteState.optionId = voteOtions.value[0].optionId
state.voteState.status = 1 // 决定是投票前0 还是 投票后1
nextTick(() => handleVoteList())
if (state.details.voteInfo.style === 1) {
... ... @@ -1493,10 +1506,12 @@ const app = Vue.createApp({
if ([ 200, '0' ].includes(code) && data) {
if (Object.keys(data).length > 0) {
try {
voteInit.value = true
state.voteState.status = data.status // 决定是投票前0 还是 投票后1
state.voteState.optionId = data.optionId // 返回的是 被投票项的 optionId ,没投就是 ''
nextTick(() => handleVoteList())
} catch (e) {}
} catch (e) {
}
if (state.details.voteInfo.style === 1) {
// 展示对 √
if (index) {
... ... @@ -1914,6 +1929,7 @@ const app = Vue.createApp({
document.querySelector('.skeleton-loading').classList.add('active')
appBlock(false)
mainProcessProgress = {}
time.value = ''
deviceType.value = judgTerminal() === 1 ? 'ad' : 'ios'
statrTime.value = dayjs()
... ... @@ -1928,7 +1944,6 @@ const app = Vue.createApp({
isNewspaper.value = false
voteInit.value = false
showClook.value = false
showButton.value = false
optionList.value = []
subjectList.value = []
channelList.value = []
... ... @@ -2054,7 +2069,6 @@ const app = Vue.createApp({
optionList,
showClook,
clookStatusSee,
showButton,
timeLine,
shareOpen,
hasReadCount,
... ... @@ -2092,5 +2106,6 @@ const app = Vue.createApp({
app.mount('#app')
app.config.errorHandler = (err) => {
h5ErrorPage(err.toString())
const ev = handleJsError('vue-errorHandler', err, err.message)
h5ErrorPage(ev, err)
}
... ...
!function(e,t){"use strict";"function"==typeof define&&define.amd?define("stackframe",[],t):"object"==typeof exports?module.exports=t():e.StackFrame=t()}(this,function(){"use strict";function e(e){return e.charAt(0).toUpperCase()+e.substring(1)}function t(e){return function(){return this[e]}}var r=["isConstructor","isEval","isNative","isToplevel"],n=["columnNumber","lineNumber"],i=["fileName","functionName","source"],a=r.concat(n,i,["args"],["evalOrigin"]);function o(t){if(t)for(var r=0;r<a.length;r++)void 0!==t[a[r]]&&this["set"+e(a[r])](t[a[r]])}o.prototype={getArgs:function(){return this.args},setArgs:function(e){if("[object Array]"!==Object.prototype.toString.call(e))throw new TypeError("Args must be an Array");this.args=e},getEvalOrigin:function(){return this.evalOrigin},setEvalOrigin:function(e){if(e instanceof o)this.evalOrigin=e;else{if(!(e instanceof Object))throw new TypeError("Eval Origin must be an Object or StackFrame");this.evalOrigin=new o(e)}},toString:function(){var e=this.getFileName()||"",t=this.getLineNumber()||"",r=this.getColumnNumber()||"",n=this.getFunctionName()||"";return this.getIsEval()?e?"[eval] ("+e+":"+t+":"+r+")":"[eval]:"+t+":"+r:n?n+" ("+e+":"+t+":"+r+")":e+":"+t+":"+r}},o.fromString=function(e){var t=e.indexOf("("),r=e.lastIndexOf(")"),n=e.substring(0,t),i=e.substring(t+1,r).split(","),a=e.substring(r+1);if(0===a.indexOf("@"))var s=/@(.+?)(?::(\d+))?(?::(\d+))?$/.exec(a,""),c=s[1],u=s[2],f=s[3];return new o({functionName:n,args:i||void 0,fileName:c,lineNumber:u||void 0,columnNumber:f||void 0})};for(var s=0;s<r.length;s++)o.prototype["get"+e(r[s])]=t(r[s]),o.prototype["set"+e(r[s])]=function(e){return function(t){this[e]=Boolean(t)}}(r[s]);for(var c=0;c<n.length;c++)o.prototype["get"+e(n[c])]=t(n[c]),o.prototype["set"+e(n[c])]=function(e){return function(t){if(r=t,isNaN(parseFloat(r))||!isFinite(r))throw new TypeError(e+" must be a Number");var r;this[e]=Number(t)}}(n[c]);for(var u=0;u<i.length;u++)o.prototype["get"+e(i[u])]=t(i[u]),o.prototype["set"+e(i[u])]=function(e){return function(t){this[e]=String(t)}}(i[u]);return o}),function(e,t){"use strict";"function"==typeof define&&define.amd?define("error-stack-parser",["stackframe"],t):"object"==typeof exports?module.exports=t(require("stackframe")):e.ErrorStackParser=t(e.StackFrame)}(this,function(e){"use strict";var t=/(^|@)\S+:\d+/,r=/^\s*at .*(\S+:\d+|\(native\))/m,n=/^(eval@)?(\[native code])?$/;return{parse:function(e){if(void 0!==e.stacktrace||void 0!==e["opera#sourceloc"])return this.parseOpera(e);if(e.stack&&e.stack.match(r))return this.parseV8OrIE(e);if(e.stack)return this.parseFFOrSafari(e);throw new Error("Cannot parse given Error object")},extractLocation:function(e){if(-1===e.indexOf(":"))return[e];var t=/(.+?)(?::(\d+))?(?::(\d+))?$/.exec(e.replace(/[()]/g,""));return[t[1],t[2]||void 0,t[3]||void 0]},parseV8OrIE:function(t){return t.stack.split("\n").filter(function(e){return!!e.match(r)},this).map(function(t){t.indexOf("(eval ")>-1&&(t=t.replace(/eval code/g,"eval").replace(/(\(eval at [^()]*)|(,.*$)/g,""));var r=t.replace(/^\s+/,"").replace(/\(eval code/g,"(").replace(/^.*?\s+/,""),n=r.match(/ (\(.+\)$)/);r=n?r.replace(n[0],""):r;var i=this.extractLocation(n?n[1]:r),a=n&&r||void 0,o=["eval","<anonymous>"].indexOf(i[0])>-1?void 0:i[0];return new e({functionName:a,fileName:o,lineNumber:i[1],columnNumber:i[2],source:t})},this)},parseFFOrSafari:function(t){return t.stack.split("\n").filter(function(e){return!e.match(n)},this).map(function(t){if(t.indexOf(" > eval")>-1&&(t=t.replace(/ line (\d+)(?: > eval line \d+)* > eval:\d+:\d+/g,":$1")),-1===t.indexOf("@")&&-1===t.indexOf(":"))return new e({functionName:t});var r=/((.*".+"[^@]*)?[^@]*)(?:@)/,n=t.match(r),i=n&&n[1]?n[1]:void 0,a=this.extractLocation(t.replace(r,""));return new e({functionName:i,fileName:a[0],lineNumber:a[1],columnNumber:a[2],source:t})},this)},parseOpera:function(e){return!e.stacktrace||e.message.indexOf("\n")>-1&&e.message.split("\n").length>e.stacktrace.split("\n").length?this.parseOpera9(e):e.stack?this.parseOpera11(e):this.parseOpera10(e)},parseOpera9:function(t){for(var r=/Line (\d+).*script (?:in )?(\S+)/i,n=t.message.split("\n"),i=[],a=2,o=n.length;a<o;a+=2){var s=r.exec(n[a]);s&&i.push(new e({fileName:s[2],lineNumber:s[1],source:n[a]}))}return i},parseOpera10:function(t){for(var r=/Line (\d+).*script (?:in )?(\S+)(?:: In function (\S+))?$/i,n=t.stacktrace.split("\n"),i=[],a=0,o=n.length;a<o;a+=2){var s=r.exec(n[a]);s&&i.push(new e({functionName:s[3]||void 0,fileName:s[2],lineNumber:s[1],source:n[a]}))}return i},parseOpera11:function(r){return r.stack.split("\n").filter(function(e){return!!e.match(t)&&!e.match(/^Error created at/)},this).map(function(t){var r,n=t.split("@"),i=this.extractLocation(n.pop()),a=n.shift()||"",o=a.replace(/<anonymous function(: (\w+))?>/,"$2").replace(/\([^)]*\)/g,"")||void 0;a.match(/\(([^)]*)\)/)&&(r=a.replace(/^[^(]+\(([^)]*)\)$/,"$1"));var s=void 0===r||"[arguments not available]"===r?void 0:r.split(",");return new e({functionName:o,args:s,fileName:i[0],lineNumber:i[1],columnNumber:i[2],source:t})},this)}}});
//# sourceMappingURL=error-stack-parser.min.js.map
... ...
... ... @@ -15,7 +15,7 @@ function playerVideo(player, events) {
const top = player.container.parentNode.offsetTop
const left = player.container.parentNode.getBoundingClientRect().left
const videoLandscape = width > height ? '1' : (width < height ? '2' : '')
const videoUrl = player.options.record.url
const videoUrl = player.options ? player.options.record ? player.options.record.url : '' : ''
if (window.config.VUE_BASE_NODE === 'dev') {
console.log('视频播放', width, height, left, top, videoLandscape)
... ...
... ... @@ -31,7 +31,7 @@ class videoEnPlayer extends Emitter {
initOhtersPlayer() {
const domId = this.container.getAttribute('id')
const url = this.options.record.url
const url = this.options ? this.options.record ? this.options.record.url : '' : ''
const isDark = document.querySelector('html').getAttribute('dark-mode') === 'true'
this.originPoster = this.options.record.poster
this.previewPoster = this.options.record.poster
... ...
... ... @@ -157,7 +157,9 @@ class DomUtil {
// 处理所有表格属性
for (let i = 0; i < tableAllDom.length; i++) {
tableAllDom[i].setAttribute('width', '')
if (tableAllDom[i]) {
tableAllDom[i].setAttribute('width', '')
}
}
// 处理图片点亮
... ... @@ -833,7 +835,7 @@ class DomUtil {
const isInline = style && style.display ? style.display.indexOf('inline') > -1 : false
if (!classList.includes('not-preview-image') && name !== 'people' && !isInline) {
effectImage.push(imageDom[i])
} else {
} else if (imageDom[i]) {
imageDom[i].setAttribute('status', 'loading')
}
} else {
... ... @@ -959,8 +961,10 @@ class DomUtil {
let height = 0
const videoEl = videoDomList[i]
const videoElId = `origin-video-${i}`
videoEl.setAttribute('id', videoElId)
videoEl.setAttribute('class', 'en-origin-video')
if (videoEl) {
videoEl.setAttribute('id', videoElId)
videoEl.setAttribute('class', 'en-origin-video')
}
const src = videoDomList[i].getAttribute('src')
if (!src) break
if (videoEl && videoEl.style.display === 'none') break
... ... @@ -1034,7 +1038,9 @@ class DomUtil {
const aEl = document.querySelectorAll('#newsContent a')
for (let i = 0; i < aEl.length; i++) {
const url = aEl[i].getAttribute('href')
aEl[i].setAttribute('data-href', url || '')
if (aEl[i]) {
aEl[i].setAttribute('data-href', url || '')
}
aEl[i].removeAttribute('href')
aEl[i].style.textDecoration = 'underline'
}
... ...
function h5ErrorPage(message) {
const ERROR_ID = []
function h5ErrorPage(message, error) {
if (error && !getIsReportId(error)) return
pageErrorTypePoint({ errorMessage: message })
errorBlock(
'./image/content_fail.svg',
... ... @@ -6,13 +10,49 @@ function h5ErrorPage(message) {
)
}
function getErrorId(val) {
return window.btoa(decodeURIComponent(encodeURIComponent(val)))
}
function getIsReportId(error) {
const id = getErrorId(error?.message || error?.fileName)
const even = item => item === id
if (ERROR_ID.some(even)) {
console.warn(`Duplicate error, not reported, ${error?.message}`)
return false
} else {
ERROR_ID.push(id)
return true
}
}
function handleJsError(type, ev, message) {
let stackFrame = ErrorStackParser.parse(ev)[0]
// 错误文件、行号、列号、源文件、堆栈等等
let { source } = stackFrame
const stack = `${type}: ` + message + ` ${trim(source)}`
return stack
}
window.onerror = function (message, source, lineno, colno, error) {
h5ErrorPage(message)
console.log(111)
const ev = handleJsError('window-onerror', error, error.message)
h5ErrorPage(ev, error)
}
window.addEventListener('error', function (error) {
const ev = handleJsError('addEventListener-error', error.error, error.message)
h5ErrorPage(ev, error)
})
window.addEventListener('unhandledrejection', function (e) {
e.preventDefault()
h5ErrorPage(e.reason.stack)
const ev = handleJsError('unhandledrejection-error', e.reason, e.reason.message)
h5ErrorPage(ev, e.reason)
// 唯一id判断
// const error = e.reason.stack
// const errorSource = extractParenthesesContent(error || '')
// const first = error ? error.split('\n')[0] : error
// h5ErrorPage(first + ` (${errorSource.map(el => `"${el}"`).join('、')})`)
return true
})
... ...
... ... @@ -21,6 +21,8 @@ const userAgent = navigator.userAgent
// 页面加载模式
var darkMode = 'light'
// var darkMode = 'dark'
// 页面主进程进度
var mainProcessProgress = {}
/**
* @Author gx12358
... ...
... ... @@ -266,6 +266,81 @@ function setHtmlBaseOptions(appData) {
}
}
/**
* @Author gx12358
* @DateTime 2024/9/23
* @lastTime 2024/9/23
* @description 处理客户端给到的数据
*/
function handleAppData(appData) {
const data =
typeof appData === 'object' ? appData : JSON.parse(appData)
if (data.dataJson) {
const dataJson =
typeof data.dataJson === 'object'
? data.dataJson
: JSON.parse(data.dataJson)
return dataJson
}
return null
}
/**
* @Author gx12358
* @DateTime 2024/9/23
* @lastTime 2024/9/23
* @description 拿到详情接口数据
*/
function handleAppDetails(responseMap) {
let initialRes = responseMap
initialRes =
typeof initialRes === 'object'
? initialRes
: JSON.parse(initialRes)
return initialRes
}
/**
* @Author gx12358
* @DateTime 2024/9/23
* @lastTime 2024/9/23
* @description appData - init
*/
function detailsChange(appData, responseCallback) {
// const data =
// typeof appData === 'object' ? appData : JSON.parse(appData)
const dataJson = handleAppData(appData)
// try {
// sendNative(
// 'jsCall_h5TrackingEvent',
// {
// eventId: 'h5_article_page_browse',
// parameters: {
// appData: JSON.stringify(data)
// }
// }
// )
// } catch (e) {}
mainProcessProgress = {}
mainProcessProgress['1'] = {
status:'success',
message: 'App给到的数据',
appData: JSON.stringify(handleAppDetails(dataJson))
}
window.config.VUE_CONTENT_CONFIG = appData
setHtmlBaseOptions(appData)
if (document.querySelector('#detail-change')) {
mainProcessProgress['2'] = {
status:'success',
message: '准备调用:requestApp方法'
}
document.querySelector('#detail-change').click()
}
if (responseCallback) responseCallback(appData)
}
/* 该方法由H5预埋,App加载完成后 app主动传递数据用。 */
document.addEventListener('DOMContentLoaded', function () {
if (window.config.VUE_BASE_NODE === 'dev') {
... ... @@ -325,23 +400,13 @@ document.addEventListener('DOMContentLoaded', function () {
if (judgTerminal() === 1) {
connectWebViewJavascriptBridge(function (bridge) {
bridge.registerHandler('jsCall_receiveAppData', function (appData, responseCallback) {
window.config.VUE_CONTENT_CONFIG = appData
setHtmlBaseOptions(appData)
if (document.querySelector('#detail-change')) {
document.querySelector('#detail-change').click()
}
if (responseCallback) responseCallback(appData)
detailsChange(appData, responseCallback)
})
})
} else {
setupWebViewJavascriptBridge(function (bridge) {
bridge.registerHandler('jsCall_receiveAppData', function (appData, responseCallback) {
window.config.VUE_CONTENT_CONFIG = appData
setHtmlBaseOptions(appData)
if (document.querySelector('#detail-change')) {
document.querySelector('#detail-change').click()
}
if (responseCallback) responseCallback(appData)
detailsChange(appData, responseCallback)
})
})
}
... ...
... ... @@ -1019,8 +1019,16 @@ function pageErrorTypePoint({
newsId,
errorMessage
}) {
logInfo('contentId', newsId || contentId)
logInfo('error', errorMessage)
const parameters = {
newsId: newsId || contentId,
errorMessage,
userAgent,
date: dayjs().format('YYYY-MM-DD HH:mm:ss'),
mainProcessProgress: JSON.stringify(mainProcessProgress)
}
logInfo(Object.assign(parameters, {
mainProcessProgress
}))
try {
sendNative('jsCall_currentPageOperate', {
operateType: '50'
... ... @@ -1032,10 +1040,7 @@ function pageErrorTypePoint({
'jsCall_h5TrackingEvent',
{
eventId: 'h5_article_page_error',
parameters: {
newsId: newsId || contentId,
errorMessage
}
parameters
}
)
} catch (e) {}
... ... @@ -1381,7 +1386,7 @@ function jumpAppInnerFun(record, url) {
if (window.config.VUE_BASE_NODE === 'dev') {
axiosRequest({
url: '/content/zh/c/content/detail',
methot: 'post',
methot: 'get',
appStatus: false,
// isMock: true,
// weakNetwork: true,
... ... @@ -1391,14 +1396,11 @@ function jumpAppInnerFun(record, url) {
//接口前缀
prefix: '/api/rmrb-bff-display-zh',
//给接口传的数据
data: {
contents: [
{
//内容id
contentId: record.contentId,
relId: record.relId
}
]
params: {
//内容id
contentId: record.contentId,
relId: record.relId,
relType: record.relType,
},
//请求头信息
headers: shallowMerge({
... ... @@ -1425,16 +1427,13 @@ function jumpAppInnerFun(record, url) {
sendNative(
'jsCall_callAppService',
{
method: 'post',
method: 'get',
url: '/api/rmrb-bff-display-zh/content/zh/c/content/detail',
parameters: {
contents: [
{
//内容id
contentId: record.contentId,
relId: record.relId
}
]
parameters: {
//内容id
contentId: record.contentId,
relId: record.relId,
relType: record.relType,
}
},
(res) => {
... ...
... ... @@ -173,19 +173,17 @@ export struct DetailPlayLiveCommon {
// 判断当前窗口是否已显示,使用callback异步回调。
// Logger.info(TAG, 'this.liveState', this.liveState)
if(this.liveState !== 'wait') {
this.AudioSuspension.floatWindowClass.get().isShowing((err: BusinessError, data) => {
const errCode: number = err.code;
if (errCode) {
// console.error(TAG, 'Failed window is showing Cause:' + JSON.stringify(err));
return;
}
// console.info(TAG, 'window is showing: ' + JSON.stringify(data));
try {
let data = this.AudioSuspension.floatWindowClass.get().isWindowShowing();
// console.info(TAG, 'window is showing: ' + data);
if(data) {
this.isShowAudioCom = true
this.AudioSuspension.playerController.get()?.pause();
this.AudioSuspension.minimize()
}
});
} catch (exception) {
console.error(TAG, `Failed to check whether the window is showing. Cause code: ${exception.code}, message: ${exception.message}`);
}
}
}
... ...
import { Action,
ContentDetailDTO, ContentDTO, InteractDataDTO, PeopleShipNextListDTO } from 'wdBean/Index';
import { NetworkUtil, WindowModel } from 'wdKit';
import { EmitterEventId, EmitterUtils, NetworkType, NetworkUtil, WindowModel } from 'wdKit';
import { ContentDetailRequest } from 'wdDetailPlayApi/Index'
import { ResponseDTO } from 'wdNetwork/Index';
import { DetailPlayShortVideoPage } from './DetailPlayShortVideoPage'
... ... @@ -55,6 +55,7 @@ export struct DetailVideoListPage {
private AudioSuspension = new AudioSuspensionModel()
@State isShowAudioCom: boolean = false
@StorageLink('GestureLoadStrategy') GestureLoadStrategy: number = 0
@State timer: number = -1
// async getRmhDetail() {
// // 注册监听网络连接
... ... @@ -119,6 +120,30 @@ export struct DetailVideoListPage {
this.getDetail()
}
// 注册监听网络连接
EmitterUtils.receiveEvent(EmitterEventId.NETWORK_CONNECTED, (async (str?: string) => {
if (this.timer) {
clearTimeout(this.timer)
}
this.timer = setTimeout(() => {
let type: NetworkType | null = null
if (str) {
type = JSON.parse(str) as NetworkType
}
// 注册监听网络连接
if (type != NetworkType.TYPE_UNKNOWN) {
console.log(TAG, '网络连接状态变化', type)
if(type == NetworkType.TYPE_CELLULAR || type == NetworkType.TYPE_WIFI) {
if (!this.peopleShipHomeCreatorId) {
this.queryVideoList()
} else {
this.getRmhPublishNexts(this.peopleShipHomeCreatorId, `${this.data[this.currentIndex].newsId}`, 1, 1, 10, systemDateTime.getTime(false));
}
}
}
}, 1000)
}))
}
... ... @@ -164,19 +189,17 @@ export struct DetailVideoListPage {
this.pageShowTime = DateTimeUtils.getTimeStamp()
// 判断当前窗口是否已显示,使用callback异步回调。
this.AudioSuspension.floatWindowClass.get().isShowing((err: BusinessError, data) => {
const errCode: number = err.code;
if (errCode) {
// console.error(TAG, 'Failed window is showing Cause:' + JSON.stringify(err));
return;
}
// console.info(TAG, 'window is showing: ' + JSON.stringify(data));
try {
let data = this.AudioSuspension.floatWindowClass.get().isWindowShowing();
// console.info(TAG, 'window is showing: ' + data);
if(data) {
this.isShowAudioCom = true
this.AudioSuspension.playerController.get()?.pause();
this.AudioSuspension.minimize()
}
});
} catch (exception) {
console.error(TAG, `Failed to check whether the window is showing. Cause code: ${exception.code}, message: ${exception.message}`);
}
const action: Action = router.getParams() as Action;
if (action) {
... ... @@ -185,11 +208,11 @@ export struct DetailVideoListPage {
// 目的子组件watch生效
setTimeout(() => {
this.showCommentList = true
}, 300)
}, 1000)
}
// console.log(TAG, 'onPageShow showComment', action.params.extra.showComment)
}
}
// console.log(TAG, 'onPageShow', JSON.stringify(action.params))
}
onPageHide(): void {
... ... @@ -443,7 +466,9 @@ export struct DetailVideoListPage {
.displayCount(1, true)
.onChange((index: number) => {
this.currentIndex = index
if (this.currentIndex === this.data.length - 1) {
// if (this.currentIndex === this.data.length - 1) {
// 倒数第二个开始请求下一页数据解决视频上滑卡顿
if (this.currentIndex === this.data.length - 2) {
// TODO:下拉刷新“努力加载中”
if (!this.peopleShipHomeCreatorId) {
this.queryVideoList()
... ...
... ... @@ -9,7 +9,9 @@ import {
contentListParams,
getRecCompInfoParams
} from 'wdDetailPlayApi/src/main/ets/request/ContentDetailRequest';
import { NetworkUtil, Logger, WindowModel, DateTimeUtils, LazyDataSource } from 'wdKit/Index';
import { NetworkUtil, Logger, WindowModel, DateTimeUtils, LazyDataSource, EmitterUtils,
EmitterEventId,
NetworkType} from 'wdKit/Index';
import { PictureLoading } from './PictureLoading';
import { DisplayDirection } from 'wdConstant/Index';
import { window } from '@kit.ArkUI';
... ... @@ -70,6 +72,7 @@ export struct VideoChannelDetail {
@Provide onlyWifiLoadVideo: boolean = false
@Provide toastTextVisible: boolean = false
@StorageLink('GestureLoadStrategy') GestureLoadStrategy: number = 0
@State timer: number = -1
autoRefreshChange() {
if (this.topNavIndex === 0 && !this.isRequesting) {
... ... @@ -140,6 +143,25 @@ export struct VideoChannelDetail {
aboutToAppear() {
this.getDetail()
// Logger.info(TAG, 'aboutToAppear');
// 注册监听网络连接
EmitterUtils.receiveEvent(EmitterEventId.NETWORK_CONNECTED, (async (str?: string) => {
if (this.timer) {
clearTimeout(this.timer)
}
this.timer = setTimeout(() => {
let type: NetworkType | null = null
if (str) {
type = JSON.parse(str) as NetworkType
}
// 注册监听网络连接
if (type != NetworkType.TYPE_UNKNOWN) {
console.log(TAG, '网络连接状态变化', type)
if(type == NetworkType.TYPE_CELLULAR || type == NetworkType.TYPE_WIFI) {
this.getRecCompInfo()
}
}
}, 1000)
}))
}
aboutToDisappear(): void {
... ... @@ -331,7 +353,9 @@ export struct VideoChannelDetail {
this.currentIndex = index
// console.info('onChange==', index.toString())
if (this.currentIndex === this.data.length - 1) {
// if (this.currentIndex === this.data.length - 1) {
// 倒数第二个开始请求下一页数据解决视频上滑卡顿
if (this.currentIndex === this.data.length - 2) {
this.pageNum++
this.refreshTime = new Date().getTime()
this.loadStrategy = 'push_up'
... ...
... ... @@ -18,6 +18,7 @@ export struct PlayerFullScreenView {
@State videoDuration: number = this.contentDetailData?.videoInfo?.[0]?.videoDuration || 1
@State showOperator: boolean = true
private timer: number = -1
private debounceTimer: number = -1
@State upProVal: string = ''
@State duration: string = DateTimeUtils.secondToTime(this.videoDuration)
@State startX: number = 0
... ... @@ -80,6 +81,13 @@ export struct PlayerFullScreenView {
}, 5000)
}
debounce(func: () => void, wait: number) {
if (this.debounceTimer) {
clearTimeout(this.debounceTimer);
}
this.debounceTimer = setTimeout(func, wait);
}
build() {
Stack({ alignContent: Alignment.Center }) {
Row() {
... ... @@ -121,7 +129,7 @@ export struct PlayerFullScreenView {
.gesture(
PanGesture(this.panOptionBright)
.onActionStart((event?: GestureEvent) => {
console.log(TAG, 'onActionEnd this.panOptionBright')
// console.log(TAG, 'onActionEnd this.panOptionBright')
this.isShowBright = true
this.playerController?.onBrightActionStart(event!);
})
... ... @@ -129,9 +137,9 @@ export struct PlayerFullScreenView {
this.playerController?.onBrightActionUpdate(event!);
})
.onActionEnd(() => {
setTimeout(() => {
this.isShowBright = false
}, 500)
this.debounce(() => {
this.isShowBright = false;
}, 1000);
this.playerController?.onActionEnd();
})
)
... ... @@ -154,9 +162,9 @@ export struct PlayerFullScreenView {
this.playerController?.onVolumeActionUpdate(event!);
})
.onActionEnd(() => {
setTimeout(() => {
this.isShowVolume = false
}, 500)
this.debounce(() => {
this.isShowVolume = false;
}, 1000);
this.playerController?.onActionEnd();
})
)
... ...
... ... @@ -249,7 +249,16 @@ export struct PlayerTitleView {
}
})
if (this.isOverLines) {
Span('... 全文')
Span('... ')
.fontColor(Color.White)
.fontWeight(400)
.fontFamily('PingFang SC-Regular')
.fontSize(12)
.onClick(() => {
this.isOpenDetail = true
this.dialogController?.open()
})
Span('全文')
.fontColor('#99FFFFFF')
.fontWeight(400)
.fontFamily('PingFang SC-Regular')
... ... @@ -309,9 +318,18 @@ export struct PlayerTitleView {
.fontWeight(600)
.fontFamily('PingFang SC-Regular')
if (this.isTitleOverLines) {
Span('... 全文')
Span('... ')
.fontColor(Color.White)
.fontWeight(400)
.fontFamily('PingFang SC-Regular')
.fontSize(12)
.onClick(() => {
this.isOpenDetail = true
this.dialogController?.open()
})
Span('全文')
.fontColor('#99FFFFFF')
.fontWeight(600)
.fontWeight(400)
.fontFamily('PingFang SC-Regular')
.fontSize(12)
.onClick(() => {
... ...
... ... @@ -32,6 +32,7 @@ export function setupPlayerConfig(player: AliPlayer) {
config.mMaxBufferDuration = 50000
config.mHighBufferDuration = 3000
config.mStartBufferDuration = 50
config.mEnableLowLatencyMode = true
player.setConfig(config)
}
}
... ...
import { LogoutViewModel } from 'wdComponent';
import { ComponentModule, LogoutViewModel } from 'wdComponent';
import { GrayManageModel, mournsInfoModel } from 'wdComponent/src/main/ets/viewmodel/GrayManageModel'
import { BreakpointConstants, SpConstants } from 'wdConstant';
... ... @@ -14,6 +14,8 @@ import { BottomNavigationComponent } from './view/BottomNavigationComponent';
import LaunchDataModel from './viewModel/LaunchDataModel';
import { LaunchPageModel } from './viewModel/LaunchPageModel';
import { JSON } from '@kit.ArkTS';
import { WebArticleEventHandler, WebPoolManager } from 'wdWebComponent';
import { BridgeWebViewControl } from 'wdJsBridge';
const TAG = 'MainPage';
... ... @@ -60,6 +62,10 @@ struct MainPage {
} catch (e) {
Logger.error(TAG, `Unexpected Text in JSON ??` + JSON.stringify(e) +" " + dataModelStr);
}
setTimeout(() => {
ComponentModule.preInitArticleWebTemplate(this.getUIContext())
}, 500)
}
pageTransition() {
... ...
... ... @@ -101,38 +101,39 @@ struct Index {
}
build() {
Stack({ alignContent: Alignment.End }) {
Progress(
{
value: this.progressVal,
total: 100,
type: ProgressType.Linear,
})
.style({
enableSmoothEffect: false
})
.color("#ED2800")
.backgroundColor($r('app.color.white'))
.width("100%")
.height(3)
.margin({ top: 57 })
.visibility(this.isExpand ? Visibility.Visible : Visibility.Hidden)
Column(){
Stack({ alignContent: Alignment.End }) {
Column() { //标题 时间 进度条
Marquee({
start: true,
step: 5,
loop: Number.POSITIVE_INFINITY,
fromStart: true,
src: this.audioTitle
Progress(
{
value: this.progressVal,
total: 100,
type: ProgressType.Linear,
})
.style({
enableSmoothEffect: false
})
.width("60%")
.height(20)
.fontColor('#222222')
.fontSize(14)
.fontFamily('PingFang SC-Medium')
.fontWeight(500)
.alignSelf(ItemAlign.Start)
.color("#ED2800")
.backgroundColor($r('app.color.white'))
.width("100%")
.height(3)
.margin({ top: 56 })
.visibility(this.isExpand ? Visibility.Visible : Visibility.Hidden)
Stack({ alignContent: Alignment.End }) {
Column() { //标题 时间 进度条
Marquee({
start: true,
step: 5,
loop: Number.POSITIVE_INFINITY,
fromStart: true,
src: this.audioTitle
})
.width("60%")
.height(20)
.fontColor('#222222')
.fontSize(14)
.fontFamily('PingFang SC-Medium')
.fontWeight(500)
.alignSelf(ItemAlign.Start)
// .onStart(() => {
// console.info('Marquee animation complete onStart')
// })
... ... @@ -143,118 +144,127 @@ struct Index {
// console.info('Marquee animation complete onFinish')
// })
Row() {
Text(this.currentTime)
.fontSize(12)
.fontColor("#999999")
.height("100%")
.alignSelf(ItemAlign.Start)
Text("/" + this.totalTime)
.fontSize(12)
.fontColor("#999999")
.height("100%")
.alignSelf(ItemAlign.Start)
Row() {
Text(this.currentTime)
.fontSize(12)
.fontColor("#999999")
.height("100%")
.alignSelf(ItemAlign.Start)
Text("/" + this.totalTime)
.fontSize(12)
.fontColor("#999999")
.height("100%")
.alignSelf(ItemAlign.Start)
}
.width("100%")
.height(16)
.margin({ top: 4})
}
.width("100%")
.height(16)
.margin({ top: 4})
.padding({
top: 10,
bottom: 10,
left: 10,
right: 0
})
.width(247)
.height(60)
.justifyContent(FlexAlign.Start)
// .onClick(() => {
// let dataModelStr : string = SPHelper.default.getSync(SpConstants.APP_NEWS_INFO_DATA_MODEL,'') as string
// console.log(TAG, dataModelStr)
// let dataModel : CompInfoBean = JSON.parse(dataModelStr)
// //公共跳转
// let content: ContentDTO = {
// objectId: this.itemBeanClicked.newsId + '',
// objectType: this.itemBeanClicked.newsType + '',
// relId: this.itemBeanClicked.relId + '',
// relType: this.itemBeanClicked.relType ?? '0'
// } as ContentDTO
// ProcessUtils.processPage(content)
// })
Row() {
Image(this.currentStatus === PlayerConstants.STATUS_START ? $r("app.media.icon_audio_pause_svg") : $r("app.media.icon_audio_playing_svg"))
.objectFit(ImageFit.Contain)
.width(24)
.height(24)
.margin({ right: 12 })
.gesture(
TapGesture()
.onAction((event: GestureEvent) => {
if (this.AudioSuspension.playerController) {
this.AudioSuspension.playerController.get().switchPlayOrPause()
}
}))
Image($r("app.media.icon_audio_close"))
.objectFit(ImageFit.Contain)
.width(24)
.height(24)
.gesture(
TapGesture()
.onAction((event: GestureEvent) => {
if (this.AudioSuspension.playerController) {
this.AudioSuspension.playerController.get().pause()
this.AudioSuspension.minimize()
BackgroundAudioController.sharedController().destorySession()
}
}))
}
.width(80)
.height(60)
}
.padding({
top: 10,
bottom: 10,
left: 10,
right: 0
})
.width(243)
.height(60)
.justifyContent(FlexAlign.Start)
// .onClick(() => {
// let dataModelStr : string = SPHelper.default.getSync(SpConstants.APP_NEWS_INFO_DATA_MODEL,'') as string
// console.log(TAG, dataModelStr)
// let dataModel : CompInfoBean = JSON.parse(dataModelStr)
// //公共跳转
// let content: ContentDTO = {
// objectId: this.itemBeanClicked.newsId + '',
// objectType: this.itemBeanClicked.newsType + '',
// relId: this.itemBeanClicked.relId + '',
// relType: this.itemBeanClicked.relType ?? '0'
// } as ContentDTO
// ProcessUtils.processPage(content)
// })
.visibility(this.isExpand ? Visibility.Visible : Visibility.Hidden)
Row() {
Image(this.currentStatus === PlayerConstants.STATUS_START ? $r("app.media.icon_audio_pause_svg") : $r("app.media.icon_audio_playing_svg"))
.objectFit(ImageFit.Contain)
.width(24)
.height(24)
.margin({ right: 12 })
.gesture(
TapGesture()
.onAction((event: GestureEvent) => {
if (this.AudioSuspension.playerController) {
this.AudioSuspension.playerController.get().switchPlayOrPause()
}
}))
Image($r("app.media.icon_audio_close"))
.objectFit(ImageFit.Contain)
.width(24)
.height(24)
.gesture(
TapGesture()
.onAction((event: GestureEvent) => {
if (this.AudioSuspension.playerController) {
this.AudioSuspension.playerController.get().pause()
this.AudioSuspension.minimize()
BackgroundAudioController.sharedController().destorySession()
}
}))
LottieView({
name: this.name,
path: "lottie/audio_animation_playing.json",
lottieWidth: 24,
lottieHeight: 24,
autoplay: false,
loop: true
})
}
.width(80)
.justifyContent(FlexAlign.Center)
.width(60)
.height(60)
.visibility(!this.isExpand ? Visibility.Visible : Visibility.Hidden)
}
.visibility(this.isExpand ? Visibility.Visible : Visibility.Hidden)
Row() {
LottieView({
name: this.name,
path: "lottie/audio_animation_playing.json",
lottieWidth: 24,
lottieHeight: 24,
autoplay: false,
loop: true
})
}
.justifyContent(FlexAlign.Center)
.width(60)
.height(60)
.visibility(!this.isExpand ? Visibility.Visible : Visibility.Hidden)
}
.parallelGesture(
GestureGroup(GestureMode.Parallel,
TapGesture()
.onAction((event?: GestureEvent) => {
this.isExpand = true
this.AudioSuspension.resizeWindow(this.expandWidth, this.expandHeight)
}),
PanGesture(this.panOption)
//手势识别成功回调。
// .onActionStart((event: GestureEvent) => {
// console.info('Pan start');
// })
.parallelGesture(
GestureGroup(GestureMode.Parallel,
TapGesture()
.onAction((event?: GestureEvent) => {
this.isExpand = true
this.AudioSuspension.resizeWindow(this.expandWidth, this.expandHeight)
}),
PanGesture(this.panOption)
//手势识别成功回调。
// .onActionStart((event: GestureEvent) => {
// console.info('Pan start');
// })
// 手势移动过程中回调。发生拖拽时,获取到触摸点的位置,并将位置信息传递给windowPosition
.onActionUpdate((event: GestureEvent) => {
// this.windowPosition.x += event.offsetX;
let newY = this.windowPosition.y + event.offsetY;
this.windowPosition.y = Math.min(Math.max(newY, this.topSafeHeight), this.bottomSafeHeight);
})
//手势识别成功,手指抬起后触发回调。
.onActionUpdate((event: GestureEvent) => {
// this.windowPosition.x += event.offsetX;
let newY = this.windowPosition.y + event.offsetY;
this.windowPosition.y = Math.min(Math.max(newY, this.topSafeHeight), this.bottomSafeHeight);
})
//手势识别成功,手指抬起后触发回调。
// .onActionEnd(() => {
// console.info('Pan end');
// })
)
)
)
.borderRadius(4)
.backgroundColor(Color.White)
.borderRadius(4)
.shadow({
radius: vp2px(5),
color: 'rgba(0, 0, 0, 0.10)',
offsetX: 0,
offsetY: 1
}) // 设
.backgroundColor(Color.White)
}
.padding(1)
}
}
\ No newline at end of file
... ...
... ... @@ -269,7 +269,6 @@ export struct BottomNavigationComponent {
// 底导切换函数
async onBottomNavigationIndexChange(navItem: BottomNavDTO, index: number) {
// Logger.info(TAG, `onBottomNavigationIndexChange to Index:${index},this.currentNavIndex: ${this.currentNavIndex}`);
if (navItem.name === '我的') {
this.barBackgroundColor = Color.White
... ... @@ -306,10 +305,12 @@ export struct BottomNavigationComponent {
}
}
if (index >= 0 && index != this.currentNavIndex) {
this.onBottomNavigationIndexChange(this.bottomNavList[index], index)
// 切底导
this.currentNavIndex = index
}
setTimeout(() => {
// 底导切换后,触发顶导切换
this.assignChannel = new AssignChannelParam()
... ...
... ... @@ -55,28 +55,27 @@ export struct VideoChannelPage {
async aboutToAppear() {
// 背景图高度
this.backgroundImageH = px2vp(this.topSafeHeight) + 44
// console.info(`cj2024 backgroundImageH = ${this.backgroundImageH} this.topSafeHeight = ${this.topSafeHeight}`)
// console.info(TAG, `cj2024 backgroundImageH = ${this.backgroundImageH} this.topSafeHeight = ${this.topSafeHeight}`)
this.setBarBackgroundColor()
if (this.currentTopNavSelectedIndex === 0) {
this.handleAudio(this.topNavList[0])
}
}
/**
* 切换顶部导航index
*/
setTabbarActive() {
// console.info(TAG, `setTabbarActive`)
let index = this.topNavList.findIndex((item: TopNavDTO, index) => {
return Number(this.assignChannel.channelId) == item.channelId && Number(this.assignChannel.pageId) == item.pageId
}) || 0
this.clickTopNav(index)
this.setBarBackgroundColor()
}
/**
* 顶导、底导切换下标都到改变背景色,进入或退出沉浸式
*/
setBarBackgroundColor() {
// console.info(TAG, `setBarBackgroundColor`)
if (this.isImmerseChannel() && CompUtils.isVideo(this.currentBottomNavInfo)) {
this.barBackgroundColor = Color.Black
this.isImmersive = true
... ... @@ -86,7 +85,8 @@ export struct VideoChannelPage {
this.barBackgroundColor = Color.White
ColorUtils.changeTopStatusBarColor(this.navItem.statusBarColor, 1)
}
// 底导为视频同时顶导为视频时关闭音频悬浮窗
this.handleAudio()
}
/**
... ... @@ -124,22 +124,20 @@ export struct VideoChannelPage {
}
// 控制音频悬浮窗显隐
handleAudio(navItem: TopNavDTO) {
if (navItem.name === '视频') {
handleAudio() {
if (this.isImmerseChannel() && CompUtils.isVideo(this.currentBottomNavInfo)) {
// 判断当前窗口是否已显示,使用callback异步回调。
this.AudioSuspension.floatWindowClass.get().isShowing((err: BusinessError, data) => {
const errCode: number = err.code;
if (errCode) {
// console.error(TAG, 'Failed window is showing Cause:' + JSON.stringify(err));
return;
}
// console.info(TAG, 'window is showing: ' + JSON.stringify(data));
try {
let data = this.AudioSuspension.floatWindowClass.get().isWindowShowing();
// console.info(TAG, 'window is showing: ' + data);
if(data) {
this.isShowAudioCom = true
this.AudioSuspension.playerController.get()?.pause();
this.AudioSuspension.minimize()
}
});
} catch (exception) {
console.error(TAG, `Failed to check whether the window is showing. Cause code: ${exception.code}, message: ${exception.message}`);
}
} else {
// console.info(TAG, 'this.isShowAudioCom: ' + this.isShowAudioCom);
if (this.isShowAudioCom) {
... ... @@ -164,7 +162,7 @@ export struct VideoChannelPage {
clickTopNav(index: number) {
// 视频tab埋点
const tab = this.topNavList[index]
this.handleAudio(tab)
this.handleAudio()
// Logger.info(TAG, `视频tab埋点: ${JSON.stringify(tab)}`);
const params: ParamType = {
"pageName": tab.name,
... ... @@ -178,6 +176,7 @@ export struct VideoChannelPage {
}
this.currentTopNavSelectedIndex = index
this.swiperController.changeIndex(index, true)
this.setBarBackgroundColor()
}
@Builder
... ...
.prism-player .prism-big-play-btn{background:url(./img/bigplay.png) no-repeat;background-size:contain;width:64px;height:64px}.prism-player .prism-big-play-btn .outter{border:7px solid rgba(255,255,255,.51);width:64px;height:64px;border-radius:100%;position:absolute;box-sizing:border-box;top:0;left:0}.prism-player .prism-big-play-btn:hover{cursor:pointer}.prism-player .prism-play-btn{width:24px;height:24px;background:url(./img/smallplay.png) no-repeat;background-size:contain}.prism-player .prism-play-btn:hover{cursor:pointer}.prism-player .prism-live-display{font-size:12px;color:#ebecec;line-height:44px;text-align:center;margin:0}.prism-player .live-shift-display:hover{cursor:pointer;font-size:14px}.prism-player .prism-play-btn.playing{background:url(./img/smallpause.png) no-repeat;background-size:contain}.prism-player .prism-play-btn.playing:hover{cursor:pointer}.prism-player .prism-fullscreen-btn{width:24px;height:24px;background:url(./img/fullscreen.png) no-repeat;background-size:contain}.prism-player .prism-fullscreen-btn:hover{cursor:pointer}.prism-player .prism-fullscreen-btn.fullscreen{background:url(./img/smallscreen.png) no-repeat;background-size:contain}.prism-player .prism-fullscreen-btn.fullscreen:hover{animation:hoverAnimationScale 1s 1;-moz-animation:hoverAnimationScale 1s 1;-webkit-animation:hoverAnimationScale 1s 1;-o-animation:hoverAnimationScale 1s 1;cursor:pointer}.prism-player .prism-volume{position:relative}.prism-player .prism-volume .volume-icon{width:28px;height:28px;background:url(./img/volume.png);background-size:contain}.prism-player .prism-volume .volume-icon .long-horizontal{width:3px;background:#ebecec;height:18px;position:absolute;right:5px;top:50%;-ms-transform:translateY(-50%);transform:translateY(-50%)}.prism-player .prism-volume .volume-icon .short-horizontal{width:3px;background:#ebecec;height:8px;position:absolute;right:10px;top:50%;-ms-transform:translateY(-50%);transform:translateY(-50%)}.prism-player .prism-volume .volume-icon:hover{-ms-transform-origin:0 50%;transform-origin:0 50%;background-size:contain;cursor:pointer}.prism-player .prism-volume .mute .long-horizontal{-ms-transform:rotate(-45deg);transform:rotate(-45deg);height:12px;top:10px;left:22px}.prism-player .prism-volume .mute .short-horizontal{-ms-transform:rotate(45deg);transform:rotate(45deg);height:12px;top:10px;left:22px}.prism-player .prism-volume-control{position:absolute;bottom:44px;display:none;background:rgba(60,60,60,.95);box-shadow:0 0 6px 0 rgba(0,0,0,.1);width:32px;height:130px;z-index:10000}.prism-player .prism-volume-control .volume-control-icon{width:32px;height:32px;background:url(./img/unmutevolume.png) no-repeat;background-size:contain}.prism-player .prism-volume-control .volume-control-icon:hover{cursor:pointer;background:url(./img/volumehover.png) no-repeat;background-size:contain}.prism-player .prism-volume-control .volume-control-icon.mute{background:url(./img/volumemute.png) no-repeat;background-size:contain}.prism-player .prism-volume-control .volume-control-icon.mute:hover{background:url(./img/volumemutehover.png) no-repeat;background-size:contain;cursor:pointer}.prism-player .prism-volume-control:hover{cursor:pointer}.prism-player .prism-volume-control .volume-control-icon{position:absolute;bottom:6px;left:8px;width:26px;height:26px}.prism-player .prism-volume-control .volume-range{position:absolute;left:14px;bottom:10px;border-radius:1px;background:#6c6262;box-shadow:inset 1px 1px 1px 0 rgba(0,0,0,.06);width:4px;height:100px}.prism-player .prism-volume-control .volume-value{width:100%;height:0%;background:#30adf2;position:absolute;border-radius:1px;bottom:0}.prism-player .prism-volume-control .volume-cursor{position:absolute;bottom:0;background:#fff;width:15px;height:15px;border-radius:15px;left:-6px}.prism-player .prism-volume-control .volume-cursor:hover{background:#00c1de}.prism-player .prism-animation{width:64px;height:64px;border-radius:64px;opacity:0;position:absolute;left:50%;top:50%;-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.prism-player .prism-play-animation{background:url(./img/playanimation.png) no-repeat;background-size:contain}.prism-player .prism-pause-animation{background:url(./img/pauseanimation.png) no-repeat;background-size:contain}.prism-player .play-apply-animation{animation:prismplayanimation 1s 1;-moz-animation:prismplayanimation 1s 1;-webkit-animation:prismplayanimation 1s 1;-o-animation:prismplayanimation 1s 1;animation-fill-mode:both}@keyframes prismplayanimation{0%{width:32px;height:32px;border-radius:32px;opacity:0}50%{width:32px;height:32px;border-radius:32px;opacity:1}99%{width:76px;height:76px;border-radius:76px;opacity:0}100%{width:0;height:0}}@keyframes spinoffPulse{0%{transform:rotate(0);-webkit-transform:rotate(0);-moz-transform:rotate(0)}100%{transform:rotate(360deg);-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg)}}@keyframes hoverAnimationRotate{0%{transform:rotate(0);-webkit-transform:rotate(0);-moz-transform:rotate(0)}50%{transform:rotate(45deg);-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg)}100%{transform:rotate(0);-webkit-transform:rotate(0);-moz-transform:rotate(0)}}@keyframes hoverAnimationScale{0%{transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1)}50%{transform:scale(1.2);-webkit-transform:scale(1.2);-moz-transform:scale(1.2)}100%{transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1)}}@keyframes hoverAnimationScaleX{0%{transform:scaleX(1);-webkit-transform:scaleX(1);-moz-transform:scaleX(1)}50%{transform:scaleX(1.2);-webkit-transform:scaleX(1.2);-moz-transform:scaleX(1.2)}100%{transform:scaleX(1);-webkit-transform:scaleX(1);-moz-transform:scaleX(1)}}@keyframes hoverVolumeAnimation{0%{opacity:1}50%{opacity:0}100%{opacity:1}}.volume-hover-animation{animation:hoverVolumeAnimation .3s 1;-moz-animation:hoverVolumeAnimation .3s 1;-webkit-animation:hoverVolumeAnimation .3s 1;-o-animation:hoverVolumeAnimation .3s 1}@keyframes hoverPlayButtonAnimation{0%{width:63px;height:63px;border:7px solid #fff}60%{width:90px;height:90px;border:7px solid rgba(255,255,255,.51)}100%{width:97px;height:97px;border:14px solid rgba(255,255,255,0)}}@keyframes warn{0%{transform:scale(1);opacity:0}25%{transform:scale(1);opacity:.1}50%{transform:scale(1.1);opacity:.3}75%{transform:scale(1.5);opacity:.5}100%{transform:scale(2);opacity:0}}.big-playbtn-hover-animation{animation:warn 1s ease-out;-moz-animation:warn 1s ease-out;-webkit-animation:warn 1s ease-out;-o-animation:warn 1s ease-out}.big-playbtn-hover-animation1{animation:hoverPlayButtonAnimation 1s 1;-moz-animation:hoverPlayButtonAnimation 1s 1;-webkit-animation:hoverPlayButtonAnimation 1s 1;-o-animation:hoverPlayButtonAnimation 1s 1}.prism-player{background-color:#000;position:relative}.prism-player a{text-decoration:none}.prism-player video{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);-moz-transform:translate(-50%,-50%);-webkit-transform:translate(-50%,-50%);-o-transform:translate(-50%,-50%);-ms-transform-origin:center;-moz-transform-origin:center;-webkit-transform-origin:center;-o-transform-origin:center}.prism-player .x5-full-screen{object-fit:fill;object-position:50% 50%}.prism-player .x5-top-left{object-fit:contain;object-position:0 0}.prism-player .prism-cover{width:100%;height:100%;background-repeat:no-repeat;background-position:center;background-size:cover;position:absolute;top:0;left:0;z-index:11}.prism-player .prism-text-overlay{width:100%;height:100%;position:absolute;top:0;left:0;z-index:9;pointer-events:none}.prism-player .prism-ErrorMessage{width:100%;height:100%;background-color:#000;background-repeat:no-repeat;background-position:center;background-size:contain;position:absolute;z-index:99;top:0;left:0;overflow:hidden;display:none}.prism-player .prism-ErrorMessage .prism-error-content{margin-top:20px;padding:0 5px}.prism-player .prism-ErrorMessage .prism-error-content p{text-align:center;font-size:12px;color:#fff}.prism-player .prism-ErrorMessage .prism-error-operation{margin-top:10px;margin-bottom:10px;padding-bottom:5px;border-bottom:1.5px;border-bottom-color:rgba(255,255,255,.15);border-bottom-style:dotted;text-align:center}.prism-player .prism-ErrorMessage .prism-error-operation a{width:80px;height:32px;line-height:32px;vertical-align:top;display:inline-block;margin-left:10px}.prism-player .prism-ErrorMessage .prism-error-operation a.prism-button-refresh{color:#21c5e0;border:solid 1px #21c5e0}.prism-player .prism-ErrorMessage .prism-error-operation a.prism-button-refresh:hover{color:#05d3f5;border-color:#05d3f5;cursor:pointer}.prism-player .prism-ErrorMessage .prism-error-operation a.prism-button-refresh:active{color:#026a7b;border-color:#026a7b}.prism-player .prism-ErrorMessage .prism-error-operation .prism-button-orange:visited{color:#05d3f5}.prism-player .prism-ErrorMessage .prism-detect-info{color:#fff;font-size:10px}.prism-player .prism-ErrorMessage .prism-detect-info p{padding:0 5px;word-break:break-all;margin:0 0 4px}.prism-player .prism-ErrorMessage .prism-detect-info span.info-label{display:inline-block;font-weight:700}.prism-player .prism-ErrorMessage .prism-detect-info span.info-content{color:gray}.prism-player .prism-big-play-btn{display:none;z-index:1000}.prism-player .prism-license-watermark{z-index:100;position:absolute;width:300px;height:120px;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;right:20px;top:20px;border:1px solid rgba(216,216,216,.12);box-shadow:0 0 12px 0 rgba(130,130,130,.2);border-radius:2px;backdrop-filter:blur(4px);background-color:rgba(255,255,255,.12)}.prism-player .prism-license-watermark .no-authorization{font-weight:500;font-size:24px;color:rgba(255,255,255,.9);text-shadow:1px 1px 2px rgba(0,0,0,.5);margin:0 50px}.prism-player .prism-license-watermark .apply-button{margin-top:12px;padding:5px 20px;background-color:#00bcd4;border:1px solid #26c5da;font-weight:400;font-size:14px;color:#fff;line-height:20px;cursor:pointer}.prism-player .prism-controlbar{width:100%;height:44px;position:relative;z-index:10;font-size:14px}.prism-player .prism-controlbar .prism-controlbar-bg{background:rgba(75,75,75,.15);width:100%;height:40px;position:absolute;bottom:0;left:0;z-index:-1}.prism-player .prism-time-display{height:40px;line-height:40px;color:#a4aab3;font-size:12px}.prism-player .prism-time-display .current-time{color:#fff}.prism-player .prism-live-time-display{height:44px;line-height:44px;color:#a4aab3;font-size:12px}.prism-player .prism-live-time-display span{display:inline}.prism-player .prism-live-time-display .live-text{margin-left:5px;font-size:12px;color:#ebecec}.prism-player .prism-live-time-display .current-time{color:#fff}.prism-player .prism-fullscreen-btn:hover{animation:hoverAnimationScale 1s 1;-moz-animation:hoverAnimationScale 1s 1;-webkit-animation:hoverAnimationScale 1s 1;-o-animation:hoverAnimationScale 1s 1}.prism-player .prism-liveshift-progress,.prism-player .prism-progress{bottom:40px!important;width:100%;height:4px;background:rgba(195,197,198,.5);box-shadow:inset 1px 1px 1px 0 rgba(0,0,0,.06);position:relative;cursor:pointer}.prism-player .prism-liveshift-progress .prism-progress-time,.prism-player .prism-progress .prism-progress-time{position:absolute;top:-25px;background:rgba(0,0,0,.8);box-shadow:0 0 5px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 0 5px 0 rgba(0,0,0,.1);color:#fff;font-size:14px;border-radius:7.5px;padding:0 6px 0 6px;text-align:center;white-space:nowrap}.prism-player .prism-liveshift-progress .prism-progress-loaded,.prism-player .prism-progress .prism-progress-loaded{position:absolute;top:0;left:0;width:0;height:100%;background:#c3c5c6}.prism-player .prism-liveshift-progress .prism-progress-played,.prism-player .prism-progress .prism-progress-played{position:absolute;top:0;left:0;width:0;height:100%;background-color:#00c1de}.prism-player .prism-liveshift-progress .prism-progress-cursor,.prism-player .prism-progress .prism-progress-cursor{position:absolute;border-radius:8px;top:-5px;width:16px;height:16px;overflow:hidden;box-sizing:content-box;background:url(./img/dragcursorhover.png) center;display:none}.prism-player .prism-liveshift-progress .prism-progress-cursor img,.prism-player .prism-progress .prism-progress-cursor img{width:14px;height:14px;position:absolute;top:50%;left:50%;-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.prism-player .prism-liveshift-progress .cursor-hover,.prism-player .prism-progress .cursor-hover{border-radius:9px;width:18px;height:18px;top:-5px!important}.prism-player .prism-liveshift-progress .cursor-hover img,.prism-player .prism-progress .cursor-hover img{width:16px;height:16px}.prism-player .prism-liveshift-progress .prism-progress-marker,.prism-player .prism-progress .prism-progress-marker{width:100%;height:100%;position:absolute}.prism-player .prism-liveshift-progress .prism-progress-marker .prism-marker-dot,.prism-player .prism-progress .prism-progress-marker .prism-marker-dot{position:absolute;background:#d9edf7;width:5px;height:100%;border-radius:20%}.prism-player .prism-progress-hover{cursor:pointer;height:6px;transition:height .1s}.prism-player .prism-progress-hover .prism-marker-dot{width:10px;height:80%;top:8%;border-radius:30%}.prism-player .prism-progress-hover .prism-progress-cursor{top:-4px}.prism-player .prism-liveshift-progress{background:0 0}.prism-player .prism-liveshift-progress .prism-enable-liveshift{cursor:pointer;position:absolute;background:#fff;height:4px}.prism-player .prism-liveshift-progress .prism-enable-liveshift:hover{height:6px;transition:height .1s}.prism-player .prism-liveshift-progress .prism-liveshift-seperator{height:15px;position:absolute;right:0;top:-8px;color:#fff;margin-right:5px;margin-left:5px;right:-65px}.prism-player .prism-marker-text{padding:5px;background:rgba(0,0,0,.8);position:absolute;max-width:180px;max-height:100px;bottom:50px;color:#fff;border-radius:3px;z-index:9999;display:none;overflow:auto}.prism-player .prism-marker-text p{text-align:center;word-break:break-all;margin:0;font-size:12px}.prism-player .prism-loading{width:55px;height:55px;z-index:10}.prism-player .prism-loading .circle-androidFirefox{background-color:rgba(0,0,0,0);border:5px solid;border-color:rgba(0,193,222,.2) rgba(0,193,222,.5) rgba(0,193,222,.7) rgba(0,193,222,.1);opacity:.9;border-radius:50px;width:45px;height:45px;margin:0 auto}.prism-player .prism-loading .circle{background-color:rgba(0,0,0,0);border:5px solid;border-color:rgba(0,193,222,.2) rgba(0,193,222,.5) rgba(0,193,222,.7) rgba(0,193,222,.1);opacity:.9;border-radius:50px;width:45px;height:45px;margin:0 auto;-moz-animation:spinoffPulse .9s infinite linear;-webkit-animation:spinoffPulse .9s infinite linear}.prism-player .prism-hide{display:none}.prism-player .prism-snapshot-btn{width:32px;height:32px;background:url(./img/snapshot.png) no-repeat;background-size:contain}.prism-player .prism-snapshot-btn:hover{animation:hoverAnimationScale 1s 1;-moz-animation:hoverAnimationScale 1s 1;-webkit-animation:hoverAnimationScale 1s 1;-o-animation:hoverAnimationScale 1s 1;cursor:pointer}.prism-player .prism-snapshot-btn:active{displa:block}.prism-player .prism-info-display{width:100%;color:#fff;font-size:18px;text-align:center;top:50%;position:absolute;z-index:900;height:44px;line-height:28px;font-size:16px;padding:10px 12px 10px 12px}.prism-player .prism-info-display span{color:#00c1de}.prism-player .prism-info-left-bottom{width:auto!important;top:auto!important;bottom:70px;left:20px!important;text-align:left}.prism-player .prism-info-top-center{width:auto!important;top:20px!important;left:50%!important;text-align:left!important;-ms-transform:translateX(-50%)!important;transform:translateX(-50%)!important;color:red!important}.prism-player .prism-info-black{color:#000!important}.prism-player .prism-auto-stream-selector{position:absolute;bottom:50%;width:100%;margin:auto;color:#efeff4;display:none}.prism-player .prism-auto-stream-selector p.tip-text{text-align:center}.prism-player .prism-auto-stream-selector .operators{width:100px;margin:auto}.prism-player .prism-button-cancel{font-size:16px;border:1px #ffffffa8 solid;padding:2px 5px 2px 5px;color:#ffffffa8;margin-left:5px;background:#503f3f3d}.prism-player .prism-button-ok{font-size:16px;border:1px #fff solid;padding:2px 5px 2px 5px;color:#fff;background:#503f3f63}.prism-player .prism-button-cancel:hover,.prism-player .prism-button-ok:hover{color:#f5f5f5}.prism-player .prism-cc-btn{height:24px;width:24px;background:url(./img/cc.png) center no-repeat;background-size:contain}.prism-player .prism-cc-btn:hover{cursor:pointer;animation:hoverAnimationScale 1s 1;-moz-animation:hoverAnimationScale 1s 1;-webkit-animation:hoverAnimationScale 1s 1;-o-animation:hoverAnimationScale 1s 1}.prism-player .prism-setting-btn{height:24px;width:24px;background:url(./img/setting.png) center no-repeat;background-size:contain}.prism-player .prism-setting-btn:hover{cursor:pointer;animation:hoverAnimationRotate 1s 1;-moz-animation:hoverAnimationRotate 1s 1;-webkit-animation:hoverAnimationRotate 1s 1;-o-animation:hoverAnimationRotate 1s 1}.prism-player .prism-setting-list{background:rgba(60,60,60,.95);width:220px;position:absolute;right:14px;bottom:45px;display:none;z-index:10000;text-align:left}.prism-player .prism-setting-list .prism-setting-item{font-size:14px;color:#ebecec;height:30px}.prism-player .prism-setting-list .prism-setting-item .setting-content{width:100%}.prism-player .prism-setting-list .prism-setting-item .setting-content:hover{background:rgba(216,216,216,.1);cursor:pointer}.prism-player .prism-setting-list .prism-setting-item .setting-content span{line-height:30px}.prism-player .prism-setting-list .prism-setting-item .setting-content .setting-title{margin-left:15px}.prism-player .prism-setting-list .prism-setting-item .setting-content .current-setting{float:right;max-width:120px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.prism-player .prism-setting-list .prism-setting-item .array{display:inline-block;border-right:2px solid;border-bottom:2px solid;border-color:#fff;width:8px;height:8px;-ms-transform:rotate(-45deg);transform:rotate(-45deg);margin-right:10px;margin-top:10px;margin-left:10px;float:right}.prism-player .prism-setting-selector{right:40px;position:absolute;bottom:45px;width:150px;background:rgba(60,60,60,.95);font-size:14px;color:#ebecec;display:none;z-index:10000;text-align:left}.prism-player .prism-setting-selector .header{background:#242424;width:150px;height:30px}.prism-player .prism-setting-selector .header:hover{cursor:pointer}.prism-player .prism-setting-selector .header .left-array{display:inline-block;border-left:2px solid;border-bottom:2px solid;border-color:#fff;width:8px;height:8px;-ms-transform:rotate(45deg);transform:rotate(45deg);margin-right:6px;margin-top:12px;margin-left:16px;float:left}.prism-player .prism-setting-selector .header span{line-height:30px}.prism-player .prism-setting-selector ul.selector-list::-webkit-scrollbar{width:10px;background-color:#424242}.prism-player .prism-setting-selector ul.selector-list::-webkit-scrollbar-track{background-color:#424242}.prism-player .prism-setting-selector ul.selector-list::-webkit-scrollbar-thumb{background-color:#8e8e8e;border:1px solid #424242;border-radius:5px}.prism-player .prism-setting-selector ul{list-style-type:none;padding-left:0;max-height:150px;overflow-y:auto;padding-left:13px;margin-top:5px}.prism-player .prism-setting-selector ul li{height:28px;padding-left:10px}.prism-player .prism-setting-selector ul li.current{color:#30adf2;padding-left:0}.prism-player .prism-setting-selector ul li.current:before{content:"";display:inline-block;line-height:0;border:5px solid transparent;border-left-color:#30adf2;border-right-width:0;margin-top:5px;padding-right:5px}.prism-player .prism-setting-selector ul li:hover{background:rgba(216,216,216,.1);cursor:pointer}.prism-player .prism-setting-selector ul span{line-height:28px;max-width:110px;display:inline-block;vertical-align:middle;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.prism-player .prism-thumbnail{border:1px solid rgba(0,0,0,.8);width:174px;height:98px;position:absolute;bottom:50px;display:none;z-index:10}.prism-player .prism-thumbnail .none{border:none}.prism-player .prism-thumbnail span{font-size:12px;color:#fff;line-height:20px;background:rgba(0,0,0,.8);text-align:center;text-shadow:1px 1px 4px #373d41;padding-left:5px;padding-right:5px;display:inline-block;position:absolute;bottom:0;left:33%}.prism-player .prism-tooltip{background:#3c3c3c;box-shadow:0 0 5px 0 rgba(0,0,0,.1);height:28px;margin:0;padding-left:5px;padding-right:5px;padding-top:0;padding-bottom:0;position:absolute;bottom:50px;color:#fff;line-height:28px;font-size:10px;white-space:nowrap;display:none;z-index:10}.prism-player .disabled{pointer-events:none;color:gray}:-webkit-full-screen{width:100%!important;height:100%!important}:-moz-full-screen{width:100%!important;height:100%!important}:-ms-full-screen{width:100%!important;height:100%!important}:-ms-fullscreen{width:100%!important;height:100%!important}:-webkit-full-screen{width:100%!important;height:100%!important}:fullscreen{width:100%!important;height:100%!important}body.prism-full-window{padding:0;margin:0;height:100%;overflow-y:auto}.prism-fullscreen{position:fixed;overflow:hidden;z-index:99999;left:0!important;top:0!important;bottom:0!important;right:0!important;width:100%!important;height:100%!important;position:absolute!important}.prism-button{cursor:pointer;text-align:center;text-shadow:0 1px 1px rgba(0,0,0,.3);border-radius:.5em;box-shadow:0 1px 2px rgba(0,0,0,.2)}.prism-button-orange{color:#a56117;border:solid 1px #a56117}.prism-button-retry{color:#f2dede;border:solid 1px #f2dede}.prism-button-orange:hover{color:#d67400;border-color:#d67400}.prism-button-orange:active{color:#d67400;border-color:#d67400}.prism-button-orange:visited{color:#d67400}.prism-button-retry:hover{color:#fcf8e3;border-color:#fcf8e3}.prism-button-retry:active{color:#fcf8e3;border-color:#fcf8e3}.prism-button-retry:visited{color:#fcf8e3}.prism-center{position:absolute;left:50%;-ms-transform:translateX(-50%);transform:translateX(-50%)}.prism-width90{width:90%}.prism-stream-selector{font-size:16px;position:relative;line-height:32px}.prism-stream-selector .current-stream-selector{text-align:center;width:70px;display:none;color:#efeff4}.prism-stream-selector .current-stream-selector:hover{cursor:pointer;color:#00c1de}.prism-stream-selector .stream-selector-tip{color:#fff;text-align:center;padding:2px 5px 2px 5px;display:none;position:absolute;bottom:61.5px;white-space:nowrap;left:43%;font-size:18px}.prism-stream-selector .stream-selector-list{position:absolute;bottom:32px;background:rgba(0,0,0,.5);color:#efeff4;padding:5px 5px 0 5px;width:70px;margin:0;display:none}.prism-stream-selector .stream-selector-list li{list-style-type:none;text-align:center;white-space:nowrap;padding:0 2px 0 2px;line-height:24px}.prism-stream-selector .stream-selector-list li:last-child{margin-bottom:10px}.prism-stream-selector .stream-selector-list li.current{color:#00c1de}.prism-stream-selector .stream-selector-list li span.current{color:#00c1de}.prism-stream-selector .stream-selector-list li:hover{cursor:pointer;color:#00c1de}.prism-speed-selector{font-size:16px;position:relative;line-height:32px}.prism-speed-selector .current-speed-selector{color:#efeff4;text-align:center;width:60px}.prism-speed-selector .current-speed-selector:hover{cursor:pointer;color:#00c1de}.prism-speed-selector .speed-selector-list{position:absolute;bottom:32px;background:rgba(0,0,0,.5);color:#efeff4;padding:5px 5px 0 5px;display:none;margin:0}.prism-speed-selector .speed-selector-list li{list-style-type:none;text-align:center;white-space:nowrap;padding:0 2px 0 2px;line-height:24px}.prism-speed-selector .speed-selector-list li:last-child{margin-bottom:10px}.prism-speed-selector .speed-selector-list li.current{color:#00c1de}.prism-speed-selector .speed-selector-list li span.current{color:#00c1de}.prism-speed-selector .speed-selector-list li:hover{cursor:pointer;color:#00c1de}.prism-ai-container{position:absolute;overflow:hidden}.prism-ai-container .prism-ai-marking{font-size:12px;position:absolute}.prism-ai-container .prism-ai-marking[vh=large]{font-size:18px}.prism-ai-container .prism-ai-marking[vh=middle]{font-size:16px}.prism-ai-container .prism-ai-marking .prism-ai-rect-region{position:relative;display:inline-block}.prism-ai-container .prism-ai-marking .prism-ai-rect-region .prism-ai-title{height:0;-ms-transform:translateY(-40px);transform:translateY(-40px)}.prism-ai-container .prism-ai-marking .prism-ai-rect-region .prism-ai-title p{background:#ff1d00;text-align:center;width:100%;color:#fff;word-break:keep-all;margin:10px 0 0 0}.prism-ai-container .prism-ai-marking .prism-ai-rect-region .prism-ai-title .top-left-anchor{width:5px;height:5px;border-top-color:red;border-top-style:solid;border-left-color:red;border-left-style:solid;border-width:1px;-ms-transform:translate(-5px,10px);transform:translate(-5px,10px)}.prism-ai-container .prism-ai-marking .prism-ai-rect-region .prism-ai-title .top-right-anchor{width:5px;height:5px;border-top-color:red;border-top-style:solid;border-right-color:red;border-right-style:solid;border-width:1px;-ms-transform:translate(5px,5px);transform:translate(5px,5px);float:right}.prism-ai-container .prism-ai-marking .prism-ai-rect-region .prism-ai-rect{border-style:solid;border-color:#ff1d00;border-width:1px;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;color:rgba(255,29,0,.3);background:rgba(255,29,0,.1)}.prism-ai-container .prism-ai-marking .prism-ai-rect-region .prism-ai-rect .prism-ai-slash-container{overflow:hidden;width:100%;height:100%;position:absolute}.prism-ai-container .prism-ai-marking .prism-ai-rect-region .prism-ai-rect .prism-ai-slash{content:"";display:block;box-sizing:border-box;border-top-width:1px;border-top-style:solid;height:10px;margin-top:15px;border-bottom-width:1px;border-bottom-style:solid;transform:rotateZ(-45deg) scaleX(2);-ms-transform-origin:bottom center;transform-origin:bottom center}.prism-ai-container .prism-ai-marking .prism-ai-rect-region .prism-ai-rect .prism-ai-top-slash{margin-top:-10px!important}.prism-ai-container .prism-ai-marking .prism-ai-rect-region .anchor-plug{position:absolute}.prism-ai-container .prism-ai-marking .prism-ai-rect-region .top-left{top:-7px;left:-2px}.prism-ai-container .prism-ai-marking .prism-ai-rect-region .top-right{top:-7px;right:-2px}.prism-ai-container .prism-ai-marking .prism-ai-rect-region .bottom-left{bottom:-8px;left:-2px}.prism-ai-container .prism-ai-marking .prism-ai-rect-region .bottom-right{bottom:-8px;right:-2px}.prism-ai-container .prism-ai-marking .prism-ai-labels{color:#fff;float:right;background:rgba(0,0,0,.4);padding-top:5px;padding-bottom:5px}.prism-ai-container .prism-ai-marking .prism-ai-labels p{text-align:left;padding-left:5px;padding-right:5px;margin:0}.prism-ai-container .prism-ai-marking .prism-ai-labels a{padding-left:5px;padding-right:5px}.prism-ai-container .prism-ai-marking .prism-ai-labels p[vh=large]{padding-left:25px;padding-right:25px}.prism-ai-container .prism-ai-marking .prism-ai-labels p[vh=middle]{padding-left:15px;padding-right:15px}video::-webkit-media-text-track-container{overflow:visible!important}video::cue{line-height:1.7}.loading-center{position:absolute;top:50%;left:50%;-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}
/****reset****/
body,
div,
table,
tr,
td,
th,
h1,
h2,
h3,
h4,
h5,
h6,
form,
input,
button,
label,
select,
textarea,
p,
u,
i,
em,
ul,
ol,
li,
dl,
dd,
dt,
img,
article,
aside,
details,
figcaption,
figure,
footer,
header,
menu,
nav,
section {
box-sizing: border-box;
margin: 0;
padding: 0;
font-size: 100%;
vertical-align: baseline;
border: 0;
outline: 0;
}
li {
list-style: none;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-size: 100%;
}
table {
border-collapse: collapse;
border-spacing: 0;
width: 100%;
}
a,
input,
select,
textarea,
area,
button {
outline: none;
font-family: inherit;
font-size: inherit;
border: none;
background: none;
color: inherit;
}
a {
text-decoration: none;
}
a:hover {
text-decoration: none;
}
textarea {
overflow: auto;
resize: none;
}
input[type="button"],
input[type="submit"],
input[type="reset"] {
cursor: pointer;
-webkit-appearance: none;
}
html,
body {
overflow-x: hidden;
width: 100%;
height: 100%;
background: #ffffff;
}
* {
-webkit-overflow-scrolling: touch;
}
html {
-webkit-tap-highlight-color: transparent;
}
body {
text-align: left;
}
body #app {
height: 100%;
}
body #app::-webkit-scrollbar {
display: none;
}
body #app::-webkit-scrollbar-thumb {
display: none;
}
body #app::-webkit-scrollbar-track {
display: none;
}
.fl {
float: left;
}
.fr {
float: right;
}
.clearfix {
zoom: 1;
}
.clearfix::before,
.clearfix::after {
display: table;
content: " ";
}
.clearfix::after {
clear: both;
height: 0;
font-size: 0;
visibility: hidden;
}
.ant-skeleton {
display: table;
width: 100%;
}
.ant-skeleton + .ant-skeleton {
margin-top: 0.64rem;
}
.ant-skeleton.active {
display: none;
}
.ant-skeleton-content {
display: table-cell;
width: 100%;
margin-bottom: 0.64rem;
vertical-align: top;
}
.ant-skeleton-content .ant-skeleton-title {
width: 100%;
height: 0.53333rem;
margin-top: 0.26667rem;
background: #f2f2f2;
}
.ant-skeleton-content .ant-skeleton-title + .ant-skeleton-paragraph {
margin-top: 0.64rem;
}
.ant-skeleton-content .ant-skeleton-paragraph {
padding: 0;
}
.ant-skeleton-content .ant-skeleton-paragraph > li {
width: 23.3%;
height: 0.32rem;
list-style: none;
background: #f2f2f2;
}
.ant-skeleton-content .ant-skeleton-paragraph > li + li {
margin-top: 0.26667rem;
}
.ant-skeleton-content .ant-skeleton-paragraph > li:last-child:not(:first-child):not(:nth-child(2)) {
width: 61%;
}
.ant-skeleton.ant-skeleton-active .ant-skeleton-avatar,
.ant-skeleton.ant-skeleton-active .ant-skeleton-button,
.ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-paragraph > li,
.ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-title,
.ant-skeleton.ant-skeleton-active .ant-skeleton-image,
.ant-skeleton.ant-skeleton-active .ant-skeleton-input {
background: -webkit-gradient(linear, left top, right top, color-stop(25%, #f2f2f2), color-stop(37%, #e6e6e6), color-stop(63%, #f2f2f2));
background: linear-gradient(90deg, #f2f2f2 25%, #e6e6e6 37%, #f2f2f2 63%);
background-size: 400% 100%;
animation: ant-skeleton-loading 1.4s ease infinite;
}
@keyframes ant-skeleton-loading {
0% {
background-position: 100% 50%;
}
100% {
background-position: 0 50%;
}
}
@keyframes spinner-anime {
100% {
transform: rotate(360deg);
}
}
.toast-loading {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
text-align: center;
z-index: 9999999999;
}
.toast-loading.active {
display: none;
}
.toast-loading.none {
display: none;
}
.toast-loading .loading-cont {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 15px 15px;
border-radius: 7px;
background-clip: padding-box;
color: #fff;
background-color: rgba(58, 58, 58, 0.9);
font-size: 15px;
line-height: 20px;
}
.toast-loading .loading-cont .svg {
margin: 0;
width: 32px;
height: 32px;
display: inline-block;
width: 20px;
height: 20px;
background-image: url("../../../../../../../wdComponent/src/main/resources/rawfile/apph5/image/loading.svg");
background-position: 50%;
background-size: 100%;
background-repeat: no-repeat;
animation: spinner-anime 1s linear infinite;
}
.toast-loading .loading-cont .svg-text {
display: inline-block;
position: relative;
top: 4px;
}
.skeleton-loading {
display: block;
padding: 0.32rem 0.48rem 0;
height: 17.57333333rem;
overflow: hidden;
}
.skeleton-loading.active {
position: fixed;
left: 0;
top: 0;
width: 100%;
opacity: 0;
visibility: hidden;
z-index: -1;
}
.skeleton-loading.none {
display: none;
}
.error-block {
display: none;
box-sizing: border-box;
text-align: center;
padding-top: 3.76rem;
}
.error-block.active {
display: block;
}
.error-block .error-block-image {
text-align: center;
}
.error-block .error-block-image img {
width: 4.26666667rem;
height: 2.98666667rem;
}
.error-block .error-block-retry-btn {
width: 2.13333333rem;
height: 0.74666667rem;
border-radius: 0.08rem;
border: 0.02666667rem solid #EDEDED;
margin: 0 auto;
margin-top: 0.42666667rem;
font-size: 0.32rem;
font-weight: bold;
line-height: 0.74666667rem;
text-align: center;
color: #666666;
}
.error-block .error-block-description-title {
text-align: center;
margin: 0 auto;
font-size: 14px;
color: rgba(51, 51, 51, 0.5);
}
.ellipsis1 {
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 1;
line-clamp: 1;
-webkit-box-orient: vertical;
word-wrap: break-word;
}
#app.fixed {
position: fixed;
left: 0;
top: 0;
z-index: -1;
visibility: hidden;
opacity: 0;
width: 100%;
}
.gx-mobile.fixed {
position: fixed;
left: 0;
top: 0;
z-index: -1;
visibility: hidden;
opacity: 0;
width: 100%;
height: 17.57333333rem;
}
.gx-mobile.active {
animation-name: fadeIn;
animation-duration: 0.2s;
}
.refresh-content {
height: 100%;
}
.refresh-content .van-pull-refresh {
height: 100%;
}
html {
transition: color 300ms, background-color 300ms;
}
body .van-image__error,
body .van-image__loading {
display: block;
}
body .prism-fullscreen {
z-index: 999999 !important;
}
body .prism-player .prism-animation,
body .prism-player .prism-detect-info,
body .prism-player .prism-button,
body .prism-player .prism-setting-quality,
body .prism-player .prism-setting-audio,
body .prism-player .prism-setting-cc,
body .prism-player .prism-cc-btn,
body .prism-player .prism-volume,
body .prism-player .prism-tooltip,
body .prism-player .prism-setting-btn,
body .prism-player .prism-button-retry,
body .prism-player .dplayer-thumb,
body .prism-player .prism-progress-played,
body .prism-player .prism-progress-cursor,
body .prism-player .prism-progress-hover,
body .prism-player .prism-big-play-btn,
body .prism-player .prism-controlbar,
body .prism-player .prism-info-display,
body .prism-player .prism-text-overlay,
body .prism-player .prism-error-operation,
body .prism-player .prism-ErrorMessage,
body .prism-player .prism-cover,
body .prism-player .prism-loading {
display: none !important;
}
#__vconsole {
z-index: 10000000;
}
#__vconsole .vc-switch {
z-index: 10000000;
}
#__vconsole .vc-panel {
min-height: unset !important;
height: 500px !important;
}
#app {
overflow-y: hidden;
overflow-x: hidden;
}
#app .van-loading {
text-align: center;
}
html[dark-mode] body {
background-color: #161827;
}
html[dark-mode] body .gx-mobile .vote {
background-color: #1D1F2F;
}
html[dark-mode] body .gx-mobile .suggested .suggested-title {
color: #d9d9d9ff;
}
html[dark-mode] body .gx-mobile .suggested .suggested-item_title {
color: #d9d9d9ff !important;
}
html[dark-mode] body .gx-mobile .suggested .subtitle {
color: #d9d9d9ff !important;
}
html[dark-mode] body .gx-mobile .suggested .left span {
color: #ffffff5c !important;
}
html[dark-mode] body .gx-mobile .title {
color: #d9d9d9ff;
}
html[dark-mode] body .gx-mobile .ptxt {
color: #ffffffab;
}
html[dark-mode] body .gx-mobile .btsIem {
background-color: #161828;
}
html[dark-mode] body .gx-mobile .stx {
color: #ffffffab !important;
}
html[dark-mode] body .gx-mobile .jd .s1 {
background: linear-gradient(270deg, #e5111eff 0%, #ffb5b9ff 100%);
}
html[dark-mode] body .gx-mobile .jd .s2 {
background-color: #393A47 !important;
}
html[dark-mode] body .gx-mobile .open {
background: linear-gradient(179.9deg, #1d1f2e00 0%, #1d1f2eff 48%, #1d1f2eff 99%);
}
html[dark-mode] body .gx-mobile .open img {
width: 0.42667rem;
height: 0.42667rem;
}
html[dark-mode] body .gx-mobile .time {
color: rgba(255, 255, 255, 0.4);
}
html[dark-mode] body .gx-mobile #newsContent {
background-color: #12131e !important;
color: #ccc;
}
html[dark-mode] body .gx-mobile #newsContent h1,
html[dark-mode] body .gx-mobile #newsContent h2,
html[dark-mode] body .gx-mobile #newsContent div,
html[dark-mode] body .gx-mobile #newsContent h3,
html[dark-mode] body .gx-mobile #newsContent p,
html[dark-mode] body .gx-mobile #newsContent h4,
html[dark-mode] body .gx-mobile #newsContent h5,
html[dark-mode] body .gx-mobile #newsContent h6,
html[dark-mode] body .gx-mobile #newsContent ul,
html[dark-mode] body .gx-mobile #newsContent li,
html[dark-mode] body .gx-mobile #newsContent ol {
background-color: #12131e !important;
color: #ccc !important;
}
html[dark-mode] body .gx-mobile #newsContent .preview-video div,
html[dark-mode] body .gx-mobile #newsContent .preview-video p {
background-color: rgba(255, 255, 255, 0) !important;
}
html[dark-mode] body .footer {
background-color: #12131e;
border-top: #252630;
}
.anticon-spin {
animation: loadingCircle 1s infinite linear;
}
@keyframes fadeIn {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
@keyframes loadingCircle {
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@-webkit-keyframes loadingCircle {
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@keyframes loadingCircle {
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
/*# sourceMappingURL=global.css.map */
\ No newline at end of file
{"version":3,"sources":["global.less"],"names":[],"mappings":";AACA;AAAM;AAAK;AAAO;AAAI;AAAI;AAAI;AAAI;AAAI;AAAI;AAAI;AAAI;AAAI;AAAM;AAAO;AAAQ;AAAO;AAAQ;AAAU;AAAG;AAAG;AAAG;AAAI;AAAI;AAAI;AAAI;AAAI;AAAI;AAAI;AAAK;AAAS;AAAO;AAAS;AAAY;AAAQ;AAAQ;AAAQ;AAAM;AAAK;EACpN,sBAAA;EACA,SAAA;EACA,UAAA;EACA,eAAA;EACA,wBAAA;EACA,SAAA;EACA,UAAA;;AAGF;EACE,gBAAA;;AAGF;AAAI;AAAI;AAAI;AAAI;AAAI;EAClB,eAAA;;AAGF;EACE,yBAAA;EACA,iBAAA;EACA,WAAA;;AAGF;AAAG;AAAO;AAAQ;AAAU;AAAM;EAChC,aAAA;EACA,oBAAA;EACA,kBAAA;EACA,YAAA;EACA,gBAAA;EACA,cAAA;;AAGF;EACE,qBAAA;;AAGF,CAAC;EACC,qBAAA;;AAGF;EACE,cAAA;EACA,YAAA;;AAGF,KAAK;AAAiB,KAAK;AAAiB,KAAK;EAC/C,eAAA;EACA,wBAAA;;AAGF;AAAM;EACJ,kBAAA;EACA,WAAA;EACA,YAAA;EACA,mBAAA;;AAGF;EACE,iCAAA;;AAGF;EACE,wCAAA;;AAGF;EACE,gBAAA;;AADF,IAGE;EACE,YAAA;;AAEA,IAHF,KAGG;EACC,aAAA;;AAGF,IAPF,KAOG;EACC,aAAA;;AAGF,IAXF,KAWG;EACC,aAAA;;AAKN;EACE,WAAA;;AAGF;EACE,YAAA;;AAGF;EACE,OAAA;;AAEA,SAAC;AACD,SAAC;EACC,cAAA;EACA,SAAS,GAAT;;AAGF,SAAC;EACC,WAAA;EACA,SAAA;EACA,YAAA;EACA,kBAAA;;AAIJ;EACE,cAAA;EACA,WAAA;;AAGF,aAAc;EACZ,mBAAA;;AAGF,aAAa;EACX,aAAA;;AAGF;EACE,mBAAA;EACA,WAAA;EACA,sBAAA;EACA,mBAAA;;AAGF,qBAAsB;EACpB,WAAA;EACA,kBAAA;EACA,sBAAA;EACA,mBAAA;;AAGF,qBAAsB,oBAAoB;EACxC,mBAAA;;AAGF,qBAAsB;EACpB,UAAA;;AAGF,qBAAsB,wBAAwB;EAC5C,YAAA;EACA,eAAA;EACA,gBAAA;EACA,mBAAA;;AAGF,qBAAsB,wBAAwB,KAAK;EACjD,sBAAA;;AAGF,qBAAsB,wBAAwB,KAAI,WAAW,IAAI,cAAc,IAAI;EACjF,UAAA;;AAGF,aAAa,oBAAqB;AAAsB,aAAa,oBAAqB;AAAsB,aAAa,oBAAqB,sBAAsB,wBAAwB;AAAM,aAAa,oBAAqB,sBAAsB;AAAqB,aAAa,oBAAqB;AAAqB,aAAa,oBAAqB;EAC1W,YAAY,8CAA8C,0BAA0B,0BAA0B,yBAA9G;EACA,YAAY,6DAAZ;EACA,0BAAA;EACA,kDAAA;;AAGF;EACE;IACE,6BAAA;;EAEF;IACE,0BAAA;;;AAIJ;EACE;IACE,WAAW,cAAX;;;AAIJ;EACE,eAAA;EACA,MAAA;EACA,OAAA;EACA,WAAA;EACA,YAAA;EACA,aAAA;EACA,uBAAA;EACA,mBAAA;EACA,kBAAA;EACA,mBAAA;;AAEA,cAAC;EACC,aAAA;;AAGF,cAAC;EACC,aAAA;;AAjBJ,cAoBE;EACE,aAAA;EACA,sBAAA;EACA,uBAAA;EACA,mBAAA;EACA,kBAAA;EACA,kBAAA;EACA,4BAAA;EACA,WAAA;EACA,uCAAA;EACA,eAAA;EACA,iBAAA;;AA/BJ,cAoBE,cAaE;EACE,SAAA;EACA,WAAA;EACA,YAAA;EACA,qBAAA;EACA,WAAA;EACA,YAAA;EACA,sBAAsB,uBAAtB;EACA,wBAAA;EACA,qBAAA;EACA,4BAAA;EACA,2CAAA;;AA5CN,cAoBE,cA2BE;EACE,qBAAA;EACA,kBAAA;EACA,QAAA;;AAKN;EACE,cAAA;EACA,0BAAA;EACA,sBAAA;EACA,gBAAA;;AAEA,iBAAC;EACC,eAAA;EACA,OAAA;EACA,MAAA;EACA,WAAA;EACA,UAAA;EACA,kBAAA;EACA,WAAA;;AAGF,iBAAC;EACC,aAAA;;AAIJ;EACE,aAAA;EACA,sBAAA;EACA,kBAAA;EACA,oBAAA;;AAEA,YAAC;EACC,cAAA;;AAPJ,YAUE;EACE,kBAAA;;AAXJ,YAUE,mBAGE;EACE,oBAAA;EACA,qBAAA;;AAfN,YAmBE;EACE,oBAAA;EACA,qBAAA;EACA,sBAAA;EACA,mCAAA;EACA,cAAA;EACA,yBAAA;EAEA,kBAAA;EACA,iBAAA;EACA,0BAAA;EACA,kBAAA;EACA,cAAA;;AA/BJ,YAqCE;EACE,kBAAA;EACA,cAAA;EACA,eAAA;EACA,4BAAA;;AAOJ;EACE,gBAAA;EACA,uBAAA;EACA,oBAAA;EACA,qBAAA;EACA,aAAA;EACA,4BAAA;EACA,qBAAA;;AAIA,IAAC;EACC,eAAA;EACA,OAAA;EACA,MAAA;EACA,WAAA;EACA,kBAAA;EACA,UAAA;EACA,WAAA;;AAKF,UAAC;EACC,eAAA;EACA,OAAA;EACA,MAAA;EACA,WAAA;EACA,kBAAA;EACA,UAAA;EACA,WAAA;EACA,sBAAA;;AAGF,UAAC;EACC,sBAAA;EACA,wBAAA;;AAIJ;EACE,YAAA;;AADF,gBAGE;EACE,YAAA;;AAIJ;EACE,+CAAA;;AAEF,IAEE;AAFF,IAEqB;EACjB,cAAA;;AAHJ,IAME;EACE,0BAAA;;AAPJ,IAUE,cAEE;AAZJ,IAUE,cAEoB;AAZtB,IAUE,cAEwC;AAZ1C,IAUE,cAEuD;AAZzD,IAUE,cAE+E;AAZjF,IAUE,cAEqG;AAZvG,IAUE,cAEwH;AAZ1H,IAUE,cAEuI;AAZzI,IAUE,cAEsJ;AAZxJ,IAUE,cAEsK;AAZxK,IAUE,cAE0L;AAZ5L,IAUE,cAE+M;AAZjN,IAUE,cAE+N;AAZjO,IAUE,cAEuP;AAZzP,IAUE,cAE+Q;AAZjR,IAUE,cAEsS;AAZxS,IAUE,cAE2T;AAZ7T,IAUE,cAE8U;AAZhV,IAUE,cAEmW;AAZrW,IAUE,cAEwX;AAZ1X,IAUE,cAEgZ;AAZlZ,IAUE,cAEqa;AAZva,IAUE,cAEmb;EAC/a,wBAAA;;AAKN;EAUE,iBAAA;;AAVF,WACE;EACE,iBAAA;;AAFJ,WAKE;EACE,4BAAA;EACA,wBAAA;;AAMJ;EACE,kBAAA;EACA,kBAAA;;AAFF,IAGE;EACE,kBAAA;;AAMJ,IAAI,WACF;EAEE,yBAAA;;AAHJ,IAAI,WACF,KAIE,WAAW;EACT,yBAAA;;AANN,IAAI,WACF,KAOE,WAAW,WAET;EACE,gBAAA;;AAXR,IAAI,WACF,KAOE,WAAW,WAKT;EACE,gBAAA;;AAdR,IAAI,WACF,KAOE,WAAW,WAQT;EACE,gBAAA;;AAjBR,IAAI,WACF,KAOE,WAAW,WAWT,MACE;EACE,gBAAA;;AArBV,IAAI,WACF,KAwBE,WAAW;EACT,gBAAA;;AA1BN,IAAI,WACF,KA2BE,WAAW;EACT,gBAAA;;AA7BN,IAAI,WACF,KA8BE,WAAW;EACT,yBAAA;;AAhCN,IAAI,WACF,KAiCE,WAAW;EACT,gBAAA;;AAnCN,IAAI,WACF,KAoCE,WAAW,IACT;EACE,YAAY,qDAAZ;;AAvCR,IAAI,WACF,KAoCE,WAAW,IAIT;EACE,yBAAA;;AA1CR,IAAI,WACF,KA4CE,WAAW;EACT,YAAY,qEAAZ;;AA9CN,IAAI,WACF,KA4CE,WAAW,MAET;EACE,iBAAA;EACA,kBAAA;;AAjDR,IAAI,WACF,KAoDE,WAAW;EAET,+BAAA;;AAvDN,IAAI,WACF,KAyDE,WAAW;EACT,yBAAA;EACA,WAAA;;AA5DN,IAAI,WACF,KAyDE,WAAW,aAIT;AA9DN,IAAI,WACF,KAyDE,WAAW,aAIL;AA9DV,IAAI,WACF,KAyDE,WAAW,aAID;AA9Dd,IAAI,WACF,KAyDE,WAAW,aAII;AA9DnB,IAAI,WACF,KAyDE,WAAW,aAIQ;AA9DvB,IAAI,WACF,KAyDE,WAAW,aAIW;AA9D1B,IAAI,WACF,KAyDE,WAAW,aAIe;AA9D9B,IAAI,WACF,KAyDE,WAAW,aAImB;AA9DlC,IAAI,WACF,KAyDE,WAAW,aAIuB;AA9DtC,IAAI,WACF,KAyDE,WAAW,aAI2B;AA9D1C,IAAI,WACF,KAyDE,WAAW,aAI+B;EACtC,yBAAA;EACA,WAAA;;AAhER,IAAI,WACF,KAyDE,WAAW,aAQT,eACE;AAnER,IAAI,WACF,KAyDE,WAAW,aAQT,eACQ;EACJ,wCAAA;;AApEV,IAAI,WACF,KAyEE;EACE,yBAAA;EACA,mBAAA;;AAKN;EACE,2CAAA;;AAGF;EACE;IACE,UAAA;;EAGF;IACE,UAAA;;;AAIJ;EACE;IACE,mBAAmB,cAAnB;IACA,WAAW,cAAX;;;AAIJ;EACE;IACE,mBAAmB,cAAnB;IACA,WAAW,cAAX;;;AAIJ;EACE;IACE,mBAAmB,cAAnB;IACA,WAAW,cAAX","file":"global.css"}
\ No newline at end of file
/****reset****/
body, div, table, tr, td, th, h1, h2, h3, h4, h5, h6, form, input, button, label, select, textarea, p, u, i, em, ul, ol, li, dl, dd, dt, img, article, aside, details, figcaption, figure, footer, header, menu, nav, section {
box-sizing: border-box;
margin: 0;
padding: 0;
font-size: 100%;
vertical-align: baseline;
border: 0;
outline: 0;
}
li {
list-style: none;
}
h1, h2, h3, h4, h5, h6 {
font-size: 100%;
}
table {
border-collapse: collapse;
border-spacing: 0;
width: 100%;
}
a, input, select, textarea, area, button {
outline: none;
font-family: inherit;
font-size: inherit;
border: none;
background: none;
color: inherit;
}
a {
text-decoration: none;
}
a:hover {
text-decoration: none;
}
textarea {
overflow: auto;
resize: none;
}
input[type="button"], input[type="submit"], input[type="reset"] {
cursor: pointer;
-webkit-appearance: none;
}
html, body {
overflow-x: hidden;
width: 100%;
height: 100%;
background: #ffffff;
}
* {
-webkit-overflow-scrolling: touch;
}
html {
-webkit-tap-highlight-color: transparent;
}
body {
text-align: left;
#app {
height: 100%;
&::-webkit-scrollbar {
display: none;
}
&::-webkit-scrollbar-thumb {
display: none;
}
&::-webkit-scrollbar-track {
display: none;
}
}
}
.fl {
float: left;
}
.fr {
float: right;
}
.clearfix {
zoom: 1;
&::before,
&::after {
display: table;
content: " ";
}
&::after {
clear: both;
height: 0;
font-size: 0;
visibility: hidden;
}
}
.ant-skeleton {
display: table;
width: 100%;
}
.ant-skeleton + .ant-skeleton {
margin-top: 0.64rem;
}
.ant-skeleton.active {
display: none;
}
.ant-skeleton-content {
display: table-cell;
width: 100%;
margin-bottom: 0.64rem;
vertical-align: top;
}
.ant-skeleton-content .ant-skeleton-title {
width: 100%;
height: 0.53333rem;
margin-top: 0.26667rem;
background: #f2f2f2;
}
.ant-skeleton-content .ant-skeleton-title + .ant-skeleton-paragraph {
margin-top: 0.64rem;
}
.ant-skeleton-content .ant-skeleton-paragraph {
padding: 0;
}
.ant-skeleton-content .ant-skeleton-paragraph > li {
width: 23.3%;
height: 0.32rem;
list-style: none;
background: #f2f2f2;
}
.ant-skeleton-content .ant-skeleton-paragraph > li + li {
margin-top: 0.26667rem;
}
.ant-skeleton-content .ant-skeleton-paragraph > li:last-child:not(:first-child):not(:nth-child(2)) {
width: 61%;
}
.ant-skeleton.ant-skeleton-active .ant-skeleton-avatar, .ant-skeleton.ant-skeleton-active .ant-skeleton-button, .ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-paragraph > li, .ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-title, .ant-skeleton.ant-skeleton-active .ant-skeleton-image, .ant-skeleton.ant-skeleton-active .ant-skeleton-input {
background: -webkit-gradient(linear, left top, right top, color-stop(25%, #f2f2f2), color-stop(37%, #e6e6e6), color-stop(63%, #f2f2f2));
background: linear-gradient(90deg, #f2f2f2 25%, #e6e6e6 37%, #f2f2f2 63%);
background-size: 400% 100%;
animation: ant-skeleton-loading 1.4s ease infinite;
}
@keyframes ant-skeleton-loading {
0% {
background-position: 100% 50%;
}
100% {
background-position: 0 50%;
}
}
@keyframes spinner-anime {
100% {
transform: rotate(360deg);
}
}
.toast-loading {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
text-align: center;
z-index: 9999999999;
&.active {
display: none;
}
&.none {
display: none;
}
.loading-cont {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 15px 15px;
border-radius: 7px;
background-clip: padding-box;
color: #fff;
background-color: rgba(58, 58, 58, 0.9);
font-size: 15px;
line-height: 20px;
.svg {
margin: 0;
width: 32px;
height: 32px;
display: inline-block;
width: 20px;
height: 20px;
background-image: url("../image/loading.svg");
background-position: 50%;
background-size: 100%;
background-repeat: no-repeat;
animation: spinner-anime 1s linear infinite;
}
.svg-text {
display: inline-block;
position: relative;
top: 4px;
}
}
}
.skeleton-loading {
display: block;
padding: (12 / 37.5rem) (18 / 37.5rem) 0;
height: (659 / 37.5rem);
overflow: hidden;
&.active {
position: fixed;
left: 0;
top: 0;
width: 100%;
opacity: 0;
visibility: hidden;
z-index: -1;
}
&.none {
display: none;
}
}
.error-block {
display: none;
box-sizing: border-box;
text-align: center;
padding-top: (141 / 37.5rem);
&.active {
display: block;
}
.error-block-image {
text-align: center;
img {
width: (160 / 37.5rem);
height: (112 / 37.5rem);
}
}
.error-block-retry-btn {
width: (80 / 37.5rem);
height: (28 / 37.5rem);
border-radius: (3 / 37.5rem);
border: (1 / 37.5rem) solid #EDEDED;
margin: 0 auto;
margin-top: (16 / 37.5rem);
font-size: (12 / 37.5rem);
font-weight: bold;
line-height: (28 / 37.5rem);
text-align: center;
color: #666666;
}
.error-block-description {
}
.error-block-description-title {
text-align: center;
margin: 0 auto;
font-size: 14px;
color: rgba(51, 51, 51, 0.5);
}
.error-block-description-subtitle {
}
}
.ellipsis1 {
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 1;
line-clamp: 1;
-webkit-box-orient: vertical;
word-wrap: break-word;
}
#app {
&.fixed {
position: fixed;
left: 0;
top: 0;
z-index: -1;
visibility: hidden;
opacity: 0;
width: 100%;
}
}
.gx-mobile {
&.fixed {
position: fixed;
left: 0;
top: 0;
z-index: -1;
visibility: hidden;
opacity: 0;
width: 100%;
height: (659 / 37.5rem);
}
&.active {
animation-name: fadeIn;
animation-duration: .2s;
}
}
.refresh-content {
height: 100%;
.van-pull-refresh {
height: 100%;
}
}
html {
transition: color 300ms, background-color 300ms;
}
body {
.van-image__error, .van-image__loading {
display: block;
}
.prism-fullscreen {
z-index: 999999 !important;
}
.prism-player {
.prism-animation, .prism-detect-info, .prism-button, .prism-setting-quality, .prism-setting-audio, .prism-setting-cc, .prism-cc-btn, .prism-volume, .prism-tooltip, .prism-setting-btn, .prism-button-retry, .dplayer-thumb, .prism-progress-played, .prism-progress-cursor, .prism-progress-hover, .prism-big-play-btn, .prism-controlbar, .prism-info-display, .prism-text-overlay, .prism-error-operation, .prism-ErrorMessage, .prism-cover, .prism-loading {
display: none !important;
}
}
}
#__vconsole {
.vc-switch {
z-index: 10000000;
}
.vc-panel {
min-height: unset !important;
height: 500px !important;
}
z-index: 10000000;
}
#app {
overflow-y: hidden;
overflow-x: hidden;
.van-loading {
text-align: center;
}
}
html[dark-mode] {
body {
// background-color: #12131e;
background-color: #161827;
.gx-mobile .vote {
background-color: #1D1F2F;
}
.gx-mobile .suggested {
// background-color: #1D1F2F;
.suggested-title {
color: #d9d9d9ff;
}
.suggested-item_title {
color: #d9d9d9ff !important;
}
.subtitle {
color: #d9d9d9ff !important;
}
.left {
span {
color: #ffffff5c !important;
}
}
}
.gx-mobile .title {
color: #d9d9d9ff;
}
.gx-mobile .ptxt {
color: #ffffffab;
}
.gx-mobile .btsIem {
background-color: #161828;
}
.gx-mobile .stx {
color: #ffffffab !important ;
}
.gx-mobile .jd {
.s1 {
background: linear-gradient(270deg, #e5111eff 0%, #ffb5b9ff 100%);
}
.s2 {
background-color: #393A47 !important;
}
}
.gx-mobile .open {
background: linear-gradient(179.9deg, #1d1f2e00 0%, #1d1f2eff 48%, #1d1f2eff 99%);
img {
width: 0.42667rem;
height: 0.42667rem;
}
}
.gx-mobile .time {
// color: #7a7a7a;
color: rgba(255, 255, 255, 0.4);
}
.gx-mobile #newsContent {
background-color: #12131e !important;
color: #ccc;
h1, h2, div, h3, p, h4, h5, h6, ul, li, ol {
background-color: #12131e !important;
color: #ccc !important;
}
.preview-video {
div , p {
background-color: rgba(255,255 , 255, 0) !important;
}
}
}
.footer {
background-color: #12131e;
border-top: #252630;
}
}
}
.anticon-spin {
animation: loadingCircle 1s infinite linear;
}
@keyframes fadeIn {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
@keyframes loadingCircle {
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@-webkit-keyframes loadingCircle {
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@keyframes loadingCircle {
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}