├── .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 |
10 |
11 | 16 |
17 |
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 |
10 |
11 | 14 |
15 |
16 | 17 | 18 | 19 | 20 | 21 | <#list searchResult as result> 22 | 23 | 24 | 25 |
JIRA标题
${result.issueSummary}
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 | --------------------------------------------------------------------------------