├── .gitignore
├── README.md
├── html
├── css
│ ├── common
│ │ ├── bootstrap-theme.css
│ │ ├── bootstrap.css
│ │ ├── dashboard.css
│ │ ├── font-awesome.css
│ │ ├── fonts
│ │ │ ├── FontAwesome.otf
│ │ │ ├── fontawesome-webfont.eot
│ │ │ ├── fontawesome-webfont.ttf
│ │ │ ├── fontawesome-webfont.woff
│ │ │ ├── glyphicons-halflings-regular.eot
│ │ │ ├── glyphicons-halflings-regular.ttf
│ │ │ ├── glyphicons-halflings-regular.woff
│ │ │ └── glyphicons-halflings-regular.woff2
│ │ ├── introjs.css
│ │ ├── metisMenu.css
│ │ ├── sb-admin-2.css
│ │ └── sb-admin-meteor.css
│ └── quality
│ │ └── jiraInfo.css
├── img
│ ├── favicon.ico
│ ├── logo.gif
│ └── logo.png
├── js
│ ├── ajax.js
│ ├── chuncai
│ │ ├── chuncai.js
│ │ └── jquery.js
│ ├── common
│ │ ├── bootbox.js
│ │ ├── bootstrap.js
│ │ ├── echarts.js
│ │ ├── intro.js
│ │ ├── jquery-1.11.3.js
│ │ ├── jquery.disable.1.0.js
│ │ ├── jquery.form.js
│ │ ├── jquery.requestForm.js
│ │ ├── jquery.validate.js
│ │ ├── metisMenu.js
│ │ ├── sb-admin-2.js
│ │ └── spin.js
│ └── quality
│ │ ├── jiraInfo.js
│ │ └── myJiraInfo.js
└── swf
│ └── CrossDomain.swf
├── log
├── cron.log
├── debug.log
└── run.log
├── pom.xml
└── src
└── main
├── environment
├── local
│ └── db.properties
└── test
│ └── db.properties
├── java
└── com
│ └── quality
│ ├── constant
│ ├── InfoConstant.java
│ ├── LogConstant.java
│ ├── ThreadLocalConstant.java
│ └── 常量
│ ├── dao
│ ├── BaseDBDaoImpl.java
│ ├── CommonDaoImpl.java
│ ├── CronDao.java
│ ├── impl
│ │ └── CronDaoImpl.java
│ └── pagination
│ │ ├── OffsetLimitInterceptor.java
│ │ ├── Page.java
│ │ ├── PaginationInfo.java
│ │ ├── PaginationInterceptor.java
│ │ ├── PaginationList.java
│ │ ├── PaginationSqlSession.java
│ │ └── dialect
│ │ ├── Dialect.java
│ │ └── OracleDialect.java
│ ├── filter
│ └── SessionFilter.java
│ ├── interceptor
│ └── ThreadLocalInterceptor.java
│ ├── model
│ └── JiraInfoModel.java
│ ├── protocol
│ ├── ProtocolServerDoor.java
│ ├── message
│ │ ├── RequestMessage.java
│ │ ├── ResponseMessage.java
│ │ └── codec
│ │ │ ├── MessageCodecFactory.java
│ │ │ ├── MessageDecoder.java
│ │ │ ├── MessageEncoder.java
│ │ │ ├── RequestMessageDecoder.java
│ │ │ ├── RequestMessageEncoder.java
│ │ │ ├── ResponseMessageDecoder.java
│ │ │ └── ResponseMessageEncoder.java
│ ├── plugin
│ │ ├── IPlugin.java
│ │ ├── PluginClassLoader.java
│ │ ├── PluginContentItem.java
│ │ ├── PluginFactory.java
│ │ └── filter
│ │ │ ├── IFilterPlugin.java
│ │ │ └── IFormateContentFilterPlugin.java
│ ├── server
│ │ ├── ProtocolServer.java
│ │ ├── RequestMessageDispatcher.java
│ │ ├── ftp
│ │ │ └── FtpProtocolServer.java
│ │ ├── tcp
│ │ │ ├── ServerHandler.java
│ │ │ ├── ServerHandlerThread.java
│ │ │ ├── TcpProtocolServer.java
│ │ │ └── TcpRequestMessageDispatcher.java
│ │ └── udp
│ │ │ ├── ServerHandler.java
│ │ │ ├── ServerHandlerThread.java
│ │ │ ├── UdpProtocolServer.java
│ │ │ └── UdpRequestMessageDispatcher.java
│ ├── test
│ │ ├── ftp
│ │ │ ├── FtpClient.java
│ │ │ └── ProgressionListener.java
│ │ ├── tcp
│ │ │ ├── ClientHandler.java
│ │ │ ├── TcpProtocolServerMultiPortTest.java
│ │ │ └── TcpProtocolServerTest.java
│ │ └── udp
│ │ │ ├── ClientHandler.java
│ │ │ ├── UdpProtocolServerMultiPortTest.java
│ │ │ └── UdpProtocolServerTest.java
│ └── util
│ │ ├── ContextConstant.java
│ │ ├── DataUtil.java
│ │ └── LoadProtocolConfig.java
│ ├── service
│ ├── TestService.java
│ └── impl
│ │ └── TestServiceImpl.java
│ ├── util
│ ├── ErrorMessageUtil.java
│ ├── HttpRequestUtil.java
│ ├── JiraUtil.java
│ ├── OpenId.java
│ └── RequestUtil.java
│ └── web
│ ├── BaseController.java
│ ├── CronController.java
│ ├── IndexController.java
│ └── quality
│ ├── BugInfoController.java
│ └── JIRAInfoController.java
├── resources
├── SqlMapConfig.xml
├── applicationContext.xml
├── cron.properties
├── dataSource.xml
├── health-url-mapping.xml
├── log4j.properties
├── mybatis
│ ├── Common.xml
│ └── CronDaoImpl.xml
├── protocol.properties
└── users.properties
└── webapp
└── WEB-INF
├── ftl
├── cron
│ ├── cronList.ftl
│ └── editCron.ftl
├── fail.ftl
├── inc
│ ├── core.ftl
│ └── core2.ftl
├── index.ftl
├── index_backup.ftl
└── quality
│ ├── bugInfo.ftl
│ ├── jiraInfo.ftl
│ └── myJiraInfo.ftl
├── spring-mvc.xml
└── web.xml
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea
2 | .metadata
3 | bin/
4 | tmp/
5 | *.tmp
6 | *.bak
7 | *.swp
8 | *~.nib
9 | local.properties
10 | .settings/
11 | .loadpath
12 | .recommenders
13 |
14 | # Eclipse Core
15 | .project
16 |
17 | # External tool builders
18 | .externalToolBuilders/
19 |
20 | # Locally stored "Eclipse launch configurations"
21 | *.launch
22 |
23 | # PyDev specific (Python IDE for Eclipse)
24 | *.pydevproject
25 |
26 | # CDT-specific (C/C++ Development Tooling)
27 | .cproject
28 |
29 | # JDT-specific (Eclipse Java Development Tools)
30 | .classpath
31 |
32 | # Java annotation processor (APT)
33 | .factorypath
34 |
35 | # PDT-specific (PHP Development Tools)
36 | .buildpath
37 |
38 | # sbteclipse plugin
39 | .target
40 |
41 | # Tern plugin
42 | .tern-project
43 |
44 | # TeXlipse plugin
45 | .texlipse
46 |
47 | # STS (Spring Tool Suite)
48 | .springBeans
49 |
50 | # Code Recommenders
51 | .recommenders/
52 |
53 | *.iml
54 | /target/
55 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # JiraHelper
2 | 用来构建JIRA规范化使用的协助工作平台
3 |
--------------------------------------------------------------------------------
/html/css/common/dashboard.css:
--------------------------------------------------------------------------------
1 | /*
2 | * Base structure
3 | */
4 |
5 | /* Move down content because we have a fixed navbar that is 50px tall */
6 | body {
7 | padding-top: 50px;
8 | }
9 |
10 |
11 | /*
12 | * Global add-ons
13 | */
14 |
15 | .sub-header {
16 | padding-bottom: 10px;
17 | border-bottom: 1px solid #eee;
18 | }
19 |
20 | /*
21 | * Top navigation
22 | * Hide default border to remove 1px line.
23 | */
24 | .navbar-fixed-top {
25 | border: 0;
26 | }
27 |
28 | /*
29 | * Sidebar
30 | */
31 |
32 | /* Hide for mobile, show later */
33 | .sidebar {
34 | display: none;
35 | }
36 | @media (min-width: 768px) {
37 | .sidebar {
38 | position: fixed;
39 | top: 51px;
40 | bottom: 0;
41 | left: 0;
42 | z-index: 1000;
43 | display: block;
44 | padding: 20px;
45 | overflow-x: hidden;
46 | overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */
47 | background-color: #f5f5f5;
48 | border-right: 1px solid #eee;
49 | }
50 | }
51 |
52 | /* Sidebar navigation */
53 | .nav-sidebar {
54 | margin-right: -21px; /* 20px padding + 1px border */
55 | margin-bottom: 20px;
56 | margin-left: -20px;
57 | }
58 | .nav-sidebar > li > a {
59 | padding-right: 20px;
60 | padding-left: 20px;
61 | }
62 | .nav-sidebar > .active > a,
63 | .nav-sidebar > .active > a:hover,
64 | .nav-sidebar > .active > a:focus {
65 | color: #fff;
66 | background-color: #428bca;
67 | }
68 |
69 |
70 | /*
71 | * Main content
72 | */
73 |
74 | .main {
75 | padding: 20px;
76 | }
77 | @media (min-width: 768px) {
78 | .main {
79 | padding-right: 40px;
80 | padding-left: 40px;
81 | }
82 | }
83 | .main .page-header {
84 | margin-top: 0;
85 | }
86 |
87 |
88 | /*
89 | * Placeholder dashboard ideas
90 | */
91 |
92 | .placeholders {
93 | margin-bottom: 30px;
94 | text-align: center;
95 | }
96 | .placeholders h4 {
97 | margin-bottom: 0;
98 | }
99 | .placeholder {
100 | margin-bottom: 20px;
101 | }
102 | .placeholder img {
103 | display: inline-block;
104 | border-radius: 50%;
105 | }
106 |
--------------------------------------------------------------------------------
/html/css/common/fonts/FontAwesome.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OuterCloud/JiraHelper/075dd0e67969f1e14db15f5c464adb77650190b9/html/css/common/fonts/FontAwesome.otf
--------------------------------------------------------------------------------
/html/css/common/fonts/fontawesome-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OuterCloud/JiraHelper/075dd0e67969f1e14db15f5c464adb77650190b9/html/css/common/fonts/fontawesome-webfont.eot
--------------------------------------------------------------------------------
/html/css/common/fonts/fontawesome-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OuterCloud/JiraHelper/075dd0e67969f1e14db15f5c464adb77650190b9/html/css/common/fonts/fontawesome-webfont.ttf
--------------------------------------------------------------------------------
/html/css/common/fonts/fontawesome-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OuterCloud/JiraHelper/075dd0e67969f1e14db15f5c464adb77650190b9/html/css/common/fonts/fontawesome-webfont.woff
--------------------------------------------------------------------------------
/html/css/common/fonts/glyphicons-halflings-regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OuterCloud/JiraHelper/075dd0e67969f1e14db15f5c464adb77650190b9/html/css/common/fonts/glyphicons-halflings-regular.eot
--------------------------------------------------------------------------------
/html/css/common/fonts/glyphicons-halflings-regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OuterCloud/JiraHelper/075dd0e67969f1e14db15f5c464adb77650190b9/html/css/common/fonts/glyphicons-halflings-regular.ttf
--------------------------------------------------------------------------------
/html/css/common/fonts/glyphicons-halflings-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OuterCloud/JiraHelper/075dd0e67969f1e14db15f5c464adb77650190b9/html/css/common/fonts/glyphicons-halflings-regular.woff
--------------------------------------------------------------------------------
/html/css/common/fonts/glyphicons-halflings-regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OuterCloud/JiraHelper/075dd0e67969f1e14db15f5c464adb77650190b9/html/css/common/fonts/glyphicons-halflings-regular.woff2
--------------------------------------------------------------------------------
/html/css/common/metisMenu.css:
--------------------------------------------------------------------------------
1 | /*
2 | * metismenu - v1.1.3
3 | * Easy menu jQuery plugin for Twitter Bootstrap 3
4 | * https://github.com/onokumus/metisMenu
5 | *
6 | * Made by Osman Nuri Okumus
7 | * Under MIT License
8 | */
9 | .arrow {
10 | float: right;
11 | line-height: 1.42857;
12 | }
13 |
14 | .glyphicon.arrow:before {
15 | content: "\e079";
16 | }
17 |
18 | .active > a > .glyphicon.arrow:before {
19 | content: "\e114";
20 | }
21 |
22 |
23 | /*
24 | * Require Font-Awesome
25 | * http://fortawesome.github.io/Font-Awesome/
26 | */
27 |
28 |
29 | .fa.arrow:before {
30 | content: "\f104";
31 | }
32 |
33 | .active > a > .fa.arrow:before {
34 | content: "\f107";
35 | }
36 |
37 | .plus-times {
38 | float: right;
39 | }
40 |
41 | .fa.plus-times:before {
42 | content: "\f067";
43 | }
44 |
45 | .active > a > .fa.plus-times {
46 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
47 | -webkit-transform: rotate(45deg);
48 | -moz-transform: rotate(45deg);
49 | -ms-transform: rotate(45deg);
50 | -o-transform: rotate(45deg);
51 | transform: rotate(45deg);
52 | }
53 |
54 | .plus-minus {
55 | float: right;
56 | }
57 |
58 | .fa.plus-minus:before {
59 | content: "\f067";
60 | }
61 |
62 | .active > a > .fa.plus-minus:before {
63 | content: "\f068";
64 | }
--------------------------------------------------------------------------------
/html/css/common/sb-admin-2.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Start Bootstrap - SB Admin 2 Bootstrap Admin Theme (http://startbootstrap.com)
3 | * Code licensed under the Apache License v2.0.
4 | * For details, see http://www.apache.org/licenses/LICENSE-2.0.
5 | */
6 |
7 | body {
8 | background-color: #FFFFFF;
9 | }
10 |
11 | #wrapper {
12 | width: 100%;
13 | }
14 |
15 | #page-wrapper {
16 | padding: 0 15px;
17 | min-height: 568px;
18 | background-color: #fff;
19 | }
20 |
21 | @media(min-width:768px) {
22 | #page-wrapper {
23 | position: inherit;
24 | margin: 0 0 0 250px;
25 | padding: 0 30px;
26 | border-left: 1px solid #e7e7e7;
27 | }
28 | }
29 |
30 | .navbar-top-links {
31 | margin-right: 0;
32 | }
33 |
34 | .navbar-top-links li {
35 | display: inline-block;
36 | }
37 |
38 | .navbar-top-links li:last-child {
39 | margin-right: 15px;
40 | }
41 |
42 | .navbar-top-links li a {
43 | padding: 15px;
44 | min-height: 50px;
45 | }
46 |
47 | .navbar-top-links .dropdown-menu li {
48 | display: block;
49 | }
50 |
51 | .navbar-top-links .dropdown-menu li:last-child {
52 | margin-right: 0;
53 | }
54 |
55 | .navbar-top-links .dropdown-menu li a {
56 | padding: 3px 20px;
57 | min-height: 0;
58 | }
59 |
60 | .navbar-top-links .dropdown-menu li a div {
61 | white-space: normal;
62 | }
63 |
64 | .navbar-top-links .dropdown-messages,
65 | .navbar-top-links .dropdown-tasks,
66 | .navbar-top-links .dropdown-alerts {
67 | width: 310px;
68 | min-width: 0;
69 | }
70 |
71 | .navbar-top-links .dropdown-messages {
72 | margin-left: 5px;
73 | }
74 |
75 | .navbar-top-links .dropdown-tasks {
76 | margin-left: -59px;
77 | }
78 |
79 | .navbar-top-links .dropdown-alerts {
80 | margin-left: -123px;
81 | }
82 |
83 | .navbar-top-links .dropdown-user {
84 | right: 0;
85 | left: auto;
86 | }
87 |
88 | .sidebar .sidebar-nav.navbar-collapse {
89 | padding-right: 0;
90 | padding-left: 0;
91 | }
92 |
93 | .sidebar .sidebar-search {
94 | padding: 15px;
95 | }
96 |
97 | .sidebar ul li {
98 | border-bottom: 1px solid #e7e7e7;
99 | }
100 |
101 | .sidebar ul li a.active {
102 | background-color: #eee;
103 | }
104 |
105 | .sidebar .arrow {
106 | float: right;
107 | }
108 |
109 | .sidebar .fa.arrow:before {
110 | content: "\f104";
111 | }
112 |
113 | .sidebar .active>a>.fa.arrow:before {
114 | content: "\f107";
115 | }
116 |
117 | .sidebar .nav-second-level li,
118 | .sidebar .nav-third-level li {
119 | border-bottom: 0!important;
120 | }
121 |
122 | .sidebar .nav-second-level li a {
123 | padding-left: 37px;
124 | }
125 |
126 | .sidebar .nav-third-level li a {
127 | padding-left: 52px;
128 | }
129 |
130 | @media(min-width:768px) {
131 | .sidebar {
132 | z-index: 1;
133 | position: absolute;
134 | width: 250px;
135 | margin-top: 51px;
136 | }
137 |
138 | .navbar-top-links .dropdown-messages,
139 | .navbar-top-links .dropdown-tasks,
140 | .navbar-top-links .dropdown-alerts {
141 | margin-left: auto;
142 | }
143 | }
144 |
145 | .btn-outline {
146 | color: inherit;
147 | background-color: transparent;
148 | transition: all .5s;
149 | }
150 |
151 | .btn-primary.btn-outline {
152 | color: #428bca;
153 | }
154 |
155 | .btn-success.btn-outline {
156 | color: #5cb85c;
157 | }
158 |
159 | .btn-info.btn-outline {
160 | color: #5bc0de;
161 | }
162 |
163 | .btn-warning.btn-outline {
164 | color: #f0ad4e;
165 | }
166 |
167 | .btn-danger.btn-outline {
168 | color: #d9534f;
169 | }
170 |
171 | .btn-primary.btn-outline:hover,
172 | .btn-success.btn-outline:hover,
173 | .btn-info.btn-outline:hover,
174 | .btn-warning.btn-outline:hover,
175 | .btn-danger.btn-outline:hover {
176 | color: #fff;
177 | }
178 |
179 | .chat {
180 | margin: 0;
181 | padding: 0;
182 | list-style: none;
183 | }
184 |
185 | .chat li {
186 | margin-bottom: 10px;
187 | padding-bottom: 5px;
188 | border-bottom: 1px dotted #999;
189 | }
190 |
191 | .chat li.left .chat-body {
192 | margin-left: 60px;
193 | }
194 |
195 | .chat li.right .chat-body {
196 | margin-right: 60px;
197 | }
198 |
199 | .chat li .chat-body p {
200 | margin: 0;
201 | }
202 |
203 | .panel .slidedown .glyphicon,
204 | .chat .glyphicon {
205 | margin-right: 5px;
206 | }
207 |
208 | .chat-panel .panel-body {
209 | height: 350px;
210 | overflow-y: scroll;
211 | }
212 |
213 | .login-panel {
214 | margin-top: 25%;
215 | }
216 |
217 | .flot-chart {
218 | display: block;
219 | height: 400px;
220 | }
221 |
222 | .flot-chart-content {
223 | width: 100%;
224 | height: 100%;
225 | }
226 |
227 | .dataTables_wrapper {
228 | position: relative;
229 | clear: both;
230 | }
231 |
232 | table.dataTable thead .sorting,
233 | table.dataTable thead .sorting_asc,
234 | table.dataTable thead .sorting_desc,
235 | table.dataTable thead .sorting_asc_disabled,
236 | table.dataTable thead .sorting_desc_disabled {
237 | background: 0 0;
238 | }
239 |
240 | table.dataTable thead .sorting_asc:after {
241 | content: "\f0de";
242 | float: right;
243 | font-family: fontawesome;
244 | }
245 |
246 | table.dataTable thead .sorting_desc:after {
247 | content: "\f0dd";
248 | float: right;
249 | font-family: fontawesome;
250 | }
251 |
252 | table.dataTable thead .sorting:after {
253 | content: "\f0dc";
254 | float: right;
255 | font-family: fontawesome;
256 | color: rgba(50,50,50,.5);
257 | }
258 |
259 | .btn-circle {
260 | width: 30px;
261 | height: 30px;
262 | padding: 6px 0;
263 | border-radius: 15px;
264 | text-align: center;
265 | font-size: 12px;
266 | line-height: 1.428571429;
267 | }
268 |
269 | .btn-circle.btn-lg {
270 | width: 50px;
271 | height: 50px;
272 | padding: 10px 16px;
273 | border-radius: 25px;
274 | font-size: 18px;
275 | line-height: 1.33;
276 | }
277 |
278 | .btn-circle.btn-xl {
279 | width: 70px;
280 | height: 70px;
281 | padding: 10px 16px;
282 | border-radius: 35px;
283 | font-size: 24px;
284 | line-height: 1.33;
285 | }
286 |
287 | .show-grid [class^=col-] {
288 | padding-top: 10px;
289 | padding-bottom: 10px;
290 | border: 1px solid #ddd;
291 | background-color: #eee!important;
292 | }
293 |
294 | .show-grid {
295 | margin: 15px 0;
296 | }
297 |
298 | .huge {
299 | font-size: 40px;
300 | }
301 |
302 | .panel-green {
303 | border-color: #5cb85c;
304 | }
305 |
306 | .panel-green .panel-heading {
307 | border-color: #5cb85c;
308 | color: #fff;
309 | background-color: #5cb85c;
310 | }
311 |
312 | .panel-green a {
313 | color: #5cb85c;
314 | }
315 |
316 | .panel-green a:hover {
317 | color: #3d8b3d;
318 | }
319 |
320 | .panel-red {
321 | border-color: #d9534f;
322 | }
323 |
324 | .panel-red .panel-heading {
325 | border-color: #d9534f;
326 | color: #fff;
327 | background-color: #d9534f;
328 | }
329 |
330 | .panel-red a {
331 | color: #d9534f;
332 | }
333 |
334 | .panel-red a:hover {
335 | color: #b52b27;
336 | }
337 |
338 | .panel-yellow {
339 | border-color: #f0ad4e;
340 | }
341 |
342 | .panel-yellow .panel-heading {
343 | border-color: #f0ad4e;
344 | color: #fff;
345 | background-color: #f0ad4e;
346 | }
347 |
348 | .panel-yellow a {
349 | color: #f0ad4e;
350 | }
351 |
352 | .panel-yellow a:hover {
353 | color: #df8a13;
354 | }
--------------------------------------------------------------------------------
/html/css/common/sb-admin-meteor.css:
--------------------------------------------------------------------------------
1 | body {
2 | background-color: #333333;
3 | }
4 | #wrapper {
5 | width: 100%;
6 | }
7 | #page-wrapper {
8 | padding: 0 15px;
9 | min-height: 568px;
10 | background-color: #f8f8f8;
11 | }
12 | @media (min-width: 768px) {
13 | #page-wrapper {
14 | position: inherit;
15 | margin: 0 0 0 250px;
16 | padding: 0 30px;
17 | border-left: 1px solid #e7e7e7;
18 | }
19 | }
20 | .navbar {
21 | background-color: #333333;
22 | border-bottom-color: #222222;
23 | }
24 | .navbar-top-links {
25 | margin-right: 0;
26 | }
27 | .navbar-brand {
28 | color: #FFFFFF !important;
29 | }
30 | .navbar-brand:hover {
31 | color: #FFFFFF !important;
32 | }
33 | .navbar {
34 | border-bottom: 1px solid #222222;
35 | }
36 | .navbar a {
37 | background-color: #333333 !important;
38 | }
39 | .navbar a.active {
40 | background-color: #121212 !important;
41 | }
42 | .navbar a:hover {
43 | background-color: #222222 !important;
44 | }
45 | .dropdown-menu {
46 | border-bottom: 1px solid #eeeeee;
47 | }
48 | .dropdown-menu a {
49 | background-color: white !important;
50 | }
51 | .dropdown-menu a.active {
52 | background-color: #dedede !important;
53 | }
54 | .dropdown-menu a:hover {
55 | background-color: #eeeeee !important;
56 | }
57 | .navbar a {
58 | color: #dedede;
59 | }
60 | .navbar a.active {
61 | color: #dedede;
62 | }
63 | .navbar a:hover {
64 | color: #ffffff;
65 | }
66 | .navbar-top-links li {
67 | display: inline-block;
68 | }
69 | .navbar-top-links li:last-child {
70 | margin-right: 15px;
71 | }
72 | .navbar-top-links li a {
73 | padding: 15px;
74 | min-height: 50px;
75 | }
76 | .navbar-top-links .dropdown-menu li {
77 | display: block;
78 | }
79 | .navbar-top-links .dropdown-menu li:last-child {
80 | margin-right: 0;
81 | }
82 | .navbar-top-links .dropdown-menu li a {
83 | padding: 3px 20px;
84 | min-height: 0;
85 | }
86 | .navbar-top-links .dropdown-menu li a div {
87 | white-space: normal;
88 | }
89 | .navbar-top-links .dropdown-messages,
90 | .navbar-top-links .dropdown-tasks,
91 | .navbar-top-links .dropdown-alerts {
92 | width: 310px;
93 | min-width: 0;
94 | }
95 | .navbar-top-links .dropdown-messages {
96 | margin-left: 5px;
97 | }
98 | .navbar-top-links .dropdown-tasks {
99 | margin-left: -59px;
100 | }
101 | .navbar-top-links .dropdown-alerts {
102 | margin-left: -123px;
103 | }
104 | .navbar-top-links .dropdown-user {
105 | right: 0;
106 | left: auto;
107 | }
108 | .sidebar {
109 | background-color: #333333;
110 | }
111 | .sidebar .sidebar-nav.navbar-collapse {
112 | padding-left: 0;
113 | padding-right: 0;
114 | }
115 | .sidebar .sidebar-search {
116 | padding: 15px;
117 | }
118 | .sidebar ul li {
119 | border-bottom: 1px solid #222222;
120 | }
121 | .sidebar ul li a {
122 | background-color: #333333 !important;
123 | }
124 | .sidebar ul li a.active {
125 | background-color: #121212 !important;
126 | }
127 | .sidebar ul li a:hover {
128 | background-color: #222222 !important;
129 | }
130 | .sidebar a {
131 | color: #dedede;
132 | }
133 | .sidebar a.active {
134 | color: #dedede;
135 | }
136 | .sidebar a:hover {
137 | color: #ffffff;
138 | }
139 | .sidebar .arrow {
140 | float: right;
141 | }
142 | .sidebar .fa.arrow:before {
143 | content: "\f104";
144 | }
145 | .sidebar .active > a > .fa.arrow:before {
146 | content: "\f107";
147 | }
148 | .sidebar .nav-second-level li,
149 | .sidebar .nav-third-level li {
150 | border-bottom: none !important;
151 | }
152 | .sidebar .nav-second-level li a {
153 | padding-left: 37px;
154 | }
155 | .sidebar .nav-third-level li a {
156 | padding-left: 52px;
157 | }
158 | @media (min-width: 768px) {
159 | .sidebar {
160 | z-index: 1;
161 | position: absolute;
162 | width: 250px;
163 | }
164 | .navbar-top-links .dropdown-messages,
165 | .navbar-top-links .dropdown-tasks,
166 | .navbar-top-links .dropdown-alerts {
167 | margin-left: auto;
168 | }
169 |
170 | }
171 | #loading {
172 | padding: 30px 10px;
173 | }
174 | .btn-outline {
175 | color: inherit;
176 | background-color: transparent;
177 | transition: all .5s;
178 | }
179 | .btn-primary.btn-outline {
180 | color: #428bca;
181 | }
182 | .btn-success.btn-outline {
183 | color: #5cb85c;
184 | }
185 | .btn-info.btn-outline {
186 | color: #5bc0de;
187 | }
188 | .btn-warning.btn-outline {
189 | color: #f0ad4e;
190 | }
191 | .btn-danger.btn-outline {
192 | color: #d9534f;
193 | }
194 | .btn-primary.btn-outline:hover,
195 | .btn-success.btn-outline:hover,
196 | .btn-info.btn-outline:hover,
197 | .btn-warning.btn-outline:hover,
198 | .btn-danger.btn-outline:hover {
199 | color: white;
200 | }
201 | .chat {
202 | margin: 0;
203 | padding: 0;
204 | list-style: none;
205 | }
206 | .chat li {
207 | margin-bottom: 10px;
208 | padding-bottom: 5px;
209 | border-bottom: 1px dotted #999999;
210 | }
211 | .chat li.left .chat-body {
212 | margin-left: 60px;
213 | }
214 | .chat li.right .chat-body {
215 | margin-right: 60px;
216 | }
217 | .chat li .chat-body p {
218 | margin: 0;
219 | }
220 | .panel .slidedown .glyphicon,
221 | .chat .glyphicon {
222 | margin-right: 5px;
223 | }
224 | .chat-panel .panel-body {
225 | height: 350px;
226 | overflow-y: scroll;
227 | }
228 | .login-panel {
229 | margin-top: 25%;
230 | }
231 | .flot-chart {
232 | display: block;
233 | height: 400px;
234 | }
235 | .flot-chart-content {
236 | width: 100%;
237 | height: 100%;
238 | }
239 | table.dataTable thead .sorting,
240 | table.dataTable thead .sorting_asc,
241 | table.dataTable thead .sorting_desc,
242 | table.dataTable thead .sorting_asc_disabled,
243 | table.dataTable thead .sorting_desc_disabled {
244 | background: transparent;
245 | }
246 | table.dataTable thead .sorting_asc:after {
247 | content: "\f0de";
248 | float: right;
249 | font-family: fontawesome;
250 | }
251 | table.dataTable thead .sorting_desc:after {
252 | content: "\f0dd";
253 | float: right;
254 | font-family: fontawesome;
255 | }
256 | table.dataTable thead .sorting:after {
257 | content: "\f0dc";
258 | float: right;
259 | font-family: fontawesome;
260 | color: rgba(50, 50, 50, 0.5);
261 | }
262 | .btn-circle {
263 | width: 30px;
264 | height: 30px;
265 | padding: 6px 0;
266 | border-radius: 15px;
267 | text-align: center;
268 | font-size: 12px;
269 | line-height: 1.428571429;
270 | }
271 | .btn-circle.btn-lg {
272 | width: 50px;
273 | height: 50px;
274 | padding: 10px 16px;
275 | border-radius: 25px;
276 | font-size: 18px;
277 | line-height: 1.33;
278 | }
279 | .btn-circle.btn-xl {
280 | width: 70px;
281 | height: 70px;
282 | padding: 10px 16px;
283 | border-radius: 35px;
284 | font-size: 24px;
285 | line-height: 1.33;
286 | }
287 | .show-grid [class^="col-"] {
288 | padding-top: 10px;
289 | padding-bottom: 10px;
290 | border: 1px solid #ddd;
291 | background-color: #eee !important;
292 | }
293 | .show-grid {
294 | margin: 15px 0;
295 | }
296 | .panel-heading {
297 | background-color: #f0f0f0 !important;
298 | }
299 | .panel-footer {
300 | background-color: #f0f0f0 !important;
301 | }
302 | .huge {
303 | font-size: 40px;
304 | }
305 | .panel-primary {
306 | border-color: #428bca;
307 | }
308 | .panel-primary .panel-heading {
309 | border-color: #428bca;
310 | color: white;
311 | background-color: #428bca !important;
312 | }
313 | .panel-primary a {
314 | color: #428bca;
315 | }
316 | .panel-primary a:hover {
317 | color: #2a6496;
318 | }
319 | .panel-green {
320 | border-color: #5cb85c;
321 | }
322 | .panel-green .panel-heading {
323 | border-color: #5cb85c;
324 | color: white;
325 | background-color: #5cb85c !important;
326 | }
327 | .panel-green a {
328 | color: #5cb85c;
329 | }
330 | .panel-green a:hover {
331 | color: #3d8b3d;
332 | }
333 | .panel-red {
334 | border-color: #d9534f;
335 | }
336 | .panel-red .panel-heading {
337 | border-color: #d9534f;
338 | color: white;
339 | background-color: #d9534f !important;
340 | }
341 | .panel-red a {
342 | color: #d9534f;
343 | }
344 | .panel-red a:hover {
345 | color: #b52b27;
346 | }
347 | .panel-yellow {
348 | border-color: #f0ad4e;
349 | }
350 | .panel-yellow .panel-heading {
351 | border-color: #f0ad4e;
352 | color: white;
353 | background-color: #f0ad4e !important;
354 | }
355 | .panel-yellow a {
356 | color: #f0ad4e;
357 | }
358 | .panel-yellow a:hover {
359 | color: #df8a13;
360 | }
361 |
362 | /* Sticky footer styles
363 | -------------------------------------------------- */
364 | html {
365 | position: relative;
366 | min-height: 100%;
367 | }
368 | body {
369 | /* Margin bottom by footer height */
370 | margin-bottom: 60px;
371 | }
372 | .footer {
373 | position: absolute;
374 | bottom: 0;
375 | width: 100%;
376 | /* Set the fixed height of the footer here */
377 | height: 60px;
378 | }
379 |
380 | /* Custom page CSS
381 | -------------------------------------------------- */
382 | /* Not required for template or sticky footer method. */
383 |
384 | .container {
385 | width: auto;
386 | max-width: 680px;
387 | padding: 0 15px;
388 | }
389 | .container .text-muted {
390 | margin: 20px 0;
391 | color: #FFFFFF !important;
392 | }
393 |
--------------------------------------------------------------------------------
/html/css/quality/jiraInfo.css:
--------------------------------------------------------------------------------
1 | a {
2 | cursor:pointer;
3 | }
--------------------------------------------------------------------------------
/html/img/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OuterCloud/JiraHelper/075dd0e67969f1e14db15f5c464adb77650190b9/html/img/favicon.ico
--------------------------------------------------------------------------------
/html/img/logo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OuterCloud/JiraHelper/075dd0e67969f1e14db15f5c464adb77650190b9/html/img/logo.gif
--------------------------------------------------------------------------------
/html/img/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OuterCloud/JiraHelper/075dd0e67969f1e14db15f5c464adb77650190b9/html/img/logo.png
--------------------------------------------------------------------------------
/html/js/ajax.js:
--------------------------------------------------------------------------------
1 | /*
2 | * 动态插入flash组件
3 | * 2012-04-27 马超 创建
4 | * 2012-05-04 马超 增加Flash插件探测接口
5 | *
6 | * [接口说明]
7 | * $.easyFlash.insert(dom, option) 将Flash插入到制定的Dom节点中(innerHTML方法)
8 | * $.easyFlash.write(dom, option) 将Flash插入到页面中(document.write方法)
9 | * $.easyFlash.support 浏览器是否安装了Flash插件
10 | * $.easyFlash.version Flash插件的版本(无插件就是0)
11 | *
12 | * [option参数说明]
13 | * path : flash路径
14 | * id : flash的ID
15 | * width : flash的宽度
16 | * height : flash的高度
17 | * vars : flash初始化传递的参数[可选]
18 | * bgcolor : flash默认的背景色[可选,默认白色]
19 | * fullScreen : 是否允许全屏[可选,默认否]
20 | * loop : flahs是否循环播放[可选,默认否]
21 | * lowVersion : flash最低版本要求,仅对IE有效[可选,默认9.0]
22 | */
23 | (function(window, $) {
24 | /*
25 | * 探测浏览器是否支持Flash插件
26 | */
27 | var support = false,
28 | version = 0,
29 | detectFlash = function() {
30 | //navigator.mimeTypes是MIME类型,包含插件信息
31 | var nav = window.navigator,
32 | mime = nav.mimeTypes,
33 | flash, plugin, activeX, regVer = /^[\D]+([^ ]+)/;
34 | if (mime.length) {
35 | flash = mime["application/x-shockwave-flash"];
36 | if (flash) {
37 | plugin = flash.enabledPlugin;
38 | if (plugin) {
39 | support = true;
40 | version = +String(nav.plugins["Shockwave Flash"].description).match(regVer)[1];
41 | }
42 | }
43 | //如果是ie则尝试创建ActiveXObject
44 | } else if (self.ActiveXObject) {
45 | try {
46 | activeX = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');
47 | support = true;
48 | version = +String(activeX.GetVariable("$version")).match(regVer)[1].replace(/,(\d+).*$/, ".$1");
49 | } catch (e) {
50 | support = false;
51 | version = 0;
52 | }
53 | }
54 | },
55 | /*
56 | * 创建Flash的html代码
57 | */
58 | getHTML = function(path, id, width, height, vars, bgcolor, fullScreen, loop, lowVersion) {
59 | // return HTML for movie
60 | var protocal = window.location.href.match(/^[^\/]+\/\//i)[0],
61 | html = $.browser.msie ? [''
66 | ] : [''
70 | ];
71 | return html.join("");
72 | },
73 | /*
74 | * 将Flash代码插入到制定Dom中
75 | */
76 | insertFlash = function(dom, option) {
77 | //检查参数
78 | var op = $.extend({}, option || {}),
79 | html;
80 | if (!op.path || !op.id || !op.width || !op.height)
81 | return;
82 | //检查lowVersion
83 | op.lowVersion = String(op.lowVersion || "9,0,0,0").replace(/\./g, ",");
84 | //创建html
85 | html = getHTML(op.path, op.id, op.width, op.height, op.vars || "", op.bgcolor || "#ffffff", op.fullScreen ? "true" : "false", op.loop ? "true" : "false", op.lowVersion);
86 | //写入到页面
87 | dom ? $(dom).eq(0).html(html) : document.write(html);
88 | };
89 | // 立即检测浏览器是否是否支持Flash插件以及插件版本
90 | detectFlash();
91 | /*
92 | * 扩展接口
93 | */
94 | $.easyFlash = {
95 | insert: insertFlash,
96 | write: function(op) {
97 | insertFlash(null, op);
98 | },
99 | support: support,
100 | version: version
101 | };
102 | })(window, jQuery);
103 |
104 | /**
105 | * 跨域ajax(flash实现)
106 | */
107 | (function($) {
108 | var flashAgent = document.getElementById("ajaxFlashAgent");
109 | //插入flash
110 | $(function() {
111 | if (!flashAgent) {
112 | $(document.body).append("
");
113 | $.easyFlash.insert("#ajaxFlashWrap", {
114 | id: "ajaxFlashAgent",
115 | path: "/swf/CrossDomain.swf",
116 | width: 100,
117 | height: 100
118 | });
119 | flashAgent = document.getElementById("ajaxFlashAgent");
120 | }
121 | });
122 |
123 | /**
124 | * 跨域ajax包装接口
125 | */
126 | $.AJAX = function(type, url, data, callback) {
127 | //console.log("AJAX(", type, url, data, callback, ")");
128 |
129 | if (!flashAgent) {
130 | console.log("not find flashAgent, and wait ...");
131 | window.setTimeout(function() {
132 | $.AJAX(type, url, data, callback);
133 | }, 100);
134 | return;
135 | }
136 | if ($.isFunction(data)) {
137 | callback = data;
138 | data = "";
139 | }
140 | var callbackName = "flashAJAXCallBack" + (+new Date()) + parseInt(Math.random() * 489);
141 | window[callbackName] = function(ret) {
142 | //console.log("call flash OK, ret is ", ret);
143 | if ($.isFunction(callback)) {
144 | callback(ret);
145 | }
146 | window[callbackName] = undefined;
147 | };
148 | var _url = url.replace(/#.+$/, "");
149 | _url += _url.indexOf("?") > 0 ? "&cache=" : "?cache=";
150 | _url += +new Date();
151 | /*console.log("ready call flash, and data is:",
152 | _url,
153 | type,
154 | callbackName,
155 | data
156 | );*/
157 | try{
158 | flashAgent.startRequest([
159 | _url,
160 | type,
161 | callbackName,
162 | data
163 | ]);
164 | }catch(e){
165 | window.setTimeout(function() {
166 | $.AJAX(type, url, data, callback);
167 | }, 100);
168 | }
169 | };
170 |
171 | $.GET = function(url, data, callback) {
172 | $.AJAX("get", url, data, callback);
173 | };
174 | $.POST = function(url, data, callback) {
175 | $.AJAX("post", url, data, callback);
176 | };
177 |
178 | console.log("组件加载完毕");
179 |
180 | })(window.jQuery);
181 |
--------------------------------------------------------------------------------
/html/js/common/jquery.disable.1.0.js:
--------------------------------------------------------------------------------
1 | // jQuery Disable plugin version 1.0
2 | // Author: Andreas Nylin, andreas.nylin@gmail.com, http://andreasnylin.com
3 | (function($) {
4 | $.fn.disable = function(options) {
5 | var opts = $.extend({}, $.fn.disable.defaults, options);
6 |
7 | function disable($this) {
8 | $this.attr('disabled', 'disabled');
9 |
10 | if(opts.cssClass !== '') {
11 | $this.addClass(opts.cssClass);
12 | }
13 |
14 | if(opts.disableEveryElement === true){
15 | $this.find('*').addClass('disabled');
16 | }
17 |
18 | //add mask
19 | var $loading = $("").attr('style',
20 | 'left:'+($this.width()/2-8)+'px;'+
21 | 'top:'+($this.height() /2-5)+'px;');
22 | $("").appendTo($this)
23 | .addClass(opts.maskClass)
24 | .append($loading);
25 | }
26 |
27 | function enable($this) {
28 | $this.removeAttr('disabled');
29 | //remove mask
30 | $this.find("."+opts.maskClass).remove();
31 | $this.removeClass(opts.cssClass);
32 | if(opts.disableEveryElement === true){
33 | $this.find('*').removeClass('disabled');
34 | }
35 |
36 | }
37 |
38 | function setEnableTimeout($this) {
39 | setTimeout(function() {
40 | enable($this);
41 | }, opts.enableAfterSeconds * 1000);
42 | }
43 |
44 | //ajax完成后,调用ajaxEnable,ajaxCallback回调处理后续渲染工作
45 | function setAjaxEnable($this) {
46 | $.ajax({
47 | url:opts.ajaxUrl,
48 | data:opts.ajaxData,
49 | success:function(data){
50 | opts.ajaxCallback(data);
51 | enable($this);
52 | }
53 | });
54 | }
55 |
56 | return this.each(function() {
57 | var $this = $(this);
58 |
59 | disable($this);
60 |
61 | if(opts.enableAfterSeconds > 0) {
62 | setEnableTimeout($this);
63 | }
64 |
65 | if(opts.enableOnAjaxComplete || opts.enableOnAjaxSuccess) {
66 | setAjaxEnable($this);
67 | }
68 | });
69 | };
70 |
71 | $.fn.disable.defaults = {
72 | cssClass: 'js-disabled',
73 | maskClass: 'js-disabled-mask',
74 | enableAfterSeconds: 0,
75 | enableOnAjaxComplete: false,
76 | enableOnAjaxSuccess: false,
77 | disableEveryElement: false,//把每个元素的class都设置为.diabled
78 | ajaxUrl: null,
79 | ajaxResponseText: null,
80 | ajaxCallback:null
81 | };
82 | })(jQuery);
83 |
84 |
85 |
86 |
87 | (function($) {
88 | $.fn.disable_restore = function(options) {
89 | var opts = $.extend({}, $.fn.disable.defaults, options);
90 | function enable($this) {
91 | $this.removeAttr('disabled');
92 | //remove mask
93 | $this.find("."+opts.maskClass).remove();
94 | $this.removeClass(opts.cssClass);
95 | $this.find('*').removeClass('disabled');
96 | }
97 |
98 | return this.each(function() {
99 | var $this = $(this);
100 |
101 | enable($this);
102 | });
103 | };
104 |
105 | $.fn.disable.defaults = {
106 | cssClass: 'js-disabled',
107 | maskClass: 'js-disabled-mask',
108 | enableAfterSeconds: 0,
109 | enableOnAjaxComplete: false,
110 | enableOnAjaxSuccess: false,
111 | disableEveryElement: false,//把每个元素的class都设置为.diabled
112 | ajaxUrl: null,
113 | ajaxData:{},
114 | ajaxResponseText: null,
115 | ajaxCallback:null
116 | };
117 | })(jQuery);
--------------------------------------------------------------------------------
/html/js/common/jquery.requestForm.js:
--------------------------------------------------------------------------------
1 | // Generated by CoffeeScript 1.6.1
2 | (function() {
3 | // 在chosen基础上添加添加tag样式的插件。未找到结果也可以添加选项
4 | $.fn.extend({
5 | tagStyle: function(){
6 |
7 | // get the chosen object
8 | var select = $(this);
9 | var chosen = select.data('chosen');
10 |
11 | // Bind the keyup event to the search box input
12 | chosen.search_field.on('keyup', function(e)
13 | {
14 | // if we hit Enter and the results list is empty (no matches) add the option
15 | if (e.which == 13 && chosen.dropdown.find('li.no-results').length > 0)
16 | {
17 | var option = $("
9 | <@htmlNavFoot />
10 | <@htmlFoot/>
11 |
12 |
--------------------------------------------------------------------------------
/src/main/webapp/WEB-INF/ftl/quality/jiraInfo.ftl:
--------------------------------------------------------------------------------
1 |
2 | <#include "../inc/core.ftl">
3 | <@htmHead title="质量保障系统"
4 | otherJs=["/js/quality/jiraInfo.js", "/js/quality/myJiraInfo.js", "/js/common/spin.js", "/js/common/bootbox.js", "/js/common/echarts.js", "/js/common/intro.js"]
5 | otherCss=["/css/common/introjs.css","/css/quality/jiraInfo.css"]
6 | />
7 | <@htmlNavHead activeName="jiraInfo"/>
8 |
9 |
18 |
19 |
25 |
26 |
27 |
28 |
29 |
30 |
41 | <@htmlNavFoot />
42 | <@htmlFoot/>
43 |
44 |
--------------------------------------------------------------------------------
/src/main/webapp/WEB-INF/ftl/quality/myJiraInfo.ftl:
--------------------------------------------------------------------------------
1 |
2 | <#include "../inc/core.ftl">
3 | <@htmHead title="质量保障系统"
4 | otherJs=["/js/quality/jiraInfo.js", "/js/quality/myJiraInfo.js", "/js/common/spin.js", "/js/common/bootbox.js", "/js/common/echarts.js", "/js/common/intro.js"]
5 | otherCss=["/css/common/introjs.css","/css/quality/jiraInfo.css"]
6 | />
7 | <@htmlNavHead activeName="myJiraInfo"/>
8 |
9 |
16 |
17 |
18 | JIRA标题 |
19 |
20 |
21 | <#list searchResult as result>
22 | ${result.issueSummary} |
23 | #list>
24 |
25 |
26 |
27 |
30 | <@htmlNavFoot />
31 | <@htmlFoot/>
32 |
33 |
--------------------------------------------------------------------------------
/src/main/webapp/WEB-INF/spring-mvc.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
28 |
29 |
30 |
32 |
33 |
34 | text/html;charset=UTF-8
35 |
36 |
37 |
38 |
40 |
41 |
42 | application/json;charset=UTF-8
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/src/main/webapp/WEB-INF/web.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | contextConfigLocation
5 |
6 | classpath*:/applicationContext.xml
7 |
8 |
9 |
10 |
11 | org.springframework.web.context.ContextLoaderListener
12 |
13 |
14 | org.springframework.web.util.IntrospectorCleanupListener
15 |
16 |
17 | org.springframework.web.context.request.RequestContextListener
18 |
19 |
20 |
21 | setCharacterEncoding
22 | org.springframework.web.filter.CharacterEncodingFilter
23 |
24 | encoding
25 | UTF-8
26 |
27 |
28 |
29 | DelegatingFilterProxy
30 | org.springframework.web.filter.DelegatingFilterProxy
31 |
32 | targetBeanName
33 |
34 | sessionFilter
35 |
36 |
37 | targetFilterLifecycle
38 | true
39 |
40 |
41 |
42 | setCharacterEncoding
43 | /*
44 |
45 |
46 | DelegatingFilterProxy
47 | /*
48 |
49 |
50 | mock
51 | org.springframework.web.servlet.DispatcherServlet
52 |
53 | contextConfigLocation
54 | /WEB-INF/spring-mvc.xml
55 |
56 | 1
57 |
58 |
59 | mock
60 | *.html
61 |
62 |
--------------------------------------------------------------------------------