Authored by 徐炜

Merge remote-tracking branch 'origin/master'

Showing 163 changed files with 4037 additions and 356 deletions
  1 +/* eslint no-unused-vars: ["error", {"args": "none"}] */
  2 +
  3 +'use strict';
  4 +const model = require('../models/live');
  5 +
  6 +const status = {
  7 + wait: 0,
  8 + living: 1,
  9 + end: 2
  10 +};
  11 +const liveModel = require('../models/live');
  12 +
  13 +exports.index = (req, res, next) => {
  14 + liveModel.getAllList().then(result => {
  15 + res.render('live/entry', {
  16 + title: '直播列表',
  17 + module: 'activity',
  18 + page: 'entry',
  19 + best: result[0],
  20 + living: result[1],
  21 + pre: result[2],
  22 + record: result[3],
  23 + content: result[4],
  24 + isApp: req.yoho.isApp
  25 + });
  26 + }).catch(next);
  27 +};
  28 +
  29 +exports.main = (req, res, next) => {
  30 + const isReplay = /^\/live\/replay\//.test(req.path);
  31 + const id = req.params.id;
  32 +
  33 + res.locals.liveRoom = id;
  34 + res.locals.module = 'activity';
  35 + res.locals.page = 'live-play';
  36 +
  37 + model.fetchInfo(id, isReplay)
  38 + .then(result => {
  39 + if (!result.data) {
  40 + return next();
  41 + }
  42 + res.render('live/play', result.data);
  43 + })
  44 + .catch(next);
  45 +};
  46 +
  47 +exports.barrage = (req, res, next) => {
  48 + const type = req.query.type;
  49 +
  50 + model.getBarrageHost(type)
  51 + .then(result => {
  52 + if (result.code !== 200) {
  53 + next(result.message);
  54 + return;
  55 + }
  56 +
  57 + res.json(result);
  58 + })
  59 + .catch(next);
  60 +};
  61 +
  62 +exports.replayBarrage = (req, res, next) => {
  63 + const id = req.query.id;
  64 + const startTime = req.query.startTime;
  65 + const timeInterval = req.query.timeInterval;
  66 +
  67 + model.getReplyBarrage(id, startTime, timeInterval)
  68 + .then(result => {
  69 + res.json(result);
  70 + })
  71 + .catch(next);
  72 +};
  1 +'use strict';
  2 +const moment = require('moment');
  3 +const service = global.yoho.ServiceAPI;
  4 +const liveAPI = global.yoho.LiveAPI;
  5 +const contentCodeConfig = require('../../../config/content-code');
  6 +const resourcesProcess = require(`${global.utils}/resources-process`);
  7 +const helpers = global.yoho.helpers;
  8 +
  9 +const _formatTime = (timestamp, b) => {
  10 + let date = b ? 'M.D ' : 'M月D日';
  11 + let time = 'HH:mm';
  12 + let startTime = moment(timestamp);
  13 + let now = moment();
  14 + let diff = moment.duration(startTime.clone().startOf('day') - now.startOf('day')).days();
  15 +
  16 + switch (diff) {
  17 + case 0:
  18 + date = '[今天]';
  19 + break;
  20 + case 1:
  21 + date = '[明日]';
  22 + break;
  23 + default:
  24 + null;
  25 + }
  26 +
  27 + return startTime.format(`${date}${time}`);
  28 +};
  29 +
  30 +/**
  31 + * 根据 时长(秒) 返回 时长格式化后的 字符串 HH:mm:ss
  32 + */
  33 +const _getHumanDuration = (duration) => {
  34 + duration = moment.duration(duration, 's');
  35 + let durationH = duration.hours();
  36 + let durationM = duration.minutes();
  37 + let durationS = duration.seconds();
  38 +
  39 + duration = [durationH, durationM, durationS].map((item) => {
  40 + if (item < 10) {
  41 + return `0${item}`;
  42 + } else {
  43 + return String(item);
  44 + }
  45 + });
  46 +
  47 + return `${duration[0]}:${duration[1]}:${duration[2]}`;
  48 +};
  49 +
  50 +// 获取顶部bannel
  51 +let _getBannerData = () => {
  52 + return service.get('operations/api/v5/resource/get', {
  53 + content_code: contentCodeConfig.live.index,
  54 + platform: 'iphone'
  55 + }, {
  56 + code: 200,
  57 + cache: true
  58 + }).then((result) => {
  59 + return result && result.data ? resourcesProcess(result.data) : [];
  60 + });
  61 +};
  62 +
  63 +// 获取精选视频
  64 +const _getBestList = () => {
  65 + return liveAPI.get('v1/living/best', {}, {
  66 + code: 200,
  67 + cache: false
  68 + }).then(result => {
  69 + let list = result && result.data || [];
  70 +
  71 + if (result && result.data && result.data.length !== 2) {
  72 + result.data = [];
  73 + }
  74 +
  75 + for (let item of list) {
  76 + switch (item.living) {
  77 + case 0:
  78 + item.pre_living = true;
  79 + break;
  80 + case 1:
  81 + default:
  82 + item.now_living = true;
  83 + break;
  84 + case 2:
  85 + // 直播结束不显示
  86 + result.data = [];
  87 + break;
  88 + }
  89 +
  90 + // 格式化时间
  91 + item.starting_time = _formatTime(item.starting_time * 1000, true);
  92 + }
  93 +
  94 + return result && result.data || [];
  95 + });
  96 +};
  97 +
  98 +// 获取直播中所有视频
  99 +const _getLivingList = () => {
  100 + return liveAPI.get('v1/living/listing', {}, {
  101 + code: 200,
  102 + cache: false
  103 + }).then(result => {
  104 + return result && result.data || [];
  105 + });
  106 +};
  107 +
  108 +// 获取直播预告列表
  109 +const _getPrelivingList = () => {
  110 + return liveAPI.get('v1/living/starting', {}, {
  111 + code: 200,
  112 + cache: false
  113 + }).then(result => {
  114 + let list = result && result.data || [];
  115 +
  116 + for (let item of list) {
  117 + item.starting_time = _formatTime(item.starting_time * 1000);
  118 + }
  119 + return result && result.data || [];
  120 + });
  121 +};
  122 +
  123 +// 获取回看列表
  124 +const _getRecordList = () => {
  125 + return liveAPI.get('v1/living/replaying', {}, {
  126 + code: 200,
  127 + cache: false
  128 + }).then(result => {
  129 + return result && result.data || [];
  130 + });
  131 +};
  132 +
  133 +// 返回所有数据
  134 +const getAllList = () => {
  135 + return Promise.all([_getBestList(), _getLivingList(), _getPrelivingList(), _getRecordList(), _getBannerData()]);
  136 +};
  137 +
  138 +// 获取 回放视屏 信息
  139 +const fetchReplayInfo = (videoID) => {
  140 + let url = 'v1/living/detail';
  141 + let data = { video_id: videoID };
  142 + let options = { cache: true };
  143 +
  144 + return liveAPI.get(url, data, options)
  145 + .then(result => {
  146 + if (result && result.data) {
  147 + let d = result.data;
  148 +
  149 + d.background = helpers.image(d.background, 640, 968);
  150 + d.pic = helpers.image(d.pic, 640, 968);
  151 + d.master_pic = helpers.image(d.master_pic, 180, 180);
  152 + d.humanTime = _formatTime(data.live_start_time * 1000);
  153 + d.video_src = d.url;
  154 +
  155 + // 自定义数据
  156 + d.duration = '00:00:00'; // 回看时长 前端JS根据video获取
  157 + d.living = 3; // 重播 状态
  158 + d.canPlay = true;
  159 + d.atEnd = false;
  160 + d.isReplay = true;
  161 + }
  162 +
  163 + return result || {};
  164 + });
  165 +};
  166 +
  167 +// 获取 直播视屏 信息
  168 +const fetchLiveInfo = (roomID) => {
  169 + let url = 'v1/living/detail';
  170 + let data = { room_id: roomID };
  171 +
  172 + return liveAPI.get(url, data)
  173 + .then(result => {
  174 + if (result && result.data) {
  175 + let d = result.data;
  176 +
  177 + d.background_pic = helpers.image(d.background_pic, 640, 968);
  178 + d.pic = helpers.image(d.pic, 640, 968);
  179 + d.master_pic = helpers.image(d.master_pic, 180, 180);
  180 + d.humanTime = _formatTime(d.starting_time * 1000); // 预告 开始时间
  181 + d.video_src = d.hls_downstream_address;
  182 +
  183 + // 自定义数据
  184 + d.duration = _getHumanDuration(d.live_last_time);
  185 + d.canPlay = d.living === 1;
  186 + d.notBegin = d.living === 0;
  187 + d.atEnd = d.living === 2;
  188 + }
  189 +
  190 + return result || {};
  191 + });
  192 +};
  193 +
  194 +const fetchInfo = (id, isReplay) => {
  195 + if (isReplay) {
  196 + return fetchReplayInfo(id);
  197 + } else {
  198 + return fetchLiveInfo(id);
  199 + }
  200 +};
  201 +
  202 +// 获取 直播 弹幕 host
  203 +const getBarrageHost = (type) => {
  204 + return liveAPI.get('v1/system/gethosts', { type });
  205 +};
  206 +
  207 +const getReplyBarrage = (videoID, startTime, timeInterval) => {
  208 + const url = 'v1/living/getreplaybarrage';
  209 + const data = {
  210 + startTime,
  211 + timeInterval,
  212 + video_id: videoID
  213 + };
  214 + const options = { cache: true };
  215 +
  216 + return liveAPI.get(url, data, options);
  217 +};
  218 +
  219 +// 处理直播时间
  220 +module.exports = {
  221 + getAllList,
  222 + fetchInfo,
  223 + getBarrageHost,
  224 + getReplyBarrage
  225 +};
@@ -12,6 +12,7 @@ const cRoot = './controllers'; @@ -12,6 +12,7 @@ const cRoot = './controllers';
12 const coupon = require(`${cRoot}/coupon`); 12 const coupon = require(`${cRoot}/coupon`);
13 const wechat = require(`${cRoot}/wechat`); 13 const wechat = require(`${cRoot}/wechat`);
14 const student = require(`${cRoot}/student`); 14 const student = require(`${cRoot}/student`);
  15 +const live = require(`${cRoot}/live`);
15 const invite = require(`${cRoot}/invite`); 16 const invite = require(`${cRoot}/invite`);
16 17
17 // routers 18 // routers
@@ -40,6 +41,12 @@ router.get('/student/detail/:type', student.getUser, student.detail); @@ -40,6 +41,12 @@ router.get('/student/detail/:type', student.getUser, student.detail);
40 41
41 // router.get('/student/getCoupons',student.getCoupons) 42 // router.get('/student/getCoupons',student.getCoupons)
42 43
  44 +router.get('/live', live.index);
  45 +router.get('/live/barrage', live.barrage);
  46 +router.get('/live/replay/barrage', live.replayBarrage);
  47 +router.get('/live/replay/:id', live.main);
  48 +router.get('/live/:id', live.main);
  49 +
43 router.get('/invite', invite.index); 50 router.get('/invite', invite.index);
44 router.get('/invite/index', invite.index); 51 router.get('/invite/index', invite.index);
45 52
@@ -54,4 +61,5 @@ router.get('/invite/getwxinfo', invite.getwxinfo); @@ -54,4 +61,5 @@ router.get('/invite/getwxinfo', invite.getwxinfo);
54 router.get('/invite/shareover', invite.shareover); 61 router.get('/invite/shareover', invite.shareover);
55 router.get('/invite/over', invite.over); 62 router.get('/invite/over', invite.over);
56 63
  64 +
