Showing
10 changed files
with
380 additions
and
48 deletions
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; |
apps/models/checklist.js
0 → 100644
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; |
apps/models/checklogs.js
0 → 100644
@@ -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()); |
apps/web/views/action/checklist.hbs
0 → 100644
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> |
apps/web/views/action/checklog.hbs
0 → 100644
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} |
-
Please register or login to post a comment