@arkxos/arkos-app-gateway-manage 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/README.md +36 -0
  2. package/ark_dist/ark-meta.json +75 -0
  3. package/ark_dist/ark_userChunk_1.js +5 -0
  4. package/ark_dist/ark_userChunk_2.js +49 -0
  5. package/ark_dist/css/views/views-CreateGateway.41b2bde6.css +297 -0
  6. package/ark_dist/favicon.ico +0 -0
  7. package/ark_dist/img/404.png +0 -0
  8. package/ark_dist/img/auth_banner.jpg +0 -0
  9. package/ark_dist/img/avatar.jpg +0 -0
  10. package/ark_dist/img/avatar2.gif +0 -0
  11. package/ark_dist/img/avatar3.gif +0 -0
  12. package/ark_dist/img/loginbg.svg +1 -0
  13. package/ark_dist/img/logo-r.png +0 -0
  14. package/ark_dist/img/logo.png +0 -0
  15. package/ark_dist/img/no-widgets.svg +57 -0
  16. package/ark_dist/img/tasks-example.png +0 -0
  17. package/ark_dist/img/ver.svg +236 -0
  18. package/ark_dist/index.html +132 -0
  19. package/ark_dist/js/app.e014b7a5.js +1 -0
  20. package/ark_dist/js/views/views-CreateGateway.7db295a9.js +3 -0
  21. package/ark_dist/js/views/views-CreateGateway.7db295a9.js.LICENSE.txt +1 -0
  22. package/ark_dist/js/views/views-CreateGateway.7db295a9.js.map +1 -0
  23. package/ark_proxy/entry.js +30 -0
  24. package/ark_proxy_es/entry.js +18 -0
  25. package/package.json +156 -0
  26. package/scripts/check.js +13 -0
  27. package/scripts/meta.js +21 -0
  28. package/scripts/prepublishOnly.js +28 -0
  29. package/src/api/apidoc_api.js +35 -0
  30. package/src/api/authority.js +161 -0
  31. package/src/api/balanced_api.js +101 -0
  32. package/src/api/client_api.js +68 -0
  33. package/src/api/count_api.js +62 -0
  34. package/src/api/gateway-manage/client_api.js +68 -0
  35. package/src/api/gateway-manage/open_client.js +188 -0
  36. package/src/api/gateway_api.js +81 -0
  37. package/src/api/global_function.js +278 -0
  38. package/src/api/global_variable.js +35 -0
  39. package/src/api/groovyscript_api.js +130 -0
  40. package/src/api/ip_api.js +47 -0
  41. package/src/api/monitor_api.js +24 -0
  42. package/src/api/regserver_api.js +224 -0
  43. package/src/api/request.js +107 -0
  44. package/src/assets/font_1930435_u2cpsigmd9d.js +38 -0
  45. package/src/assets/font_ma6wg7gw3td/demo.css +539 -0
  46. package/src/assets/font_ma6wg7gw3td/demo_index.html +674 -0
  47. package/src/assets/font_ma6wg7gw3td/iconfont.css +105 -0
  48. package/src/assets/font_ma6wg7gw3td/iconfont.eot +0 -0
  49. package/src/assets/font_ma6wg7gw3td/iconfont.js +1 -0
  50. package/src/assets/font_ma6wg7gw3td/iconfont.json +163 -0
  51. package/src/assets/font_ma6wg7gw3td/iconfont.svg +92 -0
  52. package/src/assets/font_ma6wg7gw3td/iconfont.ttf +0 -0
  53. package/src/assets/font_ma6wg7gw3td/iconfont.woff +0 -0
  54. package/src/assets/font_ma6wg7gw3td/iconfont.woff2 +0 -0
  55. package/src/assets/logo.png +0 -0
  56. package/src/assets/particles.json +110 -0
  57. package/src/auto-imports.d.ts +307 -0
  58. package/src/component/BoxCard.vue +156 -0
  59. package/src/component/ClientInfo.vue +82 -0
  60. package/src/component/GroovyScriptTable.vue +74 -0
  61. package/src/component/PanThumb/index.vue +149 -0
  62. package/src/component/RouteAccessChart.vue +85 -0
  63. package/src/component/RouteInfo.vue +146 -0
  64. package/src/component/RouteRequestCount.vue +126 -0
  65. package/src/component/TextHoverEffect/Mallki.vue +120 -0
  66. package/src/configs/subApp.ts +9 -0
  67. package/src/entrance/libProperties.ts +30 -0
  68. package/src/entrance/libTypes.ts +27 -0
  69. package/src/main.ts +13 -0
  70. package/src/plugins/index.ts +11 -0
  71. package/src/router/constantRoutes.js +155 -0
  72. package/src/router/loadComponent.js +29 -0
  73. package/src/views/AddClientGateway.vue +253 -0
  74. package/src/views/AddGatewayClient.vue +360 -0
  75. package/src/views/AddGroovyScript.vue +337 -0
  76. package/src/views/ApiCount.vue +291 -0
  77. package/src/views/ApiDoc.vue +293 -0
  78. package/src/views/ApiMonitor.vue +292 -0
  79. package/src/views/ClientList.vue +217 -0
  80. package/src/views/CreateBalanced.vue +341 -0
  81. package/src/views/CreateClient.vue +171 -0
  82. package/src/views/CreateGateway.vue +836 -0
  83. package/src/views/GatewayList.vue +322 -0
  84. package/src/views/GatewayTopology.vue +245 -0
  85. package/src/views/IpList.vue +218 -0
  86. package/src/views/LoadBalanced.vue +389 -0
  87. package/src/views/Main.vue +98 -0
