Authored by ccbikai

yohoblk init

**/bundle/**/*.js
**/dist/**/*.js
coverage
... ...
{
"extends": "yoho"
}
... ...
# Created by https://www.gitignore.io/api/node,webstorm,netbeans,sublimetext,vim
### Node ###
# Logs
logs
*.log
npm-debug.log*
# Runtime data
pids
*.pid
*.seed
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# nyc test coverage
.nyc_output
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# node-waf configuration
.lock-wscript
# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules
jspm_packages
# Optional npm cache directory
.npm
# Optional REPL history
.node_repl_history
### WebStorm ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
.idea/
# User-specific stuff:
.idea/workspace.xml
.idea/tasks.xml
.idea/dictionaries
.idea/vcs.xml
.idea/jsLibraryMappings.xml
# Sensitive or high-churn files:
.idea/dataSources.ids
.idea/dataSources.xml
.idea/dataSources.local.xml
.idea/sqlDataSources.xml
.idea/dynamic.xml
.idea/uiDesigner.xml
# Gradle:
.idea/gradle.xml
.idea/libraries
# Mongo Explorer plugin:
.idea/mongoSettings.xml
## File-based project format:
*.iws
## Plugin-specific files:
# IntelliJ
/out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
### WebStorm Patch ###
# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
# *.iml
# modules.xml
### NetBeans ###
nbproject/private/
build/
nbbuild/
dist/
nbdist/
nbactions.xml
.nb-gradle/
### SublimeText ###
# cache files for sublime text
*.tmlanguage.cache
*.tmPreferences.cache
*.stTheme.cache
# workspace files are user-specific
*.sublime-workspace
# project files should be checked into the repository, unless a significant
# proportion of contributors will probably not be using SublimeText
# *.sublime-project
# sftp configuration file
sftp-config.json
### Vim ###
# swap
[._]*.s[a-w][a-z]
[._]s[a-w][a-z]
# session
Session.vim
# temporary
.netrwhist
*~
# auto-generated tag files
tags
### VS Code ###
.vscode/
### YOHO ###
dist
public/css/*
public/bundle/*
.eslintcache
*.log.*
nbproject/*
.DS_Store
... ...
**/css/**/*.css
**/dist/**/*.css
... ...
{
"extends": "stylelint-config-yoho"
}
... ...
# 基于Express的有货前端开发框架
## 规约
### js模块命令规范
* JS按大模块放置,比如:home或者guang
* 页面加载的JS使用`*.page.js`, 且page的JS只能放在模块下的一级目录
* 非页面加载的JS直接`*.js`
### 页面加载静态资源规范
* 传模块名`module`和页面名`page`,即模块的目录名和当前页面的JS文件名的前缀,以加载对应页面的JS
\ No newline at end of file
... ...
/**
* yohobuy app
* @author: xuqi<qi.xu@yoho.cn>
* @date: 2016/4/25
*/
'use strict';
const config = require('./config/common');
// use one apm
if (config.useOneapm) {
require('oneapm');
}
const express = require('express');
const path = require('path');
const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser');
const favicon = require('serve-favicon');
const yohoLib = require('yoho-node-lib');
const session = require('express-session');
const memcached = require('connect-memcached');
const hbs = require('express-handlebars');
const pkg = require('./package.json');
const app = express();
const MemcachedStore = memcached(session);
// 向模板注入变量
app.locals.devEnv = app.get('env') === 'development';
app.locals.version = pkg.version;
// 全局注册library
yohoLib.global(config);
// 指定libray目录
global.utils = path.resolve('./utils');
const logger = global.yoho.logger;
app.set('view engine', '.hbs');
app.set('views', './doraemon/views');
app.engine('.hbs', hbs({
extname: '.hbs',
defaultLayout: 'layout',
layoutsDir: './doraemon/views',
partialsDir: './doraemon/views/partial',
helpers: global.yoho.helpers
}));
app.use(favicon(path.join(__dirname, '/public/favicon.ico')));
app.use(express.static(path.join(__dirname, 'public')));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: false
}));
app.use(cookieParser());
app.use(session({
proxy: true,
resave: false,
saveUninitialized: true,
unset: 'destroy',
secret: '82dd7e724f2c6870472c89dfa43cf48d',
name: 'yohoblk_session',
cookie: {
domain: 'yohoblk.com',
httpOnly: false
},
store: new MemcachedStore({
hosts: config.memcache.session,
prefix: 'yohoblk_session:'
})
}));
app.use((req, res, next) => {
req.user = {}; // 全局的用户数据
req.yoho = {}; // req和res绑定yoho对象,用于传递全局数据, 如req.yoho.channel等
next();
});
// dispatcher
try {
const user = require('./doraemon/middleware/user');
const setYohoData = require('./doraemon/middleware/set-yoho-data');
const errorHanlder = require('./doraemon/middleware/error-handler');
const setPageInfo = require('./doraemon/middleware/set-pageinfo');
// YOHO 前置中间件
app.use(setYohoData());
app.use(user());
app.use(setPageInfo());
require('./dispatch')(app);
app.all('*', errorHanlder.notFound()); // 404
// YOHO 后置中间件
app.use(errorHanlder.serverError());
} catch (err) {
logger.error(err);
}
// listener
app.listen(config.port, function() {
logger.info('yohobuy start');
});
... ...
# sub app
## 构建方法
* `npm i -g generator-subapp`
* `cd apps`
* `yo subapp`
... ...
/**
* 频道页面
* @author: Bi Kai<kai.bi@yoho.cn>
* @date: 2016/05/09
*/
'use strict';
const _ = require('lodash');
const helpers = global.yoho.helpers;
/**
* 频道选择页
*/
const channel = {
index: (req, res, next) => {
res.render('index');
}
};
module.exports = channel;
... ...
/**
* sub app channel
* @author: Bi Kai<kai.bi@yoho.cn>
* @date: 2016/05/09
*/
var express = require('express'),
path = require('path'),
hbs = require('express-handlebars');
var app = express();
// set view engin
var doraemon = path.join(__dirname, '../../doraemon/views'); // parent view root
app.on('mount', function(parent) {
delete parent.locals.settings; // 不继承父 App 的设置
Object.assign(app.locals, parent.locals);
});
app.set('views', path.join(__dirname, 'views/action'));
app.engine('.hbs', hbs({
extname: '.hbs',
defaultLayout: 'layout',
layoutsDir: doraemon,
partialsDir: [path.join(__dirname, 'views/partial'), `${doraemon}/partial`],
helpers: global.yoho.helpers
}));
// router
app.use(require('./router'));
module.exports = app;
... ...
/**
* router of sub app channel
* @author: Bi Kai<kai.bi@yoho.cn>
* @date: 2016/05/09
*/
'use strict';
const expressRouter = require('express').Router;
const cRoot = './controllers';
const channel = require(cRoot);
const router = expressRouter();
router.get('/', channel.index); // 首页
module.exports = router;
... ...
<h1>Index</h1>
\ No newline at end of file
... ...
/**
* 系统配置
*
* @author hbomb qiqi.zhou@yoho.cn
* @date 2016/05/06
*/
const isProduction = process.env.NODE_ENV === 'production';
const isTest = process.env.NODE_ENV === 'test';
module.exports = {
app: 'h5',
appVersion: '4.6.0', // 调用api的版本
port: 6004,
siteUrl: '//m.yohobuy.com',
domains: {
api: 'http://devapi.yoho.cn:58078/',
service: 'http://devservice.yoho.cn:58077/'
},
subDomains: {
host: '.m.yohobuy.com',
default: '//m.yohobuy.com',
guang: '//guang.m.yohobuy.com',
list: '//list.m.yohobuy.com',
search: '//search.m.yohobuy.com',
huodong: '//huodong.m.yohobuy.com',
activity: '//activity.yohobuy.com',
index: '//m.yohobuy.com'
},
useOneapm: false,
useCache: false,
memcache: {
master: ['192.168.102.205:12111'],
slave: ['192.168.102.205:12111'],
session: ['192.168.102.205:12111'],
timeout: 1000,
retries: 0
},
loggers: {
infoFile: {
name: 'info',
level: 'info',
filename: 'logs/info.log'
},
errorFile: {
name: 'error',
level: 'error',
filename: 'logs/error.log',
handleExceptions: true
},
udp: { // send by udp
level: 'debug', // logger level
host: '192.168.102.162', // influxdb host
port: '4444' // influxdb port
},
console: {
level: 'debug',
colorize: 'all',
prettyPrint: true
}
},
thirdLogin: {
wechat: {
appID: 'wx75e5a7c0c88e45c2',
appSecret: 'ce21ae4a3f93852279175a167e54509b'
}
}
};
if (isProduction) {
Object.assign(module.exports, {
appName: 'm.yohobuy.com',
domains: {
api: 'http://api.yoho.yohoops.org/',
service: 'http://service.yoho.yohoops.org/'
},
memcache: {
master: ['memcache1.yohoops.org:12111', 'memcache2.yohoops.org:12111', 'memcache3.yohoops.org:12111'],
slave: ['memcache1.yohoops.org:12112', 'memcache2.yohoops.org:12112', 'memcache3.yohoops.org:12112'],
session: ['memcache1.yohoops.org:12111', 'memcache2.yohoops.org:12111', 'memcache3.yohoops.org:12111'],
timeout: 1000,
retries: 0
},
useOneapm: true,
useCache: true
});
} else if (isTest) {
Object.assign(module.exports, {
appName: 'm.yohobuy.com for test',
domains: {
api: 'http://testapi.yoho.cn:28078/',
service: 'http://testservice.yoho.cn:28077/'
},
memcache: {
master: ['127.0.0.1:12111'],
slave: ['127.0.0.1:12112'],
session: ['127.0.0.1:12111'],
timeout: 1000,
retries: 0
},
useOneapm: true,
useCache: true
});
}
... ...
/**
* 内容码配置文件
* @author: 赵彪<bill.zhao@yoho.cn>
* @date: 2016/06/23
*/
'use strict';
const saleContentCode = {
boys: {
sale: '153180b9a88c0b565848850c523bb637',
breakCode: 'd763e3f8d208cbed8f100253ea4f8946',
vip: '6b9810a442efe1e6252b134154d36769'
},
girls: {
sale: '0b2d133419a0f7c381306fd3522365e1',
breakCode: '77258d0b526c7b6e243c1419877ead4a',
vip: 'e83f3582df32b6753eed49fda236a755'
},
kids: {
sale: 'de23648d28ee1e8a3f087a9dbac506f8',
breakCode: '3f0898f1089b7bef5f3e071725c7a608',
vip: '664935745012db6e2a96a7d57f75512f'
},
lifestyle: {
sale: '01269e498ff5b07756e0733ec0e88c75',
breakCode: '0020a5762771aa16902a666c9491394e',
vip: '647f1154d30b323ff46c787fc78aef65'
}
};
const guangContentCode = {
special: '89cc20483ee2cbc8a716dcfe2b6c7603'
};
const channelContentCode = {
boys: '8512bf0755cc549ac323f852c9fd945d',
girls: '189b6686065dbd6755dd6906cf03c002',
kids: 'b8c1bff53d4ea60f978926d538620636',
lifestyle: '61cd852c6afcf60660196154f66a3a62',
index: '7ba9118028f9b22090b57341487567eb'
};
const bottomBannerContentCode = {
boys: 'a2ec977c027d0cd9cdccb356ddf16b08',
girls: '8c8bd1b89a22e5895f05882e0825b493'
};
const outletContentCode = 'c19ffa03f053f4cac3690b22c8da26b7';
module.exports = {
sale: saleContentCode,
outlet: outletContentCode,
channel: channelContentCode,
bottom: bottomBannerContentCode,
guang: guangContentCode
};
... ...
/**
* 路由分发
* @author: xuqi<qi.xu@yoho.cn>
* @date: 2016/4/27
*/
module.exports = app => {
// 公共服务
app.use(require('./apps/channel'));
};
... ...
# 代码规范说明文档
开发前请务必仔细阅读,遵守规范,保持团队代码风格统一
## 文件命名
* 中划线分隔小写单词
* Ex: `your-file`
## 缩进
* 统一4个Space
* 建议将编辑器Tab映射成4个Space
## 注释
* 为每个你创建的JS文件添加注释
```
/**
* 对文件实现功能的描述
* @date: 2016-11-11
* @author: name<emial@yoho.cn>
*/
```
* 为重要的函数添加注释
```
/**
* 对函数功能的说明
* @params name paramType 参数描述
* @return name returnType 返回值描述
*/
```
* 为重要的代码、逻辑复杂的代码或者有特殊处理的代码添加注释
```
// Your comments for the code
```
* 减少不必要的注释
类似于:**进入循环****循环结束**等垃圾话的注释请谨慎添加,大家都是程序员,不用你注释也能知道的
## html
* 见名知意,不要有1,2,3这种名字出现
* class、id等属性命名为中划线分隔小写单词
* html中请不要出现不必要的嵌套以及不要将标签滥用,比如使用`a`标签作为不跳转的按钮的标签
* 属性按顺序出现:`id -> class -> name -> data-* -> src,for,type,href -> title,alt -> aria-*,role`
## js
[Link](doc/code-norm/js.md)
## css
[Link](doc/code-norm/css.md)
\ No newline at end of file
... ...
# css代码规范
## 选择器
* 使用class进行样式匹配,而不是id和标签
* 尽量避免使用属性选择器
* 尽可能精确的元素定位
## 规则细节
.ele-header, /*规则1:每个选择器声明总是使用新的一行*/
.ele-body,
.ele-footer { /*规则2:'{' 前需要添加1个空格*/
line-height: 1.2; /*规则3:样式声明以;结束,每个样式声明独占一行*/
font-weight: normal; /*规则4:属性声明的:后添加1个空格*/
margin: 0; /*规则5:属性值为0时不添加单位*/
background-color: #f3d; /*规则6:十六进制小写和缩写*/
}
/*规则7:没组选择器声明之间适用一空行间隔*/
.ele2 {
font-family: "open sans", arial, sans-serif; /*规则8:使用" ",而不是' '*/
padding: 0 1em 2em; /*规则9:适当缩写但不滥用*/
border-top: 1px;
background-color: rgba(0,0,0,.5); /*规则10:颜色值rgba等中不需要增加空格,并且去除浮点数前面不必要的0*/
}
## 声明顺序(不做强制要求,尽量实现)
这是一个选择器内书写CSS属性顺序的大致轮廓,作为最佳实践,我们应该遵循以下顺序:
* Position属性 (position,top,right,z-index...)
* Box Model属性 (display,float,width...)
* Typographic属性 (font,line-height,color,text-align...)
* Visual属性 (background,border,border-radius...)
因为Position属性可以是一个元素脱离正常的文本流并可以覆盖盒模型相关样式,所以Position排第一位。盒模型决定一个元素位置和大小紧跟其后。后面属性属于元素内部或不会对前两者产生影响的,排在后面。
完整属性顺序参考[Recsss](http://twitter.github.com/recess)
## Sass风格
* 控制嵌套层级,禁止超过5层,尽量控制在3层以内
... ...
# JavaScript代码规范
## 行的长度
每行长度不应该超过**120**个字符,如果一行多余120个字符,应该在一个运算符后换行,下一行增加**2**级缩进,即8个空格)
```
doSomething(argument1, argument2, argument3, argument4,
argument5);
```
## 运算符间距
二元运算符前后必须使用一个空格保持表达式的整洁,操作符包括赋值运算符和逻辑运算符
```
var name = 'xuqi'; // GOOD
var name='xuqi'; // BAD
```
## 括号间距
当使用括号时,紧接左括号之后和紧接右括号之前不应该有空格。
```
doSomething(arg); // GODD
doSomething( arg ); // BAD
```
## 变量声明
* 所有变量在使用前应该先定义
* 变量定义应该放在函数开头
* 使用var,const,let表达式定义变量,每行定义一个
* 除了首行,所有行都应该多一层缩进使变量声明对齐
* 初始化的变量放在未初始化的变量之前
* 所有的变量命名必须使用英文单词
* 浮点变量必须指明实部(即便以0.开头)和小数点后一位
```
var name = 'xuqi',
age,
sex,
...;
const $ = require('yoho.jquery');
let i;
```
另外,晦涩的变量名最好给出注释,否则别人很难读懂接下来代码的意思。
## 函数声明
* 函数在使用前应该先定义
* 函数名和开始圆括号之间无空格(包括匿名函数的function关键字与圆括号之间)
* 开始圆括号和结束圆括号之间无空格
* 参数名之间应该在逗号之后保留一个空格
* 开始花括号应该同function关键字保持同一行,结束圆括号和开始花括号之间应该保留一个空格
* 函数体保持一级缩进
```
function doSomething(arg1, arg2) {
doThing1();
doThing2();
}
const method = function() {
doSomething();
};
```
另外,IIFE的标准格式也在这里指出:
```
(function(args) {
//
}(args)); //(args)位于外层括号内
```
## 对象直接量
* 起始左括号应该与表达式保持一行
* 每个属性的键名前保持一个缩进,第一个属性应该在左括号后另一起行
* 每个属性的键名不包含引号,其后跟一个冒号(前无空格,后有空格),然后是值
* 如果属性值为函数,函数体应该在属性名之下另起一行,并且其前后均应保留一个空行
* 一组相关属性的前后插入空行以提高代码的可读性
* 结束的右括号独占一行
```
var person = {
name: 'xuqi',
age: 25,
groupAttr1: xx1,
groupAttr2: xx2,
walk: function() {
//your walk fn
}
};
```
* 当对象字面量作为函数参数时,起始括号应该与函数名同行
```
doSomething({
//do something
});
```
## 命名
### 变量:
* 采用小驼峰命名格式
* 变量命名为名词(区别函数)
* 变量中不使用_
### 函数:
* 采用小驼峰命名格式
* 函数命名为动词(区别变量)
* 函数名中不使用_
### 构造函数:
* 采用大驼峰命名格式
* 命名应该是名词
### 私有成员:
* 一个对象中不希望外部访问的以下划线开头(约定)
## 等号运算符
使用`===`和`!==`,禁止使用`==`和`!=`
## undefined
禁止使用`name === undefined`判断一个变量是否定义。应该使用`typeof(name) === 'undefined'`;
## 常用语句规范
### if语句
```
if (condition) {
doSomething();
} else if (condition1) {
doSomething2();
} else {
soOtherThing();
}
```
### for语句
```
// GOOD
var i;
for (i = 0; i < len; i++) {
doSomething();
}
for (i in collection) {
if (collection.hasOwnProperty(i)) {
doSomething();
}
}
// BAD
for (var i = 0; i < len; i++) {
doSomething();
}
for (i in collection) {
doSomething();
}
```
### while,do语句
```
while (condition) {
doSomething();
}
do {
doSomething();
} while (condition)
```
### switch语句
* 每一个case保持一个缩进
* 每一组语句都应该以break,return等结尾,或者用一行注释表示跳过(falling through)
* 无default的情况也要注释特别说明
```
switch (val) {
case 1:
//nothing
case 2:
doSomething();
break;
default:
doDefault();
}
```
### try语句
```
try {
doSomething();
} catch (err) {
doSomething2();
} finally {
doSomething3();
}
```
## 模块化规范
* 模块开头require加载所有依赖模块
```
var $ = require('yoho.jquery'),
flip = require('../plugin/flip'); //普通文件
require('../plguin/login');
```
* 模块抛出接口应该给予注释说明功能和使用方法
\ No newline at end of file
... ...
##公共头部模拟数据
```javascript
var pageHeader = {
navBack: true,
navTitle: '逛',
navBtn: {
indexUrl: '#',
categoryUrl: '#',
shoppingCartUrl: '#',
mineUrl: '#'
}
};
```
##公共底部模拟数据
```javascript
var pageFooter = true;
```
... ...
# doraemon for everything
## middleware
## views contains **layout、header and footer** partial
\ No newline at end of file
... ...
/**
* 登录判断
* @author: xuqi<qi.xu@yoho.cn>
* @date: 2016/4/25
*/
'use strict';
const helpers = global.yoho.helpers;
module.exports = (req, res, next) => {
if (!req.user.uid) {
if (req.xhr) {
return res.json({
code: 400,
message: '抱歉,您暂未登录!'
});
}
return res.redirect(helpers.urlFormat('/signin.html', {
refer: req.originalUrl
}));
}
next();
};
... ...
/**
* 404 错误
* @return {[type]}
*/
const logger = global.yoho.logger;
exports.notFound = () => {
return (req, res) => {
res.status(404);
if (req.xhr) {
return res.json({
code: 404,
message: '抱歉,页面不存在!'
});
}
return res.render('error/404', {
module: 'common',
page: 'error',
title: '页面不存在 | Yoho!Buy有货 | 潮流购物逛不停',
pageFooter: true,
isErr: true
});
};
};
/**
* 服务器错误
* @return {[type]}
*/
exports.serverError = () => {
return (err, req, res, next) => {
logger.error(`error at path: ${req.url}`);
logger.error(err);
if (!res.headersSent) {
res.status(err.code || 500);
if (req.xhr) {
return res.json({
code: 500,
message: '服务器错误!'
});
}
return res.render('error/500', {
err: err,
module: 'common',
page: 'error',
title: '服务器错误 | Yoho!Buy有货 | 潮流购物逛不停',
pageFooter: true,
isErr: true
});
}
next(err);
};
};
... ...
/**
* 设置页面的module,page默认值
* @author: 赵彪<bill.zhao@yoho.cn>
* @date: 2016/6/22
*/
'use strict';
module.exports = () => {
return (req, res, next) => {
if (!req.xhr) {
const arr = req.path.substring(1).split('/');
Object.assign(res.locals, {
module: arr[0],
page: arr[1]
});
}
next();
};
};
... ...
/**
* 设置 YOHO 数据
* @author: 赵彪<bill.zhao@yoho.cn>
* @date: 2016/6/16
*/
'use strict';
module.exports = () => {
return (req, res, next) => {
let yoho = {
pageChannel: {}
};
const channel = req.query.channel || req.cookies._Channel || 'boys';
// 用于头部颜色控制
yoho.pageChannel[channel] = true;
// 当前频道设置
yoho.channel = channel;
// 判断请求是否来自app
yoho.isApp = req.query.app_version || req.query.appVersion;
Object.assign(res.locals, yoho);
Object.assign(req.yoho, yoho);
next();
};
};
... ...
const _ = require('lodash');
const cookie = global.yoho.cookie;
module.exports = () => {
return (req, res, next) => {
// 从 SESSION 中获取到当前登录用户的 UID
if (req.session && _.isNumber(req.session._LOGIN_UID)) {
req.user.uid = req.session._LOGIN_UID;
}
// session 没有读取到的时候,从 cookie 读取 UID
if (!req.user.uid && req.cookies._UID) {
req.user.uid = cookie.getUid(req);
}
next();
};
};
... ...
/**
* 通用路由处理
* @author: xuqi<qi.xu@yoho.cn>
* @date: 2016/4/28
*/
'use strict';
const router = require('express').Router(); // eslint-disable-line
// const cRoot = './controllers';
module.exports = router;
... ...
<div class="err-page yoho-page">
<h1>404</h1>
</div>
\ No newline at end of file
... ...
<div class="err-page yoho-page">
<h1>500</h1>
</div>
\ No newline at end of file
... ...
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>{{title}}</title>
<meta name="keywords" content="{{keywords}}">
<meta name="description" content="{{description}}">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
<meta http-equiv="cleartype" content="on">
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<meta content="telephone=no" name="format-detection" />
<meta content="email=no" name="format-detection" />
<link rel="dns-prefetch" href="//cdn.yoho.cn">
<link rel="dns-prefetch" href="//static.yohobuy.com">
<script type="text/javascript">
(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);
</script>
{{#if devEnv}}
<link rel="stylesheet" href="//localhost:5004/css/index.css">
{{^}}
<link rel="stylesheet" href="//cdn.yoho.cn/yohoblk-wap/{{version}}/index.css">
{{/if}}
</head>
<body {{#if isPassportPage}}class=passport-body{{/if}} {{#if isStarIndexPage}} class="star-index-bg"{{/if}} {{#if isStarDetailPage}}class="star-class-body"{{/if}}>
<div class="main-wrap">
{{#if systemUpdate}}
{{> updata}}
{{/if}}
{{> header}}
{{{body}}}
{{> footer}}
</div>
{{#wechatShare}}
<script type="text/javascript" src="//res.wx.qq.com/open/js/jweixin-1.1.0.js"></script>
{{/wechatShare}}
{{#if devEnv}}
<script src="//localhost:5004/libs.js"></script>
<script src="//localhost:5004/{{module}}.{{page}}.js"></script>
{{^}}
<script src="//cdn.yoho.cn/yohoblk-wap/{{version}}/libs.js"></script>
<script src="//cdn.yoho.cn/yohoblk-wap/{{version}}/{{module}}.{{page}}.js"></script>
{{/if}}
{{#unless devEnv}}
{{> analysis}}
{{/unless}}
</body>
</html>
... ...
<h1>footer</h1>
\ No newline at end of file
... ...
<h1>header</h1>
\ No newline at end of file
... ...
const shelljs = require('shelljs');
const path = require('path');
const changeFiles = {
js: shelljs.exec('git diff --cached --name-only --diff-filter=ACM | grep .js$', {silent: true}).stdout,
css: shelljs.exec('git diff --cached --name-only --diff-filter=ACM | grep .css$', {silent: true}).stdout
};
const lintPath = {
js: path.resolve('./node_modules/.bin/eslint'),
css: path.resolve('./node_modules/.bin/stylelint')
};
const lintResult = {
js: {},
css: {}
};
const ext = process.platform === 'win32' ? '.cmd' : ''; // Windows 平台需要加后缀
// 在执行检查脚本的时候,不显示 NPM 错误日志
if (!shelljs.grep('npm run -s', path.resolve('./.git/hooks/pre-commit')).stdout.trim()) {
shelljs.sed('-i', 'npm run', 'npm run -s', path.resolve('./.git/hooks/pre-commit'));
}
if (changeFiles.js) {
changeFiles.js = changeFiles.js.replace(/\n/g, ' ');
lintResult.js = shelljs.exec(`${lintPath.js}${ext} -c .eslintrc --cache --fix ${changeFiles.js}`);
}
if (changeFiles.css) {
changeFiles.css = changeFiles.css.replace(/\n/g, ' ');
lintResult.css = shelljs.exec(`${lintPath.css}${ext} --config .stylelintrc ${changeFiles.css}`);
}
if (lintResult.js.code || lintResult.css.code) {
process.exit(lintResult.js.code || lintResult.css.code); // eslint-disable-line
}
... ...
/**
* OneAPM agent configuration
*/
const commonConfig = require('./config/common');
exports.config = {
app_name: [commonConfig.appName],
license_key: 'BwEGA1dRDlQ6357HHQ1AD1xJVkbc9fNfWRtQUwhQG41c5QFWGFIDSQoHc0e8AgMaUlcUVw0=',
logging: {
level: 'info'
},
transaction_events: {
enabled: true
}
};
... ...
{
"name": "yohoblk-wap",
"version": "1.0.0",
"private": true,
"description": "A New Yohobuy Project With Express",
"repository": {
"type": "git",
"url": "http://git.dev.yoho.cn/web/yohoblk-wap.git"
},
"scripts": {
"start": "node app.js",
"dev": "nodemon -e js,hbs -i public/ app.js",
"online": "NODE_ENV=\"production\" node app.js",
"debug": "DEBUG=\"express:*\" nodemon -e js,hbs -i public/ app.js",
"lint-js": "eslint -c .eslintrc --cache --fix .",
"lint-css": "stylelint --config .stylelintrc public/scss/**/*.css",
"precommit": "node lint.js",
"test": "NODE_ENV=test nyc ./node_modules/.bin/ava",
"posttest": "nyc report --reporter=html"
},
"license": "MIT",
"dependencies": {
"bluebird": "^3.4.1",
"body-parser": "^1.15.2",
"connect-memcached": "^0.2.0",
"cookie-parser": "^1.4.3",
"express": "^4.14.0",
"express-handlebars": "^3.0.0",
"express-session": "^1.14.0",
"influxdb-winston": "^1.0.1",
"lodash": "^4.13.1",
"md5": "^2.1.0",
"memcached": "^2.2.1",
"moment": "^2.14.1",
"morgan": "^1.7.0",
"oneapm": "^1.2.20",
"passport": "^0.3.2",
"passport-local": "^1.0.0",
"passport-qq": "0.0.3",
"passport-sina": "^0.1.0",
"passport-strategy": "^1.0.0",
"passport-weixin": "^0.1.0",
"request-promise": "^3.0.0",
"serve-favicon": "^2.3.0",
"uuid": "^2.0.2",
"winston": "^2.2.0",
"winston-daily-rotate-file": "^1.1.4",
"yoho-node-lib": "0.0.17"
},
"devDependencies": {
"autoprefixer": "^6.3.7",
"eslint": "^3.0.1",
"eslint-config-yoho": "^1.0.1",
"gulp": "^3.9.1",
"gulp-cssnano": "^2.1.2",
"gulp-ftp": "^1.1.0",
"gulp-postcss": "^6.1.0",
"gulp-sourcemaps": "^2.0.0-alpha",
"gulp-util": "^3.0.7",
"husky": "^0.11.4",
"nodemon": "1.9.2",
"postcss-assets": "^4.0.1",
"postcss-cachebuster": "^0.1.3",
"postcss-calc": "^5.2.1",
"postcss-center": "^1.0.0",
"postcss-clearfix": "^1.0.0",
"postcss-crip": "^2.0.0",
"postcss-position": "^0.5.0",
"postcss-pxtorem": "^3.3.1",
"postcss-short": "^1.4.0",
"postcss-sprites": "^3.1.2",
"postcss-use": "^2.2.0",
"precss": "^1.4.0",
"shelljs": "^0.7.0",
"stylelint": "^6.9.0",
"stylelint-config-yoho": "^1.2.3",
"webpack": "^1.13.1",
"webpack-dev-server": "^1.14.1",
"webpack-stream": "^3.1.0",
"yoho-fastclick": "^1.0.6",
"yoho-iscroll": "^5.2.0",
"yoho-jquery": "^2.2.4",
"yoho-jquery-lazyload": "^1.9.7",
"yoho-mlellipsis": "0.0.3",
"yoho-node-lib": "0.0.17",
"yoho-swiper": "^3.3.1"
}
}
... ...
{
"apps": [
{
"name": "yohoblk-wap",
"script": "app.js",
"instances": "max",
"exec_mode": "cluster",
"env": {
"PORT": 6004
}
}
]
}
\ No newline at end of file
... ...
No preview for this file type
No preview for this file type
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>
Created by FontForge 20120731 at Wed Jun 29 15:45:02 2016
By admin
</metadata>
<defs>
<font id="iconfont" horiz-adv-x="1024" >
<font-face
font-family="iconfont"
font-weight="500"
font-stretch="normal"
units-per-em="1024"
panose-1="2 0 6 3 0 0 0 0 0 0"
ascent="896"
descent="-128"
x-height="792"
bbox="-0.75 -128 3943 896.75"
underline-thickness="50"
underline-position="-100"
unicode-range="U+0078-E64C"
/>
<missing-glyph horiz-adv-x="374"
d="M34 0v682h272v-682h-272zM68 34h204v614h-204v-614z" />
<glyph glyph-name=".notdef" horiz-adv-x="374"
d="M34 0v682h272v-682h-272zM68 34h204v614h-204v-614z" />
<glyph glyph-name=".null" horiz-adv-x="0"
/>
<glyph glyph-name="nonmarkingreturn" horiz-adv-x="341"
/>
<glyph glyph-name="x" unicode="x" horiz-adv-x="1001"
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
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
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" />
<glyph glyph-name="uniE600" unicode="&#xe600;" horiz-adv-x="1463"
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" />
<glyph glyph-name="uniE601" unicode="&#xe601;"
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
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
v525h-134z" />
<glyph glyph-name="uniE602" unicode="&#xe602;" horiz-adv-x="1323"
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
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" />
<glyph glyph-name="uniE603" unicode="&#xe603;"
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" />
<glyph glyph-name="uniE604" unicode="&#xe604;"
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" />
<glyph glyph-name="uniE605" unicode="&#xe605;"
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" />
<glyph glyph-name="uniE606" unicode="&#xe606;" horiz-adv-x="1000"
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
t-63.5 -26.5t-63.5 26.5t-26.5 63.5t26.5 63.5t63.5 26.5z" />
<glyph glyph-name="uniE607" unicode="&#xe607;" horiz-adv-x="1643"
d="M547 286h-1l45 -46l248 239l-45 46l-201 -194l-195 201l-46 -44z" />
<glyph glyph-name="uniE608" unicode="&#xe608;" horiz-adv-x="1821"
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" />
<glyph glyph-name="uniE609" unicode="&#xe609;" horiz-adv-x="1821"
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" />
<glyph glyph-name="uniE60A" unicode="&#xe60a;"
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" />
<glyph glyph-name="uniE60B" unicode="&#xe60b;" horiz-adv-x="1344"
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
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" />
<glyph glyph-name="uniE60C" unicode="&#xe60c;"
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" />
<glyph glyph-name="uniE60D" unicode="&#xe60d;" horiz-adv-x="1685"
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
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
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
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
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" />
<glyph glyph-name="uniE60E" unicode="&#xe60e;" horiz-adv-x="3958"
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
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
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
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
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
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
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
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" />
<glyph glyph-name="uniE60F" unicode="&#xe60f;"
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
t92.5 -222.5t223 -92z" />
<glyph glyph-name="uniE610" unicode="&#xe610;"
d="M245 384l-9 9l472 472l80 -80l-400 -401l400 -401l-80 -80l-472 472z" />
<glyph glyph-name="uniE611" unicode="&#xe611;"
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
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
h-231z" />
<glyph glyph-name="uniE612" unicode="&#xe612;"
d="M951 77h-878l439 614z" />
<glyph glyph-name="uniE613" unicode="&#xe613;"
d="M512 77l-439 614h878z" />
<glyph glyph-name="uniE614" unicode="&#xe614;"
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" />
<glyph glyph-name="uniE615" unicode="&#xe615;"
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" />
<glyph glyph-name="uniE616" unicode="&#xe616;"
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" />
<glyph glyph-name="uniE617" unicode="&#xe617;" horiz-adv-x="1030"
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
t26.5 -6l271 -198l297 396q9 12 23.5 14t26.5 -7t14 -23.5t-7 -26.5z" />
<glyph glyph-name="uniE618" unicode="&#xe618;"
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" />
<glyph glyph-name="uniE619" unicode="&#xe619;"
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
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" />
<glyph glyph-name="uniE61A" unicode="&#xe61a;"
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
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" />
<glyph glyph-name="uniE61B" unicode="&#xe61b;"
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
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" />
<glyph glyph-name="uniE61C" unicode="&#xe61c;"
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" />
<glyph glyph-name="uniE61D" unicode="&#xe61d;"
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" />
<glyph glyph-name="uniE61E" unicode="&#xe61e;"
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
M205 51l-83 -32l32 83z" />
<glyph glyph-name="uniE61F" unicode="&#xe61f;"
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" />
<glyph glyph-name="uniE620" unicode="&#xe620;"
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
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
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" />
<glyph glyph-name="uniE621" unicode="&#xe621;"
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
v-80h832v80q0 20 -14 34t-34 14zM608 768h-192v63h192v-63z" />
<glyph glyph-name="uniE622" unicode="&#xe622;" horiz-adv-x="1173"
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
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" />
<glyph glyph-name="uniE623" unicode="&#xe623;"
d="M835 660l-60 63l-263 -275v0l-263 275l-60 -63l262 -276l-262 -276l60 -63l263 275v0l263 -275l60 63l-262 276z" />
<glyph glyph-name="uniE624" unicode="&#xe624;" horiz-adv-x="1000"
d="M459 850h55h54v-120v-142v-120h191h191v-109h-191h-191v-191v-190h-109v190v191h-191h-190q-1 37 -1 109h191h191v382z" />
<glyph glyph-name="uniE625" unicode="&#xe625;" horiz-adv-x="1000"
d="M77 468h873v-109h-873v109z" />
<glyph glyph-name="uniE626" unicode="&#xe626;"
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" />
<glyph glyph-name="uniE627" unicode="&#xe627;"
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
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
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" />
<glyph glyph-name="uniE628" unicode="&#xe628;"
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
t-149.5 -149.5t-55 -206t55 -206t149.5 -149.5t205.5 -55zM528 222v-59h-58v59h58zM470 648h58v-349h-58v349z" />
<glyph glyph-name="uniE629" unicode="&#xe629;"
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
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
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" />
<glyph glyph-name="uniE62A" unicode="&#xe62a;"
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" />
<glyph glyph-name="uniE62B" unicode="&#xe62b;"
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" />
<glyph glyph-name="uniE62C" unicode="&#xe62c;" horiz-adv-x="1048"
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
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" />
<glyph glyph-name="uniE62D" unicode="&#xe62d;"
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
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" />
<glyph glyph-name="uniE62E" unicode="&#xe62e;" horiz-adv-x="1639"
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
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" />
<glyph glyph-name="uniE62F" unicode="&#xe62f;"
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
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
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" />
<glyph glyph-name="uniE630" unicode="&#xe630;"
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
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
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
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" />
<glyph glyph-name="uniE631" unicode="&#xe631;"
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
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
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
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
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
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
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
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
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
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" />
<glyph glyph-name="uniE632" unicode="&#xe632;"
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
" />
<glyph glyph-name="uniE633" unicode="&#xe633;" horiz-adv-x="1304"
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
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
t74 -31t31 -74z" />
<glyph glyph-name="uniE634" unicode="&#xe634;" horiz-adv-x="1476"
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" />
<glyph glyph-name="uniE635" unicode="&#xe635;"
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
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
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" />
<glyph glyph-name="uniE636" unicode="&#xe636;"
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" />
<glyph glyph-name="uniE637" unicode="&#xe637;"
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
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" />
<glyph glyph-name="uniE638" unicode="&#xe638;" horiz-adv-x="1335"
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
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" />
<glyph glyph-name="uniE639" unicode="&#xe639;"
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
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
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" />
<glyph glyph-name="uniE63A" unicode="&#xe63a;"
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
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
v109zM381 210h66v-66h-66v66z" />
<glyph glyph-name="uniE63B" unicode="&#xe63b;" horiz-adv-x="1199"
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
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
t-14.5 -34.5v-150h-449v150q0 20 -15 34.5t-35 14.5z" />
<glyph glyph-name="uniE63C" unicode="&#xe63c;" horiz-adv-x="1048"
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
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
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
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" />
<glyph glyph-name="uniE63D" unicode="&#xe63d;"
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
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
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" />
<glyph glyph-name="uniE63E" unicode="&#xe63e;"
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
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
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
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" />
<glyph glyph-name="uniE63F" unicode="&#xe63f;" horiz-adv-x="1025"
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
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
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" />
<glyph glyph-name="uniE640" unicode="&#xe640;"
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
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
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
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" />
<glyph glyph-name="uniE641" unicode="&#xe641;" horiz-adv-x="1045"
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
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
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" />
<glyph glyph-name="uniE642" unicode="&#xe642;"
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
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" />
<glyph glyph-name="uniE643" unicode="&#xe643;" horiz-adv-x="1124"
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
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" />
<glyph glyph-name="uniE644" unicode="&#xe644;"
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
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
q44 0 80 21l-27 28q-8 7 -7.5 18t7.5 18z" />
<glyph glyph-name="uniE645" unicode="&#xe645;"
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
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
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
t-25.5 10.5h-111v73h111z" />
<glyph glyph-name="uniE646" unicode="&#xe646;"
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
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" />
<glyph glyph-name="uniE647" unicode="&#xe647;"
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
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" />
<glyph glyph-name="uniE648" unicode="&#xe648;"
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
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" />
<glyph glyph-name="uniE649" unicode="&#xe649;"
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
t-22 15.5zM751 552v83h-473v-83h206v-298h-72v237h-87v-237h-66v-84h506v84h-193v119h151v83h-151v96h179z" />
<glyph glyph-name="uniE64A" unicode="&#xe64a;"
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
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
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" />
<glyph glyph-name="uniE64B" unicode="&#xe64b;"
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
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
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
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" />
<glyph glyph-name="uniE64C" unicode="&#xe64c;"
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
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
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" />
</font>
</defs></svg>
... ...
No preview for this file type
No preview for this file type
/**
* Yohobuy 构建脚本
* @author: xuqi<qi.xu@yoho.cn>
* @date: 2016/4/25
*/
'use strict';
const gulp = require('gulp');
const gutil = require('gulp-util');
const ftp = require('gulp-ftp');
const postcss = require('gulp-postcss');
const sourcemaps = require('gulp-sourcemaps');
const cssnano = require('gulp-cssnano');
const webpack = require('webpack');
const WebpackDevServer = require('webpack-dev-server');
const webpackConfig = require('./webpack.config.js');
const env = {
dev: Symbol('development'),
pro: Symbol('production')
};
const config = require('../package.json');
const ftpConfig = {
host: '218.94.75.58',
user: 'php',
pass: 'yoho9646'
};
const distRoot = `dist/${config.name}`;
const dist = {
js: `${distRoot}/${config.version}`,
css: `${distRoot}/${config.version}`,
assets: `${distRoot}/assets`,
img: `${distRoot}/assets/img`,
font: `${distRoot}/assets/font`
};
/**
* postcss plugins for both dev and pro
* @parem et Symbol
*/
const postcssPlugin = (et) => {
var sprites = {
spritesmith: {
padding: 2
},
filterBy(file) {
// base64 的图片没有 url 过滤掉
if (file.url) {
return Promise.resolve();
}
return Promise.reject();
},
groupBy(file) {
var group = file.url.split('/')[1];
group = group === '' ? 'yo' : group;
file.retina = true;
return group ? Promise.resolve(group) : Promise.reject(group);
}
},
assets,
plugins;
// assets & sprites config in both dev and pro
if (et === env.pro) {
assets = {
loadPaths: [dist.img, dist.font],
relativeTo: dist.css
};
Object.assign(sprites, {
basePath: dist.img,
stylesheetPath: dist.css,
spritePath: dist.img
});
} else if (et === env.dev) {
assets = {
loadPaths: ['img/', 'font/'],
relativeTo: 'css/'
};
Object.assign(sprites, {
basePath: 'img/',
stylesheetPath: 'css/',
spritePath: 'img/'
});
}
plugins = [
require('autoprefixer')({
browsers: ['> 1%']
}),
require('precss'),
require('postcss-sprites').default(sprites),
require('postcss-assets')(assets),
require('postcss-calc'),
require('postcss-pxtorem')({
rootValue: 40,
unitPrecision: 5, // 保留5位小数字
minPixelValue: 2, // 小于 2 时,不转换
selectorBlackList: [], // 选择器黑名单,可以使用正则
propWhiteList: [] // 属性名称为空,表示替换所有属性的值
}),
// 可选
require('postcss-use')({
modules: ['postcss-clearfix', 'postcss-crip', 'postcss-short', 'postcss-center', 'postcss-position']
})
];
if (et === env.pro) {
plugins.push(require('postcss-cachebuster')({
imagesPath: `/${dist.img}`,
cssPath: `/${dist.css}`
}));
}
return plugins;
};
// default
gulp.task('default', ['postcss-dev', 'postcss-watch', 'webpack-dev-server']);
// ge
gulp.task('ge', ['postcss', 'webpack']);
// dist
gulp.task('dist', ['ge'], () => {
var ftpstream = ftp(ftpConfig);
return gulp.src('dist/**/')
.pipe(ftpstream)
.pipe(gutil.noop());
});
// postcss compile in dev
gulp.task('postcss-dev', () => {
return gulp.src('scss/index.css')
.pipe(sourcemaps.init())
.pipe(postcss(postcssPlugin(env.dev)))
.pipe(sourcemaps.write('.'))
.pipe(gulp.dest('css/'));
});
// postcss file watch
gulp.task('postcss-watch', () => {
gulp.watch('scss/**/*.css', ['postcss-dev']);
});
// copy assets
gulp.task('assets', ['img', 'font']);
// copy img
gulp.task('img', () => {
return gulp.src('img/**/*')
.pipe(gulp.dest(dist.img));
});
// copy font
gulp.task('font', () => {
return gulp.src('font/*')
.pipe(gulp.dest(dist.font));
});
// postcss compile in pro
gulp.task('postcss', ['assets'], () => {
return gulp.src('scss/index.css')
.pipe(postcss(postcssPlugin(env.pro)))
.pipe(cssnano())
.pipe(gulp.dest(dist.css));
});
// webpack dev server
gulp.task('webpack-dev-server', () => {
var devConfig = Object.assign({}, webpackConfig, {
debug: true
});
new WebpackDevServer(webpack(devConfig), {
contentBase: '.',
publicPath: '//localhost:5004/',
hot: true,
stats: {
colors: true
},
headers: {
'Access-Control-Allow-Origin': '*'
}
}).listen(5004, '0.0.0.0', (err) => {
if (err) {
throw new gutil.PluginError('webpack-dev-server', err);
}
gutil.log('[webpack-serve]', 'http://localhost:5004/');
});
});
// webpack compile in pro
gulp.task('webpack', (done) => {
var proConfig = Object.assign({}, webpackConfig);
proConfig.output.path = dist.js;
proConfig.plugins.push(new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
}
}));
webpack(proConfig, (err, stats) => {
if (err) {
throw new gutil.PluginError('webpack', err);
}
gutil.log('[webpack compile]:', stats.endTime - stats.startTime, 'ms');
done();
});
});
... ...
@use postcss-clearfix ;
.clearfix {
clear: fix;
}
*,
*:before,
*:after {
box-sizing: border-box;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
html,
body {
width: 100%;
font-size: 24px;
font-family: helvetica, Arial, "黑体";
line-height: 1.4;
}
a {
outline: none;
color: #000;
text-decoration: none;
}
*:focus {
outline: none;
}
.hide {
display: none;
}
.overflow-hidden {
overflow: hidden;
}
.main-wrap {
position: relative;
margin-right: auto;
margin-left: auto;
max-width: 640px;
width: 100%;
}
... ...
@font-face {
font-family: "iconfont";
src: resolve('iconfont.eot'); /* IE9 */
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- */
}
.iconfont {
text-decoration: none;
font-style: normal;
font-size: 24px;
font-family: "iconfont" !important;
-webkit-font-smoothing: antialiased;
-webkit-text-stroke-width: 0.4px;
-moz-osx-font-smoothing: grayscale;
}
... ...
@import "reset";
@import "font";
@import "common";
@import "swiper";
... ...
/* stylelint-disable */
/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */
/**
* 1. Change the default font family in all browsers (opinionated).
* 2. Prevent adjustments of font size after orientation changes in IE and iOS.
*/
html {
font-family: sans-serif; /* 1 */
-ms-text-size-adjust: 100%; /* 2 */
-webkit-text-size-adjust: 100%; /* 2 */
}
/**
* Remove the margin in all browsers (opinionated).
*/
body {
margin: 0;
}
/* HTML5 display definitions
========================================================================== */
/**
* Add the correct display in IE 9-.
* 1. Add the correct display in Edge, IE, and Firefox.
* 2. Add the correct display in IE.
*/
article,
aside,
details, /* 1 */
figcaption,
figure,
footer,
header,
main, /* 2 */
menu,
nav,
section,
summary { /* 1 */
display: block;
}
/**
* Add the correct display in IE 9-.
*/
audio,
canvas,
progress,
video {
display: inline-block;
}
/**
* Add the correct display in iOS 4-7.
*/
audio:not([controls]) {
display: none;
height: 0;
}
/**
* Add the correct vertical alignment in Chrome, Firefox, and Opera.
*/
progress {
vertical-align: baseline;
}
/**
* Add the correct display in IE 10-.
* 1. Add the correct display in IE.
*/
template, /* 1 */
[hidden] {
display: none;
}
/* Links
========================================================================== */
/**
* 1. Remove the gray background on active links in IE 10.
* 2. Remove gaps in links underline in iOS 8+ and Safari 8+.
*/
a {
background-color: transparent; /* 1 */
-webkit-text-decoration-skip: objects; /* 2 */
}
/**
* Remove the outline on focused links when they are also active or hovered
* in all browsers (opinionated).
*/
a:active,
a:hover {
outline-width: 0;
}
/* Text-level semantics
========================================================================== */
/**
* 1. Remove the bottom border in Firefox 39-.
* 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
*/
abbr[title] {
border-bottom: none; /* 1 */
text-decoration: underline; /* 2 */
text-decoration: underline dotted; /* 2 */
}
/**
* Prevent the duplicate application of `bolder` by the next rule in Safari 6.
*/
b,
strong {
font-weight: inherit;
}
/**
* Add the correct font weight in Chrome, Edge, and Safari.
*/
b,
strong {
font-weight: bolder;
}
/**
* Add the correct font style in Android 4.3-.
*/
dfn {
font-style: italic;
}
/**
* Correct the font size and margin on `h1` elements within `section` and
* `article` contexts in Chrome, Firefox, and Safari.
*/
h1 {
font-size: 2em;
margin: 0.67em 0;
}
/**
* Add the correct background and color in IE 9-.
*/
mark {
background-color: #ff0;
color: #000;
}
/**
* Add the correct font size in all browsers.
*/
small {
font-size: 80%;
}
/**
* Prevent `sub` and `sup` elements from affecting the line height in
* all browsers.
*/
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
/* Embedded content
========================================================================== */
/**
* Remove the border on images inside links in IE 10-.
*/
img {
border-style: none;
}
/**
* Hide the overflow in IE.
*/
svg:not(:root) {
overflow: hidden;
}
/* Grouping content
========================================================================== */
/**
* 1. Correct the inheritance and scaling of font size in all browsers.
* 2. Correct the odd `em` font sizing in all browsers.
*/
code,
kbd,
pre,
samp {
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
}
/**
* Add the correct margin in IE 8.
*/
figure {
margin: 1em 40px;
}
/**
* 1. Add the correct box sizing in Firefox.
* 2. Show the overflow in Edge and IE.
*/
hr {
box-sizing: content-box; /* 1 */
height: 0; /* 1 */
overflow: visible; /* 2 */
}
/* Forms
========================================================================== */
/**
* 1. Change font properties to `inherit` in all browsers (opinionated).
* 2. Remove the margin in Firefox and Safari.
*/
button,
input,
select,
textarea {
font: inherit; /* 1 */
margin: 0; /* 2 */
}
/**
* Restore the font weight unset by the previous rule.
*/
optgroup {
font-weight: bold;
}
/**
* Show the overflow in IE.
* 1. Show the overflow in Edge.
*/
button,
input { /* 1 */
overflow: visible;
}
/**
* Remove the inheritance of text transform in Edge, Firefox, and IE.
* 1. Remove the inheritance of text transform in Firefox.
*/
button,
select { /* 1 */
text-transform: none;
}
/**
* 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`
* controls in Android 4.
* 2. Correct the inability to style clickable types in iOS and Safari.
*/
button,
html [type="button"], /* 1 */
[type="reset"],
[type="submit"] {
-webkit-appearance: button; /* 2 */
}
/**
* Remove the inner border and padding in Firefox.
*/
button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner {
border-style: none;
padding: 0;
}
/**
* Restore the focus styles unset by the previous rule.
*/
button:-moz-focusring,
[type="button"]:-moz-focusring,
[type="reset"]:-moz-focusring,
[type="submit"]:-moz-focusring {
outline: 1px dotted ButtonText;
}
/**
* Change the border, margin, and padding in all browsers (opinionated).
*/
fieldset {
border: 1px solid #c0c0c0;
margin: 0 2px;
padding: 0.35em 0.625em 0.75em;
}
/**
* 1. Correct the text wrapping in Edge and IE.
* 2. Correct the color inheritance from `fieldset` elements in IE.
* 3. Remove the padding so developers are not caught out when they zero out
* `fieldset` elements in all browsers.
*/
legend {
box-sizing: border-box; /* 1 */
color: inherit; /* 2 */
display: table; /* 1 */
max-width: 100%; /* 1 */
padding: 0; /* 3 */
white-space: normal; /* 1 */
}
/**
* Remove the default vertical scrollbar in IE.
*/
textarea {
overflow: auto;
}
/**
* 1. Add the correct box sizing in IE 10-.
* 2. Remove the padding in IE 10-.
*/
[type="checkbox"],
[type="radio"] {
box-sizing: border-box; /* 1 */
padding: 0; /* 2 */
}
/**
* Correct the cursor style of increment and decrement buttons in Chrome.
*/
[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
height: auto;
}
/**
* 1. Correct the odd appearance in Chrome and Safari.
* 2. Correct the outline style in Safari.
*/
[type="search"] {
-webkit-appearance: textfield; /* 1 */
outline-offset: -2px; /* 2 */
}
/**
* Remove the inner padding and cancel buttons in Chrome and Safari on OS X.
*/
[type="search"]::-webkit-search-cancel-button,
[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
/**
* Correct the text style of placeholders in Chrome, Edge, and Safari.
*/
::-webkit-input-placeholder {
color: inherit;
opacity: 0.54;
}
/**
* 1. Correct the inability to style clickable types in iOS and Safari.
* 2. Change font properties to `inherit` in Safari.
*/
::-webkit-file-upload-button {
-webkit-appearance: button; /* 1 */
font: inherit; /* 2 */
}
/* stylelint-enable */
\ No newline at end of file
... ...
/* stylelint-disable */
/**
* Swiper 3.0.8
* Most modern mobile touch slider and framework with hardware accelerated transitions
*
* http://www.idangero.us/swiper/
*
* Copyright 2015, Vladimir Kharlampidi
* The iDangero.us
* http://www.idangero.us/
*
* Licensed under MIT
*
* Released on: June 14, 2015
*/
.swiper-container {
position: relative;
/* Fix of Webkit flickering */
z-index: 1;
overflow: hidden;
margin: 0 auto;
}
.swiper-container-no-flexbox .swiper-slide {
float: left;
}
.swiper-container-vertical > .swiper-wrapper {
-ms-flex-direction: column;
-webkit-flex-direction: column;
flex-direction: column;
-webkit-box-orient: vertical;
-moz-box-orient: vertical;
}
.swiper-wrapper {
position: relative;
z-index: 1;
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
-webkit-box-sizing: content-box;
-moz-box-sizing: content-box;
box-sizing: content-box;
width: 100%;
height: 100%;
-webkit-transition-property: -webkit-transform;
-moz-transition-property: -moz-transform;
-o-transition-property: -o-transform;
-ms-transition-property: -ms-transform;
transition-property: transform;
-webkit-transform-style: preserve-3d;
-moz-transform-style: preserve-3d;
-ms-transform-style: preserve-3d;
transform-style: preserve-3d;
}
.swiper-container-android .swiper-slide,
.swiper-wrapper {
-webkit-transform: translate3d(0px, 0, 0);
-moz-transform: translate3d(0px, 0, 0);
-o-transform: translate(0px, 0px);
-ms-transform: translate3d(0px, 0, 0);
transform: translate3d(0px, 0, 0);
}
.swiper-container-multirow > .swiper-wrapper {
-ms-flex-wrap: wrap;
-webkit-flex-wrap: wrap;
flex-wrap: wrap;
-webkit-box-lines: multiple;
-moz-box-lines: multiple;
}
.swiper-container-free-mode > .swiper-wrapper {
margin: 0 auto;
-webkit-transition-timing-function: ease-out;
-moz-transition-timing-function: ease-out;
-ms-transition-timing-function: ease-out;
-o-transition-timing-function: ease-out;
transition-timing-function: ease-out;
}
.swiper-slide {
position: relative;
-ms-flex: 0 0 auto;
-webkit-flex-shrink: 0;
flex-shrink: 0;
width: 100%;
height: 100%;
-webkit-transform-style: preserve-3d;
-moz-transform-style: preserve-3d;
-ms-transform-style: preserve-3d;
transform-style: preserve-3d;
}
/* a11y */
.swiper-container .swiper-notification {
position: absolute;
top: 0;
left: 0;
z-index: -1000;
opacity: 0;
pointer-events: none;
}
/* IE10 Windows Phone 8 Fixes */
.swiper-wp8-horizontal {
-ms-touch-action: pan-y;
touch-action: pan-y;
}
.swiper-wp8-vertical {
-ms-touch-action: pan-x;
touch-action: pan-x;
}
/* Arrows */
.swiper-button-prev,
.swiper-button-next {
position: absolute;
top: 50%;
z-index: 10;
margin-top: -22px;
width: 27px;
height: 44px;
background-position: center;
-moz-background-size: 27px 44px;
-webkit-background-size: 27px 44px;
background-size: 27px 44px;
background-repeat: no-repeat;
cursor: pointer;
}
.swiper-button-prev.swiper-button-disabled,
.swiper-button-next.swiper-button-disabled {
opacity: 0.35;
cursor: auto;
pointer-events: none;
}
.swiper-button-prev,
.swiper-container-rtl .swiper-button-next {
right: auto;
left: 10px;
background-image: url("data:image/svg+xml;charset=utf-8, %3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");
}
.swiper-button-prev.swiper-button-black,
.swiper-container-rtl .swiper-button-next.swiper-button-black {
background-image: url("data:image/svg+xml;charset=utf-8, %3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E");
}
.swiper-button-prev.swiper-button-white,
.swiper-container-rtl .swiper-button-next.swiper-button-white {
background-image: url("data:image/svg+xml;charset=utf-8, %3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E");
}
.swiper-button-next,
.swiper-container-rtl .swiper-button-prev {
right: 10px;
left: auto;
background-image: url("data:image/svg+xml;charset=utf-8, %3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");
}
.swiper-button-next.swiper-button-black,
.swiper-container-rtl .swiper-button-prev.swiper-button-black {
background-image: url("data:image/svg+xml;charset=utf-8, %3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E");
}
.swiper-button-next.swiper-button-white,
.swiper-container-rtl .swiper-button-prev.swiper-button-white {
background-image: url("data:image/svg+xml;charset=utf-8, %3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E");
}
/* Pagination Styles */
.swiper-pagination {
position: absolute;
z-index: 10;
text-align: center;
-webkit-transition: 300ms;
-moz-transition: 300ms;
-o-transition: 300ms;
transition: 300ms;
-webkit-transform: translate3d(0, 0, 0);
-ms-transform: translate3d(0, 0, 0);
-o-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
}
.swiper-pagination.swiper-pagination-hidden {
opacity: 0;
}
.swiper-pagination-bullet {
display: inline-block;
width: 8px;
height: 8px;
border-radius: 100%;
background: #000;
opacity: 0.2;
}
.swiper-pagination-clickable .swiper-pagination-bullet {
cursor: pointer;
}
.swiper-pagination-white .swiper-pagination-bullet {
background: #fff;
}
.swiper-pagination-bullet-active {
background: #007aff;
opacity: 1;
}
.swiper-pagination-white .swiper-pagination-bullet-active {
background: #fff;
}
.swiper-pagination-black .swiper-pagination-bullet-active {
background: #000;
}
.swiper-container-vertical > .swiper-pagination {
top: 50%;
right: 10px;
-webkit-transform: translate3d(0px, -50%, 0);
-moz-transform: translate3d(0px, -50%, 0);
-o-transform: translate(0px, -50%);
-ms-transform: translate3d(0px, -50%, 0);
transform: translate3d(0px, -50%, 0);
}
.swiper-container-vertical > .swiper-pagination .swiper-pagination-bullet {
display: block;
margin: 5px 0;
}
.swiper-container-horizontal > .swiper-pagination {
bottom: 10px;
left: 0;
width: 100%;
}
.swiper-container-horizontal > .swiper-pagination .swiper-pagination-bullet {
margin: 0 5px;
}
/* 3D Container */
.swiper-container-3d {
-webkit-perspective: 1200px;
-moz-perspective: 1200px;
-o-perspective: 1200px;
perspective: 1200px;
}
.swiper-container-3d .swiper-wrapper,
.swiper-container-3d .swiper-slide,
.swiper-container-3d .swiper-slide-shadow-left,
.swiper-container-3d .swiper-slide-shadow-right,
.swiper-container-3d .swiper-slide-shadow-top,
.swiper-container-3d .swiper-slide-shadow-bottom,
.swiper-container-3d .swiper-cube-shadow {
-webkit-transform-style: preserve-3d;
-moz-transform-style: preserve-3d;
-ms-transform-style: preserve-3d;
transform-style: preserve-3d;
}
.swiper-container-3d .swiper-slide-shadow-left,
.swiper-container-3d .swiper-slide-shadow-right,
.swiper-container-3d .swiper-slide-shadow-top,
.swiper-container-3d .swiper-slide-shadow-bottom {
position: absolute;
top: 0;
left: 0;
z-index: 10;
width: 100%;
height: 100%;
pointer-events: none;
}
.swiper-container-3d .swiper-slide-shadow-left {
background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0)));
/* Safari 4+, Chrome */
background-image: -webkit-linear-gradient(right, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
/* Chrome 10+, Safari 5.1+, iOS 5+ */
background-image: -moz-linear-gradient(right, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
/* Firefox 3.6-15 */
background-image: -o-linear-gradient(right, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
/* Opera 11.10-12.00 */
background-image: linear-gradient(to left, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
/* Firefox 16+, IE10, Opera 12.50+ */
}
.swiper-container-3d .swiper-slide-shadow-right {
background-image: -webkit-gradient(linear, right top, left top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0)));
/* Safari 4+, Chrome */
background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
/* Chrome 10+, Safari 5.1+, iOS 5+ */
background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
/* Firefox 3.6-15 */
background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
/* Opera 11.10-12.00 */
background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
/* Firefox 16+, IE10, Opera 12.50+ */
}
.swiper-container-3d .swiper-slide-shadow-top {
background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0)));
/* Safari 4+, Chrome */
background-image: -webkit-linear-gradient(bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
/* Chrome 10+, Safari 5.1+, iOS 5+ */
background-image: -moz-linear-gradient(bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
/* Firefox 3.6-15 */
background-image: -o-linear-gradient(bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
/* Opera 11.10-12.00 */
background-image: linear-gradient(to top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
/* Firefox 16+, IE10, Opera 12.50+ */
}
.swiper-container-3d .swiper-slide-shadow-bottom {
background-image: -webkit-gradient(linear, left bottom, left top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0)));
/* Safari 4+, Chrome */
background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
/* Chrome 10+, Safari 5.1+, iOS 5+ */
background-image: -moz-linear-gradient(top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
/* Firefox 3.6-15 */
background-image: -o-linear-gradient(top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
/* Opera 11.10-12.00 */
background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
/* Firefox 16+, IE10, Opera 12.50+ */
}
/* Coverflow */
.swiper-container-coverflow .swiper-wrapper {
/* Windows 8 IE 10 fix */
-ms-perspective: 1200px;
}
/* Fade */
.swiper-container-fade.swiper-container-free-mode .swiper-slide {
-webkit-transition-timing-function: ease-out;
-moz-transition-timing-function: ease-out;
-ms-transition-timing-function: ease-out;
-o-transition-timing-function: ease-out;
transition-timing-function: ease-out;
}
.swiper-container-fade .swiper-slide {
pointer-events: none;
}
.swiper-container-fade .swiper-slide .swiper-slide {
pointer-events: none;
}
.swiper-container-fade .swiper-slide-active,
.swiper-container-fade .swiper-slide-active .swiper-slide-active {
pointer-events: auto;
}
/* Cube */
.swiper-container-cube {
overflow: visible;
}
.swiper-container-cube .swiper-slide {
visibility: hidden;
width: 100%;
height: 100%;
-webkit-transform-origin: 0 0;
-moz-transform-origin: 0 0;
-ms-transform-origin: 0 0;
transform-origin: 0 0;
pointer-events: none;
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
-ms-backface-visibility: hidden;
backface-visibility: hidden;
}
.swiper-container-cube.swiper-container-rtl .swiper-slide {
-webkit-transform-origin: 100% 0;
-moz-transform-origin: 100% 0;
-ms-transform-origin: 100% 0;
transform-origin: 100% 0;
}
.swiper-container-cube .swiper-slide-active,
.swiper-container-cube .swiper-slide-next,
.swiper-container-cube .swiper-slide-prev,
.swiper-container-cube .swiper-slide-next + .swiper-slide {
visibility: visible;
pointer-events: auto;
}
.swiper-container-cube .swiper-cube-shadow {
position: absolute;
bottom: 0px;
left: 0;
width: 100%;
height: 100%;
background: #000;
opacity: 0.6;
-webkit-filter: blur(50px);
filter: blur(50px);
}
.swiper-container-cube.swiper-container-vertical .swiper-cube-shadow {
z-index: 0;
}
/* Scrollbar */
.swiper-scrollbar {
position: relative;
border-radius: 10px;
background: rgba(0, 0, 0, 0.1);
-ms-touch-action: none;
}
.swiper-container-horizontal > .swiper-scrollbar {
position: absolute;
bottom: 3px;
left: 1%;
z-index: 50;
width: 98%;
height: 5px;
}
.swiper-container-vertical > .swiper-scrollbar {
position: absolute;
top: 1%;
right: 3px;
z-index: 50;
width: 5px;
height: 98%;
}
.swiper-scrollbar-drag {
position: relative;
top: 0;
left: 0;
width: 100%;
height: 100%;
border-radius: 10px;
background: rgba(0, 0, 0, 0.5);
}
.swiper-scrollbar-cursor-drag {
cursor: move;
}
/* Preloader */
.swiper-lazy-preloader {
position: absolute;
top: 50%;
left: 50%;
z-index: 10;
margin-top: -21px;
margin-left: -21px;
width: 42px;
height: 42px;
-webkit-transform-origin: 50%;
-moz-transform-origin: 50%;
transform-origin: 50%;
-webkit-animation: swiper-preloader-spin 1s steps(12, end) infinite;
-moz-animation: swiper-preloader-spin 1s steps(12, end) infinite;
animation: swiper-preloader-spin 1s steps(12, end) infinite;
}
.swiper-lazy-preloader:after {
display: block;
width: 100%;
height: 100%;
background-image: url("data:image/svg+xml;charset=utf-8, %3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
background-position: 50%;
-webkit-background-size: 100%;
background-size: 100%;
background-repeat: no-repeat;
content: "";
}
.swiper-lazy-preloader-white:after {
background-image: url("data:image/svg+xml;charset=utf-8, %3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%23fff'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
}
@-webkit-keyframes swiper-preloader-spin {
100% {
-webkit-transform: rotate(360deg);
}
}
@keyframes swiper-preloader-spin {
100% {
transform: rotate(360deg);
}
}
/* stylelint-enable */
... ...
@charset "utf-8";
@import "common/index";
... ...
/**
* webpack config
* @author: xuqi<qi.xu@yoho.cn>
* @date: 2016/4/25
*/
'use strict';
const webpack = require('webpack');
const path = require('path');
const _ = require('lodash');
const shelljs = require('shelljs');
var entries = {};
// 构建各模块子页面JS。生成规则module.page.js
shelljs.ls(path.join(__dirname, 'js/**/*.page.js')).forEach((f) => {
var dir = _.slice(f.split('/'), -2); // [modulename, xx.page.js]
// Important
// 生成规则:module.page: './js/module/xx.page.js'
entries[`${dir[0]}.${dir[1].match(/(.*).page.js/)[1]}`] = `./js/${dir.join('/')}`;
entries.libs = [
'yoho-jquery',
'yoho-fastclick',
'yoho-iscroll',
'yoho-jquery-lazyload',
'yoho-mlellipsis',
'yoho-swiper'
];
});
module.exports = {
entry: entries,
output: {
path: path.join(__dirname, 'bundle'), // absolute path
filename: '[name].js'
},
plugins: [
new webpack.optimize.OccurenceOrderPlugin(),
new webpack.optimize.CommonsChunkPlugin({
name: 'libs',
filename: 'libs.js'
}),
new webpack.ProvidePlugin({
$: 'yoho-jquery',
jQuery: 'yoho-jquery',
'window.jQuery': 'yoho-jquery'
})
]
};
... ...
'use strict';
require('../app');
const _ = require('lodash');
const camelCase = global.yoho.camelCase;
const helpers = global.yoho.helpers;
/**
* 根据性别来决定 默认图片获取字段 如果是 2、3
*
* 则优先从cover2 --》 cover1 -- 》 images_url
* 否则优先从cover1 --》 cover2 -- 》 images_url
*
*/
const _procProductImg = (product, gender, yhChannel) => {
if (gender === '2,3' || gender === '2' || gender === '3' && yhChannel === '2') {
return product.cover2 || product.imagesUrl || product.cover1 || '';
}
return product.cover1 || product.imagesUrl || product.cover2 || '';
};
const toArray = (obj) => {
if (_.isArray(obj)) {
return obj;
}
let arr = [];
_.forEach(obj, (v, k) => {
if (_.isObject(v)) {
v._key = k;
} else {
v = {
_key: k,
_value: v
};
}
arr.push(v);
});
return arr;
};
/**
* 按照数组中指定字段排序二维数组
*
* @param array list 需要排序的数组
* @param string key 字段名称
* @param boolean 有 desc 时候降序排列,默认为false
*/
const _sortListByField = (list, key, desc) => {
let array = toArray(list);
array = array.sort((a, b) => {
let matchNumber = /([\d]+)/g;
// 有键,使用键的值排序
if (a[key] && b[key]) {
let numA = +(_.toArray(a[key].match(matchNumber))[0] || 0); // 取第一个出现的数字排序,如果不存在,取0
let numB = +(_.toArray(b[key].match(matchNumber))[0] || 0);
return (desc ? numA > numB : numA < numB) ? -1 : 1;
}
// 无键, 使用本身
let numA = +(_.toArray(a._value.match(matchNumber))[0] || 0);
let numB = +(_.toArray(b._value.match(matchNumber))[0] || 0);
return numA < numB ? -1 : 1;
});
return array;
};
/**
* 商品搜索商品数据处理
*/
exports.processProductList = (list, options) => {
const pruductList = [];
options = Object.assign({
showTags: true,
showNew: true,
showSale: true,
width: 290,
height: 388,
isApp: false,
showPoint: true,
gender: '2,3'
}, options);
list = camelCase(list);
_.forEach(list, (product) => {
// 商品信息有问题,则不显示
if (!product.productId || !product.goodsList.length) {
return;
}
// 如果库存为0,显示已抢完
if (product.storageNum === 0) {
product.noStorage = true;
}
// 市场价和售价一样,则不显示市场价
if (product.marketPrice === product.salesPrice) {
product.marketPrice = false;
}
// 判别默认的商品是否将默认的图片URL赋值到skn
let flag = false;
// 如果设置了默认图片,就取默认的图片
_.forEach(product.goodsList, (goods) => {
if (flag) {
return;
}
if (goods.isDefault === 'Y') {
// product.defaultImages = procProductImg(goods);
product.defaultImages = product.defaultImages;
flag = true;
}
});
// 如果还未赋值,则取第一个skc产品的默认图片
if (!flag) {
product.defaultImages = _procProductImg(product.goodsList[0], product.gender, options.yh_channel);
}
product.isSoonSoldOut = product.isSoonSoldOut === 'Y';
product.url = helpers.urlFormat(`/product/pro_${product.productId}_${product.goodsList[0].goodsId}/${product.cnAlphabet}.html`); // eslint-disable-line
// APP访问需要加附加的参数
// 备注:如果以后APP的接口太多,可以把这边参数提取出来,变成一个公共的方法来生成,便于以后管理维护
if (options.isApp) {
product.url += `?openby:yohobuy={"action":"go.productDetail","params":{"product_skn":'${product.productId}'}}`; // eslint-disable-line
}
if (options.showTags) {
product.tags = {};
product.tags.isNew = options.showNew && product.isNew === 'Y'; // 新品
product.tags.isDiscount = options.showSale && product.isDiscount === 'Y'; // 在售
product.tags.isLimited = product.isLimited === 'Y'; // 限量
product.tags.isYohood = product.isYohood === 'Y'; // YOHOOD
product.tags.midYear = product.midYear === 'Y'; // 年中
product.tags.yearEnd = product.yearEnd === 'Y'; // 年末
product.tags.isAdvance = product.isAdvance === 'Y'; // 再到着
// 打折与即将售完组合显示打折
if (product.isSoonSoldOut && product.tags.isDiscount) {
product.tags.isNew = false;
} else if (product.tags.isDiscount &&
(product.tags.isNew || product.tags.isLimited || product.tags.isYohood || product.tags.isAdvance)) {
// 打折与其它组合则隐藏打折
product.tags.isDiscount = false;
} else if (product.tags.isYohood && product.tags.isNew) {
// YOHOOD和新品组合显示YOHOOD
product.tags.isNew = false;
}
}
pruductList.push(product);
});
return pruductList;
};
/**
* 处理筛选数据
* @param list
* @param string | options
* @return array 处理之后的筛选数据
*/
exports.processFilter = (list, options) => {
const filters = {
classify: []
};
const filtersType = {
brand: {
name: '所有品牌',
title: '品牌',
dataId: 'id',
subsName: 'brandName',
firstSub: 0,
dataType: 'brand',
sortNum: '1'
},
color: {
name: '所有颜色',
title: '颜色',
dataId: 'colorId',
subsName: 'colorName',
firstSub: 0,
dataType: 'color',
sortNum: '3'
},
discount: {
name: '所有商品',
title: '折扣',
dataId: 'key',
subsName: 'name',
firstSub: '0.1,0.9',
dataType: 'p_d',
sortNum: '6'
},
gender: {
name: '所有性别',
title: '性别',
dataId: 'key',
subsName: 'flag',
firstSub: '1,2,3',
dataType: 'gender',
sortNum: '0'
},
groupSort: {
name: '所有品类',
title: '品类',
dataId: 'relationParameter',
subsName: 'categoryName',
firstSub: 0,
dataType: 'sort',
sortNum: '2'
},
priceRange: {
name: '所有价格',
title: '价格',
dataId: 'key',
subsName: 'flag',
firstSub: 0,
dataType: 'price',
sortNum: '5'
},
size: {
name: '所有尺码',
title: '尺码',
dataId: 'sizeId',
subsName: 'sizeName',
firstSub: 0,
dataType: 'size',
sortNum: '4'
}
};
options = Object.assign({
gender: '1,2,3', // 默认选择的性别,默认1,2,3表示所有
exclude: null // 需要排除的字段
}, options);
list = camelCase(list);
_.forEach(list, (item, key) => {
let classify = {
subs: []
};
if (key === 'group_sort' || !filtersType[key]) {
return;
}
if ((options.hideSize && key === 'size') || (options.hideSort && key === 'groupSort')) {
return;
}
classify.dataType = filtersType[key].dataType;
classify.name = filtersType[key].name;
classify.title = filtersType[key].title;
classify.subs.push({
chosed: true,
dataId: filtersType[key].firstSub,
name: filtersType[key].name
});
// 折扣,价格区间,需要排序
if (key === 'discount' || key === 'priceRange') {
item = _sortListByField(item, 'name');
}
_.forEach(item, (sub, index) => {
let subs = {};
if (key === 'discount') {
subs.dataId = sub._key;
} else if (key === 'priceRange') {
subs.dataId = sub._key;
} else if (filtersType[key].dataId === 'key') {
subs.dataId = index;
} else if (filtersType[key].dataId === 'relationParameter') {
subs.dataId = sub.relationParameter['sort']; // eslint-disable-line
} else {
subs.dataId = sub[filtersType[key].dataId];
}
if (key === 'priceRange') {
subs.name = sub._value;
} else if (filtersType[key].subsName === 'flag') {
subs.name = sub;
} else {
subs.name = sub[filtersType[key].subsName];
if (key === 'discount') {
subs.name = subs.name + '折商品';
}
}
classify.subs.push(subs);
});
filters.classify[filtersType[key].sortNum] = classify;
});
return filters;
};
... ...
const _ = require('lodash');
const processTime = require('./time-process');
const camelCase = global.yoho.camelCase;
/**
* 处理楼层数据
* @param {[array]} list
* @return {[array]}
*/
module.exports = (list) => {
const formatData = [];
list = list || [];
list = camelCase(list);
_.forEach(list, (floor) => {
floor[_.camelCase(floor.templateName)] = true;
// 特殊资源位处理
// PLUS
if (floor.singleNameImage && floor.data) {
floor.data.title = {
title: floor.data.title
};
}
// 潮流时装/经典裤裙/时尚靴履/潮人配饰/潮流上装
if (floor.recommendContentOne && floor.data) {
if (floor.data.bigImage && floor.data.bigImage.length > 1) {
floor.data.bigImage = {
bigList: floor.data.bigImage
};
}
}
// OUTLETS
if (floor.titleImage && floor.data) {
if (floor.data.image) {
floor.data.bigImage = {
bigList: [floor.data.image]
};
}
floor.data.title = {
moreName: floor.data.moreName,
moreUrl: floor.data.moreUrl,
title: floor.data.title
};
}
// 折扣专场
if (floor.discountActivity && floor.data && floor.data.list.length) {
_.map(floor.data.list, (item) => {
Object.assign(item, processTime(item.leftTime));
});
}
// 断码区 , 此资源位数据结构比较坑
if (floor.offCodeArea && floor.data && floor.data.list.length) {
floor.data = {
title: floor.data.title,
data: [floor.data.list[0]],
left: [floor.data.list[1]],
right: floor.data.list.slice(2)
};
}
// 会员专享
if (floor.vipFloor && floor.data) {
floor.data.data = floor.data.image;
}
formatData.push(floor);
});
return formatData;
};
... ...
/**
* 需要格式化的时间格式
*/
'use strict';
const helpers = global.yoho.helpers;
const timeFormat = {
y: '剩{y}年{M}月{d}天',
M: '剩{M}月{d}天',
d: '剩{d}天',
h: '剩{h}小时',
m: '剩{m}分钟',
s: '剩{s}秒',
dh: '剩{d}天{h}小时',
dhms: '剩{d}天{h}小时{m}分钟{s}秒',
hms: '剩{h}小时{m}分钟{s}秒',
ms: '剩{m}分钟{s}秒'
};
const anHour = 3600;
const aDay = anHour * 24;
const aMonth = aDay * 30;
const aYear = aMonth * 12;
/**
* 折扣专场专题列表过期时间处理 单位:s
* @param {[string]} time
* @return {[object]}
*/
const processTime = (time) => {
let data = {};
let type = '';
if (time < anHour) {
data.warnColor = true;
data.time = '低于1小时';
} else {
if (time > aYear) {
type = 'y';
} else if (time > aMonth) {
type = 'M';
} else if (time > aDay) {
type = 'dh';
} else {
type = 'h';
}
data.time = helpers.dateDiffFormat(timeFormat[type], time, 's');
}
return data;
};
module.exports = processTime;
... ...