57 module.exports = router; 65 module.exports = router;
@@ -77,4 +77,4 @@ @@ -77,4 +77,4 @@
77 77
78 <div class="share-tag"><img src="//static.yohobuy.com/m/v1/img/invite/yd_share.png"></div> 78 <div class="share-tag"><img src="//static.yohobuy.com/m/v1/img/invite/yd_share.png"></div>
79 </div> 79 </div>
80 -</div><!--/invite-page-->  
  80 +</div><!--/invite-page-->
  1 +<div class="yoho-live yoho-page">
  2 + {{! 导航条}}
  3 + {{#unless isApp}}
  4 + <div class="home-header clearfix yoho-header">
  5 + <a href="javascript:history.go(-1);" class="iconfont nav-back buriedpoint" data-bp-id="page_header_back_0"></a>
  6 + <p class="nav-title">直播列表</p>
  7 + </div>
  8 + {{/unless}}
  9 +
  10 +
  11 + {{#content}}
  12 + {{! 头部banner}}
  13 + {{#if focus}}
  14 + {{> resources/banner-top}}
  15 + {{/if}}
  16 + {{/content}}
  17 +
  18 + {{#if content}}
  19 + {{#if best}}
  20 + <div class="head_margin"></div>
  21 + {{/if}}
  22 + {{/if}}
  23 +
  24 + {{! 精选房间}}
  25 + {{#if best}}
  26 + <div class="liverec">
  27 + {{#best}}
  28 + <div class="liverec_child">
  29 + <a href='http://m.yohobuy.com/activity/live/{{room_id}}?openby:yohobuy={"action":"go.videolive", "params":{"type":"{{living}}","room":"{{room_id}}","bgpic":"{{pic}}"}}'>
  30 + <img class="liverec_pic" src="{{image pic 320 320}}" alt="直播预览">
  31 + {{#if now_living}}
  32 + <p class="living">直播</p>
  33 + {{else if pre_living}}
  34 + <p class="pre-living">预告 {{starting_time}}</p>
  35 + {{/if}}
  36 + </a>
  37 + <div class="liverec_info">
  38 + <img class="liverec_head" src="{{image master_pic 120 120}}" alt="头像">
  39 + <div class="liverec_pannel">
  40 + <p class="liverec_name clearfix">
  41 + <span class="name-name">{{master_name}}</span>
  42 + <span class="name-tag">{{master_meta}}</span>
  43 + </p>
  44 + <p class="liverec_tag">{{title}}</p>
  45 + </div>
  46 + </div>
  47 +
  48 + </div>
  49 + {{/best}}
  50 + </div>
  51 + {{/if}}
  52 +
  53 + {{! 直播中房间}}
  54 + {{#if living}}
  55 + <h2 class="living_title">直播中</h2>
  56 + {{/if}}
  57 + {{#living}}
  58 + <div class="liveliving">
  59 + <header>
  60 + <img class="main-head" src="{{image master_pic 120 120}}" alt="头像">
  61 + <div class="header-info">
  62 + <p class="main-name">{{master_name}}</p>
  63 + <p class="main-tag">{{master_meta}}</p>
  64 + </div>
  65 + </header>
  66 + <section>
  67 + <a href='http://m.yohobuy.com/activity/live/{{room_id}}?openby:yohobuy={"action":"go.videolive", "params":{"type":"1","room":"{{room_id}}","bgpic":"{{pic}}"}}'>
  68 + <img class="main-bg" src="{{image pic 640 640}}" alt="正在直播">
  69 + <p class="main-living">直播</p>
  70 + <p class="main-intro">{{title}}</p>
  71 + <div class="main-people">
  72 + <span class="people-icon"></span>
  73 + <p class="people-sum">{{audience_num}}人观看</p>
  74 + </div>
  75 + </a>
  76 + </section>
  77 + </div>
  78 + {{/living}}
  79 +
  80 + {{! 直播预告列表}}
  81 + {{#if pre}}
  82 + <div class="live-list">
  83 + <h2 class="title">直播预告</h2>
  84 + <ul class="list">
  85 + {{#pre}}
  86 + <li class="pre-list">
  87 + <a href='http://m.yohobuy.com/activity/live/{{room_id}}?openby:yohobuy={"action":"go.videolive", "params":{"type":"0","room":"{{room_id}}","bgpic":"{{pic}}"}}'>
  88 + <img class="pre-pic" src="{{image pic 150 150}}" alt="直播预览图">
  89 + <p class="pre-icon">预告</p>
  90 + <p class="pre-time">{{starting_time}}</p>
  91 + <div class="pre-pannel">
  92 + <p class="pre-title text-overflow">{{title}}</p>
  93 + <p class="pre-cast">主播:{{master_name}}</p>
  94 + </div>
  95 + </a>
  96 + </li>
  97 + {{/pre}}
  98 + </ul>
  99 + </div>
  100 + {{/if}}
  101 +
  102 + {{! 精彩回看}}
  103 + {{#if record}}
  104 + <h2 class="living_title">精彩回看</h2>
  105 + {{/if}}
  106 + {{#record}}
  107 + <div class="liveliving">
  108 + <header>
  109 + <img class="main-head" src="{{image master_pic 120 120}}" alt="头像">
  110 + <div class="header-info">
  111 + <p class="main-name">{{master_name}}</p>
  112 + <p class="main-tag">{{master_meta}}</p>
  113 + </div>
  114 + </header>
  115 + <section>
  116 + <a href='http://m.yohobuy.com/activity/live/replay/{{video_id}}?openby:yohobuy={"action":"go.videoreplay", "params":{"videoid":"{{video_id}}","bgpic":"{{pic}}"}}'>
  117 + <div class="record-icon"></div>
  118 + <img class="main-bg" src="{{image pic 640 640}}" alt="精彩回放">
  119 + <p class="main-living">回放</p>
  120 + <p class="main-intro">{{title}}</p>
  121 + <div class="main-people">
  122 + <span class="eye-icon"></span>
  123 + <p class="people-sum">{{audience_num}}人看过</p>
  124 + </div>
  125 + </a>
  126 + </section>
  127 + </div>
  128 + {{/record}}
  129 +</div>
  1 +{{! 直播 播放页 }}
  2 +<div class="live-wrapper">
  3 + {{#canPlay}}
  4 + <div class="live-main">
  5 + <!-- 视频部分start-->
  6 + <!--http://live-hls-pili.1iptv.com/meipai-live/57651bb975b6255acc01444c.m3u8-->
  7 + <section id="live_container" class="live-video-main" style="background-image: url('{{pic}}');">
  8 + <div id="video_container" class="video_player" data-video="{{video_src}}">
  9 + </div>
  10 + <div class="live-loading-container">
  11 + <div class="live-video-loading">
  12 + <div class="img"></div>
  13 + <p>加载中</p>
  14 + </div>
  15 + <div class="live-loading-cover" style="background-image: url('{{pic}}');"></div>
  16 + </div>
  17 +
  18 + <div id="live_touch_layer"></div>
  19 + <!--弹幕-->
  20 + <div class="live-chat-pannel">
  21 + <ul id="live_chat_ul">
  22 +
  23 + </ul>
  24 + </div>
  25 + <!--点赞-->
  26 + <div class="live-like-pannel">
  27 + <div id="live_like_pannel" class="animate_pannel"></div>
  28 + <div class="like-main"></div>
  29 + <span id="like_num">0</span>
  30 +
  31 + </div>
  32 + <!--播放按钮-->
  33 + <div class="live-video-play-button">
  34 + <a href="javascript:void(0)">
  35 + <div class="img"></div>
  36 + </a>
  37 + </div>
  38 +
  39 + <!--直播状态-->
  40 + <div class="live-status">
  41 + <div class="overflow-hidden">
  42 + <div class="img"></div>
  43 + <div class="live-time">
  44 + {{#if isReplay}}
  45 + <span>Yoho!Buy回看</span>
  46 + {{else}}
  47 + <span>Yoho!Buy直播</span>&nbsp;<span id="live_time"></span>
  48 + {{/if}}
  49 + </div>
  50 + <div class="live-num">
  51 + {{#if isRelay}}
  52 + <span>{{audience_num}}人观看</span>
  53 + {{else}}
  54 + <span></span>
  55 + {{/if}}
  56 + </div>
  57 + </div>
  58 + <div class="title hide" id="live-watermark">
  59 + {{#if watemark }}
  60 + <span>{{watermark}}</span>
  61 + {{/if}}
  62 + </div>
  63 + </div>
  64 +
  65 + <a href="javascript:;" class="live-btn-share">
  66 + <i class="iconfont">&#xe600</i>
  67 + </a>
  68 + <a href="javascript: history.back();" class="live-btn-close">
  69 + <i class="iconfont">&#xe623</i>
  70 + </a>
  71 + </section>
  72 + </div>
  73 + {{/canPlay}}
  74 +
  75 + {{!直播已结束}}
  76 + <div id="live-state-end" class="live-state is-no-start {{#atEnd}}show{{/atEnd}}">
  77 + <div class="live-state-inner" style="background-image: url('{{background_pic}}');">
  78 + <div class="live-state__txt">直播已结束</div>
  79 + <ul class="live-state-info">
  80 + <li class="audience text-center">
  81 + <span class="val">{{audience_num}}</span>
  82 + <br>
  83 + <span class="label">总观看人数</span>
  84 + </li>
  85 + <li class="duration">
  86 + <div class="inner pull-right">
  87 + <span class="val">{{duration}}</span>
  88 + <br>
  89 + <span class="label">直播时长</span>
  90 + </div>
  91 + </li>
  92 + <li class="favorite">
  93 + <div class="inner pull-left">
  94 + <span class="val">{{like_num}}</span>
  95 + <br>
  96 + <span class="label">点赞数</span>
  97 + </div>
  98 + </li>
  99 + </ul>
  100 + <a href="javascript: history.back();" class="live-btn-close">
  101 + <i class="iconfont">&#xe623</i>
  102 + </a>
  103 + </div>
  104 + </div>
  105 +
  106 + {{!直播未开始}}
  107 + {{#notBegin}}
  108 + <div class="live-state is-no-start show">
  109 + <div class="live-state-inner" style="background-image: url('{{background_pic}}');">
  110 + <div class="live-state__txt">直播未开始</div>
  111 + <div class="live-state-info text-center">
  112 + <img src="{{master_pic}}" alt="" class="avatar">
  113 + <span class="name text-overflow">{{master_name}}</span><br>
  114 + <h5 class="title">直播主题: {{title}}</h5>
  115 + <p class="begin-time">开始时间: {{humanTime}}</p>
  116 + </div>
  117 + <a href="javascript: history.back();" class="live-btn-close">
  118 + <i class="iconfont">&#xe623</i>
  119 + </a>
  120 + </div>
  121 + </div>
  122 + {{/notBegin}}
  123 +
  124 + {{! footer}}
  125 + <div class="float-layer" id="float-layer-app">
  126 + <div class="float-layer-left">
  127 + <span class="yoho-icon iconfont">&#xe60d;</span>
  128 + <p>新用户送惊喜礼包</p>
  129 + </div>
  130 + <a href="javascript:void(0);" id="float-layer-close" >
  131 + <i class="close-icon iconfont">&#xe623;</i>
  132 + <div class="circle-rightbottom"></div>
  133 + </a>
  134 + <a href="http://a.app.qq.com/o/simple.jsp?pkgname=com.yoho" id="float-layer-btn">
  135 + 立即下载
  136 + </a>
  137 + </div>
  138 +</div>
  139 +<script>
  140 + var live_start_time = {{live_start_time}};//该直播开始时间
  141 + var live_type = {{living}};//是否是直播 0直播未开始,1直播中,2直播结束,3重播
  142 + var live_room = {{liveRoom}};//房间id,资讯id
  143 + var replay_total_likes = {{like_num}};//重播总计点赞数,取的是直播最终点赞数
  144 + var replay_user_nums = {{audience_num}};//重播观看人数,取的是直播时最终观看人数
  145 + var site_url = '';
  146 + var site_domain = 'http://api.live.yoho.cn/';
  147 +
  148 + // share data
  149 + var shareTitle = '{{share_title}}';
  150 + var shareContent = '{{share_content}}';
  151 + var sharePic = '{{pic}}'
  152 +</script>
  1 +{{! 直播 播放页: 状态页}}
@@ -55,4 +55,12 @@ @@ -55,4 +55,12 @@
55 {{#if newUserFloor}} 55 {{#if newUserFloor}}
56 {{> resources/fresh-only}} 56 {{> resources/fresh-only}}
57 {{/if}} 57 {{/if}}
  58 + {{! 标题楼层}}
  59 + {{#if titleFloor}}
  60 + {{> resources/title-floor}}
  61 + {{/if}}
  62 + {{! 直播楼层}}
  63 + {{#if livePicture}}
  64 + {{> resources/live-picture}}
  65 + {{/if}}
58 {{/content}} 66 {{/content}}
@@ -14,11 +14,11 @@ module.exports = { @@ -14,11 +14,11 @@ module.exports = {
14 port: 6001, 14 port: 6001,
15 siteUrl: '//m.yohobuy.com', 15 siteUrl: '//m.yohobuy.com',
16 domains: { 16 domains: {
17 - // api: 'http://192.168.102.14:8080/gateway/',  
18 - // service: 'http://192.168.102.14:8080/gateway/'  
19 - 17 + // api: 'http://devapi.yoho.cn:58078/',
  18 + // service: 'http://devservice.yoho.cn:58077/'
20 api: 'http://api-test3.yohops.com:9999/', 19 api: 'http://api-test3.yohops.com:9999/',
21 - service: 'http://service-test3.yohops.com:9999/' 20 + service: 'http://service-test3.yohops.com:9999/',
  21 + liveApi: 'http://testapi.live.yohops.com:9999/'
22 }, 22 },
23 subDomains: { 23 subDomains: {
24 host: '.m.yohobuy.com', 24 host: '.m.yohobuy.com',
@@ -60,7 +60,8 @@ module.exports = { @@ -60,7 +60,8 @@ module.exports = {
60 name: 'error', 60 name: 'error',
61 level: 'error', 61 level: 'error',
62 filename: 'logs/error.log', 62 filename: 'logs/error.log',
63 - handleExceptions: true 63 + handleExceptions: true,
  64 + maxFiles: 7
64 }, 65 },
65 udp: { // send by udp 66 udp: { // send by udp
66 measurement: 'yohobuy_wap_log', 67 measurement: 'yohobuy_wap_log',
@@ -87,7 +88,8 @@ if (isProduction) { @@ -87,7 +88,8 @@ if (isProduction) {
87 appName: 'm.yohobuy.com', 88 appName: 'm.yohobuy.com',
88 domains: { 89 domains: {
89 api: 'http://api.yoho.yohoops.org/', 90 api: 'http://api.yoho.yohoops.org/',
90 - service: 'http://service.yoho.yohoops.org/' 91 + service: 'http://service.yoho.yohoops.org/',
  92 + liveApi: 'http://api.live.yoho.cn/'
91 }, 93 },
92 memcache: { 94 memcache: {
93 master: ['memcache1.yohoops.org:12111', 'memcache2.yohoops.org:12111', 'memcache3.yohoops.org:12111'], 95 master: ['memcache1.yohoops.org:12111', 'memcache2.yohoops.org:12111', 'memcache3.yohoops.org:12111'],
@@ -115,7 +117,8 @@ if (isProduction) { @@ -115,7 +117,8 @@ if (isProduction) {
115 appName: 'm.yohobuy.com for test', 117 appName: 'm.yohobuy.com for test',
116 domains: { 118 domains: {
117 api: 'http://api-test3.yohops.com:9999/', 119 api: 'http://api-test3.yohops.com:9999/',
118 - service: 'http://service-test3.yohops.com:9999/' 120 + service: 'http://service-test3.yohops.com:9999/',
  121 + liveApi: 'http://testapi.live.yohops.com:9999/'
119 }, 122 },
120 memcache: { 123 memcache: {
121 master: ['127.0.0.1:12111'], 124 master: ['127.0.0.1:12111'],
@@ -48,10 +48,15 @@ const bottomBannerContentCode = { @@ -48,10 +48,15 @@ const bottomBannerContentCode = {
48 48
49 const outletContentCode = 'c19ffa03f053f4cac3690b22c8da26b7'; 49 const outletContentCode = 'c19ffa03f053f4cac3690b22c8da26b7';
50 50
  51 +const liveContentCode = {
  52 + index: '345c80537dca15611f37ae4863004bfe'
  53 +};
  54 +
51 module.exports = { 55 module.exports = {
52 sale: saleContentCode, 56 sale: saleContentCode,
53 outlet: outletContentCode, 57 outlet: outletContentCode,
54 channel: channelContentCode, 58 channel: channelContentCode,
55 bottom: bottomBannerContentCode, 59 bottom: bottomBannerContentCode,
56 - guang: guangContentCode 60 + guang: guangContentCode,
  61 + live: liveContentCode
57 }; 62 };
@@ -14,9 +14,15 @@ @@ -14,9 +14,15 @@
14 <link rel="dns-prefetch" href="//static.yohobuy.com"> 14 <link rel="dns-prefetch" href="//static.yohobuy.com">
15 <link rel="dns-prefetch" href="//img12.static.yhbimg.com"> 15 <link rel="dns-prefetch" href="//img12.static.yhbimg.com">
16 <link rel="dns-prefetch" href="//img13.static.yhbimg.com"> 16 <link rel="dns-prefetch" href="//img13.static.yhbimg.com">
  17 + {{#if width750}}
  18 + <script type="text/javascript">
  19 + (function(d,c){var e=d.documentElement,a="orientationchange" in window?"orientationchange":"resize",b=function(){var f=e.clientWidth;if(!f){return}if(f>=750){e.style.fontSize="40px"}else{e.style.fontSize=40*(f/750)+"px"}};if(!d.addEventListener){return}b();c.addEventListener(a,b,false);d.addEventListener("DOMContentLoaded",b,false)})(document,window);
  20 + </script>
  21 + {{^}}
17 <script type="text/javascript"> 22 <script type="text/javascript">
18 (function(d,c){var e=d.documentElement,a="orientationchange" in window?"orientationchange":"resize",b=function(){var f=e.clientWidth;if(!f){return}if(f>=640){e.style.fontSize="40px"}else{e.style.fontSize=40*(f/640)+"px"}};if(!d.addEventListener){return}b();c.addEventListener(a,b,false);d.addEventListener("DOMContentLoaded",b,false)})(document,window); 23 (function(d,c){var e=d.documentElement,a="orientationchange" in window?"orientationchange":"resize",b=function(){var f=e.clientWidth;if(!f){return}if(f>=640){e.style.fontSize="40px"}else{e.style.fontSize=40*(f/640)+"px"}};if(!d.addEventListener){return}b();c.addEventListener(a,b,false);d.addEventListener("DOMContentLoaded",b,false)})(document,window);
19 </script> 24 </script>
  25 + {{/if}}
20 {{#if devEnv}} 26 {{#if devEnv}}
21 <link rel="stylesheet" href="//{{devHost}}:5001/css/index.css"> 27 <link rel="stylesheet" href="//{{devHost}}:5001/css/index.css">
22 {{^}} 28 {{^}}
@@ -26,7 +32,7 @@ @@ -26,7 +32,7 @@
26 <link rel="apple-touch-startup-image" sizes="640x920" href="http://static.yohobuy.com/m/v1/img/startup/startup-retina.png" media="screen and (max-device-width: 480px) and (-webkit-min-device-pixel-ratio: 2)"> 32 <link rel="apple-touch-startup-image" sizes="640x920" href="http://static.yohobuy.com/m/v1/img/startup/startup-retina.png" media="screen and (max-device-width: 480px) and (-webkit-min-device-pixel-ratio: 2)">
27 <link rel="apple-touch-startup-image" sizes="320x460" href="http://static.yohobuy.com/m/v1/img/startup/startup.png" media="screen and (max-device-width: 320)"> 33 <link rel="apple-touch-startup-image" sizes="320x460" href="http://static.yohobuy.com/m/v1/img/startup/startup.png" media="screen and (max-device-width: 320)">
28 </head> 34 </head>
29 - <body {{#if isPassportPage}}class=passport-body{{/if}} {{#if isStarIndexPage}} class="star-index-bg"{{/if}} {{#if isStarDetailPage}}class="star-class-body"{{/if}} {{#if isInstallmentPage}}class=installment-body{{/if}}> 35 + <body class="{{#if width750}}width750{{/if}} {{#if isPassportPage}}passport-body{{/if}} {{#if isStarIndexPage}}star-index-bg{{/if}} {{#if isStarDetailPage}}star-class-body{{/if}} {{#if isInstallmentPage}}installment-body{{/if}}">
30 <div class="main-wrap"> 36 <div class="main-wrap">
31 {{#if systemUpdate}} 37 {{#if systemUpdate}}
32 {{> updata}} 38 {{> updata}}
  1 +{{> resources/title-floor}}
  2 +{{> resources/three-picture}}
  1 +{{#data}}
  2 +<div class="three-picture clearfix">
  3 + {{#list}}
  4 + <a href="{{url}}">
  5 + <img src="{{image src 210 280}}">
  6 + </a>
  7 + {{/list}}
  8 +</div>
  9 +{{/data}}
  1 +{{#data}}
  2 +{{> common/floor-header-more}}
  3 +{{/data}}
@@ -39,7 +39,7 @@ @@ -39,7 +39,7 @@
39 "express-handlebars": "^3.0.0", 39 "express-handlebars": "^3.0.0",
40 "express-session": "^1.14.0", 40 "express-session": "^1.14.0",
41 "influxdb-winston": "^1.0.1", 41 "influxdb-winston": "^1.0.1",
42 - "lodash": "^4.13.1", 42 + "lodash": "^4.15.0",
43 "md5": "^2.1.0", 43 "md5": "^2.1.0",
44 "memcached": "^2.2.1", 44 "memcached": "^2.2.1",
45 "moment": "^2.14.1", 45 "moment": "^2.14.1",
@@ -55,12 +55,12 @@ @@ -55,12 +55,12 @@
55 "serve-favicon": "^2.3.0", 55 "serve-favicon": "^2.3.0",
56 "uuid": "^2.0.2", 56 "uuid": "^2.0.2",
57 "winston": "^2.2.0", 57 "winston": "^2.2.0",
58 - "winston-daily-rotate-file": "^1.1.4", 58 + "winston-daily-rotate-file": "^1.2.0",
59 "yoho-node-lib": "0.0.43" 59 "yoho-node-lib": "0.0.43"
60 }, 60 },
61 "devDependencies": { 61 "devDependencies": {
62 "autoprefixer": "^6.3.7", 62 "autoprefixer": "^6.3.7",
63 - "ava": "^0.15.2", 63 + "ava": "^0.16.0",
64 "babel-preset-es2015": "^6.9.0", 64 "babel-preset-es2015": "^6.9.0",
65 "babel-register": "^6.9.0", 65 "babel-register": "^6.9.0",
66 "eslint": "^3.0.1", 66 "eslint": "^3.0.1",
@@ -72,8 +72,8 @@ @@ -72,8 +72,8 @@
72 "gulp-sourcemaps": "^2.0.0-alpha", 72 "gulp-sourcemaps": "^2.0.0-alpha",
73 "gulp-util": "^3.0.7", 73 "gulp-util": "^3.0.7",
74 "husky": "^0.11.4", 74 "husky": "^0.11.4",
75 - "nodemon": "1.9.2",  
76 - "nyc": "^6.6.1", 75 + "nodemon": "^1.10.0",
  76 + "nyc": "^8.1.0",
77 "postcss-assets": "^4.0.1", 77 "postcss-assets": "^4.0.1",
78 "postcss-cachebuster": "^0.1.3", 78 "postcss-cachebuster": "^0.1.3",
79 "postcss-calc": "^5.2.1", 79 "postcss-calc": "^5.2.1",
@@ -89,7 +89,7 @@ @@ -89,7 +89,7 @@
89 "rewire": "^2.5.2", 89 "rewire": "^2.5.2",
90 "shelljs": "^0.7.0", 90 "shelljs": "^0.7.0",
91 "stylelint": "^7.1.0", 91 "stylelint": "^7.1.0",
92 - "stylelint-config-yoho": "^1.2.3", 92 + "stylelint-config-yoho": "^1.2.7",
93 "webpack": "^1.13.1", 93 "webpack": "^1.13.1",
94 "webpack-dev-server": "^1.14.1", 94 "webpack-dev-server": "^1.14.1",
95 "webpack-stream": "^3.1.0", 95 "webpack-stream": "^3.1.0",
@@ -100,7 +100,6 @@ @@ -100,7 +100,6 @@
100 "yoho-jquery": "^2.2.4", 100 "yoho-jquery": "^2.2.4",
101 "yoho-jquery-lazyload": "^1.9.7", 101 "yoho-jquery-lazyload": "^1.9.7",
102 "yoho-mlellipsis": "0.0.3", 102 "yoho-mlellipsis": "0.0.3",
103 - "yoho-node-lib": "0.0.32",  
104 "yoho-swiper": "^3.3.1" 103 "yoho-swiper": "^3.3.1"
105 } 104 }
106 } 105 }
@@ -8,6 +8,7 @@ @@ -8,6 +8,7 @@
8 "merge_logs": true, 8 "merge_logs": true,
9 "log_date_format": "YYYY-MM-DD HH:mm Z", 9 "log_date_format": "YYYY-MM-DD HH:mm Z",
10 "env": { 10 "env": {
  11 + "TZ": "Asia/Shanghai",
11 "PORT": 6001 12 "PORT": 6001
12 } 13 }
13 } 14 }
No preview for this file type
1 -<?xml version="1.0" standalone="no"?>  
2 -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >  
3 -<svg xmlns="http://www.w3.org/2000/svg">  
4 -<metadata>  
5 -Created by FontForge 20120731 at Wed Jun 29 15:45:02 2016  
6 - By admin  
7 -</metadata>  
8 -<defs>  
9 -<font id="iconfont" horiz-adv-x="1024" >  
10 - <font-face  
11 - font-family="iconfont"  
12 - font-weight="500"  
13 - font-stretch="normal"  
14 - units-per-em="1024"  
15 - panose-1="2 0 6 3 0 0 0 0 0 0"  
16 - ascent="896"  
17 - descent="-128"  
18 - x-height="792"  
19 - bbox="-0.75 -128 3943 896.75"  
20 - underline-thickness="50"  
21 - underline-position="-100"  
22 - unicode-range="U+0078-E64C"  
23 - />  
24 -<missing-glyph horiz-adv-x="374"  
25 -d="M34 0v682h272v-682h-272zM68 34h204v614h-204v-614z" />  
26 - <glyph glyph-name=".notdef" horiz-adv-x="374"  
27 -d="M34 0v682h272v-682h-272zM68 34h204v614h-204v-614z" />  
28 - <glyph glyph-name=".null" horiz-adv-x="0"  
29 - />  
30 - <glyph glyph-name="nonmarkingreturn" horiz-adv-x="341"  
31 - />  
32 - <glyph glyph-name="x" unicode="x" horiz-adv-x="1001"  
33 -d="M281 543q-27 -1 -53 -1h-83q-18 0 -36.5 -6t-32.5 -18.5t-23 -32t-9 -45.5v-76h912v41q0 16 -0.5 30t-0.5 18q0 13 -5 29t-17 29.5t-31.5 22.5t-49.5 9h-133v-97h-438v97zM955 310v-52q0 -23 0.5 -52t0.5 -58t-10.5 -47.5t-26 -30t-33 -16t-31.5 -4.5q-14 -1 -29.5 -0.5  
34 -t-29.5 0.5h-32l-45 128h-439l-44 -128h-29h-34q-20 0 -45 1q-25 0 -41 9.5t-25.5 23t-13.5 29.5t-4 30v167h911zM163 247q-12 0 -21 -8.5t-9 -21.5t9 -21.5t21 -8.5q13 0 22 8.5t9 21.5t-9 21.5t-22 8.5zM316 123q-8 -26 -14 -48q-5 -19 -10.5 -37t-7.5 -25t-3 -15t1 -14.5  
35 -t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q-5 19 -11 39h-368zM336 498v228q0 11 2.5 23t10 21.5t20.5 15.5t34 6h188q31 0 51.5 -14.5t20.5 -52.5v-227h-327z" />  
36 - <glyph glyph-name="uniE600" unicode="&#xe600;" horiz-adv-x="1463"  
37 -d="M798 -64q0 -46 25 -58t61 16l537 420q36 28 36 68t-36 68l-537 424q-36 29 -61 16.5t-25 -57.5v-238q-486 0 -676 -290q-102 -157 -102 -361q0 -49 2 -49q47 62 87 104t90 78t103.5 57.5t127 36.5t161.5 21t207 6v-262z" />  
38 - <glyph glyph-name="uniE601" unicode="&#xe601;"  
39 -d="M281 468q-14 -9 -23 -23t-9 -28v-7v-19v-464h1q5 -24 24 -39.5t44 -15.5h582q28 0 48.5 20t20.5 49t-20.5 49t-48.5 20h-215h256q35 0 59 24.5t24 58.5t-24 58.5t-59 24.5h-235h235q35 0 59 24t24 58.5t-24 58.5t-59 24h-259h211q31 0 53.5 22.5t22.5 53.5v-13  
40 -q0 31 -22.5 54t-53.5 24q-125 6 -259 9q40 148 16 278q-8 44 -30.5 70.5t-49.5 31t-53 -4t-43 -35t-17 -62.5q-5 -34 -6.5 -64t-2.5 -42t-5 -30.5t-14 -42.5q-24 -60 -133 -115q-7 -2 -13 -6zM60 452q-25 0 -42.5 -17.5t-17.5 -42.5v-405q0 -25 17.5 -42.5t42.5 -17.5h134  
41 -v525h-134z" />  
42 - <glyph glyph-name="uniE602" unicode="&#xe602;" horiz-adv-x="1323"  
43 -d="M643 568q0 -68 -47.5 -116t-113.5 -48q0 -68 47 -116t113.5 -48t113.5 48t47 116t-47 116t-113 48zM643 896q-79 0 -162 -28.5t-152 -74.5t-131 -102t-105 -110.5t-68 -101.5t-25 -75t25 -75t68 -102t105 -111t131 -101.5t152 -74.5t161.5 -29t161.5 29t152 74.5  
44 -t131 101.5t105 111t68 102t25 75t-25 75t-68 101.5t-105 110.5t-131 102t-152 74.5t-161 28.5zM643 75q-88 0 -162 44t-117 120t-43 165t43 164.5t117 119.5t161.5 44t161.5 -44t117 -119.5t43 -164.5t-43 -165t-117 -120t-161 -44z" />  
45 - <glyph glyph-name="uniE603" unicode="&#xe603;"  
46 -d="M512 382v343h85v-426h-81v-2h-256v85h252zM512 -128q139 0 257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5t-257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5z" />  
47 - <glyph glyph-name="uniE604" unicode="&#xe604;"  
48 -d="M774 420q13 -17 11.5 -39.5t-17.5 -38.5q0 -1 -1 -1l-427 -428q-18 -17 -42.5 -17t-42 17.5t-17.5 42t17 41.5l387 387l-387 387q-17 17 -17 41.5t17.5 42t42 17.5t42.5 -17l427 -428q1 0 1 -1z" />  
49 - <glyph glyph-name="uniE605" unicode="&#xe605;"  
50 -d="M707 844q-112 0 -195 -77q-83 77 -195 77q-121 0 -207 -88t-86 -212q0 -110 69 -194l2 -2l344 -391q30 -33 73 -33t73 33l344 391l2 2q69 84 69 194q0 124 -86 212t-207 88z" />  
51 - <glyph glyph-name="uniE606" unicode="&#xe606;" horiz-adv-x="1000"  
52 -d="M109.5 511q37.5 0 64 -26.5t26.5 -63.5t-26.5 -63.5t-64 -26.5t-64 26.5t-26.5 63.5t26.5 63.5t64 26.5zM515.5 511q37.5 0 63.5 -26.5t26 -63.5t-26 -63.5t-63.5 -26.5t-64 26.5t-26.5 63.5t26.5 63.5t64 26.5zM921 511q37 0 63.5 -26.5t26.5 -63.5t-26.5 -63.5  
53 -t-63.5 -26.5t-63.5 26.5t-26.5 63.5t26.5 63.5t63.5 26.5z" />  
54 - <glyph glyph-name="uniE607" unicode="&#xe607;" horiz-adv-x="1643"  
55 -d="M547 286h-1l45 -46l248 239l-45 46l-201 -194l-195 201l-46 -44z" />  
56 - <glyph glyph-name="uniE608" unicode="&#xe608;" horiz-adv-x="1821"  
57 -d="M930 231q-14 -13 -33.5 -13t-33.5 13l-252 242q-14 13 -14 32t14 32t34 13t34 -13l251 -242q14 -13 14 -32t-14 -32zM360 231q-14 13 -14 32t14 32l251 242q14 13 34 13t33.5 -13t13.5 -32t-13 -32l-252 -242q-14 -13 -33.5 -13t-33.5 13z" />  
58 - <glyph glyph-name="uniE609" unicode="&#xe609;" horiz-adv-x="1821"  
59 -d="M930 473l-251 -242q-14 -13 -34 -13t-34 13t-14 32t14 32l252 242q14 13 33.5 13t33.5 -13t14 -32t-14 -32zM427 537l252 -242q13 -13 13 -32t-13.5 -32t-33.5 -13t-34 13l-251 242q-14 13 -14 32t14 32t33.5 13t33.5 -13z" />  
60 - <glyph glyph-name="uniE60A" unicode="&#xe60a;"  
61 -d="M1024 384q0 -139 -68.5 -257t-186.5 -186.5t-257 -68.5t-257 68.5t-186.5 186.5t-68.5 257t68.5 257t186.5 186.5t257 68.5t257 -68.5t186.5 -186.5t68.5 -257zM801 594l-365 -366l-156 156l-37 -37l193 -193l403 403z" />  
62 - <glyph glyph-name="uniE60B" unicode="&#xe60b;" horiz-adv-x="1344"  
63 -d="M1280 320h-1216q-27 0 -45.5 18.5t-18.5 45.5t18.5 45.5t45.5 18.5h1216q27 0 45.5 -18.5t18.5 -45.5t-18.5 -45.5t-45.5 -18.5zM1280 -128h-1216q-27 0 -45.5 18.5t-18.5 45.5t18.5 45.5t45.5 18.5h1216q27 0 45.5 -18.5t18.5 -45.5t-18.5 -45.5t-45.5 -18.5zM1280 768  
64 -h-1216q-27 0 -45.5 18.5t-18.5 45.5t18.5 45.5t45.5 18.5h1216q27 0 45.5 -18.5t18.5 -45.5t-18.5 -45.5t-45.5 -18.5z" />  
65 - <glyph glyph-name="uniE60C" unicode="&#xe60c;"  
66 -d="M1024 384q0 -139 -68.5 -257t-186.5 -186.5t-257 -68.5t-257 68.5t-186.5 186.5t-68.5 257t68.5 257t186.5 186.5t257 68.5t257 -68.5t186.5 -186.5t68.5 -257z" />  
67 - <glyph glyph-name="uniE60D" unicode="&#xe60d;" horiz-adv-x="1685"  
68 -d="M1229 7l289 -135l58 124l-281 131q-21 -54 -66 -120zM944 559v-134h137v258q42 47 62 81l-118 69q-2 -4 -8 -12t-24.5 -30.5t-41 -45.5t-60.5 -54.5t-81 -59.5l75 -114q30 20 59 42zM1524 103v304h-605v-304h137v167h332v-167h136zM1283 253h-137v-66q0 -31 -20 -57.5  
69 -t-49.5 -45t-70.5 -34.5t-76.5 -25t-73.5 -17l74 -124q55 14 103 30.5t95.5 43t80.5 58t53.5 75.5t20.5 96v66zM1088 654l31 -133q42 9 85 21q19 -49 59 -78q49 -36 120 -36q45 0 92 14q69 21 133 78l-67 125q-17 -19 -46 -40.5t-60 -31.5q-63 -19 -91 1q-4 3 -8 9  
70 -q147 51 240 103l-81 111q-74 -38 -173 -74v85h-137v-129q-50 -14 -97 -25zM755 561v137h-348q11 42 19 84l-134 26q-11 -56 -28 -110h-200v-137h142q-79 -149 -206 -260l90 -103q43 38 85 83v-389h137v165h260v-24h-124l48 -137h83q54 0 92 38t38 92v490h-373q11 22 21 45  
71 -h398zM312 218h260v-24h-260v24zM312 379h260v-24h-260v24zM1683 816q0 -33 -22.5 -56t-55.5 -23t-56 23t-23 56t23 55.5t56 22.5t55.5 -22.5t22.5 -55.5zM1545 816q0 -26 17.5 -44.5t42.5 -18.5t41.5 18t16.5 44q0 27 -16.5 45.5t-42.5 18.5q-25 0 -42 -18.5t-17 -44.5z  
72 -M1592 775h-17v79q17 2 29 2q18 0 26 -6t8 -17q0 -13 -16 -19v-1q10 -3 14 -19q2 -13 6 -19h-19q-2 3 -6 19q-2 12 -16 12h-9v-31zM1593 819h8q18 0 18 12t-16 12q-6 0 -10 -1v-23z" />  
73 - <glyph glyph-name="uniE60E" unicode="&#xe60e;" horiz-adv-x="3958"  
74 -d="M611 723h-177l-150 -222l-95 222h-178l168 -395v-2l-31 -243h156l30 231zM699 565q-100 0 -179.5 -72.5t-92.5 -175.5q-13 -105 51 -178q61 -68 157 -68q99 0 178.5 72.5t92.5 175.5q13 104 -51 177q-60 69 -156 69zM759 317q-5 -41 -35.5 -70.5t-68.5 -29.5  
75 -q-37 0 -60 27q-27 30 -21 75q5 41 36 70.5t69 29.5q36 0 59 -27q27 -30 21 -75zM1656 565q-100 0 -179.5 -72.5t-92.5 -175.5q-13 -105 51 -178q61 -68 157 -68q99 0 178.5 72.5t92.5 175.5q13 104 -51 177q-60 69 -156 69zM1717 317q-6 -41 -36.5 -70.5t-68.5 -29.5  
76 -q-37 0 -60 27q-27 30 -21 75q5 41 36 70.5t69 29.5q36 0 60 -27q26 -30 21 -75zM1332 502q-44 50 -114 50q-51 0 -97 -27l-10 -6l26 204h-156l-80 -640h155l37 288q3 24 22 41t43 17q25 0 40.5 -17.5t11.5 -41.5l-36 -287h156l37 298q10 71 -35 121zM2949 544l-37 -288  
77 -q-3 -24 -22 -41t-44 -17q-24 0 -39.5 17.5t-12.5 41.5l37 287h-156l-38 -298q-9 -71 36 -121q43 -50 114 -50q51 0 97 27l9 6l-3 -25h156l58 461h-155zM1951 723l-55 -432h156l55 432h-156zM1970 252q-37 0 -67 -26.5t-34.5 -63.5t18.5 -63q22 -26 59 -26t67 26.5t34 63.5  
78 -q5 37 -18 63t-59 26zM2608 262q6 51 -14.5 93.5t-62.5 65.5l-8 5l8 5q39 21 64 57t30 78q8 63 -30 108q-37 44 -97 48l-6 1h-314l-81 -640h317q72 3 128.5 55t65.5 124zM2451 284q-3 -27 -25 -46.5t-50 -19.5h-106l17 134h107q27 -1 43.5 -20.5t13.5 -47.5zM2483 531  
79 -q-3 -25 -23 -43t-45 -18h-113l15 124h112q25 0 41.5 -18.5t12.5 -44.5zM3132 -127q65 0 124 37.5t89 99.5l264 534h-156l-127 -258l-63 258h-156l113 -471l-7 -14q-8 -18 -25 -29t-36 -11q-10 0 -20 4l-29 11l-67 -139l29 -10q31 -12 67 -12zM3943 730q0 -65 -45 -110.5  
80 -t-110.5 -45.5t-111 45.5t-45.5 111t45.5 110.5t111.5 45q65 0 110 -45t45 -111zM3670 730q0 -52 34 -88t84 -36q49 -1 82.5 35.5t33.5 87.5q0 53 -33.5 89.5t-84.5 36.5q-49 0 -82.5 -36.5t-33.5 -88.5zM3763 650h-35v155q35 5 58 5q36 0 52 -12t16 -34q0 -26 -32 -37v-2  
81 -q20 -6 27 -37q5 -26 11 -38h-37q-4 5 -12 38q-4 23 -31 23h-17v-61zM3764 737h17q35 0 35 23t-32 23q-13 0 -20 -1v-45z" />  
82 - <glyph glyph-name="uniE60F" unicode="&#xe60f;"  
83 -d="M682 158q-108 -89 -249 -89q-107 0 -197.5 53t-143.5 143.5t-53 197.5t53 197.5t143.5 143.5t197.5 53t197.5 -53t143.5 -143.5t53 -197.5q0 -141 -89 -249l286 -286l-56 -56zM433.5 148q130.5 0 222.5 92t92 222.5t-92 223t-222.5 92.5t-223 -92.5t-92.5 -223  
84 -t92.5 -222.5t223 -92z" />  
85 - <glyph glyph-name="uniE610" unicode="&#xe610;"  
86 -d="M245 384l-9 9l472 472l80 -80l-400 -401l400 -401l-80 -80l-472 472z" />  
87 - <glyph glyph-name="uniE611" unicode="&#xe611;"  
88 -d="M509 876q-4 -2 -245 -245q-176 -179 -208.5 -213.5t-32.5 -46.5q0 -35 42 -33q7 0 233 227l225 228l226 -228q225 -227 232 -227q21 -1 31.5 7.5t10.5 25.5q0 12 -31.5 46t-206.5 212q-241 243 -246 246q-15 8 -30 1zM171 341q-12 -8 -14 -38.5t-2 -188t2 -188t14 -38.5  
89 -q7 -6 352.5 -6t352.5 6q11 8 13 38.5t2 188t-2 188t-13 38.5q-8 7 -21.5 5.5t-21.5 -10.5l-10 -9v-381h-600v381l-10 9q-8 9 -21 10.5t-21 -5.5zM398 298l-11 -12v-215l11 -12q10 -13 25.5 -13t25.5 13l10 12v175h128v-175l11 -12q11 -13 25.5 -13t25.5 13l10 12v215l-20 24  
90 -h-231z" />  
91 - <glyph glyph-name="uniE612" unicode="&#xe612;"  
92 -d="M951 77h-878l439 614z" />  
93 - <glyph glyph-name="uniE613" unicode="&#xe613;"  
94 -d="M512 77l-439 614h878z" />  
95 - <glyph glyph-name="uniE614" unicode="&#xe614;"  
96 -d="M313 35l349 349l-349 349q-7 7 -7 16.5t6.5 16t16 6.5t16.5 -6l345 -345q16 -15 21 -20q7 -7 7 -17t-7 -17q-44 -44 -48 -47l-318 -318q-7 -6 -16.5 -6t-16 6.5t-6.5 16t7 16.5z" />  
97 - <glyph glyph-name="uniE615" unicode="&#xe615;"  
98 -d="M527 559q8 0 14 -6l293 -288q6 -6 6.5 -14.5t-5.5 -14.5t-14.5 -6t-14.5 6l-279 273l-278 -273q-7 -6 -15 -6t-14 6t-6 14.5t6 14.5l293 288q6 6 14 6z" />  
99 - <glyph glyph-name="uniE616" unicode="&#xe616;"  
100 -d="M527.5 230q-8.5 0 -14.5 6l-293 288q-6 6 -6 14t6 14.5t14 6.5t15 -6l278 -274l279 274q6 6 14.5 6t14.5 -6.5t5.5 -14.5t-6.5 -14l-293 -288q-5 -6 -13.5 -6z" />  
101 - <glyph glyph-name="uniE617" unicode="&#xe617;" horiz-adv-x="1030"  
102 -d="M-195 258zM520 866q-98 0 -187.5 -38t-154 -102.5t-102.5 -154t-38 -187.5t38 -187.5t102.5 -154t154 -102.5t187.5 -38t187.5 38t154 102.5t102.5 154t38 187.5t-38 187.5t-102.5 154t-154 102.5t-187.5 38zM857 581l-339 -451l-328 238q-12 9 -14 23.5t6.5 26.5t23 14  
103 -t26.5 -6l271 -198l297 396q9 12 23.5 14t26.5 -7t14 -23.5t-7 -26.5z" />  
104 - <glyph glyph-name="uniE618" unicode="&#xe618;"  
105 -d="M224 288q-40 0 -68 28t-28 68t28 68t68 28t68 -28t28 -68t-28 -68t-68 -28zM512 288q-40 0 -68 28t-28 68t28 68t68 28t68 -28t28 -68t-28 -68t-68 -28zM800 288q-40 0 -68 28t-28 68t28 68t68 28t68 -28t28 -68t-28 -68t-68 -28z" />  
106 - <glyph glyph-name="uniE619" unicode="&#xe619;"  
107 -d="M125.5 309q30.5 0 51 21.5t20.5 52.5q0 33 -20.5 54.5t-51 21.5t-51.5 -21.5t-21 -54.5q0 -31 21 -52.5t51.5 -21.5zM512.5 309q30.5 0 51 21.5t20.5 52.5q0 33 -20.5 54.5t-51 21.5t-51.5 -21.5t-21 -54.5q0 -31 21 -52.5t51.5 -21.5zM899.5 309q30.5 0 51 21.5  
108 -t20.5 52.5q0 33 -20.5 54.5t-51 21.5t-51.5 -21.5t-21 -54.5q0 -31 21 -52.5t51.5 -21.5z" />  
109 - <glyph glyph-name="uniE61A" unicode="&#xe61a;"  
110 -d="M512 -62q-91 0 -173.5 35.5t-142 95t-95 142t-35.5 173.5t35.5 173.5t95 142t142 95t173.5 35.5t173.5 -35.5t142 -95t95 -142t35.5 -173.5t-35.5 -173.5t-95 -142t-142 -95t-173.5 -35.5zM512 766q-104 0 -192 -51t-139 -139t-51 -192t51 -192t139 -139t192 -51t192 51  
111 -t139 139t51 192t-51 192t-139 139t-192 51zM512 592zM464 592q0 20 14 34t34 14t34 -14t14 -34t-14 -34t-34 -14t-34 14t-14 34zM512 128q-13 0 -22.5 9.5t-9.5 22.5v288q0 13 9.5 22.5t22.5 9.5t22.5 -9.5t9.5 -22.5v-288q0 -13 -9.5 -22.5t-22.5 -9.5z" />  
112 - <glyph glyph-name="uniE61B" unicode="&#xe61b;"  
113 -d="M437 137h-193q-27 2 -41.5 22.5t-17.5 45.5q3 25 17.5 41t41.5 18h193v63l-193 1q-27 2 -41.5 19t-17.5 43q3 25 17.5 41t41.5 18h144l-134 236q-10 12 -19 30.5t-8 40.5q5 28 20 45.5t56 22.5q24 -2 43 -16.5t31 -31.5l152 -278l167 280q12 17 31 30t43 16  
114 -q15 -1 27.5 -4t22 -10t16 -20t9.5 -34q0 -29 -20 -55l-155 -252h147q26 -2 41 -18t17 -41q-2 -26 -17.5 -44t-41.5 -20l-191 -1v-61h192q26 -2 41 -20t17 -43q-2 -26 -17 -43.5t-41 -19.5l-192 1v-106q-4 -85 -93 -85q-44 0 -68.5 21t-26.5 64v104z" />  
115 - <glyph glyph-name="uniE61C" unicode="&#xe61c;"  
116 -d="M946 -112h-868q-26 0 -44 18t-18 44v868q0 26 18 44t44 18h868q26 0 44 -18t18 -44v-868q0 -26 -18 -44t-44 -18zM946 787q0 13 -9 22t-22 9h-806q-13 0 -22 -9t-9 -22v-806q0 -13 9 -22t22 -9h806q13 0 22 9t9 22v806z" />  
117 - <glyph glyph-name="uniE61D" unicode="&#xe61d;"  
118 -d="M939 -106h-876q-26 0 -44.5 18.5t-18.5 44.5v876q0 26 18.5 44.5t44.5 18.5h876q26 0 44.5 -18.5t18.5 -44.5v-876q0 -26 -18.5 -44.5t-44.5 -18.5zM814 708l-376 -438l-250 188l-63 -126l313 -250l439 501z" />  
119 - <glyph glyph-name="uniE61E" unicode="&#xe61e;"  
120 -d="M224 307l416 410l179 -179l-416 -410zM659 621l-19 19l-333 -333l19 -19zM698 582l-20 20l-332 -333l19 -19zM736 544l-19 19l-333 -333l19 -19zM717 800q14 14 38 14t39 -14l102 -102q14 -15 14 -39t-14 -38l-64 -58l-173 173zM211 282l167 -167l-148 -51l-70 70z  
121 -M205 51l-83 -32l32 83z" />  
122 - <glyph glyph-name="uniE61F" unicode="&#xe61f;"  
123 -d="M512 896q-138 0 -256 -69t-187 -187t-69 -256t69 -256t187 -187t256 -69t256 69t187 187t69 256t-69 256t-187 187t-256 69zM563 128h-102v307h102v-307zM563 538h-102v102h102v-102z" />  
124 - <glyph glyph-name="uniE620" unicode="&#xe620;"  
125 -d="M938 372h-30h-370v274h-50v-274h-395h-4q-31 0 -53 21.5t-22 52.5v175q0 31 22 53t53 22h90q-40 47 -40 100q0 27 10 47.5t25 30t29.5 15t24.5 6.5l11 1q53 0 100 -15.5t81 -42t56 -50t39 -50.5q17 27 39.5 51t56 50t79.5 41.5t98 15.5q4 0 11 -1t24 -7t30 -15.5  
126 -t24 -30.5t11 -49q0 -51 -35 -97h85q31 0 53 -22t22 -53v-175q0 -31 -22 -52.5t-53 -21.5zM264 821q-15 0 -26 -2.5t-15.5 -6t-6.5 -7.5t-2 -6v-3q0 -49 66 -100h173q-14 30 -30 52.5t-34 35.5t-33 21t-34.5 11.5t-30 4t-27.5 0.5zM763 819q-17 0 -27.5 -1t-29.5 -4  
127 -t-33.5 -11t-32 -20.5t-33.5 -34.5t-30 -52h177q59 50 59 97q2 0 0 6.5t-14 13t-36 6.5zM488 -128h-349q-31 0 -53 22t-22 53v375h424v-450zM538 322h400v-375q0 -31 -22 -53t-53 -22h-325v450z" />  
128 - <glyph glyph-name="uniE621" unicode="&#xe621;"  
129 -d="M160 576v-640q0 -26 19 -45t45 -19h576q26 0 45 19t19 45v640h-704zM352 0h-64v448h64v-448zM480 0h-64v448h64v-448zM608 0h-64v448h64v-448zM736 0h-64v448h64v-448zM880 768h-208v80q0 20 -14 34t-34 14h-224q-20 0 -34 -14t-14 -34v-80h-208q-20 0 -34 -14t-14 -34  
130 -v-80h832v80q0 20 -14 34t-34 14zM608 768h-192v63h192v-63z" />  
131 - <glyph glyph-name="uniE622" unicode="&#xe622;" horiz-adv-x="1173"  
132 -d="M586 672q-28 65 -69 113t-86.5 73.5t-96 34t-97.5 -2t-90 -39.5t-75.5 -73t-51.5 -107.5t-20 -138.5q0 -41 9 -78.5t24 -66.5t39 -57.5t47 -48.5t55.5 -43t56.5 -38t58.5 -35.5t53.5 -33.5q93 -61 162 -138.5t82 -120.5q10 39 81.5 118.5t160.5 142.5q24 17 71.5 47  
133 -t79 50.5t71.5 54.5t64 67t41 81t16 102q0 75 -19.5 138t-52.5 105.5t-76.5 70.5t-91 37.5t-98 1t-96 -34.5t-85.5 -72.5t-67 -108.5z" />  
134 - <glyph glyph-name="uniE623" unicode="&#xe623;"  
135 -d="M835 660l-60 63l-263 -275v0l-263 275l-60 -63l262 -276l-262 -276l60 -63l263 275v0l263 -275l60 63l-262 276z" />  
136 - <glyph glyph-name="uniE624" unicode="&#xe624;" horiz-adv-x="1000"  
137 -d="M459 850h55h54v-120v-142v-120h191h191v-109h-191h-191v-191v-190h-109v190v191h-191h-190q-1 37 -1 109h191h191v382z" />  
138 - <glyph glyph-name="uniE625" unicode="&#xe625;" horiz-adv-x="1000"  
139 -d="M77 468h873v-109h-873v109z" />  
140 - <glyph glyph-name="uniE626" unicode="&#xe626;"  
141 -d="M866.5 747.5q-97.5 97.5 -228 132t-261.5 0t-228.5 -132t-132 -228.5t0 -261.5t132 -228t228.5 -132t261.5 0t228 132t132 228t0 261.5t-132 228.5zM798 199l-101 -101l-187 186l-186 -186l-101 101l186 186l-186 187l101 101l186 -186l187 186l101 -101l-186 -187z" />  
142 - <glyph glyph-name="uniE627" unicode="&#xe627;"  
143 -d="M741 342q-23 9 -22 34q6 114 -8 186q-13 68 -37.5 125.5t-48 89.5t-50.5 57t-38 32t-18 10l-7 3l-7 -3q-7 -3 -18 -10t-38 -32t-50.5 -57t-48 -89.5t-37.5 -125.5q-14 -72 -8 -186q1 -25 -22 -34q-25 -11 -47.5 -26t-47 -40.5t-39 -65t-14.5 -87.5v-16h198  
144 -q2 -22 17.5 -36.5t37.5 -14.5h248q22 0 37.5 14.5t17.5 36.5h198v16q0 48 -14.5 87.5t-39 65t-47 40.5t-47.5 26zM512 526q-31 0 -53 22t-22 53t22 53t53 22t53 -22t22 -53t-22 -53t-53 -22zM453 23q-14 0 -23.5 -10t-9.5 -24v-83q0 -14 9.5 -24t23.5 -10t24 10t10 24v83  
145 -q0 14 -10 24t-24 10zM571 23q-14 0 -24 -10t-10 -24v-83q0 -14 10 -24t24 -10t23.5 10t9.5 24v83q0 14 -9.5 24t-23.5 10z" />  
146 - <glyph glyph-name="uniE628" unicode="&#xe628;"  
147 -d="M505 860q95 0 182 -37t150 -100t100.5 -150t37.5 -182t-37.5 -182t-100.5 -150t-150 -100.5t-182 -37.5t-182 37.5t-150 100.5t-100 150t-37 182t37 182t100 150t150 100t182 37zM505 -20q112 0 206.5 55t149.5 149.5t55 206t-55 206t-149.5 149.5t-206 55t-206 -55  
148 -t-149.5 -149.5t-55 -206t55 -206t149.5 -149.5t205.5 -55zM528 222v-59h-58v59h58zM470 648h58v-349h-58v349z" />  
149 - <glyph glyph-name="uniE629" unicode="&#xe629;"  
150 -d="M512 893v0q-58 0 -112.5 -12t-105.5 -38t-80.5 -44t-77.5 -51v-450q0 -57 19.5 -110.5t49 -93.5t69 -76t75.5 -59.5t73.5 -43t57 -28t32.5 -12.5q13 4 32.5 12.5t57 28t73.5 43t75.5 59.5t69 76t49 93.5t19.5 110.5v450q-48 33 -77.5 51t-80.5 44t-105.5 38t-112.5 12z  
151 -M808 298q0 -76 -36.5 -138t-112.5 -117q-73 -53 -147 -82q-74 29 -147 82q-76 55 -112.5 117t-36.5 138v421q87 53 146.5 75t149.5 23q90 -1 149.5 -23t146.5 -75v-421zM512 755q-67 0 -112.5 -12.5t-119.5 -49.5v-399q0 -35 12.5 -68.5t30 -57.5t44 -46t47 -35.5t46 -26  
152 -t34 -16t18.5 -6.5q10 3 18.5 6.5t34 16t46 26t47 35.5t44 46t30 57.5t12.5 68.5v399q-74 37 -119.5 49.5t-112.5 12.5v0zM667 599v-47h-105v-67h92v-61h-92v-77h116v-57h-332v57h42v168h64v-168h46v205h-138v61h307v-14z" />  
153 - <glyph glyph-name="uniE62A" unicode="&#xe62a;"  
154 -d="M497 890l-451 -386q-20 -18 -20 -45v-500q0 -32 22.5 -54.5t53.5 -22.5h256v333h308v-333h256q31 0 53.5 22.5t22.5 54.5v500q0 27 -20 45l-451 386q-15 13 -30 0z" />  
155 - <glyph glyph-name="uniE62B" unicode="&#xe62b;"  
156 -d="M761 623q0 -104 -73 -177t-176.5 -73t-177 73t-73.5 177t73.5 177t177 73t176.5 -73t73 -177zM888 -80q11 22 9 48q-7 99 -60 181.5t-139 130t-186.5 47.5t-187 -47.5t-139.5 -130t-60 -181.5q-1 -26 10 -48q12 -25 40 -25h673q27 0 40 25z" />  
157 - <glyph glyph-name="uniE62C" unicode="&#xe62c;" horiz-adv-x="1048"  
158 -d="M832 -42.5q0 -35.5 -25 -60.5t-60.5 -25t-60.5 25t-25 60.5t25 60.5t60.5 25t60.5 -25t25 -60.5zM533 -42.5q0 -35.5 -25 -60.5t-60 -25t-60 25t-25 60.5t25 60.5t60 25t60 -25t25 -60.5zM277 704l-35 159q-3 14 -15 23.5t-27 9.5h-147q-22 0 -37.5 -15.5t-15.5 -37.5  
159 -t15.5 -38t37.5 -16h54l157 -627q6 -25 25.5 -40t44.5 -15h527q25 0 44.5 15t25.5 40l113 452q9 34 -13 62t-57 28h-697z" />  
160 - <glyph glyph-name="uniE62D" unicode="&#xe62d;"  
161 -d="M442 358h-84v-76h-230v76h-81q-20 0 -33.5 -12.5t-13.5 -31.5v-395q0 -20 13.5 -33.5t33.5 -13.5h395q19 0 31.5 13.5t12.5 33.5v395q0 19 -12.5 31.5t-31.5 12.5zM977 896h-81v-77h-230v77h-84q-19 0 -31.5 -13.5t-12.5 -33.5v-395q0 -19 12.5 -31.5t31.5 -12.5h395  
162 -q20 0 33.5 12.5t13.5 31.5v395q0 20 -13.5 33.5t-33.5 13.5zM977 358h-81v-76h-230v76h-84q-19 0 -31.5 -12.5t-12.5 -31.5v-395q0 -20 12.5 -33.5t31.5 -13.5h395q20 0 33.5 13.5t13.5 33.5v395q0 19 -13.5 31.5t-33.5 12.5z" />  
163 - <glyph glyph-name="uniE62E" unicode="&#xe62e;" horiz-adv-x="1639"  
164 -d="M1 867h1045v-625h-1045v625zM1424 867h-337v-625l61 -33q33 14 70 14q66 0 116 -42t61 -105l7 -4h205v398zM1178 495v290h164l121 -290h-285zM235 209h-235v-163h111q2 57 36.5 101.5t87.5 61.5zM452 38q0 66 -47 112.5t-113.5 46.5t-114 -46.5t-47.5 -112.5t47.5 -112.5  
165 -t114 -46.5t113.5 46.5t47 112.5zM1067 209h-721q54 -17 88.5 -61.5t36.5 -101.5h570q0 50 26 92v71zM1380 40q0 66 -47 112.5t-113.5 46.5t-113.5 -46.5t-47 -112.5t47 -112.5t113.5 -46.5t113.5 46.5t47 112.5z" />  
166 - <glyph glyph-name="uniE62F" unicode="&#xe62f;"  
167 -d="M474 112v161h-167v50h167v74h-167v49h134l-168 265h87l152 -257v386q-35 0 -70.5 2t-64 6t-55 8.5t-46.5 8.5t-34.5 8t-22.5 6t-7 2q-2 -43 -16.5 -74t-34 -44t-38.5 -20t-33 -7h-13q0 -40 1.5 -78t3.5 -69t5.5 -59.5t7 -51t6.5 -41.5t6.5 -32.5t5.5 -23t3 -13.5l2 -5  
168 -q15 -61 45 -120.5t65.5 -105.5t75 -87t76.5 -70.5t67 -50.5t47.5 -32t17.5 -10v225h-38zM550 112v161h167v50h-167v74h167v49h-134l168 265h-87l-152 -257v386q76 0 151 10.5t112 20.5l37 10q2 -43 16.5 -74t34 -44t38.5 -20t33 -7h13q0 -234 -40 -368l-1 -5  
169 -q-15 -61 -44.5 -120.5t-65.5 -105.5t-75.5 -87t-76.5 -70.5t-66.5 -50.5t-47.5 -32t-18 -10v225h38z" />  
170 - <glyph glyph-name="uniE630" unicode="&#xe630;"  
171 -d="M629 25h-268v20q0 31 -21.5 53t-52.5 22t-52.5 -22t-21.5 -53v-20h-174v609h590v-609zM400 66h188v527h-508v-527h94q7 41 39 68t74 27t74 -27t39 -68zM989 25h-136v20q0 31 -21.5 53t-52.5 22t-52.5 -22t-21.5 -53v-20h-117v476h210q22 0 57 -34q27 -26 58 -67  
172 -q31 -40 52 -75q24 -41 24 -62v-238zM892 66h56v197q0 9 -18 40t-46 68t-53 63q-23 23 -34 26h-168v-394h37q7 41 39 68t74 27t74 -27t39 -68zM989 233h-287v193h191l6 -8q35 -43 61 -84q29 -48 29 -71v-30zM743 274h202q-6 15 -21 39q-21 34 -50 72h-131v-111zM779.5 -70  
173 -q-47.5 0 -81.5 34t-34 81.5t34 81.5t81.5 34t81 -34t33.5 -81.5t-33.5 -81.5t-81 -34zM779 120q-31 0 -52.5 -22t-21.5 -52.5t21.5 -52.5t52.5 -22t52.5 22t21.5 52.5t-21.5 52.5t-52.5 22zM287 -70q-48 0 -81.5 34t-33.5 81.5t33.5 81.5t81.5 34t81.5 -34t33.5 -81.5  
174 -t-33.5 -81.5t-81.5 -34zM287 120q-31 0 -52.5 -22t-21.5 -52.5t21.5 -52.5t52.5 -22t52.5 22t21.5 52.5t-21.5 52.5t-52.5 22z" />  
175 - <glyph glyph-name="uniE631" unicode="&#xe631;"  
176 -d="M24 895v-1022v1022zM47 895v-1022v1022zM70 895v-1022v1022zM94 895v-1022v1022zM117 895v-1022v1022zM140 895v-1022v1022zM163 895v-1022v1022zM187 895v-1022v1022zM210 895v-1022v1022zM233 895v-1022v1022zM256 895v-1022v1022zM280 895v-1022v1022zM303 895v-1022  
177 -v1022zM326 895v-1022v1022zM349 895v-1022v1022zM373 895v-1022v1022zM396 895v-1022v1022zM419 895v-1022v1022zM442 895v-1022v1022zM466 895v-1022v1022zM489 895v-1022v1022zM512 895v-1022v1022zM535 895v-1022v1022zM558 895v-1022v1022zM582 895v-1022v1022zM605 895  
178 -v-1022v1022zM628 895v-1022v1022zM651 895v-1022v1022zM675 895v-1022v1022zM698 895v-1022v1022zM721 895v-1022v1022zM744 895v-1022v1022zM768 895v-1022v1022zM791 895v-1022v1022zM814 895v-1022v1022zM837 895v-1022v1022zM861 895v-1022v1022zM884 895v-1022v1022z  
179 -M907 895v-1022v1022zM930 895v-1022v1022zM954 895v-1022v1022zM977 895v-1022v1022zM1000 895v-1022v1022zM1 872h1022h-1022zM1 849h1022h-1022zM1 826h1022h-1022zM1 802h1022h-1022zM1 779h1022h-1022zM1 756h1022h-1022zM1 733h1022h-1022zM1 709h1022h-1022zM1 686  
180 -h1022h-1022zM1 663h1022h-1022zM1 640h1022h-1022zM1 616h1022h-1022zM1 593h1022h-1022zM1 570h1022h-1022zM1 547h1022h-1022zM1 523h1022h-1022zM1 500h1022h-1022zM1 477h1022h-1022zM1 454h1022h-1022zM1 430h1022h-1022zM1 407h1022h-1022zM1 384h1022h-1022zM1 361  
181 -h1022h-1022zM1 338h1022h-1022zM1 314h1022h-1022zM1 291h1022h-1022zM1 268h1022h-1022zM1 245h1022h-1022zM1 221h1022h-1022zM1 198h1022h-1022zM1 175h1022h-1022zM1 152h1022h-1022zM1 128h1022h-1022zM1 105h1022h-1022zM1 82h1022h-1022zM1 59h1022h-1022zM1 35h1022  
182 -h-1022zM1 12h1022h-1022zM1 -11h1022h-1022zM1 -34h1022h-1022zM1 -58h1022h-1022zM1 -81h1022h-1022zM1 -104h1022h-1022zM512 -127q-7 8 -18.5 22t-45.5 59t-64.5 91t-68 113.5t-64.5 131.5t-45.5 139t-18.5 141q0 52 11 96.5t30 75.5t43 56.5t51 41t54 27t51.5 17  
183 -t43.5 8.5t30 3h11q7 0 18.5 -0.5t45.5 -7t64.5 -17.5t68 -35.5t64.5 -57.5t45.5 -87t18.5 -120q0 -237 -215 -552q-60 -88 -110 -145zM740 613q-16 85 -86 140q-1 1 -4 3.5t-5 3.5q-5 4 -22 13t-19 10q-1 0 -20 7q-21 7 -24 7q-24 5 -48 5v0q-24 0 -47 -5q-44 -8 -82 -34h-1  
184 -q-12 -9 -27 -23q-2 -1 -5 -4l-3 -3q-4 -4 -16 -19.5t-13 -16.5q-2 -3 -4.5 -7.5t-3.5 -5.5q-10 -19 -13 -27q-1 -2 -2 -6t-2 -5q-7 -21 -9 -32q-4 -22 -4 -44q0 -65 23.5 -146.5t58 -151.5t68.5 -129.5t58 -95.5t24 -35q9 13 25 36.5t56 92t70.5 133.5t55.5 148t25 148  
185 -q0 22 -4 43zM373 570q0 58 40.5 98.5t98.5 40.5t98.5 -40.5t40.5 -98.5t-40.5 -99t-98.5 -41t-98.5 41t-40.5 99z" />  
186 - <glyph glyph-name="uniE632" unicode="&#xe632;"  
187 -d="M313 247h397v69h-397v-69zM313 110h397v68h-397v-68zM611 831h-430q-14 0 -23.5 -10t-9.5 -24v-825q0 -14 9.5 -24t23.5 -10h661q14 0 24 10t10 24v619zM644 710l131 -119h-131v119zM809 7h-595v755h364v-206q0 -14 9.5 -24t23.5 -10h198v-515zM313 384h397v69h-397v-69z  
188 -" />  
189 - <glyph glyph-name="uniE633" unicode="&#xe633;" horiz-adv-x="1304"  
190 -d="M1303 538l-161 242h-304v-443h233q19 0 32.5 14t13.5 33t-13.5 33t-32.5 14h-140v256h161l118 -177v-242h-442v577q0 21 -15 36t-36 15h-666q-21 0 -36 -15t-15 -36v-620q0 -21 15 -35.5t36 -14.5h142q-30 -49 -30 -105q0 -82 58 -140t140 -58t140 58t58 140  
191 -q0 56 -31 105h363q-30 -49 -30 -105q0 -82 58 -140t140 -58t140 58t58 140q0 56 -31 105h77v363zM93 803h582v-535h-582v535zM465 70q0 -43 -30.5 -74t-74 -31t-74 31t-30.5 74t30.5 74t74 31t74 -31t30.5 -74zM1164 70q0 -43 -31 -74t-74 -31t-74 31t-31 74t31 74t74 31  
192 -t74 -31t31 -74z" />  
193 - <glyph glyph-name="uniE634" unicode="&#xe634;" horiz-adv-x="1476"  
194 -d="M1403 896h-1331q-30 0 -51 -21t-21 -51v-880q0 -30 21 -51t51 -21h1331q30 0 51.5 21t21.5 51v880q0 30 -21.5 51t-51.5 21zM120 776h1235v-151h-1235v151zM120 414h1235v-422h-1235v422zM211 294h572v-61h-572v61zM211 173h331v-60h-331v60z" />  
195 - <glyph glyph-name="uniE635" unicode="&#xe635;"  
196 -d="M512 881q-102 0 -194.5 -39.5t-160 -106.5t-107 -160t-39.5 -194.5t39.5 -194.5t107 -160t160 -107t194.5 -40t194.5 40t160 107t107 160t39.5 194.5t-39.5 194.5t-107 160t-160 106.5t-194.5 39.5zM512 -34q-112 0 -207.5 55.5t-151 151t-55.5 208t55.5 207.5t151 150.5  
197 -t207.5 55.5t207.5 -55.5t151 -150.5t55.5 -207.5t-55.5 -208t-151 -151t-207.5 -55.5zM512 555q25 0 43 -18t18 -44h87q0 50 -29 89t-75 53v50q0 9 -6.5 15.5t-15.5 6.5h-44q-9 0 -15.5 -6.5t-6.5 -15.5v-50q-46 -14 -75 -53t-29 -89q0 -104 133 -154q27 -9 44 -20t23 -22  
198 -t7.5 -16.5t1.5 -13.5q0 -25 -18 -43t-43 -18t-43 18t-18 43h-87q0 -49 29 -88t75 -54v-50q0 -9 6.5 -15t15.5 -6h44q9 0 15.5 6t6.5 15v50q46 15 75 54t29 88q0 105 -133 154q-27 10 -44 21t-23 22t-7.5 16.5t-1.5 12.5q0 26 18 44t43 18z" />  
199 - <glyph glyph-name="uniE636" unicode="&#xe636;"  
200 -d="M947 759h-892q-23 0 -39 -16t-16 -38v-642q0 -23 16 -39t39 -16h892q22 0 38 16t16 39v642q0 22 -16 38t-38 16zM836 668l-335 -260l-336 260h671zM91 100v511l376 -293q15 -11 33.5 -11t33.5 11l376 293v-511h-819z" />  
201 - <glyph glyph-name="uniE637" unicode="&#xe637;"  
202 -d="M512 656q-63 0 -107.5 -44.5t-44.5 -107.5t44.5 -107.5t107.5 -44.5t107.5 44.5t44.5 107.5t-44.5 107.5t-107.5 44.5zM512 880q-102 0 -188.5 -50.5t-136.5 -137t-50 -188.5q0 -56 36 -137.5t81 -151t104 -146.5t85 -107t44 -50l25 -28l25 28q18 20 44 50t85 107  
203 -t104 146.5t81 151t36 137.5q0 102 -50 188.5t-136.5 137t-188.5 50.5zM512 -13q-46 54 -93.5 115.5t-98.5 137t-83 147t-32 117.5q0 127 90 217t217 90t217 -90t90 -217q0 -46 -32 -117.5t-83 -147t-98.5 -137t-93.5 -115.5z" />  
204 - <glyph glyph-name="uniE638" unicode="&#xe638;" horiz-adv-x="1335"  
205 -d="M1273 -4h-1179q-26 0 -44 -18t-18 -44t18 -44t44 -18h1179q26 0 44 18t18 44t-18 44t-44 18zM841 741h429q27 0 46 18t19 44t-19 44t-46 18h-429q-27 0 -46 -18t-19 -44t19 -44t46 -18zM841 314h429q27 0 46 18t19 44t-19 44t-46 18h-429q-27 0 -46 -18t-19 -44t19 -44  
206 -t46 -18zM85 314h434q26 0 44 18t18 44v435q0 25 -18 43.5t-44 18.5h-434q-26 0 -44 -18.5t-18 -43.5v-435q0 -25 18 -43.5t44 -18.5zM147 749h310v-311h-310v311z" />  
207 - <glyph glyph-name="uniE639" unicode="&#xe639;"  
208 -d="M507 895q-101 0 -194 -40t-160 -107t-107 -160t-40 -194.5t40 -194.5t107 -160t160 -107t194.5 -40t194.5 40t160 107t107 160t40 194.5t-40 194.5t-107 160t-160 107t-195 40zM507 -20q-112 0 -207.5 55.5t-150.5 150.5t-55 207.5t55 208t150.5 151t208 55.5  
209 -t207.5 -55.5t150.5 -151t55.5 -208t-55.5 -207.5t-150.5 -150.5t-208 -55.5zM506 689h-1h-1q-67 0 -115 -47q-48 -48 -48 -116q0 -18 12.5 -31t30.5 -13t31 13t13 31q0 32 22 54q22 21 55 22q30 -1 52.5 -23t22.5 -52q1 -24 -12 -43t-34 -29q-34 -14 -54 -44.5t-20 -68.5  
210 -v-36q0 -18 13 -30.5t31 -12.5t31 12.5t13 30.5v36q0 24 20 33q46 20 73 61.5t26 91.5q-1 66 -48 113t-113 48zM504 219q-23 0 -39 -16t-16 -38.5t16 -38.5t39 -16t38.5 16t15.5 38.5t-15.5 38.5t-38.5 16z" />  
211 - <glyph glyph-name="uniE63A" unicode="&#xe63a;"  
212 -d="M964 460q21 1 35 16t14 36v147q0 21 -15.5 36.5t-36.5 15.5h-898q-21 0 -36.5 -15.5t-15.5 -36.5v-147q0 -21 14 -36t35 -16q29 -2 49.5 -24t20.5 -52t-20.5 -52t-49.5 -24q-21 -1 -35 -16t-14 -36v-147q0 -21 15.5 -36.5t36.5 -15.5h898q21 0 36.5 15.5t15.5 36.5v147  
213 -q0 21 -14 36t-35 16q-29 2 -49.5 24t-20.5 52t20.5 52t49.5 24zM926 227v-83h-828v83q52 15 85.5 58.5t33.5 98.5t-33.5 98.5t-85.5 58.5v83h283v-66h66v66h479v-83q-52 -15 -85.5 -58.5t-33.5 -98.5t33.5 -98.5t85.5 -58.5zM381 362h66v-109h-66v109zM381 515h66v-109h-66  
214 -v109zM381 210h66v-66h-66v66z" />  
215 - <glyph glyph-name="uniE63B" unicode="&#xe63b;" horiz-adv-x="1199"  
216 -d="M1149 896h-1099q-21 0 -35.5 -14.5t-14.5 -35.5v-350q0 -20 14.5 -35t35.5 -15h1099q21 0 35.5 15t14.5 35v350q0 21 -14.5 35.5t-35.5 14.5zM100 796h999v-250h-999v250zM1024 396q-21 0 -35.5 -14.5t-14.5 -34.5v-375h-749v375q0 20 -14.5 34.5t-35.5 14.5t-35.5 -14.5  
217 -t-14.5 -34.5v-425q0 -21 14.5 -35.5t35.5 -14.5h849q21 0 35.5 14.5t14.5 35.5v425q0 20 -14.5 34.5t-35.5 14.5zM325 396q-21 0 -35.5 -14.5t-14.5 -34.5v-200q0 -21 14.5 -35.5t35.5 -14.5h549q21 0 35.5 14.5t14.5 35.5v200q0 20 -14.5 34.5t-35.5 14.5t-35.5 -14.5  
218 -t-14.5 -34.5v-150h-449v150q0 20 -15 34.5t-35 14.5z" />  
219 - <glyph glyph-name="uniE63C" unicode="&#xe63c;" horiz-adv-x="1048"  
220 -d="M297.5 521q-20.5 0 -35 -14.5t-14.5 -35.5t14.5 -35.5t35 -14.5t35.5 14.5t15 35.5t-15 35.5t-35.5 14.5zM953 29q95 93 95 215t-94 214q2 20 2 23q0 111 -64 205t-174.5 148.5t-240 54.5t-239.5 -54.5t-174 -148.5t-64 -205q0 -78 33 -148.5t93 -125.5l-77 -123  
221 -q-8 -12 -6.5 -26t10.5 -25q13 -15 32 -15q9 0 18 4l180 80q4 2 7 4q20 -7 39 -12q48 -80 138.5 -128t199.5 -48q75 0 145 25q1 -1 2 -1l140 -62q8 -4 17 -4q20 0 32 15q10 10 11 24t-7 26zM286 244q0 -17 2 -35v1q-88 42 -140.5 114t-52.5 157t51.5 157t139.5 114t192 42  
222 -q142 0 249.5 -76.5t128.5 -189.5q-88 43 -189 43q-104 0 -191.5 -43.5t-138.5 -119t-51 -164.5zM381 244q0 96 84 164t202 68t202 -68t84 -163.5t-84 -163.5t-202 -68t-202 68t-84 163zM527 275q-16 0 -27.5 -11t-11.5 -27t11.5 -27.5t27.5 -11.5t27.5 11.5t11.5 27.5  
223 -t-11.5 27t-27.5 11zM667 275q-16 0 -27.5 -11t-11.5 -27t11.5 -27.5t27.5 -11.5t27.5 11.5t11.5 27.5t-11.5 27t-27.5 11zM806 275q-16 0 -27 -11t-11 -27t11 -27.5t27 -11.5t27.5 11.5t11.5 27.5t-11.5 27t-27.5 11z" />  
224 - <glyph glyph-name="uniE63D" unicode="&#xe63d;"  
225 -d="M512 13q-131 0 -241.5 55t-175 149.5t-64.5 205.5t64.5 205.5t175 149.5t241.5 55t241.5 -55t175 -149.5t64.5 -205.5t-64.5 -205.5t-175 -149.5t-241.5 -55zM512 751q-108 0 -200 -44t-145.5 -119.5t-53.5 -164.5t53.5 -164.5t145.5 -119.5t200 -44t200 44t145.5 119.5  
226 -t53.5 164.5t-53.5 164.5t-145.5 119.5t-200 44zM730 75l184 -82l-102 164zM914 -44q-8 0 -15 3l-184 82q-14 6 -19.5 20.5t0.5 28.5t20.5 19.5t28.5 -1.5l74 -33l-39 62q-8 13 -4.5 28t16.5 23t28 4.5t23 -16.5l102 -164q15 -23 -3 -43q-11 -13 -28 -13zM379 412.5  
227 -q0 -21.5 -15 -36.5t-36.5 -15t-36.5 15t-15 36.5t15 36.5t36.5 15t36.5 -15t15 -36.5zM563 412.5q0 -21.5 -15 -36.5t-36 -15t-36 15t-15 36.5t15 36.5t36 15t36 -15t15 -36.5zM748 413q0 -22 -15 -37t-36.5 -15t-36.5 15t-15 36.5t15 36.5t36.5 15t36.5 -15t15 -36z" />  
228 - <glyph glyph-name="uniE63E" unicode="&#xe63e;"  
229 -d="M521 401zM768 -94q-94 0 -205 56q-145 72 -277 204.5t-205 277.5q-55 113 -56.5 201t52.5 140q13 13 30 13t29.5 -13t12.5 -30t-12 -30q-32 -32 -26.5 -98t47.5 -149q68 -137 187.5 -256.5t256.5 -187.5q83 -42 149 -47.5t98 26.5q13 13 30 13t30 -13t13 -30t-13 -30  
230 -q-54 -47 -141 -47zM333 439q-26 0 -39 26q-9 16 -4 32.5t21 23.5l99 46q15 8 26 23t8 33q0 13 -17 30l-141 145q-20 20 -56 13q-12 -7 -25 -13l-68 -73q-13 -12 -30 -12t-30 12.5t-13 29.5t13 30l68 68q28 28 60 34q80 20 141 -34l140 -140q32 -32 39 -82q6 -41 -16.5 -81.5  
231 -t-64.5 -63.5l-98 -47h-13zM875 -55q-17 0 -30 12.5t-13 29.5t13 30l68 68q5 6 7.5 8.5t4 7t1.5 10.5q7 35 -13 55l-141 141q-4 4 -30 17q-18 3 -33 -7t-22 -27l-47 -98q-6 -16 -22.5 -21.5t-32.5 4.5q-17 6 -22 22.5t4 32.5l47 99q23 42 62 64.5t83 16.5q45 -7 77 -39  
232 -l141 -141q29 -28 38 -65t-4 -75q-17 -43 -34 -60l-72 -73q-13 -12 -30 -12zM602 171q-9 0 -26 8q-77 58 -154 128q-76 77 -128 154q-9 12 -6 29.5t19 30.5q16 9 33 6.5t27 -15.5q69 -95 119 -141q94 -85 141 -119q16 -10 18.5 -27t-9.5 -33q-6 -21 -34 -21z" />  
233 - <glyph glyph-name="uniE63F" unicode="&#xe63f;" horiz-adv-x="1025"  
234 -d="M512 18q-11 0 -31 -1t-36.5 -1t-30.5 2l-222 -146q0 227 5 243q-91 65 -144 152.5t-53 189.5q0 122 68.5 223t186 158.5t257.5 57.5t257.5 -57.5t186 -158.5t68.5 -222.5t-68.5 -223t-186 -159t-257.5 -57.5zM512 847q-122 0 -229 -52.5t-170.5 -143t-63.5 -194.5  
235 -q0 -95 53 -179t142 -138v-170l146 97q16 -3 35.5 -4t49 0t37.5 1q122 0 229 53.5t170.5 144.5t63.5 195t-63.5 194.5t-170.5 143t-229 52.5zM768 384q-27 0 -45.5 18.5t-18.5 45.5t18.5 45.5t45.5 18.5t45.5 -18.5t18.5 -45.5t-18.5 -45.5t-45.5 -18.5zM512 384  
236 -q-27 0 -45.5 18.5t-18.5 45.5t18.5 45.5t45.5 18.5t45.5 -18.5t18.5 -45.5t-18.5 -45.5t-45.5 -18.5zM256 384q-27 0 -45.5 18.5t-18.5 45.5t18.5 45.5t45.5 18.5t45.5 -18.5t18.5 -45.5t-18.5 -45.5t-45.5 -18.5z" />  
237 - <glyph glyph-name="uniE640" unicode="&#xe640;"  
238 -d="M957 594q-12 19 -38 19h-598l-29 62q-3 7 -8 14q-3 4 -8 8q-4 3 -7 6l-2 1l-8 4h-2q-5 2 -9 2l-4 1h-5h-118q-23 0 -40 -16.5t-17 -40t17 -40.5t40 -17h81l33 -71q2 -6 5 -13t5 -12t4.5 -9.5t3.5 -6.5l1 -2l81 -181q0 -2 2 -5l15 -32q9 -30 39 -38v-3h392l18 1v2  
239 -q30 9 39 38l98 217q40 77 19 112zM909 497l-93 -207l-3 1l-4 -15q-5 -19 -25 -19l-19 1v-1h-340h-18q-19 0 -24 19l-4 15l-3 -1l-93 208q-10 17 -18 40l-42 92h-102q-10 0 -17 7t-7 17t7 17.5t17 7.5h119l3 -1q1 0 4 -1q2 0 4 -2q2 -1 4 -3q2 -1 3 -3l4 -6l38 -83h619  
240 -q8 0 10 -3q5 -8 -1.5 -32.5t-18.5 -47.5zM470 191q-33 0 -56.5 -23t-23.5 -56t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5t-23.5 56t-56.5 23zM470 61q-21 0 -36 15t-15 36t15 36t36 15t36 -15t15 -36.5t-15 -36t-36 -14.5zM747 191q-33 0 -56.5 -23t-23.5 -56t23.5 -56.5  
241 -t56.5 -23.5t56.5 23.5t23.5 56.5t-23.5 56t-56.5 23zM747 61q-21 0 -36 14.5t-15 36t15 36.5t36 15t36 -15t15 -36t-15 -36t-36 -15z" />  
242 - <glyph glyph-name="uniE641" unicode="&#xe641;" horiz-adv-x="1045"  
243 -d="M522 893q-103 0 -197 -40t-162 -108t-108.5 -162t-40.5 -197.5t40.5 -197.5t108.5 -162t162 -108t197.5 -40t197.5 40t162 108t108 162t40 197.5t-40 197.5t-108 162t-162 108t-198 40zM522 -49q-88 0 -168.5 34.5t-138.5 93t-92.5 138.5t-34.5 168.5t34.5 169  
244 -t92.5 138.5t138.5 92.5t169 34.5t168.5 -34.5t138.5 -92.5t93 -138.5t34.5 -169t-34.5 -168.5t-93 -138.5t-138.5 -93t-169 -34.5zM775 268l-105 61q-11 4 -21 6.5t-18 2.5t-15 -0.5t-13 -4t-10 -5.5t-9 -6l-6 -7q-2 -2 -6 -7l-3 -4l-6 -10q-34 -4 -59 21l-51 50  
245 -q-24 25 -20 60l9 4q3 5 16 16t17 18t4 25t-11 43h-1l-60 105q-12 20 -33 25.5t-41 -5.5l-62 -36q-6 -3 -14 -11.5t-13 -14.5l-5 -6q-14 -87 24.5 -183.5t121.5 -174.5q72 -68 157 -101.5t165 -29.5q4 1 10.5 2.5t20.5 10t21 20.5l36 62q11 20 5.5 41.5t-25.5 32.5z" />  
246 - <glyph glyph-name="uniE642" unicode="&#xe642;"  
247 -d="M439 324h110l-54 148zM501 881q-101 0 -192.5 -39.5t-158 -105.5t-105.5 -158t-39 -192.5t39 -192.5t105.5 -158.5t158 -105.5t192.5 -39t192.5 39t158 105.5t105.5 158.5t39 192.5t-39 192.5t-105.5 158t-158 105.5t-192.5 39.5zM656 180l-19 -9q-5 -3 -11 -3q-5 0 -9 2  
248 -q-10 4 -14 14l-27 69h-163l-25 -69q-4 -10 -14.5 -14t-19.5 1l-20 9q-9 4 -12.5 13t-0.5 18l151 401q6 16 23 16t23 -16l151 -401q3 -9 -0.5 -18t-12.5 -13z" />  
249 - <glyph glyph-name="uniE643" unicode="&#xe643;" horiz-adv-x="1124"  
250 -d="M859 896h-595q-109 0 -186.5 -77.5t-77.5 -186.5v-760l200 135q18 14 49.5 24t63.5 14.5t71.5 6.5t66 2t57 -1t34.5 -1h317q109 0 186.5 77.5t77.5 186.5v316q0 109 -77.5 186.5t-186.5 77.5zM477 367q-42 0 -71.5 29.5t-29.5 70.5t29.5 70t71.5 29t71.5 -29t29.5 -70  
251 -t-29.5 -70.5t-71.5 -29.5zM848 367q-42 0 -71.5 29.5t-29.5 70.5t29.5 70t71.5 29t71.5 -29t29.5 -70t-29.5 -70.5t-71.5 -29.5z" />  
252 - <glyph glyph-name="uniE644" unicode="&#xe644;"  
253 -d="M523 881q-101 0 -192.5 -39.5t-158 -105.5t-105.5 -158t-39 -192.5t39 -192.5t105.5 -158.5t158 -105.5t192.5 -39t192.5 39t158 105.5t105.5 158.5t39 192.5t-39 192.5t-105.5 158t-158 105.5t-192.5 39.5zM739 224q8 -8 7.5 -18.5t-8.5 -17.5q-11 -10 -15 -14  
254 -q-7 -7 -17 -7t-18 7l-34 34q-59 -42 -131 -42q-94 0 -160.5 66.5t-66.5 160.5t67 160.5t160.5 66.5t160 -66.5t66.5 -160.5q0 -75 -45 -135zM592 337q8 7 18 6.5t17 -7.5l27 -27q25 39 25 84q0 64 -45.5 109.5t-110 45.5t-110 -45.5t-45.5 -109.5t45.5 -109.5t109.5 -45.5  
255 -q44 0 80 21l-27 28q-8 7 -7.5 18t7.5 18z" />  
256 - <glyph glyph-name="uniE645" unicode="&#xe645;"  
257 -d="M512 894q-104 0 -198 -40.5t-162.5 -109t-109 -162.5t-40.5 -198t40.5 -198t109 -162.5t162.5 -109t198 -40.5t198 40.5t162.5 109t109 162.5t40.5 198t-40.5 198t-109 162.5t-162.5 109t-198 40.5zM512 -53q-89 0 -170 34.5t-139.5 93t-93 139.5t-34.5 170t34.5 170  
258 -t93 139.5t139.5 93t170 34.5t170 -34.5t139.5 -93t93 -139.5t34.5 -170t-34.5 -170t-93 -139.5t-139.5 -93t-170 -34.5zM659 384q15 0 25.5 10.5t10.5 25.5t-10.5 26t-25.5 11h-111v17l135 141q11 11 10.5 26t-11 25.5t-25.5 10t-26 -11.5l-115 -121l-123 122  
259 -q-11 11 -26 10.5t-25.5 -11t-11 -25.5t10.5 -26l135 -135v-22h-108q-15 0 -26 -11t-11 -26t11 -25.5t26 -10.5h108v-73h-108q-15 0 -26 -10.5t-11 -25.5t11 -26t26 -11h108v-108q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v108h111q15 0 25.5 11t10.5 26t-10.5 25.5  
260 -t-25.5 10.5h-111v73h111z" />  
261 - <glyph glyph-name="uniE646" unicode="&#xe646;"  
262 -d="M708 553l-257 -267l-135 141q-12 13 -28.5 13t-28 -12.5t-11.5 -29.5t11 -29l164 -170q4 -4 8 -7q12 -7 25.5 -5.5t23.5 12.5l284 295q12 13 12 30t-12 29q-41 16 -56 0zM512 384zM17 384q0 101 39 192.5t105.5 158t158 105.5t192.5 39t192.5 -39t158 -105.5t105.5 -158  
263 -t39 -192.5t-39 -192.5t-105.5 -158t-158 -105.5t-192.5 -39t-192.5 39t-158 105.5t-105.5 158t-39 192.5z" />  
264 - <glyph glyph-name="uniE647" unicode="&#xe647;"  
265 -d="M512 -92q-97 0 -185 37.5t-152 101.5t-101.5 152t-37.5 185t37.5 185t101.5 152t152 101.5t185 37.5t185 -37.5t152 -101.5t101.5 -152t37.5 -185t-37.5 -185t-101.5 -152t-152 -101.5t-185 -37.5zM512 828q-90 0 -172.5 -35t-142 -94.5t-94.5 -142t-35 -172.5t35 -172.5  
266 -t94.5 -142t142 -94.5t172.5 -35t172.5 35t142 94.5t94.5 142t35 172.5t-35 172.5t-94.5 142t-142 94.5t-172.5 35z" />  
267 - <glyph glyph-name="uniE648" unicode="&#xe648;"  
268 -d="M512 882q-101 0 -193.5 -39.5t-159 -106t-106 -159t-39.5 -193.5t39.5 -193.5t106 -159t159 -106t193.5 -39.5t193.5 39.5t159 106t106 159t39.5 193.5t-39.5 193.5t-106 159t-159 106t-193.5 39.5zM512 -82q-95 0 -181 37t-148.5 99.5t-99.5 148.5t-37 181t37 181  
269 -t99.5 148.5t148.5 99.5t181 37t181 -37t148.5 -99.5t99.5 -148.5t37 -181t-37 -181t-99.5 -148.5t-148.5 -99.5t-181 -37zM420 217l-156 155l-22 -22l178 -179l361 361l-23 23z" />  
270 - <glyph glyph-name="uniE649" unicode="&#xe649;"  
271 -d="M875 126l-363 -164l-363 164v610q247 75 363 75t363 -75v-610zM930 808q-34 11 -84.5 26t-159.5 38.5t-174 23.5t-174 -23.5t-159.5 -38.5t-84.5 -26q-14 -4 -22 -15.5t-8 -25.5v-669q0 -27 25 -39l405 -183q9 -3 18 -3t18 3l405 183q25 12 25 39v669q0 14 -8 25.5  
272 -t-22 15.5zM751 552v83h-473v-83h206v-298h-72v237h-87v-237h-66v-84h506v84h-193v119h151v83h-151v96h179z" />  
273 - <glyph glyph-name="uniE64A" unicode="&#xe64a;"  
274 -d="M510.5 -61q-90.5 0 -173.5 35.5t-142.5 95t-95 142.5t-35.5 173.5t35.5 173.5t95 142.5t142.5 95t173.5 35.5t173.5 -35.5t142.5 -95t95 -142.5t35.5 -173.5t-35.5 -173.5t-95 -142.5t-142.5 -95t-173.5 -35.5zM510.5 793q-110.5 0 -204.5 -54.5t-148.5 -148.5  
275 -t-54.5 -204.5t54.5 -204.5t148.5 -148.5t204.5 -54.5t204.5 54.5t148.5 148.5t54.5 204.5t-54.5 204.5t-148.5 148.5t-204.5 54.5zM491 347q-8 0 -13.5 5.5t-5.5 13.5v330q0 8 5.5 14t13.5 6t14 -6t6 -14v-330q0 -8 -6 -13.5t-14 -5.5zM763 347h-272q-8 0 -13.5 5.5  
276 -t-5.5 13.5t5.5 13.5t13.5 5.5h272q8 0 13.5 -5.5t5.5 -13.5t-5.5 -13.5t-13.5 -5.5z" />  
277 - <glyph glyph-name="uniE64B" unicode="&#xe64b;"  
278 -d="M379 -128q-57 0 -122 51.5t-97 132.5q-26 71 -27 149.5t24 151.5q11 33 32.5 70.5t37 58.5t46.5 62q17 20 51 68l11 14l23 34q9 14 21 35t18.5 38.5t11.5 38t4 42.5t-7 44q-6 11 7 24q7 7 20 7q149 -50 216 -284q27 50 58 69q12 6 23 0t11 -21q-3 -59 11.5 -126.5  
279 -t42.5 -126.5q4 -5 9 -17t8 -17q51 -89 55 -157q4 -63 -14.5 -126.5t-65.5 -120t-115 -80.5q-30 -11 -61 -11q-18 0 -30.5 5t-18 12.5t-7.5 13t-2 10.5q0 7 2 13t4 10t7.5 9.5t7.5 7t9 6.5t8 6l3 3q36 26 54 75.5t7 95.5q-4 28 -27 75q-2 6 -7.5 20t-8.5 22t-6.5 20t-4.5 23  
280 -q0 -2 -2 -5t-2 -5q-15 -42 -20 -75q0 -45 7 -58q7 -5 7.5 -14.5t-4.5 -16.5q-5 -8 -14 -10t-17 3v0q-67 44 -85 120q7 34 7 78v21v24q0 68 -10 92q-14 -53 -28 -72q-22 -39 -37 -58q-6 -6 -15.5 -20t-12.5 -18q-13 -22 -24 -46.5t-21.5 -61.5t-5.5 -78t28 -76  
281 -q3 -7 7.5 -12.5t8 -10t8.5 -10t7.5 -8t8 -7t7.5 -6.5t7.5 -6.5t6.5 -4.5q11 -9 16.5 -14.5t10 -14.5t0.5 -19q-5 -18 -21.5 -29.5t-39.5 -11.5z" />  
282 - <glyph glyph-name="uniE64C" unicode="&#xe64c;"  
283 -d="M911 725h-242v123q0 21 -13.5 34.5t-34.5 13.5h-246q-20 0 -33.5 -13.5t-13.5 -34.5v-123h-246q-21 0 -34.5 -13.5t-13.5 -34t13.5 -34t34.5 -13.5h293h243h293q21 0 34.5 13.5t13.5 34t-13.5 34t-34.5 13.5zM423 725v72h147v-72h-147zM765 579q-21 0 -34.5 -14  
284 -t-13.5 -34v-560h-441v560q0 20 -13.5 34t-34 14t-34 -14t-13.5 -34v-611q0 -21 13.5 -34.5t34.5 -13.5h536q20 0 33.5 13.5t13.5 34.5v611q3 20 -11.5 34t-35.5 14zM447 67v389q0 20 -13.5 33.5t-34 13.5t-34 -13.5t-13.5 -33.5v-389q0 -21 13.5 -34.5t34 -13.5t34 13.5  
285 -t13.5 34.5zM645 67v389q0 20 -13.5 33.5t-34.5 13.5q-20 0 -35.5 -13.5t-15.5 -33.5v-389q0 -21 13.5 -34.5t34.5 -13.5t36 13.5t15 34.5z" />  
286 - </font>  
287 -</defs></svg>  
  1 +var $ = require('yoho-jquery'),
  2 + lazyLoad = require('yoho-jquery-lazyload');
  3 +var Swiper = require('yoho-swiper');
  4 +
  5 +lazyLoad($('img'));
  6 +
  7 +$('.swiper-container').each(function() {
  8 + if ($(this).find('.swiper-slide').length > 1) {
  9 + new Swiper($(this).get(0), {
  10 + lazyLoading: true,
  11 + lazyLoadingInPrevNext: true,
  12 + loop: true,
  13 + autoplay: 3000,
  14 + autoplayDisableOnInteraction: true,
  15 + paginationClickable: true,
  16 + pagination: $(this).closest('.banner-top').find('.pagination-inner').get(0)
  17 + });
  18 + }
  19 +});
  1 +var wxShare = require('common/share');
  2 +
  3 +require('./live/live_head');
  4 +require('./live/yoho_video');
  5 +require('./live/yoho_live_detail_main');
  6 +require('./live/temp');
  7 +require('./live/yoho_live_share');
  8 +
  9 +global.$ = $;
  10 +
  11 +$('.live-wrapper').css({
  12 + position: 'relative',
  13 + height: window.innerHeight
  14 +});
  15 +
  16 +$(function() {
  17 + var $share = $('.live-btn-share');
  18 + var $appBox = $('#float-layer-app');
  19 +
  20 + if (/MicroMessenger/i.test(navigator.userAgent)) {
  21 + $share.show()
  22 + .on('click', function() {
  23 + wxShare({
  24 + title: global.shareTitle,
  25 + desc: global.shareContent,
  26 + imgUrl: global.sharePic
  27 + });
  28 + });
  29 + }
  30 +
  31 + $appBox.on('click', '#float-layer-close', function() {
  32 + $appBox.hide();
  33 + });
  34 +});
  35 +
  1 +/* eslint-disable */
  2 +/**
  3 + * Created by qiujun on 16/6/5.
  4 + * 直播或重播页面上方浮动的下载提示
  5 + * 用于跳转到对应的app页面或进入下载页面
  6 + */
  7 +var is_wechat = false; //是否在微信中
  8 +var is_weibo = false; //是否在微博中
  9 +
  10 +var is_ios = false; //是否是ios
  11 +var is_android = false; //是否是android
  12 +var is_pod = false;
  13 +var is_pc = false;
  14 +var $btn_download; //下载按钮
  15 +var $btn_close; //关闭按钮
  16 +var $download_head_wrapper; //下载div最外部分
  17 +var $download_head; //下载div fixed部分
  18 +var $download_msg; //在微信中点击下载弹出的提示部分
  19 +
  20 +//var app_ios = 'mtmv://lives?id=6141903674538004481';
  21 +var app_ios = 'yohoefashion4In1://'; //ios的scheme
  22 +var app_android = 'yohoefashion4In1://'; //android的scheme
  23 +var download_ios = 'https://itunes.apple.com/cn/app/id530419467?ls=1&mt=8'; //appstore下载地址
  24 +var download_android = 'http://yoho-apps.qiniudn.com/Yoho.apk'; //apk下载地址
  25 +var queryArr = []; //地址栏参数
  26 +var date_start; //点击下载按钮的时间,用于计算超时的时候跳转到对应下载页面
  27 +
  28 +/**
  29 + * 通过iframe的方式试图打开APP,如果能正常打开,会直接切换到APP,并自动阻止a标签的默认行为
  30 + * 否则打开对应下载页面
  31 + * @param app 对应app的scheme地址
  32 + * @param link 对应的下载地址
  33 + */
  34 +function openAppOrLink(app, link) {
  35 + var ifrSrc;
  36 + var ifr;
  37 + if (is_android) {
  38 + //安卓基本上打不开app,只能打开下载地址。。。
  39 + date_start = new Date();
  40 + if (!is_wechat && !is_weibo) {
  41 + ifrSrc = app;
  42 +
  43 + ifr = document.createElement('iframe');
  44 + ifr.style.display = 'none';
  45 + ifr.src = ifrSrc;
  46 + document.body.appendChild(ifr);
  47 +
  48 + setTimeout(function() {
  49 + var date_end = new Date();
  50 + /*var p = document.createElement('p');
  51 + p.innerHTML = date_end - date_start
  52 + document.body.appendChild(p);*/
  53 + if (date_end.getTime() - date_start.getTime() < 1300) {
  54 + document.location.href = link;
  55 + }
  56 + document.body.removeChild(ifr);
  57 + }, 1000);
  58 + } else {
  59 + //document.location.href = weixin;
  60 + show_download_msg();
  61 + }
  62 + }
  63 +
  64 + //ios判断 if (navigator.userAgent.match(/(iPhone|iPod|iPad);?/i))
  65 + if (is_ios) {
  66 + date_start = new Date();
  67 + if (check_supperUniversalLink() >= 9) {
  68 + if (!is_wechat && !is_weibo) {
  69 + if (!is_pod) {
  70 + document.location.href = app;
  71 + setTimeout(function() {
  72 + var date_end = new Date();
  73 + if (!is_pod) {
  74 + if (date_end.getTime() - date_start.getTime() < 1200) {
  75 + document.location.href = link;
  76 + }
  77 + }
  78 +
  79 + }, 1000);
  80 + } else {
  81 + document.location.href = app;
  82 + setTimeout(function() {
  83 + var date_end = new Date();
  84 + if (is_pod) {
  85 + //$('.live-app-desc p').eq(0).text(date_end.getTime() - date_start.getTime());
  86 + if (date_end.getTime() - date_start.getTime() < 2003) {
  87 + document.location.href = link;
  88 + }
  89 + }
  90 + }, 2000);
  91 + }
  92 +
  93 + } else {
  94 + show_download_msg();
  95 + }
  96 + } else {
  97 + //下面是IOS调用的地址,自己根据情况去修改
  98 + if (!is_wechat && !is_weibo) {
  99 + ifrSrc = app;
  100 + ifr = document.createElement('iframe');
  101 + ifr.style.display = 'none';
  102 + ifr.src = ifrSrc;
  103 + document.body.appendChild(ifr);
  104 +
  105 + setTimeout(function() {
  106 + var date_end = new Date();
  107 + /*var p = document.createElement('p');
  108 + p.innerHTML = date_end - date_start
  109 + document.body.appendChild(p);*/
  110 + //alert(date_end.getTime() - date_start.getTime());
  111 + if (date_end.getTime() - date_start.getTime() < 1200) {
  112 + document.location.href = link;
  113 + }
  114 + document.body.removeChild(ifr);
  115 + }, 1000);
  116 + } else {
  117 + //document.location.href = weixin;
  118 + show_download_msg();
  119 + }
  120 + }
  121 + }
  122 +}
  123 +
  124 +/**
  125 + * 直接打开下载链接
  126 + */
  127 +function get_download_link() {
  128 + if (is_wechat || is_weibo) {
  129 + show_download_msg();
  130 + } else {
  131 + document.location.href = download_ios;
  132 + }
  133 +}
  134 +
  135 +/**
  136 + * 判断是否是ios9以上的系统,9以上系统不能创建iframe,只能直接打开链接
  137 + * @returns {boolean}
  138 + */
  139 +function check_supperUniversalLink() {
  140 + var osversion = navigator.userAgent.match(/iPhone OS (\d*)/);
  141 + //console.log(osversion && osversion[1]);
  142 + return osversion && osversion[1];
  143 + /*if (osversion && osversion[1] >= 9) {
  144 + return true;
  145 + }
  146 + return false;*/
  147 +}
  148 +
  149 +/**
  150 + * 显示对应设备的下载提示
  151 + */
  152 +function show_download_msg() {
  153 + $download_msg.show();
  154 + $('.wx-img1').show();
  155 + $('body').css('overflow-y', 'hidden');
  156 + if (is_android) {
  157 + $('.wx-img3').show();
  158 + } else if (is_ios) {
  159 + $('.wx-img2').show();
  160 + }
  161 +}
  162 +
  163 +/**
  164 + * 用于处理地址栏参数
  165 + * @returns {Array} 返回参数数组,格式[{'name':对应参数名称,'value':对应的值},...];
  166 + * @constructor
  167 + */
  168 +function ManageQueryString() {
  169 + var loc = document.location.href;
  170 + var variables = '';
  171 + var variableArr = [];
  172 + var finalArr = [];
  173 +
  174 + if (loc.indexOf('?') > 0) {
  175 + variables = loc.split('?')[1];
  176 + }
  177 +
  178 + if (variables.length > 0) {
  179 + variableArr = variables.split('&');
  180 + }
  181 +
  182 + for (var i = 0; i < variableArr.length; i++) {
  183 + var obj = {};
  184 + obj.name = variableArr[i].split('=')[0];
  185 + obj.value = variableArr[i].split('=')[1];
  186 + finalArr.push(obj);
  187 + }
  188 +
  189 + return finalArr;
  190 +}
  191 +
  192 +/**
  193 + * 通过ManageQueryString()方法返回的数组获取对应的参数值
  194 + * @param arr
  195 + * @param name 需要获取的参数名称
  196 + * @returns {*}
  197 + */
  198 +function getQueryString(arr, name) {
  199 + if (arr.length > 0) {
  200 + for (var i = 0; i < arr.length; i++) {
  201 + var obj = arr[i];
  202 + if (obj.name == name) {
  203 + return obj.value;
  204 + }
  205 + }
  206 + }
  207 +}
  208 +
  209 +function check_sys_open() {
  210 + var download_type = '';
  211 + if (is_android) {
  212 + download_type = 'android';
  213 + openAppOrLink(app_android, download_android);
  214 + } else if (is_ios) {
  215 + download_type = 'ios';
  216 + openAppOrLink(app_ios, download_ios);
  217 + }
  218 +
  219 + if (typeof get_live_data == 'function') {
  220 + get_live_data(2, download_type); //数据统计 视频中部app下载
  221 + }
  222 +}
  223 +
  224 +/**
  225 + * 入口
  226 + */
  227 +$(document).ready(function() {
  228 +
  229 +
  230 + var location = document.location.href;
  231 + queryArr = ManageQueryString();
  232 + var is_redirect = getQueryString(queryArr, 'redirect'); //从微信跳转过来的链接自动跳转到对应app
  233 +
  234 + var agent = navigator.userAgent.toLowerCase();
  235 +
  236 + //判断环境
  237 + if (agent.match(/android/i) == 'android') {
  238 + is_android = true;
  239 + } else if (agent.match(/(iPhone|ipod|iPad);?/i)) {
  240 + is_ios = true;
  241 + } else {
  242 + //PC的情况下直接跳转到电脑版首页
  243 + is_pc = true;
  244 + //document.location.href = 'http://www.yohoboys.com';
  245 + }
  246 +
  247 + if (agent.match(/iPod/i)) {
  248 + is_pod = true;
  249 + }
  250 +
  251 + if (agent.match(/MicroMessenger/i)) {
  252 + is_wechat = true;
  253 + }
  254 + //alert(agent);
  255 + if (agent.match(/Weibo/i)) {
  256 + is_weibo = true;
  257 + }
  258 +
  259 + if (agent.match(/QQ/i)) {
  260 + is_wechat = true;
  261 + }
  262 +
  263 + if (is_wechat || is_weibo) {
  264 + if (is_redirect == undefined) {
  265 + if (location.indexOf('?') > 0) { //在微信中或微博等app中地址栏上加上redirect参数,方便在浏览器中打开时跳转到app
  266 + // document.location.href = location + '&redirect=true';
  267 + } else {
  268 + // document.location.href = location + '?redirect=true';
  269 + }
  270 + }
  271 + } else {
  272 + if (is_redirect) {
  273 + setTimeout(check_sys_open, 200);
  274 +
  275 + }
  276 + }
  277 +
  278 +
  279 + $btn_download = $('.live-app-button-download a');
  280 + $btn_close = $('.live-app-button-close a');
  281 + $download_head_wrapper = $('.live-app-download-head-wrap');
  282 + $download_head = $('.live-download-head');
  283 + $download_msg = $('.live-app-download-msg'); //提示在浏览器中打开
  284 +
  285 + $btn_download.on('click', function() { //点击下载按钮
  286 + var download_type = '';
  287 + if (is_android) {
  288 + download_type = 'android';
  289 + openAppOrLink(app_android, download_android);
  290 + } else if (is_ios) {
  291 + download_type = 'ios';
  292 + //openAppOrLink(app_ios, download_ios);
  293 + get_download_link();
  294 + }
  295 +
  296 +
  297 + if (typeof get_live_data == 'function') {
  298 + get_live_data(1, download_type); //数据统计,页面顶部app下载 download_type,安卓或ios
  299 + }
  300 + return false;
  301 + });
  302 +
  303 + $btn_close.on('click', function() { //关闭顶部下载提示div
  304 + $download_head_wrapper.remove();
  305 + });
  306 +
  307 + $download_msg.on('click', function() { //隐藏在浏览器中打开的提示
  308 + $(this).hide();
  309 + $('body').css('overflow-y', 'scroll');
  310 + });
  311 +
  312 +});
  313 +
  314 +module.exports = (function() {
  315 + global.openAppOrLink = openAppOrLink;
  316 + global.get_download_link = get_download_link;
  317 + global.check_supperUniversalLink = check_supperUniversalLink;
  318 + global.show_download_msg = show_download_msg;
  319 + global.ManageQueryString = ManageQueryString;
  320 + global.getQueryString = getQueryString;
  321 + global.check_sys_open = check_sys_open;
  322 +})();
  1 +/* eslint-disable */
  2 +/**
  3 + * Created by qiujun on 16/6/17.
  4 + */
  5 +global.msg_obj = [
  6 + '{"avatar": "http://img01.yohoboys.com/contentimg/2016/06/15/14/012b97d00097fd444bd8f830ed2e8fe54e.jpg", "cmd": 4, "name": "YOHO_187****1007", "room": 19177}',
  7 + '{"avatar": "http://img01.yohoboys.com/contentimg/2016/06/15/14/012b97d00097fd444bd8f830ed2e8fe54e.jpg", "cmd": 5, "msg": "123", "name": "YOHO_187****1007", "room": 19177}',
  8 + '{"avatar": "http://img01.yohoboys.com/contentimg/2016/06/15/14/012b97d00097fd444bd8f830ed2e8fe54e.jpg", "cmd": 5, "msg": "分享给同样喜欢潮流文化,喜欢分享的朋友", "name": "YOHO_187****1007", "room": 19177}',
  9 + '{"avatar": "http://img01.yohoboys.com/contentimg/2016/06/15/14/012b97d00097fd444bd8f830ed2e8fe54e.jpg", "cmd": 5, "msg": "别和小编太较真", "name": "YOHO_187****1007", "room": 19177}'
  10 +];
  11 +
  12 +var replay_msg = [];
  13 +
  14 +(function() {
  15 + for (var i = 0; i < 300; i++) {
  16 + var time = 5 + i * 2;
  17 + var rand = Math.floor(Math.random() * 2);
  18 + var msg = '';
  19 + if (rand === 1) {
  20 + msg = '{"createtime":' + time + ',"avatar":"","name":"\u8c2d\u660e\u4e54' + i + '","msg":"测试消息测试消息测试消息测试消息测试消息测试消息' + i + '","cmd":"5"}'
  21 + } else {
  22 + msg = '{"createtime":' + time + ',"avatar":"http:\/\/avatar.jpg","name":"测试登录' + i + '","msg":"","cmd":"4"}';
  23 + }
  24 + var j = JSON.parse(msg);
  25 + replay_msg.push(j);
  26 + }
  27 +})();
  28 +
  29 +module.exports = (function(){
  30 + global.replay_msg = replay_msg;
  31 +})();
  1 +// 初始化config信息
  2 +var _weChatInterface = 'http://www.yohoboys.com/api/wechat/getSignPackage';// 签名等相关配置,yoho公众号
  3 +$.getJSON(_weChatInterface + '?pageurl=' + encodeURIComponent(location.href.split('#')[0]) + '&callback=?', function(json) {
  4 + if (json !== undefined && json !== '') {
  5 + var _appId = json.appId.toString();
  6 + var _timestamp = json.timestamp;
  7 + var _nonceStr = json.nonceStr.toString();
  8 + var _signature = json.signature.toString();
  9 + wx.config({
  10 + debug: true,
  11 + appId: _appId,
  12 + timestamp: _timestamp,
  13 + nonceStr: _nonceStr,
  14 + signature: _signature,
  15 + jsApiList: [
  16 + 'checkJsApi',
  17 + 'onMenuShareTimeline',
  18 + 'onMenuShareAppMessage',
  19 + 'onMenuShareQQ',
  20 + 'onMenuShareWeibo',
  21 + 'hideMenuItems',
  22 + 'showMenuItems',
  23 + 'hideAllNonBaseMenuItem',
  24 + 'showAllNonBaseMenuItem',
  25 + 'translateVoice',
  26 + 'startRecord',
  27 + 'stopRecord',
  28 + 'onVoiceRecordEnd',
  29 + 'playVoice',
  30 + 'pauseVoice',
  31 + 'stopVoice',
  32 + 'uploadVoice',
  33 + 'onVoicePlayEnd',
  34 + 'downloadVoice',
  35 + 'chooseImage',
  36 + 'previewImage',
  37 + 'uploadImage',
  38 + 'downloadImage',
  39 + 'getNetworkType',
  40 + 'openLocation',
  41 + 'getLocation',
  42 + 'hideOptionMenu',
  43 + 'showOptionMenu',
  44 + 'closeWindow',
  45 + 'scanQRCode',
  46 + 'chooseWXPay',
  47 + 'openProductSpecificView',
  48 + 'addCard',
  49 + 'chooseCard',
  50 + 'openCard'
  51 + ]
  52 + });
  53 + }
  54 + else {
  55 +
  56 + }
  57 +});
  58 +
  59 +setTimeout(share, 1000);
  60 +
  61 +function share() {
  62 + wx.ready(function() {
  63 + // 构造分享信息
  64 + var shareTitle = $('#shareTitle').val();
  65 + var shareImg = $('#shareImg').val();
  66 + var shareDesc = $('#shareDesc').val();
  67 + var shareLink = $('#shareLink').val();
  68 + var shareData = {
  69 + title: shareTitle,
  70 + desc: shareDesc,
  71 + imgUrl: shareImg,
  72 + link: shareLink,
  73 + success: function() {
  74 +
  75 + is_share = true;
  76 +
  77 + // alert(is_share);
  78 + $('#div_p3_share').show();
  79 + }
  80 + };
  81 +
  82 + // 2.1 “分享给朋友”
  83 + wx.onMenuShareAppMessage(shareData);
  84 +
  85 + // 2.2 “分享到朋友圈”
  86 + wx.onMenuShareTimeline(shareData);
  87 +
  88 + // 2.3 “分享到QQ”
  89 + wx.onMenuShareQQ(shareData);
  90 +
  91 +// // 2.4 “分享到微博”
  92 + wx.onMenuShareWeibo(shareData);
  93 +
  94 + // document.getElementById('media').play();
  95 +
  96 + // bindUploadEvent();
  97 + });
  98 +}
  99 +
  100 +
  101 +/*
  102 + * 微信分享
  103 + */
  104 +
  105 +// wx.error(function (res) {
  106 +// alert(res.errMsg);
  107 +// });
  1 +/**
  2 + * Created by qiujun on 16/7/1.
  3 + * 用于处理一些统计数据
  4 + */
  5 +
  6 +var live_data_type = ['M_LIVE_DOWNLOAD_APP_TOP', 'M_LIVE_DOWNLOAD_APP_CENTER', 'M_LIVE_PLAYBUTTON_CLICK', 'M_LIVE_SHARE'];
  7 +var play_count = 0;
  8 +
  9 +function get_live_data() {
  10 + var data_prefix = 'YOHOBOYS';
  11 + if (document.location.hostname.indexOf('boy') > 0) {
  12 + data_prefix = 'YOHOBOYS';
  13 + }
  14 + else if (document.location.hostname.indexOf('girl') > 0) {
  15 + data_prefix = 'YOHOGIRLS';
  16 + }
  17 + var data_type = (typeof(arguments[0]) == 'undefined') ? 0 : arguments[0];
  18 + var data_value = (typeof(arguments[1]) == 'undefined') ? 0 : arguments[1];
  19 +
  20 + console.log(data_type, data_value);
  21 +
  22 + if (data_type != 0 && data_prefix != '') {
  23 + var data_type_str = data_prefix + live_data_type[data_type - 1];
  24 + var obj = {};
  25 + obj.type = data_type_str;
  26 + if (data_value != 0) {
  27 + obj.val = data_value;
  28 + }
  29 + if (data_type === 3) {
  30 + if (play_count === 0) {
  31 + play_count === 1;// play按钮只发送一次
  32 + send_data(obj);
  33 + }
  34 + }
  35 + else {
  36 + send_data(obj);
  37 + }
  38 +
  39 + }
  40 +
  41 +}
  42 +
  43 +function send_data(obj) {
  44 + console.log(obj);
  45 + if (window._yas) {
  46 + window._yas.sendCustomInfo(obj, true);
  47 + }
  48 +}
  1 +/* eslint-disable */
  2 +/**
  3 + * Created by qiujun on 16/6/4.
  4 + * 函数说明引导,部分全局参数定义在live_detail.html中
  5 + * init_play_button ===> 用于初始化播放按钮,直播和重播时调用init_video函数初始化video标签并进行播放,直播结束状态时显示直播结束
  6 + * init_video ===> 根据不同参数初始化video标签,调用了yoho_video.js的方法
  7 + * get_chat_info -> get_websocket_server ===> 顺序执行,用于获取websocket的ip地址
  8 + * link_to_websocket_server ===> 从获取到的ip地址连接websocket,并进行获取到消息的处理
  9 + * get_cmd ===> 根据不同的cmd(目前只用到2个发送的)获取websocket需要发送的json数据的字符串
  10 + * send_heart_beat ===> 每隔1分钟发送一次心跳包,以获取服务器当前是否仍然健在以及当前的观看人数
  11 + * insert_msg,insert_user,insert_like,insert_audience,insert_end ===>处理websocket获取到的消息,或者重播时传过来的模拟消息
  12 + * get_replay_chat_barrage ===> 获取重播弹幕
  13 + * manage_replay_chat_msg ===> 通过requestAnimationFrame每帧调用用于判断是否可以展示重播消息和点赞
  14 + * replay_barrage_callback_handler ===> 由video的各个事件中调取的callback方法
  15 + */
  16 +var prefixes = 'webkit moz ms o'.split(' '); //各浏览器前缀
  17 +var requestAnimationFrame = window.requestAnimationFrame;
  18 +var cancelAnimationFrame = window.cancelAnimationFrame;
  19 +
  20 +var $btn_play;
  21 +var video_width = 375;
  22 +var video_height = 667;
  23 +var video_id = 'yoho_live'; //视频video标签id
  24 +var is_live = true; //是否是直播,根据地址栏参数可以判断
  25 +var get_socket_server_url = '/activity/live/barrage'; //获取websocket服务器的接口
  26 +var get_replay_chat_url = '/activity/live/replay/barrage'; //获取重播弹幕
  27 +var query_arr = []; //地址栏参数数组
  28 +var link_type = 'webksocket'; //连接类型
  29 +var live_ws; //websocket
  30 +var heart_beat_interval; //心跳计时器
  31 +var live_time_interval; //播放时间计时器
  32 +var live_duration = 0; //播放时间计数器
  33 +var now_like_nums = 0; //当前点赞数
  34 +var $live_like_pannel; //点赞div,用于存放小脸动画
  35 +var is_animate = false; //用于控制动画的频率
  36 +
  37 +var replay_video;
  38 +var replay_new_start_time = 1466591331; //根据play进度调整的当前时间,用于获取重播弹幕
  39 +var replay_chat_interval = 60; //重播弹幕获取的时间区间长度,接口默认是5分钟
  40 +var replay_chat_arr = []; //用于存储重播弹幕obj
  41 +var replay_chat_frame_count = 0; //用于计算执行requstAnimationFrames的次数
  42 +var is_replay_chat_loading = false; //是否正在调取接口
  43 +var can_seek = true; //
  44 +var replay_per_like = 0; //平均每秒增加的点赞数
  45 +var replay_per_request_like = 0; //平均每帧增加的点赞数(大概)
  46 +var replay_video_duration = 0; //重播视频
  47 +var replay_now_like = 0; //当前重播的点赞数
  48 +var is_wating = false;
  49 +
  50 +var test_count = 99;
  51 +
  52 +var CMD = {
  53 + LOGIN: 1, //客户端发送登录消息
  54 + SEND_MESSAGE: 2, //客户端发送消息
  55 + LOGOUT: 3, //客户端发送退出消息
  56 + NEW_USER: 4, //服务器通知新用户加入
  57 + RECEIVE_MESSAGE: 5, //服务器通知用户发送的消息
  58 + HEART_BEAT: 7, //客户端发送心跳包
  59 + SEND_LIKE: 8, //客户端点赞
  60 + RECEIVE_LIVE: 9, //服务器通知点赞
  61 + ONLINE_NUM: 10, //服务器通知当前在线人数
  62 + SEND_LIVE_END: 11, //主播app通知服务端直播结束
  63 + RECEIVE_LIVE_END: 12, //服务端通知直播结束
  64 + LOGIN_RETURN: 13 //客户端登录返回
  65 +};
  66 +
  67 +function set_duration () {
  68 + var video = $('.video_player').find('video')[0];
  69 + var duration;
  70 + var durationH;
  71 + var durationM;
  72 + var durationS;
  73 +
  74 + if (video) {
  75 + video.addEventListener('loadedmetadata', function() {
  76 + if (this.duration) {
  77 + duration = Math.floor(this.duration);
  78 + durationH = Math.floor(duration / 3600);
  79 + durationM = Math.floor(duration / 60);
  80 + durationS = duration % 60;
  81 +
  82 + duration = [durationH, durationM, durationS].map(function(val) {
  83 + if (val < 10) {
  84 + val = '0' + val;
  85 + } else {
  86 + val = '' + val;
  87 + }
  88 +
  89 + return val;
  90 + }).join(':');
  91 +
  92 + $('.duration .val').text(duration);
  93 + }
  94 + })
  95 +
  96 + }
  97 +}
  98 +
  99 +
  100 +/**
  101 + * 播放按钮
  102 + */
  103 +function init_play_button() {
  104 + global.$btn_play = $btn_play = $('.live-video-play-button a');
  105 + var video_source = $('#video_container').attr('data-video');
  106 + $btn_play.on('click', function() {
  107 + $('#live-watermark').removeClass('hide');
  108 + if (live_type === 1 || live_type === 3) {
  109 + if ($('#' + video_id)[0] == undefined) {
  110 + get_chat_info(); //获取弹幕信息
  111 +
  112 + var _is_ios = true;
  113 + var _is_wechat = false;
  114 + var agent = navigator.userAgent.toLowerCase();
  115 + //判断环境
  116 + if (agent.match(/android/i) == 'android') {
  117 + _is_ios = false;
  118 + }
  119 +
  120 + if (agent.match(/MicroMessenger/i)) {
  121 + _is_wechat = true;
  122 + }
  123 + if (agent.match(/Weibo/i)) {
  124 + _is_wechat = true;
  125 + }
  126 +
  127 + $(document).scrollTop(0);
  128 + $(this).parent().hide();
  129 + $('.live-video-cover').hide(); //隐藏封面
  130 + $('.live-app-download-head-wrap').hide(); //隐藏头部
  131 +
  132 + var temp_height = $(window).height();
  133 + var temp_width = $(document).width();
  134 + if (temp_width > 540) {
  135 + temp_width = 540;
  136 + }
  137 + var scale = 17.1 / 20;
  138 + // if (temp_height > 30.15 * scale * (temp_width / 320 * 20)) {
  139 + // temp_height = 30.15 * scale + 'rem';
  140 + // } else {
  141 + // temp_height = temp_height + 'px'
  142 + // }
  143 +
  144 + var v_width = temp_width + 'px';
  145 + var v_height = 32.575 * scale + 'rem';
  146 + $('.live-loading-container').show(); //显示loading
  147 + init_video(video_source, _is_wechat, _is_ios, '100%', '100%');
  148 +
  149 +
  150 + setTimeout(function() {
  151 + //$('#' + video_id)[0].play();
  152 + $('.live-status').show();
  153 + //interval = setInterval(test, 1000);// 测试弹幕
  154 + //interval1 = setInterval(test_like, 50);
  155 + }, 500);
  156 +
  157 + $('.live-video-main').animate({
  158 + height: temp_height
  159 + }, 500, function() {
  160 + if (live_type == 3) {
  161 + $('.live-app-open').css({
  162 + 'width': '100%',
  163 + 'bottom': 0,
  164 + 'left': 0,
  165 + 'margin-left': 0,
  166 + '-webkit-border-radius': 0,
  167 + 'border-radius': 0
  168 + });
  169 + $('.white-space').append($('.live-app-open'));
  170 + $('#live_touch_layer').hide();
  171 + $('.live-like-pannel').show();
  172 + }
  173 + });
  174 +
  175 + } else {
  176 + //console.log($('#' + video_id)[0],'click_2');
  177 + $(document).scrollTop(0);
  178 + $(this).parent().hide();
  179 + $('.live-loading-container').hide(); //隐藏loading
  180 + $('.live-video-cover').hide(); //隐藏封面
  181 + $('.live-app-download-head-wrap').hide(); //隐藏头部
  182 + if (live_type != 3) {
  183 + $('#' + video_id)[0].play();
  184 + } else {
  185 + //alert('click');
  186 + // video.pause();
  187 + $('#live_touch_layer').hide();
  188 + $('#' + video_id)[0].play();
  189 +
  190 + }
  191 +
  192 + }
  193 + } else {
  194 + $('.live-end').show();
  195 + }
  196 +
  197 + if (typeof get_live_data == 'function') {
  198 + get_live_data(3, live_type); //数据统计
  199 + }
  200 +
  201 + if (live_type === 3) {
  202 + set_duration();
  203 + }
  204 + });
  205 +}
  206 +
  207 +function init_video(video_source, is_wechat, is_ios, width, height) { //初始化视频
  208 + if (is_live) {
  209 + $('.video_player').yohovideo({
  210 + video_id: video_id,
  211 + islive: is_live,
  212 + width: width,
  213 + height: height,
  214 + preload: 'auto', //'auto'当页面加载后载入视频,'meta'当页面加载后载入元数据,'none'页面加载后不载入
  215 + autoplay: false, //'autoplay'自动播放视频,false 不自动播放
  216 + controls: 'controls', //'controls'显示控件,false 不显示控件
  217 + poster: '', //封面图片地址,不填则不显示
  218 + loop: false, //'loop'播放结束后自动重播,false 不重播
  219 + src: video_source, //需要播放的视频地址
  220 + loading_div: '.live-loading-container', //loading的div
  221 + is_weixin: is_wechat,
  222 + is_ios: is_ios
  223 + });
  224 + } else {
  225 + $('.video_player').yohovideo({
  226 + video_id: video_id,
  227 + islive: is_live,
  228 + width: width,
  229 + height: height,
  230 + preload: 'auto', //'auto'当页面加载后载入视频,'meta'当页面加载后载入元数据,'none'页面加载后不载入
  231 + autoplay: false, //'autoplay'自动播放视频,false 不自动播放
  232 + controls: 'controls', //'controls'显示控件,false 不显示控件
  233 + poster: '', //封面图片地址,不填则不显示
  234 + loop: false, //'loop'播放结束后自动重播,false 不重播
  235 + src: video_source, //需要播放的视频地址
  236 + loading_div: '.live-loading-container', //loading的div
  237 + is_weixin: is_wechat,
  238 + is_ios: is_ios,
  239 + callback: replay_barrage_callback_handler
  240 + });
  241 + }
  242 +
  243 +}
  244 +
  245 +/**
  246 + * 初始化并试图连接弹幕服务器
  247 + */
  248 +function get_chat_info() {
  249 + /*query_arr = ManageQueryString();
  250 + is_live = parseInt(getQueryString(query_arr, 'islive'));//判断是否是直播:0重播,1直播
  251 + if (is_live == undefined || isNaN(is_live)) {
  252 + is_live = true;
  253 + }
  254 + else {
  255 + is_live = Boolean(parseInt(is_live));
  256 + }*/
  257 +
  258 + link_type = 'websocket';
  259 +
  260 + if (is_live) {
  261 + get_websocket_server(link_type);
  262 + } else {
  263 +
  264 + }
  265 +
  266 +}
  267 +
  268 +/**
  269 + * 获取弹幕服务器
  270 + * @param type 参数类型:websocket,tcp,用于获取不同协议的服务器地址
  271 + */
  272 +function get_websocket_server(type) {
  273 + var param = type;
  274 + $.ajax({
  275 + url: get_socket_server_url,
  276 + data: {
  277 + type: type
  278 + },
  279 + type: 'GET',
  280 + dataType: 'json',
  281 + success: function(data) {
  282 + console.log(data);
  283 + if (data.code === 200) {
  284 + var arr = data.data[0].split(':');
  285 + var ip = arr[0];
  286 + var port = arr[1];
  287 +
  288 + if (is_live) {
  289 + ip = 'ws://' + ip;
  290 + link_to_websocket_server(ip, port);
  291 + }
  292 + }
  293 + }
  294 + });
  295 +}
  296 +
  297 +/**
  298 + * 连接弹幕服务器
  299 + * @param ip
  300 + * @param port
  301 + */
  302 +function link_to_websocket_server(ip, port) {
  303 + var path = ip + ':' + port;
  304 + live_ws = new WebSocket(path);
  305 +
  306 + live_ws.onopen = function(event) {
  307 + live_ws.send(get_cmd(CMD.LOGIN));
  308 + heart_beat_interval = setInterval(send_heart_beat, 60000);
  309 + send_heart_beat();
  310 + };
  311 +
  312 + live_ws.onerror = function(event) {
  313 + console.log(event);
  314 + live_ws.close();
  315 + live_ws = null;
  316 + clearInterval(heart_beat_interval);
  317 + link_to_websocket_server(ip, port);
  318 + };
  319 +
  320 + live_ws.onclose = function(event) {
  321 + console.log(event);
  322 + clearInterval(heart_beat_interval);
  323 + };
  324 +
  325 + live_ws.onmessage = function(event) {
  326 + if (event.data) {
  327 + var msg_obj = JSON.parse(event.data);
  328 + console.log(msg_obj, msg_obj.cmd);
  329 + switch (msg_obj.cmd) {
  330 + case 4:
  331 + insert_user(msg_obj);
  332 + break;
  333 + case 5:
  334 + insert_msg(msg_obj);
  335 + break;
  336 + case 9:
  337 + insert_like(msg_obj);
  338 + break;
  339 + case 10:
  340 + insert_audience(msg_obj);
  341 + break;
  342 + case 12:
  343 + insert_end(msg_obj);
  344 + break;
  345 + case 13:
  346 + receive_init(msg_obj);
  347 + break;
  348 + }
  349 + }
  350 + };
  351 +}
  352 +
  353 +/**
  354 + * 获取重播弹幕
  355 + * @param start_time 需要从什么时间开始获取
  356 + * @param duration 获取多少秒时间的内容
  357 + */
  358 +
  359 +function get_replay_chat_barrage(start_time, duration) {
  360 + if (replay_new_start_time === 0) {
  361 + replay_new_start_time = start_time;
  362 + }
  363 + is_replay_chat_loading = true;
  364 + var ajax = $.ajax({
  365 + url: get_replay_chat_url,
  366 + data: {
  367 + id: live_room,
  368 + startTime: start_time,
  369 + timeInterval: duration
  370 + },
  371 + type: 'GET',
  372 + dataType: 'json',
  373 + timeout: 5000,
  374 + success: function(data) {
  375 + console.log('load_replay_data=', data);
  376 + if (data.code === 200) {
  377 + if (data.data.length > 0) {
  378 + data.data.forEach(function(obj) {
  379 + replay_chat_arr.push(obj);
  380 + });
  381 + if (replay_chat_frame_count == 0) {
  382 + set_replay_chat_frame();
  383 + }
  384 + }
  385 + }
  386 + setTimeout(function() { //setTimeout的理由是防止requestAnimationFrame在调用的那一秒内重复读取
  387 + is_replay_chat_loading = false;
  388 + }, 1000);
  389 +
  390 + },
  391 + complete: function(XMLHttpRequest, status) {
  392 + if (status == 'timeout') { //超时
  393 + setTimeout(function() {
  394 + is_replay_chat_loading = false;
  395 + }, 1000);
  396 + ajax.abort();
  397 + }
  398 + }
  399 + });
  400 +
  401 + //用于测试
  402 + /* var test_arr = test_replay(start_time, duration);
  403 + test_arr.forEach(function (obj) {
  404 + replay_chat_arr.push(obj);
  405 + });
  406 + if (replay_chat_frame_count == 0) {
  407 + set_replay_chat_frame();
  408 + }
  409 + setTimeout(function () {
  410 + is_replay_chat_loading = false;
  411 + }, 1000);*/
  412 +}
  413 +/**
  414 + * 开始
  415 + */
  416 +function set_replay_chat_frame() {
  417 + var element = $('#live_chat_ul');
  418 + requestAnimationFrame(manage_replay_chat_msg);
  419 +}
  420 +
  421 +/**
  422 + * 重播时弹幕处理
  423 + */
  424 +function manage_replay_chat_msg() {
  425 + replay_chat_frame_count += 1;
  426 +
  427 + if (replay_video != undefined) {
  428 + if (!replay_video.paused && !is_wating) {
  429 + var time = parseInt(replay_video.currentTime);
  430 + if (!isNaN(replay_video.duration) && replay_video.duration != 0) {
  431 + if (replay_video_duration === 0) {
  432 + replay_video_duration = replay_video.duration;
  433 + replay_per_like = replay_total_likes / (replay_video_duration - 10);
  434 + replay_per_request_like = replay_total_likes / (replay_video_duration - 10) / 60;
  435 + }
  436 +
  437 + if (replay_video_duration > 0 && replay_now_like < replay_total_likes && replay_video.currentTime >= 10) {
  438 + if (replay_per_request_like > 1) {
  439 + replay_now_like += 1;
  440 + } else {
  441 + replay_now_like += replay_per_request_like;
  442 + }
  443 +
  444 +
  445 + if (replay_now_like - now_like_nums >= 1) {
  446 + now_like_nums = parseInt(replay_now_like);
  447 + var msg = '{"cmd":9,"msg":' + now_like_nums + ',"room":' + live_room + ',"uid":1}';
  448 + var msg_obj = JSON.parse(msg);
  449 + insert_like(msg_obj);
  450 + }
  451 + } else if (replay_video.currentTime < 10) {
  452 + var msg = '{"cmd":9,"msg":0,"room":' + live_room + ',"uid":1}';
  453 + var msg_obj = JSON.parse(msg);
  454 + insert_like(msg_obj);
  455 + }
  456 +
  457 + }
  458 +
  459 + if (replay_chat_arr.length > 0) {
  460 + var obj = replay_chat_arr[0];
  461 + if (obj.create_time <= time) {
  462 + if (obj.cmd == 5) {
  463 + insert_msg(obj)
  464 + }
  465 + if (obj.cmd == 4) {
  466 + insert_user(obj);
  467 + }
  468 + replay_chat_arr.splice(obj, 1);
  469 + }
  470 + }
  471 + //如果当前播放时间+开始时间 = 新的搜索播放时间 + 读取的时间区间 - 10秒。那么开始读取新的数据
  472 + //因为存在video的seek,seek之后replay_new_start_time会变化,需要从这个时间往后加55秒再读取新数据(ios7以下为5秒),防止短时间重复读取出错
  473 + if (time + live_start_time == replay_new_start_time + replay_chat_interval - 5) {
  474 + if (!is_replay_chat_loading) {
  475 + replay_new_start_time += replay_chat_interval;
  476 + get_replay_chat_barrage(replay_new_start_time, replay_chat_interval);
  477 + }
  478 + }
  479 + }
  480 + } else {
  481 + replay_video = $('#' + video_id)[0];
  482 + }
  483 + requestAnimationFrame(manage_replay_chat_msg);
  484 +
  485 +}
  486 +
  487 +/**
  488 + * seeked之后触发的重新读取事件
  489 + * s
  490 + * @param time
  491 + */
  492 +function replay_barrage_callback_handler(time, v_type) {
  493 + switch (v_type) {
  494 + case 'seeked':
  495 + console.log('seeked');
  496 + replay_chat_arr = [];
  497 + $('#live_chat_ul').html('');
  498 + replay_new_start_time = parseInt(time) + live_start_time;
  499 + get_replay_chat_barrage(replay_new_start_time, replay_chat_interval);
  500 + break;
  501 + case 'timeupdate':
  502 + //部分机型或系统版本无法使用seek,所以把读取时间缩短到10秒一次,并且判断当前播放时间与存留的搜索时间replay_new_start_time之间的
  503 + //差值,大于replay_chat_interval或小于-replay_chat_interval的则被认定为拖动了进度条。
  504 + if (!can_seek) {
  505 + if ((parseInt(time) + live_start_time - replay_new_start_time > replay_chat_interval) || (replay_new_start_time - parseInt(time) - live_start_time > replay_chat_interval)) {
  506 + console.log('大于或小雨');
  507 + replay_new_start_time = parseInt(time) + live_start_time;
  508 + replay_chat_arr = [];
  509 + $('#live_chat_ul').html('');
  510 + get_replay_chat_barrage(replay_new_start_time, replay_chat_interval);
  511 + }
  512 + }
  513 + if (parseInt(time) > 10) {
  514 + replay_now_like = (parseInt(time) - 10) * replay_per_like;
  515 + if (replay_now_like - now_like_nums <= -30) { //回退的时候让当前显示的点赞数和重播点赞数一致
  516 + console.log('<');
  517 + now_like_nums = replay_now_like;
  518 + }
  519 + } else {
  520 + replay_now_like = 0;
  521 + now_like_nums = 0;
  522 + }
  523 +
  524 + break;
  525 + case 'waiting':
  526 + is_wating = true;
  527 + break;
  528 + case 'canplaythrough':
  529 + is_wating = false;
  530 + break;
  531 + }
  532 +
  533 +}
  534 +
  535 +/**
  536 + * 返回命令json字符串
  537 + * @param cmd
  538 + * @returns {string}
  539 + */
  540 +function get_cmd(cmd) {
  541 + var result = '';
  542 + switch (cmd) {
  543 + case 1:
  544 + result = '{"cmd":' + cmd + ',"uid":"","name":"","avatar":"","room":' + live_room + '}';
  545 + break;
  546 + case 7:
  547 + result = '{"cmd":' + cmd + ',"msg":"heart_html5","room":' + live_room + '}';
  548 + break;
  549 + }
  550 + console.log(result);
  551 + return result;
  552 +}
  553 +
  554 +/**
  555 + * 每隔一分钟向服务器发送一次心跳包
  556 + */
  557 +function send_heart_beat() {
  558 + if (live_ws) {
  559 + live_ws.send(get_cmd(CMD.HEART_BEAT));
  560 + }
  561 +}
  562 +
  563 +/**
  564 + * 插入用户新消息
  565 + * @param obj
  566 + */
  567 +
  568 +function insert_msg(obj) {
  569 + var $ul = $('#live_chat_ul');
  570 + var msg_html
  571 + if (obj.avatar == '' || obj.avatar == undefined) {
  572 + var rand = Math.floor(Math.random() * 5) + 1;
  573 + // obj.avatar = site_url + '/img/activity/live/live/head_' + rand + '.png';
  574 +
  575 + msg_html = '<div class="live-item2"><div class="live-item2-head">' +
  576 + '<img class="avatar' + rand + '"></div>' +
  577 + '<div class="live-item2_1">' +
  578 + '<span class="live-replay">@' + obj.name + '</span>'+
  579 + '<div class="live-item2_2">' +
  580 + obj.msg +
  581 + '</div>' +
  582 + '</div>' +
  583 + '</div>';
  584 + } else {
  585 + obj.avatar = obj.avatar.replace(/(\{width}|\{height}|\{mode})/g, function($0) {
  586 + const dict = {
  587 + '{width}': 50,
  588 + '{height}': 50,
  589 + '{mode}': 2
  590 + };
  591 +
  592 + return dict[$0];
  593 + })
  594 +
  595 + msg_html = '<div class="live-item2"><div class="live-item2-head">' +
  596 + '<img src="' + obj.avatar + '"></div>' +
  597 + '<div class="live-item2_1">' +
  598 + '<span class="live-replay">@' + obj.name + '</span>'+
  599 + '<div class="live-item2_2">' +
  600 + obj.msg +
  601 + '</div>' +
  602 + '</div>' +
  603 + '</div>';
  604 + }
  605 + var li = document.createElement('li');
  606 + li.innerHTML = msg_html;
  607 + if ($ul.children().length >= 4) {
  608 + $ul.find('li').eq(0).remove();
  609 + }
  610 + $ul.append(li);
  611 +}
  612 +
  613 +/**
  614 + * 插入新用户加入
  615 + * @param obj
  616 + */
  617 +function insert_user(obj) {
  618 + if (obj.name.length > 1) {
  619 + var $ul = $('#live_chat_ul');
  620 + var msg_html = '<div class="live-item1">' + '@' + obj.name + ' <span>已加入</span>' + '</div>';
  621 + var li = document.createElement('li');
  622 + li.innerHTML = msg_html;
  623 + if ($ul.children().length >= 4) {
  624 + $ul.find('li').eq(0).remove();
  625 +
  626 + }
  627 + $ul.append(li);
  628 + }
  629 +
  630 +}
  631 +
  632 +/**
  633 + * 用户点赞
  634 + * @param obj
  635 + */
  636 +function insert_like(obj) {
  637 + var num = obj.msg.toString();
  638 +
  639 + if (num.indexOf('万') < 0) {
  640 + num = parseInt(num);
  641 + if (isNaN(num)) {
  642 + num = 0;
  643 + }
  644 + }
  645 + if (now_like_nums == 0) {
  646 + $('.live-like-pannel').show();
  647 + } else {
  648 + if (!is_animate) {
  649 + is_animate = true;
  650 + var like_rand = Math.floor(Math.random() * 3) + 1;
  651 + var img_rand = Math.floor(Math.random() * 5) + 1;
  652 + var img_path = site_url + '/img/activity/live/live/like_icon' + img_rand + '.png';
  653 + var id = 'js_keyframes_' + Math.random();
  654 + var like_class = 'like-icon' + ' scroll_animate_' + like_rand;
  655 + var msg_html = '<img src="' + img_path + '">';
  656 +
  657 +
  658 + var anim_div = document.createElement('div');
  659 + anim_div.id = id;
  660 + anim_div.className = like_class;
  661 + anim_div.innerHTML = msg_html;
  662 + anim_div.addEventListener('webkitAnimationEnd', function() {
  663 + $(this).remove();
  664 + });
  665 +
  666 + $live_like_pannel.append(anim_div);
  667 + setTimeout(function() {
  668 + is_animate = false;
  669 + }, 40);
  670 + }
  671 + }
  672 + now_like_nums = num;
  673 + if (now_like_nums > 100000) {
  674 + $('#like_num').text((now_like_nums / 10000).toFixed(1) + '万');
  675 + } else {
  676 + $('#like_num').text(now_like_nums);
  677 + }
  678 +
  679 +}
  680 +
  681 +/**
  682 + * 发送心跳包之后返回的在线人数
  683 + * @param msg_obj
  684 + */
  685 +function insert_audience(obj) {
  686 + $('.live-num span').text(obj.onlineNums + '人观看');
  687 +}
  688 +
  689 +/**
  690 + * 通知直播结束
  691 + * @param obj
  692 + */
  693 +function insert_end(obj) {
  694 + var user_num = obj.audienceNums.toString();
  695 + var like_num = obj.likeNums.toString();
  696 + var video_len = obj.videoLen.toString();
  697 +
  698 + if (user_num.indexOf('万') < 0) {
  699 + user_num = parseInt(user_num);
  700 + }
  701 +
  702 + if (like_num.indexOf('万') < 0) {
  703 + like_num = parseInt(like_num);
  704 + }
  705 +
  706 + if (user_num > 10000) {
  707 + user_num = (user_num / 10000).toFixed(1) + '万';
  708 + }
  709 +
  710 + if (like_num > 10000) {
  711 + like_num = (like_num / 10000).toFixed(1) + '万';
  712 + }
  713 +
  714 + var video = $('#' + video_id)[0];
  715 + if (video) {
  716 + setTimeout(function() {
  717 + video.pause();
  718 + }, 1000);
  719 + live_type = 2;
  720 + }
  721 + live_ws.close();
  722 + clearInterval(live_time_interval);
  723 + var $liveEnd = $('#live-state-end');
  724 + $liveEnd.show();
  725 + $liveEnd.find('.audience .val').text(user_num);
  726 + $liveEnd.find('.duration .val').text(video_len);
  727 + $liveEnd.find('.favorite .val').text(like_num);
  728 +}
  729 +
  730 +/**
  731 + * 登录之后服务端返回当前直播人数及点赞数
  732 + * @param obj
  733 + */
  734 +function receive_init(obj) {
  735 + $('.live-num span').text(obj.onlineNums + '人观看');
  736 + now_like_nums = parseInt(obj.likeNums);
  737 + if (now_like_nums > 100000) {
  738 + $('#like_num').text((now_like_nums / 10000).toFixed(1) + '万');
  739 + } else {
  740 + $('#like_num').text(now_like_nums);
  741 + }
  742 + $('.live-like-pannel').show();
  743 +}
  744 +
  745 +/**
  746 + * 获取已直播时间
  747 + */
  748 +function get_live_time() {
  749 + if (live_start_time) {
  750 + var date = new Date();
  751 + live_duration = parseInt(date.getTime() / 1000) - live_start_time;
  752 + console.log('live_duration=' + live_duration);
  753 + $('#live_time').text(get_time_text(live_duration));
  754 + live_time_interval = setInterval(set_interval_time, 1000);
  755 + }
  756 +}
  757 +
  758 +/**
  759 + * 返回时间字符串00:00
  760 + * @param time
  761 + * @returns {string}
  762 + */
  763 +function get_time_text(time) {
  764 + var time_text = '00:00:00';
  765 + var sec;
  766 + var min;
  767 + var hour;
  768 + if (time < 0) {
  769 + time = 0;
  770 + }
  771 +
  772 + if (time < 10) {
  773 + min = '00';
  774 + sec = '0' + time;
  775 + hour = '';
  776 + } else if (time >= 60 && time < 3600) {
  777 + min = (time - time % 60) / 60;
  778 + if (min < 10) {
  779 + min = '0' + min;
  780 + }
  781 + sec = time % 60;
  782 + if (sec < 10) {
  783 + sec = '0' + sec;
  784 + }
  785 + hour = '';
  786 + } else if (time >= 3600) {
  787 + hour = (time - time % 3600) / 3600;
  788 + if (hour < 10) {
  789 + hour = '0' + hour + ':';
  790 + } else {
  791 + hour = hour + ':';
  792 + }
  793 + var rests = time % 3600;
  794 + min = (rests - rests % 60) / 60;
  795 + if (min < 10) {
  796 + min = '0' + min;
  797 + }
  798 +
  799 + sec = rests % 60;
  800 + if (sec < 10) {
  801 + sec = '0' + sec;
  802 + }
  803 + } else {
  804 + min = '00';
  805 + sec = time;
  806 + hour = '';
  807 + }
  808 + time_text = hour + min + ':' + sec;
  809 + return time_text;
  810 +}
  811 +
  812 +/**
  813 + * 直播时间每秒+1
  814 + */
  815 +function set_interval_time() {
  816 + live_duration += 1;
  817 + get_time_text(live_duration);
  818 + $('#live_time').text(get_time_text(live_duration));
  819 +}
  820 +
  821 +/**
  822 + * requestAnimationFrame
  823 + */
  824 +function init_request_animation_frames() {
  825 + var lastTime = 0;
  826 + var prefix;
  827 + //通过遍历各浏览器前缀,来得到requestAnimationFrame和cancelAnimationFrame在当前浏览器的实现形式
  828 + for (var i = 0; i < prefixes.length; i++) {
  829 + if (requestAnimationFrame && cancelAnimationFrame) {
  830 + break;
  831 + }
  832 + prefix = prefixes[i];
  833 + requestAnimationFrame = requestAnimationFrame || window[prefix + 'RequestAnimationFrame'];
  834 + cancelAnimationFrame = cancelAnimationFrame || window[prefix + 'CancelAnimationFrame'] || window[prefix + 'CancelRequestAnimationFrame'];
  835 + }
  836 +
  837 + //如果当前浏览器不支持requestAnimationFrame和cancelAnimationFrame,则会退到setTimeout
  838 + if (!requestAnimationFrame || !cancelAnimationFrame) {
  839 + requestAnimationFrame = function(callback) {
  840 + var currTime = new Date().getTime();
  841 + //为了使setTimteout的尽可能的接近每秒60帧的效果
  842 + var timeToCall = Math.max(0, 16 - (currTime - lastTime));
  843 + var id = window.setTimeout(function() {
  844 + callback(currTime + timeToCall);
  845 + }, timeToCall);
  846 + lastTime = currTime + timeToCall;
  847 + return id;
  848 + };
  849 +
  850 + cancelAnimationFrame = function(id) {
  851 + window.clearTimeout(id);
  852 + };
  853 + }
  854 +
  855 + //得到兼容各浏览器的API
  856 + window.requestAnimationFrame = requestAnimationFrame;
  857 + window.cancelAnimationFrame = cancelAnimationFrame;
  858 +}
  859 +
  860 +/**
  861 + * 入口
  862 + */
  863 +$(document).ready(function() {
  864 +
  865 + init_request_animation_frames();
  866 + if (check_supperUniversalLink() != undefined && check_supperUniversalLink() <= 7) {
  867 + can_seek = false;
  868 + replay_chat_interval = 10;
  869 + }
  870 +
  871 + $('.live-app-open a').on('click', function() {
  872 + check_sys_open(); //live_head.js中的方法
  873 + });
  874 + init_play_button();
  875 + if (live_type != 3) { //直播的时间
  876 + is_live = true;
  877 + get_live_time();
  878 +
  879 + } else {
  880 + is_live = false;
  881 + // $('.live-time span').eq(0).text('YOHO!回看 ·');
  882 + $('.live-num span').text(replay_user_nums + '人观看');
  883 + replay_new_start_time = live_start_time;
  884 + get_replay_chat_barrage(live_start_time, replay_chat_interval); //重播获取弹幕
  885 +
  886 + }
  887 +
  888 + $live_like_pannel = $('#live_like_pannel');
  889 +});
  890 +
  891 +global.test = function test() { //测试弹幕样式
  892 + var rand = Math.floor(Math.random() * msg_obj.length);
  893 + var obj = JSON.parse(msg_obj[rand].toString());
  894 + switch (obj.cmd) {
  895 + case 4:
  896 + insert_user(obj);
  897 + break;
  898 + case 5:
  899 + insert_msg(obj);
  900 + break;
  901 + }
  902 +}
  903 +
  904 +global.test_like = function test_like() {
  905 + var rand = Math.floor(Math.random() * 5);
  906 + test_count += rand;
  907 + var obj_text = '{"cmd":9,"msg":' + test_count + ',"room":' + live_room + ',"uid":0}';
  908 + var obj = JSON.parse(obj_text);
  909 + insert_like(obj);
  910 +}
  911 +
  912 +global.test_replay = function test_replay(starttime, timeinterval) {
  913 + var start = starttime - live_start_time;
  914 + var end = start + timeinterval;
  915 + var test_arr = [];
  916 + if (replay_msg.length > 0) {
  917 + for (var i = 0; i < replay_msg.length; i++) {
  918 + var obj = replay_msg[i];
  919 + var create_time = parseInt(obj.createtime);
  920 + if (create_time >= start && create_time <= end) {
  921 + test_arr.push(obj);
  922 + }
  923 + }
  924 + }
  925 + return test_arr;
  926 +}
  927 +
  928 +module.exports = {};
  1 +/**
  2 + * Created by qiujun on 16/6/5.
  3 +*/
  4 +
  5 +var info_text = '<p>今晚《奔跑吧兄弟》继续开跑,这期从预告片来看,怎么都觉得有点恐怖啊!</p>' +
  6 +'<div style="margin-top:10px;"></div>' +
  7 +'<img width="640px" h="640px" "style="margin:0 auto;border:0;display:block;" class="lazy" src="http://img02.yohoboys.com/contentimg/2016/06/10/21/02c6f92a8d88dbe1373f9f6215ea021348.jpg" data-original="http://img02.yohoboys.com/contentimg/2016/06/10/21/02c6f92a8d88dbe1373f9f6215ea021348.jpg" style="display: block;">' +
  8 +'<span style="color:#B2AAA4;">▲游戏设施长这样!</span>' +
  9 +'<div style="margin-top:10px;"></div>' +
  10 +'<img width="640px" h="640px" "style="margin:0 auto;border:0;display:block;" class="lazy" src="http://img02.yohoboys.com/contentimg/2016/06/10/21/02edb1d7b1290016cb72de0d64c902a0bf.jpg" data-original="http://img02.yohoboys.com/contentimg/2016/06/10/21/02edb1d7b1290016cb72de0d64c902a0bf.jpg" style="display: block;">' +
  11 +'<span style="color:#B2AAA4;">▲节目一开始就有人大呼救命?!</span>' +
  12 +'<div style="margin-top:10px;"></div>' +
  13 +'<img width="550px" h="409px" "style="margin:0 auto;border:0;display:block;" class="lazy" src="http://img02.yohoboys.com/contentimg/2016/06/10/21/02e960805b444ff065064b883b6b87395c.jpg" data-original="http://img02.yohoboys.com/contentimg/2016/06/10/21/02e960805b444ff065064b883b6b87395c.jpg" style="display: block;">' +
  14 +'<span style="color:#B2AAA4;">▲一向温柔可爱的baby变成了这样!</span>' +
  15 +'<div style="margin-top:10px;"></div>《中国好声音》四朝元老导师那英和喜剧明星宋小宝,难以想象他俩会碰撞出怎样的火花!<div style="margin-top:10px;"></div>' +
  16 +'<img width="640px" h="535px" "style="margin:0 auto;border:0;display:block;" class="lazy" src="http://img01.yohoboys.com/contentimg/2016/06/10/21/01bb8df0759e3d9b5547be2a4b4da6b452.jpg" data-original="http://img01.yohoboys.com/contentimg/2016/06/10/21/01bb8df0759e3d9b5547be2a4b4da6b452.jpg" style="display: block;">' +
  17 +'<span style="color:#B2AAA4;">▲原来一开始乘过山车尖叫的正是宋小宝本人哦</span>' +
  18 +'<div style="margin-top:10px;"></div>' +
  19 +'<img width="640px" h="640px" "style="margin:0 auto;border:0;display:block;" class="lazy" src="http://img01.yohoboys.com/contentimg/2016/06/10/21/0176a8e77e5613af513a352bf2b1b83bf2.jpg" data-original="http://img01.yohoboys.com/contentimg/2016/06/10/21/0176a8e77e5613af513a352bf2b1b83bf2.jpg" style="display: block;">';
  20 +
  21 +$(document).ready(function() {
  22 + $('.live-info-text').html(info_text);
  23 +});
  1 +/* eslint-disable */
  2 +/**
  3 + * Created by qiujun on 16/6/13.
  4 + * 分享按钮
  5 + * 处理页面上同时有2个二维码存在的时候微信扫码识别不了的情况
  6 + */
  7 +
  8 +
  9 + var share_sina_url = 'http://service.weibo.com/share/share.php?appkey=3910025296';
  10 + var share_qzon_url = 'http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey';
  11 + var share_facebook_url = 'https://www.facebook.com/sharer/sharer.php';
  12 + var share_twitter_url = 'http://twitter.com/intent/tweet';
  13 + var true_yoho_img = '//img03.res.yoho.cn/blogimg/2016/06/21/18/01bec2ddcbb55247b2ac4869b3e4255286.png';
  14 + var fake_yoho_img = '//img03.res.yoho.cn/blogimg/2016/06/21/18/01db287fedae82aa7f0155727b0b5a0936.png';
  15 + var true_yohogirl_img = '//cdn.yoho.cn/yohocn/160315/images/ewm-yoho02.png';
  16 + var fake_yohogirl_img = '//cdn.yoho.cn/yohocn/160315/images/ewm-yoho02-no.png';
  17 + var touch_timeout;
  18 +
  19 + $(document).ready(function() {
  20 + // init_share_button();
  21 + check_qr_touch();
  22 + $('.foot-arrow').click(function() { //底部箭头点击跳到顶部
  23 + $(document).scrollTop(0);
  24 + });
  25 + });
  26 +
  27 + /**
  28 + * 分享按钮
  29 + */
  30 + function init_share_button() {
  31 + var $btn_share_sina = $('.live-share-button-sina a');
  32 + var $btn_share_qzone = $('.live-share-button-qzone a');
  33 + var $btn_share_facebook = $('.live-share-button-facebook a');
  34 + var $btn_share_twitter = $('.live-share-button-twitter a');
  35 + var local_url = document.location.href;
  36 + var protocol = document.location.protocol;
  37 + var share_url = '';
  38 + var share_img = $('#share').attr('cover');
  39 + var share_title_sina = document.title + ' @YOHO潮流志 @YOHOGIRL ';
  40 + var share_title_qzone = document.title + ' | 来自YOHO!';
  41 +
  42 + if (share_img.indexOf('http') < 0 && share_img.indexOf('https') < 0) {
  43 + share_img = protocol + share_img;
  44 + }
  45 + $btn_share_sina.on('click', function() {
  46 + share_url = share_sina_url + '&url=' + encodeURIComponent(local_url) + '&title=' + encodeURIComponent(share_title_sina) + '&pic=' + encodeURIComponent(share_img);
  47 + open_share_link(share_url, 1);
  48 +
  49 + });
  50 +
  51 + $btn_share_qzone.on('click', function() {
  52 + share_url = share_qzon_url + '?url=' + encodeURIComponent(local_url) + '&title=' + encodeURIComponent(share_title_qzone) + '&pics=' + encodeURIComponent(share_img);
  53 + open_share_link(share_url, 2);
  54 + });
  55 +
  56 + $btn_share_facebook.on('click', function() {
  57 + share_url = share_facebook_url + '?u=' + encodeURIComponent(local_url);
  58 + open_share_link(share_url, 3);
  59 + });
  60 +
  61 + $btn_share_twitter.on('click', function() {
  62 + share_url = share_twitter_url + '?url=' + encodeURIComponent(local_url) + '&text=' + encodeURIComponent(document.title);
  63 + open_share_link(share_url, 4);
  64 + });
  65 +
  66 + }
  67 +
  68 + function open_share_link(url, type) {
  69 + if (typeof get_live_data == 'function') {
  70 + get_live_data(4, type); //数据统计 type= 1新浪 2Qzone,3facebook,4twitter
  71 + }
  72 + window.open(url, '_self');
  73 + }
  74 +
  75 + /**
  76 + * 二维码长按
  77 + * 由于微信不能同时识别两个二维码,所以按一个二维码的同时把另外一个二维码给换成点击的二维码的图片
  78 + */
  79 + function check_qr_touch() {
  80 + var $clz_img = $('#qr_clz img');
  81 + var $girl_img = $('#qr_girl img');
  82 +
  83 + $clz_img.on('touchstart', function() {
  84 + $clz_img.attr('src', true_yoho_img);
  85 + $girl_img.attr('src', fake_yohogirl_img);
  86 + /*clearTimeout(touch_timeout);
  87 + touch_timeout = setTimeout(function(){
  88 + $clz_img.attr('src',true_yoho_img);
  89 + $girl_img.attr('src',true_yohogirl_img);
  90 + },2500);*/
  91 + });
  92 +
  93 + $clz_img.on('touchend', function() {
  94 + $clz_img.attr('src', true_yoho_img);
  95 + $girl_img.attr('src', true_yohogirl_img);
  96 + });
  97 +
  98 + $clz_img.on('touchcancel', function() {
  99 + $clz_img.attr('src', true_yoho_img);
  100 + $girl_img.attr('src', true_yohogirl_img);
  101 + });
  102 +
  103 + //----------------分割线---------------
  104 + $girl_img.on('touchstart', function() {
  105 + $girl_img.attr('src', true_yohogirl_img);
  106 + $clz_img.attr('src', fake_yoho_img);
  107 + /*clearTimeout(touch_timeout);
  108 + touch_timeout = setTimeout(function(){
  109 + $clz_img.attr('src',true_yoho_img);
  110 + $girl_img.attr('src',true_yohogirl_img);
  111 + },2500);*/
  112 + });
  113 +
  114 + $girl_img.on('touchend', function() {
  115 + $girl_img.attr('src', true_yohogirl_img);
  116 + $clz_img.attr('src', true_yoho_img);
  117 + });
  118 +
  119 + $girl_img.on('touchcancel', function() {
  120 + $girl_img.attr('src', true_yohogirl_img);
  121 + $clz_img.attr('src', true_yoho_img);
  122 + });
  123 + }
  124 +
  125 + module.exports = (function(){})();
  1 +/* eslint-disable */
  2 +/**
  3 + * Created by qiujun on 16/05/24
  4 + * 一个所谓的video插件(伪)
  5 + */
  6 +var _defaults = {
  7 + video_id: 'yoho_video',
  8 + islive: false, //是否是直播
  9 + width: '100%',
  10 + height: '100%',
  11 + preload: 'auto', //'auto'当页面加载后载入视频,'meta'当页面加载后载入元数据,'none'页面加载后不载入
  12 + autoplay: false, //'autoplay'自动播放视频,false 不自动播放
  13 + controls: 'controls', //'controls'显示控件,false 不显示控件
  14 + poster: '', //封面图片地址,不填则不显示
  15 + loop: false, //'loop'播放结束后自动重播,false 不重播
  16 + src: '', //需要播放的视频地址,可使用数组
  17 + loading_div: '.live-video-loading',
  18 + is_weixin: false,
  19 + is_ios: true
  20 +};
  21 +
  22 +var that; //用于引用this
  23 +var video_src;
  24 +
  25 +function YohoVideo($ele, options) { //构造函数
  26 + this.$ele = $ele;
  27 + this._options = options = $.extend(_defaults, options || {});
  28 +
  29 + console.log(this._options);
  30 + this.init();
  31 +}
  32 +
  33 +YohoVideo.prototype = {
  34 + constructor: YohoVideo,
  35 + init: function() {
  36 + that = this;
  37 + this.innserVideoHtml(); //初始化视频video标签的属性并插入
  38 + //setTimeout(this.bindEvent,500);
  39 + this.bindEvent(); //初始化视频各个事件
  40 + },
  41 + innserVideoHtml: function() {
  42 + var _options = this._options;
  43 + this._width = _options.width || '100%';
  44 + this._height = _options.height || '100%';
  45 + var _preload = _options.preload || false;
  46 + var _autoplay = _options.autoplay || false;
  47 + var _controls = _options.controls || false;
  48 + var _poster = _options.poster || false;
  49 + var _loop = _options.loop || false;
  50 + var _src = _options.src || '';
  51 + this._loading_div = _options.loading_div || '.live-video-loading';
  52 + this._video_id = _options.video_id || 'yoho_video';
  53 + this._islive = _options.islive || false;
  54 + this._is_weixin = _options.is_weixin || false;
  55 + this._is_ios = _options.is_ios || true;
  56 +
  57 + //console.log(_width,_height,_preload,_autoplay,_controls,_poster,_loop,_src);
  58 + /*var video = document.createElement('video');
  59 + video.id = this._video_id;
  60 + video.setAttribute('webkit-playsinline',true);*/
  61 + video_src = _src;
  62 + var _attributes = '';
  63 + var _styles = '';
  64 + var _source = '';
  65 + if (this._height != undefined) {
  66 + _styles += ' height:' + this._height + ';';
  67 + //video.style.height = _height;
  68 + }
  69 + if (this._width != undefined) {
  70 + _styles += ' width:' + this._width + ';';
  71 + //video.style.width = _width;
  72 + }
  73 + if (_preload != undefined && _preload != false) {
  74 + _attributes += ' preload="' + _preload + '"';
  75 + //video.preload = _preload;
  76 + }
  77 + if (_autoplay != undefined && _autoplay != false) {
  78 + _attributes += ' autoplay="' + _autoplay + '"';
  79 + //video.autoplay = _autoplay;
  80 + }
  81 + if (_controls != undefined && _controls != false && !this._islive) {
  82 + _attributes += ' controls="' + _controls + '"';
  83 + //video.controls = _controls;
  84 + }
  85 + if (_poster != undefined && _poster != '' && _poster != false) {
  86 + _attributes += ' poster="' + _poster + '"';
  87 + //video.poster = _poster;
  88 + }
  89 + if (_loop != undefined && _loop != false) {
  90 + _attributes += ' loop="' + _loop + '"';
  91 + //video.loop = _loop;
  92 + }
  93 + if (_src != undefined && this._islive) {
  94 + //_attributes += ' src="' + _src + '"';
  95 + //video.src = _src;
  96 + }
  97 +
  98 + var _source_html = '';
  99 + //console.log(this._islive);
  100 + if (!this._islive || this._islive) {
  101 + var _len = _src.length - _src.lastIndexOf('.');
  102 + var _type = _src.substr(_src.lastIndexOf('.') + 1, _len);
  103 + if (_type === 'm3u8') {
  104 + _type = 'application/x-mpegurl';
  105 + } else {
  106 + _type = 'video/' + _type;
  107 + }
  108 + _source_html = '<source src="' + _src + '" type="' + _type + '">';
  109 +
  110 + /*var source = document.createElement('source');
  111 + source.src = _src;
  112 + source.type = _type;
  113 + video.appendChild(source);*/
  114 + }
  115 +
  116 + var _video_html = '<video id="' + this._video_id + '" webkit-playsinline="true"' + _attributes + ' style="' + _styles + 'background:rgb(0,0,0)" webkit-playsinline>' +
  117 + _source_html +
  118 + '</video>';
  119 + //console.log(_video_html);
  120 + this.$ele.html(_video_html);
  121 + var video = $('#' + this._video_id)[0];
  122 + video.allowFullScreen = false;
  123 + if (this._islive || _type == 'application/x-mpegurl') {
  124 + if (video.hasChildNodes()) {
  125 + var source_node = video.childNodes[0];
  126 + video.removeChild(source_node);
  127 + video.src = _src;
  128 + video.play();
  129 + }
  130 + } else {
  131 + video.play();
  132 + }
  133 +
  134 +
  135 + //this.$ele.append(video);
  136 + },
  137 + exitFull: function() { //退出全屏
  138 + var _video = $('#' + this._video_id)[0];
  139 +
  140 + //var _video = this._video;
  141 + //alert(_video.exitFullscreen || _video.msExitFullscreen || _video.oRequestFullscreen || _video.webkitCancelFullScreen || _video.webkitExitFullscreen);
  142 + if (_video.exitFullScreen) {
  143 + _video.exitFullScreen();
  144 + } else if (_video.msExitFullScreen) {
  145 + _video.msExitFullScreen();
  146 + } else if (_video.mozCancelFullScreen) {
  147 + _video.mozCancelFullScreen();
  148 + } else if (document.oRequestFullscreen) {
  149 + document.oCancelFullScreen();
  150 + } else if (_video.webkitExitFullscreen) {
  151 + _video.webkitExitFullscreen();
  152 + }
  153 + },
  154 + bindEvent: function() {
  155 + var _video = $('#' + this._video_id)[0];
  156 + _video.isFullscreen = false;
  157 + _video.scrollLeft = 0;
  158 + _video.scrollTop = 0;
  159 + //console.log(this._width,this._height);
  160 + _video.scrollWidth = this._width;
  161 + _video.scrollHeight = this._height;
  162 +
  163 + //var _video = this._video;
  164 + console.log('video=', _video);
  165 + var _msg_pannel = $(this._loading_div);
  166 + var _msg = _msg_pannel.find('p');
  167 + var _progress_count = 0;
  168 +
  169 + var _error_count = 0;
  170 +
  171 + //networkState:0.此元素未初始化 1.正常但没有使用网络 2.正在下载数据 3.没有找到资源
  172 + //readyState:
  173 + // 1:HAVE_NOTHING 2:HAVE_METADATA 3.HAVE_CURRENT_DATA 4.HAVE_FUTURE_DATA 5.HAVE_ENOUGH_DATA
  174 +
  175 + var media_events = {
  176 + LOAD_START: 'loadstart',
  177 + PROGRESS: 'progress',
  178 + SUSPEND: 'suspend',
  179 + ABORT: 'abort',
  180 + ERROR: 'error',
  181 + EMPTIED: 'emptied',
  182 + STALLED: 'stalled',
  183 + LOADED_METADATA: 'loadedmetadata',
  184 + LOADED_DATA: 'loadeddata',
  185 + CANPLAY: 'canplay',
  186 + CANPLAY_THROUGH: 'canplaythrough',
  187 + PLAYING: 'playing',
  188 + WAITING: 'waiting',
  189 + SEEKING: 'seeking',
  190 + SEEKED: 'seeked',
  191 + ENDED: 'ended',
  192 + DURATIONCHANGE: 'durationchange',
  193 + TIMEUPDATE: 'timeupdate',
  194 + PLAY: 'play',
  195 + PAUSE: 'pause',
  196 + RATECHNAGE: 'ratechange',
  197 + VOLUMECHANGE: 'volumechange'
  198 + };
  199 +
  200 + _video.addEventListener(media_events.ERROR, function(e) { //错误处理
  201 + console.log(e.type + ':' + _video.networkState);
  202 + if (_video.networkState === 3) {
  203 + if (_error_count < 10) {
  204 + _error_count += 1;
  205 + _video.src = video_src;
  206 + } else {
  207 + _msg_pannel.show();
  208 + _msg.text('未找到视频资源...');
  209 + }
  210 + }
  211 + });
  212 +
  213 + _video.addEventListener(media_events.LOAD_START, function(e) { //加载开始
  214 + console.log(e.type + ':' + _video.networkState + ':' + _video.readyState);
  215 + _msg_pannel.show();
  216 + //_video.pause();
  217 +
  218 + if (!that._is_ios) {
  219 + this.exitFull();
  220 + }
  221 + if (_video.networkState === 2) {
  222 + _msg.text('视频正在加载中');
  223 + }
  224 +
  225 + });
  226 +
  227 + _video.addEventListener(media_events.LOADED_METADATA, function(e) { //获取到视频元数据
  228 + console.log(e.type + ':' + _video.networkState + ':' + _video.readyState);
  229 + _msg.text('读取视频数据中');
  230 + });
  231 +
  232 + _video.addEventListener(media_events.CANPLAY, function(e) { //可以播放时
  233 + console.log(e.type + ':' + _video.networkState + ':' + _video.readyState);
  234 + _msg.text('视频准备就绪' + _video.networkState + ':' + _video.readyState);
  235 + });
  236 +
  237 + _video.addEventListener(media_events.CANPLAY_THROUGH, function(e) {
  238 + console.log(e.type + ':' + _video.networkState + ':' + _video.readyState);
  239 + _msg.text('视频准备播放');
  240 + if (that._islive || _video.paused) {
  241 + if (live_type == undefined || live_type != 2) {
  242 + _video.play();
  243 + }
  244 +
  245 + }
  246 + if (!that._islive) {
  247 + if (!that._islive) {
  248 + if (that._options.callback != undefined && typeof that._options.callback == "function") {
  249 + that._options.callback(_video.currentTime, e.type);
  250 + }
  251 + }
  252 + }
  253 +
  254 + //_msg_pannel.hide();
  255 + });
  256 +
  257 + _video.addEventListener(media_events.PLAY, function(e) {
  258 + console.log(e.type);
  259 + });
  260 +
  261 + _video.addEventListener(media_events.PLAYING, function(e) {
  262 + console.log(e.type);
  263 + //_msg.text(e.type + ':' + _video.networkState+ ':' + _video.readyState);
  264 + _msg_pannel.hide();
  265 + $btn_play.parent().hide();
  266 + _msg.text('视频播放中');
  267 + if (!that._islive) {
  268 + _video.controls = 'controls';
  269 + setTimeout(function() {
  270 + _video.play();
  271 + }, 200);
  272 + }
  273 + });
  274 +
  275 + _video.addEventListener(media_events.PAUSE, function(e) {
  276 + console.log(e.type + _video.networkState + ':' + _video.readyState);
  277 + //_video.pause();
  278 + //$(document).scrollTop(10);
  279 + _msg_pannel.hide();
  280 + if ($btn_play[0] && _video.paused && !_video.seeking) {
  281 + $btn_play.parent().show();
  282 + }
  283 +
  284 + if (!that._islive && !_video.seeking) {
  285 + _video.controls = false;
  286 + }
  287 + });
  288 +
  289 + _video.addEventListener(media_events.WAITING, function(e) {
  290 + if (that._islive) {
  291 + _msg_pannel.show();
  292 + _msg.text('视频缓冲中');
  293 + } else {
  294 + console.log('waiting');
  295 + if (!that._islive) {
  296 + if (that._options.callback != undefined && typeof that._options.callback == "function") {
  297 + that._options.callback(_video.currentTime, e.type);
  298 + }
  299 + }
  300 + }
  301 +
  302 + });
  303 +
  304 + _video.addEventListener(media_events.PROGRESS, function(e) { //获取到数据时
  305 + //console.log(e.type + ':' + _video.buffered.start(0) + ',' + _video.buffered.end(0));
  306 + //console.log(_progress_count + ':' + _video.networkState + ':' + that._is_weixin + ':' + that._is_ios);
  307 + if (_video.networkState === 1 && _progress_count === 0 && that._is_weixin) {
  308 + //_msg.text('视频初始化中' + _video.networkState + ':' + _video.readyState);
  309 + _progress_count = 1;
  310 + if (!that.is_ios) {
  311 + //_video.load();
  312 + }
  313 +
  314 + } else if (_video.networkState === 1 && _progress_count === 0 && that._is_ios && !that._is_weixin) {
  315 + //_msg.text('直接播放' + _video.networkState + ':' + _video.readyState);
  316 + //_video.play();
  317 + _progress_count = 1;
  318 + } else {
  319 + _progress_count += 1;
  320 + }
  321 + });
  322 +
  323 + _video.addEventListener(media_events.ABORT, function(e) {
  324 + console.log(e.type);
  325 + });
  326 +
  327 + _video.addEventListener(media_events.ENDED, function(e) {
  328 + //console.log(that);
  329 + that.exitFull();
  330 + $('#live-state-end').show();
  331 + });
  332 +
  333 + _video.addEventListener(media_events.TIMEUPDATE, function(e) {
  334 + if (!that._islive && !_video.seeking) {
  335 + if (that._options.callback != undefined && typeof that._options.callback == "function") {
  336 + that._options.callback(_video.currentTime, e.type);
  337 + }
  338 + }
  339 + });
  340 +
  341 +
  342 +
  343 + _video.addEventListener(media_events.SEEKED, function(e) {
  344 + if (!that._islive) {
  345 + if (that._options.callback != undefined && typeof that._options.callback == "function") {
  346 + that._options.callback(_video.currentTime, e.type);
  347 + }
  348 + }
  349 + });
  350 +
  351 + $(_video).on('webkitfullscreenchange', function(e) {
  352 +
  353 + });
  354 +
  355 + $(document).on('webkitfullscreenchange', function() {
  356 +
  357 + });
  358 +
  359 + if (!this._islive) {
  360 +
  361 + }
  362 +
  363 +
  364 + }
  365 +
  366 +};
  367 +
  368 +//调用方式
  369 +$.fn.yohovideo = function(options) {
  370 + //console.log('options=',options);
  371 + //options = $.extend(_defaults,options || {});
  372 + return new YohoVideo($(this), options);
  373 +}
  374 +
  375 +module.exports = (function(){
  376 +
  377 +})();
  1 +/**
  2 + * Created by PhpStorm.
  3 + * User: Targaryen
  4 + * Date: 2016/7/29
  5 + * Time: 16:55
  6 + */
  7 +var jsApiList = [
  8 + 'checkJsApi',
  9 + 'onMenuShareTimeline',
  10 + 'onMenuShareAppMessage',
  11 + 'onMenuShareQQ',
  12 + 'onMenuShareWeibo',
  13 + 'onMenuShareQZone'
  14 +];
  15 +var shareData = {
  16 + title: document.title,
  17 + link: location.href,
  18 + desc: 'YOHO!BLK',
  19 + imgUrl: 'http://img02.yohoboys.com/staticimg/2016/08/02/16/02fd39c0711f6ecb73d4a096a143e0771d.png'
  20 +};
  21 +
  22 +if (/MicroMessenger/i.test(navigator.userAgent)) {
  23 + $.ajax({
  24 + url: '//res.wx.qq.com/open/js/jweixin-1.1.0.js',
  25 + dataType: 'script',
  26 + cache: true,
  27 + success: function() {
  28 + $.ajax({
  29 + url: '/api/wechat/share/token',
  30 + data: {
  31 + url: location.href
  32 + },
  33 + success: function(res) {
  34 + if (window.wx) {
  35 + window.wx.config({
  36 + debug: false,
  37 + appId: res.appId,
  38 + timestamp: res.timestamp,
  39 + nonceStr: res.nonceStr,
  40 + signature: res.signature,
  41 + jsApiList: jsApiList
  42 + });
  43 + window.wx.ready(function() {
  44 + window.wx.onMenuShareAppMessage(shareData);
  45 + window.wx.onMenuShareTimeline(shareData);
  46 + window.wx.onMenuShareQQ(shareData);
  47 + window.wx.onMenuShareWeibo(shareData);
  48 + window.wx.onMenuShareQZone(shareData);
  49 + });
  50 + }
  51 + }
  52 + });
  53 + }
  54 + });
  55 +}
  56 +module.exports = function(data) {
  57 + shareData = data;
  58 +
  59 + if (window.wx) {
  60 + window.wx.onMenuShareAppMessage(shareData);
  61 + window.wx.onMenuShareTimeline(shareData);
  62 + window.wx.onMenuShareQQ(shareData);
  63 + window.wx.onMenuShareWeibo(shareData);
  64 + window.wx.onMenuShareQZone(shareData);
  65 + }
  66 +};
  1 +@import "live/index";
1 .receive-coupon-page { 2 .receive-coupon-page {
2 * { 3 * {
3 margin: 0; 4 margin: 0;
4 padding: 0; 5 padding: 0;
5 font-size: 14px; 6 font-size: 14px;
6 } 7 }
7 -  
8 .bg-contain { 8 .bg-contain {
9 width: 100%; 9 width: 100%;
10 height: 100%; 10 height: 100%;
11 position: absolute; 11 position: absolute;
12 background: #c4211a; 12 background: #c4211a;
13 -  
14 img { 13 img {
15 width: 100%; 14 width: 100%;
16 height: auto; 15 height: auto;
17 } 16 }
18 } 17 }
19 -  
20 .page { 18 .page {
21 width: 100%; 19 width: 100%;
22 height: auto; 20 height: auto;
@@ -25,7 +23,6 @@ @@ -25,7 +23,6 @@
25 top: 0; 23 top: 0;
26 bottom: 0; 24 bottom: 0;
27 } 25 }
28 -  
29 .coupon-centent, 26 .coupon-centent,
30 .gain-coupon-centent { 27 .gain-coupon-centent {
31 margin-top: 428px !important; 28 margin-top: 428px !important;
@@ -36,10 +33,8 @@ @@ -36,10 +33,8 @@
36 overflow: hidden; 33 overflow: hidden;
37 border-radius: 0.3rem; 34 border-radius: 0.3rem;
38 } 35 }
39 -  
40 .coupon-centent { 36 .coupon-centent {
41 position: relative; 37 position: relative;
42 -  
43 .title { 38 .title {
44 position: absolute; 39 position: absolute;
45 top: 40px; 40 top: 40px;
@@ -49,20 +44,16 @@ @@ -49,20 +44,16 @@
49 height: 57px; 44 height: 57px;
50 background: url("../img/coupon/coupon-title.png"); 45 background: url("../img/coupon/coupon-title.png");
51 } 46 }
52 -  
53 .under-title { 47 .under-title {
54 position: absolute; 48 position: absolute;
55 top: 100px; 49 top: 100px;
56 width: 100%; 50 width: 100%;
57 height: 463px; 51 height: 463px;
58 -  
59 } 52 }
60 -  
61 .input-content { 53 .input-content {
62 height: 206px; 54 height: 206px;
63 margin: 30px 30px 0; 55 margin: 30px 30px 0;
64 position: relative; 56 position: relative;
65 -  
66 input { 57 input {
67 height: 88px; 58 height: 88px;
68 width: 100%; 59 width: 100%;
@@ -75,7 +66,6 @@ @@ -75,7 +66,6 @@
75 text-align: center; 66 text-align: center;
76 outline: none; 67 outline: none;
77 } 68 }
78 -  
79 div { 69 div {
80 height: 88px; 70 height: 88px;
81 width: 100%; 71 width: 100%;
@@ -86,14 +76,12 @@ @@ -86,14 +76,12 @@
86 color: #e0e0e0; 76 color: #e0e0e0;
87 line-height: 88px; 77 line-height: 88px;
88 } 78 }
89 -  
90 .verification-code, 79 .verification-code,
91 .get { 80 .get {
92 background: #fff; 81 background: #fff;
93 color: #444; 82 color: #444;
94 } 83 }
95 } 84 }
96 -  
97 .clear-input { 85 .clear-input {
98 position: absolute; 86 position: absolute;
99 padding: 10px; 87 padding: 10px;
@@ -103,13 +91,11 @@ @@ -103,13 +91,11 @@
103 color: #666; 91 color: #666;
104 z-index: 1; 92 z-index: 1;
105 } 93 }
106 -  
107 .coupon-description { 94 .coupon-description {
108 width: 100%; 95 width: 100%;
109 height: 136px; 96 height: 136px;
110 position: relative; 97 position: relative;
111 background: url("../img/coupon/coupon-footer.png"); 98 background: url("../img/coupon/coupon-footer.png");
112 -  
113 span { 99 span {
114 position: absolute; 100 position: absolute;
115 bottom: 0; 101 bottom: 0;
@@ -119,7 +105,6 @@ @@ -119,7 +105,6 @@
119 } 105 }
120 } 106 }
121 } 107 }
122 -  
123 .gain-coupon-centent { 108 .gain-coupon-centent {
124 p { 109 p {
125 width: 100%; 110 width: 100%;
@@ -129,13 +114,11 @@ @@ -129,13 +114,11 @@
129 color: #fff; 114 color: #fff;
130 font-size: 17px; 115 font-size: 17px;
131 } 116 }
132 -  
133 p.phone { 117 p.phone {
134 margin-top: 10px; 118 margin-top: 10px;
135 font-size: 30px; 119 font-size: 30px;
136 font-weight: bold; 120 font-weight: bold;
137 } 121 }
138 -  
139 .coupon { 122 .coupon {
140 padding-top: 50px; 123 padding-top: 50px;
141 width: 90%; 124 width: 90%;
@@ -143,12 +126,10 @@ @@ -143,12 +126,10 @@
143 height: 220px; 126 height: 220px;
144 background: ##9d1a15; 127 background: ##9d1a15;
145 } 128 }
146 -  
147 .coupon img { 129 .coupon img {
148 width: 100%; 130 width: 100%;
149 height: auto; 131 height: auto;
150 } 132 }
151 -  
152 .use-coupon-btn { 133 .use-coupon-btn {
153 height: 88px; 134 height: 88px;
154 line-height: 88px; 135 line-height: 88px;
@@ -158,7 +139,6 @@ @@ -158,7 +139,6 @@
158 text-align: center; 139 text-align: center;
159 border-radius: 4px; 140 border-radius: 4px;
160 } 141 }
161 -  
162 span { 142 span {
163 font-weight: bold; 143 font-weight: bold;
164 display: inline-block; 144 display: inline-block;
@@ -170,13 +150,11 @@ @@ -170,13 +150,11 @@
170 margin: 0 40%; 150 margin: 0 40%;
171 background: url("../img/coupon/activity-description.png"); 151 background: url("../img/coupon/activity-description.png");
172 } 152 }
173 -  
174 a { 153 a {
175 color: #fff; 154 color: #fff;
176 font-size: 28px; 155 font-size: 28px;
177 } 156 }
178 } 157 }
179 -  
180 .dialog { 158 .dialog {
181 width: 84%; 159 width: 84%;
182 height: 410px; 160 height: 410px;
@@ -187,7 +165,6 @@ @@ -187,7 +165,6 @@
187 top: 235px; 165 top: 235px;
188 z-index: 2; 166 z-index: 2;
189 } 167 }
190 -  
191 .dialog .close { 168 .dialog .close {
192 width: 40px; 169 width: 40px;
193 height: 40px; 170 height: 40px;
@@ -200,16 +177,13 @@ @@ -200,16 +177,13 @@
200 line-height: 40px; 177 line-height: 40px;
201 text-align: center; 178 text-align: center;
202 } 179 }
203 -  
204 .hidden { 180 .hidden {
205 display: none; 181 display: none;
206 } 182 }
207 -  
208 .phone-error { 183 .phone-error {
209 text-align: center; 184 text-align: center;
210 line-height: 14rem; 185 line-height: 14rem;
211 } 186 }
212 -  
213 .mask { 187 .mask {
214 width: 100%; 188 width: 100%;
215 height: 100%; 189 height: 100%;
@@ -221,13 +195,11 @@ @@ -221,13 +195,11 @@
221 left: 0; 195 left: 0;
222 z-index: 1; 196 z-index: 1;
223 } 197 }
224 -  
225 .activity-message { 198 .activity-message {
226 width: 100%; 199 width: 100%;
227 height: 410px; 200 height: 410px;
228 overflow: scroll; 201 overflow: scroll;
229 } 202 }
230 -  
231 .activity-message h3 { 203 .activity-message h3 {
232 width: 100%; 204 width: 100%;
233 height: 40px; 205 height: 40px;
@@ -237,7 +209,6 @@ @@ -237,7 +209,6 @@
237 font-size: 32px; 209 font-size: 32px;
238 text-align: center; 210 text-align: center;
239 } 211 }
240 -  
241 .activity-message p { 212 .activity-message p {
242 width: 85%; 213 width: 85%;
243 height: auto; 214 height: auto;
@@ -245,11 +216,9 @@ @@ -245,11 +216,9 @@
245 margin: 0 auto; 216 margin: 0 auto;
246 font-size: 26px; 217 font-size: 26px;
247 line-height: 40px; 218 line-height: 40px;
248 -  
249 padding-left: 26px; 219 padding-left: 26px;
250 text-indent: -26px; 220 text-indent: -26px;
251 } 221 }
252 -  
253 .messages { 222 .messages {
254 width: 84%; 223 width: 84%;
255 height: 4rem; 224 height: 4rem;
@@ -262,12 +231,10 @@ @@ -262,12 +231,10 @@
262 z-index: 2; 231 z-index: 2;
263 color: #fff; 232 color: #fff;
264 } 233 }
265 -  
266 .messages p { 234 .messages p {
267 line-height: 4rem; 235 line-height: 4rem;
268 font-size: 24px; 236 font-size: 24px;
269 } 237 }
270 -  
271 .tip-wrap { 238 .tip-wrap {
272 width: 100%; 239 width: 100%;
273 height: 100%; 240 height: 100%;
@@ -277,7 +244,6 @@ @@ -277,7 +244,6 @@
277 left: 0; 244 left: 0;
278 z-index: 3; 245 z-index: 3;
279 } 246 }
280 -  
281 .tip { 247 .tip {
282 width: 100%; 248 width: 100%;
283 height: 100%; 249 height: 100%;
@@ -285,7 +251,6 @@ @@ -285,7 +251,6 @@
285 position: absolute; 251 position: absolute;
286 top: 0; 252 top: 0;
287 left: 0; 253 left: 0;
288 -  
289 .header { 254 .header {
290 width: 170px; 255 width: 170px;
291 height: 170px; 256 height: 170px;
@@ -294,7 +259,6 @@ @@ -294,7 +259,6 @@
294 margin-right: auto; 259 margin-right: auto;
295 background: url("../img/coupon/unfortunately.png"); 260 background: url("../img/coupon/unfortunately.png");
296 } 261 }
297 -  
298 .title { 262 .title {
299 margin-top: 30px; 263 margin-top: 30px;
300 font-size: 28px; 264 font-size: 28px;
@@ -303,7 +267,6 @@ @@ -303,7 +267,6 @@
303 margin-left: auto; 267 margin-left: auto;
304 margin-right: auto; 268 margin-right: auto;
305 } 269 }
306 -  
307 .logo { 270 .logo {
308 width: 391px; 271 width: 391px;
309 height: 78px; 272 height: 78px;
@@ -312,12 +275,10 @@ @@ -312,12 +275,10 @@
312 margin-right: auto; 275 margin-right: auto;
313 background: url("../img/coupon/logo.png"); 276 background: url("../img/coupon/logo.png");
314 } 277 }
315 -  
316 .desc { 278 .desc {
317 font-size: 24px; 279 font-size: 24px;
318 color: #444; 280 color: #444;
319 } 281 }
320 -  
321 .button { 282 .button {
322 display: block; 283 display: block;
323 margin: 30px auto; 284 margin: 30px auto;
@@ -332,4 +293,6 @@ @@ -332,4 +293,6 @@
332 } 293 }
333 } 294 }
334 295
  296 +
335 @import "student"; 297 @import "student";
  298 +@import "live/index";
  1 +$titlebg: #ededed;
  2 +$white: #fff;
  3 +$black: #444;
  4 +$red: #d0021b;
  5 +$gray: #b0b0b0;
  6 +$border: #e0e0e0;
  7 +
  8 +.head_margin {
  9 + height: 30px;
  10 + width: 100%;
  11 + border-bottom: 1px solid $border;
  12 +}
  13 +
  14 +.liverec {
  15 + width: 640px;
  16 + overflow: hidden;
  17 +
  18 + &_child {
  19 + position: relative;
  20 + width: 50%;
  21 + float: left;
  22 + border-right: 1px solid $border;
  23 + overflow: hidden;
  24 + }
  25 +
  26 + &_pic {
  27 + height: 320px;
  28 + width: 320px;
  29 + background: gray;
  30 + }
  31 +
  32 + .pre-living {
  33 + position: absolute;
  34 + top: 30px;
  35 + left: 30px;
  36 + height: 35px;
  37 + padding: 0 10px;
  38 + border: 2px solid $white;
  39 + border-radius: 20px;
  40 + color: $white;
  41 + font-size: 22px;
  42 + text-align: center;
  43 + line-height: 1.5;
  44 + }
  45 +
  46 + .living {
  47 + position: absolute;
  48 + top: 30px;
  49 + left: 30px;
  50 + height: 35px;
  51 + width: 70px;
  52 + background: $red;
  53 + border-radius: 15px;
  54 + color: $white;
  55 + font-size: 22px;
  56 + text-align: center;
  57 + line-height: 1.5;
  58 + }
  59 +
  60 + &_tag {
  61 + font-size: 20px;
  62 + line-height: 1.2;
  63 + color: $black;
  64 + overflow: hidden;
  65 + white-space: nowrap;
  66 + text-overflow: ellipsis;
  67 + }
  68 +}
  69 +
  70 +.liverec_info {
  71 + padding: 20px 10px 20px 30px;
  72 +}
  73 +
  74 +.liverec_head {
  75 + float: left;
  76 + width: 60px;
  77 + height: 60px;
  78 + margin-right: 20px;
  79 + border-radius: 50%;
  80 +}
  81 +
  82 +.liverec_pannel {
  83 + line-height: 1;
  84 + overflow: hidden;
  85 +}
  86 +
  87 +.liverec_name {
  88 + font-size: 26px;
  89 + margin-bottom: 14px;
  90 + color: $black;
  91 + line-height: 1.2;
  92 +
  93 + .name-name {
  94 + display: inline-block;
  95 + max-width: 105px;
  96 + text-overflow: ellipsis;
  97 + overflow: hidden;
  98 + white-space: nowrap;
  99 + }
  100 +
  101 + .name-tag {
  102 + display: inline-block;
  103 + float: right;
  104 + font-size: 18px;
  105 + height: 26px;
  106 + max-width: 100%;
  107 + line-height: 26px;
  108 + padding: 0 8px;
  109 + text-align: center;
  110 + background: $black;
  111 + border-radius: 20px;
  112 + color: $white;
  113 + vertical-align: top;
  114 + white-space: nowrap;
  115 + text-overflow: ellipsis;
  116 + }
  117 +}
  118 +
  119 +.living_title {
  120 + width: 640px;
  121 + height: 80px;
  122 + text-align: center;
  123 + line-height: 80px;
  124 + color: $black;
  125 + background: $titlebg;
  126 + font-size: 32px;
  127 +}
  128 +
  129 +.liveliving {
  130 + header {
  131 + position: relative;
  132 + height: 102px;
  133 + width: 640px;
  134 + border-top: 1px solid $border;
  135 + border-bottom: 1px solid $border;
  136 + overflow: hidden;
  137 + }
  138 +
  139 + .main-head {
  140 + position: absolute;
  141 + top: 20px;
  142 + left: 30px;
  143 + height: 60px;
  144 + width: 60px;
  145 + border-radius: 50%;
  146 + }
  147 +
  148 + .header-info {
  149 + position: absolute;
  150 + top: 20px;
  151 + left: 110px;
  152 + right: 0;
  153 +
  154 + .main-name {
  155 + font-size: 26px;
  156 + color: $black;
  157 + margin-bottom: 14px;
  158 + line-height: 1.2;
  159 + overflow: hidden;
  160 + white-space: nowrap;
  161 + text-overflow: ellipsis;
  162 + }
  163 +
  164 + .main-tag {
  165 + font-size: 20px;
  166 + color: $gray;
  167 + line-height: 1.2;
  168 + overflow: hidden;
  169 + white-space: nowrap;
  170 + text-overflow: ellipsis;
  171 + }
  172 + }
  173 +
  174 + section {
  175 + position: relative;
  176 + height: 640px;
  177 + width: 640px;
  178 +
  179 + .record-icon {
  180 + position: absolute;
  181 + top: 50%;
  182 + left: 50%;
  183 + height: 100px;
  184 + width: 101px;
  185 + margin-left: -50px;
  186 + margin-top: -50px;
  187 + background: url("/activity/record-icon.png");
  188 + }
  189 +
  190 + .main-bg {
  191 + height: 100%;
  192 + width: 100%;
  193 + }
  194 +
  195 + .main-living {
  196 + position: absolute;
  197 + top: 30px;
  198 + left: 30px;
  199 + height: 35px;
  200 + width: 70px;
  201 + background: $red;
  202 + border-radius: 20px;
  203 + color: $white;
  204 + font-size: 22px;
  205 + text-align: center;
  206 + line-height: 1.5;
  207 + }
  208 +
  209 + .main-intro {
  210 + position: absolute;
  211 + bottom: 75px;
  212 + left: 30px;
  213 + font-size: 28px;
  214 + color: $white;
  215 + display: -webkit-box;
  216 + overflow: hidden;
  217 + word-break: break-all;
  218 + -webkit-box-orient: vertical;
  219 + -webkit-line-clamp: 1;
  220 + }
  221 +
  222 + .main-people {
  223 + position: absolute;
  224 + bottom: 22px;
  225 + left: 30px;
  226 + height: 40px;
  227 + width: 185px;
  228 + font-size: 19px;
  229 + background: rgba(4, 4, 4, 0.5);
  230 + border-radius: 20px;
  231 + line-height: 40px;
  232 + }
  233 +
  234 + .people-icon {
  235 + margin-top: 10px;
  236 + margin-left: 17px;
  237 + display: inline-block;
  238 + height: 18px;
  239 + width: 16px;
  240 + background: url("/activity/people.png") no-repeat center center;
  241 + }
  242 +
  243 + .eye-icon {
  244 + margin-top: 10px;
  245 + margin-left: 15px;
  246 + display: inline-block;
  247 + height: 17px;
  248 + width: 23px;
  249 + background: url("/activity/eye.png") no-repeat center center;
  250 + }
  251 +
  252 + .people-sum {
  253 + display: inline-block;
  254 + font-size: 22px;
  255 + color: $white;
  256 + }
  257 + }
  258 +}
  259 +
  260 +.live-list {
  261 + width: 640px;
  262 +
  263 + .title {
  264 + width: 100%;
  265 + height: 80px;
  266 + text-align: center;
  267 + line-height: 80px;
  268 + color: $black;
  269 + background: $titlebg;
  270 + font-size: 32px;
  271 + }
  272 +
  273 + .pre-list {
  274 + position: relative;
  275 + height: 190px;
  276 + width: 100%;
  277 + border-bottom: 1px solid $titlebg;
  278 +
  279 + a {
  280 + display: inline-block;
  281 + height: 100%;
  282 + width: 100%;
  283 + }
  284 +
  285 + .pre-pic {
  286 + position: absolute;
  287 + top: 20px;
  288 + left: 37px;
  289 + height: 150px;
  290 + width: 150px;
  291 + }
  292 +
  293 + .pre-icon {
  294 + position: absolute;
  295 + top: 20px;
  296 + left: 220px;
  297 + height: 35px;
  298 + width: 70px;
  299 + border: 2px solid $black;
  300 + border-radius: 20px;
  301 + font-size: 22px;
  302 + line-height: 1.5;
  303 + text-align: center;
  304 + color: $black;
  305 + }
  306 +
  307 + .pre-time {
  308 + position: absolute;
  309 + top: 20px;
  310 + left: 310px;
  311 + color: $black;
  312 + font-size: 24px;
  313 + line-height: 35px;
  314 + }
  315 +
  316 + .pre-pannel {
  317 + position: absolute;
  318 + top: 77px;
  319 + left: 220px;
  320 + right: 0;
  321 + }
  322 +
  323 + .pre-title {
  324 + font-size: 28px;
  325 + color: $black;
  326 + line-height: 1.2;
  327 + margin-bottom: 12px;
  328 + }
  329 +
  330 + .pre-cast {
  331 + font-size: 22px;
  332 + color: $gray;
  333 + line-height: 100%;
  334 + overflow: hidden;
  335 + white-space: nowrap;
  336 + text-overflow: ellipsis;
  337 + }
  338 + }
  339 +}
  1 +@import "entry";
  2 +@import "play";
  3 +@import "player";
  1 +.live-state {
  2 + display: none;
  3 + position: absolute;
  4 + z-index: 200;
  5 + top: 0;
  6 + right: 0;
  7 + bottom: 0;
  8 + left: 0;
  9 + width: 100%;
  10 + max-width: 100%;
  11 + min-height: 100vh;
  12 + color: white;
  13 + overflow: auto;
  14 + &.is-no-start .live-state-inner {
  15 + box-sizing: border-box;
  16 + padding-bottom: 220px;
  17 + }
  18 + .live-btn-close {
  19 + z-index: 200;
  20 + }
  21 +}
  22 +
  23 +
  24 +.live-state-inner {
  25 + min-height: 100%;
  26 + overflow: hidden;
  27 + background-size: 100% 100%;
  28 +}
  29 +
  30 +.live-state__txt {
  31 + width: 428px;
  32 + font-size: 31px;
  33 + line-height: 1;
  34 + padding: 20px 0;
  35 + border-top: 1px solid #fff;
  36 + border-bottom: 1px solid #fff;
  37 + margin: 571px auto 34px;
  38 + text-align: center;
  39 +}
  40 +
  41 +.live-state-info {
  42 + li,
  43 + .title {
  44 + margin-bottom: 32px;
  45 + }
  46 + .val {
  47 + font-size: 26px;
  48 + margin-bottom: 13px;
  49 + }
  50 + .label,
  51 + .name {
  52 + font-size: 19px;
  53 + }
  54 + .audience .val {
  55 + font-size: 51px;
  56 + }
  57 + .duration,
  58 + .favorite {
  59 + width: 50%;
  60 + float: left;
  61 + .inner {
  62 + text-align: center;
  63 + }
  64 + }
  65 + .duration .inner {
  66 + margin-right: 62px;
  67 + }
  68 + .favorite .inner {
  69 + margin-left: 62px;
  70 + }
  71 + .avatar {
  72 + display: block;
  73 + width: 112px;
  74 + height: 112px;
  75 + border-radius: 50%;
  76 + margin-bottom: 24px;
  77 + border: none;
  78 + outline: none;
  79 + }
  80 + .name {
  81 + display: inline-block;
  82 + font-size: 20px;
  83 + margin-bottom: 42px;
  84 + width: 50%;
  85 + }
  86 + .title {
  87 + max-width: 70%;
  88 + font-size: 29px;
  89 + margin-left: auto;
  90 + margin-right: auto;
  91 + overflow: hidden;
  92 + text-overflow: ellipsis;
  93 + white-space: nowrap;
  94 + }
  95 + .begin-time {
  96 + font-size: 24px;
  97 + }
  98 +}
  99 +
  100 +.live-btn-close,
  101 +.live-btn-share {
  102 + position: absolute;
  103 + top: 25px;
  104 + width: 52px;
  105 + height: 52px;
  106 + text-align: center;
  107 + color: #fff;
  108 + border-radius: 50%;
  109 + background-color: rgba(0, 0, 0, 0.4);
  110 +}
  111 +
  112 +.live-btn-close {
  113 + z-index: 100;
  114 + right: 25px;
  115 + .iconfont {
  116 + font-size: 38px;
  117 + }
  118 +}
  119 +
  120 +.live-btn-share {
  121 + display: none;
  122 + z-index: 100;
  123 + right: 100px;
  124 + .iconfont {
  125 + font-size: 28px;
  126 + line-height: 46px;
  127 + }
  128 +}
  129 +
  130 +.live-wrapper {
  131 + .avatar1 {
  132 + background-image: resolve('activity/live/live/head_1.png');
  133 + }
  134 + .avatar2 {
  135 + background-image: resolve('activity/live/live/head_2.png');
  136 + }
  137 + .avatar3 {
  138 + background-image: resolve('activity/live/live/head_3.png');
  139 + }
  140 + .avatar4 {
  141 + background-image: resolve('activity/live/live/head_4.png');
  142 + }
  143 + .avatar5 {
  144 + background-image: resolve('activity/live/live/head_5.png');
  145 + }
  146 +
  147 + .avatar1,
  148 + .avatar2,
  149 + .avatar3,
  150 + .avatar4,
  151 + .avatar5{
  152 + background-position: center center;
  153 + background-size: contain;
  154 + }
  155 + .float-layer {
  156 + height: 128px;
  157 + background: rgba(68, 68, 68, 0.95);
  158 + position: fixed;
  159 + width: 100%;
  160 + bottom: 0;
  161 + left: 0;
  162 + z-index: 9999;
  163 + padding: 20px 0;
  164 + .float-layer-left {
  165 + padding-left: 44px;
  166 + overflow: hidden;
  167 + float: left;
  168 + img {
  169 + height: 44px;
  170 + float: left;
  171 + margin-right: 20px;
  172 + }
  173 + p {
  174 + float: left;
  175 + font-size: 32px;
  176 + height: 88px;
  177 + line-height: 88px;
  178 + color: white;
  179 + }
  180 + .yoho-icon {
  181 + float: left;
  182 + margin-right: 10px;
  183 + font-size: 44px;
  184 + line-height: 88px;
  185 + width: 88px;
  186 + height: 88px;
  187 + text-align: center;
  188 + color: #fff;
  189 + border-radius: 20px;
  190 + background-image: linear-gradient(#323232, #0f0f0f);
  191 + }
  192 + }
  193 + }
  194 + #float-layer-close {
  195 + position: absolute;
  196 + left: 0;
  197 + top: 0;
  198 + width: 100px;
  199 + height: 100px;
  200 + .close-icon {
  201 + position: absolute;
  202 + left: 0;
  203 + top: 0;
  204 + color: #C0C0C0;
  205 + z-index: 2;
  206 + }
  207 + }
  208 + #float-layer-btn {
  209 + position: absolute;
  210 + top: 50%;
  211 + right: 15px;
  212 + font-size: 32px;
  213 + padding: 0 10px;
  214 + height: 54px;
  215 + line-height: 54px;
  216 + background: white;
  217 + border-radius: 5px;
  218 + margin-top: -26px;
  219 + -webkit-tap-highlight-color: rgba(0, 0, 0, 0.5);
  220 + &:link,
  221 + &:visited,
  222 + &:hover,
  223 + &:actived {
  224 + color: #000;
  225 + }
  226 + }
  227 + .circle-rightbottom {
  228 + position: absolute;
  229 + width: 50px;
  230 + height: 0px;
  231 + border: 0 solid #323232;
  232 + border-bottom: 50px solid #323232;
  233 + border-radius: 0 0 50px 0;
  234 + }
  235 +}
  1 +.live-wrapper {
  2 + position: relative;
  3 + width: 100%;
  4 + -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
  5 + /*touch-action: pan-y;
  6 + user-select: none;
  7 + user-drag: none;
  8 + tap-highlight-color: rgba(0, 0, 0, 0);*/
  9 +}
  10 +
  11 +.live-main {
  12 + position: relative;
  13 + width: 100%;
  14 + height: 100vh;
  15 + margin: 0 auto;
  16 + max-width: 720px;
  17 +}
  18 +
  19 +/*----------视频内容部分----------*/
  20 +.live-video-main {
  21 + overflow: hidden;
  22 + position: relative;
  23 + width: 100%;
  24 + height: 100%;
  25 + user-select: none;
  26 + background-repeat: no-repeat;
  27 + /*background-position: 50% 50%;*/
  28 + background-size: auto 100%;
  29 +
  30 +}
  31 +
  32 +.live-video-cover {
  33 + display: block;
  34 + position: absolute;
  35 + width: 100%;
  36 + height: 100%;
  37 + left: 0;
  38 + top: 0;
  39 +}
  40 +
  41 +.live-video-play-button {
  42 + display: block;
  43 + position: absolute;
  44 + width: 4rem;
  45 + height: 4rem;
  46 + left: 50%;
  47 + top: 50%;
  48 + margin-left: -2rem;
  49 + margin-top: -2rem;
  50 + border: 0px solid #ffffff;
  51 + border-radius: 2.5rem;
  52 + border-radius: 2.5rem;
  53 +
  54 + .img {
  55 + background: rgba(0, 0, 0, 0.5) resolve('activity/live/live/btn_play.png') center center;
  56 + background-size: contain;
  57 + border-radius: 50%;
  58 + width: 165px;
  59 + height: 165px;
  60 + }
  61 +}
  62 +
  63 +.live-loading-container {
  64 + display: none;
  65 + position: absolute;
  66 + z-index: 100;
  67 + top: 0;
  68 + right: 0;
  69 + bottom: 0;
  70 + left: 0;
  71 +}
  72 +.live-loading-cover {
  73 + position: absolute;
  74 + top: 0;
  75 + right: 0;
  76 + bottom: 0;
  77 + left: 0;
  78 + filter: blur(5px);
  79 + background-size: cover;
  80 +}
  81 +
  82 +.live-video-loading {
  83 + position: absolute;
  84 + z-index: 200;
  85 + width: 100%;
  86 + height: 5rem;
  87 + left: 0;
  88 + top: 50%;
  89 + margin-top: -2.5rem;
  90 + text-align: center;
  91 +}
  92 +
  93 +.live-video-loading .img {
  94 + position: relative;
  95 + width: 153px;
  96 + height: 110px;
  97 + margin: 0 auto;
  98 + background: resolve('activity/live/live/live-loading.gif') no-repeat;
  99 + background-size: contain;
  100 +}
  101 +
  102 +.live-video-loading p {
  103 + font-size: 0.8rem;
  104 + color: #ffffff;
  105 + line-height: 1.2rem;
  106 +}
  107 +
  108 +#live_touch_layer {
  109 + position: absolute;
  110 + top: 0;
  111 + right: 0;
  112 + bottom: 0;
  113 + left: 0;
  114 +}
  115 +
  116 +/*----------播放器----------*/
  117 +.video_container {
  118 + position: absolute;
  119 + width: 100%;
  120 + height: 100%;
  121 + z-index: 1;
  122 + overflow: hidden;
  123 +
  124 +}
  125 +
  126 +.video_player {
  127 + position: absolute;
  128 + top: 0;
  129 + right: 0;
  130 + bottom: 0;
  131 + left: 0;
  132 + z-index: 0;
  133 + /*top: -3.2rem;*/
  134 +}
  135 +
  136 +/*:-webkit-full-screen video {
  137 + width: 100%;
  138 + height: 100%;
  139 +}
  140 +
  141 +:-moz-full-screen video {
  142 + width: 100%;
  143 + height: 100%;
  144 +}*/
  145 +
  146 +/*----------播放器结束----------*/
  147 +
  148 +.live-app-open {
  149 + position: absolute;
  150 + width: 17rem;
  151 + height: 1.5rem;
  152 + font-size: 0.8rem;
  153 + line-height: 1.5rem;
  154 + color: #ffffff;
  155 + bottom: 0.5rem;
  156 + left: 50%;
  157 + margin-left: -8.5rem;
  158 + background-color: #000000;
  159 + text-align: center;
  160 + border-radius: 0.3rem;
  161 + -webkit-border-radius: 0.3rem;
  162 +
  163 +}
  164 +
  165 +/*----------用户聊天----------*/
  166 +.live-chat-pannel {
  167 + position: absolute;
  168 + right: 0;
  169 + left: 0;
  170 + bottom: 3rem;
  171 + z-index: 2;
  172 +}
  173 +
  174 +.live-chat-mask {
  175 + position: absolute;
  176 + width: 100%;
  177 + height: 100%;
  178 + background: linear-gradient(rgba(255, 255, 255, 0), #ffffff);
  179 +}
  180 +
  181 +.live-chat-pannel ul {
  182 + padding: 0 3.8rem 0 1rem;
  183 + overflow: hidden;
  184 +}
  185 +
  186 +.live-chat-pannel ul li {
  187 + margin-top: 0.25rem;
  188 + overflow: hidden;
  189 +}
  190 +
  191 +.live-item1 {
  192 + display: inline-block;
  193 + padding: 0.3rem 0.3rem;
  194 + border-radius: 0.3rem;
  195 + background-color: rgba(255, 255, 255, 0.6);
  196 + color: #000000;
  197 + font-size: 0.6rem;
  198 +}
  199 +
  200 +.live-item2 {
  201 + position: relative;
  202 + min-height: 2.5rem;
  203 + padding-left: 1.75rem;
  204 + display: inline-block;
  205 + color: #ffffff;
  206 + border-radius: 0.3rem;
  207 + background-color: rgba(0, 0, 0, 0.32);
  208 + font-size: 0.6rem;
  209 +
  210 +}
  211 +
  212 +.live-replay {
  213 + font-size: 22px;
  214 + color: #a9adb9;
  215 + margin-bottom: 3px;
  216 + display: inline-block;
  217 +}
  218 +
  219 +.live-item2_1 {
  220 + float: left;
  221 + word-break: break-all;
  222 + padding: 0.45rem 0.3rem 0.3rem 0.3rem;
  223 + line-height: 1.2;
  224 + font-size: 22px;
  225 + font-weight: lighter;
  226 + color: rgba(255,255,255,0.8);
  227 + overflow: hidden;
  228 +}
  229 +
  230 +.live-item2_2 {
  231 + word-break: break-all;
  232 + word-wrap: break-word;
  233 + font-size: 26px;
  234 + line-height: 1.2;
  235 + font-weight: normal;
  236 + color: #FFFFFF;
  237 +}
  238 +
  239 +.live-item2 img {
  240 + position: relative;
  241 + left: 0;
  242 + top: 0;
  243 + display: inline-block;
  244 + width: 2.5rem;
  245 + height: 100%;
  246 +}
  247 +
  248 +.live-item2-head {
  249 + position: absolute;
  250 + left: 0;
  251 + top: 0;
  252 + display: inline-block;
  253 + width: 1.7rem;
  254 + height: 100%;
  255 + overflow: hidden;
  256 + border-radius: 0.3rem 0 0 0.3rem;
  257 + -webkit-border-radius: 0.3rem 0 0 0.3rem;
  258 +}
  259 +
  260 +.live-like-pannel {
  261 + display: none;
  262 + position: absolute;
  263 + right: 25px;
  264 + bottom: 130px;
  265 + width: 110px;
  266 + text-align: center;
  267 + color: #ffffff;
  268 + text-shadow: 0 0 5px black;
  269 + font-weight: bold;
  270 +}
  271 +
  272 +.live-like-pannel .like-main {
  273 + width: 110px;
  274 + height: 110px;
  275 + background: resolve('activity/live/live/like_icon1.png') no-repeat;
  276 + background-size: contain;
  277 +}
  278 +
  279 +.live-like-pannel span {
  280 + position: relative;
  281 + display: inline-block;
  282 + padding: 0;
  283 +}
  284 +
  285 +.animate_pannel .like-icon {
  286 + position: absolute;
  287 + width: 1.5rem;
  288 + height: 1.5rem;
  289 + /*left: 50%;
  290 + top: 50%;
  291 + margin-left: -0.75rem;
  292 + margin-top: -3rem;*/
  293 +
  294 + transform: translateX(0.5rem) translateY(-1rem);
  295 +}
  296 +
  297 +.animate_pannel {
  298 + position: absolute;
  299 + width: 100%;
  300 + height: 100%;
  301 + left: 0;
  302 + top: 0;
  303 +}
  304 +
  305 +.scroll_animate_1 {
  306 + animation: scroll_up_1 1.5s linear 1 forwards;
  307 +}
  308 +
  309 +.scroll_animate_2 {
  310 + animation: scroll_up_2 1.6s linear 1 forwards;
  311 +}
  312 +
  313 +.scroll_animate_3 {
  314 + animation: scroll_up_3 1.8s linear 1 forwards;
  315 +}
  316 +
  317 +@keyframes scroll_up_1 {
  318 + 0% {
  319 + /*margin-left: -0.75rem;*/
  320 + /*margin-top: -3rem;*/
  321 + transform: translateX(0.5rem) translateY(-1rem);
  322 + opacity: 1;
  323 + }
  324 + 50% {
  325 + transform: translateX(-1rem) translateY(-5rem);
  326 + opacity: 0.5;
  327 + }
  328 + 100% {
  329 + /*margin-left: 0.75rem;
  330 + margin-top: -8rem;*/
  331 + transform: translateX(1.5rem) translateY(-9rem);
  332 + opacity: 0;
  333 + }
  334 +}
  335 +
  336 +@keyframes scroll_up_2 {
  337 + 0% {
  338 + /*margin-left: -0.75rem;
  339 + margin-top: -3rem;*/
  340 + transform: translateX(0.5rem) translateY(-1rem);
  341 + opacity: 1;
  342 + }
  343 + 50% {
  344 + transform: translateX(2rem) translateY(-5rem);
  345 + opacity: 0.5;
  346 + }
  347 + 100% {
  348 + /*margin-left: -1.5rem;
  349 + margin-top: -8rem;*/
  350 + transform: translateX(-0.5rem) translateY(-9rem);
  351 + opacity: 0;
  352 + }
  353 +}
  354 +
  355 +@keyframes scroll_up_3 {
  356 + 0% {
  357 + /*margin-left: -0.75rem;
  358 + margin-top: -3rem;*/
  359 + transform: translateX(0.5rem) translateY(-1rem);
  360 + opacity: 1;
  361 + }
  362 + 100% {
  363 + /*margin-left: -0.75rem;
  364 + margin-top: -8rem;*/
  365 + transform: translateX(0.5rem) translateY(-9rem);
  366 + opacity: 0;
  367 + }
  368 +}
  369 +
  370 +/*----------直播状态----------*/
  371 +.live-status {
  372 + position: absolute;
  373 + z-index: 100;
  374 + top: 30px;
  375 + right: 3rem;
  376 + left: 30px;
  377 + color: #ffffff;
  378 + font-size: 0.7rem;
  379 + font-weight: bold;
  380 + text-shadow: 0 0 5px black;
  381 +}
  382 +
  383 +.live-status .img {
  384 + width: 70px;
  385 + height: 70px;
  386 + float: left;
  387 + margin-right: 16px;
  388 + background: resolve('activity/live/live/app_logo.png') no-repeat;
  389 + background-size: contain;
  390 +}
  391 +
  392 +.live-time {
  393 + position: relative;
  394 + font-size: 26px;
  395 + line-height: 28px;
  396 + margin: 10px 0;
  397 +}
  398 +
  399 +.live-status span {
  400 + display: inline-block;
  401 +}
  402 +
  403 +.live-status .title {
  404 + font-size: 22px;
  405 + line-height: 44px;
  406 + margin-top: 38px;
  407 + padding: 0 26px;
  408 + float: left;
  409 + border-radius: 14px;
  410 + background: rgba(0, 0, 0, 0.25);
  411 +}
  412 +
  413 +.live-num {
  414 + position: relative;
  415 + font-size: 22px;
  416 + line-height: 1;
  417 +}
  418 +
  419 +/*-----------直播结束DIV----------*/
  420 +.live-end {
  421 + display: none;
  422 + position: absolute;
  423 + width: 100%;
  424 + height: 100%;
  425 + bottom: 0;
  426 + z-index:30;
  427 +}
  428 +
  429 +.live-end-bg {
  430 + position: absolute;
  431 + width: 100%;
  432 + height: 100%;
  433 + left: 0;
  434 + top: 0;
  435 + background-color: rgba(0, 0, 0, 0.8);
  436 + filter: blur(5px); /* Chrome, Opera */
  437 + -moz-filter: blur(5px);
  438 +}
  439 +
  440 +.live-end img {
  441 + position: relative;
  442 + margin-top: 12rem;
  443 +}
  444 +
  445 +.live-end-audiencenum {
  446 + position: absolute;
  447 + width: 100%;
  448 + top: 15.5rem;
  449 + text-align: center;
  450 + color: #ffffff;
  451 + overflow: hidden;
  452 +}
  453 +
  454 +.live-end-audiencenum p {
  455 + font-size: 1.5rem;
  456 + line-height: 1.5rem;
  457 + font-weight: bold;
  458 +}
  459 +
  460 +.live-end-audiencenum span {
  461 + font-size: 0.7rem;
  462 + line-height: 0.7rem;
  463 + font-weight: lighter;
  464 +}
  465 +
  466 +.live-end-videolength {
  467 + position: absolute;
  468 + width: 20%;
  469 + top: 19.5rem;
  470 + left: 20%;
  471 + text-align: center;
  472 + color: #ffffff;
  473 + overflow: hidden;
  474 +}
  475 +
  476 +.live-end-videolength p,
  477 +.live-end-videolength span {
  478 + font-size: 0.7rem;
  479 + line-height: 0.7rem;
  480 + font-weight: lighter;
  481 +}
  482 +
  483 +.live-end-likenum {
  484 + position: absolute;
  485 + width: 20%;
  486 + top: 19.5rem;
  487 + right: 20%;
  488 + text-align: center;
  489 + color: #ffffff;
  490 + overflow: hidden;
  491 +}
  492 +
  493 +.live-end-likenum p,
  494 +.live-end-likenum span {
  495 + font-size: 0.7rem;
  496 + line-height: 0.7rem;
  497 + font-weight: lighter;
  498 +}
  499 +
  500 +.white-space {
  501 + position: relative;
  502 + width: 100%;
  503 + height: 1.5rem;
  504 +}
  505 +
  506 +/*----------资讯部分----------*/
  507 +.live-info-main {
  508 + position: relative;
  509 + width: 100%;
  510 + margin-top: 0;
  511 +
  512 +}
  513 +
  514 +/*-----资讯直播图-----*/
  515 +.live-info-poster {
  516 + position: relative;
  517 + width: 100%;
  518 + height: 10.7rem;
  519 + overflow: hidden;
  520 +}
  521 +
  522 +.live-info-status-container {
  523 + position: absolute;
  524 + width: 100%;
  525 + height: 1rem;
  526 + color: #ffffff;
  527 + left: 0;
  528 + top: 0rem;
  529 +}
  530 +
  531 +.live-info-status {
  532 + position: relative;
  533 + float: left;
  534 + width: 2rem;
  535 + height: 1rem;
  536 + font-size: 0.7rem;
  537 + text-align: center;
  538 + line-height: 1rem;
  539 + background-color: rgba(0, 0, 0, 1);
  540 +}
  541 +
  542 +.live-info-users {
  543 + position: relative;
  544 + float: left;
  545 + padding-left: 0.5rem;
  546 + width: 10rem;
  547 + height: 1rem;
  548 + font-size: 0.7rem;
  549 + text-align: left;
  550 +}
  551 +
  552 +.live-info-user-icon {
  553 + position: relative;
  554 + float: left;
  555 + width: 0.375rem;
  556 + height: 1rem;
  557 + line-height: 1rem;
  558 +}
  559 +
  560 +.live-info-user-num {
  561 + position: relative;
  562 + float: left;
  563 + padding-left: 0.5rem;
  564 + height: 1rem;
  565 + line-height: 1rem;
  566 + text-align: left;
  567 +}
  568 +
  569 +.live-info-playbutton {
  570 + position: absolute;
  571 + width: 100%;
  572 + height: 100%;
  573 + left: 0;
  574 + top: 0;
  575 +}
  576 +
  577 +/*-----资讯直播图结束-----*/
  578 +
  579 +/*-----资讯标题,类型-----*/
  580 +.live-info-content {
  581 + position: relative;
  582 + width: 100%;
  583 + margin-top: 0.5rem;
  584 +}
  585 +
  586 +.live-info-title {
  587 + position: relative;
  588 + width: 16.25rem;
  589 + margin: 0 auto;
  590 + font-size: 1rem;
  591 + font-weight: bold;
  592 +}
  593 +
  594 +.live-info-type {
  595 + position: relative;
  596 + width: 16.25rem;
  597 + height: 1rem;
  598 + margin: 0.2rem auto;
  599 + color: #999999;
  600 +}
  601 +
  602 +.live-info-type span {
  603 + display: block;
  604 + width: 100%;
  605 + font-size: 0.7rem;
  606 + line-height: 1rem;
  607 +}
  608 +
  609 +.live-info-type > span a {
  610 + font-size: 0.7rem;
  611 + display: inline-block;
  612 + color: inherit;
  613 +}
  614 +
  615 +.live-info-text {
  616 + display: block;
  617 + position: relative;
  618 + width: 16.25rem;
  619 + margin: 0.5rem auto;
  620 + font-size: 0.8rem;
  621 + word-wrap: break-word;
  622 + line-height: 1.4rem;
  623 +}
  624 +
  625 +.live-info-text p{
  626 + font-size: 0.8rem;
  627 +}
  628 +
  629 +.live-info-text span {
  630 + font-size: 0.8rem;
  631 +}
  632 +
  633 +/*----------资讯标签----------*/
  634 +.live-info-tags {
  635 + position: relative;
  636 + width: 16.25rem;
  637 + margin: 0.5rem auto;
  638 +}
  639 +
  640 +.live-info-tags ul {
  641 + height: auto;
  642 + font-size: 0.7rem;
  643 + zoom: 1;
  644 +}
  645 +
  646 +.live-info-tags ul:after {
  647 + /*用于清除浮动的一种方法*/
  648 + clear: both;
  649 + content: '';
  650 + display: block;
  651 + width: 0;
  652 + height: 0;
  653 + visibility: hidden;
  654 +}
  655 +
  656 +.live-info-tags ul li {
  657 + float: left;
  658 + height: 1.2rem;
  659 + line-height: 1.2rem;
  660 + text-align: center;
  661 + margin-right: 0.3rem;
  662 + margin-top: 0.5rem;
  663 + background-color: #F2F2F2;
  664 +
  665 +}
  666 +
  667 +.live-info-tags ul li a {
  668 + color: #000000;
  669 + font-weight: lighter;
  670 + padding: 0 0.3rem 0 0.3rem;
  671 +}
  672 +
  673 +/*----------资讯部分结束----------*/
  674 +
@@ -23,6 +23,7 @@ @@ -23,6 +23,7 @@
23 @import "coupon"; 23 @import "coupon";
24 @import "discount-list"; 24 @import "discount-list";
25 @import "left-right"; 25 @import "left-right";
  26 +@import "three-picture";
26 27
27 .mobile-container { 28 .mobile-container {
28 margin-left: auto; 29 margin-left: auto;
  1 +.three-picture {
  2 + padding: 0 0 24px 24px;
  3 + border-bottom: 1px solid #e0e0e0;
  4 + background: #fff;
  5 +
  6 + a {
  7 + float: left;
  8 + width: 182px;
  9 + height: 238px;
  10 + margin-right: 24px;
  11 +
  12 + &:nth-child(3n) {
  13 + margin-right: 0;
  14 + }
  15 + }
  16 +
  17 + img {
  18 + width: 100%;
  19 + height: 100%;
  20 + }
  21 +}
@@ -6,6 +6,7 @@ @@ -6,6 +6,7 @@
6 @import "layout/swiper"; 6 @import "layout/swiper";
7 @import "layout/header"; 7 @import "layout/header";
8 @import "layout/footer"; 8 @import "layout/footer";
  9 +@import "layout/utils";
9 @import "common/index"; 10 @import "common/index";
10 @import "channel/index"; 11 @import "channel/index";
11 @import "product/index"; 12 @import "product/index";
@@ -44,14 +44,6 @@ a { @@ -44,14 +44,6 @@ a {
44 outline: none; 44 outline: none;
45 } 45 }
46 46
47 -.hide {  
48 - display: none;  
49 -}  
50 -  
51 -.overflow-hidden {  
52 - overflow: hidden;  
53 -}  
54 -  
55 .main-wrap { 47 .main-wrap {
56 position: relative; 48 position: relative;
57 margin-right: auto; 49 margin-right: auto;
@@ -62,8 +54,8 @@ a { @@ -62,8 +54,8 @@ a {
62 54
63 @font-face { 55 @font-face {
64 font-family: "iconfont"; 56 font-family: "iconfont";
65 - src: resolve('iconfont.eot'); /* IE9 */  
66 - src: resolve('iconfont.eot?#iefix') format('embedded-opentype'), resolve('iconfont.woff') format('woff'), resolve('iconfont.ttf') format('truetype'), resolve('iconfont.svg#iconfont') format('svg'); /* iOS 4.1- */ 57 + src: resolve("iconfont.eot"); /* IE9 */
  58 + src: resolve("iconfont.eot?#iefix") format("embedded-opentype"), resolve("iconfont.woff") format("woff"), resolve("iconfont.ttf") format("truetype"), resolve("iconfont.svg#iconfont") format("svg"); /* iOS 4.1- */
67 } 59 }
68 60
69 .iconfont { 61 .iconfont {
@@ -95,12 +87,12 @@ a { @@ -95,12 +87,12 @@ a {
95 } 87 }
96 88
97 .order-failure { 89 .order-failure {
98 - background-image: resolve('common/order-good.jpg'); 90 + background-image: resolve("common/order-good.jpg");
99 background-size: 100%; 91 background-size: 100%;
100 } 92 }
101 93
102 .good-failure { 94 .good-failure {
103 - background-image: resolve('common/order-good.jpg'); 95 + background-image: resolve("common/order-good.jpg");
104 background-position-x: 40%; 96 background-position-x: 40%;
105 background-size: 132px !important; 97 background-size: 132px !important;
106 } 98 }
  1 +.text-center {
  2 + text-align: center;
  3 +}
  4 +
  5 +.pull-left {
  6 + float: left;
  7 +}
  8 +
  9 +.pull-right {
  10 + float: right;
  11 +}
  12 +
  13 +.hide {
  14 + display: none;
  15 +}
  16 +
  17 +.show {
  18 + display: block !important;
  19 +}
  20 +
  21 +.overflow-hidden {
  22 + overflow: hidden;
  23 +}
  24 +
  25 +.text-overflow {
  26 + overflow: hidden;
  27 + white-space: nowrap;
  28 + text-overflow: ellipsis;
  29 +}
@@ -39,6 +39,12 @@ module.exports = { @@ -39,6 +39,12 @@ module.exports = {
39 path: path.join(__dirname, 'bundle'), // absolute path 39 path: path.join(__dirname, 'bundle'), // absolute path
40 filename: '[name].js' 40 filename: '[name].js'
41 }, 41 },
  42 + resolve: {
  43 + alias: {
  44 + common: path.join(__dirname, 'js/common'),
  45 + plugin: path.join(__dirname, 'js/plugins')
  46 + }
  47 + },
42 plugins: [ 48 plugins: [
43 new webpack.optimize.OccurenceOrderPlugin(), 49 new webpack.optimize.OccurenceOrderPlugin(),
44 new webpack.optimize.CommonsChunkPlugin({ 50 new webpack.optimize.CommonsChunkPlugin({