Authored by 沈志敏

代码检查

1 /** 1 /**
2 * 采集数据 2 * 采集数据
3 * 3 *
4 - * @class Collect 4 + * @class Check
5 * @author shenzm<zhimin.shen@yoho.cn> 5 * @author shenzm<zhimin.shen@yoho.cn>
6 * @date 2016/10/12 6 * @date 2016/10/12
7 */ 7 */
@@ -13,18 +13,26 @@ const moment = require('moment'); @@ -13,18 +13,26 @@ const moment = require('moment');
13 const path = require('path'); 13 const path = require('path');
14 const config = require('../../config/config'); 14 const config = require('../../config/config');
15 const mail = require('../models/mail'); 15 const mail = require('../models/mail');
  16 +const ws = require('../../lib/ws');
  17 +const {
  18 + Checklist,
  19 + Checklogs
  20 +} = require('../models');
16 21
17 -class Collect { 22 +class Check {
18 constructor(projectname, gitlab, branch) { 23 constructor(projectname, gitlab, branch) {
19 this.projectname = projectname; 24 this.projectname = projectname;
20 this.gitlab = gitlab; 25 this.gitlab = gitlab;
21 this.branch = branch; 26 this.branch = branch;
22 - this.buildTime = moment().format('YYYYMMDDHHmmss'); 27 + this.buildTime = new Date().getTime().toString();
23 this.mailOptions = { 28 this.mailOptions = {
24 from: 'automan@yoho.cn', 29 from: 'automan@yoho.cn',
25 - to: 'kai.bi@yoho.cn,zhimin.shen@yoho.cn',  
26 - subject: `项目:${projectname} 代码检查一览` 30 + to: 'webtech@yoho.cn',
  31 + subject: `${projectname}项目 代码检查一览`
27 }; 32 };
  33 + this.id = `${projectname}_${branch}_${this.buildTime}`;
  34 +
  35 + Checklist.insertLog(this.id, projectname, branch, this.buildTime, "starting");
28 } 36 }
29 37
30 get buildPath() { 38 get buildPath() {
@@ -45,7 +53,6 @@ class Collect { @@ -45,7 +53,6 @@ class Collect {
45 if (!sh.test('-e', this.rootPath)) { 53 if (!sh.test('-e', this.rootPath)) {
46 sh.mkdir('-p', this.rootPath); 54 sh.mkdir('-p', this.rootPath);
47 } 55 }
48 -  
49 this.logFile = path.join(this.rootPath, 'check.log'); 56 this.logFile = path.join(this.rootPath, 'check.log');
50 sh.touch(this.logFile); 57 sh.touch(this.logFile);
51 } 58 }
@@ -53,6 +60,7 @@ class Collect { @@ -53,6 +60,7 @@ class Collect {
53 _cloneCode(branch) { 60 _cloneCode(branch) {
54 var self = this; 61 var self = this;
55 this._log('cloning_code'); 62 this._log('cloning_code');
  63 + this._state('cloning_code');
56 let clone_script = `git clone --depth 1 -b ${branch} ${this.gitlab} `; 64 let clone_script = `git clone --depth 1 -b ${branch} ${this.gitlab} `;
57 this._log(`>>>>>>>>> ${clone_script} >>>>>>>>>>>`); 65 this._log(`>>>>>>>>> ${clone_script} >>>>>>>>>>>`);
58 66
@@ -86,6 +94,7 @@ class Collect { @@ -86,6 +94,7 @@ class Collect {
86 _installdep() { 94 _installdep() {
87 var self = this; 95 var self = this;
88 this._log('>>>>>>>> install dependencies >>>>>>>'); 96 this._log('>>>>>>>> install dependencies >>>>>>>');
  97 + this._state('install dependencies');
89 return new Promise((resolve, reject) => { 98 return new Promise((resolve, reject) => {
90 sh.cd(self.buildPath); 99 sh.cd(self.buildPath);
91 100
@@ -115,10 +124,11 @@ class Collect { @@ -115,10 +124,11 @@ class Collect {
115 _checkScript() { 124 _checkScript() {
116 var self = this; 125 var self = this;
117 this._log(`>>>>>>>>> check code >>>>>>>>>>>`); 126 this._log(`>>>>>>>>> check code >>>>>>>>>>>`);
  127 + this._state('check code');
118 return new Promise((reslove, reject) => { 128 return new Promise((reslove, reject) => {
119 sh.cd(self.buildPath); 129 sh.cd(self.buildPath);
120 130
121 - var child = sh.exec('npm run lint-all', { 131 + var child = sh.exec('npm run lint-all -s', {
122 silent: self.silent, 132 silent: self.silent,
123 async: true 133 async: true
124 }); 134 });
@@ -135,13 +145,12 @@ class Collect { @@ -135,13 +145,12 @@ class Collect {
135 self._log(error); 145 self._log(error);
136 } else { 146 } else {
137 self._log('mail sent: ' + info.response); 147 self._log('mail sent: ' + info.response);
  148 + self._state('success');
  149 + Checklogs.insertLog(self.id, dataText);
138 } 150 }
139 - }) 151 + });
140 }); 152 });
141 153
142 - // child.stdout.pipe(fs.createWriteStream(self.logFile, {  
143 - // flags: 'a'  
144 - // }));  
145 child.stderr.pipe(fs.createWriteStream(self.logFile, { 154 child.stderr.pipe(fs.createWriteStream(self.logFile, {
146 flags: 'a' 155 flags: 'a'
147 })); 156 }));
@@ -173,7 +182,16 @@ class Collect { @@ -173,7 +182,16 @@ class Collect {
173 }).catch((e) => { 182 }).catch((e) => {
174 console.error(e); 183 console.error(e);
175 self._log('fail'); 184 self._log('fail');
  185 + self._state('fail');
  186 + });
  187 + }
  188 +
  189 + _state(state) {
  190 + ws.broadcast(`/check/state`, {
  191 + id: this.id,
  192 + state: state
176 }); 193 });
  194 + Checklist.updateState(this.id, state);
177 } 195 }
178 196
179 _log(msg) { 197 _log(msg) {
@@ -181,4 +199,4 @@ class Collect { @@ -181,4 +199,4 @@ class Collect {
181 } 199 }
182 } 200 }
183 201
184 -module.exports = Collect;  
  202 +module.exports = Check;
  1 +'use strict';
  2 +
  3 +const Model = require('./model');
  4 +
  5 +class Checklist extends Model {
  6 +
  7 + constructor() {
  8 + super('checklist');
  9 + }
  10 +
  11 + insertLog(id, projectname, branch, buildTime) {
  12 + this.insert({
  13 + "_id": id,
  14 + "projectname": projectname,
  15 + "branch": branch,
  16 + "buildtime": buildTime
  17 + });
  18 + }
  19 +
  20 + updateState(id, state) {
  21 + this.update({
  22 + _id: id
  23 + }, {
  24 + $set: {
  25 + state: state,
  26 + }
  27 + });
  28 + }
  29 +}
  30 +
  31 +module.exports = Checklist;
  1 +'use strict';
  2 +
  3 +const Model = require('./model');
  4 +
  5 +class Checklogs extends Model {
  6 +
  7 + constructor() {
  8 + super('checklogs');
  9 + }
  10 +
  11 + insertLog(id, text) {
  12 + this.insert({
  13 + "_id": id,
  14 + "text": text
  15 + });
  16 + }
  17 +}
  18 +
  19 +module.exports = Checklogs;
@@ -19,6 +19,8 @@ const TempProductImportModel = require('./temp_product_import'); @@ -19,6 +19,8 @@ const TempProductImportModel = require('./temp_product_import');
19 const MemcachedHostModel = require('./memcached_host'); 19 const MemcachedHostModel = require('./memcached_host');
20 const DegradeModel = require('./degrade'); 20 const DegradeModel = require('./degrade');
21 const DegradeServerModel = require('./degrade_server'); 21 const DegradeServerModel = require('./degrade_server');
  22 +const ChecklistModel = require('./checklist');
  23 +const ChecklogsModel = require('./checklogs');
22 24
23 shelljs.mkdir('-p', config.dbDir); 25 shelljs.mkdir('-p', config.dbDir);
24 26
@@ -38,6 +40,8 @@ const TempProductImport = new TempProductImportModel(); @@ -38,6 +40,8 @@ const TempProductImport = new TempProductImportModel();
38 const MemcachedHost = new MemcachedHostModel(); 40 const MemcachedHost = new MemcachedHostModel();
39 const Degrade = new DegradeModel(); 41 const Degrade = new DegradeModel();
40 const DegradeServer = new DegradeServerModel(); 42 const DegradeServer = new DegradeServerModel();
  43 +const Checklist = new ChecklistModel();
  44 +const Checklogs = new ChecklogsModel();
41 45
42 User.init(); 46 User.init();
43 PageCache.init(); 47 PageCache.init();
@@ -62,5 +66,7 @@ module.exports = { @@ -62,5 +66,7 @@ module.exports = {
62 RestartInfo, 66 RestartInfo,
63 DeleteRestartInfo, 67 DeleteRestartInfo,
64 Degrade, 68 Degrade,
65 - DegradeServer 69 + DegradeServer,
  70 + Checklist,
  71 + Checklogs
66 }; 72 };
1 'use strict'; 1 'use strict';
2 2
3 const schedule = require('node-schedule'); 3 const schedule = require('node-schedule');
  4 +const Router = require('koa-router');
  5 +const moment = require('moment');
4 const Check = require('../../ci/checkcode'); 6 const Check = require('../../ci/checkcode');
5 7
6 const { 8 const {
7 - Project 9 + Project,
  10 + Checklist,
  11 + Checklogs
8 } = require('../../models'); 12 } = require('../../models');
9 13
  14 +const router = new Router();
  15 +
  16 +router.get('/list', async(ctx) => {
  17 + await ctx.render('action/checklist');
  18 +});
  19 +
  20 +router.post('/list/query', async(ctx) => {
  21 + let q = ctx.request.body;
  22 + let start = parseInt(q.start || 0, 10);
  23 + let length = parseInt(q.length || 10, 10);
  24 + let draw = parseInt(q.draw, 10);
  25 +
  26 + let sort = {buildtime: -1};
  27 + if (q.order && q.order.length > 0) {
  28 + let col = q.order[0].column;
  29 + let dir = q.order[0].dir === 'desc' ? -1 : 1;
  30 +
  31 + col = parseInt(col, 10);
  32 + if (q.columns && q.columns.length > col) {
  33 + sort = {};
  34 + sort[q.columns[col].data] = dir;
  35 + }
  36 + }
  37 +
  38 + let logs = await Checklist.cfind({}).sort(sort).skip(start).limit(length).exec();
  39 + let total = await Checklist.count();
  40 +
  41 + logs.forEach(l => {
  42 + l.buildtime = moment(Number(l.buildtime)).format('YYYY-MM-DD HH:mm:ss');
  43 + });
  44 +
  45 + ctx.body = {
  46 + draw: draw,
  47 + recordsTotal: total,
  48 + recordsFiltered: total,
  49 + data: logs
  50 + };
  51 +});
  52 +
  53 +router.get('/log', async(ctx) => {
  54 + await ctx.render('action/checklog');
  55 +});
  56 +
  57 +router.post('/log/query', async(ctx) => {
  58 + let q = ctx.request.body;
  59 + let data;
  60 + if (!q.id) {
  61 + data = "未找到相应id的数据";
  62 + } else {
  63 + data = await Checklogs.findById(q.id);
  64 + data = (data || {}).text;
  65 + }
  66 +
  67 + ctx.body = {
  68 + data: data
  69 + }
  70 +});
  71 +
  72 +router.post('/exec', async(ctx) => {
  73 + let q = ctx.request.body;
  74 +
  75 + if (!q.name || !q.branch) {
  76 + ctx.body = {
  77 + msg: "请输入正确的项目名及分支名"
  78 + }
  79 + } else {
  80 + let project = await Project.findByName(q.name);
  81 +
  82 + new Check(project.name, project.gitlab, q.branch).check();
  83 + ctx.body = {
  84 + code: 200
  85 + }
  86 + }
  87 +});
  88 +
10 module.exports = { 89 module.exports = {
  90 + router,
11 async check() { 91 async check() {
12 let rule = new schedule.RecurrenceRule(); 92 let rule = new schedule.RecurrenceRule();
13 -  
14 - // rule.dayOfWeek = [0, new schedule.Range(1, 6)];    
15 - // rule.hour = 23;  
16 - // rule.minute = 59;    
17 - // schedule.scheduleJob(rule, function() {  
18 - // console.log("执行任务");  
19 -  
20 - // let projects = await Project.findAll();  
21 - // if (!projects || !projects.length) {  
22 - // return;  
23 - // }  
24 -  
25 - // projects.forEach(async(p) => {  
26 - // if( p.name !== 'yohobuywap-node') {  
27 - // return;  
28 - // }  
29 -  
30 - // //new Check(p.gitlab, 'master').check();  
31 - // new Check(p.gitlab, 'feature/checkcode').check();  
32 - // });  
33 - // });  
34 - console.log("执行任务");  
35 -  
36 - let projects = await Project.findAll();  
37 - if (!projects || !projects.length) {  
38 - return;  
39 - } 93 + let projects = await Project.findAll();
  94 + if (!projects || !projects.length) {
  95 + return;
  96 + }
40 97
  98 + rule.dayOfWeek = [0, new schedule.Range(1, 6)];  
  99 + rule.hour = 23;
  100 + rule.minute = 59;  
  101 + schedule.scheduleJob(rule, function() {
41 projects.forEach(async(p) => { 102 projects.forEach(async(p) => {
42 - if(p.name !== 'yohobuywap-node') { 103 + if (p.name !== 'yohobuywap-node') { // todo 暂时只检查wap站
43 return; 104 return;
44 } 105 }
45 -  
46 - //new Check(p.name, p.gitlab, 'master').check();  
47 - new Check(p.name, p.gitlab, 'feature/checkcode').check(); 106 + new Check(p.name, p.gitlab, 'master').check();
48 }); 107 });
49 - } 108 + });
  109 + },
50 }; 110 };
@@ -19,7 +19,7 @@ const deploy = require('./actions/deploy'); @@ -19,7 +19,7 @@ const deploy = require('./actions/deploy');
19 const api = require('./actions/api'); 19 const api = require('./actions/api');
20 const abuseProtection = require('./actions/abuse_protection'); 20 const abuseProtection = require('./actions/abuse_protection');
21 const crawler = require('./actions/crawler'); 21 const crawler = require('./actions/crawler');
22 - 22 +const checkcode = require('./actions/checkcode').router;
23 const noAuth = new Router(); 23 const noAuth = new Router();
24 const base = new Router(); 24 const base = new Router();
25 25
@@ -45,6 +45,7 @@ module.exports = function(app) { @@ -45,6 +45,7 @@ module.exports = function(app) {
45 base.use('/users', users.routes(), users.allowedMethods()); 45 base.use('/users', users.routes(), users.allowedMethods());
46 // base.use('/hotfix', hotfix.routes(), hotfix.allowedMethods()); 46 // base.use('/hotfix', hotfix.routes(), hotfix.allowedMethods());
47 base.use('/operation', operationLog.routes(), operationLog.allowedMethods()); 47 base.use('/operation', operationLog.routes(), operationLog.allowedMethods());
  48 + base.use('/check', checkcode.routes(), checkcode.allowedMethods());
48 base.use('/page_cache', pageCache.routes(), pageCache.allowedMethods()); 49 base.use('/page_cache', pageCache.routes(), pageCache.allowedMethods());
49 base.use('/cdn_cache', cdnCache.routes(), cdnCache.allowedMethods()); 50 base.use('/cdn_cache', cdnCache.routes(), cdnCache.allowedMethods());
50 base.use('/product_cache', productCache.routes(), productCache.allowedMethods()); 51 base.use('/product_cache', productCache.routes(), productCache.allowedMethods());
  1 +<div class="pageheader">
  2 + <div class="media">
  3 + <div class="pageicon pull-left">
  4 + <i class="fa fa-th-list"></i>
  5 + </div>
  6 + <div class="media-body">
  7 + <ul class="breadcrumb">
  8 + <li><a href="/"><i class="glyphicon glyphicon-home"></i></a></li>
  9 + <li><a href="/servers">系统管理</a></li>
  10 + <li>代码检查记录</li>
  11 + </ul>
  12 + <h4>代码检查记录一览</h4>
  13 + </div>
  14 + </div>
  15 + <!-- media -->
  16 +</div>
  17 +
  18 +<div class="contentpanel project-index-page">
  19 + <div class="panel panel-default">
  20 + <div class="panel-heading">
  21 + <div class="pull-right">
  22 + <a class="btn btn-success btn-rounded mr20 check-btn"><i class="glyphicon glyphicon-plus"></i> 新增检查</a>
  23 + </div>
  24 + <h4 class="panel-title">检查记录</h4>
  25 + </div>
  26 + <div class="panel-body">
  27 + <table id="table-oper-log" class="table table-striped table-bordered building-table">
  28 + <thead>
  29 + <tr>
  30 + <th>项目名</th>
  31 + <th>分支名</th>
  32 + <th>状态</th>
  33 + <th>检查时间</th>
  34 + <th>操作</th>
  35 + </tr>
  36 + </thead>
  37 + </table>
  38 + </div>
  39 + </div>
  40 +</div>
  41 +
  42 +<script>
  43 +
  44 + $(document).on('ready pjax:success', function() {
  45 + var table = $("#table-oper-log").DataTable({
  46 + pageLength: 25,
  47 + retrieve: true,
  48 + responsive: true,
  49 + processing: true,
  50 + serverSide: true,
  51 + ajax: {
  52 + url: '/check/list/query',
  53 + type: "POST"
  54 + },
  55 + columns: [
  56 + {data: "projectname"},
  57 + {data: "branch"},
  58 + {data: "state"},
  59 + {data: "buildtime"},
  60 + {data: "_id"}
  61 + ],
  62 + order: [[3, 'desc']],
  63 + columnDefs: [{
  64 + targets: 2,
  65 + render: function(data, type, row) {
  66 + var color = 'warning';
  67 + if (data == 'success') {
  68 + color = 'success';
  69 + } else if (data == 'fail') {
  70 + color = 'danger';
  71 + }
  72 +
  73 + var id = row._id.split('_');
  74 + id = id[id.length - 1];
  75 + var html = '<span id="b-' + id + '" class="label label-' + color + '">';
  76 + if (data != 'success' && data != 'fail') {
  77 + html += '<i class="fa fa-spinner fa-spin fa-fw margin-bottom"></i>';
  78 + }
  79 + html += '<span class="state">' + data + '</span></span>';
  80 + return html;
  81 + }
  82 + }, {
  83 + targets: 4,
  84 + render: function(data, type, row) {
  85 + return '<button class="btn btn-success btn-log" data-id="' + data + '">查看</button>';
  86 + }
  87 + }]
  88 + });
  89 +
  90 + $(this).on('draw.dt', function() {
  91 + $('.btn-log').click(function() {
  92 + var id = $(this).data('id');
  93 + location.href = '/check/log?id=' + id;
  94 + });
  95 + });
  96 +
  97 + $('.check-btn').click(function() {
  98 + var i = layer.prompt({
  99 + title: '输入项目名及分支名(格式为 项目:分支)',
  100 + value: 'xxx:xx'
  101 + }, function(value) {
  102 + value = value.replace(/x/g,'').split(":");
  103 +
  104 + var projectname = value[0];
  105 + var branch = value[1];
  106 +
  107 + if (!projectname || !branch) {
  108 + layer.msg('请输入正确的项目名及分支名');
  109 + return;
  110 + }
  111 +
  112 + $.post('/check/exec', {
  113 + name: projectname,
  114 + branch: branch
  115 + }, function(ret) {
  116 + if (ret.code == 200) {
  117 + table.ajax.reload();
  118 + layer.close(i);
  119 + } else {
  120 + layer.msg(ret.msg, {icon: 5});
  121 + }
  122 + });
  123 + });
  124 + });
  125 + });
  126 +
  127 + $(function(){
  128 + var ws = io();
  129 +
  130 + ws.on('connect', function() {
  131 + ws.on('/check/state', function(data) {
  132 + var id = data.id.split('_');
  133 + id = id[id.length - 1];
  134 +
  135 + var $dom = $('#b-' + id);
  136 + $dom.find('.state').text(data.state);
  137 + if (data.state == 'success') {
  138 + $dom.removeClass('label-warning').addClass('label-success')
  139 + $dom.find('i').remove();
  140 + } else if (data.state == 'fail') {
  141 + $dom.removeClass('label-warning').addClass('label-danger');
  142 + $dom.find('i').remove();
  143 + }
  144 + });
  145 + });
  146 +
  147 + ws.on('error', function() {
  148 + console.log('connect fail');
  149 + });
  150 + });
  151 +</script>
  1 +<div class="pageheader">
  2 + <div class="media">
  3 + <div class="pageicon pull-left">
  4 + <i class="fa fa-th-list"></i>
  5 + </div>
  6 + <div class="media-body">
  7 + <ul class="breadcrumb">
  8 + <li><a href="/"><i class="glyphicon glyphicon-home"></i></a></li>
  9 + <li><a href="/servers">系统管理</a></li>
  10 + <li>代码检查记录</li>
  11 + </ul>
  12 + <h4>代码检查记录详情</h4>
  13 + </div>
  14 + </div>
  15 + <!-- media -->
  16 +</div>
  17 +
  18 +<div class="contentpanel project-index-page">
  19 + <div class="panel panel-default">
  20 + <div class="panel-heading">
  21 + <div class="pull-right">
  22 + <a href="" class="tooltips panel-minimize"><i class="fa fa-minus"></i></a>
  23 + </div>
  24 + <h4 class="panel-title">检查详情</h4>
  25 + </div>
  26 + <div class="panel-body">
  27 + <pre class="log"></pre>
  28 + </div>
  29 + </div>
  30 +</div>
  31 +
  32 +<script>
  33 + $(document).on('ready pjax:success', function() {
  34 + var id = location.search.replace('?','');
  35 + id = id.split('=')[1];
  36 +
  37 + $.post('/check/log/query', {
  38 + id: id
  39 + }, function(ret) {
  40 + if (ret && ret.data) {
  41 + $('pre.log').html(ret.data)
  42 + }
  43 + });
  44 + });
  45 +</script>
@@ -43,6 +43,7 @@ @@ -43,6 +43,7 @@
43 <li><a href="/servers/setting">服务器配置</a></li> 43 <li><a href="/servers/setting">服务器配置</a></li>
44 <li><a href="/users/setting">用户管理</a></li> 44 <li><a href="/users/setting">用户管理</a></li>
45 <li><a href="/operation/log">操作记录</a></li> 45 <li><a href="/operation/log">操作记录</a></li>
  46 + <li><a href="/check/list">代码检查记录</a></li>
46 </ul> 47 </ul>
47 </li> 48 </li>
48 {{/if}} 49 {{/if}}
@@ -4,4 +4,4 @@ @@ -4,4 +4,4 @@
4 @Author: 贤心 4 @Author: 贤心
5 @Blog: sentsin.com 5 @Blog: sentsin.com
6 6
7 - */.layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}*html{background-image:url(about:blank);background-attachment:fixed}html #layui_layer_skinlayercss{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;box-shadow:1px 1px 50px rgba(0,0,0,.3);border-radius:2px;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.3);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-moves{position:absolute;border:3px solid #666;border:3px solid rgba(0,0,0,.5);cursor:move;background-color:#fff;background-color:rgba(255,255,255,.3);filter:alpha(opacity=50)}.layui-layer-load{background:url(default/loading-0.gif) center center no-repeat #fff}.layui-layer-ico{background:url(default/icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}@-webkit-keyframes bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim{-webkit-animation-name:bounceIn;animation-name:bounceIn}@-webkit-keyframes bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.03);transform:scale(1.03)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.03);-ms-transform:scale(1.03);transform:scale(1.03)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:bounceOut;animation-name:bounceOut;-webkit-animation-duration:.2s;animation-duration:.2s}@-webkit-keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:zoomInDown;animation-name:zoomInDown}@-webkit-keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:fadeInUpBig;animation-name:fadeInUpBig}@-webkit-keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:zoomInLeft;animation-name:zoomInLeft}@-webkit-keyframes rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:rollIn;animation-name:rollIn}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:shake;animation-name:shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:42px;line-height:42px;border-bottom:1px solid #eee;font-size:14px;color:#333;overflow:hidden;background-color:#F8F8F8;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:15px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:0 -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 10px 12px;pointer-events:auto}.layui-layer-btn a{height:28px;line-height:28px;margin:0 6px;padding:0 15px;border:1px solid #dedede;background-color:#f1f1f1;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.7}.layui-layer-btn .layui-layer-btn0{border-color:#4898d5;background-color:#2e8ded;color:#fff}.layui-layer-dialog{min-width:260px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;font-size:14px;overflow:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe .layui-layer-content{overflow:hidden}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(default/loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(default/loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(default/loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:5px 10px;font-size:12px;_float:left;border-radius:3px;box-shadow:1px 1px 3px rgba(0,0,0,.3);background-color:#F90;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#F90}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:1px;border-bottom-style:solid;border-bottom-color:#F90}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#BBB5B5;border:none}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}.layui-layer-iconext{background:url(default/icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:220px;height:30px;margin:0 auto;line-height:30px;padding:0 5px;border:1px solid #ccc;box-shadow:1px 1px 5px rgba(0,0,0,.1) inset;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;border-bottom:1px solid #ccc;background-color:#eee;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;cursor:default;overflow:hidden}.layui-layer-tab .layui-layer-title span.layui-layer-tabnow{height:43px;border-left:1px solid #ccc;border-right:1px solid #ccc;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.xubox_tab_layer{display:block}.xubox_tabclose{position:absolute;right:10px;top:5px;cursor:pointer}.layui-layer-photos{-webkit-animation-duration:1s;animation-duration:1s}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgbar,.layui-layer-imguide{display:none}.layui-layer-imgnext,.layui-layer-imgprev{position:absolute;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:10px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:10px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:absolute;left:0;bottom:0;width:100%;height:32px;line-height:32px;background-color:rgba(0,0,0,.8);background-color:#000\9;filter:Alpha(opacity=80);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}  
  7 + */.layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}*html{background-image:url(about:blank);background-attachment:fixed}html #layui_layer_skinlayercss{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;box-shadow:1px 1px 50px rgba(0,0,0,.3);border-radius:2px;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.3);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-moves{position:absolute;border:3px solid #666;border:3px solid rgba(0,0,0,.5);cursor:move;background-color:#fff;background-color:rgba(255,255,255,.3);filter:alpha(opacity=50)}.layui-layer-load{background:url(default/loading-0.gif) center center no-repeat #fff}.layui-layer-ico{background:url(default/icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}@-webkit-keyframes bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim{-webkit-animation-name:bounceIn;animation-name:bounceIn}@-webkit-keyframes bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.03);transform:scale(1.03)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.03);-ms-transform:scale(1.03);transform:scale(1.03)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:bounceOut;animation-name:bounceOut;-webkit-animation-duration:.2s;animation-duration:.2s}@-webkit-keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:zoomInDown;animation-name:zoomInDown}@-webkit-keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:fadeInUpBig;animation-name:fadeInUpBig}@-webkit-keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:zoomInLeft;animation-name:zoomInLeft}@-webkit-keyframes rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:rollIn;animation-name:rollIn}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:shake;animation-name:shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:42px;line-height:42px;border-bottom:1px solid #eee;font-size:14px;color:#333;overflow:hidden;background-color:#F8F8F8;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:15px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:0 -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 10px 12px;pointer-events:auto}.layui-layer-btn a{height:28px;line-height:28px;margin:0 6px;padding:0 15px;border:1px solid #dedede;background-color:#f1f1f1;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.7}.layui-layer-btn .layui-layer-btn0{border-color:#4898d5;background-color:#2e8ded;color:#fff}.layui-layer-dialog{min-width:260px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;font-size:14px;overflow:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe .layui-layer-content{overflow:hidden}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(default/loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(default/loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(default/loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:5px 10px;font-size:12px;_float:left;border-radius:3px;box-shadow:1px 1px 3px rgba(0,0,0,.3);background-color:#F90;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#F90}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:1px;border-bottom-style:solid;border-bottom-color:#F90}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#BBB5B5;border:none}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}.layui-layer-iconext{background:url(default/icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:320px;height:30px;margin:0 auto;line-height:30px;padding:0 5px;border:1px solid #ccc;box-shadow:1px 1px 5px rgba(0,0,0,.1) inset;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;border-bottom:1px solid #ccc;background-color:#eee;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;cursor:default;overflow:hidden}.layui-layer-tab .layui-layer-title span.layui-layer-tabnow{height:43px;border-left:1px solid #ccc;border-right:1px solid #ccc;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.xubox_tab_layer{display:block}.xubox_tabclose{position:absolute;right:10px;top:5px;cursor:pointer}.layui-layer-photos{-webkit-animation-duration:1s;animation-duration:1s}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgbar,.layui-layer-imguide{display:none}.layui-layer-imgnext,.layui-layer-imgprev{position:absolute;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:10px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:10px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:absolute;left:0;bottom:0;width:100%;height:32px;line-height:32px;background-color:rgba(0,0,0,.8);background-color:#000\9;filter:Alpha(opacity=80);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}