@@ -0,0 +1,293 @@
1
+ <template>
2
+ <div>
3
+ <el-row :gutter="18">
4
+ <el-col :span="4">
5
+ <el-card shadow="always">
6
+ <span style="font-size: 18pt; font-weight: bold;">接口文档</span>
7
+ <el-tree :data="apiTreeData" :props="defaultProps" @node-click="handleNodeClick" :expand-on-click-node="false" style="margin-top: 20px;">
8
+ <span slot-scope="{ node, data }">
9
+ <span style="font-size: 10pt;">{{ node.label }}</span>
10
+ <span>
11
+ <el-button size="mini" circle icon="el-icon-edit" title="编辑"
12
+ style="border: 0px; margin-left: 0px; font-size: 10pt; padding: 2px;"
13
+ @click="() => handleNodeEdit(data)" :disabled="handleType=='edit' && id != data.id" ></el-button>
14
+ <el-button v-show="isNotGroups(node.data.code)" size="mini" circle icon="el-icon-view"
15
+ title="详情" style="border: 0px; margin-left: 0px; font-size: 10pt; padding: 2px;"
16
+ @click="() => handleNodeView(data)"></el-button>
17
+ </span>
18
+ </span>
19
+ </el-tree>
20
+ </el-card>
21
+ </el-col>
22
+ <el-col :span="20">
23
+ <!-- 说明 -->
24
+ <el-card shadow="always">
25
+ <div class="clearfix">
26
+ <i class="el-icon-monitor"></i>
27
+ <span style="font-weight: bold;">{{infoForm.name}}</span>
28
+ <span v-show="infoForm.isItem" style="margin-left: 50px;">
29
+ <i class="el-icon-position"></i>
30
+ <span style="font-size: 11pt;">
31
+ <el-tag size="mini" style="font-weight: bold;">{{infoForm.id}}</el-tag>
32
+ </span>
33
+ </span>
34
+ <span v-show="infoForm.isItem" style="margin-left: 30px;">
35
+ <i class="el-icon-link"></i>
36
+ <span style="font-size: 11pt;">
37
+ <el-tag size="mini" type="success" style="font-weight: bold;">{{infoForm.path}}</el-tag>
38
+ </span>
39
+ </span>
40
+ <span v-show="infoForm.isItem" style="margin-left: 30px;">
41
+ <i class="el-icon-connection"></i>
42
+ <span style="font-size: 11pt;">
43
+ <el-tag size="mini" type="success" style="font-weight: bold;">{{infoForm.uri}}</el-tag>
44
+ </span>
45
+ </span>
46
+ </div>
47
+ </el-card>
48
+ <!-- 在线markdown编辑器 https://gitee.com/wCHCw/mavonEditor -->
49
+ <span v-show="handleType=='edit'">
50
+ <mavon-editor v-show="handleType=='edit'" v-model="content" :toolbars="toolbars" @save="handleSave" style="height: 700px; margin-top: 18px;" />
51
+ <!-- 提交 -->
52
+ <el-button v-show="handleType=='edit'" type="primary" style="margin-left: 47%; margin-top: 20px;" @click="handleSave">保存</el-button>
53
+ </span>
54
+
55
+ <span v-show="handleType==''">
56
+ <mavon-editor v-show="handleType==''" v-model="content" :subfield="false" :defaultOpen="'preview'" :toolbarsFlag="false"
57
+ :editable="false" :scrollStyle="true" :ishljs="true" style="margin-top: 18px; " />
58
+ </span>
59
+ </el-col>
60
+ </el-row>
61
+
62
+ <el-drawer v-model="drawer" :direction="direction" :before-close="handleClose" :with-header="false" size="24%">
63
+ <!-- 父组件传参与子组件方法监听 -->
64
+ <routeInfoComponent ref="routeInfo" :infoForm="infoForm"></routeInfoComponent>
65
+ </el-drawer>
66
+ </div>
67
+ </template>
68
+
69
+ <script>
70
+
71
+ import {apiDocList,saveApiDoc,findByApiDoc} from '../api/apidoc_api.js'
72
+ import routeInfoComponent from '../component/RouteInfo.vue'
73
+
74
+ export default {
75
+ data() {
76
+ return {
77
+ id:'',
78
+ handleType: '',
79
+ isEdit: false,
80
+ drawer: false,
81
+ direction: 'rtl',
82
+ infoForm:{
83
+ name:'API接口'
84
+ },
85
+ tableData: [],
86
+ content: '', //输入的数据
87
+ toolbars: {
88
+ bold: true, // 粗体
89
+ italic: true, // 斜体
90
+ header: true, // 标题
91
+ underline: true, // 下划线
92
+ mark: true, // 标记
93
+ superscript: true, // 上角标
94
+ quote: true, // 引用
95
+ ol: true, // 有序列表
96
+ link: true, // 链接
97
+ imagelink: true, // 图片链接
98
+ help: true, // 帮助
99
+ code: true, // code
100
+ table: true, // 表格
101
+ subfield: true, // 是否需要分栏
102
+ fullscreen: true, // 全屏编辑
103
+ readmodel: true, // 沉浸式阅读
104
+ /* 1.3.5 */
105
+ undo: true, // 上一步
106
+ trash: true, // 清空
107
+ save: true, // 保存(触发events中的save事件)
108
+ /* 1.4.2 */
109
+ navigation: true ,// 导航目录
110
+ editable: true,
111
+ preview: true, // 预览
112
+ defaultOpen: 'preview' //edit: 默认展示编辑区域 , preview: 默认展示预览区域
113
+ },
114
+ apiTreeData: [],
115
+ defaultProps: {
116
+ children: 'children',
117
+ label: 'label'
118
+ }
119
+ };
120
+ },
121
+ created: function() {
122
+ this.id = '';
123
+ this.handleType = '';
124
+ this.init();
125
+ },
126
+ components:{
127
+ routeInfoComponent
128
+ },
129
+ mounted: function() {},
130
+ beforeDestroy: function() {},
131
+ methods: {
132
+ init() {
133
+ this.list();
134
+ },
135
+ list(){
136
+ let _this = this;
137
+ apiDocList().then(function(result){//获取tree数据
138
+ let data = result.data;
139
+ _this.tableData = data;
140
+ if (data){
141
+ let treeData = []
142
+ let i = 1;
143
+ _this.GLOBAL_VAR.groups.forEach((row,index)=>{
144
+ treeData.push({id:'' + i, code:row.value, pcode:'', name: row.label});
145
+ i ++;
146
+ })
147
+ data.forEach((row,index)=>{
148
+ treeData.push({id:row.id, code:row.id, pcode:row.groupCode, name: row.name});
149
+ })
150
+ _this.apiTreeData = _this.GLOBAL_FUN.initTree(treeData);
151
+ }
152
+ });
153
+ },
154
+ isNotGroups(groupCode){//过滤父级接口的编辑和查看按钮
155
+ let groups = this.GLOBAL_VAR.groups;
156
+ let length = groups.length;
157
+ for (var i=0;i<length;i++){
158
+ let itme = groups[i];
159
+ if (itme.value === groupCode){
160
+ return false;
161
+ }
162
+ }
163
+ return true;
164
+ },
165
+ handleNodeClick(data){//点击节点,判断是否在编辑
166
+ let oldhandleType = this.handleType;
167
+ if (this.isEdit === true){
168
+ this.handleType = 'edit';
169
+ }
170
+ if (this.handleType === 'edit'){
171
+ if (oldhandleType === 'edit'){
172
+ if (this.id == data.id){
173
+ return true;
174
+ }
175
+ let _this = this;
176
+ this.$confirm('当前正在编辑文档内容,如未保存将会丢失已编辑内容,请确认是否切换?').then(_ => {
177
+ if (this.isEdit != true){
178
+ _this.handleType = '';
179
+ }
180
+ _this.info(data);
181
+ }).catch(_ => {});
182
+ }else {
183
+ this.info(data);
184
+ }
185
+ }else {
186
+ if (this.id == data.id){
187
+ return true;
188
+ }
189
+ this.handleType = '';
190
+ this.info(data);
191
+ }
192
+ this.isEdit = false;
193
+ },
194
+ info(data){//点击tree节点,获取节点信息
195
+ if (this.isNotGroups(data.code)){
196
+ this.infoForm = this.getTableDataItem(data.id);
197
+ this.infoForm.isItem = true;
198
+ } else {
199
+ this.infoForm = {
200
+ id: data.id,
201
+ name:data.label,
202
+ isItem:false
203
+ }
204
+ }
205
+ this.getApiDoc(data.id);
206
+ },
207
+ handleNodeEdit(data){//编辑
208
+ this.isEdit = true;
209
+ },
210
+ handleNodeView(data){//查看接口详情
211
+ this.drawer = true;
212
+ this.infoForm = this.getTableDataItem(data.id);
213
+ },
214
+ handleClose(done) {//关闭详情
215
+ // this.$confirm('确认关闭?').then(_ => {
216
+ done();
217
+ // }).catch(_ => {});
218
+ },
219
+ handleSave(){
220
+ let isSubmit = true;
221
+ if (this.content == null || this.content == undefined || this.content == '' || this.content.length <= 0){
222
+ isSubmit = false;
223
+ this.$confirm('文档内空是空的,请确认是否提交?').then(_ => {
224
+ this.save()
225
+ }).catch(_ => {});
226
+ }else {
227
+ this.save()
228
+ }
229
+ },
230
+ getTableDataItem(id){//获取数组中的指定ID对象
231
+ let routeData = {};
232
+ let length = this.tableData.length;
233
+ for (var i=0;i<length;i++){
234
+ let item = this.tableData[i];
235
+ if (id === item.id){
236
+ routeData = item;
237
+ break;
238
+ }
239
+ }
240
+ return routeData;
241
+ },
242
+ save(){//保存文档
243
+ let _this = this;
244
+ saveApiDoc({id:this.infoForm.id, content: this.content}).then(function(result){
245
+ console.log(result);
246
+ _this.handleType = '';
247
+ _this.GLOBAL_FUN.successMsg();
248
+ });
249
+ },
250
+ getApiDoc(id){//获取文档
251
+ this.content = '';
252
+ this.id = id;
253
+ let _this = this;
254
+ findByApiDoc({id:id}).then(function(result){
255
+ if (result.data){
256
+ _this.content = result.data.content;
257
+ }
258
+
259
+ });
260
+ }
261
+ }
262
+ };
263
+ </script>
264
+
265
+ <style>
266
+ .el-drawer__header {
267
+ -ms-flex-align: center;
268
+ align-items: center;
269
+ color: #72767b;
270
+ display: -ms-flexbox;
271
+ display: flex;
272
+ margin-bottom: 2px;
273
+ padding: 10px 20px 0;
274
+ }
275
+ .input-with-select .el-input-group__prepend {
276
+ background-color: #fff;
277
+ }
278
+ .gateway-info-label{
279
+ text-align: right;
280
+ font-size: 14px;
281
+ padding: 8px 0;
282
+ color: #606266;
283
+ vertical-align: middle;
284
+ }
285
+ .gateway-info-value{
286
+ font-size: 14px;
287
+ padding: 8px 0px ;
288
+ line-height: 20px;
289
+ }
290
+ .v-show-content {
291
+ background-color: white !important;
292
+ }
293
+ </style>
@@ -0,0 +1,292 @@
1
+ <template>
2
+ <div class="layout-padding">
3
+ <div class="layout-padding-auto layout-padding-view">
4
+ <div class="box-flex-between" style="padding:20px">
5
+ <el-radio-group v-model="status" size="mini" @change="search">
6
+ <el-radio-button label=""><i class="el-icon-menu" style="font-weight: bold;"></i>&nbsp;所有</el-radio-button>
7
+ <el-radio-button label="0"><i class="el-icon-loading" style="font-weight: bold;"></i>&nbsp;运行</el-radio-button>
8
+ <el-radio-button label="1"><i class="el-icon-circle-close" style="font-weight: bold;"></i>&nbsp;停止</el-radio-button>
9
+ <el-radio-button label="2"><i class="el-icon-bell" style="font-weight: bold;"></i>&nbsp;告警</el-radio-button>
10
+ </el-radio-group>
11
+ </div>
12
+
13
+ <div :key="index" v-for="(item, index) in taskList">
14
+ <div :class="taskTopic.class[item.status]" :title="item.name + taskTopic.title[item.status]" @click="handleClickMonitorInfo(item)">
15
+ <i :class="taskTopic.icon[item.status]" style="font-weight: bold;"></i>&nbsp;<span>{{taskTopic.des[item.status]}}</span>
16
+ <div>
17
+ <span>{{item.id}}</span>
18
+ </div>
19
+ <div class="item-name-style">
20
+ <span>{{item.name}}</span>
21
+ </div>
22
+ </div>
23
+ </div>
24
+ </div>
25
+
26
+
27
+ <el-dialog title="监控告警信息" v-model="dialogFormVisible" width="25%" :close-on-click-modal="false">
28
+ <el-form :model="infoForm" ref="infoForm" :label-width="formLabelWidth">
29
+ <el-form-item label="服务ID:" size="mini">
30
+ <el-tag size="small">{{infoForm.id}}</el-tag>
31
+ </el-form-item>
32
+ <el-form-item label="服务ID:" size="mini">
33
+ <el-tag size="small">{{infoForm.name}}</el-tag>
34
+ </el-form-item>
35
+ <el-form-item label="服务地址:" size="mini">
36
+ <el-tag size="small" type="success">{{infoForm.uri}}</el-tag>
37
+ </el-form-item>
38
+ <el-form-item label="断言路径:" size="mini">
39
+ <el-tag size="small" type="success">{{infoForm.path}}</el-tag>
40
+ </el-form-item>
41
+ <el-form-item v-show="infoForm.method != ''" label="请求模式:" size="mini">
42
+ <el-tag size="small" type="success">{{infoForm.method}}</el-tag>
43
+ </el-form-item>
44
+ <el-form-item label="告警状态:" size="mini">
45
+ <el-tag v-show="infoForm.status != '2'" size="small" type="" effect="dark">正常</el-tag>
46
+ <el-tag v-show="infoForm.status == '2'" size="small" type="danger" effect="dark">告警</el-tag>
47
+ </el-form-item>
48
+ <el-form-item v-show="infoForm.status == '2'" label="告警时间:" size="mini">
49
+ <el-tag size="small" type="danger" effect="dark">{{infoForm.alarmTime}}</el-tag>
50
+ </el-form-item>
51
+ <el-form-item label="告警重试:" size="mini">
52
+ <el-tag v-show="infoForm.recover == '0'" size="small" type="" effect="dark">启用</el-tag>
53
+ <el-tag v-show="infoForm.recover == '1'" size="small" type="danger" effect="dark">禁止</el-tag>
54
+ </el-form-item>
55
+ <el-form-item label="通知频率:" size="mini">
56
+ <el-tag v-for="item in monitorOptions" :key="item.value" v-show="infoForm.frequency == item.value" size="small" type="" effect="dark">{{item.label}}</el-tag>
57
+ </el-form-item>
58
+ <el-form-item v-show="infoForm.emails != null && infoForm.emails != ''" label="通知邮箱:" size="mini">
59
+ <el-tag size="small" type="" effect="dark">{{infoForm.emails}}</el-tag>
60
+ </el-form-item>
61
+ <el-form-item v-show="infoForm.sendTime != null && infoForm.sendTime != ''" label="通知时间:" size="mini">
62
+ <el-tag size="small" type="" effect="dark">{{infoForm.sendTime}}</el-tag>
63
+ </el-form-item>
64
+ </el-form>
65
+ <template #footer>
66
+ <div class="dialog-footer">
67
+ <el-button icon="el-icon-document-delete" v-show="infoForm.status == '2'" size="mini" type="success" @click="close">关闭本次告警</el-button>
68
+ <el-button icon="el-icon-document-delete" size="mini" type="warning" @click="dialogFormVisible = false">关 闭</el-button>
69
+ </div>
70
+ </template>
71
+ </el-dialog>
72
+ </div>
73
+ </template>
74
+
75
+ <script>
76
+ import {monitorList, closeMonitor} from '../api/monitor_api.js'
77
+
78
+ export default {
79
+ data() {
80
+ return {
81
+ infoForm: {},
82
+ dialogFormVisible: false,
83
+ formLabelWidth: '100px',
84
+ status: '',
85
+ taskList: [],
86
+ taskTopic: {
87
+ icon: {
88
+ '0':'el-icon-loading',
89
+ '1':'el-icon-circle-close',
90
+ '2':'el-icon-bell'
91
+ },
92
+ class:{
93
+ '0':'breathe-run breathe-style breathe-keyframes-run breathe-div-border',
94
+ '1':'breathe-stop breathe-style breathe-div-border',
95
+ '2':'breathe-urgent breathe-style breathe-keyframes-urgent breathe-div-border'
96
+ },
97
+ title:{
98
+ '0':',服务正常运行',
99
+ '1':',服务已停止',
100
+ '2':',30分钟内发生告警'
101
+ },
102
+ des:{
103
+ '0':'服务运行中...',
104
+ '1':'服务已停止...',
105
+ '2':'服务告警...'
106
+ },
107
+ },
108
+ monitorOptions: [
109
+ {value: '30m',label: '30分钟一次'},
110
+ {value: '1h', label: '1小时一次'},
111
+ {value: '5h',label: '5小时一次'},
112
+ {value: '12h',label: '12小时一次'},
113
+ {value: '24h',label: '24小时一次'}
114
+ ]
115
+ };
116
+ },
117
+ created: function() {
118
+ this.search();
119
+ },
120
+ mounted: function() {
121
+
122
+ },
123
+ beforeDestroy: function() {
124
+ },
125
+ methods:{
126
+ search(){
127
+ let _this = this;
128
+ let _status = this.status === ''? null : this.status;
129
+ monitorList({status: _status}).then(function(result){
130
+ if (result.data){
131
+ _this.taskList = result.data;
132
+ }
133
+ });
134
+ },
135
+ close() {
136
+ if (this.infoForm.status == '0'){
137
+ return false;
138
+ }
139
+ let _this = this;
140
+ closeMonitor({id: this.infoForm.id}).then(function(result) {
141
+ _this.infoForm.status = '0';
142
+ _this.GLOBAL_FUN.successMsg();
143
+ _this.setTableMonitorStatus();
144
+ });
145
+ },
146
+ handleClickMonitorInfo(row){
147
+ console.log(row);
148
+ this.dialogFormVisible = true;
149
+ this.infoForm = {
150
+ id: row.id,
151
+ name: row.name,
152
+ uri: row.uri,
153
+ path: row.path,
154
+ method: row.method,
155
+ status: row.status,
156
+ alarmTime: row.monitor.alarmTime,
157
+ recover: row.monitor.recover,
158
+ frequency: row.monitor.frequency,
159
+ sendTime: row.monitor.sendTime,
160
+ emails: row.monitor.emails
161
+ }
162
+ },
163
+ setTableMonitorStatus(){
164
+ let length = this.taskList.length;
165
+ for (var i=0;i<length;i++){
166
+ if (this.taskList[i].id == this.infoForm.id){
167
+ this.taskList[i].status = this.infoForm.status;
168
+ break;
169
+ }
170
+ }
171
+ }
172
+ }
173
+ };
174
+ </script>
175
+
176
+ <style lang="scss" scoped>
177
+ .span_1{
178
+ font-size: 18pt;
179
+ font-weight: bold;
180
+ margin-bottom: 9px;
181
+ }
182
+
183
+ .breathe-run {
184
+ border: 1px solid #2b92d4;
185
+ }
186
+
187
+ .breathe-stop {
188
+ border: 1px solid #333;
189
+ opacity: 1;
190
+ }
191
+
192
+ .breathe-urgent {
193
+ border: 1px solid #F0565A;
194
+ }
195
+
196
+ .breathe-style {
197
+ float: left;
198
+ border-radius: 5px;
199
+ position: relative;
200
+ width: 150px;
201
+ height: 80px;
202
+ margin: 10px 10px;
203
+ padding-left: 10px;
204
+ padding-top: 6px;
205
+ line-height: 22px;
206
+ /* color: #fff; */
207
+ font-size: 8pt;
208
+ text-align: left;
209
+ cursor: pointer;
210
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
211
+ overflow: hidden;
212
+ }
213
+
214
+ .breathe-keyframes-run:hover {
215
+ -webkit-animation-timing-function: ease-in-out;
216
+ -webkit-animation-name: breathe-run;
217
+ -webkit-animation-duration: 500ms;
218
+ -webkit-animation-iteration-count: infinite;
219
+ -webkit-animation-direction: alternate;
220
+ }
221
+
222
+ .breathe-keyframes-urgent {
223
+ -webkit-animation-timing-function: ease-in-out;
224
+ -webkit-animation-name: breathe-urgent;
225
+ -webkit-animation-duration: 700ms;
226
+ -webkit-animation-iteration-count: infinite;
227
+ -webkit-animation-direction: alternate;
228
+ }
229
+
230
+ .item-name-style{
231
+ white-space:nowrap;
232
+ overflow:hidden;
233
+ text-overflow: ellipsis;
234
+ font-weight: bold;
235
+ }
236
+
237
+ /* vue中@-webkit-keyframes改成@keyframes */
238
+ @keyframes breathe-run {
239
+ 0% {
240
+ opacity: 0.75;
241
+ box-shadow: 0 1px 2px rgba(24, 144, 255, 0.3);
242
+ }
243
+ 30% {
244
+ opacity: 0.85;
245
+ box-shadow: 0 1px 2px rgba(24, 144, 255, 0.3);
246
+ }
247
+ 66% {
248
+ opacity: 0.95;
249
+ box-shadow: 0 1px 2px rgba(24, 144, 255, 0.3);
250
+ }
251
+ 100% {
252
+ opacity: 1;
253
+ border: 1px solid rgba(24, 144, 255, 1);
254
+ box-shadow: 0 1px 20px rgba(24, 144, 255, 1);
255
+ }
256
+ }
257
+
258
+ @keyframes breathe-urgent {
259
+ 0% {
260
+ opacity: 0.6;
261
+ box-shadow: 0 1px 2px rgba(255, 255, 255, 0.1);
262
+ }
263
+ 100% {
264
+ opacity: 1;
265
+ border: 1px solid rgba(240, 86, 90, 1);
266
+ box-shadow: 0 1px 20px rgba(240, 86, 90, 1);
267
+ }
268
+ }
269
+
270
+ .breathe-div-border:before,.breathe-div-border:after {
271
+ content:'';
272
+ position:absolute;
273
+ top:0;
274
+ right:0;
275
+ height:2px;
276
+ width:0;
277
+ background:#727CF5;
278
+ transition:400ms ease all;
279
+ }
280
+
281
+ .breathe-div-border:after {
282
+ right:inherit;
283
+ top:inherit;
284
+ left:0;
285
+ bottom:0;
286
+ }
287
+
288
+ .breathe-div-border:hover:before,.breathe-div-border:hover:after {
289
+ width:100%;
290
+ transition:555ms ease all;
291
+ }
292
+ </style>