Commit 774fd11e3f3ec07a73c8c5f7b52c1ce144360e6b
1 parent
ca0c3273
1.CSP header
2.密码验证、强制更新弱密码,管理员重置密码,解锁账号 3.白名单套装 4.密码错误多次锁定账号
Showing
42 changed files
with
5924 additions
and
3297 deletions
src/main/java/com/bsth/Application.java
| 1 | -package com.bsth; | ||
| 2 | - | ||
| 3 | -import com.fasterxml.jackson.databind.ObjectMapper; | ||
| 4 | -import com.fasterxml.jackson.databind.SerializationFeature; | ||
| 5 | -import org.springframework.boot.SpringApplication; | ||
| 6 | -import org.springframework.boot.autoconfigure.SpringBootApplication; | ||
| 7 | -import org.springframework.boot.builder.SpringApplicationBuilder; | ||
| 8 | -import org.springframework.boot.context.web.SpringBootServletInitializer; | ||
| 9 | -import org.springframework.context.annotation.Bean; | ||
| 10 | -import org.springframework.context.annotation.Primary; | ||
| 11 | -import org.springframework.transaction.annotation.EnableTransactionManagement; | ||
| 12 | - | ||
| 13 | -import java.util.concurrent.Executors; | ||
| 14 | -import java.util.concurrent.ScheduledExecutorService; | ||
| 15 | - | ||
| 16 | -@EnableTransactionManagement | ||
| 17 | -@SpringBootApplication | ||
| 18 | -public class Application extends SpringBootServletInitializer { | ||
| 19 | - | ||
| 20 | - public static ScheduledExecutorService mainServices = Executors.newScheduledThreadPool(18); | ||
| 21 | - | ||
| 22 | - @Override | ||
| 23 | - protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { | ||
| 24 | - return application.sources(Application.class); | ||
| 25 | - } | ||
| 26 | - | ||
| 27 | - @Bean | ||
| 28 | - @Primary | ||
| 29 | - public ObjectMapper objectMapper() { | ||
| 30 | - ObjectMapper objectMapper = new ObjectMapper(); | ||
| 31 | - objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); | ||
| 32 | - | ||
| 33 | - return objectMapper; | ||
| 34 | - } | ||
| 35 | - | ||
| 36 | - public static void main(String[] args) throws Exception { | ||
| 37 | - SpringApplication.run(Application.class, args); | ||
| 38 | - } | 1 | +package com.bsth; |
| 2 | + | ||
| 3 | +import com.bsth.data.SystemParamCache; | ||
| 4 | +import com.fasterxml.jackson.databind.ObjectMapper; | ||
| 5 | +import com.fasterxml.jackson.databind.SerializationFeature; | ||
| 6 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 7 | +import org.springframework.boot.SpringApplication; | ||
| 8 | +import org.springframework.boot.autoconfigure.SpringBootApplication; | ||
| 9 | +import org.springframework.boot.builder.SpringApplicationBuilder; | ||
| 10 | +import org.springframework.boot.context.web.SpringBootServletInitializer; | ||
| 11 | +import org.springframework.context.annotation.Bean; | ||
| 12 | +import org.springframework.context.annotation.Primary; | ||
| 13 | +import org.springframework.transaction.annotation.EnableTransactionManagement; | ||
| 14 | + | ||
| 15 | +import java.util.concurrent.Executors; | ||
| 16 | +import java.util.concurrent.ScheduledExecutorService; | ||
| 17 | + | ||
| 18 | +@EnableTransactionManagement | ||
| 19 | +@SpringBootApplication | ||
| 20 | +public class Application extends SpringBootServletInitializer { | ||
| 21 | + | ||
| 22 | + public static ScheduledExecutorService mainServices = Executors.newScheduledThreadPool(21); | ||
| 23 | + | ||
| 24 | + @Autowired | ||
| 25 | + private SystemParamCache systemParamCache; | ||
| 26 | + | ||
| 27 | + @Override | ||
| 28 | + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { | ||
| 29 | + return application.sources(Application.class); | ||
| 30 | + } | ||
| 31 | + | ||
| 32 | + @Bean | ||
| 33 | + @Primary | ||
| 34 | + public ObjectMapper objectMapper() { | ||
| 35 | + ObjectMapper objectMapper = new ObjectMapper(); | ||
| 36 | + objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); | ||
| 37 | + | ||
| 38 | + return objectMapper; | ||
| 39 | + } | ||
| 40 | + | ||
| 41 | + public static void main(String[] args) throws Exception { | ||
| 42 | + SpringApplication.run(Application.class, args); | ||
| 43 | + } | ||
| 39 | } | 44 | } |
| 40 | \ No newline at end of file | 45 | \ No newline at end of file |
src/main/java/com/bsth/common/Constants.java
| 1 | -package com.bsth.common; | ||
| 2 | - | ||
| 3 | -/** | ||
| 4 | - * | ||
| 5 | - * @ClassName: Constants | ||
| 6 | - * @Description: TODO(常量类) | ||
| 7 | - * @author PanZhao | ||
| 8 | - * @date 2016年3月18日 下午11:06:53 | ||
| 9 | - * | ||
| 10 | - */ | ||
| 11 | -public class Constants { | ||
| 12 | - | ||
| 13 | - /** | ||
| 14 | - * 不需要拦截的资源 | ||
| 15 | - */ | ||
| 16 | - public static final String LOGIN = "/user/login/**"; | ||
| 17 | - public static final String LOGIN_PAGE = "/login.html"; | ||
| 18 | - public static final String ASSETS_URL = "/assets/**"; | ||
| 19 | - public static final String FAVICON_URL = "/favicon.ico"; | ||
| 20 | - public static final String METRONIC_URL = "/metronic_v4.5.4/**"; | ||
| 21 | - public static final String LOGIN_FAILURE = "/user/loginFailure"; | ||
| 22 | - public static final String CAPTCHA = "/captcha.jpg"; | ||
| 23 | - public static final String XIANDIAO_LOGIN = "/xdlogin.html"; | ||
| 24 | - public static final String IPAD_IMG_URL = "/apple-touch-icon-72x72.png"; | ||
| 25 | - | ||
| 26 | - //对外的营运数据接口 | ||
| 27 | - public static final String SERVICE_INTERFACE = "/companyService/**"; | ||
| 28 | - | ||
| 29 | - /** | ||
| 30 | - * 线调部分子页面不做拦截,便于浏览器缓存 | ||
| 31 | - */ | ||
| 32 | - public static final String XD_CHILD_PAGES = "/real_control_v2/**"; | ||
| 33 | - public static final String XD_REAL_GPS = "/gps/real/line"; | ||
| 34 | - //public static final String XD_TEMPS = "/pages/control/line/temps/**"; | ||
| 35 | - | ||
| 36 | - //车载网关上行接口 | ||
| 37 | - public static final String UPSTREAM_URL = "/control/upstream"; | ||
| 38 | - //rfid 上传入口 | ||
| 39 | - public static final String UP_RFID_URL = "/rfid/**"; | ||
| 40 | - | ||
| 41 | - public static final String SESSION_USERNAME = "sessionUserName"; | ||
| 42 | - public static final String COMPANY_AUTHORITYS = "cmyAuths"; | ||
| 43 | - public static final String STATION_AND_SECTION_COUNT = "/station/updateStationAndSectionCode"; | ||
| 44 | - | ||
| 45 | - /** | ||
| 46 | - * 解除调度指令和班次的外键约束 | ||
| 47 | - */ | ||
| 48 | - public static final String REMOVE_DIRECTIVE_SCH_FK = "update bsth_v_directive_60 set sch=NULL where sch=?"; | ||
| 49 | - | ||
| 50 | - /** | ||
| 51 | - * 批量解除调度指令和班次的外键约束 | ||
| 52 | - */ | ||
| 53 | - public static final String MULTI_REMOVE_DIRECTIVE_SCH_FK = "update bsth_v_directive_60 set sch=NULL where sch in "; | ||
| 54 | -} | 1 | +package com.bsth.common; |
| 2 | + | ||
| 3 | +/** | ||
| 4 | + * | ||
| 5 | + * @ClassName: Constants | ||
| 6 | + * @Description: TODO(常量类) | ||
| 7 | + * @author PanZhao | ||
| 8 | + * @date 2016年3月18日 下午11:06:53 | ||
| 9 | + * | ||
| 10 | + */ | ||
| 11 | +public class Constants { | ||
| 12 | + | ||
| 13 | + /** | ||
| 14 | + * 不需要拦截的资源 | ||
| 15 | + */ | ||
| 16 | + public static final String LOGIN = "/user/login/**"; | ||
| 17 | + public static final String ORIGINAL_LOGIN_PAGE = "/login.html"; | ||
| 18 | + public static String LOGIN_PAGE = "/login.html"; | ||
| 19 | + public static final String ASSETS_URL = "/assets/**"; | ||
| 20 | + public static final String FAVICON_URL = "/favicon.ico"; | ||
| 21 | + public static final String METRONIC_URL = "/metronic_v4.5.4/**"; | ||
| 22 | + public static final String LOGIN_FAILURE = "/user/loginFailure"; | ||
| 23 | + public static final String CAPTCHA = "/captcha.jpg"; | ||
| 24 | + public static final String XIANDIAO_LOGIN = "/xdlogin.html"; | ||
| 25 | + public static final String IPAD_IMG_URL = "/apple-touch-icon-72x72.png"; | ||
| 26 | + | ||
| 27 | + //对外的营运数据接口 | ||
| 28 | + public static final String SERVICE_INTERFACE = "/companyService/**"; | ||
| 29 | + | ||
| 30 | + /** | ||
| 31 | + * 线调部分子页面不做拦截,便于浏览器缓存 | ||
| 32 | + */ | ||
| 33 | + public static final String XD_CHILD_PAGES = "/real_control_v2/**"; | ||
| 34 | + public static final String XD_REAL_GPS = "/gps/real/line"; | ||
| 35 | + //public static final String XD_TEMPS = "/pages/control/line/temps/**"; | ||
| 36 | + | ||
| 37 | + //车载网关上行接口 | ||
| 38 | + public static final String UPSTREAM_URL = "/control/upstream"; | ||
| 39 | + //rfid 上传入口 | ||
| 40 | + public static final String UP_RFID_URL = "/rfid/**"; | ||
| 41 | + | ||
| 42 | + public static final String SESSION_USERNAME = "sessionUserName"; | ||
| 43 | + public static final String COMPANY_AUTHORITYS = "cmyAuths"; | ||
| 44 | + public static final String STATION_AND_SECTION_COUNT = "/station/updateStationAndSectionCode"; | ||
| 45 | + | ||
| 46 | + /** | ||
| 47 | + * 解除调度指令和班次的外键约束 | ||
| 48 | + */ | ||
| 49 | + public static final String REMOVE_DIRECTIVE_SCH_FK = "update bsth_v_directive_60 set sch=NULL where sch=?"; | ||
| 50 | + | ||
| 51 | + /** | ||
| 52 | + * 批量解除调度指令和班次的外键约束 | ||
| 53 | + */ | ||
| 54 | + public static final String MULTI_REMOVE_DIRECTIVE_SCH_FK = "update bsth_v_directive_60 set sch=NULL where sch in "; | ||
| 55 | + | ||
| 56 | + /** | ||
| 57 | + * 批量解除子任务和班次的外键约束 | ||
| 58 | + */ | ||
| 59 | + public static final String MULTI_REMOVE_CHILDTASK_SCH_FK = "update bsth_c_s_child_task set schedule=NULL where schedule in "; | ||
| 60 | + | ||
| 61 | + public static final String WEAK_CIPHER = "weakCipher"; | ||
| 62 | + | ||
| 63 | + public static final String FILE_AUTH = "/.well-known/pki-validation/fileauth.txt"; | ||
| 64 | + | ||
| 65 | + public static final String SSO_TOKEN = "ssoToken"; | ||
| 66 | + | ||
| 67 | + public static final String RESOURCE_AUTHORITYS = "resourceAuthoritys"; | ||
| 68 | +} |
src/main/java/com/bsth/common/SystemParamKeys.java
0 → 100644
| 1 | +package com.bsth.common; | ||
| 2 | + | ||
| 3 | +/** | ||
| 4 | + * @author Hill | ||
| 5 | + */ | ||
| 6 | +public class SystemParamKeys { | ||
| 7 | + | ||
| 8 | + public static final String SPECIAL_ROLES = "special.roles"; | ||
| 9 | + | ||
| 10 | + public static final String SPECIAL_DAYS = "special.days"; | ||
| 11 | + | ||
| 12 | + public static final String URL_HTTP_GPS_REAL_CACHE = "url.http.gps.real.cache"; | ||
| 13 | + | ||
| 14 | + public static final String URL_HTTP_GPS_REAL = "url.http.gps.real"; | ||
| 15 | + | ||
| 16 | + public static final String URL_HTTP_DIRECTIVE = "url.http.directive"; | ||
| 17 | + | ||
| 18 | + public static final String URL_HTTP_RFID = "url.http.rfid"; | ||
| 19 | + | ||
| 20 | + public static final String URL_HTTP_REPORT = "url.http.report.%s"; | ||
| 21 | + | ||
| 22 | + public static final String URL_HTTP_TICKETING = "url.http.ticketing"; | ||
| 23 | + | ||
| 24 | + public static final String URL_HTTP_DSM_ACK = "url.http.dsm.ack"; | ||
| 25 | + | ||
| 26 | + public static final String URL_HTTP_CP_ACK = "url.http.cp.ack"; | ||
| 27 | + | ||
| 28 | + public static final String MAIL_ADMIN = "mail.admin"; | ||
| 29 | + | ||
| 30 | + public static final String MAIL_WAYBILL = "mail.waybill"; | ||
| 31 | + | ||
| 32 | + public static final String ENABLED_FIRST_LAST_GENERATION = "enabled.first.last.generation"; | ||
| 33 | + | ||
| 34 | + public static final String ENABLED_FILTER_SQL_INJECTION = "enabled.filter.sql.injection"; | ||
| 35 | + | ||
| 36 | + public static final String ENABLED_SSO = "enabled.sso"; | ||
| 37 | + | ||
| 38 | + public static final String SSO_SYSTEM_CODE = "sso.system.code"; | ||
| 39 | + | ||
| 40 | + public static final String URL_HTTP_SSO_LOGIN = "url.http.sso.login"; | ||
| 41 | + | ||
| 42 | + public static final String URL_HTTP_SSO_LOGOUT = "url.http.sso.logout"; | ||
| 43 | + | ||
| 44 | + public static final String URL_HTTP_SSO_AUTH = "url.http.sso.auth"; | ||
| 45 | + | ||
| 46 | + public static final String URL_HTTP_MAINTENANCE = "url.http.maintenance"; | ||
| 47 | + | ||
| 48 | + public static final String ENABLED_WHITE_IP = "enabled.white.ip"; | ||
| 49 | + | ||
| 50 | + public static final String ENABLED_FILTER_AUTHORITY = "enabled.filter.authority"; | ||
| 51 | + | ||
| 52 | + public static final String URL_HTTP_DVR = "url.http.dvr"; | ||
| 53 | + | ||
| 54 | + public static final String URL_HTTP_DVR_PWD = "url.http.dvr.pwd"; | ||
| 55 | +} | ||
| 0 | \ No newline at end of file | 56 | \ No newline at end of file |
src/main/java/com/bsth/controller/realcontrol/AdminUtilsController.java
| 1 | package com.bsth.controller.realcontrol; | 1 | package com.bsth.controller.realcontrol; |
| 2 | 2 | ||
| 3 | -import ch.qos.logback.classic.Level; | ||
| 4 | -import ch.qos.logback.classic.LoggerContext; | 3 | +import java.util.*; |
| 4 | + | ||
| 5 | import com.bsth.data.BasicData; | 5 | import com.bsth.data.BasicData; |
| 6 | +import com.bsth.service.SectionService; | ||
| 7 | +import com.bsth.service.StationService; | ||
| 6 | import com.bsth.data.directive.DayOfDirectives; | 8 | import com.bsth.data.directive.DayOfDirectives; |
| 7 | import com.bsth.data.directive.DirectivesPstThread; | 9 | import com.bsth.data.directive.DirectivesPstThread; |
| 10 | +import com.bsth.data.directive.GatewayHttpUtils; | ||
| 8 | import com.bsth.data.gpsdata_v2.cache.GeoCacheData; | 11 | import com.bsth.data.gpsdata_v2.cache.GeoCacheData; |
| 9 | import com.bsth.data.gpsdata_v2.handlers.overspeed.OverspeedProcess; | 12 | import com.bsth.data.gpsdata_v2.handlers.overspeed.OverspeedProcess; |
| 13 | +import com.bsth.data.gpsdata_v2.load.GatewayHttpLoader; | ||
| 14 | +import com.bsth.data.gpsdata_v2.load.SocketClientLoader; | ||
| 10 | import com.bsth.data.gpsdata_v2.thread.GpsDataLoaderThread; | 15 | import com.bsth.data.gpsdata_v2.thread.GpsDataLoaderThread; |
| 11 | import com.bsth.data.msg_queue.DirectivePushQueue; | 16 | import com.bsth.data.msg_queue.DirectivePushQueue; |
| 12 | import com.bsth.data.msg_queue.WebSocketPushQueue; | 17 | import com.bsth.data.msg_queue.WebSocketPushQueue; |
| 13 | import com.bsth.data.pilot80.PilotReport; | 18 | import com.bsth.data.pilot80.PilotReport; |
| 14 | import com.bsth.data.schedule.DayOfSchedule; | 19 | import com.bsth.data.schedule.DayOfSchedule; |
| 15 | import com.bsth.entity.realcontrol.ScheduleRealInfo; | 20 | import com.bsth.entity.realcontrol.ScheduleRealInfo; |
| 16 | -import com.bsth.websocket.handler.SendUtils; | 21 | +import com.bsth.service.SystemParamService; |
| 22 | +import com.bsth.util.MailUtils; | ||
| 17 | import com.fasterxml.jackson.databind.ObjectMapper; | 23 | import com.fasterxml.jackson.databind.ObjectMapper; |
| 18 | import org.slf4j.Logger; | 24 | import org.slf4j.Logger; |
| 19 | import org.slf4j.LoggerFactory; | 25 | import org.slf4j.LoggerFactory; |
| @@ -22,10 +28,10 @@ import org.springframework.web.bind.annotation.RequestMapping; | @@ -22,10 +28,10 @@ import org.springframework.web.bind.annotation.RequestMapping; | ||
| 22 | import org.springframework.web.bind.annotation.RequestParam; | 28 | import org.springframework.web.bind.annotation.RequestParam; |
| 23 | import org.springframework.web.bind.annotation.RestController; | 29 | import org.springframework.web.bind.annotation.RestController; |
| 24 | 30 | ||
| 25 | -import java.util.HashMap; | ||
| 26 | -import java.util.List; | ||
| 27 | -import java.util.Map; | ||
| 28 | -import java.util.Set; | 31 | +import com.bsth.websocket.handler.SendUtils; |
| 32 | + | ||
| 33 | +import ch.qos.logback.classic.Level; | ||
| 34 | +import ch.qos.logback.classic.LoggerContext; | ||
| 29 | 35 | ||
| 30 | /** | 36 | /** |
| 31 | * Created by panzhao on 2017/4/14. | 37 | * Created by panzhao on 2017/4/14. |
| @@ -56,8 +62,29 @@ public class AdminUtilsController { | @@ -56,8 +62,29 @@ public class AdminUtilsController { | ||
| 56 | PilotReport pilotReport; | 62 | PilotReport pilotReport; |
| 57 | 63 | ||
| 58 | @Autowired | 64 | @Autowired |
| 65 | + private MailUtils mailUtils; | ||
| 66 | + | ||
| 67 | + @Autowired | ||
| 59 | private BasicData.BasicDataLoader basicDataLoader; | 68 | private BasicData.BasicDataLoader basicDataLoader; |
| 60 | 69 | ||
| 70 | + @Autowired | ||
| 71 | + private SectionService sectionService; | ||
| 72 | + | ||
| 73 | + @Autowired | ||
| 74 | + private StationService stationService; | ||
| 75 | + | ||
| 76 | + @Autowired | ||
| 77 | + private SystemParamService systemParamService; | ||
| 78 | + | ||
| 79 | + @Autowired | ||
| 80 | + private SocketClientLoader socketClientLoader; | ||
| 81 | + | ||
| 82 | + @Autowired | ||
| 83 | + private GatewayHttpLoader gatewayHttpLoader; | ||
| 84 | + | ||
| 85 | + @Autowired | ||
| 86 | + private GatewayHttpUtils gatewayHttpUtils; | ||
| 87 | + | ||
| 61 | /** | 88 | /** |
| 62 | * 出现重复班次的车辆 | 89 | * 出现重复班次的车辆 |
| 63 | * | 90 | * |
| @@ -218,9 +245,71 @@ public class AdminUtilsController { | @@ -218,9 +245,71 @@ public class AdminUtilsController { | ||
| 218 | 245 | ||
| 219 | @RequestMapping("/reloadSystemParam") | 246 | @RequestMapping("/reloadSystemParam") |
| 220 | public String reloadSystemParam() { | 247 | public String reloadSystemParam() { |
| 248 | + try { | ||
| 249 | + systemParamService.refresh(); | ||
| 250 | + | ||
| 251 | + return "success"; | ||
| 252 | + } catch (Exception e) { | ||
| 253 | + e.printStackTrace(); | ||
| 254 | + } | ||
| 255 | + | ||
| 256 | + return "error"; | ||
| 257 | + } | ||
| 258 | + | ||
| 259 | + @RequestMapping("/applySystemParam") | ||
| 260 | + public String applySystemParam() { | ||
| 261 | + try { | ||
| 262 | + socketClientLoader.afterPropertiesSet(); | ||
| 263 | + gatewayHttpLoader.afterPropertiesSet(); | ||
| 264 | + gatewayHttpUtils.afterPropertiesSet(); | ||
| 265 | + //rfidHttpLoader.afterPropertiesSet(); | ||
| 266 | + //ssoConfig.afterPropertiesSet(); | ||
| 267 | + | ||
| 268 | + return "success"; | ||
| 269 | + } catch (Exception e) { | ||
| 270 | + e.printStackTrace(); | ||
| 271 | + } | ||
| 272 | + | ||
| 273 | + return "error"; | ||
| 274 | + } | ||
| 275 | + | ||
| 276 | + @RequestMapping("/reloadAndApplySystemParam") | ||
| 277 | + public String reloadAndApplySystemParam() { | ||
| 278 | + try { | ||
| 279 | + systemParamService.refresh(); | ||
| 280 | + | ||
| 281 | + socketClientLoader.afterPropertiesSet(); | ||
| 282 | + gatewayHttpLoader.afterPropertiesSet(); | ||
| 283 | + gatewayHttpUtils.afterPropertiesSet(); | ||
| 284 | + //rfidHttpLoader.afterPropertiesSet(); | ||
| 285 | + //ssoConfig.afterPropertiesSet(); | ||
| 286 | + | ||
| 287 | + return "success"; | ||
| 288 | + } catch (Exception e) { | ||
| 289 | + e.printStackTrace(); | ||
| 290 | + } | ||
| 291 | + | ||
| 292 | + return "error"; | ||
| 293 | + } | ||
| 294 | + | ||
| 295 | + @RequestMapping("/section/translateWgs2Bd") | ||
| 296 | + public String translateWgs2Bd1() { | ||
| 297 | + Map<String, Object> result = new HashMap<>(); | ||
| 298 | + try { | ||
| 299 | + //sectionService.translateWgs2Bd(); | ||
| 300 | + return "success"; | ||
| 301 | + } catch (Exception e) { | ||
| 302 | + e.printStackTrace(); | ||
| 303 | + } | ||
| 304 | + | ||
| 305 | + return "error"; | ||
| 306 | + } | ||
| 307 | + | ||
| 308 | + @RequestMapping("/station/translateWgs2Bd") | ||
| 309 | + public String translateWgs2Bd2() { | ||
| 221 | Map<String, Object> result = new HashMap<>(); | 310 | Map<String, Object> result = new HashMap<>(); |
| 222 | try { | 311 | try { |
| 223 | - basicDataLoader.loadSystemParam(); | 312 | + //stationService.translateWgs2Bd(); |
| 224 | return "success"; | 313 | return "success"; |
| 225 | } catch (Exception e) { | 314 | } catch (Exception e) { |
| 226 | e.printStackTrace(); | 315 | e.printStackTrace(); |
src/main/java/com/bsth/controller/sys/RoleController.java
| 1 | -package com.bsth.controller.sys; | ||
| 2 | - | ||
| 3 | -import java.util.Map; | ||
| 4 | - | ||
| 5 | -import org.springframework.beans.factory.annotation.Autowired; | ||
| 6 | -import org.springframework.web.bind.annotation.RequestMapping; | ||
| 7 | -import org.springframework.web.bind.annotation.RequestMethod; | ||
| 8 | -import org.springframework.web.bind.annotation.RequestParam; | ||
| 9 | -import org.springframework.web.bind.annotation.RestController; | ||
| 10 | - | ||
| 11 | -import com.bsth.controller.BaseController; | ||
| 12 | -import com.bsth.entity.sys.Role; | ||
| 13 | -import com.bsth.service.sys.RoleService; | ||
| 14 | - | ||
| 15 | -@RestController | ||
| 16 | -@RequestMapping("role") | ||
| 17 | -public class RoleController extends BaseController<Role, Integer>{ | ||
| 18 | - | ||
| 19 | - | ||
| 20 | - @Autowired | ||
| 21 | - RoleService roleService; | ||
| 22 | - | ||
| 23 | - /** | ||
| 24 | - * | ||
| 25 | - * @Title: settRoleModules | ||
| 26 | - * @Description: TODO(为角色设置模块,全量覆盖) | ||
| 27 | - * @param @param roleId 角色ID | ||
| 28 | - * @param @param mIds 模块ID字符串(1,2,3,4) | ||
| 29 | - * @throws | ||
| 30 | - */ | ||
| 31 | - @RequestMapping(value = "/settModules", method = RequestMethod.POST) | ||
| 32 | - public Map<String, Object> settRoleModules(@RequestParam Integer roleId,@RequestParam String mIds){ | ||
| 33 | - return roleService.settRoleModules(roleId, mIds); | ||
| 34 | - } | ||
| 35 | - | ||
| 36 | - /** | ||
| 37 | - * | ||
| 38 | - * @Title: roleInfo | ||
| 39 | - * @Description: TODO(角色信息) | ||
| 40 | - * @param @param id 角色ID | ||
| 41 | - * @throws | ||
| 42 | - */ | ||
| 43 | - @RequestMapping(value = "/roleInfo") | ||
| 44 | - public Map<String, Object> roleInfo(@RequestParam Integer id){ | ||
| 45 | - return roleService.roleInfo(id); | ||
| 46 | - } | ||
| 47 | -} | 1 | +package com.bsth.controller.sys; |
| 2 | + | ||
| 3 | +import java.util.Map; | ||
| 4 | + | ||
| 5 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 6 | +import org.springframework.web.bind.annotation.RequestMapping; | ||
| 7 | +import org.springframework.web.bind.annotation.RequestMethod; | ||
| 8 | +import org.springframework.web.bind.annotation.RequestParam; | ||
| 9 | +import org.springframework.web.bind.annotation.RestController; | ||
| 10 | + | ||
| 11 | +import com.bsth.controller.BaseController; | ||
| 12 | +import com.bsth.entity.sys.Role; | ||
| 13 | +import com.bsth.service.sys.RoleService; | ||
| 14 | + | ||
| 15 | +@RestController | ||
| 16 | +@RequestMapping("role") | ||
| 17 | +public class RoleController extends BaseController<Role, Integer>{ | ||
| 18 | + | ||
| 19 | + | ||
| 20 | + @Autowired | ||
| 21 | + RoleService roleService; | ||
| 22 | + | ||
| 23 | + /** | ||
| 24 | + * @param @param map | ||
| 25 | + * @throws | ||
| 26 | + * @Title: list | ||
| 27 | + * @Description: TODO(查询下级) | ||
| 28 | + */ | ||
| 29 | + @RequestMapping(value = "/findSubordinate", method = RequestMethod.GET) | ||
| 30 | + public Map<String, Object> findSubordinate() { | ||
| 31 | + return roleService.findSubordinate(); | ||
| 32 | + } | ||
| 33 | + | ||
| 34 | + /** | ||
| 35 | + * @param @param map | ||
| 36 | + * @Description: TODO(添加角色) | ||
| 37 | + * @return | ||
| 38 | + */ | ||
| 39 | + @RequestMapping(value = "/add", method = RequestMethod.POST) | ||
| 40 | + public Map<String, Object> add(Role role){ | ||
| 41 | + return roleService.add(role); | ||
| 42 | + } | ||
| 43 | + | ||
| 44 | + /** | ||
| 45 | + * | ||
| 46 | + * @Title: settRoleModules | ||
| 47 | + * @Description: TODO(为角色设置模块,全量覆盖) | ||
| 48 | + * @param @param roleId 角色ID | ||
| 49 | + * @param @param mIds 模块ID字符串(1,2,3,4) | ||
| 50 | + * @throws | ||
| 51 | + */ | ||
| 52 | + @RequestMapping(value = "/settModules", method = RequestMethod.POST) | ||
| 53 | + public Map<String, Object> settRoleModules(@RequestParam Integer roleId,@RequestParam String mIds){ | ||
| 54 | + return roleService.settRoleModules(roleId, mIds); | ||
| 55 | + } | ||
| 56 | + | ||
| 57 | + /** | ||
| 58 | + * | ||
| 59 | + * @Title: roleInfo | ||
| 60 | + * @Description: TODO(角色信息) | ||
| 61 | + * @param @param id 角色ID | ||
| 62 | + * @throws | ||
| 63 | + */ | ||
| 64 | + @RequestMapping(value = "/roleInfo") | ||
| 65 | + public Map<String, Object> roleInfo(@RequestParam Integer id){ | ||
| 66 | + return roleService.roleInfo(id); | ||
| 67 | + } | ||
| 68 | + | ||
| 69 | + /** | ||
| 70 | + * 检查操作合法性 操作的是否是下级角色 | ||
| 71 | + * @param operationRoleId 下级角色Id | ||
| 72 | + * @return | ||
| 73 | + */ | ||
| 74 | + @RequestMapping(value = "/checkOperationLegality") | ||
| 75 | + public boolean checkOperationLegality(@RequestParam Integer operationRoleId){ | ||
| 76 | + return roleService.checkOperationLegality(operationRoleId); | ||
| 77 | + } | ||
| 78 | +} |
src/main/java/com/bsth/controller/sys/UserController.java
| 1 | -package com.bsth.controller.sys; | ||
| 2 | - | ||
| 3 | -import com.bsth.common.Constants; | ||
| 4 | -import com.bsth.common.ResponseCode; | ||
| 5 | -import com.bsth.controller.BaseController; | ||
| 6 | -import com.bsth.controller.sys.dto.CompanyData; | ||
| 7 | -import com.bsth.controller.sys.util.RSAUtils; | ||
| 8 | -import com.bsth.entity.sys.CompanyAuthority; | ||
| 9 | -import com.bsth.entity.sys.SysUser; | ||
| 10 | -import com.bsth.security.util.SecurityUtils; | ||
| 11 | -import com.bsth.service.logger.UserSignService; | ||
| 12 | -import com.bsth.service.sys.CompanyAuthorityService; | ||
| 13 | -import com.bsth.service.sys.SysUserService; | ||
| 14 | -import com.google.common.collect.ArrayListMultimap; | ||
| 15 | -import org.apache.commons.lang3.StringUtils; | ||
| 16 | -import org.slf4j.Logger; | ||
| 17 | -import org.slf4j.LoggerFactory; | ||
| 18 | -import org.springframework.beans.factory.annotation.Autowired; | ||
| 19 | -import org.springframework.security.authentication.BadCredentialsException; | ||
| 20 | -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; | ||
| 21 | -import org.springframework.security.web.authentication.session.SessionAuthenticationException; | ||
| 22 | -import org.springframework.web.bind.annotation.RequestMapping; | ||
| 23 | -import org.springframework.web.bind.annotation.RequestMethod; | ||
| 24 | -import org.springframework.web.bind.annotation.RequestParam; | ||
| 25 | -import org.springframework.web.bind.annotation.RestController; | ||
| 26 | - | ||
| 27 | -import javax.servlet.http.HttpServletRequest; | ||
| 28 | -import javax.servlet.http.HttpSession; | ||
| 29 | -import java.util.*; | ||
| 30 | - | ||
| 31 | -@RestController | ||
| 32 | -@RequestMapping("user") | ||
| 33 | -public class UserController extends BaseController<SysUser, Integer> { | ||
| 34 | - | ||
| 35 | - Logger logger = LoggerFactory.getLogger(this.getClass()); | ||
| 36 | - | ||
| 37 | - @Autowired | ||
| 38 | - SysUserService sysUserService; | ||
| 39 | - | ||
| 40 | - @Autowired | ||
| 41 | - CompanyAuthorityService companyAuthorityService; | ||
| 42 | - | ||
| 43 | - @Autowired | ||
| 44 | - UserSignService userLogInoutService; | ||
| 45 | - | ||
| 46 | - @RequestMapping(value = "/login/jCryptionKey") | ||
| 47 | - public Map<String, Object> jCryptionKey(HttpServletRequest request) { | ||
| 48 | - //公匙返回页面 | ||
| 49 | - Map<String, Object> rs = new HashMap<>(); | ||
| 50 | - rs.put("publickey", RSAUtils.generateBase64PublicKey()); | ||
| 51 | - return rs; | ||
| 52 | - } | ||
| 53 | - | ||
| 54 | - //需要验证码的账号 | ||
| 55 | - public static Map<String, Integer> captchaMap = new HashMap<>(); | ||
| 56 | - | ||
| 57 | - @RequestMapping(value = "/login", method = RequestMethod.POST) | ||
| 58 | - public Map<String, Object> login(HttpServletRequest request, @RequestParam String userName, | ||
| 59 | - @RequestParam String password, String captcha) { | ||
| 60 | - | ||
| 61 | - Map<String, Object> rs = new HashMap<>(); | ||
| 62 | - rs.put("status", ResponseCode.ERROR); | ||
| 63 | - try { | ||
| 64 | - HttpSession session = request.getSession(); | ||
| 65 | - rs.put("captcha", session.getAttribute("captcha")); | ||
| 66 | - | ||
| 67 | - if (captchaMap.get(userName) != null && captchaMap.get(userName) >= 3) { | ||
| 68 | - //校验验证码 | ||
| 69 | - String verCode = (String) session | ||
| 70 | - .getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY); | ||
| 71 | - | ||
| 72 | - if (StringUtils.isBlank(captcha)) | ||
| 73 | - return put(rs, "msg", "请输入验证码"); | ||
| 74 | - | ||
| 75 | - if (!verCode.equals(captcha)) | ||
| 76 | - return put(rs, "msg", "验证码有误,请刷新后重新输入"); | ||
| 77 | - } | ||
| 78 | - | ||
| 79 | - //解密RSA | ||
| 80 | - try { | ||
| 81 | - userName = RSAUtils.decryptBase64(userName); | ||
| 82 | - password = RSAUtils.decryptBase64(password); | ||
| 83 | - } catch (RuntimeException e) { | ||
| 84 | - return put(rs, "msg", "decrypt RSA fail!可能页面已过期,尝试刷新页面。"); | ||
| 85 | - } | ||
| 86 | - | ||
| 87 | - SysUser user = sysUserService.findByUserName(userName); | ||
| 88 | - if (null == user) | ||
| 89 | - return put(rs, "msg", "不存在的用户"); | ||
| 90 | - | ||
| 91 | - if (!user.isEnabled()) | ||
| 92 | - return put(rs, "msg", "该用户已被锁定,请联系管理员"); | ||
| 93 | - | ||
| 94 | - // 校验密码 | ||
| 95 | - boolean matchStatus = new BCryptPasswordEncoder(4).matches(password, user.getPassword()); | ||
| 96 | - if (!matchStatus) { | ||
| 97 | - rs.put("msg", "密码有误"); | ||
| 98 | - | ||
| 99 | - Integer captchSize = captchaMap.get(userName); | ||
| 100 | - if (null == captchSize) | ||
| 101 | - captchSize = 0; | ||
| 102 | - | ||
| 103 | - captchSize++; | ||
| 104 | - captchaMap.put(userName, captchSize); | ||
| 105 | - return rs; | ||
| 106 | - } | ||
| 107 | - | ||
| 108 | - // 登录 | ||
| 109 | - SecurityUtils.login(user, request); | ||
| 110 | - //session里写入用户名,webSocket连接时标识身份用 | ||
| 111 | - session.setAttribute(Constants.SESSION_USERNAME, user.getUserName()); | ||
| 112 | - | ||
| 113 | - //获取公司权限数据 | ||
| 114 | - List<CompanyAuthority> cmyAuths = companyAuthorityService.findByUser(user); | ||
| 115 | - session.setAttribute(Constants.COMPANY_AUTHORITYS, cmyAuths); | ||
| 116 | - | ||
| 117 | - captchaMap.remove(userName); | ||
| 118 | - rs.put("status", ResponseCode.SUCCESS); | ||
| 119 | - | ||
| 120 | - // 记录登录日志 | ||
| 121 | - userLogInoutService.userLogIn(user.getUserName(), session.getId(), new Date()); | ||
| 122 | - } catch (Exception e) { | ||
| 123 | - logger.error("", e); | ||
| 124 | - rs.put("msg", "服务器出现异常,请联系管理员"); | ||
| 125 | - } | ||
| 126 | - return rs; | ||
| 127 | - } | ||
| 128 | - | ||
| 129 | - @RequestMapping(value = "/change_user", method = RequestMethod.POST) | ||
| 130 | - public Map<String, Object> changeUser(HttpServletRequest request, @RequestParam String userName, | ||
| 131 | - @RequestParam String password) { | ||
| 132 | - | ||
| 133 | - Map<String, Object> rs = new HashMap<>(); | ||
| 134 | - rs.put("status", ResponseCode.ERROR); | ||
| 135 | - try { | ||
| 136 | - HttpSession session = request.getSession(); | ||
| 137 | - | ||
| 138 | - SysUser user = sysUserService.findByUserName(userName); | ||
| 139 | - if (null == user) | ||
| 140 | - return put(rs, "msg", "不存在的用户"); | ||
| 141 | - | ||
| 142 | - if (!user.isEnabled()) | ||
| 143 | - return put(rs, "msg", "该用户已被锁定,请联系管理员"); | ||
| 144 | - | ||
| 145 | - // 校验密码 | ||
| 146 | - boolean matchStatus = new BCryptPasswordEncoder(4).matches(password, user.getPassword()); | ||
| 147 | - if (!matchStatus) | ||
| 148 | - return put(rs, "msg", "密码有误"); | ||
| 149 | - | ||
| 150 | - // 登录 | ||
| 151 | - SecurityUtils.login(user, request); | ||
| 152 | - //session里写入用户名,webSocket连接时标识身份用 | ||
| 153 | - session.setAttribute(Constants.SESSION_USERNAME, user.getUserName()); | ||
| 154 | - | ||
| 155 | - //获取公司权限数据 | ||
| 156 | - List<CompanyAuthority> cmyAuths = companyAuthorityService.findByUser(user); | ||
| 157 | - session.setAttribute(Constants.COMPANY_AUTHORITYS, cmyAuths); | ||
| 158 | - rs.put("status", ResponseCode.SUCCESS); | ||
| 159 | - } catch (Exception e) { | ||
| 160 | - logger.error("", e); | ||
| 161 | - rs.put("msg", "服务器出现异常,请联系管理员"); | ||
| 162 | - } | ||
| 163 | - return rs; | ||
| 164 | - } | ||
| 165 | - | ||
| 166 | - /** | ||
| 167 | - * 返回当前用户的公司权限数据,用于构建页面级联下拉框 | ||
| 168 | - * | ||
| 169 | - * @return | ||
| 170 | - */ | ||
| 171 | - @RequestMapping("companyData") | ||
| 172 | - public List<CompanyData> companyData(HttpServletRequest request) { | ||
| 173 | - List<CompanyData> rs = new ArrayList<>(); | ||
| 174 | - CompanyData companyData; | ||
| 175 | - | ||
| 176 | - ArrayListMultimap<String, CompanyAuthority> map = ArrayListMultimap.create(); | ||
| 177 | - List<CompanyAuthority> cmyAuths = (List<CompanyAuthority>) request.getSession().getAttribute(Constants.COMPANY_AUTHORITYS); | ||
| 178 | - | ||
| 179 | - for (CompanyAuthority cAuth : cmyAuths) { | ||
| 180 | - map.put(cAuth.getCompanyCode() + "_" + cAuth.getCompanyName(), cAuth); | ||
| 181 | - } | ||
| 182 | - | ||
| 183 | - Set<String> keys = map.keySet(); | ||
| 184 | - String[] temps; | ||
| 185 | - for (String k : keys) { | ||
| 186 | - temps = k.split("_"); | ||
| 187 | - | ||
| 188 | - companyData = new CompanyData(); | ||
| 189 | - companyData.setCompanyCode(temps[0]); | ||
| 190 | - companyData.setCompanyName(temps[1]); | ||
| 191 | - companyData.setChildren(new ArrayList<CompanyData.ChildrenCompany>()); | ||
| 192 | - | ||
| 193 | - cmyAuths = map.get(k); | ||
| 194 | - for (CompanyAuthority c : cmyAuths) { | ||
| 195 | - companyData.getChildren().add(new CompanyData.ChildrenCompany(c.getSubCompanyCode(), c.getSubCompanyName())); | ||
| 196 | - } | ||
| 197 | - | ||
| 198 | - rs.add(companyData); | ||
| 199 | - } | ||
| 200 | - | ||
| 201 | - return rs; | ||
| 202 | - } | ||
| 203 | - | ||
| 204 | - @RequestMapping(value = "/login/captchaStatus") | ||
| 205 | - public int captchaStatus(String userName) { | ||
| 206 | - Integer size = captchaMap.get(userName); | ||
| 207 | - return size == null ? 0 : size; | ||
| 208 | - } | ||
| 209 | - | ||
| 210 | - public Map<String, Object> put(Map<String, Object> rs, String key, Object val) { | ||
| 211 | - rs.put(key, val); | ||
| 212 | - return rs; | ||
| 213 | - } | ||
| 214 | - | ||
| 215 | - /** | ||
| 216 | - * @Title: loginFailure @Description: TODO(查询登录失败的详细信息) @param @param | ||
| 217 | - * request @return String 返回类型 @throws | ||
| 218 | - */ | ||
| 219 | - @RequestMapping("/loginFailure") | ||
| 220 | - public String loginFailure(HttpServletRequest request) { | ||
| 221 | - String msg = ""; | ||
| 222 | - HttpSession session = request.getSession(); | ||
| 223 | - | ||
| 224 | - Object obj = session.getAttribute("SPRING_SECURITY_LAST_EXCEPTION"); | ||
| 225 | - | ||
| 226 | - if (obj instanceof BadCredentialsException) | ||
| 227 | - msg = "登录失败,用户名或密码错误."; | ||
| 228 | - else if (obj instanceof SessionAuthenticationException) | ||
| 229 | - msg = "登录失败,当前策略不允许重复登录."; | ||
| 230 | - session.removeAttribute("SPRING_SECURITY_LAST_EXCEPTION"); | ||
| 231 | - return msg; | ||
| 232 | - } | ||
| 233 | - | ||
| 234 | - @RequestMapping("/currentUser") | ||
| 235 | - public SysUser currentUser() { | ||
| 236 | - return SecurityUtils.getCurrentUser(); | ||
| 237 | - } | ||
| 238 | - | ||
| 239 | - /** | ||
| 240 | - * @param id 用户ID | ||
| 241 | - * @param enabled 状态 | ||
| 242 | - * @return | ||
| 243 | - * @Title changeEnabled | ||
| 244 | - * @Description: TODO(改变用户状态) | ||
| 245 | - */ | ||
| 246 | - @RequestMapping("/changeEnabled") | ||
| 247 | - public int changeEnabled(@RequestParam int id, @RequestParam int enabled) { | ||
| 248 | - return sysUserService.changeEnabled(id, enabled); | ||
| 249 | - } | ||
| 250 | - | ||
| 251 | - /** | ||
| 252 | - * @param oldPWD 原始密码 | ||
| 253 | - * @param newPWD 新密码 | ||
| 254 | - * @param cnewPWD 确认新密码 | ||
| 255 | - * @return | ||
| 256 | - * @Title changePWD | ||
| 257 | - * @Description: TODO(修改密码) | ||
| 258 | - */ | ||
| 259 | - @RequestMapping(value = "/changePWD", method = RequestMethod.POST) | ||
| 260 | - public String changePWD(@RequestParam String oldPWD, @RequestParam String newPWD, @RequestParam String cnewPWD) { | ||
| 261 | - SysUser sysUser = SecurityUtils.getCurrentUser(); | ||
| 262 | - String msg = ""; | ||
| 263 | - if (new BCryptPasswordEncoder(4).matches(oldPWD, sysUser.getPassword())) { | ||
| 264 | - if (oldPWD.equals(newPWD)) { | ||
| 265 | - msg = "新密码不能跟原始密码一样!"; | ||
| 266 | - } else { | ||
| 267 | - if (newPWD.equals(cnewPWD)) { | ||
| 268 | - sysUserService.changePWD(sysUser.getId(), newPWD); | ||
| 269 | - msg = "修改成功!"; | ||
| 270 | - } else { | ||
| 271 | - msg = "新密码两次输入不一致!"; | ||
| 272 | - } | ||
| 273 | - } | ||
| 274 | - } else { | ||
| 275 | - msg = "原始密码错误!"; | ||
| 276 | - } | ||
| 277 | - return msg; | ||
| 278 | - } | ||
| 279 | - | ||
| 280 | - @RequestMapping(value = "/register", method = RequestMethod.POST) | ||
| 281 | - public Map<String, Object> register(SysUser u) { | ||
| 282 | - return sysUserService.register(u); | ||
| 283 | - } | ||
| 284 | - | ||
| 285 | - @RequestMapping(value = "/all_distinct") | ||
| 286 | - public List<SysUser> findAll_distinct() { | ||
| 287 | - return sysUserService.findAll_distinct(); | ||
| 288 | - } | ||
| 289 | -} | 1 | +package com.bsth.controller.sys; |
| 2 | + | ||
| 3 | +import com.bsth.common.Constants; | ||
| 4 | +import com.bsth.common.ResponseCode; | ||
| 5 | +import com.bsth.controller.BaseController; | ||
| 6 | +import com.bsth.controller.sys.dto.CompanyData; | ||
| 7 | +import com.bsth.controller.sys.util.RSAUtils; | ||
| 8 | +import com.bsth.entity.sys.CompanyAuthority; | ||
| 9 | +import com.bsth.entity.sys.Role; | ||
| 10 | +import com.bsth.entity.sys.SysUser; | ||
| 11 | +import com.bsth.security.util.SecurityUtils; | ||
| 12 | +import com.bsth.service.logger.UserSignService; | ||
| 13 | +import com.bsth.service.sys.CompanyAuthorityService; | ||
| 14 | +import com.bsth.service.sys.SysUserService; | ||
| 15 | +import com.google.common.collect.ArrayListMultimap; | ||
| 16 | +import org.apache.commons.lang3.StringUtils; | ||
| 17 | +import org.joda.time.DateTime; | ||
| 18 | +import org.joda.time.Period; | ||
| 19 | +import org.joda.time.PeriodType; | ||
| 20 | +import org.slf4j.Logger; | ||
| 21 | +import org.slf4j.LoggerFactory; | ||
| 22 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 23 | +import org.springframework.security.authentication.BadCredentialsException; | ||
| 24 | +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; | ||
| 25 | +import org.springframework.security.web.authentication.session.SessionAuthenticationException; | ||
| 26 | +import org.springframework.web.bind.annotation.RequestMapping; | ||
| 27 | +import org.springframework.web.bind.annotation.RequestMethod; | ||
| 28 | +import org.springframework.web.bind.annotation.RequestParam; | ||
| 29 | +import org.springframework.web.bind.annotation.RestController; | ||
| 30 | + | ||
| 31 | +import javax.servlet.http.HttpServletRequest; | ||
| 32 | +import javax.servlet.http.HttpSession; | ||
| 33 | +import java.util.*; | ||
| 34 | +import java.util.regex.Matcher; | ||
| 35 | +import java.util.regex.Pattern; | ||
| 36 | + | ||
| 37 | +@RestController | ||
| 38 | +@RequestMapping("user") | ||
| 39 | +public class UserController extends BaseController<SysUser, Integer> { | ||
| 40 | + | ||
| 41 | + Logger logger = LoggerFactory.getLogger(this.getClass()); | ||
| 42 | + | ||
| 43 | + @Autowired | ||
| 44 | + SysUserService sysUserService; | ||
| 45 | + | ||
| 46 | + @Autowired | ||
| 47 | + CompanyAuthorityService companyAuthorityService; | ||
| 48 | + | ||
| 49 | + @Autowired | ||
| 50 | + UserSignService userLogInoutService; | ||
| 51 | + | ||
| 52 | + private Pattern pattern = Pattern.compile("^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*?[#?!@$%^&*-.]).{8,16}$"); | ||
| 53 | + | ||
| 54 | + @RequestMapping(value = "/login/jCryptionKey") | ||
| 55 | + public Map<String, Object> jCryptionKey(HttpServletRequest request) { | ||
| 56 | + //公匙返回页面 | ||
| 57 | + Map<String, Object> rs = new HashMap<>(); | ||
| 58 | + rs.put("publickey", RSAUtils.generateBase64PublicKey()); | ||
| 59 | + return rs; | ||
| 60 | + } | ||
| 61 | + | ||
| 62 | + @RequestMapping(value = "/getCurrentUser") | ||
| 63 | + public SysUser getCurrentUser() { | ||
| 64 | + SysUser user = SecurityUtils.getCurrentUser(); | ||
| 65 | + return user; | ||
| 66 | + } | ||
| 67 | + | ||
| 68 | + //需要验证码的账号 | ||
| 69 | + public static Map<String, Integer> USER_ERRTIMES = new HashMap<>(); | ||
| 70 | + public static Map<String, Long> USER_LOCKTIME = new HashMap<>(); | ||
| 71 | + | ||
| 72 | + @RequestMapping(value = "/login", method = RequestMethod.POST) | ||
| 73 | + public Map<String, Object> login(HttpServletRequest request, @RequestParam String userName, | ||
| 74 | + @RequestParam String password, String captcha) { | ||
| 75 | + | ||
| 76 | + Map<String, Object> rs = new HashMap<>(); | ||
| 77 | + rs.put("status", ResponseCode.ERROR); | ||
| 78 | + try { | ||
| 79 | + HttpSession session = request.getSession(); | ||
| 80 | + rs.put("captcha", session.getAttribute("captcha")); | ||
| 81 | + | ||
| 82 | + //解密RSA | ||
| 83 | + try { | ||
| 84 | + userName = RSAUtils.decryptBase64(userName); | ||
| 85 | + password = RSAUtils.decryptBase64(password); | ||
| 86 | + } catch (RuntimeException e) { | ||
| 87 | + return put(rs, "msg", "decrypt RSA fail!可能页面已过期,尝试刷新页面。"); | ||
| 88 | + } | ||
| 89 | + | ||
| 90 | + SysUser user = sysUserService.findByUserName(userName); | ||
| 91 | + | ||
| 92 | + if (null == user) { | ||
| 93 | + userOrPasswordInvalid(rs, userName); | ||
| 94 | + | ||
| 95 | + return rs; | ||
| 96 | + } | ||
| 97 | + | ||
| 98 | + // 校验用户状态 | ||
| 99 | + if (!user.isEnabled()) { | ||
| 100 | + return put(rs, "msg", "该用户已被锁定,请联系管理员"); | ||
| 101 | + } | ||
| 102 | + | ||
| 103 | + // 校验临时状态 | ||
| 104 | + if (USER_LOCKTIME.get(userName) != null && USER_LOCKTIME.get(userName) >= System.currentTimeMillis()) { | ||
| 105 | + return put(rs, "msg", "您的账户因密码错误次数过多,处于锁定状态中"); | ||
| 106 | + } | ||
| 107 | + | ||
| 108 | + // 校验验证码 | ||
| 109 | + if (USER_ERRTIMES.get(userName) != null && USER_ERRTIMES.get(userName) > 1) { | ||
| 110 | + String verCode = (String) session.getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY); | ||
| 111 | + if (StringUtils.isBlank(captcha)) { | ||
| 112 | + return put(rs, "msg", "请输入验证码"); | ||
| 113 | + } | ||
| 114 | + if (!verCode.equals(captcha)) { | ||
| 115 | + return put(rs, "msg", "验证码有误,请刷新后重新输入"); | ||
| 116 | + } | ||
| 117 | + } | ||
| 118 | + | ||
| 119 | + // 校验密码 | ||
| 120 | + boolean matchStatus = new BCryptPasswordEncoder(4).matches(password, user.getPassword()); | ||
| 121 | + if (!matchStatus) { | ||
| 122 | + userOrPasswordInvalid(rs, userName); | ||
| 123 | + | ||
| 124 | + return rs; | ||
| 125 | + } | ||
| 126 | + | ||
| 127 | + // 检验密码有效期 | ||
| 128 | + Date lastPwdDate = user.getLastPwdDate(); | ||
| 129 | + if (lastPwdDate != null) { | ||
| 130 | + if (user.getPwdExpiredDate().before(new Date())) { | ||
| 131 | + return put(rs, "msg", "密码已过期,不能登录,请联系管理员"); | ||
| 132 | + } | ||
| 133 | + | ||
| 134 | + Integer validPeriod = user.getPwdValidPeriod(); | ||
| 135 | + if (validPeriod == null) { | ||
| 136 | + validPeriod = 30; | ||
| 137 | + } | ||
| 138 | + Period p = new Period(new DateTime(lastPwdDate), new DateTime(new Date()), PeriodType.days()); | ||
| 139 | + if (p.getDays() > validPeriod) { | ||
| 140 | + return put(rs, "msg", "天没有修改密码,不能登录,请联系管理员"); | ||
| 141 | + } | ||
| 142 | + } else { | ||
| 143 | + return put(rs, "msg", "从未更新过密码,不能登录,请联系管理员"); | ||
| 144 | + } | ||
| 145 | + | ||
| 146 | + // 弱密码检查 | ||
| 147 | + Matcher matcher = pattern.matcher(password); | ||
| 148 | + if (!matcher.matches()) { | ||
| 149 | + session.setAttribute(Constants.WEAK_CIPHER, 1); | ||
| 150 | + } | ||
| 151 | + | ||
| 152 | + // 登录 | ||
| 153 | + SecurityUtils.login(user, request); | ||
| 154 | + sysUserService.recordLoginDate(userName); | ||
| 155 | + //session里写入用户名,webSocket连接时标识身份用 | ||
| 156 | + session.setAttribute(Constants.SESSION_USERNAME, user.getUserName()); | ||
| 157 | + session.setAttribute(Constants.RESOURCE_AUTHORITYS, user.getLinks()); | ||
| 158 | + | ||
| 159 | + //获取公司权限数据 | ||
| 160 | + List<CompanyAuthority> cmyAuths = companyAuthorityService.findByUser(user); | ||
| 161 | + session.setAttribute(Constants.COMPANY_AUTHORITYS, cmyAuths); | ||
| 162 | + | ||
| 163 | + USER_ERRTIMES.remove(userName); | ||
| 164 | + rs.put("status", ResponseCode.SUCCESS); | ||
| 165 | + logger.error("用户:" + user.getUserName() + "登录"); | ||
| 166 | + | ||
| 167 | + // 记录登录日志 | ||
| 168 | + userLogInoutService.userLogIn(user.getUserName(), session.getId(), new Date()); | ||
| 169 | + } catch (Exception e) { | ||
| 170 | + logger.error("", e); | ||
| 171 | + rs.put("msg", "服务器出现异常,请联系管理员"); | ||
| 172 | + } | ||
| 173 | + return rs; | ||
| 174 | + } | ||
| 175 | + | ||
| 176 | + private void userOrPasswordInvalid(Map<String, Object> rs, String userName) { | ||
| 177 | + rs.put("msg", "密码有误"); | ||
| 178 | + | ||
| 179 | + Integer errTimes = USER_ERRTIMES.get(userName); | ||
| 180 | + if (null == errTimes) { | ||
| 181 | + errTimes = 0; | ||
| 182 | + } | ||
| 183 | + USER_ERRTIMES.put(userName, ++errTimes); | ||
| 184 | + if (errTimes > 3) { | ||
| 185 | + USER_LOCKTIME.put(userName, System.currentTimeMillis() + 600000); | ||
| 186 | + USER_ERRTIMES.put(userName, 0); | ||
| 187 | + put(rs, "msg", "密码错误4次,账户将被锁定10分钟"); | ||
| 188 | + } | ||
| 189 | + } | ||
| 190 | + | ||
| 191 | + @RequestMapping(value = "/change_user", method = RequestMethod.POST) | ||
| 192 | + public Map<String, Object> changeUser(HttpServletRequest request, @RequestParam String userName, | ||
| 193 | + @RequestParam String password) { | ||
| 194 | + | ||
| 195 | + Map<String, Object> rs = new HashMap<>(); | ||
| 196 | + rs.put("status", ResponseCode.ERROR); | ||
| 197 | + try { | ||
| 198 | + HttpSession session = request.getSession(); | ||
| 199 | + | ||
| 200 | + SysUser user = sysUserService.findByUserName(userName); | ||
| 201 | + if (null == user) | ||
| 202 | + return put(rs, "msg", "不存在的用户"); | ||
| 203 | + | ||
| 204 | + if (!user.isEnabled()) | ||
| 205 | + return put(rs, "msg", "该用户已被锁定,请联系管理员"); | ||
| 206 | + | ||
| 207 | + // 校验密码 | ||
| 208 | + boolean matchStatus = new BCryptPasswordEncoder(4).matches(password, user.getPassword()); | ||
| 209 | + if (!matchStatus) | ||
| 210 | + return put(rs, "msg", "密码有误"); | ||
| 211 | + | ||
| 212 | + // 登录 | ||
| 213 | + SecurityUtils.login(user, request); | ||
| 214 | + //session里写入用户名,webSocket连接时标识身份用 | ||
| 215 | + session.setAttribute(Constants.SESSION_USERNAME, user.getUserName()); | ||
| 216 | + session.setAttribute(Constants.RESOURCE_AUTHORITYS, user.getLinks()); | ||
| 217 | + | ||
| 218 | + //获取公司权限数据 | ||
| 219 | + List<CompanyAuthority> cmyAuths = companyAuthorityService.findByUser(user); | ||
| 220 | + session.setAttribute(Constants.COMPANY_AUTHORITYS, cmyAuths); | ||
| 221 | + rs.put("status", ResponseCode.SUCCESS); | ||
| 222 | + } catch (Exception e) { | ||
| 223 | + logger.error("", e); | ||
| 224 | + rs.put("msg", "服务器出现异常,请联系管理员"); | ||
| 225 | + } | ||
| 226 | + return rs; | ||
| 227 | + } | ||
| 228 | + | ||
| 229 | + /** | ||
| 230 | + * 返回当前用户的公司权限数据,用于构建页面级联下拉框 | ||
| 231 | + * | ||
| 232 | + * @return | ||
| 233 | + */ | ||
| 234 | + @RequestMapping("companyData") | ||
| 235 | + public List<CompanyData> companyData(HttpServletRequest request) { | ||
| 236 | + List<CompanyData> rs = new ArrayList<>(); | ||
| 237 | + CompanyData companyData; | ||
| 238 | + | ||
| 239 | + ArrayListMultimap<String, CompanyAuthority> map = ArrayListMultimap.create(); | ||
| 240 | + List<CompanyAuthority> cmyAuths = (List<CompanyAuthority>) request.getSession().getAttribute(Constants.COMPANY_AUTHORITYS); | ||
| 241 | + | ||
| 242 | + for (CompanyAuthority cAuth : cmyAuths) { | ||
| 243 | + map.put(cAuth.getCompanyCode() + "_" + cAuth.getCompanyName(), cAuth); | ||
| 244 | + } | ||
| 245 | + | ||
| 246 | + Set<String> keys = map.keySet(); | ||
| 247 | + String[] temps; | ||
| 248 | + for (String k : keys) { | ||
| 249 | + temps = k.split("_"); | ||
| 250 | + | ||
| 251 | + companyData = new CompanyData(); | ||
| 252 | + companyData.setCompanyCode(temps[0]); | ||
| 253 | + companyData.setCompanyName(temps[1]); | ||
| 254 | + companyData.setChildren(new ArrayList<CompanyData.ChildrenCompany>()); | ||
| 255 | + | ||
| 256 | + cmyAuths = map.get(k); | ||
| 257 | + for (CompanyAuthority c : cmyAuths) { | ||
| 258 | + companyData.getChildren().add(new CompanyData.ChildrenCompany(c.getSubCompanyCode(), c.getSubCompanyName())); | ||
| 259 | + } | ||
| 260 | + | ||
| 261 | + rs.add(companyData); | ||
| 262 | + } | ||
| 263 | + | ||
| 264 | + return rs; | ||
| 265 | + } | ||
| 266 | + | ||
| 267 | + @RequestMapping(value = "/login/captchaStatus") | ||
| 268 | + public int captchaStatus(String userName) { | ||
| 269 | + Integer size = USER_ERRTIMES.get(userName); | ||
| 270 | + return size == null ? 0 : size; | ||
| 271 | + } | ||
| 272 | + | ||
| 273 | + public Map<String, Object> put(Map<String, Object> rs, String key, Object val) { | ||
| 274 | + rs.put(key, val); | ||
| 275 | + return rs; | ||
| 276 | + } | ||
| 277 | + | ||
| 278 | + /** | ||
| 279 | + * @Title: loginFailure @Description: TODO(查询登录失败的详细信息) @param @param | ||
| 280 | + * request @return String 返回类型 @throws | ||
| 281 | + */ | ||
| 282 | + @RequestMapping("/loginFailure") | ||
| 283 | + public String loginFailure(HttpServletRequest request) { | ||
| 284 | + String msg = ""; | ||
| 285 | + HttpSession session = request.getSession(); | ||
| 286 | + | ||
| 287 | + Object obj = session.getAttribute("SPRING_SECURITY_LAST_EXCEPTION"); | ||
| 288 | + | ||
| 289 | + if (obj instanceof BadCredentialsException) | ||
| 290 | + msg = "登录失败,用户名或密码错误."; | ||
| 291 | + else if (obj instanceof SessionAuthenticationException) | ||
| 292 | + msg = "登录失败,当前策略不允许重复登录."; | ||
| 293 | + session.removeAttribute("SPRING_SECURITY_LAST_EXCEPTION"); | ||
| 294 | + return msg; | ||
| 295 | + } | ||
| 296 | + | ||
| 297 | + @RequestMapping("/currentUser") | ||
| 298 | + public SysUser currentUser() { | ||
| 299 | + return SecurityUtils.getCurrentUser(); | ||
| 300 | + } | ||
| 301 | + | ||
| 302 | + /** | ||
| 303 | + * @param id 用户ID | ||
| 304 | + * @param enabled 状态 | ||
| 305 | + * @return | ||
| 306 | + * @Title changeEnabled | ||
| 307 | + * @Description: TODO(改变用户状态) | ||
| 308 | + */ | ||
| 309 | + @RequestMapping("/changeEnabled") | ||
| 310 | + public int changeEnabled(@RequestParam int id, @RequestParam int enabled) { | ||
| 311 | + return sysUserService.changeEnabled(id, enabled); | ||
| 312 | + } | ||
| 313 | + | ||
| 314 | + /** | ||
| 315 | + * @param oldPWD 原始密码 | ||
| 316 | + * @param newPWD 新密码 | ||
| 317 | + * @param cnewPWD 确认新密码 | ||
| 318 | + * @return | ||
| 319 | + * @Title changePWD | ||
| 320 | + * @Description: TODO(修改密码) | ||
| 321 | + */ | ||
| 322 | + @RequestMapping(value = "/changePWD", method = RequestMethod.POST) | ||
| 323 | + public String changePWD(@RequestParam String oldPWD, @RequestParam String newPWD, @RequestParam String cnewPWD, HttpServletRequest request) { | ||
| 324 | + SysUser sysUser = SecurityUtils.getCurrentUser(); | ||
| 325 | + String msg = ""; | ||
| 326 | + | ||
| 327 | + //解密RSA | ||
| 328 | + try{ | ||
| 329 | + oldPWD = (RSAUtils.decryptBase64(oldPWD)); | ||
| 330 | + newPWD = (RSAUtils.decryptBase64(newPWD)); | ||
| 331 | + cnewPWD = (RSAUtils.decryptBase64(cnewPWD)); | ||
| 332 | + }catch (RuntimeException e) { | ||
| 333 | + return "网络延迟,解密失败,请重新添加!"; | ||
| 334 | + } | ||
| 335 | + if (new BCryptPasswordEncoder(4).matches(oldPWD, sysUser.getPassword())) { | ||
| 336 | + if (oldPWD.equals(newPWD)) { | ||
| 337 | + msg = "新密码不能跟原始密码一样!"; | ||
| 338 | + } else { | ||
| 339 | + if (newPWD.equals(cnewPWD)) { | ||
| 340 | + sysUserService.changePWD(sysUser.getId(), newPWD); | ||
| 341 | + request.getSession().setAttribute(Constants.WEAK_CIPHER, 0); | ||
| 342 | + msg = "修改成功!"; | ||
| 343 | + } else { | ||
| 344 | + msg = "新密码两次输入不一致!"; | ||
| 345 | + } | ||
| 346 | + } | ||
| 347 | + } else { | ||
| 348 | + msg = "原始密码错误!"; | ||
| 349 | + } | ||
| 350 | + return msg; | ||
| 351 | + } | ||
| 352 | + | ||
| 353 | + @RequestMapping(value = "/validPWDExpired", method = RequestMethod.GET) | ||
| 354 | + public String validPWDExpired() { | ||
| 355 | + try { | ||
| 356 | + SysUser sysUser = SecurityUtils.getCurrentUser(); | ||
| 357 | + this.sysUserService.validPWDExpired(sysUser.getUserName()); | ||
| 358 | + return "ok"; | ||
| 359 | + } catch (Exception exp) { | ||
| 360 | + exp.printStackTrace(); | ||
| 361 | + return exp.getMessage(); | ||
| 362 | + } | ||
| 363 | + } | ||
| 364 | + | ||
| 365 | + @RequestMapping(value = "/register", method = RequestMethod.POST) | ||
| 366 | + public Map<String, Object> register(SysUser u) { | ||
| 367 | + return sysUserService.register(u); | ||
| 368 | + } | ||
| 369 | + | ||
| 370 | + // 查询用户下所有下级角色 | ||
| 371 | + @RequestMapping(value = "/all_distinct") | ||
| 372 | + public List<SysUser> findAll_distinct() { | ||
| 373 | + return sysUserService.findAll_distinct(); | ||
| 374 | + } | ||
| 375 | + | ||
| 376 | + // 重置密码 | ||
| 377 | + @RequestMapping(value = "/resetPassword", method = RequestMethod.POST) | ||
| 378 | + public Map<String, Object> resetPassword(@RequestParam Integer id, @RequestParam Integer pwdValidPeriod) { | ||
| 379 | + return sysUserService.resetPassword(id, pwdValidPeriod); | ||
| 380 | + } | ||
| 381 | + | ||
| 382 | + /** | ||
| 383 | + * 解除临时锁定 | ||
| 384 | + * @param userName | ||
| 385 | + * @return | ||
| 386 | + */ | ||
| 387 | + @RequestMapping(value = "/unlock", method = RequestMethod.POST) | ||
| 388 | + public Map<String, Object> unlock(@RequestParam String userName) { | ||
| 389 | + Map<String, Object> result = new HashMap<>(); | ||
| 390 | + // 获取当前用户 | ||
| 391 | + SysUser user = SecurityUtils.getCurrentUser(); | ||
| 392 | + Iterator<Role> itRole = user.getRoles().iterator(); | ||
| 393 | + Role ro = new Role(); | ||
| 394 | + boolean isSuper = false; | ||
| 395 | + while (itRole.hasNext()) {//判断是否有下一个 | ||
| 396 | + ro = itRole.next(); | ||
| 397 | + if (ro.getLevel() == 1) { | ||
| 398 | + isSuper = true; | ||
| 399 | + } | ||
| 400 | + } | ||
| 401 | + if (isSuper) { | ||
| 402 | + USER_LOCKTIME.remove(userName); | ||
| 403 | + USER_ERRTIMES.remove(userName); | ||
| 404 | + result.put("status", ResponseCode.SUCCESS); | ||
| 405 | + result.put("msg", "用户解锁成功!"); | ||
| 406 | + } else { | ||
| 407 | + result.put("status", ResponseCode.ERROR); | ||
| 408 | + result.put("msg", "您不是管理员无用户解锁权限"); | ||
| 409 | + } | ||
| 410 | + | ||
| 411 | + return result; | ||
| 412 | + } | ||
| 413 | + | ||
| 414 | + /** | ||
| 415 | + * 弱密码 | ||
| 416 | + * @param request | ||
| 417 | + * @return | ||
| 418 | + */ | ||
| 419 | + @RequestMapping(value = "/isWeakCipher", method = RequestMethod.POST) | ||
| 420 | + public Map<String, Object> isWeakCipher(HttpServletRequest request) { | ||
| 421 | + Map<String, Object> result = new HashMap<>(); | ||
| 422 | + result.put("status", ResponseCode.SUCCESS); | ||
| 423 | + result.put("data", request.getSession().getAttribute(Constants.WEAK_CIPHER)); | ||
| 424 | + | ||
| 425 | + return result; | ||
| 426 | + } | ||
| 427 | + | ||
| 428 | +// /** | ||
| 429 | +// * 弱密码 | ||
| 430 | +// * @return | ||
| 431 | +// */ | ||
| 432 | +// @RequestMapping(value = "/isRealName", method = RequestMethod.POST) | ||
| 433 | +// public Map<String, Object> hasJobCode() { | ||
| 434 | +// Map<String, Object> result = new HashMap<>(); | ||
| 435 | +// SysUser user = SecurityUtils.getCurrentUser(); | ||
| 436 | +// result.put("status", ResponseCode.SUCCESS); | ||
| 437 | +// result.put("data", (StringUtils.isBlank(user.getJobCode()) || StringUtils.isBlank(user.getRealName())) ? 0 : 1); | ||
| 438 | +// | ||
| 439 | +// return result; | ||
| 440 | +// } | ||
| 441 | +// | ||
| 442 | +// // 重置密码 | ||
| 443 | +// @RequestMapping(value = "/realName", method = RequestMethod.POST) | ||
| 444 | +// public Map<String, Object> setJobCode(@RequestParam String jobCode, @RequestParam String realName) throws Exception { | ||
| 445 | +// Map<String, Object> data = new HashMap<>(), result = new HashMap<>(); | ||
| 446 | +// result.put("status", ResponseCode.ERROR); | ||
| 447 | +// result.put("data", "设置成功"); | ||
| 448 | +// | ||
| 449 | +// if (jobCode == null || realName == null) { | ||
| 450 | +// result.put("data", "你跳过验证了是吧"); | ||
| 451 | +// return result; | ||
| 452 | +// } | ||
| 453 | +// data.put("account", jobCode); | ||
| 454 | +// data.put("pageSize", 2); | ||
| 455 | +// data.put("pageNum", 1); | ||
| 456 | +// StringBuilder stringBuilder = HttpClientUtils.post("https://112.64.45.51/businessCenter/userInfo/queryUserList", mapper.writeValueAsString(data)); | ||
| 457 | +// if (stringBuilder == null) { | ||
| 458 | +// result.put("data", "统一平台验证失败1"); | ||
| 459 | +// return result; | ||
| 460 | +// } else { | ||
| 461 | +// List<Map<String, Object>> maps = mapper.readValue(mapper.writeValueAsString(((Map) mapper.readValue(stringBuilder.toString(), Map.class).get("data")).get("list")), mapper.getTypeFactory().constructParametricType(List.class, Map.class)); | ||
| 462 | +// if (maps.size() == 0) { | ||
| 463 | +// result.put("data", "统一平台验证失败2"); | ||
| 464 | +// return result; | ||
| 465 | +// } else { | ||
| 466 | +// boolean isAuth = false; | ||
| 467 | +// for (Map<String, Object> map : maps) { | ||
| 468 | +// if (realName.equals(map.get("name"))) { | ||
| 469 | +// isAuth = true; | ||
| 470 | +// break; | ||
| 471 | +// } | ||
| 472 | +// } | ||
| 473 | +// if (!isAuth) { | ||
| 474 | +// result.put("data", "统一平台验证失败3"); | ||
| 475 | +// return result; | ||
| 476 | +// } | ||
| 477 | +// } | ||
| 478 | +// } | ||
| 479 | +// | ||
| 480 | +// SysUser user = SecurityUtils.getCurrentUser(); | ||
| 481 | +// sysUserService.realName(jobCode, realName, user.getId()); | ||
| 482 | +// user.setJobCode(jobCode); | ||
| 483 | +// user.setRealName(realName); | ||
| 484 | +// | ||
| 485 | +// result.put("status", ResponseCode.SUCCESS); | ||
| 486 | +// return result; | ||
| 487 | +// } | ||
| 488 | + | ||
| 489 | +} |
src/main/java/com/bsth/data/SystemParamCache.java
0 → 100644
| 1 | +package com.bsth.data; | ||
| 2 | + | ||
| 3 | +import com.bsth.common.SystemParamKeys; | ||
| 4 | +import com.bsth.service.SystemParamService; | ||
| 5 | +import org.springframework.beans.factory.InitializingBean; | ||
| 6 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 7 | +import org.springframework.stereotype.Component; | ||
| 8 | + | ||
| 9 | +/** | ||
| 10 | + * @author Hill | ||
| 11 | + */ | ||
| 12 | +@Component | ||
| 13 | +public class SystemParamCache implements InitializingBean { | ||
| 14 | + | ||
| 15 | + @Autowired | ||
| 16 | + private SystemParamService systemParamService; | ||
| 17 | + | ||
| 18 | + private static SystemParamService systemParamService1; | ||
| 19 | + | ||
| 20 | + public static String getSpecialRoles() { | ||
| 21 | + return systemParamService1.getValue(SystemParamKeys.SPECIAL_ROLES); | ||
| 22 | + } | ||
| 23 | + | ||
| 24 | + public static String getSpecialDays() { | ||
| 25 | + return systemParamService1.getValue(SystemParamKeys.SPECIAL_DAYS); | ||
| 26 | + } | ||
| 27 | + | ||
| 28 | + public static String getUrlHttpGpsRealCache() { | ||
| 29 | + return systemParamService1.getValue(SystemParamKeys.URL_HTTP_GPS_REAL_CACHE); | ||
| 30 | + } | ||
| 31 | + | ||
| 32 | + public static String getUrlHttpGpsReal() { | ||
| 33 | + return systemParamService1.getValue(SystemParamKeys.URL_HTTP_GPS_REAL); | ||
| 34 | + } | ||
| 35 | + | ||
| 36 | + public static String getUrlHttpDirective() { | ||
| 37 | + return systemParamService1.getValue(SystemParamKeys.URL_HTTP_DIRECTIVE); | ||
| 38 | + } | ||
| 39 | + | ||
| 40 | + public static String getUrlHttpRfid() { | ||
| 41 | + return systemParamService1.getValue(SystemParamKeys.URL_HTTP_RFID); | ||
| 42 | + } | ||
| 43 | + | ||
| 44 | + public static String getUrlHttpReport(String param) { | ||
| 45 | + return systemParamService1.getValue(String.format(SystemParamKeys.URL_HTTP_REPORT, param)); | ||
| 46 | + } | ||
| 47 | + | ||
| 48 | + public static String getUrlHttpTicketing() { | ||
| 49 | + return systemParamService1.getValue(SystemParamKeys.URL_HTTP_TICKETING); | ||
| 50 | + } | ||
| 51 | + | ||
| 52 | + public static String getUrlHttpDsmAck() { | ||
| 53 | + return systemParamService1.getValue(SystemParamKeys.URL_HTTP_DSM_ACK); | ||
| 54 | + } | ||
| 55 | + | ||
| 56 | + public static String getUrlHttpCpAck() { | ||
| 57 | + return systemParamService1.getValue(SystemParamKeys.URL_HTTP_CP_ACK); | ||
| 58 | + } | ||
| 59 | + | ||
| 60 | + public static String getMailAdmin() { | ||
| 61 | + return systemParamService1.getValue(SystemParamKeys.MAIL_ADMIN); | ||
| 62 | + } | ||
| 63 | + | ||
| 64 | + public static String getMailWaybill() { | ||
| 65 | + return systemParamService1.getValue(SystemParamKeys.MAIL_WAYBILL); | ||
| 66 | + } | ||
| 67 | + | ||
| 68 | + public static boolean getEnabledFirstLastGeneration() { | ||
| 69 | + return Boolean.parseBoolean(systemParamService1.getValue(SystemParamKeys.ENABLED_FIRST_LAST_GENERATION)); | ||
| 70 | + } | ||
| 71 | + | ||
| 72 | + public static boolean getEnabledFilterSqlInjection() { | ||
| 73 | + return Boolean.parseBoolean(systemParamService1.getValue(SystemParamKeys.ENABLED_FILTER_SQL_INJECTION)); | ||
| 74 | + } | ||
| 75 | + | ||
| 76 | + public static boolean getEnabledSso() { | ||
| 77 | + return Boolean.parseBoolean(systemParamService1.getValue(SystemParamKeys.ENABLED_SSO)); | ||
| 78 | + } | ||
| 79 | + | ||
| 80 | + public static String getSsoSystemCode() { | ||
| 81 | + return systemParamService1.getValue(SystemParamKeys.SSO_SYSTEM_CODE); | ||
| 82 | + } | ||
| 83 | + | ||
| 84 | + public static String getUrlHttpSsoLogin() { | ||
| 85 | + return systemParamService1.getValue(SystemParamKeys.URL_HTTP_SSO_LOGIN); | ||
| 86 | + } | ||
| 87 | + | ||
| 88 | + public static String getUrlHttpSsoLogout() { | ||
| 89 | + return systemParamService1.getValue(SystemParamKeys.URL_HTTP_SSO_LOGOUT); | ||
| 90 | + } | ||
| 91 | + | ||
| 92 | + public static String getUrlHttpSsoAuth() { | ||
| 93 | + return systemParamService1.getValue(SystemParamKeys.URL_HTTP_SSO_AUTH); | ||
| 94 | + } | ||
| 95 | + | ||
| 96 | + public static String getUrlHttpMaintenance() { | ||
| 97 | + return systemParamService1.getValue(SystemParamKeys.URL_HTTP_MAINTENANCE); | ||
| 98 | + } | ||
| 99 | + | ||
| 100 | + public static boolean getEnabledWhiteIp() { | ||
| 101 | + return Boolean.parseBoolean(systemParamService1.getValue(SystemParamKeys.ENABLED_WHITE_IP)); | ||
| 102 | + } | ||
| 103 | + | ||
| 104 | + public static boolean getEnableFilterAuthority() { | ||
| 105 | + return Boolean.parseBoolean(systemParamService1.getValue(SystemParamKeys.ENABLED_FILTER_AUTHORITY)); | ||
| 106 | + } | ||
| 107 | + | ||
| 108 | + public static String getUrlHttpDvr() { | ||
| 109 | + return systemParamService1.getValue(SystemParamKeys.URL_HTTP_DVR); | ||
| 110 | + } | ||
| 111 | + | ||
| 112 | + public static String getUrlHttpDvrPwd() { | ||
| 113 | + return systemParamService1.getValue(SystemParamKeys.URL_HTTP_DVR_PWD); | ||
| 114 | + } | ||
| 115 | + | ||
| 116 | + @Override | ||
| 117 | + public void afterPropertiesSet() throws Exception { | ||
| 118 | + systemParamService1 = systemParamService; | ||
| 119 | + systemParamService1.refresh(); | ||
| 120 | + } | ||
| 121 | +} | ||
| 0 | \ No newline at end of file | 122 | \ No newline at end of file |
src/main/java/com/bsth/data/WhiteIpCache.java
0 → 100644
| 1 | +package com.bsth.data; | ||
| 2 | + | ||
| 3 | +import com.bsth.Application; | ||
| 4 | +import com.bsth.XDApplication; | ||
| 5 | +import com.bsth.entity.WhiteIp; | ||
| 6 | +import org.slf4j.Logger; | ||
| 7 | +import org.slf4j.LoggerFactory; | ||
| 8 | +import org.springframework.beans.factory.InitializingBean; | ||
| 9 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 10 | +import org.springframework.jdbc.core.BeanPropertyRowMapper; | ||
| 11 | +import org.springframework.jdbc.core.JdbcTemplate; | ||
| 12 | +import org.springframework.stereotype.Component; | ||
| 13 | + | ||
| 14 | +import java.util.List; | ||
| 15 | +import java.util.concurrent.TimeUnit; | ||
| 16 | + | ||
| 17 | +@Component | ||
| 18 | +public class WhiteIpCache implements InitializingBean { | ||
| 19 | + | ||
| 20 | + private final static Logger log = LoggerFactory.getLogger(WhiteIpCache.class); | ||
| 21 | + | ||
| 22 | + @Autowired | ||
| 23 | + private JdbcTemplate jdbcTemplate; | ||
| 24 | + | ||
| 25 | + private static List<WhiteIp> whiteIps; | ||
| 26 | + | ||
| 27 | + public static List<WhiteIp> getWhiteIps() { | ||
| 28 | + return whiteIps; | ||
| 29 | + } | ||
| 30 | + | ||
| 31 | + @Override | ||
| 32 | + public void afterPropertiesSet() throws Exception { | ||
| 33 | + Application.mainServices.scheduleWithFixedDelay(new WhiteIpDataLoader(), 0, 1, TimeUnit.MINUTES); | ||
| 34 | + } | ||
| 35 | + | ||
| 36 | + class WhiteIpDataLoader extends Thread { | ||
| 37 | + | ||
| 38 | + @Override | ||
| 39 | + public void run() { | ||
| 40 | + if (SystemParamCache.getEnabledWhiteIp()) { | ||
| 41 | + loadData(); | ||
| 42 | + } | ||
| 43 | + } | ||
| 44 | + | ||
| 45 | + /** | ||
| 46 | + * @Title: loadAllData | ||
| 47 | + * @Description: TODO(加载所有数据) | ||
| 48 | + */ | ||
| 49 | + public int loadData() { | ||
| 50 | + try { | ||
| 51 | + log.info("开始加载IP白名单数据..,"); | ||
| 52 | + loadWhiteIp(); | ||
| 53 | + log.info("加载IP白名单数据成功!,"); | ||
| 54 | + } catch (Exception e) { | ||
| 55 | + log.error("加载IP白名单数据时出现异常,", e); | ||
| 56 | + } | ||
| 57 | + return 0; | ||
| 58 | + } | ||
| 59 | + | ||
| 60 | + /** | ||
| 61 | + * 加载IP白名单 | ||
| 62 | + */ | ||
| 63 | + public void loadWhiteIp() { | ||
| 64 | + List<WhiteIp> result = jdbcTemplate.query("select * from control_interface.bsth_c_white_ip where valid_date > now()", BeanPropertyRowMapper.newInstance(WhiteIp.class)); | ||
| 65 | + whiteIps = result; | ||
| 66 | + } | ||
| 67 | + } | ||
| 68 | +} |
src/main/java/com/bsth/data/directive/GatewayHttpUtils.java
| 1 | -package com.bsth.data.directive; | ||
| 2 | - | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | ||
| 4 | -import com.bsth.util.ConfigUtil; | ||
| 5 | -import org.apache.http.client.config.RequestConfig; | ||
| 6 | -import org.apache.http.client.methods.CloseableHttpResponse; | ||
| 7 | -import org.apache.http.client.methods.HttpPost; | ||
| 8 | -import org.apache.http.entity.StringEntity; | ||
| 9 | -import org.apache.http.impl.client.CloseableHttpClient; | ||
| 10 | -import org.apache.http.impl.client.HttpClients; | ||
| 11 | -import org.apache.http.util.EntityUtils; | ||
| 12 | -import org.slf4j.Logger; | ||
| 13 | -import org.slf4j.LoggerFactory; | ||
| 14 | - | ||
| 15 | -/** | ||
| 16 | - * @author PanZhao | ||
| 17 | - * @ClassName: GatewayHttpUtils | ||
| 18 | - * @Description: TODO(和网关HTTP通讯工具类) | ||
| 19 | - * @date 2016年8月14日 下午9:50:46 | ||
| 20 | - */ | ||
| 21 | -public class GatewayHttpUtils { | ||
| 22 | - static Logger logger = LoggerFactory.getLogger(GatewayHttpUtils.class); | ||
| 23 | - | ||
| 24 | - static String url; | ||
| 25 | - static CloseableHttpClient httpClient = null; | ||
| 26 | - static HttpPost post; | ||
| 27 | - static RequestConfig requestConfig; | ||
| 28 | - static CloseableHttpResponse response; | ||
| 29 | - | ||
| 30 | - static { | ||
| 31 | - url = ConfigUtil.get("http.send.directive"); | ||
| 32 | - httpClient = HttpClients.createDefault(); | ||
| 33 | - post = new HttpPost(url); | ||
| 34 | - requestConfig = RequestConfig.custom() | ||
| 35 | - .setConnectTimeout(3000).setConnectionRequestTimeout(2000) | ||
| 36 | - .setSocketTimeout(3000).build(); | ||
| 37 | - post.setConfig(requestConfig); | ||
| 38 | - } | ||
| 39 | - | ||
| 40 | - public static int postJson(String jsonStr) { | ||
| 41 | - logger.info("send : " + jsonStr); | ||
| 42 | - | ||
| 43 | - int code = -1; | ||
| 44 | - try { | ||
| 45 | - post.setEntity(new StringEntity(jsonStr, "utf-8")); | ||
| 46 | - | ||
| 47 | - response = httpClient.execute(post); | ||
| 48 | - | ||
| 49 | - int statusCode = response.getStatusLine().getStatusCode(); | ||
| 50 | - if(statusCode != 200){ | ||
| 51 | - logger.error("http client status code: " + statusCode); | ||
| 52 | - } | ||
| 53 | - | ||
| 54 | - JSONObject json = JSONObject.parseObject(EntityUtils.toString(response.getEntity())); | ||
| 55 | - if (null != json && json.getInteger("errCode") == 0) | ||
| 56 | - code = 0; | ||
| 57 | - else | ||
| 58 | - logger.error("和网关http通讯失败,rs: " + json); | ||
| 59 | - | ||
| 60 | - if (null != response) | ||
| 61 | - response.close(); | ||
| 62 | - } catch (Exception e) { | ||
| 63 | - logger.error("", e); | ||
| 64 | - } | ||
| 65 | - return code; | ||
| 66 | - } | ||
| 67 | -} | 1 | +package com.bsth.data.directive; |
| 2 | + | ||
| 3 | +import com.alibaba.fastjson.JSONObject; | ||
| 4 | +import com.bsth.data.SystemParamCache; | ||
| 5 | +import org.apache.http.client.config.RequestConfig; | ||
| 6 | +import org.apache.http.client.methods.CloseableHttpResponse; | ||
| 7 | +import org.apache.http.client.methods.HttpPost; | ||
| 8 | +import org.apache.http.entity.StringEntity; | ||
| 9 | +import org.apache.http.impl.client.CloseableHttpClient; | ||
| 10 | +import org.apache.http.impl.client.HttpClients; | ||
| 11 | +import org.apache.http.util.EntityUtils; | ||
| 12 | +import org.slf4j.Logger; | ||
| 13 | +import org.slf4j.LoggerFactory; | ||
| 14 | +import org.springframework.beans.factory.InitializingBean; | ||
| 15 | +import org.springframework.stereotype.Component; | ||
| 16 | + | ||
| 17 | +/** | ||
| 18 | + * @author PanZhao | ||
| 19 | + * @ClassName: GatewayHttpUtils | ||
| 20 | + * @Description: TODO(和网关HTTP通讯工具类) | ||
| 21 | + * @date 2016年8月14日 下午9:50:46 | ||
| 22 | + */ | ||
| 23 | +@Component | ||
| 24 | +public class GatewayHttpUtils implements InitializingBean { | ||
| 25 | + static Logger logger = LoggerFactory.getLogger(GatewayHttpUtils.class); | ||
| 26 | + | ||
| 27 | + static String url; | ||
| 28 | + static CloseableHttpClient httpClient = null; | ||
| 29 | + static HttpPost post; | ||
| 30 | + static RequestConfig requestConfig; | ||
| 31 | + static CloseableHttpResponse response; | ||
| 32 | + | ||
| 33 | + public static int postJson(String jsonStr) { | ||
| 34 | + logger.info("send : " + jsonStr); | ||
| 35 | + | ||
| 36 | + int code = -1; | ||
| 37 | + try { | ||
| 38 | + post.setEntity(new StringEntity(jsonStr, "utf-8")); | ||
| 39 | + | ||
| 40 | + response = httpClient.execute(post); | ||
| 41 | + | ||
| 42 | + int statusCode = response.getStatusLine().getStatusCode(); | ||
| 43 | + if(statusCode != 200){ | ||
| 44 | + logger.error("http client status code: " + statusCode); | ||
| 45 | + } | ||
| 46 | + | ||
| 47 | + JSONObject json = JSONObject.parseObject(EntityUtils.toString(response.getEntity())); | ||
| 48 | + if (null != json && json.getInteger("errCode") == 0) | ||
| 49 | + code = 0; | ||
| 50 | + else | ||
| 51 | + logger.error("和网关http通讯失败,rs: " + json); | ||
| 52 | + | ||
| 53 | + if (null != response) | ||
| 54 | + response.close(); | ||
| 55 | + } catch (Exception e) { | ||
| 56 | + logger.error("", e); | ||
| 57 | + } | ||
| 58 | + return code; | ||
| 59 | + } | ||
| 60 | + | ||
| 61 | + @Override | ||
| 62 | + public void afterPropertiesSet() throws Exception { | ||
| 63 | + url = SystemParamCache.getUrlHttpDirective(); | ||
| 64 | + httpClient = HttpClients.createDefault(); | ||
| 65 | + post = new HttpPost(url); | ||
| 66 | + requestConfig = RequestConfig.custom() | ||
| 67 | + .setConnectTimeout(3000).setConnectionRequestTimeout(2000) | ||
| 68 | + .setSocketTimeout(3000).build(); | ||
| 69 | + post.setConfig(requestConfig); | ||
| 70 | + } | ||
| 71 | +} |
src/main/java/com/bsth/data/gpsdata_v2/load/GatewayHttpLoader.java
| @@ -2,10 +2,10 @@ package com.bsth.data.gpsdata_v2.load; | @@ -2,10 +2,10 @@ package com.bsth.data.gpsdata_v2.load; | ||
| 2 | 2 | ||
| 3 | import com.alibaba.fastjson.JSON; | 3 | import com.alibaba.fastjson.JSON; |
| 4 | import com.bsth.data.BasicData; | 4 | import com.bsth.data.BasicData; |
| 5 | +import com.bsth.data.SystemParamCache; | ||
| 5 | import com.bsth.data.gpsdata_v2.GpsRealData; | 6 | import com.bsth.data.gpsdata_v2.GpsRealData; |
| 6 | import com.bsth.data.gpsdata_v2.entity.GpsEntity; | 7 | import com.bsth.data.gpsdata_v2.entity.GpsEntity; |
| 7 | import com.bsth.data.gpsdata_v2.utils.GpsDataUtils; | 8 | import com.bsth.data.gpsdata_v2.utils.GpsDataUtils; |
| 8 | -import com.bsth.util.ConfigUtil; | ||
| 9 | import org.apache.commons.lang3.StringUtils; | 9 | import org.apache.commons.lang3.StringUtils; |
| 10 | import org.apache.http.HttpEntity; | 10 | import org.apache.http.HttpEntity; |
| 11 | import org.apache.http.client.config.RequestConfig; | 11 | import org.apache.http.client.config.RequestConfig; |
| @@ -16,6 +16,7 @@ import org.apache.http.impl.client.HttpClients; | @@ -16,6 +16,7 @@ import org.apache.http.impl.client.HttpClients; | ||
| 16 | import org.slf4j.Logger; | 16 | import org.slf4j.Logger; |
| 17 | import org.slf4j.LoggerFactory; | 17 | import org.slf4j.LoggerFactory; |
| 18 | import org.springframework.beans.BeansException; | 18 | import org.springframework.beans.BeansException; |
| 19 | +import org.springframework.beans.factory.InitializingBean; | ||
| 19 | import org.springframework.context.ApplicationContext; | 20 | import org.springframework.context.ApplicationContext; |
| 20 | import org.springframework.context.ApplicationContextAware; | 21 | import org.springframework.context.ApplicationContextAware; |
| 21 | import org.springframework.stereotype.Component; | 22 | import org.springframework.stereotype.Component; |
| @@ -30,7 +31,7 @@ import java.util.List; | @@ -30,7 +31,7 @@ import java.util.List; | ||
| 30 | * Created by panzhao on 2017/11/15. | 31 | * Created by panzhao on 2017/11/15. |
| 31 | */ | 32 | */ |
| 32 | @Component | 33 | @Component |
| 33 | -public class GatewayHttpLoader implements ApplicationContextAware{ | 34 | +public class GatewayHttpLoader implements ApplicationContextAware, InitializingBean { |
| 34 | 35 | ||
| 35 | static Logger logger = LoggerFactory.getLogger(GatewayHttpLoader.class); | 36 | static Logger logger = LoggerFactory.getLogger(GatewayHttpLoader.class); |
| 36 | 37 | ||
| @@ -45,17 +46,6 @@ public class GatewayHttpLoader implements ApplicationContextAware{ | @@ -45,17 +46,6 @@ public class GatewayHttpLoader implements ApplicationContextAware{ | ||
| 45 | 46 | ||
| 46 | static GpsRealData gpsRealData; | 47 | static GpsRealData gpsRealData; |
| 47 | 48 | ||
| 48 | - static{ | ||
| 49 | - url = ConfigUtil.get("http.gps.real.url"); | ||
| 50 | - list = new ArrayList<>(); | ||
| 51 | - httpClient = HttpClients.createDefault(); | ||
| 52 | - get = new HttpGet(url); | ||
| 53 | - requestConfig = RequestConfig.custom() | ||
| 54 | - .setConnectTimeout(2500).setConnectionRequestTimeout(2000) | ||
| 55 | - .setSocketTimeout(2500).build(); | ||
| 56 | - get.setConfig(requestConfig); | ||
| 57 | - } | ||
| 58 | - | ||
| 59 | public static List<GpsEntity> load(){ | 49 | public static List<GpsEntity> load(){ |
| 60 | try{ | 50 | try{ |
| 61 | if(list.size() > 0) | 51 | if(list.size() > 0) |
| @@ -117,4 +107,16 @@ public class GatewayHttpLoader implements ApplicationContextAware{ | @@ -117,4 +107,16 @@ public class GatewayHttpLoader implements ApplicationContextAware{ | ||
| 117 | public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { | 107 | public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { |
| 118 | gpsRealData = applicationContext.getBean(GpsRealData.class); | 108 | gpsRealData = applicationContext.getBean(GpsRealData.class); |
| 119 | } | 109 | } |
| 110 | + | ||
| 111 | + @Override | ||
| 112 | + public void afterPropertiesSet() throws Exception { | ||
| 113 | + url = SystemParamCache.getUrlHttpGpsReal(); | ||
| 114 | + list = new ArrayList<>(); | ||
| 115 | + httpClient = HttpClients.createDefault(); | ||
| 116 | + get = new HttpGet(url); | ||
| 117 | + requestConfig = RequestConfig.custom() | ||
| 118 | + .setConnectTimeout(2500).setConnectionRequestTimeout(2000) | ||
| 119 | + .setSocketTimeout(2500).build(); | ||
| 120 | + get.setConfig(requestConfig); | ||
| 121 | + } | ||
| 120 | } | 122 | } |
src/main/java/com/bsth/data/gpsdata_v2/load/SocketClientLoader.java
| 1 | -package com.bsth.data.gpsdata_v2.load; | ||
| 2 | - | ||
| 3 | -import com.alibaba.fastjson.JSON; | ||
| 4 | -import com.bsth.data.BasicData; | ||
| 5 | -import com.bsth.data.gpsdata_v2.entity.GpsEntity; | ||
| 6 | -import com.bsth.data.gpsdata_v2.utils.GpsDataUtils; | ||
| 7 | -import com.bsth.util.ConfigUtil; | ||
| 8 | -import org.apache.http.HttpEntity; | ||
| 9 | -import org.apache.http.client.config.RequestConfig; | ||
| 10 | -import org.apache.http.client.methods.CloseableHttpResponse; | ||
| 11 | -import org.apache.http.client.methods.HttpGet; | ||
| 12 | -import org.apache.http.impl.client.CloseableHttpClient; | ||
| 13 | -import org.apache.http.impl.client.HttpClients; | ||
| 14 | -import org.slf4j.Logger; | ||
| 15 | -import org.slf4j.LoggerFactory; | ||
| 16 | - | ||
| 17 | -import java.io.BufferedReader; | ||
| 18 | -import java.io.InputStreamReader; | ||
| 19 | -import java.util.ArrayList; | ||
| 20 | -import java.util.List; | ||
| 21 | - | ||
| 22 | -/** | ||
| 23 | - * 从专用的socket client 加载数据 | ||
| 24 | - * Created by panzhao on 2017/11/15. | ||
| 25 | - */ | ||
| 26 | -public class SocketClientLoader { | ||
| 27 | - | ||
| 28 | - static Logger logger = LoggerFactory.getLogger(SocketClientLoader.class); | ||
| 29 | - | ||
| 30 | - static String url; | ||
| 31 | - static List<GpsEntity> list; | ||
| 32 | - static CloseableHttpClient httpClient = null; | ||
| 33 | - static HttpGet get; | ||
| 34 | - static RequestConfig requestConfig; | ||
| 35 | - static CloseableHttpResponse response; | ||
| 36 | - static HttpEntity entity; | ||
| 37 | - static BufferedReader br; | ||
| 38 | - | ||
| 39 | - static { | ||
| 40 | - url = ConfigUtil.get("http.gps.real.cache.url"); | ||
| 41 | - list = new ArrayList<>(); | ||
| 42 | - httpClient = HttpClients.createDefault(); | ||
| 43 | - get = new HttpGet(url); | ||
| 44 | - requestConfig = RequestConfig.custom() | ||
| 45 | - .setConnectTimeout(2500).setConnectionRequestTimeout(2000) | ||
| 46 | - .setSocketTimeout(2500).build(); | ||
| 47 | - get.setConfig(requestConfig); | ||
| 48 | - } | ||
| 49 | - | ||
| 50 | - public static List<GpsEntity> load(){ | ||
| 51 | - try { | ||
| 52 | - if(list.size() > 0) | ||
| 53 | - list.clear(); | ||
| 54 | - logger.info("load start..."); | ||
| 55 | - response = httpClient.execute(get); | ||
| 56 | - entity = response.getEntity(); | ||
| 57 | - if(null == entity) | ||
| 58 | - return list; | ||
| 59 | - | ||
| 60 | - br = new BufferedReader(new InputStreamReader(entity.getContent())); | ||
| 61 | - StringBuilder sb = new StringBuilder(); | ||
| 62 | - String str; | ||
| 63 | - while ((str = br.readLine()) != null) | ||
| 64 | - sb.append(str); | ||
| 65 | - | ||
| 66 | - list = JSON.parseArray(sb.toString(), GpsEntity.class); | ||
| 67 | - | ||
| 68 | - logger.info("load end ! size: " + list.size()); | ||
| 69 | - //过滤掉无效的点位 | ||
| 70 | - list = GpsDataUtils.clearInvalid(list); | ||
| 71 | - | ||
| 72 | - for (GpsEntity gps : list) { | ||
| 73 | - gps.setNbbm(BasicData.deviceId2NbbmMap.get(gps.getDeviceId())); | ||
| 74 | - } | ||
| 75 | - | ||
| 76 | - if (null != response) | ||
| 77 | - response.close(); | ||
| 78 | - } catch (Exception e) { | ||
| 79 | - logger.error("", e); | ||
| 80 | - } | ||
| 81 | - | ||
| 82 | - return list; | ||
| 83 | - } | ||
| 84 | -} | 1 | +package com.bsth.data.gpsdata_v2.load; |
| 2 | + | ||
| 3 | +import com.alibaba.fastjson.JSON; | ||
| 4 | +import com.bsth.data.BasicData; | ||
| 5 | +import com.bsth.data.SystemParamCache; | ||
| 6 | +import com.bsth.data.gpsdata_v2.entity.GpsEntity; | ||
| 7 | +import com.bsth.data.gpsdata_v2.utils.GpsDataUtils; | ||
| 8 | +import org.apache.http.HttpEntity; | ||
| 9 | +import org.apache.http.client.config.RequestConfig; | ||
| 10 | +import org.apache.http.client.methods.CloseableHttpResponse; | ||
| 11 | +import org.apache.http.client.methods.HttpGet; | ||
| 12 | +import org.apache.http.impl.client.CloseableHttpClient; | ||
| 13 | +import org.apache.http.impl.client.HttpClients; | ||
| 14 | +import org.slf4j.Logger; | ||
| 15 | +import org.slf4j.LoggerFactory; | ||
| 16 | +import org.springframework.beans.factory.InitializingBean; | ||
| 17 | +import org.springframework.stereotype.Component; | ||
| 18 | + | ||
| 19 | +import java.io.BufferedReader; | ||
| 20 | +import java.io.InputStreamReader; | ||
| 21 | +import java.util.ArrayList; | ||
| 22 | +import java.util.List; | ||
| 23 | + | ||
| 24 | +/** | ||
| 25 | + * 从专用的socket client 加载数据 | ||
| 26 | + * Created by panzhao on 2017/11/15. | ||
| 27 | + */ | ||
| 28 | +@Component | ||
| 29 | +public class SocketClientLoader implements InitializingBean { | ||
| 30 | + | ||
| 31 | + static Logger logger = LoggerFactory.getLogger(SocketClientLoader.class); | ||
| 32 | + | ||
| 33 | + static String url; | ||
| 34 | + static List<GpsEntity> list; | ||
| 35 | + static CloseableHttpClient httpClient = null; | ||
| 36 | + static HttpGet get; | ||
| 37 | + static RequestConfig requestConfig; | ||
| 38 | + static CloseableHttpResponse response; | ||
| 39 | + static HttpEntity entity; | ||
| 40 | + static BufferedReader br; | ||
| 41 | + | ||
| 42 | + public static List<GpsEntity> load(){ | ||
| 43 | + try { | ||
| 44 | + if(list.size() > 0) | ||
| 45 | + list.clear(); | ||
| 46 | + logger.info("load start..."); | ||
| 47 | + response = httpClient.execute(get); | ||
| 48 | + entity = response.getEntity(); | ||
| 49 | + if(null == entity) | ||
| 50 | + return list; | ||
| 51 | + | ||
| 52 | + br = new BufferedReader(new InputStreamReader(entity.getContent())); | ||
| 53 | + StringBuilder sb = new StringBuilder(); | ||
| 54 | + String str; | ||
| 55 | + while ((str = br.readLine()) != null) | ||
| 56 | + sb.append(str); | ||
| 57 | + | ||
| 58 | + list = JSON.parseArray(sb.toString(), GpsEntity.class); | ||
| 59 | + | ||
| 60 | + logger.info("load end ! size: " + list.size()); | ||
| 61 | + //过滤掉无效的点位 | ||
| 62 | + list = GpsDataUtils.clearInvalid(list); | ||
| 63 | + | ||
| 64 | + for (GpsEntity gps : list) { | ||
| 65 | + gps.setNbbm(BasicData.deviceId2NbbmMap.get(gps.getDeviceId())); | ||
| 66 | + } | ||
| 67 | + | ||
| 68 | + if (null != response) | ||
| 69 | + response.close(); | ||
| 70 | + } catch (Exception e) { | ||
| 71 | + logger.error("", e); | ||
| 72 | + } | ||
| 73 | + | ||
| 74 | + return list; | ||
| 75 | + } | ||
| 76 | + | ||
| 77 | + @Override | ||
| 78 | + public void afterPropertiesSet() throws Exception { | ||
| 79 | + url = SystemParamCache.getUrlHttpGpsRealCache(); | ||
| 80 | + list = new ArrayList<>(); | ||
| 81 | + httpClient = HttpClients.createDefault(); | ||
| 82 | + get = new HttpGet(url); | ||
| 83 | + requestConfig = RequestConfig.custom() | ||
| 84 | + .setConnectTimeout(2500).setConnectionRequestTimeout(2000) | ||
| 85 | + .setSocketTimeout(2500).build(); | ||
| 86 | + get.setConfig(requestConfig); | ||
| 87 | + } | ||
| 88 | +} |
src/main/java/com/bsth/entity/sys/Role.java
| 1 | -package com.bsth.entity.sys; | ||
| 2 | - | ||
| 3 | -import java.util.Date; | ||
| 4 | -import java.util.LinkedHashSet; | ||
| 5 | -import java.util.Set; | ||
| 6 | - | ||
| 7 | -import javax.persistence.Column; | ||
| 8 | -import javax.persistence.Entity; | ||
| 9 | -import javax.persistence.FetchType; | ||
| 10 | -import javax.persistence.GeneratedValue; | ||
| 11 | -import javax.persistence.GenerationType; | ||
| 12 | -import javax.persistence.Id; | ||
| 13 | -import javax.persistence.ManyToMany; | ||
| 14 | -import javax.persistence.Table; | ||
| 15 | - | ||
| 16 | -import com.fasterxml.jackson.annotation.JsonIgnore; | ||
| 17 | - | ||
| 18 | -@Entity | ||
| 19 | -@Table(name = "bsth_c_sys_role") | ||
| 20 | -public class Role { | ||
| 21 | - | ||
| 22 | - @Id | ||
| 23 | - @GeneratedValue(strategy = GenerationType.IDENTITY) | ||
| 24 | - private Integer id; | ||
| 25 | - | ||
| 26 | - private String codeName; | ||
| 27 | - | ||
| 28 | - private String roleName; | ||
| 29 | - | ||
| 30 | - private String descriptions; | ||
| 31 | - | ||
| 32 | - private boolean isSuperAdmin; | ||
| 33 | - | ||
| 34 | - private boolean enable; | ||
| 35 | - | ||
| 36 | - @JsonIgnore | ||
| 37 | - @ManyToMany(fetch = FetchType.LAZY, mappedBy = "roles") | ||
| 38 | - private Set<SysUser> users = new LinkedHashSet<>(); | ||
| 39 | - | ||
| 40 | - @JsonIgnore | ||
| 41 | - @ManyToMany | ||
| 42 | - private Set<Module> modules = new LinkedHashSet<>(); | ||
| 43 | - | ||
| 44 | - @JsonIgnore | ||
| 45 | - @ManyToMany(mappedBy = "roles") | ||
| 46 | - private Set<Resource> resources = new LinkedHashSet<>(); | ||
| 47 | - | ||
| 48 | - @Column(updatable = false, name = "create_date", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") | ||
| 49 | - private Date createDate; | ||
| 50 | - | ||
| 51 | - @Column(name = "update_date", columnDefinition = "timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP") | ||
| 52 | - private Date updateDate; | ||
| 53 | - | ||
| 54 | - private int pic; | ||
| 55 | - | ||
| 56 | - public Integer getId() { | ||
| 57 | - return id; | ||
| 58 | - } | ||
| 59 | - | ||
| 60 | - public void setId(Integer id) { | ||
| 61 | - this.id = id; | ||
| 62 | - } | ||
| 63 | - | ||
| 64 | - public String getRoleName() { | ||
| 65 | - return roleName; | ||
| 66 | - } | ||
| 67 | - | ||
| 68 | - public String getDescriptions() { | ||
| 69 | - return descriptions; | ||
| 70 | - } | ||
| 71 | - | ||
| 72 | - public void setDescriptions(String descriptions) { | ||
| 73 | - this.descriptions = descriptions; | ||
| 74 | - } | ||
| 75 | - | ||
| 76 | - public void setRoleName(String roleName) { | ||
| 77 | - this.roleName = roleName; | ||
| 78 | - } | ||
| 79 | - | ||
| 80 | - public boolean isEnable() { | ||
| 81 | - return enable; | ||
| 82 | - } | ||
| 83 | - | ||
| 84 | - public void setEnable(boolean enable) { | ||
| 85 | - this.enable = enable; | ||
| 86 | - } | ||
| 87 | - | ||
| 88 | - public Set<SysUser> getUsers() { | ||
| 89 | - return users; | ||
| 90 | - } | ||
| 91 | - | ||
| 92 | - public void setUsers(Set<SysUser> users) { | ||
| 93 | - this.users = users; | ||
| 94 | - } | ||
| 95 | - | ||
| 96 | - public boolean isSuperAdmin() { | ||
| 97 | - return isSuperAdmin; | ||
| 98 | - } | ||
| 99 | - | ||
| 100 | - public void setSuperAdmin(boolean isSuperAdmin) { | ||
| 101 | - this.isSuperAdmin = isSuperAdmin; | ||
| 102 | - } | ||
| 103 | - | ||
| 104 | - public Set<Module> getModules() { | ||
| 105 | - return modules; | ||
| 106 | - } | ||
| 107 | - | ||
| 108 | - public void setModules(Set<Module> modules) { | ||
| 109 | - this.modules = modules; | ||
| 110 | - } | ||
| 111 | - | ||
| 112 | - public Set<Resource> getResources() { | ||
| 113 | - return resources; | ||
| 114 | - } | ||
| 115 | - | ||
| 116 | - public void setResources(Set<Resource> resources) { | ||
| 117 | - this.resources = resources; | ||
| 118 | - } | ||
| 119 | - | ||
| 120 | - public Date getCreateDate() { | ||
| 121 | - return createDate; | ||
| 122 | - } | ||
| 123 | - | ||
| 124 | - public void setCreateDate(Date createDate) { | ||
| 125 | - this.createDate = createDate; | ||
| 126 | - } | ||
| 127 | - | ||
| 128 | - public Date getUpdateDate() { | ||
| 129 | - return updateDate; | ||
| 130 | - } | ||
| 131 | - | ||
| 132 | - public void setUpdateDate(Date updateDate) { | ||
| 133 | - this.updateDate = updateDate; | ||
| 134 | - } | ||
| 135 | - | ||
| 136 | - public String getCodeName() { | ||
| 137 | - return codeName; | ||
| 138 | - } | ||
| 139 | - | ||
| 140 | - public void setCodeName(String codeName) { | ||
| 141 | - this.codeName = codeName; | ||
| 142 | - } | ||
| 143 | - | ||
| 144 | - public int getPic() { | ||
| 145 | - return pic; | ||
| 146 | - } | ||
| 147 | - | ||
| 148 | - public void setPic(int pic) { | ||
| 149 | - this.pic = pic; | ||
| 150 | - } | ||
| 151 | - | ||
| 152 | - @Override | ||
| 153 | - public boolean equals(Object obj) { | ||
| 154 | - return this.id.equals(((Role)obj).getId()); | ||
| 155 | - } | ||
| 156 | - | ||
| 157 | - @Override | ||
| 158 | - public int hashCode() { | ||
| 159 | - return this.toString().hashCode(); | ||
| 160 | - } | ||
| 161 | - | ||
| 162 | - @Override | ||
| 163 | - public String toString() { | ||
| 164 | - return this.id + "" + this.getCodeName(); | ||
| 165 | - } | ||
| 166 | -} | 1 | +package com.bsth.entity.sys; |
| 2 | + | ||
| 3 | +import java.io.Serializable; | ||
| 4 | +import java.util.Date; | ||
| 5 | +import java.util.LinkedHashSet; | ||
| 6 | +import java.util.Set; | ||
| 7 | + | ||
| 8 | +import javax.persistence.Column; | ||
| 9 | +import javax.persistence.Entity; | ||
| 10 | +import javax.persistence.FetchType; | ||
| 11 | +import javax.persistence.GeneratedValue; | ||
| 12 | +import javax.persistence.GenerationType; | ||
| 13 | +import javax.persistence.Id; | ||
| 14 | +import javax.persistence.ManyToMany; | ||
| 15 | +import javax.persistence.Table; | ||
| 16 | + | ||
| 17 | +import com.fasterxml.jackson.annotation.JsonIgnore; | ||
| 18 | +import org.hibernate.annotations.Formula; | ||
| 19 | + | ||
| 20 | +@Entity | ||
| 21 | +@Table(name = "bsth_c_sys_role") | ||
| 22 | +public class Role implements Serializable { | ||
| 23 | + | ||
| 24 | + @Id | ||
| 25 | + @GeneratedValue(strategy = GenerationType.IDENTITY) | ||
| 26 | + private Integer id; | ||
| 27 | + | ||
| 28 | + private String codeName; | ||
| 29 | + | ||
| 30 | + private String roleName; | ||
| 31 | + | ||
| 32 | + private String descriptions; | ||
| 33 | + | ||
| 34 | + private boolean isSuperAdmin; | ||
| 35 | + | ||
| 36 | + private boolean enable; | ||
| 37 | + | ||
| 38 | + @JsonIgnore | ||
| 39 | + @ManyToMany(fetch = FetchType.LAZY, mappedBy = "roles") | ||
| 40 | + private Set<SysUser> users = new LinkedHashSet<>(); | ||
| 41 | + | ||
| 42 | + @JsonIgnore | ||
| 43 | + @ManyToMany | ||
| 44 | + private Set<Module> modules = new LinkedHashSet<>(); | ||
| 45 | + | ||
| 46 | + @JsonIgnore | ||
| 47 | + @ManyToMany(mappedBy = "roles") | ||
| 48 | + private Set<Resource> resources = new LinkedHashSet<>(); | ||
| 49 | + | ||
| 50 | + @Column(updatable = false, name = "create_date", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") | ||
| 51 | + private Date createDate; | ||
| 52 | + | ||
| 53 | + @Column(name = "update_date", columnDefinition = "timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP") | ||
| 54 | + private Date updateDate; | ||
| 55 | + | ||
| 56 | + /** | ||
| 57 | + * 角色权限 | ||
| 58 | + * | ||
| 59 | + * 角色树结构 本级只能管理下级角色,不能查看同级和上级的任何数据:这里主要为了规范管理 (管理员)层级的用户 | ||
| 60 | + * | ||
| 61 | + * 只能看其他角色upCode 等于 本角色roleCode level字段等级比自己小的 其他角色 严格的树形结构,只能看自己分支下级节点 | ||
| 62 | + * | ||
| 63 | + */ | ||
| 64 | + private int roleCode; | ||
| 65 | + | ||
| 66 | + private int upCode; | ||
| 67 | + | ||
| 68 | + private int level; | ||
| 69 | + | ||
| 70 | + /** 组合自己和父节点编码 */ | ||
| 71 | + @Formula(" concat(up_code, '_', role_code) ") | ||
| 72 | + private String groupCode; | ||
| 73 | + | ||
| 74 | + @Formula(" concat(level, '_',role_code) ") | ||
| 75 | + private String levelCode; | ||
| 76 | + | ||
| 77 | + private int pic; | ||
| 78 | + | ||
| 79 | + public Integer getId() { | ||
| 80 | + return id; | ||
| 81 | + } | ||
| 82 | + | ||
| 83 | + public void setId(Integer id) { | ||
| 84 | + this.id = id; | ||
| 85 | + } | ||
| 86 | + | ||
| 87 | + public String getRoleName() { | ||
| 88 | + return roleName; | ||
| 89 | + } | ||
| 90 | + | ||
| 91 | + public String getDescriptions() { | ||
| 92 | + return descriptions; | ||
| 93 | + } | ||
| 94 | + | ||
| 95 | + public void setDescriptions(String descriptions) { | ||
| 96 | + this.descriptions = descriptions; | ||
| 97 | + } | ||
| 98 | + | ||
| 99 | + public void setRoleName(String roleName) { | ||
| 100 | + this.roleName = roleName; | ||
| 101 | + } | ||
| 102 | + | ||
| 103 | + public boolean isEnable() { | ||
| 104 | + return enable; | ||
| 105 | + } | ||
| 106 | + | ||
| 107 | + public void setEnable(boolean enable) { | ||
| 108 | + this.enable = enable; | ||
| 109 | + } | ||
| 110 | + | ||
| 111 | + public Set<SysUser> getUsers() { | ||
| 112 | + return users; | ||
| 113 | + } | ||
| 114 | + | ||
| 115 | + public void setUsers(Set<SysUser> users) { | ||
| 116 | + this.users = users; | ||
| 117 | + } | ||
| 118 | + | ||
| 119 | + public boolean isSuperAdmin() { | ||
| 120 | + return isSuperAdmin; | ||
| 121 | + } | ||
| 122 | + | ||
| 123 | + public void setSuperAdmin(boolean isSuperAdmin) { | ||
| 124 | + this.isSuperAdmin = isSuperAdmin; | ||
| 125 | + } | ||
| 126 | + | ||
| 127 | + public Set<Module> getModules() { | ||
| 128 | + return modules; | ||
| 129 | + } | ||
| 130 | + | ||
| 131 | + public void setModules(Set<Module> modules) { | ||
| 132 | + this.modules = modules; | ||
| 133 | + } | ||
| 134 | + | ||
| 135 | + public Set<Resource> getResources() { | ||
| 136 | + return resources; | ||
| 137 | + } | ||
| 138 | + | ||
| 139 | + public void setResources(Set<Resource> resources) { | ||
| 140 | + this.resources = resources; | ||
| 141 | + } | ||
| 142 | + | ||
| 143 | + public Date getCreateDate() { | ||
| 144 | + return createDate; | ||
| 145 | + } | ||
| 146 | + | ||
| 147 | + public void setCreateDate(Date createDate) { | ||
| 148 | + this.createDate = createDate; | ||
| 149 | + } | ||
| 150 | + | ||
| 151 | + public Date getUpdateDate() { | ||
| 152 | + return updateDate; | ||
| 153 | + } | ||
| 154 | + | ||
| 155 | + public void setUpdateDate(Date updateDate) { | ||
| 156 | + this.updateDate = updateDate; | ||
| 157 | + } | ||
| 158 | + | ||
| 159 | + public String getCodeName() { | ||
| 160 | + return codeName; | ||
| 161 | + } | ||
| 162 | + | ||
| 163 | + public void setCodeName(String codeName) { | ||
| 164 | + this.codeName = codeName; | ||
| 165 | + } | ||
| 166 | + | ||
| 167 | + public int getRoleCode() { | ||
| 168 | + return roleCode; | ||
| 169 | + } | ||
| 170 | + | ||
| 171 | + public void setRoleCode(int roleCode) { | ||
| 172 | + this.roleCode = roleCode; | ||
| 173 | + } | ||
| 174 | + | ||
| 175 | + public int getUpCode() { | ||
| 176 | + return upCode; | ||
| 177 | + } | ||
| 178 | + | ||
| 179 | + public void setUpCode(int upCode) { | ||
| 180 | + this.upCode = upCode; | ||
| 181 | + } | ||
| 182 | + | ||
| 183 | + public int getLevel() { | ||
| 184 | + return level; | ||
| 185 | + } | ||
| 186 | + | ||
| 187 | + public void setLevel(int level) { | ||
| 188 | + this.level = level; | ||
| 189 | + } | ||
| 190 | + | ||
| 191 | + public String getGroupCode() { | ||
| 192 | + return groupCode; | ||
| 193 | + } | ||
| 194 | + | ||
| 195 | + public void setGroupCode(String groupCode) { | ||
| 196 | + this.groupCode = groupCode; | ||
| 197 | + } | ||
| 198 | + | ||
| 199 | + | ||
| 200 | + public String getLevelCode() { | ||
| 201 | + return levelCode; | ||
| 202 | + } | ||
| 203 | + | ||
| 204 | + public void setLevelCode(String levelCode) { | ||
| 205 | + this.levelCode = levelCode; | ||
| 206 | + } | ||
| 207 | + | ||
| 208 | + public int getPic() { | ||
| 209 | + return pic; | ||
| 210 | + } | ||
| 211 | + | ||
| 212 | + public void setPic(int pic) { | ||
| 213 | + this.pic = pic; | ||
| 214 | + } | ||
| 215 | + | ||
| 216 | + @Override | ||
| 217 | + public boolean equals(Object obj) { | ||
| 218 | + return this.id.equals(((Role)obj).getId()); | ||
| 219 | + } | ||
| 220 | + | ||
| 221 | + @Override | ||
| 222 | + public int hashCode() { | ||
| 223 | + return this.toString().hashCode(); | ||
| 224 | + } | ||
| 225 | + | ||
| 226 | + @Override | ||
| 227 | + public String toString() { | ||
| 228 | + return this.id + "" + this.getCodeName(); | ||
| 229 | + } | ||
| 230 | +} |
src/main/java/com/bsth/entity/sys/SysUser.java
| 1 | -package com.bsth.entity.sys; | ||
| 2 | - | ||
| 3 | -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; | ||
| 4 | - | ||
| 5 | -import javax.persistence.*; | ||
| 6 | -import java.util.Date; | ||
| 7 | -import java.util.LinkedHashSet; | ||
| 8 | -import java.util.Set; | ||
| 9 | - | ||
| 10 | -@Entity | ||
| 11 | -@Table(name = "bsth_c_sys_user") | ||
| 12 | -@JsonIgnoreProperties(ignoreUnknown = true) | ||
| 13 | -@NamedEntityGraphs({ | ||
| 14 | - @NamedEntityGraph(name = "sysUser_role", attributeNodes = { | ||
| 15 | - @NamedAttributeNode("roles") | ||
| 16 | - }) | ||
| 17 | -}) | ||
| 18 | -public class SysUser { | ||
| 19 | - | ||
| 20 | - @Id | ||
| 21 | - @GeneratedValue(strategy = GenerationType.IDENTITY) | ||
| 22 | - private Integer id; | ||
| 23 | - | ||
| 24 | - private String userName; | ||
| 25 | - | ||
| 26 | - private String name; | ||
| 27 | - | ||
| 28 | - private String password; | ||
| 29 | - | ||
| 30 | - @Column(updatable = false, name = "create_date", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") | ||
| 31 | - private Date createDate; | ||
| 32 | - | ||
| 33 | - @Column(name = "last_loginDate", columnDefinition = "timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP") | ||
| 34 | - private Date lastLoginDate; | ||
| 35 | - | ||
| 36 | - private String agencies; | ||
| 37 | - | ||
| 38 | - private boolean enabled; | ||
| 39 | - | ||
| 40 | - @ManyToMany(fetch = FetchType.EAGER) | ||
| 41 | - private Set<Role> roles = new LinkedHashSet<>(); | ||
| 42 | - | ||
| 43 | - | ||
| 44 | - public Integer getId() { | ||
| 45 | - return id; | ||
| 46 | - } | ||
| 47 | - | ||
| 48 | - public void setId(Integer id) { | ||
| 49 | - this.id = id; | ||
| 50 | - } | ||
| 51 | - | ||
| 52 | - public String getUserName() { | ||
| 53 | - return userName; | ||
| 54 | - } | ||
| 55 | - | ||
| 56 | - public void setUserName(String userName) { | ||
| 57 | - this.userName = userName; | ||
| 58 | - } | ||
| 59 | - | ||
| 60 | - public String getName() { | ||
| 61 | - return name; | ||
| 62 | - } | ||
| 63 | - | ||
| 64 | - public void setName(String name) { | ||
| 65 | - this.name = name; | ||
| 66 | - } | ||
| 67 | - | ||
| 68 | - public Date getCreateDate() { | ||
| 69 | - return createDate; | ||
| 70 | - } | ||
| 71 | - | ||
| 72 | - public void setCreateDate(Date createDate) { | ||
| 73 | - this.createDate = createDate; | ||
| 74 | - } | ||
| 75 | - | ||
| 76 | - public Date getLastLoginDate() { | ||
| 77 | - return lastLoginDate; | ||
| 78 | - } | ||
| 79 | - | ||
| 80 | - public void setLastLoginDate(Date lastLoginDate) { | ||
| 81 | - this.lastLoginDate = lastLoginDate; | ||
| 82 | - } | ||
| 83 | - | ||
| 84 | - public String getAgencies() { | ||
| 85 | - return agencies; | ||
| 86 | - } | ||
| 87 | - | ||
| 88 | - public void setAgencies(String agencies) { | ||
| 89 | - this.agencies = agencies; | ||
| 90 | - } | ||
| 91 | - | ||
| 92 | - public boolean isEnabled() { | ||
| 93 | - return enabled; | ||
| 94 | - } | ||
| 95 | - | ||
| 96 | - public void setEnabled(boolean enabled) { | ||
| 97 | - this.enabled = enabled; | ||
| 98 | - } | ||
| 99 | - | ||
| 100 | - public String getPassword() { | ||
| 101 | - return password; | ||
| 102 | - } | ||
| 103 | - | ||
| 104 | - public void setPassword(String password) { | ||
| 105 | - this.password = password; | ||
| 106 | - } | ||
| 107 | - | ||
| 108 | - public Set<Role> getRoles() { | ||
| 109 | - return roles; | ||
| 110 | - } | ||
| 111 | - | ||
| 112 | - public void setRoles(Set<Role> roles) { | ||
| 113 | - this.roles = roles; | ||
| 114 | - } | ||
| 115 | -} | 1 | +package com.bsth.entity.sys; |
| 2 | + | ||
| 3 | +import com.fasterxml.jackson.annotation.JsonIgnore; | ||
| 4 | +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; | ||
| 5 | +import org.springframework.format.annotation.DateTimeFormat; | ||
| 6 | +import org.springframework.util.StringUtils; | ||
| 7 | +import org.joda.time.DateTime; | ||
| 8 | +import javax.persistence.*; | ||
| 9 | +import java.io.Serializable; | ||
| 10 | +import java.util.Date; | ||
| 11 | +import java.util.HashSet; | ||
| 12 | +import java.util.LinkedHashSet; | ||
| 13 | +import java.util.Set; | ||
| 14 | + | ||
| 15 | +@Entity | ||
| 16 | +@Table(name = "bsth_c_sys_user") | ||
| 17 | +@JsonIgnoreProperties(ignoreUnknown = true) | ||
| 18 | +@NamedEntityGraphs({ | ||
| 19 | + @NamedEntityGraph(name = "sysUser_role", attributeNodes = { | ||
| 20 | + @NamedAttributeNode("roles") | ||
| 21 | + }) | ||
| 22 | +}) | ||
| 23 | +public class SysUser implements Serializable { | ||
| 24 | + | ||
| 25 | + @Id | ||
| 26 | + @GeneratedValue(strategy = GenerationType.IDENTITY) | ||
| 27 | + private Integer id; | ||
| 28 | + | ||
| 29 | + private String userName; | ||
| 30 | + | ||
| 31 | + private String name; | ||
| 32 | + | ||
| 33 | + @JsonIgnore | ||
| 34 | + private String password; | ||
| 35 | + | ||
| 36 | + @Column(updatable = false, name = "create_date", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") | ||
| 37 | + private Date createDate; | ||
| 38 | + | ||
| 39 | + @Column(name = "update_date", columnDefinition = "timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP") | ||
| 40 | + private Date updateDate; | ||
| 41 | + | ||
| 42 | + @DateTimeFormat(pattern = "yyyy-MM-dd") | ||
| 43 | + private Date lastLoginDate; | ||
| 44 | + | ||
| 45 | + /** 最近密码更新时间 */ | ||
| 46 | + @Column(updatable = false, name = "last_pwd_date", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") | ||
| 47 | + @DateTimeFormat(pattern = "yyyy-MM-dd") | ||
| 48 | + private Date lastPwdDate; | ||
| 49 | + /** 密码有效期 */ | ||
| 50 | + private Integer pwdValidPeriod = 30; | ||
| 51 | + | ||
| 52 | + private String agencies; | ||
| 53 | + | ||
| 54 | + private boolean enabled; | ||
| 55 | + | ||
| 56 | + @ManyToMany(fetch = FetchType.EAGER) | ||
| 57 | + private Set<Role> roles = new LinkedHashSet<>(); | ||
| 58 | + | ||
| 59 | + private String jobCode; | ||
| 60 | + | ||
| 61 | + private String realName; | ||
| 62 | + | ||
| 63 | + /** | ||
| 64 | + * 密码过期时间 | ||
| 65 | + */ | ||
| 66 | + @Transient | ||
| 67 | + private Date pwdExpiredDate; | ||
| 68 | + | ||
| 69 | + public Integer getId() { | ||
| 70 | + return id; | ||
| 71 | + } | ||
| 72 | + | ||
| 73 | + public void setId(Integer id) { | ||
| 74 | + this.id = id; | ||
| 75 | + } | ||
| 76 | + | ||
| 77 | + public String getUserName() { | ||
| 78 | + return userName; | ||
| 79 | + } | ||
| 80 | + | ||
| 81 | + public void setUserName(String userName) { | ||
| 82 | + this.userName = userName; | ||
| 83 | + } | ||
| 84 | + | ||
| 85 | + public String getName() { | ||
| 86 | + return name; | ||
| 87 | + } | ||
| 88 | + | ||
| 89 | + public void setName(String name) { | ||
| 90 | + this.name = name; | ||
| 91 | + } | ||
| 92 | + | ||
| 93 | + public Date getCreateDate() { | ||
| 94 | + return createDate; | ||
| 95 | + } | ||
| 96 | + | ||
| 97 | + public void setCreateDate(Date createDate) { | ||
| 98 | + this.createDate = createDate; | ||
| 99 | + } | ||
| 100 | + | ||
| 101 | + public Date getUpdateDate() { | ||
| 102 | + return updateDate; | ||
| 103 | + } | ||
| 104 | + | ||
| 105 | + public void setUpdateDate(Date updateDate) { | ||
| 106 | + this.updateDate = updateDate; | ||
| 107 | + } | ||
| 108 | + | ||
| 109 | + public Date getLastLoginDate() { | ||
| 110 | + return lastLoginDate; | ||
| 111 | + } | ||
| 112 | + | ||
| 113 | + public void setLastLoginDate(Date lastLoginDate) { | ||
| 114 | + this.lastLoginDate = lastLoginDate; | ||
| 115 | + } | ||
| 116 | + | ||
| 117 | + public String getAgencies() { | ||
| 118 | + return agencies; | ||
| 119 | + } | ||
| 120 | + | ||
| 121 | + public void setAgencies(String agencies) { | ||
| 122 | + this.agencies = agencies; | ||
| 123 | + } | ||
| 124 | + | ||
| 125 | + public boolean isEnabled() { | ||
| 126 | + return enabled; | ||
| 127 | + } | ||
| 128 | + | ||
| 129 | + public void setEnabled(boolean enabled) { | ||
| 130 | + this.enabled = enabled; | ||
| 131 | + } | ||
| 132 | + | ||
| 133 | + public String getPassword() { | ||
| 134 | + return password; | ||
| 135 | + } | ||
| 136 | + | ||
| 137 | + public void setPassword(String password) { | ||
| 138 | + this.password = password; | ||
| 139 | + } | ||
| 140 | + | ||
| 141 | + public Set<Role> getRoles() { | ||
| 142 | + return roles; | ||
| 143 | + } | ||
| 144 | + | ||
| 145 | + public void setRoles(Set<Role> roles) { | ||
| 146 | + this.roles = roles; | ||
| 147 | + } | ||
| 148 | + | ||
| 149 | + public String getJobCode() { | ||
| 150 | + return jobCode; | ||
| 151 | + } | ||
| 152 | + | ||
| 153 | + public void setJobCode(String jobCode) { | ||
| 154 | + this.jobCode = jobCode; | ||
| 155 | + } | ||
| 156 | + | ||
| 157 | + public String getRealName() { | ||
| 158 | + return realName; | ||
| 159 | + } | ||
| 160 | + | ||
| 161 | + public void setRealName(String realName) { | ||
| 162 | + this.realName = realName; | ||
| 163 | + } | ||
| 164 | + | ||
| 165 | + @JsonIgnore | ||
| 166 | + public Set<String> getLinks() { | ||
| 167 | + Set<String> links = new HashSet<>(); | ||
| 168 | + if (links.size() == 0) { | ||
| 169 | + for (Role role : roles) { | ||
| 170 | + for (Module module : role.getModules()) { | ||
| 171 | + String symbol = module.getMappSymbol(); | ||
| 172 | + if (!StringUtils.isEmpty(symbol)) { | ||
| 173 | + String[] symbols = symbol.split(";"); | ||
| 174 | + for (String temp : symbols) { | ||
| 175 | + if (!StringUtils.isEmpty(temp)) { | ||
| 176 | + links.add(temp); | ||
| 177 | + } | ||
| 178 | + } | ||
| 179 | + } | ||
| 180 | + } | ||
| 181 | + } | ||
| 182 | + } | ||
| 183 | + | ||
| 184 | + return links; | ||
| 185 | + } | ||
| 186 | + | ||
| 187 | + public Date getLastPwdDate() { | ||
| 188 | + return lastPwdDate; | ||
| 189 | + } | ||
| 190 | + | ||
| 191 | + public void setLastPwdDate(Date lastPwdDate) { | ||
| 192 | + this.lastPwdDate = lastPwdDate; | ||
| 193 | + } | ||
| 194 | + | ||
| 195 | + public Integer getPwdValidPeriod() { | ||
| 196 | + return pwdValidPeriod; | ||
| 197 | + } | ||
| 198 | + | ||
| 199 | + public void setPwdValidPeriod(Integer pwdValidPeriod) { | ||
| 200 | + this.pwdValidPeriod = pwdValidPeriod; | ||
| 201 | + } | ||
| 202 | + | ||
| 203 | + public Date getPwdExpiredDate() { | ||
| 204 | + DateTime dateTime = new DateTime(getLastPwdDate()); | ||
| 205 | + if (pwdValidPeriod != null) { | ||
| 206 | + dateTime = dateTime.plusDays(pwdValidPeriod); | ||
| 207 | + } | ||
| 208 | + | ||
| 209 | + return dateTime.toDate(); | ||
| 210 | + } | ||
| 211 | + | ||
| 212 | + public void setPwdExpiredDate(Date pwdExpiredDate) { | ||
| 213 | + this.pwdExpiredDate = pwdExpiredDate; | ||
| 214 | + } | ||
| 215 | +} |
src/main/java/com/bsth/filter/AuthorityFilter.java
0 → 100644
| 1 | +package com.bsth.filter; | ||
| 2 | + | ||
| 3 | +import com.bsth.common.Constants; | ||
| 4 | +import com.bsth.common.ResponseCode; | ||
| 5 | +import com.bsth.data.SystemParamCache; | ||
| 6 | +import com.fasterxml.jackson.databind.ObjectMapper; | ||
| 7 | +import org.slf4j.Logger; | ||
| 8 | +import org.slf4j.LoggerFactory; | ||
| 9 | +import org.springframework.util.AntPathMatcher; | ||
| 10 | +import org.springframework.util.PathMatcher; | ||
| 11 | + | ||
| 12 | +import javax.servlet.*; | ||
| 13 | +import javax.servlet.http.HttpServletRequest; | ||
| 14 | +import javax.servlet.http.HttpServletResponse; | ||
| 15 | +import java.io.IOException; | ||
| 16 | +import java.util.HashMap; | ||
| 17 | +import java.util.Map; | ||
| 18 | +import java.util.Set; | ||
| 19 | + | ||
| 20 | +/** | ||
| 21 | + * 权限过滤器 | ||
| 22 | + * @author Hill | ||
| 23 | + */ | ||
| 24 | +public class AuthorityFilter extends BaseFilter { | ||
| 25 | + | ||
| 26 | + Logger logger = LoggerFactory.getLogger(this.getClass()); | ||
| 27 | + | ||
| 28 | + private ObjectMapper mapper = new ObjectMapper(); | ||
| 29 | + | ||
| 30 | + private final String rootUri = "/"; | ||
| 31 | + | ||
| 32 | + private final String scheduleReferer = "/real_control/v2"; | ||
| 33 | + | ||
| 34 | + private PathMatcher matcher = new AntPathMatcher(); | ||
| 35 | + | ||
| 36 | + private String[] pubUrls = new String[]{ "/pages/home.html", "/error", "/dictionary/all", "/user/validPWDExpired", "/user/isWeakCipher", "/user/isRealName", "/user/currentUser", "/user/companyData", "/user/changePWD", "/pages/permission/user/changePWD.html", "/module/findByCurrentUser", "/cars_sc/all", "/ee/all_py", "/eci/validate_get_destroy_info", "/business/all", "/personnel/all_py", "/companyAuthority/all", "/line/all", "/basic/refresh_person_data", "/downloadFile/download", "/report/lineList", "/adminUtils/**", "/pages/scheduleApp/module/common/**", "/e10adc3949ba59abbe56e057f20f883e.html", "/8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92.html"}; | ||
| 37 | + | ||
| 38 | + @Override | ||
| 39 | + public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { | ||
| 40 | + if (!SystemParamCache.getEnableFilterAuthority()) { | ||
| 41 | + chain.doFilter(request, response); | ||
| 42 | + return; | ||
| 43 | + } | ||
| 44 | + | ||
| 45 | + String uri = request.getRequestURI(), referer = request.getHeader("Referer"); | ||
| 46 | + Set<String> links = (Set<String>) request.getSession().getAttribute(Constants.RESOURCE_AUTHORITYS); | ||
| 47 | + if (rootUri.equals(uri) || (referer != null && referer.indexOf(scheduleReferer) > 0) || isPubURL(uri)) { | ||
| 48 | + chain.doFilter(request, response); | ||
| 49 | + return; | ||
| 50 | + } | ||
| 51 | + if (links != null) { | ||
| 52 | + boolean matched = false; | ||
| 53 | + for (String link : links) { | ||
| 54 | + if (matcher.match(link, uri)) { | ||
| 55 | + matched = true; | ||
| 56 | + break; | ||
| 57 | + } | ||
| 58 | + } | ||
| 59 | + if (!matched) { | ||
| 60 | + Map<String, Object> result = new HashMap<>(); | ||
| 61 | + result.put("status", ResponseCode.ERROR); | ||
| 62 | + result.put("msg", "未授权的访问"); | ||
| 63 | + response.setContentType("text/html;charset=utf-8"); | ||
| 64 | + response.getWriter().write(mapper.writeValueAsString(result)); | ||
| 65 | + return; | ||
| 66 | + } | ||
| 67 | + } | ||
| 68 | + | ||
| 69 | + chain.doFilter(request, response); | ||
| 70 | + } | ||
| 71 | + | ||
| 72 | + protected boolean isPubURL(String uri) { | ||
| 73 | + for (String pubUrl : pubUrls) { | ||
| 74 | + if (matcher.match(pubUrl, uri)) { | ||
| 75 | + return true; | ||
| 76 | + } | ||
| 77 | + } | ||
| 78 | + | ||
| 79 | + return false; | ||
| 80 | + } | ||
| 81 | +} | ||
| 0 | \ No newline at end of file | 82 | \ No newline at end of file |
src/main/java/com/bsth/filter/BaseFilter.java
| 1 | -package com.bsth.filter; | ||
| 2 | - | ||
| 3 | -import com.bsth.common.Constants; | ||
| 4 | -import org.springframework.util.AntPathMatcher; | ||
| 5 | -import org.springframework.util.PathMatcher; | ||
| 6 | - | ||
| 7 | -import javax.servlet.*; | ||
| 8 | -import javax.servlet.http.HttpServletRequest; | ||
| 9 | -import javax.servlet.http.HttpServletResponse; | ||
| 10 | -import java.io.IOException; | ||
| 11 | - | ||
| 12 | -public abstract class BaseFilter implements Filter { | ||
| 13 | - | ||
| 14 | - private final PathMatcher pathMatcher = new AntPathMatcher(); | ||
| 15 | - | ||
| 16 | - /** | ||
| 17 | - * 白名单 | ||
| 18 | - */ | ||
| 19 | - private String[] whiteListURLs = { Constants.LOGIN_PAGE,Constants.CAPTCHA, Constants.SERVICE_INTERFACE, | ||
| 20 | - Constants.ASSETS_URL, Constants.FAVICON_URL, Constants.METRONIC_URL, Constants.LOGIN, Constants.LOGIN_FAILURE, Constants.UPSTREAM_URL, Constants.XD_CHILD_PAGES, Constants.XD_REAL_GPS, Constants.UP_RFID_URL, Constants.STATION_AND_SECTION_COUNT,Constants.XIANDIAO_LOGIN ,Constants.IPAD_IMG_URL}; | ||
| 21 | - | ||
| 22 | - @Override | ||
| 23 | - public void destroy() { | ||
| 24 | - | ||
| 25 | - } | ||
| 26 | - | ||
| 27 | - @Override | ||
| 28 | - public void doFilter(ServletRequest request, ServletResponse response, | ||
| 29 | - FilterChain chain) throws IOException, ServletException { | ||
| 30 | - | ||
| 31 | - HttpServletRequest httpRequest = (HttpServletRequest) request; | ||
| 32 | - HttpServletResponse httpResponse = (HttpServletResponse) response; | ||
| 33 | - | ||
| 34 | - String currentURL = httpRequest.getServletPath(); | ||
| 35 | - | ||
| 36 | - if (isWhiteURL(currentURL)) { | ||
| 37 | - chain.doFilter(request, response); | ||
| 38 | - return; | ||
| 39 | - } | ||
| 40 | - | ||
| 41 | - doFilter(httpRequest, httpResponse, chain); | ||
| 42 | - return; | ||
| 43 | - } | ||
| 44 | - | ||
| 45 | - public void doFilter(HttpServletRequest request, | ||
| 46 | - HttpServletResponse response, FilterChain chain) | ||
| 47 | - throws IOException, ServletException { | ||
| 48 | - chain.doFilter(request, response); | ||
| 49 | - } | ||
| 50 | - | ||
| 51 | - @Override | ||
| 52 | - public void init(FilterConfig arg0) throws ServletException { | ||
| 53 | - | ||
| 54 | - } | ||
| 55 | - | ||
| 56 | - private boolean isWhiteURL(String currentURL) { | ||
| 57 | - for (String whiteURL : whiteListURLs) { | ||
| 58 | - if (pathMatcher.match(whiteURL, currentURL)) { | ||
| 59 | - return true; | ||
| 60 | - } | ||
| 61 | - } | ||
| 62 | - return false; | ||
| 63 | - } | ||
| 64 | -} | 1 | +package com.bsth.filter; |
| 2 | + | ||
| 3 | +import com.bsth.common.Constants; | ||
| 4 | +import org.springframework.util.AntPathMatcher; | ||
| 5 | +import org.springframework.util.PathMatcher; | ||
| 6 | + | ||
| 7 | +import javax.servlet.*; | ||
| 8 | +import javax.servlet.http.HttpServletRequest; | ||
| 9 | +import javax.servlet.http.HttpServletResponse; | ||
| 10 | +import java.io.IOException; | ||
| 11 | + | ||
| 12 | +public abstract class BaseFilter implements Filter { | ||
| 13 | + | ||
| 14 | + private final PathMatcher pathMatcher = new AntPathMatcher(); | ||
| 15 | + | ||
| 16 | + /** | ||
| 17 | + * 白名单 | ||
| 18 | + */ | ||
| 19 | + private String[] whiteListURLs = { Constants.LOGIN_PAGE,Constants.CAPTCHA, Constants.SERVICE_INTERFACE, | ||
| 20 | + Constants.ASSETS_URL, Constants.FAVICON_URL, Constants.METRONIC_URL, Constants.LOGIN, Constants.LOGIN_FAILURE, Constants.UPSTREAM_URL, Constants.XD_CHILD_PAGES, Constants.XD_REAL_GPS, Constants.UP_RFID_URL, Constants.STATION_AND_SECTION_COUNT,Constants.XIANDIAO_LOGIN ,Constants.IPAD_IMG_URL}; | ||
| 21 | + | ||
| 22 | + @Override | ||
| 23 | + public void destroy() { | ||
| 24 | + | ||
| 25 | + } | ||
| 26 | + | ||
| 27 | + @Override | ||
| 28 | + public void doFilter(ServletRequest request, ServletResponse response, | ||
| 29 | + FilterChain chain) throws IOException, ServletException { | ||
| 30 | + | ||
| 31 | + HttpServletRequest httpRequest = (HttpServletRequest) request; | ||
| 32 | + HttpServletResponse httpResponse = (HttpServletResponse) response; | ||
| 33 | + httpResponse.setHeader("Content-Security-Policy", "script-src 'unsafe-inline' 'unsafe-eval' http: https:; worker-src blob:;"); | ||
| 34 | + | ||
| 35 | + String currentURL = httpRequest.getServletPath(); | ||
| 36 | + | ||
| 37 | + if (isWhiteURL(currentURL)) { | ||
| 38 | + chain.doFilter(request, response); | ||
| 39 | + return; | ||
| 40 | + } | ||
| 41 | + | ||
| 42 | + doFilter(httpRequest, httpResponse, chain); | ||
| 43 | + return; | ||
| 44 | + } | ||
| 45 | + | ||
| 46 | + public void doFilter(HttpServletRequest request, | ||
| 47 | + HttpServletResponse response, FilterChain chain) | ||
| 48 | + throws IOException, ServletException { | ||
| 49 | + chain.doFilter(request, response); | ||
| 50 | + } | ||
| 51 | + | ||
| 52 | + @Override | ||
| 53 | + public void init(FilterConfig arg0) throws ServletException { | ||
| 54 | + | ||
| 55 | + } | ||
| 56 | + | ||
| 57 | + private boolean isWhiteURL(String currentURL) { | ||
| 58 | + for (String whiteURL : whiteListURLs) { | ||
| 59 | + if (pathMatcher.match(whiteURL, currentURL)) { | ||
| 60 | + return true; | ||
| 61 | + } | ||
| 62 | + } | ||
| 63 | + return false; | ||
| 64 | + } | ||
| 65 | +} |
src/main/java/com/bsth/filter/WhiteIpFilter.java
| 1 | package com.bsth.filter; | 1 | package com.bsth.filter; |
| 2 | 2 | ||
| 3 | -import com.bsth.common.Setting; | ||
| 4 | -import com.bsth.data.BasicData; | 3 | +import com.bsth.data.SystemParamCache; |
| 4 | +import com.bsth.data.WhiteIpCache; | ||
| 5 | import com.bsth.entity.WhiteIp; | 5 | import com.bsth.entity.WhiteIp; |
| 6 | import com.bsth.util.IpUtils; | 6 | import com.bsth.util.IpUtils; |
| 7 | import org.slf4j.Logger; | 7 | import org.slf4j.Logger; |
| 8 | import org.slf4j.LoggerFactory; | 8 | import org.slf4j.LoggerFactory; |
| 9 | -import org.springframework.stereotype.Component; | ||
| 10 | 9 | ||
| 11 | import javax.servlet.*; | 10 | import javax.servlet.*; |
| 12 | import javax.servlet.http.HttpServletRequest; | 11 | import javax.servlet.http.HttpServletRequest; |
| @@ -21,17 +20,7 @@ import java.util.List; | @@ -21,17 +20,7 @@ import java.util.List; | ||
| 21 | //@Component | 20 | //@Component |
| 22 | public class WhiteIpFilter implements Filter { | 21 | public class WhiteIpFilter implements Filter { |
| 23 | 22 | ||
| 24 | - Logger logger = LoggerFactory.getLogger(this.getClass()); | ||
| 25 | - | ||
| 26 | - private Setting setting; | ||
| 27 | - | ||
| 28 | - public Setting getSetting() { | ||
| 29 | - return setting; | ||
| 30 | - } | ||
| 31 | - | ||
| 32 | - public void setSetting(Setting setting) { | ||
| 33 | - this.setting = setting; | ||
| 34 | - } | 23 | + Logger logger = LoggerFactory.getLogger(this.getClass()); |
| 35 | 24 | ||
| 36 | @Override | 25 | @Override |
| 37 | public void init(FilterConfig filterConfig) throws ServletException { | 26 | public void init(FilterConfig filterConfig) throws ServletException { |
| @@ -39,29 +28,34 @@ public class WhiteIpFilter implements Filter { | @@ -39,29 +28,34 @@ public class WhiteIpFilter implements Filter { | ||
| 39 | } | 28 | } |
| 40 | 29 | ||
| 41 | @Override | 30 | @Override |
| 42 | - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { | ||
| 43 | - HttpServletRequest req = (HttpServletRequest)request; | ||
| 44 | - HttpServletResponse res = (HttpServletResponse)response; | 31 | + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { |
| 45 | 32 | ||
| 46 | - String ip = IpUtils.getIpAddr(req); | ||
| 47 | - boolean isMatch = false; | ||
| 48 | - List<WhiteIp> whiteIps = BasicData.whiteIpList; | ||
| 49 | - if (whiteIps != null) { | ||
| 50 | - for (WhiteIp whiteIp : whiteIps) { | ||
| 51 | - if (ip.equals(whiteIp.getIp())) { | ||
| 52 | - isMatch = true; | ||
| 53 | - break; | ||
| 54 | - } | ||
| 55 | - } | ||
| 56 | - } | ||
| 57 | - if (isMatch || !setting.isWhiteipEnabled()) { | ||
| 58 | - chain.doFilter(request, response); | ||
| 59 | - } else { | ||
| 60 | - logger.info(ip + "未在白名单中,不予访问"); | ||
| 61 | - res.setStatus(404); | ||
| 62 | - return; | ||
| 63 | - } | ||
| 64 | - } | 33 | + if (!SystemParamCache.getEnabledWhiteIp()) { |
| 34 | + chain.doFilter(request, response); | ||
| 35 | + return; | ||
| 36 | + } | ||
| 37 | + | ||
| 38 | + HttpServletRequest req = (HttpServletRequest)request; | ||
| 39 | + HttpServletResponse res = (HttpServletResponse)response; | ||
| 40 | + | ||
| 41 | + String ip = IpUtils.getIpAddr(req); | ||
| 42 | + boolean isMatch = false; | ||
| 43 | + List<WhiteIp> whiteIps = WhiteIpCache.getWhiteIps(); | ||
| 44 | + if (whiteIps != null) { | ||
| 45 | + for (WhiteIp whiteIp : whiteIps) { | ||
| 46 | + if (ip.equals(whiteIp.getIp())) { | ||
| 47 | + isMatch = true; | ||
| 48 | + break; | ||
| 49 | + } | ||
| 50 | + } | ||
| 51 | + } | ||
| 52 | + if (isMatch) { | ||
| 53 | + chain.doFilter(request, response); | ||
| 54 | + } else { | ||
| 55 | + logger.info("{}未在白名单中,不予访问", ip); | ||
| 56 | + res.setStatus(404); | ||
| 57 | + } | ||
| 58 | + } | ||
| 65 | 59 | ||
| 66 | @Override | 60 | @Override |
| 67 | public void destroy() { | 61 | public void destroy() { |
src/main/java/com/bsth/repository/sys/RoleRepository.java
| 1 | -package com.bsth.repository.sys; | ||
| 2 | - | ||
| 3 | - | ||
| 4 | -import javax.transaction.Transactional; | ||
| 5 | - | ||
| 6 | -import org.springframework.data.jpa.repository.Modifying; | ||
| 7 | -import org.springframework.data.jpa.repository.Query; | ||
| 8 | -import org.springframework.stereotype.Repository; | ||
| 9 | - | ||
| 10 | -import com.bsth.entity.sys.Role; | ||
| 11 | -import com.bsth.repository.BaseRepository; | ||
| 12 | - | ||
| 13 | -@Repository | ||
| 14 | -public interface RoleRepository extends BaseRepository<Role, Integer>{ | ||
| 15 | - | ||
| 16 | - /** | ||
| 17 | - * @Title: update | ||
| 18 | - * @Description: TODO(简洁版更新(不需要级联的)) | ||
| 19 | - */ | ||
| 20 | - @Modifying | ||
| 21 | - @Transactional | ||
| 22 | - @Query("update Role r set r.codeName=?1, r.roleName=?2, r.enable=?3, r.descriptions=?4 where r.id=?5") | ||
| 23 | - void update(String codeName, String roleName, boolean enable, String descriptions, Integer id); | ||
| 24 | -} | 1 | +package com.bsth.repository.sys; |
| 2 | + | ||
| 3 | + | ||
| 4 | +import javax.transaction.Transactional; | ||
| 5 | + | ||
| 6 | +import org.springframework.data.jpa.repository.Modifying; | ||
| 7 | +import org.springframework.data.jpa.repository.Query; | ||
| 8 | +import org.springframework.stereotype.Repository; | ||
| 9 | + | ||
| 10 | +import com.bsth.entity.sys.Role; | ||
| 11 | +import com.bsth.repository.BaseRepository; | ||
| 12 | + | ||
| 13 | +import java.util.List; | ||
| 14 | + | ||
| 15 | +@Repository | ||
| 16 | +public interface RoleRepository extends BaseRepository<Role, Integer>{ | ||
| 17 | + | ||
| 18 | + // 查询最大ID | ||
| 19 | + @Query(value = "SELECT IFNULL(num,0) as maxId from (SELECT MAX(id) as num FROM bsth_c_sys_role) k" | ||
| 20 | + , nativeQuery=true) | ||
| 21 | + public int roleMaxId(); | ||
| 22 | + | ||
| 23 | + /** | ||
| 24 | + * @Title: update | ||
| 25 | + * @Description: TODO(简洁版更新(不需要级联的)) | ||
| 26 | + */ | ||
| 27 | + @Modifying | ||
| 28 | + @Transactional | ||
| 29 | + @Query("update Role r set r.codeName=?1, r.roleName=?2, r.enable=?3, r.descriptions=?4 where r.id=?5") | ||
| 30 | + void update(String codeName, String roleName, boolean enable, String descriptions, Integer id); | ||
| 31 | + | ||
| 32 | + @Query(value = "select * from role where id in(?1)",nativeQuery = true) | ||
| 33 | + List<Role> findAllById(String ids); | ||
| 34 | + | ||
| 35 | +// @Query(value = "select r from Role r where < ?1") | ||
| 36 | +// List<Role> findSubordinate(Integer pic); | ||
| 37 | +} |
src/main/java/com/bsth/repository/sys/SysUserRepository.java
| 1 | -package com.bsth.repository.sys; | ||
| 2 | - | ||
| 3 | -import com.bsth.entity.sys.SysUser; | ||
| 4 | -import com.bsth.repository.BaseRepository; | ||
| 5 | -import org.springframework.data.jpa.repository.EntityGraph; | ||
| 6 | -import org.springframework.data.jpa.repository.Modifying; | ||
| 7 | -import org.springframework.data.jpa.repository.Query; | ||
| 8 | -import org.springframework.stereotype.Repository; | ||
| 9 | -import org.springframework.transaction.annotation.Transactional; | ||
| 10 | - | ||
| 11 | -import java.util.List; | ||
| 12 | - | ||
| 13 | -@Repository | ||
| 14 | -public interface SysUserRepository extends BaseRepository<SysUser, Integer>{ | ||
| 15 | - | ||
| 16 | - SysUser findByUserName(String userName); | ||
| 17 | - | ||
| 18 | - @Transactional | ||
| 19 | - @Modifying | ||
| 20 | - @Query(value="update bsth_c_sys_user set enabled=?2 where id=?1",nativeQuery=true) | ||
| 21 | - int changeEnabled(int id,int enabled); | ||
| 22 | - | ||
| 23 | - @Transactional | ||
| 24 | - @Modifying | ||
| 25 | - @Query(value="update bsth_c_sys_user set password=?2 where id=?1",nativeQuery=true) | ||
| 26 | - int changePWD(int id,String newPWD); | ||
| 27 | - | ||
| 28 | - @EntityGraph(value = "sysUser_role", type = EntityGraph.EntityGraphType.FETCH) | ||
| 29 | - @Query(value = "select DISTINCT u from SysUser u") | ||
| 30 | - List<SysUser> findAll_distinct(); | ||
| 31 | -} | 1 | +package com.bsth.repository.sys; |
| 2 | + | ||
| 3 | +import com.bsth.entity.sys.SysUser; | ||
| 4 | +import com.bsth.repository.BaseRepository; | ||
| 5 | +import org.springframework.data.jpa.repository.EntityGraph; | ||
| 6 | +import org.springframework.data.jpa.repository.Modifying; | ||
| 7 | +import org.springframework.data.jpa.repository.Query; | ||
| 8 | +import org.springframework.stereotype.Repository; | ||
| 9 | +import org.springframework.transaction.annotation.Transactional; | ||
| 10 | + | ||
| 11 | +import java.util.List; | ||
| 12 | + | ||
| 13 | +@Repository | ||
| 14 | +public interface SysUserRepository extends BaseRepository<SysUser, Integer>{ | ||
| 15 | + | ||
| 16 | + SysUser findByUserName(String userName); | ||
| 17 | + | ||
| 18 | + @Transactional | ||
| 19 | + @Modifying | ||
| 20 | + @Query(value="update bsth_c_sys_user set enabled=?2 where id=?1",nativeQuery=true) | ||
| 21 | + int changeEnabled(int id,int enabled); | ||
| 22 | + | ||
| 23 | + @Transactional | ||
| 24 | + @Modifying | ||
| 25 | + @Query(value="update bsth_c_sys_user set password=?2, last_pwd_date = now() where id=?1",nativeQuery=true) | ||
| 26 | + int changePWD(int id,String newPWD); | ||
| 27 | + | ||
| 28 | + @EntityGraph(value = "sysUser_role", type = EntityGraph.EntityGraphType.FETCH) | ||
| 29 | + @Query(value = "select DISTINCT u from SysUser u") | ||
| 30 | + List<SysUser> findAll_distinct(); | ||
| 31 | + | ||
| 32 | + @Modifying | ||
| 33 | + @Query(value="update bsth_c_sys_user set last_login_date=now() where user_name = ?1",nativeQuery=true) | ||
| 34 | + void recordLoginDate(String userName); | ||
| 35 | + | ||
| 36 | + @Modifying | ||
| 37 | + @Query(value="update bsth_c_sys_user set job_code = ?1, real_name = ?2 where id = ?3",nativeQuery=true) | ||
| 38 | + void realName(String jobCode, String realName, int id); | ||
| 39 | +} |
src/main/java/com/bsth/security/WebSecurityConfig.java
| 1 | package com.bsth.security; | 1 | package com.bsth.security; |
| 2 | 2 | ||
| 3 | -import com.bsth.common.Setting; | 3 | +import com.bsth.common.Constants; |
| 4 | +import com.bsth.filter.AccessLogFilter; | ||
| 5 | +import com.bsth.filter.AuthorityFilter; | ||
| 4 | import com.bsth.filter.WhiteIpFilter; | 6 | import com.bsth.filter.WhiteIpFilter; |
| 7 | +import com.bsth.security.filter.LoginInterceptor; | ||
| 5 | import org.springframework.beans.factory.annotation.Autowired; | 8 | import org.springframework.beans.factory.annotation.Autowired; |
| 6 | -import org.springframework.beans.factory.annotation.Value; | ||
| 7 | import org.springframework.boot.context.embedded.ServletListenerRegistrationBean; | 9 | import org.springframework.boot.context.embedded.ServletListenerRegistrationBean; |
| 8 | import org.springframework.context.annotation.Bean; | 10 | import org.springframework.context.annotation.Bean; |
| 9 | import org.springframework.context.annotation.Configuration; | 11 | import org.springframework.context.annotation.Configuration; |
| @@ -20,9 +22,6 @@ import org.springframework.security.web.firewall.DefaultHttpFirewall; | @@ -20,9 +22,6 @@ import org.springframework.security.web.firewall.DefaultHttpFirewall; | ||
| 20 | import org.springframework.security.web.firewall.HttpFirewall; | 22 | import org.springframework.security.web.firewall.HttpFirewall; |
| 21 | import org.springframework.security.web.session.HttpSessionEventPublisher; | 23 | import org.springframework.security.web.session.HttpSessionEventPublisher; |
| 22 | 24 | ||
| 23 | -import com.bsth.common.Constants; | ||
| 24 | -import com.bsth.security.filter.LoginInterceptor; | ||
| 25 | - | ||
| 26 | @Configuration | 25 | @Configuration |
| 27 | @EnableWebSecurity | 26 | @EnableWebSecurity |
| 28 | public class WebSecurityConfig extends WebSecurityConfigurerAdapter { | 27 | public class WebSecurityConfig extends WebSecurityConfigurerAdapter { |
| @@ -36,15 +35,12 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { | @@ -36,15 +35,12 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { | ||
| 36 | @Autowired | 35 | @Autowired |
| 37 | SecurityMetadataSourceService securityMetadataSourceService; | 36 | SecurityMetadataSourceService securityMetadataSourceService; |
| 38 | 37 | ||
| 39 | - @Autowired | ||
| 40 | - private Setting setting; | ||
| 41 | - | ||
| 42 | @Override | 38 | @Override |
| 43 | public void configure(WebSecurity web) throws Exception { | 39 | public void configure(WebSecurity web) throws Exception { |
| 44 | // 白名单 | 40 | // 白名单 |
| 45 | - web.ignoring().antMatchers(Constants.LOGIN, Constants.ASSETS_URL, Constants.FAVICON_URL, Constants.CAPTCHA, | ||
| 46 | - Constants.SERVICE_INTERFACE, Constants.METRONIC_URL, Constants.LOGIN_FAILURE, Constants.UPSTREAM_URL, | ||
| 47 | - Constants.XD_CHILD_PAGES, Constants.UP_RFID_URL, Constants.STATION_AND_SECTION_COUNT); | 41 | + web.ignoring().antMatchers(Constants.LOGIN_PAGE, Constants.LOGIN, Constants.ORIGINAL_LOGIN_PAGE, Constants.ASSETS_URL, Constants.FAVICON_URL, Constants.CAPTCHA, |
| 42 | + Constants.SERVICE_INTERFACE, Constants.LOGIN_FAILURE, Constants.UPSTREAM_URL, Constants.XD_CHILD_PAGES, | ||
| 43 | + Constants.UP_RFID_URL, Constants.STATION_AND_SECTION_COUNT, Constants.FILE_AUTH); | ||
| 48 | } | 44 | } |
| 49 | 45 | ||
| 50 | @Override | 46 | @Override |
| @@ -75,11 +71,16 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { | @@ -75,11 +71,16 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { | ||
| 75 | .expiredUrl(Constants.LOGIN_PAGE + "?error=true") | 71 | .expiredUrl(Constants.LOGIN_PAGE + "?error=true") |
| 76 | .maxSessionsPreventsLogin(false) | 72 | .maxSessionsPreventsLogin(false) |
| 77 | .sessionRegistry(sessionRegistry()); | 73 | .sessionRegistry(sessionRegistry()); |
| 74 | + //edge游览器地图和轨迹播放不行的问题 | ||
| 75 | +// http.headers().contentSecurityPolicy( | ||
| 76 | +// "script-src 'unsafe-inline' 'unsafe-eval' http: https:; worker-src blob:;" | ||
| 77 | +// ); | ||
| 78 | 78 | ||
| 79 | WhiteIpFilter whiteIpFilter = new WhiteIpFilter(); | 79 | WhiteIpFilter whiteIpFilter = new WhiteIpFilter(); |
| 80 | - whiteIpFilter.setSetting(setting); | ||
| 81 | http.addFilterBefore(whiteIpFilter, FilterSecurityInterceptor.class); | 80 | http.addFilterBefore(whiteIpFilter, FilterSecurityInterceptor.class); |
| 82 | http.addFilterBefore(new LoginInterceptor(), FilterSecurityInterceptor.class); | 81 | http.addFilterBefore(new LoginInterceptor(), FilterSecurityInterceptor.class); |
| 82 | + http.addFilterBefore(new AccessLogFilter(), FilterSecurityInterceptor.class); | ||
| 83 | + http.addFilterBefore(new AuthorityFilter(), FilterSecurityInterceptor.class); | ||
| 83 | http.addFilter(filterSecurityInterceptor()); | 84 | http.addFilter(filterSecurityInterceptor()); |
| 84 | } | 85 | } |
| 85 | 86 |
src/main/java/com/bsth/service/SystemParamService.java
| @@ -6,4 +6,8 @@ import com.bsth.entity.SystemParam; | @@ -6,4 +6,8 @@ import com.bsth.entity.SystemParam; | ||
| 6 | * @author Hill | 6 | * @author Hill |
| 7 | */ | 7 | */ |
| 8 | public interface SystemParamService extends BaseService<SystemParam, Integer> { | 8 | public interface SystemParamService extends BaseService<SystemParam, Integer> { |
| 9 | + | ||
| 10 | + void refresh(); | ||
| 11 | + | ||
| 12 | + String getValue(String key); | ||
| 9 | } | 13 | } |
src/main/java/com/bsth/service/impl/SystemParamServiceImpl.java
| 1 | package com.bsth.service.impl; | 1 | package com.bsth.service.impl; |
| 2 | 2 | ||
| 3 | import com.bsth.entity.SystemParam; | 3 | import com.bsth.entity.SystemParam; |
| 4 | +import com.bsth.repository.SystemParamRepository; | ||
| 4 | import com.bsth.service.SystemParamService; | 5 | import com.bsth.service.SystemParamService; |
| 6 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 7 | +import org.springframework.scheduling.annotation.EnableScheduling; | ||
| 8 | +import org.springframework.scheduling.annotation.Scheduled; | ||
| 9 | +import org.springframework.stereotype.Service; | ||
| 10 | + | ||
| 11 | +import java.util.HashMap; | ||
| 12 | +import java.util.Map; | ||
| 5 | 13 | ||
| 6 | /** | 14 | /** |
| 7 | * @author Hill | 15 | * @author Hill |
| 8 | */ | 16 | */ |
| 17 | +@Service | ||
| 18 | +@EnableScheduling | ||
| 9 | public class SystemParamServiceImpl extends BaseServiceImpl<SystemParam, Integer> implements SystemParamService { | 19 | public class SystemParamServiceImpl extends BaseServiceImpl<SystemParam, Integer> implements SystemParamService { |
| 20 | + | ||
| 21 | + @Autowired | ||
| 22 | + private SystemParamRepository systemParamRepository; | ||
| 23 | + | ||
| 24 | + private Map<String, String> pairs = new HashMap<>(); | ||
| 25 | + | ||
| 26 | + @Scheduled(cron = "0 0/30 * * * ?") | ||
| 27 | + public void refresh() { | ||
| 28 | + for (SystemParam sp : systemParamRepository.findAll()) { | ||
| 29 | + pairs.put(sp.getKey(), sp.getValue()); | ||
| 30 | + } | ||
| 31 | + } | ||
| 32 | + | ||
| 33 | + public String getValue(String key) { | ||
| 34 | + return pairs.get(key); | ||
| 35 | + } | ||
| 10 | } | 36 | } |
src/main/java/com/bsth/service/sys/RoleService.java
| 1 | -package com.bsth.service.sys; | ||
| 2 | - | ||
| 3 | -import java.util.Map; | ||
| 4 | - | ||
| 5 | -import com.bsth.entity.sys.Role; | ||
| 6 | -import com.bsth.service.BaseService; | ||
| 7 | - | ||
| 8 | -public interface RoleService extends BaseService<Role, Integer>{ | ||
| 9 | - | ||
| 10 | - Map<String, Object> settRoleModules(Integer roleId, String mIds); | ||
| 11 | - | ||
| 12 | - Map<String, Object> roleInfo(Integer id); | ||
| 13 | -} | 1 | +package com.bsth.service.sys; |
| 2 | + | ||
| 3 | +import com.bsth.entity.sys.Role; | ||
| 4 | +import com.bsth.service.BaseService; | ||
| 5 | + | ||
| 6 | +import java.util.List; | ||
| 7 | +import java.util.Map; | ||
| 8 | + | ||
| 9 | +public interface RoleService extends BaseService<Role, Integer>{ | ||
| 10 | + | ||
| 11 | + Map<String, Object> findSubordinate(); | ||
| 12 | + | ||
| 13 | + Map<String, Object> add(Role role); | ||
| 14 | + | ||
| 15 | + Map<String, Object> settRoleModules(Integer roleId, String mIds); | ||
| 16 | + | ||
| 17 | + Map<String, Object> roleInfo(Integer id); | ||
| 18 | + | ||
| 19 | + List<Role> findAllByIds(String ids); | ||
| 20 | + | ||
| 21 | + boolean checkOperationLegality(Integer operationRoleId); | ||
| 22 | +} |
src/main/java/com/bsth/service/sys/SysUserService.java
| 1 | -package com.bsth.service.sys; | ||
| 2 | - | ||
| 3 | -import com.bsth.entity.sys.SysUser; | ||
| 4 | -import com.bsth.service.BaseService; | ||
| 5 | - | ||
| 6 | -import java.util.List; | ||
| 7 | -import java.util.Map; | ||
| 8 | - | ||
| 9 | -public interface SysUserService extends BaseService<SysUser, Integer>{ | ||
| 10 | - | ||
| 11 | - SysUser findByUserName(String name); | ||
| 12 | - | ||
| 13 | - int changeEnabled(int id,int enabled); | ||
| 14 | - | ||
| 15 | - int changePWD(int id,String newPWD); | ||
| 16 | - | ||
| 17 | - Map<String,Object> register(SysUser u); | ||
| 18 | - | ||
| 19 | - List<SysUser> findAll_distinct(); | ||
| 20 | -} | 1 | +package com.bsth.service.sys; |
| 2 | + | ||
| 3 | +import com.bsth.entity.sys.SysUser; | ||
| 4 | +import com.bsth.service.BaseService; | ||
| 5 | + | ||
| 6 | +import java.util.List; | ||
| 7 | +import java.util.Map; | ||
| 8 | + | ||
| 9 | +public interface SysUserService extends BaseService<SysUser, Integer>{ | ||
| 10 | + | ||
| 11 | + SysUser findByUserName(String name); | ||
| 12 | + | ||
| 13 | + int changeEnabled(int id,int enabled); | ||
| 14 | + | ||
| 15 | + int changePWD(int id,String newPWD); | ||
| 16 | + | ||
| 17 | + /** | ||
| 18 | + * 检测指定用户密码是否过期 | ||
| 19 | + * @param userName 用户名 | ||
| 20 | + */ | ||
| 21 | + boolean validPWDExpired(String userName); | ||
| 22 | + | ||
| 23 | + Map<String,Object> register(SysUser u); | ||
| 24 | + | ||
| 25 | + List<SysUser> findAll_distinct(); | ||
| 26 | + | ||
| 27 | + Map<String, Object> resetPassword(Integer id, Integer pwdValidPeriod); | ||
| 28 | + | ||
| 29 | + void recordLoginDate(String userName); | ||
| 30 | + | ||
| 31 | + void realName(String jobCode, String realName, int id); | ||
| 32 | +} |
src/main/java/com/bsth/service/sys/impl/PwdGenerator.java
0 → 100644
| 1 | +package com.bsth.service.sys.impl; | ||
| 2 | + | ||
| 3 | +import java.util.Random; | ||
| 4 | + | ||
| 5 | +public class PwdGenerator { | ||
| 6 | + private static final String SPECIAL_CHARS = "!@#$%^&*_=+-/"; | ||
| 7 | + | ||
| 8 | + /** | ||
| 9 | + * 查找一个char数组中还没有填充字符的位置 | ||
| 10 | + */ | ||
| 11 | + private static int nextIndex(char[] chars, Random rnd) { | ||
| 12 | + int index = rnd.nextInt(chars.length); | ||
| 13 | + while (chars[index] != 0) { | ||
| 14 | + index = rnd.nextInt(chars.length); | ||
| 15 | + } | ||
| 16 | + return index; | ||
| 17 | + } | ||
| 18 | + | ||
| 19 | + /** | ||
| 20 | + * 返回一个随机的特殊字符 | ||
| 21 | + */ | ||
| 22 | + private static char nextSpecialChar(Random rnd) { | ||
| 23 | + return SPECIAL_CHARS.charAt(rnd.nextInt(SPECIAL_CHARS.length())); | ||
| 24 | + } | ||
| 25 | + | ||
| 26 | + /** | ||
| 27 | + * 返回一个随机的大写字母 | ||
| 28 | + */ | ||
| 29 | + private static char nextUpperLetter(Random rnd) { | ||
| 30 | + return (char) ('A' + rnd.nextInt(26)); | ||
| 31 | + } | ||
| 32 | + | ||
| 33 | + /** | ||
| 34 | + * 返回一个随机的小写字母 | ||
| 35 | + */ | ||
| 36 | + private static char nextLowerLetter(Random rnd) { | ||
| 37 | + return (char) ('a' + rnd.nextInt(26)); | ||
| 38 | + } | ||
| 39 | + | ||
| 40 | + /** | ||
| 41 | + * 返回一个随机的数字 | ||
| 42 | + */ | ||
| 43 | + private static char nextNumLetter(Random rnd) { | ||
| 44 | + return (char) ('0' + rnd.nextInt(10)); | ||
| 45 | + } | ||
| 46 | + | ||
| 47 | + /** | ||
| 48 | + * 返回一个随机的字符 | ||
| 49 | + */ | ||
| 50 | + private static char nextChar(Random rnd) { | ||
| 51 | + switch (rnd.nextInt(4)) { | ||
| 52 | + case 0: | ||
| 53 | + return (char) ('a' + rnd.nextInt(26)); | ||
| 54 | + case 1: | ||
| 55 | + return (char) ('A' + rnd.nextInt(26)); | ||
| 56 | + case 2: | ||
| 57 | + return (char) ('0' + rnd.nextInt(10)); | ||
| 58 | + default: | ||
| 59 | + return SPECIAL_CHARS.charAt(rnd.nextInt(SPECIAL_CHARS.length())); | ||
| 60 | + } | ||
| 61 | + } | ||
| 62 | + | ||
| 63 | + /** | ||
| 64 | + * 生成指定位数的随机数 | ||
| 65 | + */ | ||
| 66 | + public static String randomPassword(int length) { | ||
| 67 | + if(length < 3){ | ||
| 68 | + return ""; | ||
| 69 | + } | ||
| 70 | + char[] chars = new char[length]; | ||
| 71 | + Random rnd = new Random(); | ||
| 72 | + | ||
| 73 | + //1. 至少生成一个大写字母、小写字母、特殊字符、数字 | ||
| 74 | + chars[nextIndex(chars, rnd)] = nextUpperLetter(rnd); | ||
| 75 | + chars[nextIndex(chars, rnd)] = nextLowerLetter(rnd); | ||
| 76 | + chars[nextIndex(chars, rnd)] = nextNumLetter(rnd); | ||
| 77 | + | ||
| 78 | + //2. 填补其他位置的字符 | ||
| 79 | + for (int i = 0; i < length; i++) { | ||
| 80 | + if (chars[i] == 0) { | ||
| 81 | + chars[i] = nextChar(rnd); | ||
| 82 | + } | ||
| 83 | + } | ||
| 84 | + | ||
| 85 | + //3. 返回结果 | ||
| 86 | + return new String(chars); | ||
| 87 | + } | ||
| 88 | + | ||
| 89 | + | ||
| 90 | + /** | ||
| 91 | + * 测试代码 | ||
| 92 | + */ | ||
| 93 | + public static void main(String[] args) { | ||
| 94 | + for (int i = 0; i < 10; i++) { | ||
| 95 | + System.out.println(randomPassword(16)); | ||
| 96 | + } | ||
| 97 | + | ||
| 98 | + } | ||
| 99 | + | ||
| 100 | +} |
src/main/java/com/bsth/service/sys/impl/RoleServiceImpl.java
| 1 | -package com.bsth.service.sys.impl; | ||
| 2 | - | ||
| 3 | -import java.text.SimpleDateFormat; | ||
| 4 | -import java.util.ArrayList; | ||
| 5 | -import java.util.HashMap; | ||
| 6 | -import java.util.Iterator; | ||
| 7 | -import java.util.List; | ||
| 8 | -import java.util.Map; | ||
| 9 | -import java.util.Set; | ||
| 10 | - | ||
| 11 | -import org.slf4j.Logger; | ||
| 12 | -import org.slf4j.LoggerFactory; | ||
| 13 | -import org.springframework.beans.factory.annotation.Autowired; | ||
| 14 | -import org.springframework.stereotype.Service; | ||
| 15 | - | ||
| 16 | -import com.bsth.common.ResponseCode; | ||
| 17 | -import com.bsth.entity.sys.Module; | ||
| 18 | -import com.bsth.entity.sys.Role; | ||
| 19 | -import com.bsth.entity.sys.SysUser; | ||
| 20 | -import com.bsth.repository.sys.ModuleRepository; | ||
| 21 | -import com.bsth.repository.sys.RoleRepository; | ||
| 22 | -import com.bsth.service.impl.BaseServiceImpl; | ||
| 23 | -import com.bsth.service.sys.RoleService; | ||
| 24 | - | ||
| 25 | -@Service | ||
| 26 | -public class RoleServiceImpl extends BaseServiceImpl<Role, Integer> implements | ||
| 27 | - RoleService { | ||
| 28 | - | ||
| 29 | - Logger logger = LoggerFactory.getLogger(this.getClass()); | ||
| 30 | - | ||
| 31 | - @Autowired | ||
| 32 | - RoleRepository roleRepository; | ||
| 33 | - | ||
| 34 | - @Autowired | ||
| 35 | - ModuleRepository moduleRepository; | ||
| 36 | - | ||
| 37 | - SimpleDateFormat sdfMinute = new SimpleDateFormat("yyyy-MM-dd HH:mm"); | ||
| 38 | - | ||
| 39 | - @Override | ||
| 40 | - public Map<String, Object> save(Role t) { | ||
| 41 | - if (t.getId() != null) { | ||
| 42 | - // 更新 | ||
| 43 | - Map<String, Object> map = new HashMap<>(); | ||
| 44 | - try { | ||
| 45 | - roleRepository.update(t.getCodeName(), t.getRoleName(), | ||
| 46 | - t.isEnable(), t.getDescriptions(), t.getId()); | ||
| 47 | - map.put("status", ResponseCode.SUCCESS); | ||
| 48 | - } catch (Exception e) { | ||
| 49 | - map.put("status", ResponseCode.ERROR); | ||
| 50 | - } | ||
| 51 | - return map; | ||
| 52 | - } | ||
| 53 | - return super.save(t); | ||
| 54 | - } | ||
| 55 | - | ||
| 56 | - @Override | ||
| 57 | - public Map<String, Object> settRoleModules(Integer roleId, String mIds) { | ||
| 58 | - | ||
| 59 | - Map<String, Object> map = new HashMap<>(); | ||
| 60 | - try { | ||
| 61 | - Role role = roleRepository.findOne(roleId); | ||
| 62 | - | ||
| 63 | - List<Integer> idList = new ArrayList<>(); | ||
| 64 | - String[] array = mIds.split(","); | ||
| 65 | - for (String id : array) { | ||
| 66 | - if (null == id || id.trim().equals("")) | ||
| 67 | - continue; | ||
| 68 | - idList.add(Integer.parseInt(id)); | ||
| 69 | - } | ||
| 70 | - | ||
| 71 | - Set<Module> mList = moduleRepository.findByIds(idList); | ||
| 72 | - role.setModules(mList); | ||
| 73 | - roleRepository.save(role); | ||
| 74 | - map.put("status", ResponseCode.SUCCESS); | ||
| 75 | - } catch (Exception e) { | ||
| 76 | - logger.error("", e); | ||
| 77 | - map.put("status", ResponseCode.ERROR); | ||
| 78 | - } | ||
| 79 | - return map; | ||
| 80 | - } | ||
| 81 | - | ||
| 82 | - @Override | ||
| 83 | - public Map<String, Object> roleInfo(Integer id) { | ||
| 84 | - Map<String, Object> map = new HashMap<>(); | ||
| 85 | - Role role = roleRepository.findOne(id); | ||
| 86 | - map.put("codeName", role.getCodeName()); | ||
| 87 | - map.put("roleName", role.getRoleName()); | ||
| 88 | - map.put("createDate", sdfMinute.format(role.getCreateDate())); | ||
| 89 | - map.put("updateDate", sdfMinute.format(role.getUpdateDate())); | ||
| 90 | - map.put("enable", role.isEnable()==true?1:0); | ||
| 91 | - map.put("descriptions", role.getDescriptions()); | ||
| 92 | - map.put("modules", role.getModules().size()); | ||
| 93 | - map.put("resources", role.getResources().size()); | ||
| 94 | - String userNames = ""; | ||
| 95 | - Set<SysUser> users = role.getUsers(); | ||
| 96 | - if(!users.isEmpty()){ | ||
| 97 | - Iterator<SysUser> it = users.iterator(); | ||
| 98 | - while(it.hasNext()){ | ||
| 99 | - SysUser user = it.next(); | ||
| 100 | - userNames = user.getUserName()+"..."; | ||
| 101 | - } | ||
| 102 | - } | ||
| 103 | - map.put("userNames", userNames); | ||
| 104 | - return map; | ||
| 105 | - } | ||
| 106 | -} | 1 | +package com.bsth.service.sys.impl; |
| 2 | + | ||
| 3 | +import java.beans.BeanInfo; | ||
| 4 | +import java.beans.Introspector; | ||
| 5 | +import java.beans.PropertyDescriptor; | ||
| 6 | +import java.lang.reflect.Method; | ||
| 7 | +import java.text.SimpleDateFormat; | ||
| 8 | +import java.util.*; | ||
| 9 | + | ||
| 10 | +import com.bsth.security.util.SecurityUtils; | ||
| 11 | +import org.slf4j.Logger; | ||
| 12 | +import org.slf4j.LoggerFactory; | ||
| 13 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 14 | +import org.springframework.stereotype.Service; | ||
| 15 | + | ||
| 16 | +import com.bsth.common.ResponseCode; | ||
| 17 | +import com.bsth.entity.sys.Module; | ||
| 18 | +import com.bsth.entity.sys.Role; | ||
| 19 | +import com.bsth.entity.sys.SysUser; | ||
| 20 | +import com.bsth.repository.sys.ModuleRepository; | ||
| 21 | +import com.bsth.repository.sys.RoleRepository; | ||
| 22 | +import com.bsth.service.impl.BaseServiceImpl; | ||
| 23 | +import com.bsth.service.sys.RoleService; | ||
| 24 | + | ||
| 25 | +@Service | ||
| 26 | +public class RoleServiceImpl extends BaseServiceImpl<Role, Integer> implements | ||
| 27 | + RoleService { | ||
| 28 | + | ||
| 29 | + Logger logger = LoggerFactory.getLogger(this.getClass()); | ||
| 30 | + | ||
| 31 | + @Autowired | ||
| 32 | + RoleRepository roleRepository; | ||
| 33 | + | ||
| 34 | + @Autowired | ||
| 35 | + ModuleRepository moduleRepository; | ||
| 36 | + | ||
| 37 | + SimpleDateFormat sdfMinute = new SimpleDateFormat("yyyy-MM-dd HH:mm"); | ||
| 38 | + | ||
| 39 | + @Override | ||
| 40 | + public Map<String, Object> findSubordinate() { | ||
| 41 | + SysUser user = SecurityUtils.getCurrentUser(); | ||
| 42 | + Iterator<Role> itRole = user.getRoles().iterator(); | ||
| 43 | + Role ro = new Role(); | ||
| 44 | + while(itRole.hasNext()){//判断是否有下一个 | ||
| 45 | + ro = itRole.next(); | ||
| 46 | + } | ||
| 47 | + Map<String, Object> map = new HashMap<>(); | ||
| 48 | + List<Map<String, Object>> rsRoleList = new ArrayList<>(); | ||
| 49 | + try { | ||
| 50 | + // 读取层次数据结果集列表 | ||
| 51 | + Iterator<Role> roleList = roleRepository.findAll().iterator(); | ||
| 52 | + | ||
| 53 | + // 节点列表(散列表,用于临时存储节点对象) | ||
| 54 | + Map<String, Object> nodeList = new HashMap<>(); | ||
| 55 | + // 根节点 | ||
| 56 | + List rootlist = new ArrayList(); | ||
| 57 | + while(roleList.hasNext()){ | ||
| 58 | + Role role = roleList.next(); | ||
| 59 | + HashMap map0 = new HashMap(); | ||
| 60 | + map0.put("id", role.getId()); | ||
| 61 | + map0.put("roleCode", role.getRoleCode()); | ||
| 62 | + map0.put("upCode", role.getUpCode()); | ||
| 63 | + map0.put("roleName", role.getRoleName()); | ||
| 64 | + map0.put("codeName", role.getCodeName()); | ||
| 65 | + map0.put("level", role.getLevel()); | ||
| 66 | + map0.put("levelCode", role.getLevelCode()); | ||
| 67 | + nodeList.put(role.getLevelCode(), map0); | ||
| 68 | + } | ||
| 69 | + // 构造无序的多叉树 | ||
| 70 | + Set entrySet = nodeList.entrySet(); | ||
| 71 | + for (Iterator it = entrySet.iterator(); it.hasNext();) { | ||
| 72 | + Map<String, Object> map1 = (HashMap) ((Map.Entry) it.next()).getValue(); | ||
| 73 | +// Map<String, Object> map1 = objectToMap(it.next()); | ||
| 74 | + if (map1.get("upCode") == null || map1.get("upCode").equals("") | ||
| 75 | + || Integer.parseInt(map1.get("upCode").toString()) == 0) { | ||
| 76 | + // root = node; | ||
| 77 | + rootlist.add(map1); | ||
| 78 | + } else { | ||
| 79 | + Map<String, Object> tempmap = ((HashMap)nodeList.get((Integer.parseInt(map1.get("level").toString())-1)+"_"+map1.get("upCode"))); | ||
| 80 | +// Map<String, Object> tempmap = objectToMap(nodeList.get((Integer.parseInt(map1.get("level").toString())-1)+"_"+map1.get("upCode"))); | ||
| 81 | + System.out.println(tempmap); | ||
| 82 | + | ||
| 83 | + List templist = (List) tempmap.get("children"); | ||
| 84 | + if (null != templist) { | ||
| 85 | + templist.add(map1); | ||
| 86 | + } else { | ||
| 87 | + templist = new ArrayList(); | ||
| 88 | + templist.add(map1); | ||
| 89 | + } | ||
| 90 | + tempmap.put("children", templist); | ||
| 91 | + } | ||
| 92 | + } | ||
| 93 | + getRoleList(rootlist,ro.getLevelCode(),rsRoleList,false); | ||
| 94 | + | ||
| 95 | + // 排序后输出 | ||
| 96 | +// ComparatorSysrole(rootlist); | ||
| 97 | + map.put("list", rsRoleList); | ||
| 98 | + map.put("status", ResponseCode.SUCCESS); | ||
| 99 | + map.put("msg", "成功"); | ||
| 100 | + } catch (Exception e) { | ||
| 101 | + map.put("status", ResponseCode.ERROR); | ||
| 102 | + map.put("msg", e); | ||
| 103 | + logger.error("error",e); | ||
| 104 | + } | ||
| 105 | + return map; | ||
| 106 | + } | ||
| 107 | + | ||
| 108 | + private void getRoleList(List<Map<String, Object>> list, String levelCode, List<Map<String, Object>> roleList,boolean isChildren){ | ||
| 109 | + try{ | ||
| 110 | + if(isChildren){ | ||
| 111 | + for (Map<String, Object> map : list) { | ||
| 112 | + roleList.add(map); | ||
| 113 | + List mapList = (List) map.get("children"); | ||
| 114 | + if (mapList != null && mapList.size() > 0) { | ||
| 115 | + getRoleList(mapList,levelCode,roleList,isChildren); | ||
| 116 | + } | ||
| 117 | + } | ||
| 118 | + | ||
| 119 | + } else { | ||
| 120 | + for (Map<String, Object> map : list) { | ||
| 121 | + if(map.get("levelCode").equals(levelCode)){ | ||
| 122 | + isChildren = true; | ||
| 123 | + List mapList = (List) map.get("children"); | ||
| 124 | + if (mapList != null && mapList.size() > 0) { | ||
| 125 | + getRoleList(mapList,levelCode,roleList,isChildren); | ||
| 126 | + } | ||
| 127 | + break; | ||
| 128 | + } else { | ||
| 129 | + List mapList = (List) map.get("children"); | ||
| 130 | + if (mapList != null && mapList.size() > 0) { | ||
| 131 | + getRoleList(mapList,levelCode,roleList,isChildren); | ||
| 132 | + } | ||
| 133 | + } | ||
| 134 | + } | ||
| 135 | + } | ||
| 136 | + } catch (Exception e) { | ||
| 137 | + logger.error("error",e); | ||
| 138 | + } | ||
| 139 | + } | ||
| 140 | + | ||
| 141 | + public Map<String, Object> objectToMap(Object obj) throws Exception { | ||
| 142 | + if(obj == null) | ||
| 143 | + return null; | ||
| 144 | + | ||
| 145 | + Map<String, Object> map = new HashMap<>(); | ||
| 146 | + | ||
| 147 | + BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass()); | ||
| 148 | + PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); | ||
| 149 | + for (PropertyDescriptor property : propertyDescriptors) { | ||
| 150 | + String key = property.getName(); | ||
| 151 | + if (key.compareToIgnoreCase("class") == 0) { | ||
| 152 | + continue; | ||
| 153 | + } | ||
| 154 | + Method getter = property.getReadMethod(); | ||
| 155 | + Object value = getter!=null ? getter.invoke(obj) : null; | ||
| 156 | + map.put(key, value); | ||
| 157 | + } | ||
| 158 | + | ||
| 159 | + return map; | ||
| 160 | + } | ||
| 161 | + | ||
| 162 | + private void ComparatorSysrole(List<HashMap> list) { | ||
| 163 | + ComparatorSysrole comparator = new ComparatorSysrole(); | ||
| 164 | + Collections.sort(list, comparator); | ||
| 165 | + for (HashMap map : list) { | ||
| 166 | + List mapList = (List) map.get("children"); | ||
| 167 | + if (mapList != null && mapList.size() > 0) { | ||
| 168 | + ComparatorSysrole(mapList); | ||
| 169 | + } | ||
| 170 | + } | ||
| 171 | + } | ||
| 172 | + | ||
| 173 | + private class ComparatorSysrole implements Comparator { | ||
| 174 | + public int compare(Object arg0, Object arg1) { | ||
| 175 | + HashMap role0 = (HashMap) arg0; | ||
| 176 | + HashMap role1 = (HashMap) arg1; | ||
| 177 | + | ||
| 178 | + // 首先比较父节点 相同比较 子 位序 | ||
| 179 | + Long role0Pid = (Long) (role0.get("upCode") == null ? (long) 0 : role0.get("upCode")); | ||
| 180 | + Long role1Pid = (Long) (role1.get("upCode") == null ? (long) 0 : role1.get("upCode")); | ||
| 181 | + int flag = role0Pid.compareTo(role1Pid); | ||
| 182 | + if (flag == 0) { | ||
| 183 | + return (Integer.valueOf(role0.get("roleIndex").toString())).compareTo(Integer.valueOf(role1.get( | ||
| 184 | + "roleIndex").toString())); | ||
| 185 | + } else { | ||
| 186 | + return flag; | ||
| 187 | + } | ||
| 188 | + } | ||
| 189 | + } | ||
| 190 | + | ||
| 191 | + @Override | ||
| 192 | + public Map<String, Object> add(Role role) { | ||
| 193 | + Map<String, Object> rs = new HashMap(); | ||
| 194 | + try{ | ||
| 195 | + SysUser user = SecurityUtils.getCurrentUser(); | ||
| 196 | + Iterator<Role> itRole = user.getRoles().iterator(); | ||
| 197 | + Role ro = new Role(); | ||
| 198 | + while(itRole.hasNext()){//判断是否有下一个 | ||
| 199 | + ro = itRole.next(); | ||
| 200 | + } | ||
| 201 | + int id = roleRepository.roleMaxId()+1; | ||
| 202 | + role.setUpCode(ro.getRoleCode()); | ||
| 203 | + role.setLevel(ro.getLevel()+1); | ||
| 204 | + role.setRoleCode(id); | ||
| 205 | + role.setId(id); | ||
| 206 | + return super.save(role); | ||
| 207 | + }catch (Exception e){ | ||
| 208 | + logger.error("", e); | ||
| 209 | + rs.put("status", ResponseCode.ERROR); | ||
| 210 | + rs.put("msg", e.getMessage()); | ||
| 211 | + } | ||
| 212 | + return rs; | ||
| 213 | + } | ||
| 214 | + | ||
| 215 | + @Override | ||
| 216 | + public Map<String, Object> save(Role t) { | ||
| 217 | + if (t.getId() != null) { | ||
| 218 | + // 更新 | ||
| 219 | + Map<String, Object> map = new HashMap<>(); | ||
| 220 | + try { | ||
| 221 | + roleRepository.update(t.getCodeName(), t.getRoleName(), | ||
| 222 | + t.isEnable(), t.getDescriptions(), t.getId()); | ||
| 223 | + map.put("status", ResponseCode.SUCCESS); | ||
| 224 | + } catch (Exception e) { | ||
| 225 | + map.put("status", ResponseCode.ERROR); | ||
| 226 | + } | ||
| 227 | + return map; | ||
| 228 | + } | ||
| 229 | + return super.save(t); | ||
| 230 | + } | ||
| 231 | + | ||
| 232 | + @Override | ||
| 233 | + public Map<String, Object> settRoleModules(Integer roleId, String mIds) { | ||
| 234 | + | ||
| 235 | + Map<String, Object> map = new HashMap<>(); | ||
| 236 | + try { | ||
| 237 | + Role role = roleRepository.findOne(roleId); | ||
| 238 | + | ||
| 239 | + List<Integer> idList = new ArrayList<>(); | ||
| 240 | + String[] array = mIds.split(","); | ||
| 241 | + for (String id : array) { | ||
| 242 | + if (null == id || id.trim().equals("")) | ||
| 243 | + continue; | ||
| 244 | + idList.add(Integer.parseInt(id)); | ||
| 245 | + } | ||
| 246 | + | ||
| 247 | + Set<Module> mList = moduleRepository.findByIds(idList); | ||
| 248 | + role.setModules(mList); | ||
| 249 | + roleRepository.save(role); | ||
| 250 | + map.put("status", ResponseCode.SUCCESS); | ||
| 251 | + } catch (Exception e) { | ||
| 252 | + logger.error("", e); | ||
| 253 | + map.put("status", ResponseCode.ERROR); | ||
| 254 | + } | ||
| 255 | + return map; | ||
| 256 | + } | ||
| 257 | + | ||
| 258 | + @Override | ||
| 259 | + public Map<String, Object> roleInfo(Integer id) { | ||
| 260 | + Map<String, Object> map = new HashMap<>(); | ||
| 261 | + Role role = roleRepository.findOne(id); | ||
| 262 | + map.put("codeName", role.getCodeName()); | ||
| 263 | + map.put("roleName", role.getRoleName()); | ||
| 264 | + map.put("createDate", sdfMinute.format(role.getCreateDate())); | ||
| 265 | + map.put("updateDate", sdfMinute.format(role.getUpdateDate())); | ||
| 266 | + map.put("enable", role.isEnable()==true?1:0); | ||
| 267 | + map.put("descriptions", role.getDescriptions()); | ||
| 268 | + map.put("modules", role.getModules().size()); | ||
| 269 | + map.put("resources", role.getResources().size()); | ||
| 270 | + String userNames = ""; | ||
| 271 | + Set<SysUser> users = role.getUsers(); | ||
| 272 | + if(!users.isEmpty()){ | ||
| 273 | + Iterator<SysUser> it = users.iterator(); | ||
| 274 | + while(it.hasNext()){ | ||
| 275 | + SysUser user = it.next(); | ||
| 276 | + userNames = user.getUserName()+"..."; | ||
| 277 | + } | ||
| 278 | + } | ||
| 279 | + map.put("userNames", userNames); | ||
| 280 | + return map; | ||
| 281 | + } | ||
| 282 | + | ||
| 283 | + @Override | ||
| 284 | + public List<Role> findAllByIds(String ids) { | ||
| 285 | + return roleRepository.findAllById(ids); | ||
| 286 | + } | ||
| 287 | + | ||
| 288 | + @Override | ||
| 289 | + public boolean checkOperationLegality(Integer operationRoleId){ | ||
| 290 | + boolean isLegality = false; | ||
| 291 | + Map<String, Object> roleMap = findSubordinate(); | ||
| 292 | + isLegality = (roleMap.get(operationRoleId) == null ? true:false ); | ||
| 293 | + return isLegality; | ||
| 294 | + } | ||
| 295 | +} |
src/main/java/com/bsth/service/sys/impl/SysUserServiceImpl.java
| 1 | -package com.bsth.service.sys.impl; | ||
| 2 | - | ||
| 3 | -import com.bsth.common.ResponseCode; | ||
| 4 | -import com.bsth.entity.sys.SysUser; | ||
| 5 | -import com.bsth.repository.sys.SysUserRepository; | ||
| 6 | -import com.bsth.service.impl.BaseServiceImpl; | ||
| 7 | -import com.bsth.service.sys.SysUserService; | ||
| 8 | -import org.slf4j.Logger; | ||
| 9 | -import org.slf4j.LoggerFactory; | ||
| 10 | -import org.springframework.beans.factory.annotation.Autowired; | ||
| 11 | -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; | ||
| 12 | -import org.springframework.stereotype.Service; | ||
| 13 | - | ||
| 14 | -import java.util.HashMap; | ||
| 15 | -import java.util.List; | ||
| 16 | -import java.util.Map; | ||
| 17 | - | ||
| 18 | -@Service | ||
| 19 | -public class SysUserServiceImpl extends BaseServiceImpl<SysUser, Integer> implements SysUserService{ | ||
| 20 | - | ||
| 21 | - @Autowired | ||
| 22 | - SysUserRepository sysUserRepository; | ||
| 23 | - | ||
| 24 | - Logger logger = LoggerFactory.getLogger(this.getClass()); | ||
| 25 | - | ||
| 26 | - @Override | ||
| 27 | - public SysUser findByUserName(String name) { | ||
| 28 | - return sysUserRepository.findByUserName(name); | ||
| 29 | - } | ||
| 30 | - | ||
| 31 | - @Override | ||
| 32 | - public Map<String, Object> save(SysUser t) { | ||
| 33 | - // | ||
| 34 | - if(t.getPassword() == null || t.getPassword().trim().equals("")){ | ||
| 35 | - SysUser user = sysUserRepository.findOne(t.getId()); | ||
| 36 | - t.setPassword(user.getPassword()); | ||
| 37 | - }else{ | ||
| 38 | - t.setPassword(new BCryptPasswordEncoder(4).encode(t.getPassword())); | ||
| 39 | - } | ||
| 40 | - return super.save(t); | ||
| 41 | - } | ||
| 42 | - | ||
| 43 | - @Override | ||
| 44 | - public int changeEnabled(int id, int enabled) { | ||
| 45 | - sysUserRepository.changeEnabled(id,enabled); | ||
| 46 | - return 0; | ||
| 47 | - } | ||
| 48 | - | ||
| 49 | - @Override | ||
| 50 | - public int changePWD(int id,String newPWD) { | ||
| 51 | - return sysUserRepository.changePWD(id,new BCryptPasswordEncoder(4).encode(newPWD)); | ||
| 52 | - } | ||
| 53 | - | ||
| 54 | - @Override | ||
| 55 | - public Map<String, Object> register(SysUser u) { | ||
| 56 | - Map<String, Object> rs = new HashMap(); | ||
| 57 | - try{ | ||
| 58 | - //检查用户名是否存在 | ||
| 59 | - if(findByUserName(u.getUserName()) != null){ | ||
| 60 | - rs.put("status", ResponseCode.ERROR); | ||
| 61 | - rs.put("msg", "用户名" + u.getUserName() + "已存在!"); | ||
| 62 | - } | ||
| 63 | - else{ | ||
| 64 | - u.setPassword(new BCryptPasswordEncoder(4).encode(u.getPassword())); | ||
| 65 | - rs = super.save(u); | ||
| 66 | - } | ||
| 67 | - }catch (Exception e){ | ||
| 68 | - logger.error("", e); | ||
| 69 | - rs.put("status", ResponseCode.ERROR); | ||
| 70 | - rs.put("msg", e.getMessage()); | ||
| 71 | - } | ||
| 72 | - return rs; | ||
| 73 | - } | ||
| 74 | - | ||
| 75 | - @Override | ||
| 76 | - public List<SysUser> findAll_distinct() { | ||
| 77 | - return sysUserRepository.findAll_distinct(); | ||
| 78 | - } | ||
| 79 | -} | 1 | +package com.bsth.service.sys.impl; |
| 2 | + | ||
| 3 | +import com.bsth.common.ResponseCode; | ||
| 4 | +import com.bsth.controller.sys.util.RSAUtils; | ||
| 5 | +import com.bsth.email.entity.EmailBean; | ||
| 6 | +import com.bsth.entity.sys.Role; | ||
| 7 | +import com.bsth.entity.sys.SysUser; | ||
| 8 | +import com.bsth.repository.sys.SysUserRepository; | ||
| 9 | +import com.bsth.security.util.SecurityUtils; | ||
| 10 | +import com.bsth.service.impl.BaseServiceImpl; | ||
| 11 | +import com.bsth.service.sys.RoleService; | ||
| 12 | +import com.bsth.service.sys.SysUserService; | ||
| 13 | +import com.bsth.util.IpUtils; | ||
| 14 | +import com.bsth.util.MailUtils; | ||
| 15 | +import com.google.gson.Gson; | ||
| 16 | +import com.google.gson.reflect.TypeToken; | ||
| 17 | +import org.joda.time.DateTime; | ||
| 18 | +import org.joda.time.Days; | ||
| 19 | +import org.slf4j.Logger; | ||
| 20 | +import org.slf4j.LoggerFactory; | ||
| 21 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 22 | +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; | ||
| 23 | +import org.springframework.stereotype.Service; | ||
| 24 | +import org.springframework.transaction.annotation.Transactional; | ||
| 25 | + | ||
| 26 | +import java.util.ArrayList; | ||
| 27 | +import java.util.HashMap; | ||
| 28 | +import java.util.Iterator; | ||
| 29 | +import java.util.List; | ||
| 30 | +import java.util.Map; | ||
| 31 | + | ||
| 32 | +@Service | ||
| 33 | +public class SysUserServiceImpl extends BaseServiceImpl<SysUser, Integer> implements SysUserService{ | ||
| 34 | + | ||
| 35 | + @Autowired | ||
| 36 | + SysUserRepository sysUserRepository; | ||
| 37 | + | ||
| 38 | + @Autowired | ||
| 39 | + RoleService roleService; | ||
| 40 | + | ||
| 41 | + // 发送邮件 | ||
| 42 | + @Autowired | ||
| 43 | + private MailUtils mailUtils; | ||
| 44 | + | ||
| 45 | + Logger logger = LoggerFactory.getLogger(this.getClass()); | ||
| 46 | + | ||
| 47 | + @Override | ||
| 48 | + public SysUser findByUserName(String name) { | ||
| 49 | + return sysUserRepository.findByUserName(name); | ||
| 50 | + } | ||
| 51 | + | ||
| 52 | + @Override | ||
| 53 | + public Map<String, Object> save(SysUser t) { | ||
| 54 | + // | ||
| 55 | + if(t.getPassword() == null || t.getPassword().trim().equals("")){ | ||
| 56 | + SysUser user = sysUserRepository.findOne(t.getId()); | ||
| 57 | + t.setPassword(user.getPassword()); | ||
| 58 | + }else{ | ||
| 59 | + t.setPassword(new BCryptPasswordEncoder(4).encode(t.getPassword())); | ||
| 60 | + } | ||
| 61 | + return super.save(t); | ||
| 62 | + } | ||
| 63 | + | ||
| 64 | + @Override | ||
| 65 | + public int changeEnabled(int id, int enabled) { | ||
| 66 | + sysUserRepository.changeEnabled(id,enabled); | ||
| 67 | + return 0; | ||
| 68 | + } | ||
| 69 | + | ||
| 70 | + @Override | ||
| 71 | + public int changePWD(int id,String newPWD) { | ||
| 72 | + return sysUserRepository.changePWD(id,new BCryptPasswordEncoder(4).encode(newPWD)); | ||
| 73 | + } | ||
| 74 | + | ||
| 75 | + @Override | ||
| 76 | + public boolean validPWDExpired(String userName) { | ||
| 77 | + SysUser sysUser = this.sysUserRepository.findByUserName(userName); | ||
| 78 | + if (sysUser == null) { | ||
| 79 | + throw new RuntimeException("用户[" + userName + "]不存在!"); | ||
| 80 | + } | ||
| 81 | + if (sysUser.getPwdValidPeriod() == null || sysUser.getLastPwdDate() == null) { | ||
| 82 | + // 如果没有设定密码过期时间,判定为不过期 | ||
| 83 | + return true; | ||
| 84 | + } | ||
| 85 | + DateTime now = new DateTime(); | ||
| 86 | + DateTime lastPwdDate = new DateTime(sysUser.getLastPwdDate()); | ||
| 87 | + Integer now_period_days = Days.daysBetween(lastPwdDate, now).getDays(); | ||
| 88 | + Integer expiredTipDays = 3; // 密码过期提前提示天数 | ||
| 89 | + if (now_period_days < (sysUser.getPwdValidPeriod() - expiredTipDays)) { | ||
| 90 | + return true; | ||
| 91 | + } else if (now_period_days >= (sysUser.getPwdValidPeriod() - expiredTipDays) && | ||
| 92 | + now_period_days < sysUser.getPwdValidPeriod()) { | ||
| 93 | + // 快过期前提示 | ||
| 94 | + throw new RuntimeException("当前用户密码还有[" + (sysUser.getPwdValidPeriod() - now_period_days) + "]天过期!"); | ||
| 95 | + } else { | ||
| 96 | + throw new RuntimeException("当前用户密码已过期!"); | ||
| 97 | + } | ||
| 98 | + | ||
| 99 | + } | ||
| 100 | + | ||
| 101 | + @Override | ||
| 102 | + public Map<String, Object> register(SysUser u) { | ||
| 103 | + Map<String, Object> rs = new HashMap(); | ||
| 104 | + boolean isLegality = false; | ||
| 105 | + Iterator<Role> itRole = u.getRoles().iterator(); | ||
| 106 | + Role ro = new Role(); | ||
| 107 | + while(itRole.hasNext()){//判断是否有下一个 | ||
| 108 | + ro = itRole.next(); | ||
| 109 | + if(roleService.checkOperationLegality(ro.getId())){ | ||
| 110 | + isLegality = true; | ||
| 111 | + } else { | ||
| 112 | + rs.put("status", ResponseCode.ERROR); | ||
| 113 | + rs.put("msg", "用户权限不够,请联系管理员!"); | ||
| 114 | + return rs; | ||
| 115 | + } | ||
| 116 | + } | ||
| 117 | + if(isLegality){ | ||
| 118 | + try{ | ||
| 119 | + //解密RSA | ||
| 120 | + try{ | ||
| 121 | + u.setUserName(RSAUtils.decryptBase64(u.getUserName())); | ||
| 122 | + u.setPassword(RSAUtils.decryptBase64(u.getPassword())); | ||
| 123 | + }catch (RuntimeException e) { | ||
| 124 | + rs.put("msg", "网络延迟,解密失败,请重新添加!"); | ||
| 125 | + } | ||
| 126 | + //检查用户名是否存在 | ||
| 127 | + if(findByUserName(u.getUserName()) != null){ | ||
| 128 | + rs.put("status", ResponseCode.ERROR); | ||
| 129 | + rs.put("msg", "用户名" + u.getUserName() + "已存在!"); | ||
| 130 | + } | ||
| 131 | + else{ | ||
| 132 | + u.setPassword(new BCryptPasswordEncoder(4).encode(u.getPassword())); | ||
| 133 | + rs = super.save(u); | ||
| 134 | + } | ||
| 135 | + }catch (Exception e){ | ||
| 136 | + logger.error("", e); | ||
| 137 | + rs.put("status", ResponseCode.ERROR); | ||
| 138 | + rs.put("msg", e.getMessage()); | ||
| 139 | + } | ||
| 140 | + }else { | ||
| 141 | + rs.put("status", ResponseCode.ERROR); | ||
| 142 | + rs.put("msg", "用户权限不够,请联系管理员!"); | ||
| 143 | + } | ||
| 144 | + return rs; | ||
| 145 | + } | ||
| 146 | + | ||
| 147 | + @Override | ||
| 148 | + public List<SysUser> findAll_distinct() { | ||
| 149 | + Map<String, Object> map = roleService.findSubordinate(); | ||
| 150 | + Object object = roleService.findSubordinate().get("list"); | ||
| 151 | + List<SysUser> rsList = new ArrayList<>(); | ||
| 152 | + | ||
| 153 | + // 有权限查看的角色 | ||
| 154 | +// List<Role> roleList = JSONArray.parseArray(map.get("list").toString(), Role.class); | ||
| 155 | + | ||
| 156 | + try{ | ||
| 157 | + Gson gson = new Gson(); | ||
| 158 | + // 有权限查看的角色 | ||
| 159 | + List<Role> roleList = gson.fromJson(map.get("list").toString(), new TypeToken<List<Role>>(){}.getType()); | ||
| 160 | + | ||
| 161 | + if(roleList.size() != 0 && !roleList.isEmpty()){ | ||
| 162 | + // 遍历有权限查看的角色 | ||
| 163 | + Map<Integer,Role> roleMap = new HashMap<>(); | ||
| 164 | + for (Role role: roleList) { | ||
| 165 | + roleMap.put(role.getId(),role); | ||
| 166 | + } | ||
| 167 | + | ||
| 168 | + List<SysUser> list = new ArrayList<>(); | ||
| 169 | + list = sysUserRepository.findAll_distinct(); | ||
| 170 | + for (SysUser sysUsers:list) { | ||
| 171 | + | ||
| 172 | + Iterator<Role> itUser = sysUsers.getRoles().iterator(); | ||
| 173 | + Role roleUser = new Role(); | ||
| 174 | + while(itUser.hasNext()){//判断是否有下一个 | ||
| 175 | + roleUser = itUser.next(); | ||
| 176 | + } | ||
| 177 | + // 添加权限内的用户 | ||
| 178 | + if(roleMap.get(roleUser.getId()) != null){ | ||
| 179 | + rsList.add(sysUsers); | ||
| 180 | + } | ||
| 181 | + } | ||
| 182 | + } | ||
| 183 | + } catch (Exception e){ | ||
| 184 | + logger.error("error", e); | ||
| 185 | + } | ||
| 186 | + return rsList; | ||
| 187 | + } | ||
| 188 | + | ||
| 189 | + @Override | ||
| 190 | + @Transactional | ||
| 191 | + public Map<String, Object> resetPassword(Integer id, Integer pwdValidPeriod){ | ||
| 192 | + Map<String, Object> rs = new HashMap(); | ||
| 193 | + try{ | ||
| 194 | + // 获取当前用户 | ||
| 195 | + SysUser user = SecurityUtils.getCurrentUser(); | ||
| 196 | + Iterator<Role> itRole = user.getRoles().iterator(); | ||
| 197 | + Role ro = new Role(); | ||
| 198 | + boolean Legality = false; | ||
| 199 | + while(itRole.hasNext()){//判断是否有下一个 | ||
| 200 | + ro = itRole.next(); | ||
| 201 | + if(ro.getLevel() == 1) | ||
| 202 | + Legality = true; | ||
| 203 | + } | ||
| 204 | + if(Legality){ | ||
| 205 | + String pwd = PwdGenerator.randomPassword(16); | ||
| 206 | + user = sysUserRepository.findOne(id); | ||
| 207 | + user.setPwdValidPeriod(pwdValidPeriod); | ||
| 208 | + sysUserRepository.save(user); | ||
| 209 | + sysUserRepository.changePWD(id, new BCryptPasswordEncoder(4).encode(pwd)); | ||
| 210 | + //发送邮件 | ||
| 211 | + EmailBean mail = new EmailBean(); | ||
| 212 | + mail.setSubject(IpUtils.getLocalIpAddress() +":密码重置"); | ||
| 213 | + mail.setContent(pwd); | ||
| 214 | + mailUtils.sendMail(mail); | ||
| 215 | + logger.info("setLD-sendMail:邮件发送成功!"); | ||
| 216 | + rs.put("status", ResponseCode.SUCCESS); | ||
| 217 | + rs.put("msg", "密码重置成功!"); | ||
| 218 | + }else { | ||
| 219 | + rs.put("status", ResponseCode.ERROR); | ||
| 220 | + rs.put("msg", "您不是管理员无权限重置其他用户密码"); | ||
| 221 | + } | ||
| 222 | + }catch (Exception e){ | ||
| 223 | + logger.error("", e); | ||
| 224 | + rs.put("status", ResponseCode.ERROR); | ||
| 225 | + rs.put("msg", e.getMessage()); | ||
| 226 | + } | ||
| 227 | + return rs; | ||
| 228 | + } | ||
| 229 | + | ||
| 230 | + @Override | ||
| 231 | + @Transactional(rollbackFor = Exception.class) | ||
| 232 | + public void recordLoginDate(String userName) { | ||
| 233 | + sysUserRepository.recordLoginDate(userName); | ||
| 234 | + } | ||
| 235 | + | ||
| 236 | + @Override | ||
| 237 | + @Transactional(rollbackFor = Exception.class) | ||
| 238 | + public void realName(String jobCode, String realName, int id) { | ||
| 239 | + sysUserRepository.realName(jobCode, realName, id); | ||
| 240 | + } | ||
| 241 | +} |
src/main/java/com/bsth/util/IpUtils.java
| @@ -12,17 +12,11 @@ public class IpUtils { | @@ -12,17 +12,11 @@ public class IpUtils { | ||
| 12 | if (request == null) { | 12 | if (request == null) { |
| 13 | return "unknown"; | 13 | return "unknown"; |
| 14 | } | 14 | } |
| 15 | - String ip = request.getHeader("x-forwarded-for"); | ||
| 16 | - if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { | ||
| 17 | - ip = request.getHeader("Proxy-Client-IP"); | ||
| 18 | - } | 15 | + String ip = null; |
| 19 | if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { | 16 | if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { |
| 20 | ip = request.getHeader("X-Forwarded-For"); | 17 | ip = request.getHeader("X-Forwarded-For"); |
| 21 | } | 18 | } |
| 22 | if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { | 19 | if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { |
| 23 | - ip = request.getHeader("WL-Proxy-Client-IP"); | ||
| 24 | - } | ||
| 25 | - if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { | ||
| 26 | ip = request.getHeader("X-Real-IP"); | 20 | ip = request.getHeader("X-Real-IP"); |
| 27 | } | 21 | } |
| 28 | if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { | 22 | if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { |
src/main/java/com/bsth/util/MailUtils.java
0 → 100644
| 1 | +package com.bsth.util; | ||
| 2 | + | ||
| 3 | +import com.bsth.data.SystemParamCache; | ||
| 4 | +import com.bsth.email.SimpleMailSender; | ||
| 5 | +import com.bsth.email.entity.EmailBean; | ||
| 6 | +import org.springframework.stereotype.Component; | ||
| 7 | + | ||
| 8 | +import java.util.List; | ||
| 9 | + | ||
| 10 | +/** | ||
| 11 | + * @author Hill | ||
| 12 | + */ | ||
| 13 | +@Component | ||
| 14 | +public class MailUtils { | ||
| 15 | + | ||
| 16 | + private Tools tools = new Tools("mailbox.properties"); | ||
| 17 | + | ||
| 18 | + private SimpleMailSender sms = new SimpleMailSender(tools.getValue("username"),tools.getValue("password")); | ||
| 19 | + | ||
| 20 | + /** | ||
| 21 | + * recipients | ||
| 22 | + * 收件人集合 | ||
| 23 | |||
| 24 | + * 邮件 | ||
| 25 | + */ | ||
| 26 | + public int sendMail(List<String> recipients, EmailBean mail){ | ||
| 27 | + try { | ||
| 28 | + for (String recipient : recipients) { | ||
| 29 | + sms.send(recipient, mail.getSubject(),mail.getContent()); | ||
| 30 | + } | ||
| 31 | + } catch (Exception e) { | ||
| 32 | + e.printStackTrace(); | ||
| 33 | + return -1; | ||
| 34 | + } | ||
| 35 | + return 1; | ||
| 36 | + } | ||
| 37 | + | ||
| 38 | + /** | ||
| 39 | + * recipient | ||
| 40 | + * 收件人 | ||
| 41 | |||
| 42 | + * 邮件 | ||
| 43 | + */ | ||
| 44 | + public int sendMail(String recipient, EmailBean mail){ | ||
| 45 | + try { | ||
| 46 | + sms.send(recipient, mail.getSubject(), mail.getContent()); | ||
| 47 | + } catch (Exception e) { | ||
| 48 | + e.printStackTrace(); | ||
| 49 | + return -1; | ||
| 50 | + } | ||
| 51 | + return 1; | ||
| 52 | + } | ||
| 53 | + | ||
| 54 | + public int sendMail(EmailBean mail){ | ||
| 55 | + return sendMail(SystemParamCache.getMailAdmin(), mail); | ||
| 56 | + } | ||
| 57 | +} | ||
| 0 | \ No newline at end of file | 58 | \ No newline at end of file |
src/main/resources/static/index.html
| 1 | -<!DOCTYPE html> | ||
| 2 | -<html lang="zh"> | ||
| 3 | -<head> | ||
| 4 | - <meta name="renderer" content="webkit" /> | ||
| 5 | - <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> | ||
| 6 | - <meta charset="UTF-8"> | ||
| 7 | - <title>调度系统</title> | ||
| 8 | - | ||
| 9 | - <meta http-equiv="Pragma" content="no-cache"> | ||
| 10 | - <meta http-equiv="Cache-control" content="no-cache"> | ||
| 11 | - <meta http-equiv="Cache" content="no-cache"> | ||
| 12 | - | ||
| 13 | - <!-- Font Awesome 图标字体 --> | ||
| 14 | - <link | ||
| 15 | - href="/metronic_v4.5.4/plugins/font-awesome/css/font-awesome.min.css" | ||
| 16 | - rel="stylesheet" type="text/css" /> | ||
| 17 | - <!-- Bootstrap style --> | ||
| 18 | - <link href="/metronic_v4.5.4/plugins/bootstrap/css/bootstrap.min.css" | ||
| 19 | - rel="stylesheet" type="text/css" /> | ||
| 20 | - <!-- jsTree 数插件 --> | ||
| 21 | - <link | ||
| 22 | - href="/metronic_v4.5.4/plugins/jstree/dist/themes/default/style.min.css" | ||
| 23 | - rel="stylesheet" type="text/css" /> | ||
| 24 | - <!-- MULTI-select 多选下拉框美化 --> | ||
| 25 | - <link | ||
| 26 | - href="/metronic_v4.5.4/plugins/jquery-multi-select/css/multi-select.css" | ||
| 27 | - rel="stylesheet" type="text/css" /> | ||
| 28 | - | ||
| 29 | - <!-- editable --> | ||
| 30 | - <link | ||
| 31 | - href="/metronic_v4.5.4/plugins/bootstrap-editable/bootstrap-editable/css/bootstrap-editable.css" | ||
| 32 | - rel="stylesheet" type="text/css" /> | ||
| 33 | - <!-- METRONIC style --> | ||
| 34 | - <link href="/metronic_v4.5.4/layout4/css/themes/light.min.css" | ||
| 35 | - rel="stylesheet" type="text/css" id="style_color" /> | ||
| 36 | - <link href="/metronic_v4.5.4/css/components.css" rel="stylesheet" | ||
| 37 | - type="text/css" /> | ||
| 38 | - <link href="/metronic_v4.5.4/css/plugins.css" rel="stylesheet" | ||
| 39 | - type="text/css" /> | ||
| 40 | - <link href="/metronic_v4.5.4/layout4/css/layout.min.css" | ||
| 41 | - rel="stylesheet" type="text/css" /> | ||
| 42 | - <link href="/metronic_v4.5.4/layout4/css/custom.min.css" | ||
| 43 | - rel="stylesheet" type="text/css" /> | ||
| 44 | - <!-- select2 下拉框插件 --> | ||
| 45 | - <link href="/metronic_v4.5.4/plugins/select2/css/select2.min.css" | ||
| 46 | - rel="stylesheet" type="text/css" /> | ||
| 47 | - <link | ||
| 48 | - href="/metronic_v4.5.4/plugins/select2/css/select2-bootstrap.min.css" | ||
| 49 | - rel="stylesheet" type="text/css" /> | ||
| 50 | - <!-- layer 弹层 插件 --> | ||
| 51 | - <link href="/assets/plugins/layer-v2.4/layer/skin/layer.css" | ||
| 52 | - rel="stylesheet" type="text/css" /> | ||
| 53 | - <!-- fileinput 上传 插件 --> | ||
| 54 | - <link href="/assets/plugins/fileinput/css/fileinput.min.css" | ||
| 55 | - rel="stylesheet" type="text/css" /> | ||
| 56 | - <!-- iCheck 单选框和复选框 --> | ||
| 57 | - <link href="/metronic_v4.5.4/plugins/icheck/skins/all.css" | ||
| 58 | - rel="stylesheet" type="text/css" /> | ||
| 59 | - <!-- 日期控件 --> | ||
| 60 | - <link | ||
| 61 | - href="/metronic_v4.5.4/plugins/bootstrap-datetimepicker-2/css/bootstrap-datetimepicker.min.css" | ||
| 62 | - rel="stylesheet" type="text/css" /> | ||
| 63 | - <!-- table 表格控件 --> | ||
| 64 | - <!--<link rel="stylesheet"--> | ||
| 65 | - <!--href="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.css"--> | ||
| 66 | - <!--type="text/css" />--> | ||
| 67 | - <link href="/metronic_v4.5.4/plugins/bootstrap-tagsinput/bootstrap-tagsinput.css" rel="stylesheet" type="text/css"/> | ||
| 68 | - <!-- handsontable样式 --> | ||
| 69 | - <link rel="stylesheet" | ||
| 70 | - href="/assets/bower_components/handsontable/dist/handsontable.full.css" /> | ||
| 71 | - <!-- sweetalert样式 --> | ||
| 72 | - <link rel="stylesheet" | ||
| 73 | - href="/assets/bower_components/sweetalert/dist/sweetalert.css" /> | ||
| 74 | - <!-- schedule计划调度AngularJS模块主css --> | ||
| 75 | - <link rel="stylesheet" href="/pages/scheduleApp/module/common/main.css" | ||
| 76 | - type="text/css" /> | ||
| 77 | - <link rel="stylesheet" href="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.css" merge="plugins"/> | ||
| 78 | - | ||
| 79 | - <!-- CSS动画 --> | ||
| 80 | - <link | ||
| 81 | - href="/metronic_v4.5.4/plugins/tipso/css/animate.css" | ||
| 82 | - rel="stylesheet" type="text/css" /> | ||
| 83 | - | ||
| 84 | - <!-- 提示工具样式 --> | ||
| 85 | - <link | ||
| 86 | - href="/metronic_v4.5.4/plugins/tipso/css/tipso.css" | ||
| 87 | - rel="stylesheet" type="text/css" /> | ||
| 88 | - | ||
| 89 | - <style type="text/css"> | ||
| 90 | - .searchForm { | ||
| 91 | - | ||
| 92 | - } | ||
| 93 | - | ||
| 94 | - .searchForm .form-group .control-label { | ||
| 95 | - padding-right: 0px; | ||
| 96 | - text-align: right; | ||
| 97 | - margin-top: 7px; | ||
| 98 | - } | ||
| 99 | - | ||
| 100 | - .searchForm .form-group>div { | ||
| 101 | - padding-left: 10px; | ||
| 102 | - padding-right: 0px; | ||
| 103 | - } | ||
| 104 | - | ||
| 105 | - .searchForm .row>div { | ||
| 106 | - padding-left: 0px; | ||
| 107 | - padding-right: 0px; | ||
| 108 | - padding: 5px 0 5px 0; | ||
| 109 | - width: 270px; | ||
| 110 | - display: inline-block; | ||
| 111 | - } | ||
| 112 | - | ||
| 113 | - .searchForm .form-actions { | ||
| 114 | - | ||
| 115 | - } | ||
| 116 | - | ||
| 117 | - tr.row-active td { | ||
| 118 | - border-bottom: 1px solid blue !important; | ||
| 119 | - color: blue; | ||
| 120 | - } | ||
| 121 | - | ||
| 122 | - .ms-container .ms-selectable li.ms-elem-selectable,.ms-container .ms-selection li.ms-elem-selection | ||
| 123 | - { | ||
| 124 | - font-size: 14px; | ||
| 125 | - } | ||
| 126 | - | ||
| 127 | - .ms-container .ms-selectable li.ms-elem-selectable,.ms-container .ms-selection li.ms-elem-selection | ||
| 128 | - { | ||
| 129 | - padding: 6px 26px; | ||
| 130 | - } | ||
| 131 | - | ||
| 132 | - .ms-container .ms-list { | ||
| 133 | - height: 306px; | ||
| 134 | - } | ||
| 135 | - | ||
| 136 | - .ms-container .ms-selectable,.ms-container .ms-selection { | ||
| 137 | - width: 47%; | ||
| 138 | - } | ||
| 139 | - | ||
| 140 | - .ms-container { | ||
| 141 | - width: 470px; | ||
| 142 | - margin: auto; | ||
| 143 | - } | ||
| 144 | - | ||
| 145 | - .multi-custom-header-left { | ||
| 146 | - text-align: center; | ||
| 147 | - padding: 7px; | ||
| 148 | - color: #3B3F51; | ||
| 149 | - } | ||
| 150 | - | ||
| 151 | - .multi-custom-header-right { | ||
| 152 | - text-align: center; | ||
| 153 | - padding: 7px; | ||
| 154 | - font-weight: bold; | ||
| 155 | - color: #36C6D3; | ||
| 156 | - } | ||
| 157 | - | ||
| 158 | - .mt-element-list .list-simple.mt-list-container ul>.mt-list-item>.list-item-content | ||
| 159 | - { | ||
| 160 | - padding: 0 55px 0 0px; | ||
| 161 | - } | ||
| 162 | - | ||
| 163 | - .mt-element-list .list-simple.mt-list-container ul>.mt-list-item { | ||
| 164 | - padding: 3.3px 0; | ||
| 165 | - } | ||
| 166 | - | ||
| 167 | - #route-container { | ||
| 168 | - display: none; | ||
| 169 | - } | ||
| 170 | - | ||
| 171 | - .page-content.active { | ||
| 172 | - display: block !important; | ||
| 173 | - } | ||
| 174 | - | ||
| 175 | - .page-header.navbar .page-logo .logo-default { | ||
| 176 | - margin: 0; | ||
| 177 | - } | ||
| 178 | - | ||
| 179 | - .page-header.navbar .top-menu .navbar-nav>li.dropdown.open .dropdown-toggle | ||
| 180 | - { | ||
| 181 | - background-color: #284a99; | ||
| 182 | - } | ||
| 183 | - | ||
| 184 | - .page-header.navbar .page-logo { | ||
| 185 | - padding-right: 10px; | ||
| 186 | - } | ||
| 187 | - | ||
| 188 | - .page-logo .logo-default.logo-default-text { | ||
| 189 | - font-weight: 600; | ||
| 190 | - color: white !important; | ||
| 191 | - margin-top: 19px !important; | ||
| 192 | - font-size: 24px; | ||
| 193 | - text-decoration: none; | ||
| 194 | - } | ||
| 195 | - | ||
| 196 | - .page-logo .logo-default.logo-default-text:HOVER { | ||
| 197 | - color: #dedede !important; | ||
| 198 | - } | ||
| 199 | - | ||
| 200 | - body,.page-content-wrapper,#pjax-container{ | ||
| 201 | - height: 100%; | ||
| 202 | - } | ||
| 203 | - html{ | ||
| 204 | - height: 90%; | ||
| 205 | - } | ||
| 206 | - .page-container{ | ||
| 207 | - height: 100%; | ||
| 208 | - } | ||
| 209 | - </style> | ||
| 210 | - | ||
| 211 | - <!-- ocLazyLoading载入文件的位置 --> | ||
| 212 | - <link id="ng_load_plugins_before" /> | ||
| 213 | - | ||
| 214 | -</head> | ||
| 215 | -<body | ||
| 216 | - class="page-container-bg-solid page-header-fixed page-sidebar-closed-hide-logo page-sidebar-fixed"> | ||
| 217 | -<div class="page-header navbar navbar-fixed-top" | ||
| 218 | - style="background: linear-gradient(to bottom, #124e78, #125688);"> | ||
| 219 | - <div class="page-header-inner "> | ||
| 220 | - <!-- LOGO --> | ||
| 221 | - <div class="page-logo"> | ||
| 222 | - <a href="index.html" class="logo-default logo-default-text"> | ||
| 223 | - 青浦公交调度系统 </a> | ||
| 224 | - <div class="menu-toggler sidebar-toggler"></div> | ||
| 225 | - </div> | ||
| 226 | - <!-- END LOGO --> | ||
| 227 | - <a href="javascript:;" class="menu-toggler responsive-toggler" | ||
| 228 | - data-toggle="collapse" data-target=".navbar-collapse"> </a> | ||
| 229 | - <div class="page-top"> | ||
| 230 | - <div class="top-menu"> | ||
| 231 | - <ul class="nav navbar-nav pull-right"> | ||
| 232 | - <!-- 信息通知区 --> | ||
| 233 | - <li | ||
| 234 | - class="dropdown dropdown-extended dropdown-notification dropdown-dark" | ||
| 235 | - id="header_notification_bar"><a href="javascript:;" | ||
| 236 | - class="dropdown-toggle" data-toggle="dropdown" | ||
| 237 | - data-hover="dropdown" data-close-others="true"> <i | ||
| 238 | - class="fa fa-bell"></i> <span class="badge badge-success"> | ||
| 239 | - 0 </span> | ||
| 240 | - </a> | ||
| 241 | - <ul class="dropdown-menu" style="max-width: 345px; width: 345px;"> | ||
| 242 | - <li class="external"> | ||
| 243 | - <h3> | ||
| 244 | - 今日 <span class="bold">0 条</span> 通知 | ||
| 245 | - </h3> <a href="javascript:;">查看全部</a> | ||
| 246 | - </li> | ||
| 247 | - <li> | ||
| 248 | - <ul class="dropdown-menu-list scroller" style="height: 250px;" | ||
| 249 | - data-handle-color="#637283"> | ||
| 250 | - </ul> | ||
| 251 | - </li> | ||
| 252 | - </ul></li> | ||
| 253 | - <li class="dropdown dropdown-user dropdown-dark"><a | ||
| 254 | - href="javascript:;" class="dropdown-toggle" | ||
| 255 | - data-toggle="dropdown" data-hover="dropdown" | ||
| 256 | - data-close-others="true"> <span id="indexTopUName" | ||
| 257 | - class="username username-hide-on-mobile" | ||
| 258 | - style="vertical-align: middle;"> <i class="fa fa-user"></i></span> | ||
| 259 | - </a> | ||
| 260 | - <ul class="dropdown-menu dropdown-menu-default"> | ||
| 261 | - <li><a href="javascript:;"> <i class="fa fa-user"></i> | ||
| 262 | - 我的信息 | ||
| 263 | - </a></li> | ||
| 264 | - <li><a href="javascript:;" id="changePWD"> <i | ||
| 265 | - class="fa fa-unlock-alt"></i> 修改密码 | ||
| 266 | - </a></li> | ||
| 267 | - <li class="divider"></li> | ||
| 268 | - <li><a href="javascript:;"> <i class="fa fa-lock"></i> | ||
| 269 | - 锁屏 | ||
| 270 | - </a></li> | ||
| 271 | - <li><a href="/logout"> <i class="fa fa-key"></i> 注销登陆 | ||
| 272 | - </a></li> | ||
| 273 | - </ul></li> | ||
| 274 | - </ul> | ||
| 275 | - </div> | ||
| 276 | - </div> | ||
| 277 | - </div> | ||
| 278 | -</div> | ||
| 279 | -<div class="page-container"> | ||
| 280 | - <div class="page-sidebar-wrapper"> | ||
| 281 | - <div class="page-sidebar navbar-collapse collapse"> | ||
| 282 | - <ul class="page-sidebar-menu page-sidebar-menu-fixed" | ||
| 283 | - data-keep-expanded="false" data-auto-scroll="true" | ||
| 284 | - data-slide-speed="200" id="leftMenuSidebar"> | ||
| 285 | - </ul> | ||
| 286 | - </div> | ||
| 287 | - </div> | ||
| 288 | - <div class="page-content-wrapper"> | ||
| 289 | - <div id="pjax-container" class="page-content"></div> | ||
| 290 | - <a name="xd_position"></a> | ||
| 291 | - <div id="route-container"> | ||
| 292 | - <div ng-app="ScheduleApp"> | ||
| 293 | - <div ng-controller="ScheduleAppController"> | ||
| 294 | - | ||
| 295 | - <!-- loading widget --> | ||
| 296 | - <div id="loadingWidget" class="flyover mask" loading-widget> | ||
| 297 | - <div class="alert alert-info"> | ||
| 298 | - <strong>载入中......</strong> | ||
| 299 | - </div> | ||
| 300 | - </div> | ||
| 301 | - | ||
| 302 | - <div ui-view class="uv"></div> | ||
| 303 | - </div> | ||
| 304 | - </div> | ||
| 305 | - </div> | ||
| 306 | - </div> | ||
| 307 | -</div> | ||
| 308 | - | ||
| 309 | -<script id="menu_list_temp" type="text/html"> | ||
| 310 | - {{each list as group i}} | ||
| 311 | - <li class="heading"> | ||
| 312 | - <h3 class="uppercase">{{group.name}}</h3> | ||
| 313 | - </li> | ||
| 314 | - {{each group.children as dir j}} | ||
| 315 | - <li class="nav-item"> | ||
| 316 | - <a href="javascript:;" class="nav-link nav-toggle "> | ||
| 317 | - <i class="{{dir.icon}}"></i> | ||
| 318 | - <span class="title">{{dir.name}}</span> | ||
| 319 | - <span class="arrow"></span> | ||
| 320 | - </a> | ||
| 321 | - <ul class="sub-menu"> | ||
| 322 | - {{each dir.children as module s}} | ||
| 323 | - <li class="nav-item "> | ||
| 324 | - {{if module.container=="pjax-container"}} | ||
| 325 | - <a href="/pages/{{module.path}}" class="nav-link " data-pjax> | ||
| 326 | - <span class="title">{{module.name}}</span> | ||
| 327 | - </a> | ||
| 328 | - {{else}} | ||
| 329 | - <a href="{{module.path}}" class="nav-link " data-angularjs> | ||
| 330 | - <span class="title">{{module.name}}</span> | ||
| 331 | - </a> | ||
| 332 | - {{/if}} | ||
| 333 | - </li> | ||
| 334 | - {{/each}} | ||
| 335 | - </ul> | ||
| 336 | - </li> | ||
| 337 | - {{/each}} | ||
| 338 | - {{/each}} | ||
| 339 | - | ||
| 340 | -</script> | ||
| 341 | -<script> | ||
| 342 | - delete window.require; | ||
| 343 | - delete window.exports; | ||
| 344 | - delete window.module; | ||
| 345 | -</script> | ||
| 346 | -<!-- jQuery --> | ||
| 347 | -<script src="/metronic_v4.5.4/plugins/jquery.min.js" data-exclude=1></script> | ||
| 348 | -<!-- bootstrap --> | ||
| 349 | -<script src="/metronic_v4.5.4/plugins/bootstrap/js/bootstrap.min.js" | ||
| 350 | - data-exclude=1></script> | ||
| 351 | -<script src="/pages/forms/statement/js/jquery.autocompleter.js"></script> | ||
| 352 | -<script src="/pages/forms/statement/js/jquery.PrintArea.js"></script> | ||
| 353 | -<!-- MTRONIC JS --> | ||
| 354 | -<script src="/metronic_v4.5.4/scripts/app.min.js" data-exclude=1></script> | ||
| 355 | -<script src="/metronic_v4.5.4/layout4/scripts/layout.min.js" | ||
| 356 | - data-exclude=1></script> | ||
| 357 | -<!-- 虚拟滚动条 --> | ||
| 358 | -<script | ||
| 359 | - src="/metronic_v4.5.4/plugins/jquery-slimscroll/jquery.slimscroll.min.js"></script> | ||
| 360 | -<!-- jsTree 树插件 --> | ||
| 361 | -<script src="/metronic_v4.5.4/plugins/jstree/dist/jstree.min.js"></script> | ||
| 362 | -<!-- bootstrap-hover-dropDown --> | ||
| 363 | -<script | ||
| 364 | - src="/metronic_v4.5.4/plugins/bootstrap-hover-dropdown/bootstrap-hover-dropdown.min.js"></script> | ||
| 365 | -<!-- jquery.validate 表单验证 --> | ||
| 366 | -<script | ||
| 367 | - src="/metronic_v4.5.4/plugins/jquery-validation/js/jquery.validate.min.js"></script> | ||
| 368 | -<script | ||
| 369 | - src="/metronic_v4.5.4/plugins/jquery-validation/js/localization/messages_zh.js"></script> | ||
| 370 | -<!-- 向导式插件 --> | ||
| 371 | -<script | ||
| 372 | - src="/metronic_v4.5.4//plugins/bootstrap-wizard/jquery.bootstrap.wizard.min.js"></script> | ||
| 373 | -<!-- iCheck 单选框和复选框 --> | ||
| 374 | -<script src="/metronic_v4.5.4/plugins/icheck/icheck.min.js"></script> | ||
| 375 | -<!-- select2 下拉框 --> | ||
| 376 | -<script src="/metronic_v4.5.4/plugins/select2/js/select2.full.min.js"></script> | ||
| 377 | -<!-- MULTI SELECT 多选下拉框 --> | ||
| 378 | -<script | ||
| 379 | - src="/metronic_v4.5.4/plugins/jquery-multi-select/js/jquery.multi-select.js"></script> | ||
| 380 | -<!-- editable.js --> | ||
| 381 | -<script | ||
| 382 | - src="/metronic_v4.5.4/plugins/bootstrap-editable/bootstrap-editable/js/bootstrap-editable.min.js"></script> | ||
| 383 | -<!-- PJAX --> | ||
| 384 | -<script src="/assets/plugins/jquery.pjax.js"></script> | ||
| 385 | -<!-- layer 弹层 --> | ||
| 386 | -<script src="/assets/plugins/layer-v2.4/layer/layer.js" data-exclude=1></script> | ||
| 387 | -<!-- fileinput 上传 --> | ||
| 388 | -<script src="/assets/plugins/fileinput/canvas-to-blob.min.js"></script> | ||
| 389 | -<script src="/assets/plugins/fileinput/purify.min.js"></script> | ||
| 390 | -<script src="/assets/plugins/fileinput/sortable.min.js"></script> | ||
| 391 | -<script src="/assets/plugins/fileinput/fileinput.min.js"></script> | ||
| 392 | -<script src="/assets/plugins/fileinput/fileinput_locale_zh.js"></script> | ||
| 393 | -<!-- jquery.purl URL解析 --> | ||
| 394 | -<script src="/assets/plugins/purl.js"></script> | ||
| 395 | -<!-- jquery.serializejson JSON序列化插件 --> | ||
| 396 | -<script src="/assets/plugins/jquery.serializejson.js"></script> | ||
| 397 | -<!-- art-template 模版引擎 --> | ||
| 398 | -<script src="/assets/plugins/template.js"></script> | ||
| 399 | -<!-- jquery.pageinator 分页 --> | ||
| 400 | -<script src="/assets/plugins/jqPaginator.min.js"></script> | ||
| 401 | -<!-- moment.js 日期处理类库 --> | ||
| 402 | -<script src="/assets/plugins/moment-with-locales.js"></script> | ||
| 403 | - | ||
| 404 | -<script src="/assets/plugins/pinyin.js"></script> | ||
| 405 | -<!-- 日期控件 --> | ||
| 406 | -<script | ||
| 407 | - src="/metronic_v4.5.4/plugins/bootstrap-datetimepicker-2/js/bootstrap-datetimepicker.min.js"></script> | ||
| 408 | -<!-- 表格控件 --> | ||
| 409 | -<script src="/metronic_v4.5.4/plugins/bootstrap-tagsinput/bootstrap-tagsinput.min.js"></script> | ||
| 410 | -<!-- 统计图控件 --> | ||
| 411 | -<!--<script src="/assets/global/getEchart.js"></script> | ||
| 412 | -<script src="/assets/global/echarts.js"></script> --> | ||
| 413 | -<script src="/assets/js/common.js"></script> | ||
| 414 | -<script src="/assets/js/dictionary.js"></script> | ||
| 415 | -<!-- tipso JS --> | ||
| 416 | -<script src="/metronic_v4.5.4/plugins/tipso/js/tipso.js"></script> | ||
| 417 | -<script data-exclude=1> | ||
| 418 | - //初始打开的片段地址 | ||
| 419 | - var initFragment = "^_^initFragment^_^"; | ||
| 420 | - //静态文件目录 | ||
| 421 | - var dir = '/pages/'; | ||
| 422 | - //片段容器 | ||
| 423 | - var pjaxContainer = '#pjax-container' | ||
| 424 | - , angJsContainer = '#route-container'; | ||
| 425 | - | ||
| 426 | - $(document).ajaxError(function (event, jqxhr, settings, thrownError) { | ||
| 427 | - if(jqxhr.status == 403){ | ||
| 428 | - layer.closeAll(); | ||
| 429 | - layer.alert(jqxhr.message?jqxhr.message:'访问被拒绝', {icon: 2, title: '操作失败'}); | ||
| 430 | - } | ||
| 431 | - }); | ||
| 432 | - | ||
| 433 | - $(function () { | ||
| 434 | - $.get('/user/currentUser', function (user) { | ||
| 435 | - $('#indexTopUName').text(user.userName); | ||
| 436 | - }); | ||
| 437 | - | ||
| 438 | - //带 data-pjax 的链接由pjax加载 | ||
| 439 | - $(document).pjax('a[data-pjax]', pjaxContainer); | ||
| 440 | - | ||
| 441 | - //pjax左菜单点击事件 | ||
| 442 | - $(document).on('click', '#leftMenuSidebar a[data-pjax]', function () { | ||
| 443 | - setTitle(this); | ||
| 444 | - | ||
| 445 | - $('#leftMenuSidebar li.nav-item.active').removeClass('active'); | ||
| 446 | - $(this).parent().addClass('active'); | ||
| 447 | - showPjax(); | ||
| 448 | - }); | ||
| 449 | - | ||
| 450 | - //angularjs左菜单点击事件 | ||
| 451 | - $(document).on('click', '#leftMenuSidebar a[data-angularjs]', function () { | ||
| 452 | - setTitle(this); | ||
| 453 | - | ||
| 454 | - $('#leftMenuSidebar li.nav-item.active').removeClass('active'); | ||
| 455 | - $(this).parent().addClass('active'); | ||
| 456 | - showAngJs(); | ||
| 457 | - }); | ||
| 458 | - | ||
| 459 | - //加载左菜单栏 | ||
| 460 | - $get('/module/findByCurrentUser', null, | ||
| 461 | - function (ms) { | ||
| 462 | - var treeArray = createTreeData(ms); | ||
| 463 | - treeArray.sort(function (a, b) { | ||
| 464 | - return a.createDate - b.createDate; | ||
| 465 | - }); | ||
| 466 | - var menuHtml = template('menu_list_temp', {list: treeArray}); | ||
| 467 | - $('#leftMenuSidebar').html(menuHtml); | ||
| 468 | - | ||
| 469 | - //----------- 检查URL ---------------- | ||
| 470 | - var h = location.hash; | ||
| 471 | - if (initFragment && initFragment != '') { | ||
| 472 | - showPjax(); | ||
| 473 | - //普通片段 | ||
| 474 | - loadPage(initFragment); | ||
| 475 | - //选中菜单 | ||
| 476 | - $.each($('#leftMenuSidebar a'), function (i, item) { | ||
| 477 | - if (urlPattern($(item).attr('href'), initFragment)) { | ||
| 478 | - activeLeftMenu(item); | ||
| 479 | - } | ||
| 480 | - }); | ||
| 481 | - } else if (h) { | ||
| 482 | - //angularjs片段 | ||
| 483 | - showAngJs(); | ||
| 484 | - //选中菜单 | ||
| 485 | - $.each($('#leftMenuSidebar a'), function (i, item) { | ||
| 486 | - if ($(item).attr('href') == h) { | ||
| 487 | - activeLeftMenu(item); | ||
| 488 | - } | ||
| 489 | - }); | ||
| 490 | - } | ||
| 491 | - else { | ||
| 492 | - //加载主页 | ||
| 493 | - loadPage('/pages/home.html'); | ||
| 494 | - } | ||
| 495 | - }); | ||
| 496 | - | ||
| 497 | - //修改密码 | ||
| 498 | - $('#changePWD').on('click', function () { | ||
| 499 | - $.get('/pages/permission/user/changePWD.html', function (content) { | ||
| 500 | - layer.open({ | ||
| 501 | - type: 1, | ||
| 502 | - area: ['600px', '360px'], | ||
| 503 | - content: content, | ||
| 504 | - title: '修改密码', | ||
| 505 | - shift: 5, | ||
| 506 | - scrollbar: false, | ||
| 507 | - success: function () { | ||
| 508 | - } | ||
| 509 | - }); | ||
| 510 | - }); | ||
| 511 | - }); | ||
| 512 | - }); | ||
| 513 | - | ||
| 514 | - //modal关闭时销毁dom | ||
| 515 | - $(document).on('hidden.bs.modal', '.modal', function () { | ||
| 516 | - $(this).remove(); | ||
| 517 | - }); | ||
| 518 | - | ||
| 519 | - //pjax加载完成事件 | ||
| 520 | - $(document).on('pjax:success', function () { | ||
| 521 | - var dicts = $(pjaxContainer).find('.nt-dictionary'); | ||
| 522 | - dictionaryUtils.transformDom(dicts); | ||
| 523 | - }); | ||
| 524 | - | ||
| 525 | - function loadPage(url) { | ||
| 526 | - $.pjax({url: url, container: pjaxContainer}) | ||
| 527 | - } | ||
| 528 | - | ||
| 529 | - function urlPattern(a, b) { | ||
| 530 | - var r; | ||
| 531 | - try { | ||
| 532 | - r = a.substring(0, a.lastIndexOf('/')) == b.substring(0, b.lastIndexOf('/')); | ||
| 533 | - } catch (e) { | ||
| 534 | - r = false; | ||
| 535 | - } | ||
| 536 | - return r; | ||
| 537 | - } | ||
| 538 | - | ||
| 539 | - function showPjax() { | ||
| 540 | - $(angJsContainer).removeClass('page-content active').hide(); | ||
| 541 | - $(pjaxContainer).addClass('page-content active'); | ||
| 542 | - } | ||
| 543 | - | ||
| 544 | - function showAngJs() { | ||
| 545 | - $(pjaxContainer).html('').removeClass('page-content active').hide(); | ||
| 546 | - $(angJsContainer).addClass('page-content active'); | ||
| 547 | - } | ||
| 548 | - | ||
| 549 | - function activeLeftMenu(item) { | ||
| 550 | - $(item).parent('.nav-item').addClass('active').parent('.sub-menu').show().parent().addClass('open'); | ||
| 551 | - setTitle(item); | ||
| 552 | - } | ||
| 553 | - | ||
| 554 | - function setTitle(menuItem){ | ||
| 555 | - document.title = $('span.title', menuItem).text(); | ||
| 556 | - } | ||
| 557 | - | ||
| 558 | -</script> | ||
| 559 | -<!-- d3 --> | ||
| 560 | -<script src="/assets/js/d3.min.js" data-exclude=1></script> | ||
| 561 | -<!-- webSocket JS --> | ||
| 562 | -<script src="/assets/js/sockjs.min.js"></script> | ||
| 563 | - | ||
| 564 | -<!-- TODO:angularJS相关库 --> | ||
| 565 | - | ||
| 566 | -<!-- angularJS相关库 --> | ||
| 567 | -<!-- 这个是基于angularjs 1.4.10修改的版本,主要是修改了history控制部分,用于兼容route和pjax的同时操作history的冲突 --> | ||
| 568 | -<script src="/assets/js/angular.js" data-autocephaly=1></script> | ||
| 569 | -<script src="/assets/bower_components/angular-i18n/angular-locale_zh-cn.js" data-autocephaly=1></script> | ||
| 570 | -<script | ||
| 571 | - src="/assets/bower_components/angular-resource/angular-resource.min.js" | ||
| 572 | - data-exclude=1></script> | ||
| 573 | -<script | ||
| 574 | - src="/assets/bower_components/angular-sanitize/angular-sanitize.min.js" | ||
| 575 | - data-exclude=1></script> | ||
| 576 | -<script | ||
| 577 | - src="/assets/bower_components/angular-animate/angular-animate.min.js" | ||
| 578 | - data-exclude=1></script> | ||
| 579 | -<script | ||
| 580 | - src="/assets/bower_components/angular-touch/angular-touch.min.js" | ||
| 581 | - data-exclude=1></script> | ||
| 582 | -<script | ||
| 583 | - src="/assets/bower_components/angular-ui-router/release/angular-ui-router.min.js" | ||
| 584 | - data-exclude=1></script> | ||
| 585 | -<script | ||
| 586 | - src="/assets/bower_components/oclazyload/dist/ocLazyLoad.min.js" | ||
| 587 | - data-exclude=1></script> | ||
| 588 | -<script | ||
| 589 | - src="/assets/bower_components/angular-bootstrap/ui-bootstrap-tpls.min.js" | ||
| 590 | - data-exclude=1></script> | ||
| 591 | -<!-- handsontable相关js --> | ||
| 592 | -<script | ||
| 593 | - src="/assets/bower_components/handsontable/dist/handsontable.full.js"></script> | ||
| 594 | -<script | ||
| 595 | - src="/assets/bower_components/ngHandsontable/dist/ngHandsontable.js"></script> | ||
| 596 | -<!-- sweetalert相关js --> | ||
| 597 | -<script src="/assets/bower_components/sweetalert/dist/sweetalert.min.js"></script> | ||
| 598 | -<script src="/assets/bower_components/ng-sweet-alert/ng-sweet-alert.js"></script> | ||
| 599 | - | ||
| 600 | -<!-- schedule计划调度AngularJS模块主JS --> | ||
| 601 | -<script src="/pages/scheduleApp/module/common/main.js" data-exclude=1></script> | ||
| 602 | -<script | ||
| 603 | - src="/pages/scheduleApp/module/common/prj-common-globalservice.js" | ||
| 604 | - data-exclude=1></script> | ||
| 605 | -<script src="/pages/scheduleApp/module/common/prj-common-filter.js" | ||
| 606 | - data-exclude=1></script> | ||
| 607 | -<script src="/pages/scheduleApp/module/common/prj-common-directive.js" | ||
| 608 | - data-exclude=1></script> | ||
| 609 | -<script | ||
| 610 | - src="/pages/scheduleApp/module/common/prj-common-ui-route-state.js" | ||
| 611 | - data-exclude=1></script> | ||
| 612 | - | ||
| 613 | -<!-- 地图相关 --> | ||
| 614 | -<!-- 百度 --> | ||
| 615 | -<script | ||
| 616 | - src="http://api.map.baidu.com/api?v=2.0&ak=IGGrr4UjwIYzatoCRFKEL8sT" | ||
| 617 | - data-exclude=1></script> | ||
| 618 | -<script | ||
| 619 | - src="http://api.map.baidu.com/library/TrafficControl/1.4/src/TrafficControl_min.js" | ||
| 620 | - data-exclude=1></script> | ||
| 621 | -<script type="text/javascript" | ||
| 622 | - src="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.js" | ||
| 623 | - data-exclude=1></script> | ||
| 624 | -<script type="text/javascript" | ||
| 625 | - src="http://api.map.baidu.com/library/RichMarker/1.2/src/RichMarker_min.js " | ||
| 626 | - data-exclude=1></script> | ||
| 627 | -<script src="/assets/js/baidu/TextIconOverlay.js" data-exclude=1></script> | ||
| 628 | -<script src="/assets/js/baidu//MarkerClusterer.js" data-exclude=1></script> | ||
| 629 | -<!-- 高德 --> | ||
| 630 | -<script | ||
| 631 | - src="http://webapi.amap.com/maps?v=1.3&key=16cb1c5043847e09ef9edafdd77befda" | ||
| 632 | - data-exclude=1></script> | ||
| 633 | -<!-- echarts4 误删 --> | ||
| 634 | -<script src="/metronic_v4.5.4/plugins/echarts4/echarts.min.js"></script> | ||
| 635 | -<script src="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.jquery.js" merge="plugins"></script> | ||
| 636 | - | ||
| 637 | -</body> | 1 | +<!DOCTYPE html> |
| 2 | +<html lang="zh"> | ||
| 3 | +<head> | ||
| 4 | + <meta name="renderer" content="webkit" /> | ||
| 5 | + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> | ||
| 6 | + <meta charset="UTF-8"> | ||
| 7 | + <title>调度系统</title> | ||
| 8 | + | ||
| 9 | + <meta http-equiv="Pragma" content="no-cache"> | ||
| 10 | + <meta http-equiv="Cache-control" content="no-cache"> | ||
| 11 | + <meta http-equiv="Cache" content="no-cache"> | ||
| 12 | + | ||
| 13 | + <!-- Font Awesome 图标字体 --> | ||
| 14 | + <link | ||
| 15 | + href="/metronic_v4.5.4/plugins/font-awesome/css/font-awesome.min.css" | ||
| 16 | + rel="stylesheet" type="text/css" /> | ||
| 17 | + <!-- Bootstrap style --> | ||
| 18 | + <link href="/metronic_v4.5.4/plugins/bootstrap/css/bootstrap.min.css" | ||
| 19 | + rel="stylesheet" type="text/css" /> | ||
| 20 | + <!-- jsTree 数插件 --> | ||
| 21 | + <link | ||
| 22 | + href="/metronic_v4.5.4/plugins/jstree/dist/themes/default/style.min.css" | ||
| 23 | + rel="stylesheet" type="text/css" /> | ||
| 24 | + <!-- MULTI-select 多选下拉框美化 --> | ||
| 25 | + <link | ||
| 26 | + href="/metronic_v4.5.4/plugins/jquery-multi-select/css/multi-select.css" | ||
| 27 | + rel="stylesheet" type="text/css" /> | ||
| 28 | + | ||
| 29 | + <!-- editable --> | ||
| 30 | + <link | ||
| 31 | + href="/metronic_v4.5.4/plugins/bootstrap-editable/bootstrap-editable/css/bootstrap-editable.css" | ||
| 32 | + rel="stylesheet" type="text/css" /> | ||
| 33 | + <!-- METRONIC style --> | ||
| 34 | + <link href="/metronic_v4.5.4/layout4/css/themes/light.min.css" | ||
| 35 | + rel="stylesheet" type="text/css" id="style_color" /> | ||
| 36 | + <link href="/metronic_v4.5.4/css/components.css" rel="stylesheet" | ||
| 37 | + type="text/css" /> | ||
| 38 | + <link href="/metronic_v4.5.4/css/plugins.css" rel="stylesheet" | ||
| 39 | + type="text/css" /> | ||
| 40 | + <link href="/metronic_v4.5.4/layout4/css/layout.min.css" | ||
| 41 | + rel="stylesheet" type="text/css" /> | ||
| 42 | + <link href="/metronic_v4.5.4/layout4/css/custom.min.css" | ||
| 43 | + rel="stylesheet" type="text/css" /> | ||
| 44 | + <!-- select2 下拉框插件 --> | ||
| 45 | + <link href="/metronic_v4.5.4/plugins/select2/css/select2.min.css" | ||
| 46 | + rel="stylesheet" type="text/css" /> | ||
| 47 | + <link | ||
| 48 | + href="/metronic_v4.5.4/plugins/select2/css/select2-bootstrap.min.css" | ||
| 49 | + rel="stylesheet" type="text/css" /> | ||
| 50 | + <!-- layer 弹层 插件 --> | ||
| 51 | + <link href="/assets/plugins/layer-v2.4/layer/skin/layer.css" | ||
| 52 | + rel="stylesheet" type="text/css" /> | ||
| 53 | + <!-- fileinput 上传 插件 --> | ||
| 54 | + <link href="/assets/plugins/fileinput/css/fileinput.min.css" | ||
| 55 | + rel="stylesheet" type="text/css" /> | ||
| 56 | + <!-- iCheck 单选框和复选框 --> | ||
| 57 | + <link href="/metronic_v4.5.4/plugins/icheck/skins/all.css" | ||
| 58 | + rel="stylesheet" type="text/css" /> | ||
| 59 | + <!-- 日期控件 --> | ||
| 60 | + <link | ||
| 61 | + href="/metronic_v4.5.4/plugins/bootstrap-datetimepicker-2/css/bootstrap-datetimepicker.min.css" | ||
| 62 | + rel="stylesheet" type="text/css" /> | ||
| 63 | + <!-- table 表格控件 --> | ||
| 64 | + <!--<link rel="stylesheet"--> | ||
| 65 | + <!--href="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.css"--> | ||
| 66 | + <!--type="text/css" />--> | ||
| 67 | + <link href="/metronic_v4.5.4/plugins/bootstrap-tagsinput/bootstrap-tagsinput.css" rel="stylesheet" type="text/css"/> | ||
| 68 | + <!-- handsontable样式 --> | ||
| 69 | + <link rel="stylesheet" | ||
| 70 | + href="/assets/bower_components/handsontable/dist/handsontable.full.css" /> | ||
| 71 | + <!-- sweetalert样式 --> | ||
| 72 | + <link rel="stylesheet" | ||
| 73 | + href="/assets/bower_components/sweetalert/dist/sweetalert.css" /> | ||
| 74 | + <!-- schedule计划调度AngularJS模块主css --> | ||
| 75 | + <link rel="stylesheet" href="/pages/scheduleApp/module/common/main.css" | ||
| 76 | + type="text/css" /> | ||
| 77 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.css" merge="plugins"/> | ||
| 78 | + | ||
| 79 | + <!-- CSS动画 --> | ||
| 80 | + <link | ||
| 81 | + href="/metronic_v4.5.4/plugins/tipso/css/animate.css" | ||
| 82 | + rel="stylesheet" type="text/css" /> | ||
| 83 | + | ||
| 84 | + <!-- 提示工具样式 --> | ||
| 85 | + <link | ||
| 86 | + href="/metronic_v4.5.4/plugins/tipso/css/tipso.css" | ||
| 87 | + rel="stylesheet" type="text/css" /> | ||
| 88 | + | ||
| 89 | + <style type="text/css"> | ||
| 90 | + .searchForm { | ||
| 91 | + | ||
| 92 | + } | ||
| 93 | + | ||
| 94 | + .searchForm .form-group .control-label { | ||
| 95 | + padding-right: 0px; | ||
| 96 | + text-align: right; | ||
| 97 | + margin-top: 7px; | ||
| 98 | + } | ||
| 99 | + | ||
| 100 | + .searchForm .form-group>div { | ||
| 101 | + padding-left: 10px; | ||
| 102 | + padding-right: 0px; | ||
| 103 | + } | ||
| 104 | + | ||
| 105 | + .searchForm .row>div { | ||
| 106 | + padding-left: 0px; | ||
| 107 | + padding-right: 0px; | ||
| 108 | + padding: 5px 0 5px 0; | ||
| 109 | + width: 270px; | ||
| 110 | + display: inline-block; | ||
| 111 | + } | ||
| 112 | + | ||
| 113 | + .searchForm .form-actions { | ||
| 114 | + | ||
| 115 | + } | ||
| 116 | + | ||
| 117 | + tr.row-active td { | ||
| 118 | + border-bottom: 1px solid blue !important; | ||
| 119 | + color: blue; | ||
| 120 | + } | ||
| 121 | + | ||
| 122 | + .ms-container .ms-selectable li.ms-elem-selectable,.ms-container .ms-selection li.ms-elem-selection | ||
| 123 | + { | ||
| 124 | + font-size: 14px; | ||
| 125 | + } | ||
| 126 | + | ||
| 127 | + .ms-container .ms-selectable li.ms-elem-selectable,.ms-container .ms-selection li.ms-elem-selection | ||
| 128 | + { | ||
| 129 | + padding: 6px 26px; | ||
| 130 | + } | ||
| 131 | + | ||
| 132 | + .ms-container .ms-list { | ||
| 133 | + height: 306px; | ||
| 134 | + } | ||
| 135 | + | ||
| 136 | + .ms-container .ms-selectable,.ms-container .ms-selection { | ||
| 137 | + width: 47%; | ||
| 138 | + } | ||
| 139 | + | ||
| 140 | + .ms-container { | ||
| 141 | + width: 470px; | ||
| 142 | + margin: auto; | ||
| 143 | + } | ||
| 144 | + | ||
| 145 | + .multi-custom-header-left { | ||
| 146 | + text-align: center; | ||
| 147 | + padding: 7px; | ||
| 148 | + color: #3B3F51; | ||
| 149 | + } | ||
| 150 | + | ||
| 151 | + .multi-custom-header-right { | ||
| 152 | + text-align: center; | ||
| 153 | + padding: 7px; | ||
| 154 | + font-weight: bold; | ||
| 155 | + color: #36C6D3; | ||
| 156 | + } | ||
| 157 | + | ||
| 158 | + .mt-element-list .list-simple.mt-list-container ul>.mt-list-item>.list-item-content | ||
| 159 | + { | ||
| 160 | + padding: 0 55px 0 0px; | ||
| 161 | + } | ||
| 162 | + | ||
| 163 | + .mt-element-list .list-simple.mt-list-container ul>.mt-list-item { | ||
| 164 | + padding: 3.3px 0; | ||
| 165 | + } | ||
| 166 | + | ||
| 167 | + #route-container { | ||
| 168 | + display: none; | ||
| 169 | + } | ||
| 170 | + | ||
| 171 | + .page-content.active { | ||
| 172 | + display: block !important; | ||
| 173 | + } | ||
| 174 | + | ||
| 175 | + .page-header.navbar .page-logo .logo-default { | ||
| 176 | + margin: 0; | ||
| 177 | + } | ||
| 178 | + | ||
| 179 | + .page-header.navbar .top-menu .navbar-nav>li.dropdown.open .dropdown-toggle | ||
| 180 | + { | ||
| 181 | + background-color: #284a99; | ||
| 182 | + } | ||
| 183 | + | ||
| 184 | + .page-header.navbar .page-logo { | ||
| 185 | + padding-right: 10px; | ||
| 186 | + } | ||
| 187 | + | ||
| 188 | + .page-logo .logo-default.logo-default-text { | ||
| 189 | + font-weight: 600; | ||
| 190 | + color: white !important; | ||
| 191 | + margin-top: 19px !important; | ||
| 192 | + font-size: 24px; | ||
| 193 | + text-decoration: none; | ||
| 194 | + } | ||
| 195 | + | ||
| 196 | + .page-logo .logo-default.logo-default-text:HOVER { | ||
| 197 | + color: #dedede !important; | ||
| 198 | + } | ||
| 199 | + | ||
| 200 | + body,.page-content-wrapper,#pjax-container{ | ||
| 201 | + height: 100%; | ||
| 202 | + } | ||
| 203 | + html{ | ||
| 204 | + height: 90%; | ||
| 205 | + } | ||
| 206 | + .page-container{ | ||
| 207 | + height: 100%; | ||
| 208 | + } | ||
| 209 | + </style> | ||
| 210 | + | ||
| 211 | + <!-- ocLazyLoading载入文件的位置 --> | ||
| 212 | + <link id="ng_load_plugins_before" /> | ||
| 213 | + | ||
| 214 | +</head> | ||
| 215 | +<body | ||
| 216 | + class="page-container-bg-solid page-header-fixed page-sidebar-closed-hide-logo page-sidebar-fixed"> | ||
| 217 | +<div class="page-header navbar navbar-fixed-top" | ||
| 218 | + style="background: linear-gradient(to bottom, #124e78, #125688);"> | ||
| 219 | + <div class="page-header-inner "> | ||
| 220 | + <!-- LOGO --> | ||
| 221 | + <div class="page-logo"> | ||
| 222 | + <a href="index.html" class="logo-default logo-default-text"> | ||
| 223 | + 青浦公交调度系统 </a> | ||
| 224 | + <div class="menu-toggler sidebar-toggler"></div> | ||
| 225 | + </div> | ||
| 226 | + <!-- END LOGO --> | ||
| 227 | + <a href="javascript:;" class="menu-toggler responsive-toggler" | ||
| 228 | + data-toggle="collapse" data-target=".navbar-collapse"> </a> | ||
| 229 | + <div class="page-top"> | ||
| 230 | + <div class="top-menu"> | ||
| 231 | + <ul class="nav navbar-nav pull-right"> | ||
| 232 | + <!-- 信息通知区 --> | ||
| 233 | + <li | ||
| 234 | + class="dropdown dropdown-extended dropdown-notification dropdown-dark" | ||
| 235 | + id="header_notification_bar"><a href="javascript:;" | ||
| 236 | + class="dropdown-toggle" data-toggle="dropdown" | ||
| 237 | + data-hover="dropdown" data-close-others="true"> <i | ||
| 238 | + class="fa fa-bell"></i> <span class="badge badge-success"> | ||
| 239 | + 0 </span> | ||
| 240 | + </a> | ||
| 241 | + <ul class="dropdown-menu" style="max-width: 345px; width: 345px;"> | ||
| 242 | + <li class="external"> | ||
| 243 | + <h3> | ||
| 244 | + 今日 <span class="bold">0 条</span> 通知 | ||
| 245 | + </h3> <a href="javascript:;">查看全部</a> | ||
| 246 | + </li> | ||
| 247 | + <li> | ||
| 248 | + <ul class="dropdown-menu-list scroller" style="height: 250px;" | ||
| 249 | + data-handle-color="#637283"> | ||
| 250 | + </ul> | ||
| 251 | + </li> | ||
| 252 | + </ul></li> | ||
| 253 | + <li class="dropdown dropdown-user dropdown-dark"><a | ||
| 254 | + href="javascript:;" class="dropdown-toggle" | ||
| 255 | + data-toggle="dropdown" data-hover="dropdown" | ||
| 256 | + data-close-others="true"> <span id="indexTopUName" | ||
| 257 | + class="username username-hide-on-mobile" | ||
| 258 | + style="vertical-align: middle;"> <i class="fa fa-user"></i></span> | ||
| 259 | + </a> | ||
| 260 | + <ul class="dropdown-menu dropdown-menu-default"> | ||
| 261 | + <li><a href="javascript:;"> <i class="fa fa-user"></i> | ||
| 262 | + 我的信息 | ||
| 263 | + </a></li> | ||
| 264 | + <li><a href="javascript:;" id="changePWD"> <i | ||
| 265 | + class="fa fa-unlock-alt"></i> 修改密码 | ||
| 266 | + </a></li> | ||
| 267 | + <li class="divider"></li> | ||
| 268 | + <li><a href="javascript:;"> <i class="fa fa-lock"></i> | ||
| 269 | + 锁屏 | ||
| 270 | + </a></li> | ||
| 271 | + <li><a href="/logout"> <i class="fa fa-key"></i> 注销登陆 | ||
| 272 | + </a></li> | ||
| 273 | + </ul></li> | ||
| 274 | + </ul> | ||
| 275 | + </div> | ||
| 276 | + </div> | ||
| 277 | + </div> | ||
| 278 | +</div> | ||
| 279 | +<div class="page-container"> | ||
| 280 | + <div class="page-sidebar-wrapper"> | ||
| 281 | + <div class="page-sidebar navbar-collapse collapse"> | ||
| 282 | + <ul class="page-sidebar-menu page-sidebar-menu-fixed" | ||
| 283 | + data-keep-expanded="false" data-auto-scroll="true" | ||
| 284 | + data-slide-speed="200" id="leftMenuSidebar"> | ||
| 285 | + </ul> | ||
| 286 | + </div> | ||
| 287 | + </div> | ||
| 288 | + <div class="page-content-wrapper"> | ||
| 289 | + <div id="pjax-container" class="page-content"></div> | ||
| 290 | + <a name="xd_position"></a> | ||
| 291 | + <div id="route-container"> | ||
| 292 | + <div ng-app="ScheduleApp"> | ||
| 293 | + <div ng-controller="ScheduleAppController"> | ||
| 294 | + | ||
| 295 | + <!-- loading widget --> | ||
| 296 | + <div id="loadingWidget" class="flyover mask" loading-widget> | ||
| 297 | + <div class="alert alert-info"> | ||
| 298 | + <strong>载入中......</strong> | ||
| 299 | + </div> | ||
| 300 | + </div> | ||
| 301 | + | ||
| 302 | + <div ui-view class="uv"></div> | ||
| 303 | + </div> | ||
| 304 | + </div> | ||
| 305 | + </div> | ||
| 306 | + </div> | ||
| 307 | +</div> | ||
| 308 | + | ||
| 309 | +<script id="menu_list_temp" type="text/html"> | ||
| 310 | + {{each list as group i}} | ||
| 311 | + <li class="heading"> | ||
| 312 | + <h3 class="uppercase">{{group.name}}</h3> | ||
| 313 | + </li> | ||
| 314 | + {{each group.children as dir j}} | ||
| 315 | + <li class="nav-item"> | ||
| 316 | + <a href="javascript:;" class="nav-link nav-toggle "> | ||
| 317 | + <i class="{{dir.icon}}"></i> | ||
| 318 | + <span class="title">{{dir.name}}</span> | ||
| 319 | + <span class="arrow"></span> | ||
| 320 | + </a> | ||
| 321 | + <ul class="sub-menu"> | ||
| 322 | + {{each dir.children as module s}} | ||
| 323 | + <li class="nav-item "> | ||
| 324 | + {{if module.container=="pjax-container"}} | ||
| 325 | + <a href="/pages/{{module.path}}" class="nav-link " data-pjax> | ||
| 326 | + <span class="title">{{module.name}}</span> | ||
| 327 | + </a> | ||
| 328 | + {{else}} | ||
| 329 | + <a href="{{module.path}}" class="nav-link " data-angularjs> | ||
| 330 | + <span class="title">{{module.name}}</span> | ||
| 331 | + </a> | ||
| 332 | + {{/if}} | ||
| 333 | + </li> | ||
| 334 | + {{/each}} | ||
| 335 | + </ul> | ||
| 336 | + </li> | ||
| 337 | + {{/each}} | ||
| 338 | + {{/each}} | ||
| 339 | + | ||
| 340 | +</script> | ||
| 341 | +<script> | ||
| 342 | + delete window.require; | ||
| 343 | + delete window.exports; | ||
| 344 | + delete window.module; | ||
| 345 | +</script> | ||
| 346 | +<!-- jQuery --> | ||
| 347 | +<script src="/metronic_v4.5.4/plugins/jquery.min.js" data-exclude=1></script> | ||
| 348 | +<!-- bootstrap --> | ||
| 349 | +<script src="/metronic_v4.5.4/plugins/bootstrap/js/bootstrap.min.js" | ||
| 350 | + data-exclude=1></script> | ||
| 351 | +<script src="/pages/forms/statement/js/jquery.autocompleter.js"></script> | ||
| 352 | +<script src="/pages/forms/statement/js/jquery.PrintArea.js"></script> | ||
| 353 | +<!-- MTRONIC JS --> | ||
| 354 | +<script src="/metronic_v4.5.4/scripts/app.min.js" data-exclude=1></script> | ||
| 355 | +<script src="/metronic_v4.5.4/layout4/scripts/layout.min.js" | ||
| 356 | + data-exclude=1></script> | ||
| 357 | +<!-- 虚拟滚动条 --> | ||
| 358 | +<script | ||
| 359 | + src="/metronic_v4.5.4/plugins/jquery-slimscroll/jquery.slimscroll.min.js"></script> | ||
| 360 | +<!-- jsTree 树插件 --> | ||
| 361 | +<script src="/metronic_v4.5.4/plugins/jstree/dist/jstree.min.js"></script> | ||
| 362 | +<!-- bootstrap-hover-dropDown --> | ||
| 363 | +<script | ||
| 364 | + src="/metronic_v4.5.4/plugins/bootstrap-hover-dropdown/bootstrap-hover-dropdown.min.js"></script> | ||
| 365 | +<!-- jquery.validate 表单验证 --> | ||
| 366 | +<script | ||
| 367 | + src="/metronic_v4.5.4/plugins/jquery-validation/js/jquery.validate.min.js"></script> | ||
| 368 | +<script | ||
| 369 | + src="/metronic_v4.5.4/plugins/jquery-validation/js/localization/messages_zh.js"></script> | ||
| 370 | +<!-- 向导式插件 --> | ||
| 371 | +<script | ||
| 372 | + src="/metronic_v4.5.4//plugins/bootstrap-wizard/jquery.bootstrap.wizard.min.js"></script> | ||
| 373 | +<!-- iCheck 单选框和复选框 --> | ||
| 374 | +<script src="/metronic_v4.5.4/plugins/icheck/icheck.min.js"></script> | ||
| 375 | +<!-- select2 下拉框 --> | ||
| 376 | +<script src="/metronic_v4.5.4/plugins/select2/js/select2.full.min.js"></script> | ||
| 377 | +<!-- MULTI SELECT 多选下拉框 --> | ||
| 378 | +<script | ||
| 379 | + src="/metronic_v4.5.4/plugins/jquery-multi-select/js/jquery.multi-select.js"></script> | ||
| 380 | +<!-- editable.js --> | ||
| 381 | +<script | ||
| 382 | + src="/metronic_v4.5.4/plugins/bootstrap-editable/bootstrap-editable/js/bootstrap-editable.min.js"></script> | ||
| 383 | +<!-- PJAX --> | ||
| 384 | +<script src="/assets/plugins/jquery.pjax.js"></script> | ||
| 385 | +<!-- layer 弹层 --> | ||
| 386 | +<script src="/assets/plugins/layer-v2.4/layer/layer.js" data-exclude=1></script> | ||
| 387 | +<!-- fileinput 上传 --> | ||
| 388 | +<script src="/assets/plugins/fileinput/canvas-to-blob.min.js"></script> | ||
| 389 | +<script src="/assets/plugins/fileinput/purify.min.js"></script> | ||
| 390 | +<script src="/assets/plugins/fileinput/sortable.min.js"></script> | ||
| 391 | +<script src="/assets/plugins/fileinput/fileinput.min.js"></script> | ||
| 392 | +<script src="/assets/plugins/fileinput/fileinput_locale_zh.js"></script> | ||
| 393 | +<!-- jquery.purl URL解析 --> | ||
| 394 | +<script src="/assets/plugins/purl.js"></script> | ||
| 395 | +<!-- jquery.serializejson JSON序列化插件 --> | ||
| 396 | +<script src="/assets/plugins/jquery.serializejson.js"></script> | ||
| 397 | +<!-- art-template 模版引擎 --> | ||
| 398 | +<script src="/assets/plugins/template.js"></script> | ||
| 399 | +<!-- jquery.pageinator 分页 --> | ||
| 400 | +<script src="/assets/plugins/jqPaginator.min.js"></script> | ||
| 401 | +<!-- moment.js 日期处理类库 --> | ||
| 402 | +<script src="/assets/plugins/moment-with-locales.js"></script> | ||
| 403 | + | ||
| 404 | +<script src="/assets/plugins/pinyin.js"></script> | ||
| 405 | +<!-- 日期控件 --> | ||
| 406 | +<script | ||
| 407 | + src="/metronic_v4.5.4/plugins/bootstrap-datetimepicker-2/js/bootstrap-datetimepicker.min.js"></script> | ||
| 408 | +<!-- 表格控件 --> | ||
| 409 | +<script src="/metronic_v4.5.4/plugins/bootstrap-tagsinput/bootstrap-tagsinput.min.js"></script> | ||
| 410 | +<!-- 统计图控件 --> | ||
| 411 | +<!--<script src="/assets/global/getEchart.js"></script> | ||
| 412 | +<script src="/assets/global/echarts.js"></script> --> | ||
| 413 | +<script src="/assets/js/common.js"></script> | ||
| 414 | +<script src="/assets/js/dictionary.js"></script> | ||
| 415 | +<!-- tipso JS --> | ||
| 416 | +<script src="/metronic_v4.5.4/plugins/tipso/js/tipso.js"></script> | ||
| 417 | +<script data-exclude=1> | ||
| 418 | + //初始打开的片段地址 | ||
| 419 | + var initFragment = "^_^initFragment^_^"; | ||
| 420 | + //静态文件目录 | ||
| 421 | + var dir = '/pages/'; | ||
| 422 | + //片段容器 | ||
| 423 | + var pjaxContainer = '#pjax-container' | ||
| 424 | + , angJsContainer = '#route-container'; | ||
| 425 | + | ||
| 426 | + $(document).ajaxError(function (event, jqxhr, settings, thrownError) { | ||
| 427 | + if(jqxhr.status == 403){ | ||
| 428 | + layer.closeAll(); | ||
| 429 | + layer.alert(jqxhr.message?jqxhr.message:'访问被拒绝', {icon: 2, title: '操作失败'}); | ||
| 430 | + } | ||
| 431 | + }); | ||
| 432 | + | ||
| 433 | + $(function () { | ||
| 434 | + $.ajax({ | ||
| 435 | + url: '/user/isWeakCipher', | ||
| 436 | + type: 'POST', | ||
| 437 | + async: false, | ||
| 438 | + success: function (result,status,xhr) { | ||
| 439 | + if (result.data == 1) { | ||
| 440 | + $.get('/pages/permission/user/forceChangePWD.html', function (content) { | ||
| 441 | + layer.open({ | ||
| 442 | + type: 1, | ||
| 443 | + area: ['600px', '360px'], | ||
| 444 | + content: content, | ||
| 445 | + title: '修改密码', | ||
| 446 | + shift: 5, | ||
| 447 | + scrollbar: false, | ||
| 448 | + closeBtn: 0, | ||
| 449 | + success: function () { | ||
| 450 | + } | ||
| 451 | + }); | ||
| 452 | + }); | ||
| 453 | + } | ||
| 454 | + } | ||
| 455 | + }); | ||
| 456 | + | ||
| 457 | + $.get('/user/currentUser', function (user) { | ||
| 458 | + $('#indexTopUName').text(user.userName); | ||
| 459 | + }); | ||
| 460 | + | ||
| 461 | + //带 data-pjax 的链接由pjax加载 | ||
| 462 | + $(document).pjax('a[data-pjax]', pjaxContainer); | ||
| 463 | + | ||
| 464 | + //pjax左菜单点击事件 | ||
| 465 | + $(document).on('click', '#leftMenuSidebar a[data-pjax]', function () { | ||
| 466 | + setTitle(this); | ||
| 467 | + | ||
| 468 | + $('#leftMenuSidebar li.nav-item.active').removeClass('active'); | ||
| 469 | + $(this).parent().addClass('active'); | ||
| 470 | + showPjax(); | ||
| 471 | + }); | ||
| 472 | + | ||
| 473 | + //angularjs左菜单点击事件 | ||
| 474 | + $(document).on('click', '#leftMenuSidebar a[data-angularjs]', function () { | ||
| 475 | + setTitle(this); | ||
| 476 | + | ||
| 477 | + $('#leftMenuSidebar li.nav-item.active').removeClass('active'); | ||
| 478 | + $(this).parent().addClass('active'); | ||
| 479 | + showAngJs(); | ||
| 480 | + }); | ||
| 481 | + | ||
| 482 | + //加载左菜单栏 | ||
| 483 | + $get('/module/findByCurrentUser', null, | ||
| 484 | + function (ms) { | ||
| 485 | + var treeArray = createTreeData(ms); | ||
| 486 | + treeArray.sort(function (a, b) { | ||
| 487 | + return a.createDate - b.createDate; | ||
| 488 | + }); | ||
| 489 | + var menuHtml = template('menu_list_temp', {list: treeArray}); | ||
| 490 | + $('#leftMenuSidebar').html(menuHtml); | ||
| 491 | + | ||
| 492 | + //----------- 检查URL ---------------- | ||
| 493 | + var h = location.hash; | ||
| 494 | + if (initFragment && initFragment != '') { | ||
| 495 | + showPjax(); | ||
| 496 | + //普通片段 | ||
| 497 | + loadPage(initFragment); | ||
| 498 | + //选中菜单 | ||
| 499 | + $.each($('#leftMenuSidebar a'), function (i, item) { | ||
| 500 | + if (urlPattern($(item).attr('href'), initFragment)) { | ||
| 501 | + activeLeftMenu(item); | ||
| 502 | + } | ||
| 503 | + }); | ||
| 504 | + } else if (h) { | ||
| 505 | + //angularjs片段 | ||
| 506 | + showAngJs(); | ||
| 507 | + //选中菜单 | ||
| 508 | + $.each($('#leftMenuSidebar a'), function (i, item) { | ||
| 509 | + if ($(item).attr('href') == h) { | ||
| 510 | + activeLeftMenu(item); | ||
| 511 | + } | ||
| 512 | + }); | ||
| 513 | + } | ||
| 514 | + else { | ||
| 515 | + //加载主页 | ||
| 516 | + loadPage('/pages/home.html'); | ||
| 517 | + } | ||
| 518 | + }); | ||
| 519 | + | ||
| 520 | + //修改密码 | ||
| 521 | + $('#changePWD').on('click', function () { | ||
| 522 | + $.get('/pages/permission/user/changePWD.html', function (content) { | ||
| 523 | + layer.open({ | ||
| 524 | + type: 1, | ||
| 525 | + area: ['600px', '360px'], | ||
| 526 | + content: content, | ||
| 527 | + title: '修改密码', | ||
| 528 | + shift: 5, | ||
| 529 | + scrollbar: false, | ||
| 530 | + success: function () { | ||
| 531 | + } | ||
| 532 | + }); | ||
| 533 | + }); | ||
| 534 | + }); | ||
| 535 | + }); | ||
| 536 | + | ||
| 537 | + //modal关闭时销毁dom | ||
| 538 | + $(document).on('hidden.bs.modal', '.modal', function () { | ||
| 539 | + $(this).remove(); | ||
| 540 | + }); | ||
| 541 | + | ||
| 542 | + //pjax加载完成事件 | ||
| 543 | + $(document).on('pjax:success', function () { | ||
| 544 | + var dicts = $(pjaxContainer).find('.nt-dictionary'); | ||
| 545 | + dictionaryUtils.transformDom(dicts); | ||
| 546 | + }); | ||
| 547 | + | ||
| 548 | + function loadPage(url) { | ||
| 549 | + $.pjax({url: url, container: pjaxContainer}) | ||
| 550 | + } | ||
| 551 | + | ||
| 552 | + function urlPattern(a, b) { | ||
| 553 | + var r; | ||
| 554 | + try { | ||
| 555 | + r = a.substring(0, a.lastIndexOf('/')) == b.substring(0, b.lastIndexOf('/')); | ||
| 556 | + } catch (e) { | ||
| 557 | + r = false; | ||
| 558 | + } | ||
| 559 | + return r; | ||
| 560 | + } | ||
| 561 | + | ||
| 562 | + function showPjax() { | ||
| 563 | + $(angJsContainer).removeClass('page-content active').hide(); | ||
| 564 | + $(pjaxContainer).addClass('page-content active'); | ||
| 565 | + } | ||
| 566 | + | ||
| 567 | + function showAngJs() { | ||
| 568 | + $(pjaxContainer).html('').removeClass('page-content active').hide(); | ||
| 569 | + $(angJsContainer).addClass('page-content active'); | ||
| 570 | + } | ||
| 571 | + | ||
| 572 | + function activeLeftMenu(item) { | ||
| 573 | + $(item).parent('.nav-item').addClass('active').parent('.sub-menu').show().parent().addClass('open'); | ||
| 574 | + setTitle(item); | ||
| 575 | + } | ||
| 576 | + | ||
| 577 | + function setTitle(menuItem){ | ||
| 578 | + document.title = $('span.title', menuItem).text(); | ||
| 579 | + } | ||
| 580 | + | ||
| 581 | +</script> | ||
| 582 | +<!-- d3 --> | ||
| 583 | +<script src="/assets/js/d3.min.js" data-exclude=1></script> | ||
| 584 | +<!-- webSocket JS --> | ||
| 585 | +<script src="/assets/js/sockjs.min.js"></script> | ||
| 586 | + | ||
| 587 | +<!-- TODO:angularJS相关库 --> | ||
| 588 | + | ||
| 589 | +<!-- angularJS相关库 --> | ||
| 590 | +<!-- 这个是基于angularjs 1.4.10修改的版本,主要是修改了history控制部分,用于兼容route和pjax的同时操作history的冲突 --> | ||
| 591 | +<script src="/assets/js/angular.js" data-autocephaly=1></script> | ||
| 592 | +<script src="/assets/bower_components/angular-i18n/angular-locale_zh-cn.js" data-autocephaly=1></script> | ||
| 593 | +<script | ||
| 594 | + src="/assets/bower_components/angular-resource/angular-resource.min.js" | ||
| 595 | + data-exclude=1></script> | ||
| 596 | +<script | ||
| 597 | + src="/assets/bower_components/angular-sanitize/angular-sanitize.min.js" | ||
| 598 | + data-exclude=1></script> | ||
| 599 | +<script | ||
| 600 | + src="/assets/bower_components/angular-animate/angular-animate.min.js" | ||
| 601 | + data-exclude=1></script> | ||
| 602 | +<script | ||
| 603 | + src="/assets/bower_components/angular-touch/angular-touch.min.js" | ||
| 604 | + data-exclude=1></script> | ||
| 605 | +<script | ||
| 606 | + src="/assets/bower_components/angular-ui-router/release/angular-ui-router.min.js" | ||
| 607 | + data-exclude=1></script> | ||
| 608 | +<script | ||
| 609 | + src="/assets/bower_components/oclazyload/dist/ocLazyLoad.min.js" | ||
| 610 | + data-exclude=1></script> | ||
| 611 | +<script | ||
| 612 | + src="/assets/bower_components/angular-bootstrap/ui-bootstrap-tpls.min.js" | ||
| 613 | + data-exclude=1></script> | ||
| 614 | +<!-- handsontable相关js --> | ||
| 615 | +<script | ||
| 616 | + src="/assets/bower_components/handsontable/dist/handsontable.full.js"></script> | ||
| 617 | +<script | ||
| 618 | + src="/assets/bower_components/ngHandsontable/dist/ngHandsontable.js"></script> | ||
| 619 | +<!-- sweetalert相关js --> | ||
| 620 | +<script src="/assets/bower_components/sweetalert/dist/sweetalert.min.js"></script> | ||
| 621 | +<script src="/assets/bower_components/ng-sweet-alert/ng-sweet-alert.js"></script> | ||
| 622 | + | ||
| 623 | +<!-- schedule计划调度AngularJS模块主JS --> | ||
| 624 | +<script src="/pages/scheduleApp/module/common/main.js" data-exclude=1></script> | ||
| 625 | +<script | ||
| 626 | + src="/pages/scheduleApp/module/common/prj-common-globalservice.js" | ||
| 627 | + data-exclude=1></script> | ||
| 628 | +<script src="/pages/scheduleApp/module/common/prj-common-filter.js" | ||
| 629 | + data-exclude=1></script> | ||
| 630 | +<script src="/pages/scheduleApp/module/common/prj-common-directive.js" | ||
| 631 | + data-exclude=1></script> | ||
| 632 | +<script | ||
| 633 | + src="/pages/scheduleApp/module/common/prj-common-ui-route-state.js" | ||
| 634 | + data-exclude=1></script> | ||
| 635 | + | ||
| 636 | +<!-- 地图相关 --> | ||
| 637 | +<!-- 百度 --> | ||
| 638 | +<script | ||
| 639 | + src="//api.map.baidu.com/api?v=2.0&ak=1TgEKvYqohJyeGXnN6yHSSTb4psOarQw" | ||
| 640 | + data-exclude=1></script> | ||
| 641 | +<script | ||
| 642 | + src="http://api.map.baidu.com/library/TrafficControl/1.4/src/TrafficControl_min.js" | ||
| 643 | + data-exclude=1></script> | ||
| 644 | +<script type="text/javascript" | ||
| 645 | + src="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.js" | ||
| 646 | + data-exclude=1></script> | ||
| 647 | +<script type="text/javascript" | ||
| 648 | + src="http://api.map.baidu.com/library/RichMarker/1.2/src/RichMarker_min.js " | ||
| 649 | + data-exclude=1></script> | ||
| 650 | +<script src="/assets/js/baidu/TextIconOverlay.js" data-exclude=1></script> | ||
| 651 | +<script src="/assets/js/baidu//MarkerClusterer.js" data-exclude=1></script> | ||
| 652 | +<!-- 高德 --> | ||
| 653 | +<script | ||
| 654 | + src="http://webapi.amap.com/maps?v=1.3&key=16cb1c5043847e09ef9edafdd77befda" | ||
| 655 | + data-exclude=1></script> | ||
| 656 | +<!-- echarts4 误删 --> | ||
| 657 | +<script src="/metronic_v4.5.4/plugins/echarts4/echarts.min.js"></script> | ||
| 658 | +<script src="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.jquery.js" merge="plugins"></script> | ||
| 659 | +<!-- RSA加密 --> | ||
| 660 | +<script src="/assets/plugins/jsencrypt.min.js"></script> | ||
| 661 | +<script src="/assets/js/eventproxy.js"></script> | ||
| 662 | +</body> | ||
| 638 | </html> | 663 | </html> |
| 639 | \ No newline at end of file | 664 | \ No newline at end of file |
src/main/resources/static/login.html
| 1 | -<!DOCTYPE html> | ||
| 2 | -<html lang="zh"> | ||
| 3 | -<head> | ||
| 4 | - <meta name="renderer" content="webkit" /> | ||
| 5 | - <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> | ||
| 6 | - <meta charset="utf-8" /> | ||
| 7 | - <title>登录</title> | ||
| 8 | - <link | ||
| 9 | - href="/metronic_v4.5.4/plugins/font-awesome/css/font-awesome.min.css" | ||
| 10 | - rel="stylesheet" type="text/css" /> | ||
| 11 | - <!-- Bootstrap style --> | ||
| 12 | - <link href="/metronic_v4.5.4/plugins/bootstrap/css/bootstrap.min.css" | ||
| 13 | - rel="stylesheet" type="text/css" /> | ||
| 14 | - | ||
| 15 | - <!-- METRONIC style --> | ||
| 16 | - <link href="/metronic_v4.5.4/css/components.css" rel="stylesheet" | ||
| 17 | - type="text/css" /> | ||
| 18 | - | ||
| 19 | - <style type="text/css"> | ||
| 20 | - body>.wrapper { | ||
| 21 | - background-image: url(/assets/img/bg_9b9dcb65ff.png); | ||
| 22 | - background-size: 100px; | ||
| 23 | - background-repeat: repeat; | ||
| 24 | - min-height: 800px; | ||
| 25 | - min-width: 630px; | ||
| 26 | - position: absolute; | ||
| 27 | - top: 0; | ||
| 28 | - bottom: 0; | ||
| 29 | - left: 0; | ||
| 30 | - right: 0; | ||
| 31 | - } | ||
| 32 | - | ||
| 33 | - #loginPanel.dialog-shadow { | ||
| 34 | - width: 450px; | ||
| 35 | - /* height: 400px; */ | ||
| 36 | - border: 1px solid #dadada; | ||
| 37 | - border-radius: 10px !important; | ||
| 38 | - position: absolute; | ||
| 39 | - box-shadow: 0 9px 30px -6px rgba(0, 0, 0, .2), 0 18px 20px -10px | ||
| 40 | - rgba(0, 0, 0, .04), 0 18px 20px -10px rgba(0, 0, 0, .04), 0 10px 20px | ||
| 41 | - -10px rgba(0, 0, 0, .04); | ||
| 42 | - background: url(/assets/img/dialog-gray-bg_42c40b3eb6.png) #fff bottom | ||
| 43 | - repeat-x; | ||
| 44 | - top: 50%; | ||
| 45 | - left: 50%; | ||
| 46 | - margin-left: -225px; | ||
| 47 | - margin-top: -300px; | ||
| 48 | - text-align: center; | ||
| 49 | - color: #333; | ||
| 50 | - opacity: .5; | ||
| 51 | - | ||
| 52 | - padding-bottom: 56px; | ||
| 53 | - | ||
| 54 | - animation: to_center 1s forwards; | ||
| 55 | - animation-delay: .2s; | ||
| 56 | - | ||
| 57 | - transition: all .3s ease; | ||
| 58 | - } | ||
| 59 | - | ||
| 60 | - @keyframes to_center | ||
| 61 | - { | ||
| 62 | - 0% {margin-top: -300px;opacity: .5;} | ||
| 63 | - 100% {margin-top: -270px;opacity: 1;} | ||
| 64 | - } | ||
| 65 | - | ||
| 66 | - | ||
| 67 | - h3 { | ||
| 68 | - font-size: 25px; | ||
| 69 | - font-weight: 600; | ||
| 70 | - color: #4a4a4a | ||
| 71 | - } | ||
| 72 | - | ||
| 73 | - .input-icon input { | ||
| 74 | - height: 48px; | ||
| 75 | - border-radius: 5px !important; | ||
| 76 | - transition: all .5s ease; | ||
| 77 | - } | ||
| 78 | - | ||
| 79 | - .input-icon input:FOCUS { | ||
| 80 | - border-color: #c2cad8; | ||
| 81 | - box-shadow: 0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12) !important; | ||
| 82 | - } | ||
| 83 | - | ||
| 84 | - .input-icon>i { | ||
| 85 | - margin-top: 16px; | ||
| 86 | - } | ||
| 87 | - | ||
| 88 | - #loginPanel #loginBtn.btn{ | ||
| 89 | - border-radius: 6px !important; | ||
| 90 | - width: 378px; | ||
| 91 | - height: 48px; | ||
| 92 | - font-size: 20px; | ||
| 93 | - font-family: 微软雅黑; | ||
| 94 | - transition: all .3s ease; | ||
| 95 | - | ||
| 96 | - background: #5f7ed7; | ||
| 97 | - background: linear-gradient(#6f97e5,#527ed9); | ||
| 98 | - box-shadow: inset 0 1px 2px #7ea1e8 !important; | ||
| 99 | - color: #fff; | ||
| 100 | - text-shadow: #4f70b3 0 -1px 0; | ||
| 101 | - border: none; | ||
| 102 | - } | ||
| 103 | - | ||
| 104 | - #loginPanel #loginBtn.btn:HOVER { | ||
| 105 | - box-shadow: inset 0 1px 1px #7696de,inset 0 0 2px #627dca,inset 0 -2px 3px #5a77c7,inset 0 0 100px rgba(48,77,147,.4) !important; | ||
| 106 | - } | ||
| 107 | - | ||
| 108 | - | ||
| 109 | - #loginPanel.show_msg{ | ||
| 110 | - top: calc(50% - 10px); | ||
| 111 | - } | ||
| 112 | - | ||
| 113 | - #loginPanel .alert{ | ||
| 114 | - display: none; | ||
| 115 | - padding: 12px; | ||
| 116 | - margin-top: 21px; | ||
| 117 | - border-radius: 0 0 10px 10px !important; | ||
| 118 | - font-size: 13px; | ||
| 119 | - | ||
| 120 | - position: absolute; | ||
| 121 | - width: 100%; | ||
| 122 | - border-bottom: 1px solid #dadada; | ||
| 123 | - } | ||
| 124 | - | ||
| 125 | - #loginPanel .alert.login-success{ | ||
| 126 | - color: #27a4b0; | ||
| 127 | - background: #abe7ed; | ||
| 128 | - border-color: #abe7ed; | ||
| 129 | - } | ||
| 130 | - | ||
| 131 | - #loginPanel .alert i{ | ||
| 132 | - font-size: 16px; | ||
| 133 | - vertical-align: middle; | ||
| 134 | - margin: 0 5px 3px; | ||
| 135 | - } | ||
| 136 | - | ||
| 137 | - #loginPanel.show_msg .alert{ | ||
| 138 | - display: block; | ||
| 139 | - } | ||
| 140 | - | ||
| 141 | - #captchaWrap{ | ||
| 142 | - display: none; | ||
| 143 | - text-align: left; | ||
| 144 | - border-top: 1px solid #f3f2f2; | ||
| 145 | - } | ||
| 146 | - | ||
| 147 | - img.captcha-img{ | ||
| 148 | - cursor: pointer; | ||
| 149 | - } | ||
| 150 | - | ||
| 151 | - .login-footer{ | ||
| 152 | - position: fixed; | ||
| 153 | - width: 100%; | ||
| 154 | - bottom: 35px; | ||
| 155 | - text-align: center; | ||
| 156 | - color: #a6a6a6; | ||
| 157 | - } | ||
| 158 | - | ||
| 159 | - h3.logo-text{ | ||
| 160 | - font-family: 华文楷体,华文细黑; | ||
| 161 | - font-size: 28px; | ||
| 162 | - } | ||
| 163 | - | ||
| 164 | - .warn-note{ | ||
| 165 | - width: 100%; | ||
| 166 | - position: absolute; | ||
| 167 | - top: 0; | ||
| 168 | - z-index: 2; | ||
| 169 | - text-align: center; | ||
| 170 | - background: #ff4646; | ||
| 171 | - color: white; | ||
| 172 | - padding: 12px; | ||
| 173 | - display: none; | ||
| 174 | - } | ||
| 175 | - </style> | ||
| 176 | -</head> | ||
| 177 | - | ||
| 178 | -<body> | ||
| 179 | -<div class="warn-note">警告!系统目前仅在 WebKit 内核下完成兼容性测试,请使用 Google | ||
| 180 | - Chrome 浏览器进入系统。</div> | ||
| 181 | -<div class="wrapper ng-scope"> | ||
| 182 | - <div id="loginPanel" class="dialog dialog-shadow"> | ||
| 183 | - <br> | ||
| 184 | - <h3 class="logo-text">青浦公交调度系统</h3> | ||
| 185 | - <hr> | ||
| 186 | - <form style="padding: 0px 35px;"> | ||
| 187 | - <div class="form-group" style="margin-bottom: 0"> | ||
| 188 | - <label></label> | ||
| 189 | - <div class="input-icon"> | ||
| 190 | - <i class="fa fa-user font-gray"></i> <input type="text" | ||
| 191 | - name="userName" class="form-control" placeholder="输入用户名" | ||
| 192 | - autofocus="autofocus" autocomplete="off"> | ||
| 193 | - </div> | ||
| 194 | - </div> | ||
| 195 | - | ||
| 196 | - <div class="form-group"> | ||
| 197 | - <label></label> | ||
| 198 | - <div class="input-icon"> | ||
| 199 | - <i class="fa fa-key font-gray"></i> <input type="password" | ||
| 200 | - name="password" class="form-control" placeholder="输入密码"> | ||
| 201 | - </div> | ||
| 202 | - </div> | ||
| 203 | - | ||
| 204 | - <div class="form-group" id="captchaWrap"> | ||
| 205 | - <label></label> | ||
| 206 | - <div class="input-icon"> | ||
| 207 | - <input type="text" name="captcha" style="width: 153px !important;" | ||
| 208 | - class="form-control input-inline input-medium" | ||
| 209 | - placeholder="输入验证码"> <span class="help-inline"> <img | ||
| 210 | - alt="验证码" class="captcha-img" title="点击刷新验证码"> | ||
| 211 | - </span> | ||
| 212 | - </div> | ||
| 213 | - </div> | ||
| 214 | - </form> | ||
| 215 | - <br> | ||
| 216 | - <br> | ||
| 217 | - <div class="form-actions"> | ||
| 218 | - <button class="btn blue-steel" id="loginBtn" disabled="disabled">登录</button> | ||
| 219 | - </div> | ||
| 220 | - | ||
| 221 | - <div class="alert alert-danger"></div> | ||
| 222 | - </div> | ||
| 223 | - | ||
| 224 | - <div class="login-footer">© 2016 上海巴士拓华科技发展有限公司 Some Rights | ||
| 225 | - Reserved</div> | ||
| 226 | -</div> | ||
| 227 | - | ||
| 228 | -<script> | ||
| 229 | - delete window.require; | ||
| 230 | - delete window.exports; | ||
| 231 | - delete window.module; | ||
| 232 | -</script> | ||
| 233 | -<!-- jQuery --> | ||
| 234 | -<script src="/metronic_v4.5.4/plugins/jquery.min.js"></script> | ||
| 235 | -<script src="/assets/plugins/jsencrypt.min.js"></script> | ||
| 236 | -<script> | ||
| 237 | - window.onload=function(){ | ||
| 238 | - var body=document.getElementsByTagName("body")[0]; | ||
| 239 | - if(typeof body.style.WebkitAnimation=="undefined") | ||
| 240 | - $('.warn-note').fadeIn(); | ||
| 241 | - }; | ||
| 242 | - !function(){ | ||
| 243 | - var form = $('#loginPanel form') | ||
| 244 | - ,nameInput = $('input[name=userName]', form) | ||
| 245 | - ,pwdInput = $('input[name=password]', form) | ||
| 246 | - ,msgAlert = $('#loginPanel .alert-danger'); | ||
| 247 | - | ||
| 248 | - $('input', form).on('keyup', checkBtnStatus); | ||
| 249 | - | ||
| 250 | - var keys; | ||
| 251 | - $.get('/user/login/jCryptionKey?t='+Math.random(), function(data){ | ||
| 252 | - keys = data.publickey; | ||
| 253 | - }); | ||
| 254 | - | ||
| 255 | - | ||
| 256 | - | ||
| 257 | - function checkBtnStatus(){ | ||
| 258 | - var es = $('input:visible', form); | ||
| 259 | - for(var i = 0, e; e = es[i++];){ | ||
| 260 | - if($.trim($(e).val()) == ''){ | ||
| 261 | - $('#loginBtn').attr('disabled', 'disabled'); | ||
| 262 | - $('#loginPanel').removeClass('show_msg'); | ||
| 263 | - return; | ||
| 264 | - } | ||
| 265 | - } | ||
| 266 | - $('#loginBtn').removeAttr('disabled'); | ||
| 267 | - } | ||
| 268 | - | ||
| 269 | - nameInput.on('blur', checkStatus); | ||
| 270 | - //keyup 事件做延迟 | ||
| 271 | - var uNameKeyup; | ||
| 272 | - nameInput.on('keyup', function(){ | ||
| 273 | - if(uNameKeyup) | ||
| 274 | - return; | ||
| 275 | - uNameKeyup = true; | ||
| 276 | - setTimeout(function(){ | ||
| 277 | - checkStatus(); | ||
| 278 | - uNameKeyup = false; | ||
| 279 | - }, 200); | ||
| 280 | - }); | ||
| 281 | - | ||
| 282 | - //密码框回车事件 | ||
| 283 | - pwdInput.on('keyup', function(e){ | ||
| 284 | - if (e.keyCode == 13) | ||
| 285 | - $('#loginBtn').click(); | ||
| 286 | - }); | ||
| 287 | - //验证码框回车事件 | ||
| 288 | - $('input[name=captcha]').on('keyup', function(e){ | ||
| 289 | - if (e.keyCode == 13) | ||
| 290 | - $('#loginBtn').click(); | ||
| 291 | - }); | ||
| 292 | - | ||
| 293 | - $('#loginBtn').on('click', function(){ | ||
| 294 | - if(lock || $(this).attr('disabled')) return; | ||
| 295 | - var userName = nameInput.val() | ||
| 296 | - ,pwd = pwdInput.val(); | ||
| 297 | - | ||
| 298 | - //RSA加密 | ||
| 299 | - var encrypt = new JSEncrypt(); | ||
| 300 | - encrypt.setPublicKey(keys); | ||
| 301 | - userName = encrypt.encrypt(userName); | ||
| 302 | - pwd = encrypt.encrypt(pwd); | ||
| 303 | - //登录 | ||
| 304 | - login(userName, pwd); | ||
| 305 | - }); | ||
| 306 | - | ||
| 307 | - var lock; | ||
| 308 | - function login(userName, pwd){ | ||
| 309 | - lock = true; | ||
| 310 | - $('#loginBtn').attr('disabled', 'disabled'); | ||
| 311 | - | ||
| 312 | - var params = { | ||
| 313 | - userName: userName, | ||
| 314 | - password: pwd, | ||
| 315 | - captcha: $('input[name=captcha]').val() | ||
| 316 | - }; | ||
| 317 | - $.post('/user/login', params | ||
| 318 | - ,function(rs){ | ||
| 319 | - | ||
| 320 | - $('#loginPanel').addClass('show_msg'); | ||
| 321 | - if(error(rs)){ | ||
| 322 | - lock = false; | ||
| 323 | - $('#loginBtn').removeAttr('disabled'); | ||
| 324 | - | ||
| 325 | - msgAlert.html('<i class="fa fa-times-circle"> </i> 登录失败,' + rs.msg); | ||
| 326 | - | ||
| 327 | - _captcha.refresh(); | ||
| 328 | - checkStatus(); | ||
| 329 | - } | ||
| 330 | - else{ | ||
| 331 | - msgAlert.html('<i class="fa fa-check"> </i> 登录成功!'); | ||
| 332 | - msgAlert.addClass('login-success'); | ||
| 333 | - window.location.href = '/'; | ||
| 334 | - } | ||
| 335 | - }); | ||
| 336 | - } | ||
| 337 | - | ||
| 338 | - function checkStatus(){ | ||
| 339 | - var t = nameInput.val(); | ||
| 340 | - if(!t){ | ||
| 341 | - hide(); | ||
| 342 | - return; | ||
| 343 | - } | ||
| 344 | - | ||
| 345 | - $.get('/user/login/captchaStatus', {userName: t}, function(rs){ | ||
| 346 | - if(rs >= 3) | ||
| 347 | - _captcha.show(); | ||
| 348 | - else | ||
| 349 | - hide(); | ||
| 350 | - }); | ||
| 351 | - | ||
| 352 | - function hide(){ | ||
| 353 | - if(!$("#captchaWrap").is(":hidden")){ | ||
| 354 | - _captcha.hide(); | ||
| 355 | - //隐藏提示消息 | ||
| 356 | - msgAlert.html(''); | ||
| 357 | - $('#loginPanel').removeClass('show_msg'); | ||
| 358 | - } | ||
| 359 | - } | ||
| 360 | - } | ||
| 361 | - | ||
| 362 | - | ||
| 363 | - var _captcha = { | ||
| 364 | - show: function(){ | ||
| 365 | - if($("#captchaWrap").is(":hidden")){ | ||
| 366 | - $('#captchaWrap').fadeIn(500); | ||
| 367 | - _captcha.refresh(); | ||
| 368 | - checkBtnStatus(); | ||
| 369 | - } | ||
| 370 | - }, | ||
| 371 | - refresh: function(){ | ||
| 372 | - if($("#captchaWrap").is(":hidden")) | ||
| 373 | - return; | ||
| 374 | - $('#captchaWrap img.captcha-img').attr('src', '/captcha.jpg?t=' + Math.random()); | ||
| 375 | - }, | ||
| 376 | - hide: function(){ | ||
| 377 | - $('#captchaWrap').hide(); | ||
| 378 | - $('input[name=captcha]').val(''); | ||
| 379 | - } | ||
| 380 | - }; | ||
| 381 | - | ||
| 382 | - $('#captchaWrap img.captcha-img').on('click', function(){ | ||
| 383 | - $(this).attr('src', '/captcha.jpg?t=' + Math.random()); | ||
| 384 | - }); | ||
| 385 | - | ||
| 386 | - function error(rs){ | ||
| 387 | - return rs.status == 'ERROR' || rs.status == 500; | ||
| 388 | - } | ||
| 389 | - }(); | ||
| 390 | -</script> | ||
| 391 | -</body> | 1 | +<!DOCTYPE html> |
| 2 | +<html lang="zh"> | ||
| 3 | +<head> | ||
| 4 | + <meta name="renderer" content="webkit" /> | ||
| 5 | + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> | ||
| 6 | + <meta charset="utf-8" /> | ||
| 7 | + <title>登录</title> | ||
| 8 | + <link | ||
| 9 | + href="/metronic_v4.5.4/plugins/font-awesome/css/font-awesome.min.css" | ||
| 10 | + rel="stylesheet" type="text/css" /> | ||
| 11 | + <!-- Bootstrap style --> | ||
| 12 | + <link href="/metronic_v4.5.4/plugins/bootstrap/css/bootstrap.min.css" | ||
| 13 | + rel="stylesheet" type="text/css" /> | ||
| 14 | + | ||
| 15 | + <!-- METRONIC style --> | ||
| 16 | + <link href="/metronic_v4.5.4/css/components.css" rel="stylesheet" | ||
| 17 | + type="text/css" /> | ||
| 18 | + | ||
| 19 | + <style type="text/css"> | ||
| 20 | + body>.wrapper { | ||
| 21 | + background-image: url(/assets/img/bg_9b9dcb65ff.png); | ||
| 22 | + background-size: 100px; | ||
| 23 | + background-repeat: repeat; | ||
| 24 | + min-height: 800px; | ||
| 25 | + min-width: 630px; | ||
| 26 | + position: absolute; | ||
| 27 | + top: 0; | ||
| 28 | + bottom: 0; | ||
| 29 | + left: 0; | ||
| 30 | + right: 0; | ||
| 31 | + } | ||
| 32 | + | ||
| 33 | + #loginPanel.dialog-shadow { | ||
| 34 | + width: 450px; | ||
| 35 | + /* height: 400px; */ | ||
| 36 | + border: 1px solid #dadada; | ||
| 37 | + border-radius: 10px !important; | ||
| 38 | + position: absolute; | ||
| 39 | + box-shadow: 0 9px 30px -6px rgba(0, 0, 0, .2), 0 18px 20px -10px | ||
| 40 | + rgba(0, 0, 0, .04), 0 18px 20px -10px rgba(0, 0, 0, .04), 0 10px 20px | ||
| 41 | + -10px rgba(0, 0, 0, .04); | ||
| 42 | + background: url(/assets/img/dialog-gray-bg_42c40b3eb6.png) #fff bottom | ||
| 43 | + repeat-x; | ||
| 44 | + top: 50%; | ||
| 45 | + left: 50%; | ||
| 46 | + margin-left: -225px; | ||
| 47 | + margin-top: -300px; | ||
| 48 | + text-align: center; | ||
| 49 | + color: #333; | ||
| 50 | + opacity: .5; | ||
| 51 | + | ||
| 52 | + padding-bottom: 56px; | ||
| 53 | + | ||
| 54 | + animation: to_center 1s forwards; | ||
| 55 | + animation-delay: .2s; | ||
| 56 | + | ||
| 57 | + transition: all .3s ease; | ||
| 58 | + } | ||
| 59 | + | ||
| 60 | + @keyframes to_center | ||
| 61 | + { | ||
| 62 | + 0% {margin-top: -300px;opacity: .5;} | ||
| 63 | + 100% {margin-top: -270px;opacity: 1;} | ||
| 64 | + } | ||
| 65 | + | ||
| 66 | + | ||
| 67 | + h3 { | ||
| 68 | + font-size: 25px; | ||
| 69 | + font-weight: 600; | ||
| 70 | + color: #4a4a4a | ||
| 71 | + } | ||
| 72 | + | ||
| 73 | + .input-icon input { | ||
| 74 | + height: 48px; | ||
| 75 | + border-radius: 5px !important; | ||
| 76 | + transition: all .5s ease; | ||
| 77 | + } | ||
| 78 | + | ||
| 79 | + .input-icon input:FOCUS { | ||
| 80 | + border-color: #c2cad8; | ||
| 81 | + box-shadow: 0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12) !important; | ||
| 82 | + } | ||
| 83 | + | ||
| 84 | + .input-icon>i { | ||
| 85 | + margin-top: 16px; | ||
| 86 | + } | ||
| 87 | + | ||
| 88 | + #loginPanel #loginBtn.btn{ | ||
| 89 | + border-radius: 6px !important; | ||
| 90 | + width: 378px; | ||
| 91 | + height: 48px; | ||
| 92 | + font-size: 20px; | ||
| 93 | + font-family: 微软雅黑; | ||
| 94 | + transition: all .3s ease; | ||
| 95 | + | ||
| 96 | + background: #5f7ed7; | ||
| 97 | + background: linear-gradient(#6f97e5,#527ed9); | ||
| 98 | + box-shadow: inset 0 1px 2px #7ea1e8 !important; | ||
| 99 | + color: #fff; | ||
| 100 | + text-shadow: #4f70b3 0 -1px 0; | ||
| 101 | + border: none; | ||
| 102 | + } | ||
| 103 | + | ||
| 104 | + #loginPanel #loginBtn.btn:HOVER { | ||
| 105 | + box-shadow: inset 0 1px 1px #7696de,inset 0 0 2px #627dca,inset 0 -2px 3px #5a77c7,inset 0 0 100px rgba(48,77,147,.4) !important; | ||
| 106 | + } | ||
| 107 | + | ||
| 108 | + | ||
| 109 | + #loginPanel.show_msg{ | ||
| 110 | + top: calc(50% - 10px); | ||
| 111 | + } | ||
| 112 | + | ||
| 113 | + #loginPanel .alert{ | ||
| 114 | + display: none; | ||
| 115 | + padding: 12px; | ||
| 116 | + margin-top: 21px; | ||
| 117 | + border-radius: 0 0 10px 10px !important; | ||
| 118 | + font-size: 13px; | ||
| 119 | + | ||
| 120 | + position: absolute; | ||
| 121 | + width: 100%; | ||
| 122 | + border-bottom: 1px solid #dadada; | ||
| 123 | + } | ||
| 124 | + | ||
| 125 | + #loginPanel .alert.login-success{ | ||
| 126 | + color: #27a4b0; | ||
| 127 | + background: #abe7ed; | ||
| 128 | + border-color: #abe7ed; | ||
| 129 | + } | ||
| 130 | + | ||
| 131 | + #loginPanel .alert i{ | ||
| 132 | + font-size: 16px; | ||
| 133 | + vertical-align: middle; | ||
| 134 | + margin: 0 5px 3px; | ||
| 135 | + } | ||
| 136 | + | ||
| 137 | + #loginPanel.show_msg .alert{ | ||
| 138 | + display: block; | ||
| 139 | + } | ||
| 140 | + | ||
| 141 | + #captchaWrap{ | ||
| 142 | + display: none; | ||
| 143 | + text-align: left; | ||
| 144 | + border-top: 1px solid #f3f2f2; | ||
| 145 | + } | ||
| 146 | + | ||
| 147 | + img.captcha-img{ | ||
| 148 | + cursor: pointer; | ||
| 149 | + } | ||
| 150 | + | ||
| 151 | + .login-footer{ | ||
| 152 | + position: fixed; | ||
| 153 | + width: 100%; | ||
| 154 | + bottom: 35px; | ||
| 155 | + text-align: center; | ||
| 156 | + color: #a6a6a6; | ||
| 157 | + } | ||
| 158 | + | ||
| 159 | + h3.logo-text{ | ||
| 160 | + font-family: 华文楷体,华文细黑; | ||
| 161 | + font-size: 28px; | ||
| 162 | + } | ||
| 163 | + | ||
| 164 | + .warn-note{ | ||
| 165 | + width: 100%; | ||
| 166 | + position: absolute; | ||
| 167 | + top: 0; | ||
| 168 | + z-index: 2; | ||
| 169 | + text-align: center; | ||
| 170 | + background: #ff4646; | ||
| 171 | + color: white; | ||
| 172 | + padding: 12px; | ||
| 173 | + display: none; | ||
| 174 | + } | ||
| 175 | + </style> | ||
| 176 | +</head> | ||
| 177 | + | ||
| 178 | +<body> | ||
| 179 | +<div class="warn-note">警告!系统目前仅在 WebKit 内核下完成兼容性测试,请使用 Google | ||
| 180 | + Chrome 浏览器进入系统。</div> | ||
| 181 | +<div class="wrapper ng-scope"> | ||
| 182 | + <div id="loginPanel" class="dialog dialog-shadow"> | ||
| 183 | + <br> | ||
| 184 | + <h3 class="logo-text">青浦公交调度系统</h3> | ||
| 185 | + <hr> | ||
| 186 | + <form style="padding: 0px 35px;"> | ||
| 187 | + <div class="form-group" style="margin-bottom: 0"> | ||
| 188 | + <label></label> | ||
| 189 | + <div class="input-icon"> | ||
| 190 | + <i class="fa fa-user font-gray"></i> <input type="text" | ||
| 191 | + name="userName" class="form-control" placeholder="输入用户名" | ||
| 192 | + autofocus="autofocus" autocomplete="off"> | ||
| 193 | + </div> | ||
| 194 | + </div> | ||
| 195 | + | ||
| 196 | + <div class="form-group"> | ||
| 197 | + <label></label> | ||
| 198 | + <div class="input-icon"> | ||
| 199 | + <i class="fa fa-key font-gray"></i> <input type="password" | ||
| 200 | + name="password" class="form-control" placeholder="输入密码"> | ||
| 201 | + </div> | ||
| 202 | + </div> | ||
| 203 | + | ||
| 204 | + <div class="form-group" id="captchaWrap"> | ||
| 205 | + <label></label> | ||
| 206 | + <div class="input-icon"> | ||
| 207 | + <input type="text" name="captcha" style="width: 153px !important;" | ||
| 208 | + class="form-control input-inline input-medium" | ||
| 209 | + placeholder="输入验证码"> <span class="help-inline"> <img | ||
| 210 | + alt="验证码" class="captcha-img" title="点击刷新验证码"> | ||
| 211 | + </span> | ||
| 212 | + </div> | ||
| 213 | + </div> | ||
| 214 | + </form> | ||
| 215 | + <br> | ||
| 216 | + <br> | ||
| 217 | + <div class="form-actions"> | ||
| 218 | + <button class="btn blue-steel" id="loginBtn" disabled="disabled">登录</button> | ||
| 219 | + </div> | ||
| 220 | + | ||
| 221 | + <div class="alert alert-danger"></div> | ||
| 222 | + </div> | ||
| 223 | + | ||
| 224 | + <div class="login-footer">© 2016 上海巴士拓华科技发展有限公司 Some Rights | ||
| 225 | + Reserved</div> | ||
| 226 | +</div> | ||
| 227 | + | ||
| 228 | +<script> | ||
| 229 | + delete window.require; | ||
| 230 | + delete window.exports; | ||
| 231 | + delete window.module; | ||
| 232 | +</script> | ||
| 233 | +<!-- jQuery --> | ||
| 234 | +<script src="/metronic_v4.5.4/plugins/jquery.min.js"></script> | ||
| 235 | +<script src="/assets/plugins/jsencrypt.min.js"></script> | ||
| 236 | +<script> | ||
| 237 | + window.onload=function(){ | ||
| 238 | + var body=document.getElementsByTagName("body")[0]; | ||
| 239 | + if(typeof body.style.WebkitAnimation=="undefined") | ||
| 240 | + $('.warn-note').fadeIn(); | ||
| 241 | + }; | ||
| 242 | + !function(){ | ||
| 243 | + var form = $('#loginPanel form') | ||
| 244 | + ,nameInput = $('input[name=userName]', form) | ||
| 245 | + ,pwdInput = $('input[name=password]', form) | ||
| 246 | + ,msgAlert = $('#loginPanel .alert-danger'); | ||
| 247 | + | ||
| 248 | + $('input', form).on('keyup', checkBtnStatus); | ||
| 249 | + | ||
| 250 | + var keys; | ||
| 251 | + $.get('/user/login/jCryptionKey?t='+Math.random(), function(data){ | ||
| 252 | + keys = data.publickey; | ||
| 253 | + }); | ||
| 254 | + | ||
| 255 | + | ||
| 256 | + | ||
| 257 | + function checkBtnStatus(){ | ||
| 258 | + var es = $('input:visible', form); | ||
| 259 | + for(var i = 0, e; e = es[i++];){ | ||
| 260 | + if($.trim($(e).val()) == ''){ | ||
| 261 | + $('#loginBtn').attr('disabled', 'disabled'); | ||
| 262 | + $('#loginPanel').removeClass('show_msg'); | ||
| 263 | + return; | ||
| 264 | + } | ||
| 265 | + } | ||
| 266 | + $('#loginBtn').removeAttr('disabled'); | ||
| 267 | + } | ||
| 268 | + | ||
| 269 | + nameInput.on('blur', checkStatus); | ||
| 270 | + //keyup 事件做延迟 | ||
| 271 | + var uNameKeyup; | ||
| 272 | + nameInput.on('keyup', function(){ | ||
| 273 | + if(uNameKeyup) | ||
| 274 | + return; | ||
| 275 | + uNameKeyup = true; | ||
| 276 | + setTimeout(function(){ | ||
| 277 | + checkStatus(); | ||
| 278 | + uNameKeyup = false; | ||
| 279 | + }, 200); | ||
| 280 | + }); | ||
| 281 | + | ||
| 282 | + //密码框回车事件 | ||
| 283 | + pwdInput.on('keyup', function(e){ | ||
| 284 | + if (e.keyCode == 13) | ||
| 285 | + $('#loginBtn').click(); | ||
| 286 | + }); | ||
| 287 | + //验证码框回车事件 | ||
| 288 | + $('input[name=captcha]').on('keyup', function(e){ | ||
| 289 | + if (e.keyCode == 13) | ||
| 290 | + $('#loginBtn').click(); | ||
| 291 | + }); | ||
| 292 | + | ||
| 293 | + $('#loginBtn').on('click', function(){ | ||
| 294 | + if(lock || $(this).attr('disabled')) return; | ||
| 295 | + var userName = nameInput.val() | ||
| 296 | + ,pwd = pwdInput.val(); | ||
| 297 | + | ||
| 298 | + //RSA加密 | ||
| 299 | + var encrypt = new JSEncrypt(); | ||
| 300 | + encrypt.setPublicKey(keys); | ||
| 301 | + userName = encrypt.encrypt(userName); | ||
| 302 | + pwd = encrypt.encrypt(pwd); | ||
| 303 | + //登录 | ||
| 304 | + login(userName, pwd); | ||
| 305 | + }); | ||
| 306 | + | ||
| 307 | + var lock; | ||
| 308 | + function login(userName, pwd){ | ||
| 309 | + lock = true; | ||
| 310 | + $('#loginBtn').attr('disabled', 'disabled'); | ||
| 311 | + | ||
| 312 | + var params = { | ||
| 313 | + userName: userName, | ||
| 314 | + password: pwd, | ||
| 315 | + captcha: $('input[name=captcha]').val() | ||
| 316 | + }; | ||
| 317 | + $.post('/user/login', params | ||
| 318 | + ,function(rs){ | ||
| 319 | + | ||
| 320 | + $('#loginPanel').addClass('show_msg'); | ||
| 321 | + if(error(rs)){ | ||
| 322 | + lock = false; | ||
| 323 | + $('#loginBtn').removeAttr('disabled'); | ||
| 324 | + msgAlert.html('<i class="fa fa-times-circle"> </i> 登录失败,' + rs.msg); | ||
| 325 | + | ||
| 326 | + _captcha.refresh(); | ||
| 327 | + checkStatus(); | ||
| 328 | + } | ||
| 329 | + else{ | ||
| 330 | + msgAlert.html('<i class="fa fa-check"> </i> 登录成功!'); | ||
| 331 | + msgAlert.addClass('login-success'); | ||
| 332 | + window.location.href = '/'; | ||
| 333 | + } | ||
| 334 | + }); | ||
| 335 | + } | ||
| 336 | + | ||
| 337 | + function checkStatus(){ | ||
| 338 | + var t = nameInput.val(); | ||
| 339 | + if(!t){ | ||
| 340 | + hide(); | ||
| 341 | + return; | ||
| 342 | + } | ||
| 343 | + | ||
| 344 | + $.get('/user/login/captchaStatus', {userName: t}, function(rs){ | ||
| 345 | + if(rs > 1) | ||
| 346 | + _captcha.show(); | ||
| 347 | + else | ||
| 348 | + hide(); | ||
| 349 | + }); | ||
| 350 | + | ||
| 351 | + function hide(){ | ||
| 352 | + if(!$("#captchaWrap").is(":hidden")){ | ||
| 353 | + _captcha.hide(); | ||
| 354 | + //隐藏提示消息 | ||
| 355 | + //msgAlert.html(''); | ||
| 356 | + //$('#loginPanel').removeClass('show_msg'); | ||
| 357 | + } | ||
| 358 | + } | ||
| 359 | + } | ||
| 360 | + | ||
| 361 | + | ||
| 362 | + var _captcha = { | ||
| 363 | + show: function(){ | ||
| 364 | + if($("#captchaWrap").is(":hidden")){ | ||
| 365 | + $('#captchaWrap').fadeIn(500); | ||
| 366 | + _captcha.refresh(); | ||
| 367 | + checkBtnStatus(); | ||
| 368 | + } | ||
| 369 | + }, | ||
| 370 | + refresh: function(){ | ||
| 371 | + if($("#captchaWrap").is(":hidden")) | ||
| 372 | + return; | ||
| 373 | + $('#captchaWrap img.captcha-img').attr('src', '/captcha.jpg?t=' + Math.random()); | ||
| 374 | + }, | ||
| 375 | + hide: function(){ | ||
| 376 | + $('#captchaWrap').hide(); | ||
| 377 | + $('input[name=captcha]').val(''); | ||
| 378 | + } | ||
| 379 | + }; | ||
| 380 | + | ||
| 381 | + $('#captchaWrap img.captcha-img').on('click', function(){ | ||
| 382 | + $(this).attr('src', '/captcha.jpg?t=' + Math.random()); | ||
| 383 | + }); | ||
| 384 | + | ||
| 385 | + function error(rs){ | ||
| 386 | + return rs.status == 'ERROR' || rs.status == 500; | ||
| 387 | + } | ||
| 388 | + }(); | ||
| 389 | +</script> | ||
| 390 | +</body> | ||
| 392 | </html> | 391 | </html> |
| 393 | \ No newline at end of file | 392 | \ No newline at end of file |
src/main/resources/static/pages/home.html
| 1 | -<style> | ||
| 2 | - .system_change_log{ | ||
| 3 | - background: #fff; | ||
| 4 | - color: #666; | ||
| 5 | - box-shadow: 0 5px 15px rgba(0,0,0,0.08); | ||
| 6 | - height: calc(100% + 10px); | ||
| 7 | - margin-top: -10px; | ||
| 8 | - font-size: 14px; | ||
| 9 | - padding: 10px 0 0 15px; | ||
| 10 | - overflow: auto; | ||
| 11 | - } | ||
| 12 | - .system_change_log>ul{ | ||
| 13 | - margin:0px; | ||
| 14 | - list-style:none; | ||
| 15 | - } | ||
| 16 | - | ||
| 17 | - .system_change_log>ul>li.sub_title{ | ||
| 18 | - text-indent: 0; | ||
| 19 | - } | ||
| 20 | - | ||
| 21 | - .system_change_log>ul>li.sub_title>h6{ | ||
| 22 | - font-size: 12px; | ||
| 23 | - font-family: 微软雅黑; | ||
| 24 | - color: #000; | ||
| 25 | - margin-top: 8px; | ||
| 26 | - margin-bottom: 8px; | ||
| 27 | - } | ||
| 28 | - | ||
| 29 | - .system_change_log>ul>li{ | ||
| 30 | - margin: 5px 0; | ||
| 31 | - text-indent: 25px; | ||
| 32 | - } | ||
| 33 | - | ||
| 34 | - .system_change_log .label{ | ||
| 35 | - width: 55px; | ||
| 36 | - display: inline-block; | ||
| 37 | - padding: 0 10px; | ||
| 38 | - line-height: 1.5; | ||
| 39 | - font-size: 12px; | ||
| 40 | - color: #fff; | ||
| 41 | - vertical-align: middle; | ||
| 42 | - white-space: nowrap; | ||
| 43 | - border-radius: 2px !important; | ||
| 44 | - text-transform: uppercase; | ||
| 45 | - text-align: center; | ||
| 46 | - text-indent: 3px; | ||
| 47 | - margin-right: 15px; | ||
| 48 | - } | ||
| 49 | - .system_change_log .label.s_c_add{ | ||
| 50 | - background-color: #32d296; | ||
| 51 | - } | ||
| 52 | - | ||
| 53 | - .system_change_log .label.s_c_change{ | ||
| 54 | - background-color: #1e87f0; | ||
| 55 | - } | ||
| 56 | - | ||
| 57 | - .system_change_log .label.s_c_remove{ | ||
| 58 | - background-color: #faa05a; | ||
| 59 | - } | ||
| 60 | -</style> | ||
| 61 | -<div class="system_change_log"> | ||
| 62 | - <h2 style="text-indent: 35px;margin: 10px 0 5px;">2019-06-26 更新说明 Changelog</h2> | ||
| 63 | - <br><br> | ||
| 64 | - <ul > | ||
| 65 | - <li class="sub_title"><h6>计划调度</h6></li> | ||
| 66 | - <li><span class="label s_c_change">新增</span>1、新增智能时刻表。</li> | ||
| 67 | - <li class="sub_title"><h6>线调</h6></li> | ||
| 68 | - <li><span class="label s_c_change">修复</span>1、线调班次列表页滚动条问题。</li> | ||
| 69 | - <li><span class="label s_c_change">新增</span>2、新增移动调度,适配IPAD。</li> | ||
| 70 | - </ul> | ||
| 71 | -</div> | 1 | +<style> |
| 2 | + .system_change_log{ | ||
| 3 | + background: #fff; | ||
| 4 | + color: #666; | ||
| 5 | + box-shadow: 0 5px 15px rgba(0,0,0,0.08); | ||
| 6 | + height: calc(100% + 10px); | ||
| 7 | + margin-top: -10px; | ||
| 8 | + font-size: 14px; | ||
| 9 | + padding: 10px 0 0 15px; | ||
| 10 | + overflow: auto; | ||
| 11 | + } | ||
| 12 | + .system_change_log>ul{ | ||
| 13 | + margin:0px; | ||
| 14 | + list-style:none; | ||
| 15 | + } | ||
| 16 | + | ||
| 17 | + .system_change_log>ul>li.sub_title{ | ||
| 18 | + text-indent: 0; | ||
| 19 | + } | ||
| 20 | + | ||
| 21 | + .system_change_log>ul>li.sub_title>h6{ | ||
| 22 | + font-size: 12px; | ||
| 23 | + font-family: 微软雅黑; | ||
| 24 | + color: #000; | ||
| 25 | + margin-top: 8px; | ||
| 26 | + margin-bottom: 8px; | ||
| 27 | + } | ||
| 28 | + | ||
| 29 | + .system_change_log>ul>li{ | ||
| 30 | + margin: 5px 0; | ||
| 31 | + text-indent: 25px; | ||
| 32 | + } | ||
| 33 | + | ||
| 34 | + .system_change_log .label{ | ||
| 35 | + width: 55px; | ||
| 36 | + display: inline-block; | ||
| 37 | + padding: 0 10px; | ||
| 38 | + line-height: 1.5; | ||
| 39 | + font-size: 12px; | ||
| 40 | + color: #fff; | ||
| 41 | + vertical-align: middle; | ||
| 42 | + white-space: nowrap; | ||
| 43 | + border-radius: 2px !important; | ||
| 44 | + text-transform: uppercase; | ||
| 45 | + text-align: center; | ||
| 46 | + text-indent: 3px; | ||
| 47 | + margin-right: 15px; | ||
| 48 | + } | ||
| 49 | + .system_change_log .label.s_c_add{ | ||
| 50 | + background-color: #32d296; | ||
| 51 | + } | ||
| 52 | + | ||
| 53 | + .system_change_log .label.s_c_change{ | ||
| 54 | + background-color: #1e87f0; | ||
| 55 | + } | ||
| 56 | + | ||
| 57 | + .system_change_log .label.s_c_remove{ | ||
| 58 | + background-color: #faa05a; | ||
| 59 | + } | ||
| 60 | +</style> | ||
| 61 | +<div class="system_change_log"> | ||
| 62 | + <h2 style="text-indent: 35px;margin: 10px 0 5px;">2019-06-26 更新说明 Changelog</h2> | ||
| 63 | + <br><br> | ||
| 64 | + <ul > | ||
| 65 | + <li class="sub_title"><h6>计划调度</h6></li> | ||
| 66 | + <li><span class="label s_c_change">新增</span>1、新增智能时刻表。</li> | ||
| 67 | + <li class="sub_title"><h6>线调</h6></li> | ||
| 68 | + <li><span class="label s_c_change">修复</span>1、线调班次列表页滚动条问题。</li> | ||
| 69 | + <li><span class="label s_c_change">新增</span>2、新增移动调度,适配IPAD。</li> | ||
| 70 | + </ul> | ||
| 71 | +</div> | ||
| 72 | + | ||
| 73 | +<script type="text/javascript"> | ||
| 74 | + $.ajax({ | ||
| 75 | + url: '/eci/validate_get_destroy_info', | ||
| 76 | + dataType: "json", | ||
| 77 | + success: function(rs) { | ||
| 78 | + if (rs && rs.status === "SUCCESS") { | ||
| 79 | + if (rs.data && rs.data.length && rs.data.length > 0) { | ||
| 80 | + var htmlText = ""; | ||
| 81 | + var wrapData = []; | ||
| 82 | + if (rs.data.length > 8) { | ||
| 83 | + htmlText = "<span style='font-weight: bold; font-style: italic; '>部分停用信息如下:</span></br>"; | ||
| 84 | + wrapData = rs.data.slice(0, 8); | ||
| 85 | + } else { | ||
| 86 | + htmlText = "<span style='font-weight: bold; font-style: italic; '>所有停用信息如下:</span></br>"; | ||
| 87 | + wrapData = rs.data; | ||
| 88 | + } | ||
| 89 | + $.each(wrapData, function(index, value) { | ||
| 90 | + wrapData[index] = "<span style='font-size: 14px;'>" + value + "</span>"; | ||
| 91 | + }); | ||
| 92 | + | ||
| 93 | + htmlText += wrapData.join("</br>"); | ||
| 94 | + | ||
| 95 | + swal({ | ||
| 96 | + title: "排班人员停用信息", | ||
| 97 | + text: htmlText, | ||
| 98 | + html: true, | ||
| 99 | + type: "warning", | ||
| 100 | + showCancelButton: true, | ||
| 101 | + cancelButtonText: "关闭", | ||
| 102 | + confirmButtonColor: "#3598dc", | ||
| 103 | + confirmButtonText: "下载所有停用信息", | ||
| 104 | + closeOnConfirm: false | ||
| 105 | + | ||
| 106 | + }, function() { | ||
| 107 | + window.location.href = "/eci/validate_get_destroy_info/download"; | ||
| 108 | + }); | ||
| 109 | + } | ||
| 110 | + } | ||
| 111 | + } | ||
| 112 | + }); | ||
| 113 | + | ||
| 114 | + $.get("/user/validPWDExpired", function(msg) { | ||
| 115 | + if ("ok" === msg) { | ||
| 116 | + return; | ||
| 117 | + } | ||
| 118 | + | ||
| 119 | + var htmlText = []; | ||
| 120 | + htmlText.push("<span style='font-weight: bold; font-style: italic; '>" + msg + "</span></br>"); | ||
| 121 | + swal({ | ||
| 122 | + title: "账户密码提示", | ||
| 123 | + text: htmlText.join("</br>"), | ||
| 124 | + html: true, | ||
| 125 | + type: "warning", | ||
| 126 | + showCancelButton: true, | ||
| 127 | + cancelButtonText: "关闭", | ||
| 128 | + confirmButtonColor: "#3598dc", | ||
| 129 | + closeOnConfirm: false | ||
| 130 | + }); | ||
| 131 | + }); | ||
| 132 | + | ||
| 133 | +</script> |
src/main/resources/static/pages/permission/role/add.html
| 1 | -<div class="page-head"> | ||
| 2 | - <div class="page-title"> | ||
| 3 | - <h1>添加角色</h1> | ||
| 4 | - </div> | ||
| 5 | -</div> | ||
| 6 | - | ||
| 7 | -<ul class="page-breadcrumb breadcrumb"> | ||
| 8 | - <li><a href="/pages/home.html" data-pjax>首页</a> <i class="fa fa-circle"></i></li> | ||
| 9 | - <li><span class="active">权限管理</span> <i class="fa fa-circle"></i></li> | ||
| 10 | - <li><a href="list.html" data-pjax>角色管理</a> <i class="fa fa-circle"></i></li> | ||
| 11 | - <li><span class="active">添加角色</span></li> | ||
| 12 | -</ul> | ||
| 13 | - | ||
| 14 | -<div class="portlet light bordered"> | ||
| 15 | - <div class="portlet-title"> | ||
| 16 | - <div class="caption"> | ||
| 17 | - <i class="icon-equalizer font-red-sunglo"></i> <span | ||
| 18 | - class="caption-subject font-red-sunglo bold uppercase">表单</span> | ||
| 19 | - </div> | ||
| 20 | - </div> | ||
| 21 | - <div class="portlet-body form"> | ||
| 22 | - <form action="/resource" class="form-horizontal" id="role_add_form" > | ||
| 23 | - <div class="alert alert-danger display-hide"> | ||
| 24 | - <button class="close" data-close="alert"></button> | ||
| 25 | - 您的输入有误,请检查下面的输入项 | ||
| 26 | - </div> | ||
| 27 | - <div class="form-body"> | ||
| 28 | - <div class="form-group"> | ||
| 29 | - <label class="col-md-3 control-label">角色代码</label> | ||
| 30 | - <div class="col-md-4"> | ||
| 31 | - <input type="text" class="form-control" name="codeName"> | ||
| 32 | - <span class="help-block"> 角色的唯一标识符,不允许重复</span> | ||
| 33 | - </div> | ||
| 34 | - </div> | ||
| 35 | - <div class="form-group"> | ||
| 36 | - <label class="col-md-3 control-label">角色名称</label> | ||
| 37 | - <div class="col-md-4"> | ||
| 38 | - <input type="text" class="form-control" name="roleName"> | ||
| 39 | - </div> | ||
| 40 | - </div> | ||
| 41 | - <div class="form-group"> | ||
| 42 | - <label class="col-md-3 control-label">是否启用</label> | ||
| 43 | - <div class="col-md-4"> | ||
| 44 | - <div class="input-group"> | ||
| 45 | - <select class="form-control" name="enable" style="width: 160px;"> | ||
| 46 | - <option value="1">可用</option> | ||
| 47 | - <option value="0">禁用</option> | ||
| 48 | - </select> | ||
| 49 | - </div> | ||
| 50 | - </div> | ||
| 51 | - </div> | ||
| 52 | - <div class="form-group"> | ||
| 53 | - <label class="col-md-3 control-label">备注/描述</label> | ||
| 54 | - <div class="col-md-4"> | ||
| 55 | - <textarea class="form-control" rows="3" name="descriptions"></textarea> | ||
| 56 | - </div> | ||
| 57 | - </div> | ||
| 58 | - </div> | ||
| 59 | - <div class="form-actions"> | ||
| 60 | - <div class="row"> | ||
| 61 | - <div class="col-md-offset-3 col-md-4"> | ||
| 62 | - <button type="submit" class="btn green" id="addRoleButton"><i class="fa fa-check"></i> 提交</button> | ||
| 63 | - <a type="button" class="btn default" href="list.html" data-pjax><i class="fa fa-times"></i> 取消</a> | ||
| 64 | - </div> | ||
| 65 | - </div> | ||
| 66 | - </div> | ||
| 67 | - </form> | ||
| 68 | - <!-- END FORM--> | ||
| 69 | - </div> | ||
| 70 | -</div> | ||
| 71 | - | ||
| 72 | -<script> | ||
| 73 | -$(function(){ | ||
| 74 | - | ||
| 75 | - var form = $('#role_add_form'); | ||
| 76 | - var error = $('.alert-danger', form); | ||
| 77 | - | ||
| 78 | - //form validate | ||
| 79 | - form.validate({ | ||
| 80 | - errorElement : 'span', | ||
| 81 | - errorClass : 'help-block help-block-error', | ||
| 82 | - focusInvalid : false, | ||
| 83 | - rules : { | ||
| 84 | - 'codeName' : { | ||
| 85 | - required : true, | ||
| 86 | - minlength: 2, | ||
| 87 | - maxlength: 15 | ||
| 88 | - }, | ||
| 89 | - 'roleName' : { | ||
| 90 | - required : true, | ||
| 91 | - minlength: 2, | ||
| 92 | - maxlength: 9 | ||
| 93 | - } | ||
| 94 | - }, | ||
| 95 | - invalidHandler : function(event, validator) { | ||
| 96 | - error.show(); | ||
| 97 | - App.scrollTo(error, -200); | ||
| 98 | - }, | ||
| 99 | - | ||
| 100 | - highlight : function(element) { | ||
| 101 | - $(element).closest('.form-group').addClass('has-error'); | ||
| 102 | - }, | ||
| 103 | - | ||
| 104 | - unhighlight : function(element) { | ||
| 105 | - $(element).closest('.form-group').removeClass('has-error'); | ||
| 106 | - }, | ||
| 107 | - | ||
| 108 | - success : function(label) { | ||
| 109 | - label.closest('.form-group').removeClass('has-error'); | ||
| 110 | - }, | ||
| 111 | - | ||
| 112 | - submitHandler : function(f) { | ||
| 113 | - var params = form.serializeJSON(); | ||
| 114 | - error.hide(); | ||
| 115 | - console.log(params); | ||
| 116 | - | ||
| 117 | - //检查一下角色代码是否存在 | ||
| 118 | - $get('/role/all', {codeName_eq: params.codeName}, function(list){ | ||
| 119 | - if(!list || list.length == 0){ | ||
| 120 | - $post('/role', params, function(res){ | ||
| 121 | - layer.msg('添加角色成功.'); | ||
| 122 | - loadPage('list.html'); | ||
| 123 | - }); | ||
| 124 | - } | ||
| 125 | - else | ||
| 126 | - layer.alert('角色代码【' + params.codeName + '】已存在', {icon: 2, title: '提交被拒绝'}); | ||
| 127 | - }); | ||
| 128 | - } | ||
| 129 | - }); | ||
| 130 | - | ||
| 131 | -}); | 1 | +<div class="page-head"> |
| 2 | + <div class="page-title"> | ||
| 3 | + <h1>添加角色</h1> | ||
| 4 | + </div> | ||
| 5 | +</div> | ||
| 6 | + | ||
| 7 | +<ul class="page-breadcrumb breadcrumb"> | ||
| 8 | + <li><a href="/pages/home.html" data-pjax>首页</a> <i class="fa fa-circle"></i></li> | ||
| 9 | + <li><span class="active">权限管理</span> <i class="fa fa-circle"></i></li> | ||
| 10 | + <li><a href="list.html" data-pjax>角色管理</a> <i class="fa fa-circle"></i></li> | ||
| 11 | + <li><span class="active">添加角色</span></li> | ||
| 12 | +</ul> | ||
| 13 | + | ||
| 14 | +<div class="portlet light bordered"> | ||
| 15 | + <div class="portlet-title"> | ||
| 16 | + <div class="caption"> | ||
| 17 | + <i class="icon-equalizer font-red-sunglo"></i> <span | ||
| 18 | + class="caption-subject font-red-sunglo bold uppercase">表单</span> | ||
| 19 | + </div> | ||
| 20 | + </div> | ||
| 21 | + <div class="portlet-body form"> | ||
| 22 | + <form action="/resource" class="form-horizontal" id="role_add_form" > | ||
| 23 | + <div class="alert alert-danger display-hide"> | ||
| 24 | + <button class="close" data-close="alert"></button> | ||
| 25 | + 您的输入有误,请检查下面的输入项 | ||
| 26 | + </div> | ||
| 27 | + <div class="form-body"> | ||
| 28 | + <div class="form-group"> | ||
| 29 | + <label class="col-md-3 control-label">角色代码</label> | ||
| 30 | + <div class="col-md-4"> | ||
| 31 | + <input type="text" class="form-control" name="codeName"> | ||
| 32 | + <span class="help-block"> 角色的唯一标识符,不允许重复</span> | ||
| 33 | + </div> | ||
| 34 | + </div> | ||
| 35 | + <div class="form-group"> | ||
| 36 | + <label class="col-md-3 control-label">角色名称</label> | ||
| 37 | + <div class="col-md-4"> | ||
| 38 | + <input type="text" class="form-control" name="roleName"> | ||
| 39 | + </div> | ||
| 40 | + </div> | ||
| 41 | + <div class="form-group"> | ||
| 42 | + <label class="col-md-3 control-label">是否启用</label> | ||
| 43 | + <div class="col-md-4"> | ||
| 44 | + <div class="input-group"> | ||
| 45 | + <select class="form-control" name="enable" style="width: 160px;"> | ||
| 46 | + <option value="1">可用</option> | ||
| 47 | + <option value="0">禁用</option> | ||
| 48 | + </select> | ||
| 49 | + </div> | ||
| 50 | + </div> | ||
| 51 | + </div> | ||
| 52 | + <div class="form-group"> | ||
| 53 | + <label class="col-md-3 control-label">备注/描述</label> | ||
| 54 | + <div class="col-md-4"> | ||
| 55 | + <textarea class="form-control" rows="3" name="descriptions"></textarea> | ||
| 56 | + </div> | ||
| 57 | + </div> | ||
| 58 | + </div> | ||
| 59 | + <div class="form-actions"> | ||
| 60 | + <div class="row"> | ||
| 61 | + <div class="col-md-offset-3 col-md-4"> | ||
| 62 | + <button type="submit" class="btn green" id="addRoleButton"><i class="fa fa-check"></i> 提交</button> | ||
| 63 | + <a type="button" class="btn default" href="list.html" data-pjax><i class="fa fa-times"></i> 取消</a> | ||
| 64 | + </div> | ||
| 65 | + </div> | ||
| 66 | + </div> | ||
| 67 | + </form> | ||
| 68 | + <!-- END FORM--> | ||
| 69 | + </div> | ||
| 70 | +</div> | ||
| 71 | + | ||
| 72 | +<script> | ||
| 73 | +$(function(){ | ||
| 74 | + | ||
| 75 | + var form = $('#role_add_form'); | ||
| 76 | + var error = $('.alert-danger', form); | ||
| 77 | + | ||
| 78 | + //form validate | ||
| 79 | + form.validate({ | ||
| 80 | + errorElement : 'span', | ||
| 81 | + errorClass : 'help-block help-block-error', | ||
| 82 | + focusInvalid : false, | ||
| 83 | + rules : { | ||
| 84 | + 'codeName' : { | ||
| 85 | + required : true, | ||
| 86 | + minlength: 2, | ||
| 87 | + maxlength: 15 | ||
| 88 | + }, | ||
| 89 | + 'roleName' : { | ||
| 90 | + required : true, | ||
| 91 | + minlength: 2, | ||
| 92 | + maxlength: 9 | ||
| 93 | + } | ||
| 94 | + }, | ||
| 95 | + invalidHandler : function(event, validator) { | ||
| 96 | + error.show(); | ||
| 97 | + App.scrollTo(error, -200); | ||
| 98 | + }, | ||
| 99 | + | ||
| 100 | + highlight : function(element) { | ||
| 101 | + $(element).closest('.form-group').addClass('has-error'); | ||
| 102 | + }, | ||
| 103 | + | ||
| 104 | + unhighlight : function(element) { | ||
| 105 | + $(element).closest('.form-group').removeClass('has-error'); | ||
| 106 | + }, | ||
| 107 | + | ||
| 108 | + success : function(label) { | ||
| 109 | + label.closest('.form-group').removeClass('has-error'); | ||
| 110 | + }, | ||
| 111 | + | ||
| 112 | + submitHandler : function(f) { | ||
| 113 | + var params = form.serializeJSON(); | ||
| 114 | + error.hide(); | ||
| 115 | + console.log(params); | ||
| 116 | + | ||
| 117 | + //检查一下角色代码是否存在 | ||
| 118 | + $get('/role/all', {codeName_eq: params.codeName}, function(list){ | ||
| 119 | + if(!list || list.length == 0){ | ||
| 120 | + params.level = 2; | ||
| 121 | + /*$post('/role/add', params, function(res){ | ||
| 122 | + layer.msg('添加角色成功.'); | ||
| 123 | + loadPage('list.html'); | ||
| 124 | + });*/ | ||
| 125 | + $.ajax({ | ||
| 126 | + url: '/role/add', | ||
| 127 | + type: 'POST', | ||
| 128 | + traditional: true, | ||
| 129 | + data: params, | ||
| 130 | + success: function(rs){ | ||
| 131 | + if(!rs){ | ||
| 132 | + layer.msg('未知异常!'); | ||
| 133 | + } | ||
| 134 | + if(rs.status=='SUCCESS'){ | ||
| 135 | + layer.msg('添加角色成功.'); | ||
| 136 | + loadPage('list.html'); | ||
| 137 | + } | ||
| 138 | + else if(rs.status=='ERROR'){ | ||
| 139 | + layer.msg('添加失败[ ' + rs.msg + ']'); | ||
| 140 | + } | ||
| 141 | + } | ||
| 142 | + }); | ||
| 143 | + } | ||
| 144 | + else | ||
| 145 | + layer.alert('角色代码【' + params.codeName + '】已存在', {icon: 2, title: '提交被拒绝'}); | ||
| 146 | + }); | ||
| 147 | + } | ||
| 148 | + }); | ||
| 149 | + | ||
| 150 | +}); | ||
| 132 | </script> | 151 | </script> |
| 133 | \ No newline at end of file | 152 | \ No newline at end of file |
src/main/resources/static/pages/permission/role/list.html
| 1 | -<div class="page-head"> | ||
| 2 | - <div class="page-title"> | ||
| 3 | - <h1>角色管理</h1> | ||
| 4 | - </div> | ||
| 5 | -</div> | ||
| 6 | - | ||
| 7 | -<ul class="page-breadcrumb breadcrumb"> | ||
| 8 | - <li><a href="/pages/home.html" data-pjax>首页</a> <i class="fa fa-circle"></i></li> | ||
| 9 | - <li><span class="active">权限管理</span> <i class="fa fa-circle"></i></li> | ||
| 10 | - <li><span class="active">角色管理</span></li> | ||
| 11 | -</ul> | ||
| 12 | - | ||
| 13 | -<div class="row"> | ||
| 14 | - <div class="col-md-12"> | ||
| 15 | - <div class="portlet light portlet-fit bordered"> | ||
| 16 | - <div class="portlet-title"> | ||
| 17 | - <div class="caption"> | ||
| 18 | - <i class="fa fa-database font-dark"></i> <span | ||
| 19 | - class="caption-subject font-dark sbold uppercase">角色列表</span> | ||
| 20 | - </div> | ||
| 21 | - <div class="actions"> | ||
| 22 | - <a data-pjax href="add.html" class="btn btn-circle blue" id="addRoleButton" style="padding: 5px 15px;font-size: 13px;line-height: 1.3;"> | ||
| 23 | - <i class="fa fa-plus"></i> 添加角色 | ||
| 24 | - </a> | ||
| 25 | - </div> | ||
| 26 | - </div> | ||
| 27 | - <div class="portlet-body"> | ||
| 28 | - <div class="mt-element-card mt-card-round mt-element-overlay" id="roleCards"> | ||
| 29 | - </div> | ||
| 30 | - </div> | ||
| 31 | - </div> | ||
| 32 | - </div> | ||
| 33 | -</div> | ||
| 34 | - | ||
| 35 | -<script id="role_list_temp" type="text/html"> | ||
| 36 | -{{each list as role i}} | ||
| 37 | -<div | ||
| 38 | - style="width: 290px; display: inline-block; padding: 0 5px 0 20px;"> | ||
| 39 | - <div class="mt-card-item" style="padding-top: 22px;"> | ||
| 40 | - <div class="mt-card-avatar mt-overlay-1"> | ||
| 41 | - {{if role.pic == 1}} | ||
| 42 | - <img src="/assets/img/roleHead/{{role.codeName}}.png" /> | ||
| 43 | - {{else}} | ||
| 44 | - <img src="/assets/img/roleHead/normal.png" /> | ||
| 45 | - {{/if}} | ||
| 46 | - | ||
| 47 | - <div class="mt-overlay"> | ||
| 48 | - <ul class="mt-info"> | ||
| 49 | - <li><a class="btn default btn-outline" | ||
| 50 | - href="edit.html?no={{role.id}}" data-pjax> <i class="fa fa-edit"></i> 编辑 | ||
| 51 | - </a></li> | ||
| 52 | - </ul> | ||
| 53 | - </div> | ||
| 54 | - </div> | ||
| 55 | - <div class="mt-card-content"> | ||
| 56 | - <h3 class="mt-card-name" >{{role.codeName}}</h3> | ||
| 57 | - <p class="mt-card-desc font-grey-mint" >{{role.roleName}}</p> | ||
| 58 | - <p class="mt-card-desc font-grey-mint">创建于 {{role.createDateStr}}</p> | ||
| 59 | - <div class="mt-card-social"> | ||
| 60 | - <!--<a href="javascript:;" disabled | ||
| 61 | - class="btn grey-mint btn-outline btn-circle" | ||
| 62 | - style="margin: 5px;"> <i class="fa fa-user"></i> 用户 <span | ||
| 63 | - class="badge"> 1 </span> | ||
| 64 | - </a>--> | ||
| 65 | - <hr> | ||
| 66 | - <a href="settings.html?no={{role.id}}" data-pjax class=" font-blue " | ||
| 67 | - style="display: inline-block; margin-right: 5px;"> <i | ||
| 68 | - class="fa fa-meh-o"> </i> 模块配置 | ||
| 69 | - </a> | ||
| 70 | - <a href="resourcesSetting.html?no={{role.id}}" class=" font-blue " | ||
| 71 | - style="display: inline-block;color: #aaaaaa !important;" > <i class="fa fa-key"> | ||
| 72 | - </i> 系统资源权限 | ||
| 73 | - </a> | ||
| 74 | - | ||
| 75 | - <hr> | ||
| 76 | - <a href="companyAuthority.html?no={{role.id}}" data-pjax class="font-blue" | ||
| 77 | - style="display: inline-block; font-size: 12px;" > 分公司数据权限 | ||
| 78 | - </a> | ||
| 79 | - </div> | ||
| 80 | - </div> | ||
| 81 | - </div> | ||
| 82 | -</div> | ||
| 83 | -{{/each}} | ||
| 84 | -</script> | ||
| 85 | - | ||
| 86 | -<script> | ||
| 87 | -$(function(){ | ||
| 88 | - $get('/role/all', null, function(list){ | ||
| 89 | - roleDateFormat(list); | ||
| 90 | - var htmlStr = template('role_list_temp', {list: list}); | ||
| 91 | - $('#roleCards').html(htmlStr); | ||
| 92 | - }); | ||
| 93 | - | ||
| 94 | - //转换时间格式 | ||
| 95 | - function roleDateFormat(list){ | ||
| 96 | - var fs = 'YYYY-MM-DD HH:mm'; | ||
| 97 | - $.each(list, function(i, role){ | ||
| 98 | - role.createDateStr = moment(role.createDate).format(fs); | ||
| 99 | - role.updateDateStr = moment(role.updateDate).format(fs); | ||
| 100 | - }); | ||
| 101 | - } | ||
| 102 | -}); | ||
| 103 | -</script> | 1 | +<div class="page-head"> |
| 2 | + <div class="page-title"> | ||
| 3 | + <h1>角色管理</h1> | ||
| 4 | + </div> | ||
| 5 | +</div> | ||
| 6 | + | ||
| 7 | +<ul class="page-breadcrumb breadcrumb"> | ||
| 8 | + <li><a href="/pages/home.html" data-pjax>首页</a> <i class="fa fa-circle"></i></li> | ||
| 9 | + <li><span class="active">权限管理</span> <i class="fa fa-circle"></i></li> | ||
| 10 | + <li><span class="active">角色管理</span></li> | ||
| 11 | +</ul> | ||
| 12 | + | ||
| 13 | +<div class="row"> | ||
| 14 | + <div class="col-md-12"> | ||
| 15 | + <div class="portlet light portlet-fit bordered"> | ||
| 16 | + <div class="portlet-title"> | ||
| 17 | + <div class="caption"> | ||
| 18 | + <i class="fa fa-database font-dark"></i> <span | ||
| 19 | + class="caption-subject font-dark sbold uppercase">角色列表</span> | ||
| 20 | + </div> | ||
| 21 | + <div class="actions"> | ||
| 22 | + <a data-pjax href="add.html" class="btn btn-circle blue" id="addRoleButton" style="padding: 5px 15px;font-size: 13px;line-height: 1.3;"> | ||
| 23 | + <i class="fa fa-plus"></i> 添加角色 | ||
| 24 | + </a> | ||
| 25 | + </div> | ||
| 26 | + </div> | ||
| 27 | + <div class="portlet-body"> | ||
| 28 | + <div class="mt-element-card mt-card-round mt-element-overlay" id="roleCards"> | ||
| 29 | + </div> | ||
| 30 | + </div> | ||
| 31 | + </div> | ||
| 32 | + </div> | ||
| 33 | +</div> | ||
| 34 | + | ||
| 35 | +<script id="role_list_temp" type="text/html"> | ||
| 36 | +{{each list as role i}} | ||
| 37 | +<div | ||
| 38 | + style="width: 290px; display: inline-block; padding: 0 5px 0 20px;"> | ||
| 39 | + <div class="mt-card-item" style="padding-top: 22px;"> | ||
| 40 | + <div class="mt-card-avatar mt-overlay-1"> | ||
| 41 | + {{if role.pic == 1}} | ||
| 42 | + <img src="/assets/img/roleHead/{{role.codeName}}.png" /> | ||
| 43 | + {{else}} | ||
| 44 | + <img src="/assets/img/roleHead/normal.png" /> | ||
| 45 | + {{/if}} | ||
| 46 | + | ||
| 47 | + <div class="mt-overlay"> | ||
| 48 | + <ul class="mt-info"> | ||
| 49 | + <li><a class="btn default btn-outline" | ||
| 50 | + href="edit.html?no={{role.id}}" data-pjax> <i class="fa fa-edit"></i> 编辑 | ||
| 51 | + </a></li> | ||
| 52 | + </ul> | ||
| 53 | + </div> | ||
| 54 | + </div> | ||
| 55 | + <div class="mt-card-content"> | ||
| 56 | + <h3 class="mt-card-name" >{{role.codeName}}</h3> | ||
| 57 | + <p class="mt-card-desc font-grey-mint" >{{role.roleName}}</p> | ||
| 58 | + <p class="mt-card-desc font-grey-mint">创建于 {{role.createDateStr}}</p> | ||
| 59 | + <div class="mt-card-social"> | ||
| 60 | + <!--<a href="javascript:;" disabled | ||
| 61 | + class="btn grey-mint btn-outline btn-circle" | ||
| 62 | + style="margin: 5px;"> <i class="fa fa-user"></i> 用户 <span | ||
| 63 | + class="badge"> 1 </span> | ||
| 64 | + </a>--> | ||
| 65 | + <hr> | ||
| 66 | + <a href="settings.html?no={{role.id}}" data-pjax class=" font-blue " | ||
| 67 | + style="display: inline-block; margin-right: 5px;"> <i | ||
| 68 | + class="fa fa-meh-o"> </i> 模块配置 | ||
| 69 | + </a> | ||
| 70 | + <a href="javascript:;" class=" font-blue " | ||
| 71 | + style="display: inline-block;color: #aaaaaa !important;" > <i class="fa fa-key"> | ||
| 72 | + </i> 系统资源权限 | ||
| 73 | + </a> | ||
| 74 | + | ||
| 75 | + <hr> | ||
| 76 | + <a href="companyAuthority.html?no={{role.id}}" data-pjax class="font-blue" | ||
| 77 | + style="display: inline-block; font-size: 12px;" > 分公司数据权限 | ||
| 78 | + </a> | ||
| 79 | + </div> | ||
| 80 | + </div> | ||
| 81 | + </div> | ||
| 82 | +</div> | ||
| 83 | +{{/each}} | ||
| 84 | +</script> | ||
| 85 | + | ||
| 86 | +<script> | ||
| 87 | +$(function(){ | ||
| 88 | + $get('/role/findSubordinate', null, function(rs){ | ||
| 89 | + var list = rs.list; | ||
| 90 | + roleDateFormat(list); | ||
| 91 | + var htmlStr = template('role_list_temp', {list: list}); | ||
| 92 | + $('#roleCards').html(htmlStr); | ||
| 93 | + }); | ||
| 94 | + | ||
| 95 | + //转换时间格式 | ||
| 96 | + function roleDateFormat(list){ | ||
| 97 | + var fs = 'YYYY-MM-DD HH:mm'; | ||
| 98 | + $.each(list, function(i, role){ | ||
| 99 | + role.createDateStr = moment(role.createDate).format(fs); | ||
| 100 | + role.updateDateStr = moment(role.updateDate).format(fs); | ||
| 101 | + }); | ||
| 102 | + } | ||
| 103 | +}); | ||
| 104 | +</script> |
src/main/resources/static/pages/permission/user/add.html
| 1 | -<div class="page-head"> | ||
| 2 | - <div class="page-title"> | ||
| 3 | - <h1>添加用户</h1> | ||
| 4 | - </div> | ||
| 5 | -</div> | ||
| 6 | - | ||
| 7 | -<ul class="page-breadcrumb breadcrumb"> | ||
| 8 | - <li><a href="/pages/home.html" data-pjax>首页</a> <i class="fa fa-circle"></i></li> | ||
| 9 | - <li><span class="active">权限管理</span> <i class="fa fa-circle"></i></li> | ||
| 10 | - <li><a href="list.html" data-pjax>用户管理</a> <i class="fa fa-circle"></i></li> | ||
| 11 | - <li><span class="active">添加用户</span></li> | ||
| 12 | -</ul> | ||
| 13 | - | ||
| 14 | -<div class="portlet light bordered"> | ||
| 15 | - <div class="portlet-title"> | ||
| 16 | - <div class="caption"> | ||
| 17 | - <i class="icon-equalizer font-red-sunglo"></i> <span | ||
| 18 | - class="caption-subject font-red-sunglo bold uppercase">表单</span> | ||
| 19 | - </div> | ||
| 20 | - </div> | ||
| 21 | - <div class="portlet-body form"> | ||
| 22 | - <form action="/addUser" class="form-horizontal" id="user_add_form" > | ||
| 23 | - <div class="alert alert-danger display-hide"> | ||
| 24 | - <button class="close" data-close="alert"></button> | ||
| 25 | - 您的输入有误,请检查下面的输入项 | ||
| 26 | - </div> | ||
| 27 | - <div class="form-body"> | ||
| 28 | - <div class="form-group"> | ||
| 29 | - <label class="col-md-3 control-label">登录名</label> | ||
| 30 | - <div class="col-md-4"> | ||
| 31 | - <input type="text" class="form-control" name="userName" > | ||
| 32 | - <span class="help-block"> 登录时的帐号</span> | ||
| 33 | - </div> | ||
| 34 | - </div> | ||
| 35 | - <div class="form-group"> | ||
| 36 | - <label class="col-md-3 control-label">姓名</label> | ||
| 37 | - <div class="col-md-4"> | ||
| 38 | - <input type="text" class="form-control" name="name" > | ||
| 39 | - </div> | ||
| 40 | - </div> | ||
| 41 | - <div class="form-group"> | ||
| 42 | - <label class="col-md-3 control-label">密码</label> | ||
| 43 | - <div class="col-md-4"> | ||
| 44 | - <input type="password" class="form-control" id="password" name="password" > | ||
| 45 | - <span class="help-block"> 请输入6位以上密码</span> | ||
| 46 | - </div> | ||
| 47 | - </div> | ||
| 48 | - <div class="form-group"> | ||
| 49 | - <label class="col-md-3 control-label">确认密码</label> | ||
| 50 | - <div class="col-md-4"> | ||
| 51 | - <input type="password" class="form-control" name="cfmPassword" > | ||
| 52 | - <span class="help-block"> 请重新输入密码</span> | ||
| 53 | - </div> | ||
| 54 | - </div> | ||
| 55 | - <div class="form-group"> | ||
| 56 | - <label class="col-md-3 control-label">所属机构</label> | ||
| 57 | - <div class="col-md-4"> | ||
| 58 | - <input type="text" class="form-control" name="agencies" > | ||
| 59 | - </div> | ||
| 60 | - </div> | ||
| 61 | - | ||
| 62 | - <div class="form-group"> | ||
| 63 | - <label class="col-md-3 control-label">角色</label> | ||
| 64 | - <div class="col-md-4"> | ||
| 65 | - <select class="form-control" id="role" name="roles[]" style="width: 160px;" multiple="multiple"> | ||
| 66 | - | ||
| 67 | - </select> | ||
| 68 | - </div> | ||
| 69 | - </div> | ||
| 70 | - | ||
| 71 | - <div class="form-group"> | ||
| 72 | - <label class="col-md-3 control-label">是否启用</label> | ||
| 73 | - <div class="col-md-4"> | ||
| 74 | - <div class="input-group"> | ||
| 75 | - <select class="form-control" name="enabled" style="width: 160px;"> | ||
| 76 | - <option value="1">可用</option> | ||
| 77 | - <option value="0">禁用</option> | ||
| 78 | - </select> | ||
| 79 | - </div> | ||
| 80 | - </div> | ||
| 81 | - </div> | ||
| 82 | - </div> | ||
| 83 | - <div class="form-actions"> | ||
| 84 | - <div class="row"> | ||
| 85 | - <div class="col-md-offset-3 col-md-4"> | ||
| 86 | - <button type="submit" class="btn green" ><i class="fa fa-check"></i> 提交</button> | ||
| 87 | - <a type="button" class="btn default" href="list.html" data-pjax><i class="fa fa-times"></i> 取消</a> | ||
| 88 | - </div> | ||
| 89 | - </div> | ||
| 90 | - </div> | ||
| 91 | - </form> | ||
| 92 | - <!-- END FORM--> | ||
| 93 | - </div> | ||
| 94 | -</div> | ||
| 95 | -<script> | ||
| 96 | - $(function(){ | ||
| 97 | - $get('/role/all',null,function(result){ | ||
| 98 | - $.each(result,function(i,obj){ | ||
| 99 | - $("#role").append("<option value='"+obj.id+"'>"+obj.roleName+"</option>"); | ||
| 100 | - }); | ||
| 101 | - }); | ||
| 102 | - | ||
| 103 | - var form = $('#user_add_form'); | ||
| 104 | - var error = $('.alert-danger', form); | ||
| 105 | - | ||
| 106 | - //表单 validate | ||
| 107 | - form.validate({ | ||
| 108 | - errorElement : 'span', | ||
| 109 | - errorClass : 'help-block help-block-error', | ||
| 110 | - focusInvalid : false, | ||
| 111 | - rules : { | ||
| 112 | - 'userName' : { | ||
| 113 | - required : true, | ||
| 114 | - maxlength: 25 | ||
| 115 | - }, | ||
| 116 | - 'name' : { | ||
| 117 | - required : true, | ||
| 118 | - maxlength: 25 | ||
| 119 | - }, | ||
| 120 | - 'password' : { | ||
| 121 | - required : true, | ||
| 122 | - minlength: 6, | ||
| 123 | - maxlength: 25 | ||
| 124 | - }, | ||
| 125 | - 'cfmPassword' : { | ||
| 126 | - equalTo: '#password' | ||
| 127 | - }, | ||
| 128 | - 'role' : { | ||
| 129 | - required : true, | ||
| 130 | - minlength: 1 | ||
| 131 | - } | ||
| 132 | - }, | ||
| 133 | - invalidHandler : function(event, validator) { | ||
| 134 | - error.show(); | ||
| 135 | - App.scrollTo(error, -200); | ||
| 136 | - }, | ||
| 137 | - | ||
| 138 | - highlight : function(element) { | ||
| 139 | - $(element).closest('.form-group').addClass('has-error'); | ||
| 140 | - }, | ||
| 141 | - | ||
| 142 | - unhighlight : function(element) { | ||
| 143 | - $(element).closest('.form-group').removeClass('has-error'); | ||
| 144 | - }, | ||
| 145 | - | ||
| 146 | - success : function(label) { | ||
| 147 | - label.closest('.form-group').removeClass('has-error'); | ||
| 148 | - }, | ||
| 149 | - | ||
| 150 | - submitHandler : function(f) { | ||
| 151 | - var params = form.serializeJSON(); | ||
| 152 | - error.hide(); | ||
| 153 | - | ||
| 154 | - $.ajax({ | ||
| 155 | - url: '/user/register', | ||
| 156 | - type: 'POST', | ||
| 157 | - traditional: true, | ||
| 158 | - data: params, | ||
| 159 | - success: function(rs){ | ||
| 160 | - if(!rs){ | ||
| 161 | - layer.msg('未知异常!'); | ||
| 162 | - } | ||
| 163 | - if(rs.status=='SUCCESS'){ | ||
| 164 | - layer.msg('添加用户成功.'); | ||
| 165 | - loadPage('list.html'); | ||
| 166 | - } | ||
| 167 | - else if(rs.status=='ERROR'){ | ||
| 168 | - layer.msg('添加失败[ ' + rs.msg + ']'); | ||
| 169 | - } | ||
| 170 | - } | ||
| 171 | - }); | ||
| 172 | - /*$get('/user/all', {userName_eq: params.userName}, function(list){ | ||
| 173 | - if(!list || list.length == 0){ | ||
| 174 | - console.log(params); | ||
| 175 | - $.ajax({ | ||
| 176 | - url: '/user', | ||
| 177 | - type: 'POST', | ||
| 178 | - traditional: true, | ||
| 179 | - data: params, | ||
| 180 | - success: function(res){ | ||
| 181 | - layer.msg('添加用户成功.'); | ||
| 182 | - loadPage('list.html'); | ||
| 183 | - } | ||
| 184 | - }); | ||
| 185 | - /!* $post('/user', params, function(res){ | ||
| 186 | - layer.msg('添加用户成功.'); | ||
| 187 | - loadPage('list.html'); | ||
| 188 | - }); *!/ | ||
| 189 | - } | ||
| 190 | - else | ||
| 191 | - layer.alert('用户【' + params.userName + '】已存在', {icon: 2, title: '提交被拒绝'}); | ||
| 192 | - });*/ | ||
| 193 | - } | ||
| 194 | - }); | ||
| 195 | - }); | 1 | +<div class="page-head"> |
| 2 | + <div class="page-title"> | ||
| 3 | + <h1>添加用户</h1> | ||
| 4 | + </div> | ||
| 5 | +</div> | ||
| 6 | + | ||
| 7 | +<ul class="page-breadcrumb breadcrumb"> | ||
| 8 | + <li><a href="/pages/home.html" data-pjax>首页</a> <i class="fa fa-circle"></i></li> | ||
| 9 | + <li><span class="active">权限管理</span> <i class="fa fa-circle"></i></li> | ||
| 10 | + <li><a href="list.html" data-pjax>用户管理</a> <i class="fa fa-circle"></i></li> | ||
| 11 | + <li><span class="active">添加用户</span></li> | ||
| 12 | +</ul> | ||
| 13 | + | ||
| 14 | +<div class="portlet light bordered"> | ||
| 15 | + <div class="portlet-title"> | ||
| 16 | + <div class="caption"> | ||
| 17 | + <i class="icon-equalizer font-red-sunglo"></i> <span | ||
| 18 | + class="caption-subject font-red-sunglo bold uppercase">表单</span> | ||
| 19 | + </div> | ||
| 20 | + </div> | ||
| 21 | + <div class="portlet-body form"> | ||
| 22 | + <form action="/addUser" class="form-horizontal" id="user_add_form" > | ||
| 23 | + <div class="alert alert-danger display-hide"> | ||
| 24 | + <button class="close" data-close="alert"></button> | ||
| 25 | + 您的输入有误,请检查下面的输入项 | ||
| 26 | + </div> | ||
| 27 | + <div class="form-body"> | ||
| 28 | + <div class="form-group"> | ||
| 29 | + <label class="col-md-3 control-label">登录名</label> | ||
| 30 | + <div class="col-md-4"> | ||
| 31 | + <input type="text" class="form-control" name="userName" > | ||
| 32 | + <span class="help-block"> 登录时的帐号</span> | ||
| 33 | + </div> | ||
| 34 | + </div> | ||
| 35 | + <div class="form-group"> | ||
| 36 | + <label class="col-md-3 control-label">姓名</label> | ||
| 37 | + <div class="col-md-4"> | ||
| 38 | + <input type="text" class="form-control" name="name" > | ||
| 39 | + </div> | ||
| 40 | + </div> | ||
| 41 | + <div class="form-group"> | ||
| 42 | + <label class="col-md-3 control-label">密码</label> | ||
| 43 | + <div class="col-md-4"> | ||
| 44 | + <input type="password" class="form-control" id="password" name="password" > | ||
| 45 | + <!--<span class="help-block"> 请输入6位以上密码</span>--> | ||
| 46 | + </div> | ||
| 47 | + </div> | ||
| 48 | + <div class="form-group"> | ||
| 49 | + <label class="col-md-3 control-label">确认密码</label> | ||
| 50 | + <div class="col-md-4"> | ||
| 51 | + <input type="password" class="form-control" name="cfmPassword" > | ||
| 52 | + <span class="help-block"> 请重新输入密码</span> | ||
| 53 | + </div> | ||
| 54 | + </div> | ||
| 55 | + <div class="form-group"> | ||
| 56 | + <label class="col-md-3 control-label">所属机构</label> | ||
| 57 | + <div class="col-md-4"> | ||
| 58 | + <input type="text" class="form-control" name="agencies" > | ||
| 59 | + </div> | ||
| 60 | + </div> | ||
| 61 | + | ||
| 62 | + <div class="form-group"> | ||
| 63 | + <label class="col-md-3 control-label">角色</label> | ||
| 64 | + <div class="col-md-4"> | ||
| 65 | + <select class="form-control" id="role" name="roles[]" style="width: 160px;" multiple="multiple"> | ||
| 66 | + | ||
| 67 | + </select> | ||
| 68 | + </div> | ||
| 69 | + </div> | ||
| 70 | + | ||
| 71 | + <div class="form-group"> | ||
| 72 | + <label class="col-md-3 control-label">是否启用</label> | ||
| 73 | + <div class="col-md-4"> | ||
| 74 | + <div class="input-group"> | ||
| 75 | + <select class="form-control" name="enabled" style="width: 160px;"> | ||
| 76 | + <option value="1">可用</option> | ||
| 77 | + <option value="0">禁用</option> | ||
| 78 | + </select> | ||
| 79 | + </div> | ||
| 80 | + </div> | ||
| 81 | + </div> | ||
| 82 | + </div> | ||
| 83 | + <div class="form-actions"> | ||
| 84 | + <div class="row"> | ||
| 85 | + <div class="col-md-offset-3 col-md-4"> | ||
| 86 | + <button type="submit" class="btn green" ><i class="fa fa-check"></i> 提交</button> | ||
| 87 | + <a type="button" class="btn default" href="list.html" data-pjax><i class="fa fa-times"></i> 取消</a> | ||
| 88 | + </div> | ||
| 89 | + </div> | ||
| 90 | + </div> | ||
| 91 | + </form> | ||
| 92 | + <!-- END FORM--> | ||
| 93 | + </div> | ||
| 94 | +</div> | ||
| 95 | +<script> | ||
| 96 | + $(function(){ | ||
| 97 | + /*$get('/role/all',null,function(result){ | ||
| 98 | + $.each(result,function(i,obj){ | ||
| 99 | + $("#role").append("<option value='"+obj.id+"'>"+obj.roleName+"</option>"); | ||
| 100 | + }); | ||
| 101 | + });*/ | ||
| 102 | + | ||
| 103 | + // 查询下级角色 | ||
| 104 | + $.get('/role/findSubordinate', function (rs) { | ||
| 105 | + if(rs.status == "SUCCESS"){ | ||
| 106 | + if(rs.list.length < 1){ | ||
| 107 | + loadPage('/pages/permission/role/add.html'); | ||
| 108 | + layer.open({ | ||
| 109 | + // type: 2, | ||
| 110 | + content: '用户需要有下级角色才能添加用户!', | ||
| 111 | + title: '请添加下级角色', | ||
| 112 | + shift: 5, | ||
| 113 | + scrollbar: false | ||
| 114 | + }); | ||
| 115 | + return; | ||
| 116 | + } | ||
| 117 | + | ||
| 118 | + $.each(rs.list,function(i,obj){ | ||
| 119 | + $("#role").append("<option value='"+obj.id+"'>"+obj.roleName+"</option>"); | ||
| 120 | + }); | ||
| 121 | + }else { | ||
| 122 | + loadPage('/pages/permission/role/list.html'); | ||
| 123 | + layer.open({ | ||
| 124 | + // type: 2, | ||
| 125 | + content: rs.msg, | ||
| 126 | + title: "用户的下级角色有问题", | ||
| 127 | + shift: 5, | ||
| 128 | + scrollbar: false | ||
| 129 | + }); | ||
| 130 | + } | ||
| 131 | + }); | ||
| 132 | + | ||
| 133 | + | ||
| 134 | + var form = $('#user_add_form'); | ||
| 135 | + var error = $('.alert-danger', form); | ||
| 136 | + | ||
| 137 | + $.validator.addMethod("passwordrule", function(value, element) { | ||
| 138 | + var userblank = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*?[#?!@$%^&*-.]).{8,16}$/; | ||
| 139 | + //var userblank = /^(?=.*[a-zA-Z])(?=.*\d).{8,16}$/; | ||
| 140 | + return this.optional(element) ||(userblank.test(value)); | ||
| 141 | + }, "需包含大小写字母、数字、以及特殊符号的8-16位字符,并不能有123、abc这样的连续字符"); | ||
| 142 | + | ||
| 143 | + //表单 validate | ||
| 144 | + form.validate({ | ||
| 145 | + errorElement : 'span', | ||
| 146 | + errorClass : 'help-block help-block-error', | ||
| 147 | + focusInvalid : false, | ||
| 148 | + rules : { | ||
| 149 | + 'userName' : { | ||
| 150 | + required : true, | ||
| 151 | + maxlength: 25 | ||
| 152 | + }, | ||
| 153 | + 'name' : { | ||
| 154 | + required : true, | ||
| 155 | + maxlength: 25 | ||
| 156 | + }, | ||
| 157 | + 'password' : { | ||
| 158 | + required : true, | ||
| 159 | + minlength: 8, | ||
| 160 | + maxlength: 16, | ||
| 161 | + passwordrule: true | ||
| 162 | + }, | ||
| 163 | + 'cfmPassword' : { | ||
| 164 | + equalTo: '#password' | ||
| 165 | + }, | ||
| 166 | + 'roles[]' : { | ||
| 167 | + required : true, | ||
| 168 | + minlength: 1 | ||
| 169 | + } | ||
| 170 | + }, | ||
| 171 | + invalidHandler : function(event, validator) { | ||
| 172 | + error.show(); | ||
| 173 | + App.scrollTo(error, -200); | ||
| 174 | + }, | ||
| 175 | + | ||
| 176 | + highlight : function(element) { | ||
| 177 | + $(element).closest('.form-group').addClass('has-error'); | ||
| 178 | + }, | ||
| 179 | + | ||
| 180 | + unhighlight : function(element) { | ||
| 181 | + $(element).closest('.form-group').removeClass('has-error'); | ||
| 182 | + }, | ||
| 183 | + | ||
| 184 | + success : function(label) { | ||
| 185 | + label.closest('.form-group').removeClass('has-error'); | ||
| 186 | + }, | ||
| 187 | + | ||
| 188 | + submitHandler : function(f) { | ||
| 189 | + var params = form.serializeJSON(); | ||
| 190 | + error.hide(); | ||
| 191 | + | ||
| 192 | + var keys; | ||
| 193 | + $.ajax({ | ||
| 194 | + url: "/user/login/jCryptionKey?t="+Math.random(), | ||
| 195 | + type: "Get", | ||
| 196 | + async:false, | ||
| 197 | + data: null, | ||
| 198 | + success: function(data) { | ||
| 199 | + keys = data.publickey; | ||
| 200 | + } | ||
| 201 | + }); | ||
| 202 | + //RSA加密 | ||
| 203 | + var encrypt = new JSEncrypt(); | ||
| 204 | + encrypt.setPublicKey(keys); | ||
| 205 | + params.userName = encrypt.encrypt(params.userName); | ||
| 206 | + params.password = encrypt.encrypt(params.password); | ||
| 207 | + $.ajax({ | ||
| 208 | + url: '/user/register', | ||
| 209 | + type: 'POST', | ||
| 210 | + traditional: true, | ||
| 211 | + data: params, | ||
| 212 | + success: function(rs){ | ||
| 213 | + if(!rs){ | ||
| 214 | + layer.msg('未知异常!'); | ||
| 215 | + } | ||
| 216 | + if(rs.status=='SUCCESS'){ | ||
| 217 | + layer.msg('添加用户成功.'); | ||
| 218 | + loadPage('list.html'); | ||
| 219 | + } | ||
| 220 | + else if(rs.status=='ERROR'){ | ||
| 221 | + layer.msg('添加失败[ ' + rs.msg + ']'); | ||
| 222 | + } | ||
| 223 | + } | ||
| 224 | + }); | ||
| 225 | + } | ||
| 226 | + }); | ||
| 227 | + }); | ||
| 196 | </script> | 228 | </script> |
| 197 | \ No newline at end of file | 229 | \ No newline at end of file |
src/main/resources/static/pages/permission/user/authorize.html
0 → 100644
| 1 | +<!--<!DOCTYPE html>--> | ||
| 2 | +<html lang="zh-cn"> | ||
| 3 | + | ||
| 4 | +<head> | ||
| 5 | + <meta charset="UTF-8"> | ||
| 6 | + <script src="/metronic_v4.5.4/plugins/jquery.min.js"></script> | ||
| 7 | + <script src="/assets/js/common.js"></script> | ||
| 8 | + <script src="/assets/plugins/uk3.0/uikit.min.js"></script> | ||
| 9 | + <script src="/assets/plugins/uk3.0/uikit-icons.min.js"></script> | ||
| 10 | + <script src="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.jquery.js"></script> | ||
| 11 | + <!-- EventProxy --> | ||
| 12 | + <script src="/assets/js/eventproxy.js"></script> | ||
| 13 | + <!-- art-template 模版引擎 --> | ||
| 14 | + <script src="/assets/plugins/template.js"></script> | ||
| 15 | + <script src="/real_control_v2/assets/plugins/moment/moment.min.js"></script> | ||
| 16 | + <script src="/assets/plugins/ztree_v3/js/jquery.ztree.core.min.js"></script> | ||
| 17 | + <script src="/assets/plugins/ztree_v3/js/jquery.ztree.excheck.min.js"></script> | ||
| 18 | + <link rel="stylesheet" href="/assets/plugins/uk3.0/uikit.min.css"/> | ||
| 19 | + <link rel="stylesheet" href="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.css" /> | ||
| 20 | + <link rel="stylesheet" href="/assets/plugins/ztree_v3/css/zTreeStyle/zTreeStyle.css" /> | ||
| 21 | + <style> | ||
| 22 | + html,body{ | ||
| 23 | + height: 100%; | ||
| 24 | + } | ||
| 25 | + .ct_page{ | ||
| 26 | + padding: 25px 15px; | ||
| 27 | + height: 100%; | ||
| 28 | + height: calc(100% - 50px); | ||
| 29 | + } | ||
| 30 | + | ||
| 31 | + .ct_cont{ | ||
| 32 | + height: calc(100% - 41px); | ||
| 33 | + } | ||
| 34 | + | ||
| 35 | + .ct_cont>div>div.uk-card{ | ||
| 36 | + height: 99%; | ||
| 37 | + } | ||
| 38 | + | ||
| 39 | + form .uk-inline{ | ||
| 40 | + width: calc(100% - 4px); | ||
| 41 | + margin-left: 2px; | ||
| 42 | + } | ||
| 43 | + | ||
| 44 | + .ct-card-body{ | ||
| 45 | + overflow: auto; | ||
| 46 | + padding: 1px 1px 0 2px; | ||
| 47 | + height: calc(100% - 54px); | ||
| 48 | + position: relative; | ||
| 49 | + margin-top: -12px; | ||
| 50 | + } | ||
| 51 | + | ||
| 52 | + .ct_li_desc{ | ||
| 53 | + color: #a8a8a8; | ||
| 54 | + font-size: 13px; | ||
| 55 | + } | ||
| 56 | + | ||
| 57 | + .ct-card-body .uk-list-large{ | ||
| 58 | + font-size: 14px; | ||
| 59 | + } | ||
| 60 | + | ||
| 61 | + .ct-card-body .uk-list-large>li{ | ||
| 62 | + cursor: default; | ||
| 63 | + padding-left: 20px; | ||
| 64 | + margin-top: 2px !important; | ||
| 65 | + padding-top: 17px !important; | ||
| 66 | + position: relative; | ||
| 67 | + } | ||
| 68 | + | ||
| 69 | + .ct-card-body .uk-list-large>li:hover{ | ||
| 70 | + background: #edecec; | ||
| 71 | + } | ||
| 72 | + | ||
| 73 | + .ct-card-body .uk-list-large>li.active{ | ||
| 74 | + background: #1e87f0 !important; | ||
| 75 | + color: white; | ||
| 76 | + } | ||
| 77 | + | ||
| 78 | + .ct-card-body .uk-list-large>li.active>span.role-code{ | ||
| 79 | + color: #ffffff; | ||
| 80 | + } | ||
| 81 | + | ||
| 82 | + .ct-card-body .uk-list-large.role-list>li:hover{ | ||
| 83 | + background: #fff494; | ||
| 84 | + } | ||
| 85 | + | ||
| 86 | + .ct-card-body .uk-list-large>li.active .ct_li_desc{ | ||
| 87 | + color: #e6e6e6; | ||
| 88 | + } | ||
| 89 | + | ||
| 90 | + .ct-card-body .uk-list-large>li>span.uk-badge{ | ||
| 91 | + position: absolute; | ||
| 92 | + top: 17px; | ||
| 93 | + right: 25px; | ||
| 94 | + } | ||
| 95 | + | ||
| 96 | + .ct-card-body .uk-list-large>li>span.role-code{ | ||
| 97 | + padding: 4px 6px; | ||
| 98 | + color: #a8a8a8; | ||
| 99 | + margin-left: 5px; | ||
| 100 | + } | ||
| 101 | + | ||
| 102 | + .top_title{ | ||
| 103 | + padding: 9px 0 5px 15px; | ||
| 104 | + border-bottom: 1px solid #ededed; | ||
| 105 | + border-left: 5px solid #FFC107; | ||
| 106 | + } | ||
| 107 | + | ||
| 108 | + .top_title>.desc{ | ||
| 109 | + font-size: 13px; | ||
| 110 | + color: grey; | ||
| 111 | + margin-top: 3px; | ||
| 112 | + } | ||
| 113 | + | ||
| 114 | + .left_menu_list{ | ||
| 115 | + overflow: auto; | ||
| 116 | + position: relative; | ||
| 117 | + } | ||
| 118 | + | ||
| 119 | + .left_menu_list .ps-container > .ps-scrollbar-x-rail, .ps-container > .ps-scrollbar-y-rail{ | ||
| 120 | + opacity: 0.6 !important; | ||
| 121 | + padding: 0 !important; | ||
| 122 | + } | ||
| 123 | + | ||
| 124 | + ._company{ | ||
| 125 | + margin: 15px 0px; | ||
| 126 | + } | ||
| 127 | + ._company>h5{ | ||
| 128 | + margin-bottom: 10px; | ||
| 129 | + font-size: 15px; | ||
| 130 | + color: #6b6b6b; | ||
| 131 | + text-indent: 12px; | ||
| 132 | + } | ||
| 133 | + ._company>._fgs>label{ | ||
| 134 | + padding: 3px 12px 3px 10px; | ||
| 135 | + display: inline-block; | ||
| 136 | + border: 1px solid gainsboro; | ||
| 137 | + border-radius: 2px; | ||
| 138 | + margin: 5px; | ||
| 139 | + font-size: 14px; | ||
| 140 | + } | ||
| 141 | + ._company>._fgs>label.active{ | ||
| 142 | + background: #1e87f0; | ||
| 143 | + color: #fff; | ||
| 144 | + } | ||
| 145 | + ._company .uk-checkbox:checked:focus, | ||
| 146 | + .line_checkbox_list .uk-checkbox:checked:focus{ | ||
| 147 | + background-color: #1e87f0 !important; | ||
| 148 | + } | ||
| 149 | + .save_icon{ | ||
| 150 | + position: absolute; | ||
| 151 | + right: 2px; | ||
| 152 | + background: #bec4c9; | ||
| 153 | + font-size: 12px; | ||
| 154 | + padding: 2px 15px; | ||
| 155 | + color: #fff; | ||
| 156 | + box-shadow: 0 5px 15px rgba(0,0,0,0.08); | ||
| 157 | + cursor: pointer; | ||
| 158 | + } | ||
| 159 | + .save_icon:hover{ | ||
| 160 | + background: #FFC107; | ||
| 161 | + } | ||
| 162 | + .data_auth_list{ | ||
| 163 | + position: relative; | ||
| 164 | + } | ||
| 165 | + #user_authorize_wrap .top_title{ | ||
| 166 | + border-left: 5px solid #cacac8; | ||
| 167 | + } | ||
| 168 | + .xd_line_list{ | ||
| 169 | + height: 37%; | ||
| 170 | + padding: 7px; | ||
| 171 | + border-bottom: 1px solid #f2f2f2; | ||
| 172 | + overflow: auto; | ||
| 173 | + position: relative; | ||
| 174 | + } | ||
| 175 | + .xd_line_list>h5{ | ||
| 176 | + color: #858585; | ||
| 177 | + margin: 5px 5px 5px 0; | ||
| 178 | + font-size: 14px; | ||
| 179 | + } | ||
| 180 | + .sub_lines{ | ||
| 181 | + padding-left: 15px; | ||
| 182 | + } | ||
| 183 | + .sub_lines>span.line_btn { | ||
| 184 | + background: #00BCD4; | ||
| 185 | + color: #fff; | ||
| 186 | + padding: 4px 9px; | ||
| 187 | + display: inline-block; | ||
| 188 | + min-width: 68px; | ||
| 189 | + text-align: center; | ||
| 190 | + margin: 5px 2px; | ||
| 191 | + box-shadow: 0 5px 9px rgba(0,0,0,0.08); | ||
| 192 | + cursor: pointer; | ||
| 193 | + font-size: 14px; | ||
| 194 | + font-family: 微软雅黑; | ||
| 195 | + } | ||
| 196 | + | ||
| 197 | + .sub_lines>span.line_btn.destroy{ | ||
| 198 | + background: #ff5c5c; | ||
| 199 | + } | ||
| 200 | + | ||
| 201 | + .sub_lines>span.line_btn.destroy:hover{ | ||
| 202 | + background: #ff7373; | ||
| 203 | + } | ||
| 204 | + | ||
| 205 | + .sub_lines>span.line_btn:hover{ | ||
| 206 | + background: #2dd7ed; | ||
| 207 | + } | ||
| 208 | + .add_line_icon{ | ||
| 209 | + cursor: pointer; | ||
| 210 | + padding: 2px 5px; | ||
| 211 | + border-radius: 5px; | ||
| 212 | + display: inline-block; | ||
| 213 | + } | ||
| 214 | + .add_line_icon>i{ | ||
| 215 | + vertical-align: top; | ||
| 216 | + margin-top: 3px; | ||
| 217 | + } | ||
| 218 | + .add_line_icon:hover{ | ||
| 219 | + background: #ededed; | ||
| 220 | + } | ||
| 221 | + .ct_pattern_form{ | ||
| 222 | + display: inline-block; | ||
| 223 | + } | ||
| 224 | + .xd_menu_grid{ | ||
| 225 | + padding: 25px 25px 0 25px; | ||
| 226 | + height: calc(63% - 91px); | ||
| 227 | + } | ||
| 228 | + .xd_menu_grid .uk-list{ | ||
| 229 | + border: 1px solid #ededed; | ||
| 230 | + height: calc(100% - 70px); | ||
| 231 | + overflow: auto; | ||
| 232 | + position: relative; | ||
| 233 | + } | ||
| 234 | + | ||
| 235 | + .xd_menu_grid .uk-list>li{ | ||
| 236 | + margin: 5px 0 !important; | ||
| 237 | + padding: 10px 0 0 10px !important; | ||
| 238 | + font-size: 14px; | ||
| 239 | + } | ||
| 240 | + .top_tools{ | ||
| 241 | + position: absolute; | ||
| 242 | + top: 15px; | ||
| 243 | + right: 25px; | ||
| 244 | + } | ||
| 245 | + .ct_field { | ||
| 246 | + display: inline-block; | ||
| 247 | + width: 240px; | ||
| 248 | + } | ||
| 249 | + .ct_field>select,.ct_field>input{ | ||
| 250 | + width: calc(100% - 60px); | ||
| 251 | + } | ||
| 252 | + .line_checkbox_list{ | ||
| 253 | + margin-top: 15px; | ||
| 254 | + } | ||
| 255 | + .line_checkbox_list>.btn{ | ||
| 256 | + padding: 5px 7px; | ||
| 257 | + border-radius: 2px; | ||
| 258 | + display: inline-block; | ||
| 259 | + margin: 4px 9px; | ||
| 260 | + font-size: 14px; | ||
| 261 | + font-family: 微软雅黑; | ||
| 262 | + border: 1px solid #d9d9d9; | ||
| 263 | + width: 100px; | ||
| 264 | + overflow: hidden; | ||
| 265 | + text-overflow: ellipsis; | ||
| 266 | + white-space: nowrap; | ||
| 267 | + } | ||
| 268 | + .line_checkbox_list>.btn>input{ | ||
| 269 | + margin-right: 5px; | ||
| 270 | + } | ||
| 271 | + .line_checkbox_list>.btn.active{ | ||
| 272 | + background: #1e87f0; | ||
| 273 | + color: #fff; | ||
| 274 | + } | ||
| 275 | + | ||
| 276 | + .line_checkbox_list>.btn.destroy, | ||
| 277 | + .line_checkbox_list>.btn.destroy>input{ | ||
| 278 | + border-color: #ff9595; | ||
| 279 | + color: #ff5c5c; | ||
| 280 | + } | ||
| 281 | + | ||
| 282 | + .line_checkbox_list>.btn.destroy.active{ | ||
| 283 | + background: #ff5c5c; | ||
| 284 | + color: #fff; | ||
| 285 | + } | ||
| 286 | + | ||
| 287 | + .line_checkbox_list>.btn.destroy.active>input{ | ||
| 288 | + background-color: #ff5c5c !important; | ||
| 289 | + border-color: #ff5c5c !important; | ||
| 290 | + } | ||
| 291 | + | ||
| 292 | + #role_authorize_wrap .ztree *{ | ||
| 293 | + font-size: 14px; | ||
| 294 | + } | ||
| 295 | + #role_authorize_wrap .ztree li{ | ||
| 296 | + line-height: 21px; | ||
| 297 | + } | ||
| 298 | + .loading{ | ||
| 299 | + height: 100%; | ||
| 300 | + text-align: center; | ||
| 301 | + } | ||
| 302 | + .loading .uk-spinner{ | ||
| 303 | + margin-top: 200px; | ||
| 304 | + } | ||
| 305 | + .loading circle{ | ||
| 306 | + stroke: red; | ||
| 307 | + } | ||
| 308 | + | ||
| 309 | + #select_line_modal .uk-checkbox:checked { | ||
| 310 | + background-color: #1e87f0; | ||
| 311 | + } | ||
| 312 | + </style> | ||
| 313 | + | ||
| 314 | +</head> | ||
| 315 | + | ||
| 316 | +<body> | ||
| 317 | +<div class="loading"> | ||
| 318 | + <div uk-spinner></div> | ||
| 319 | +</div> | ||
| 320 | +<div class="ct_page" style="display: none;"> | ||
| 321 | + <h2 class="uk-heading-line uk-heading-bullet"><span>用户授权管理</span></h2> | ||
| 322 | + <div class="ct_cont uk-grid-small uk-child-width-expand" uk-grid> | ||
| 323 | + <div class="role_list uk-width-1-4 "> | ||
| 324 | + <div class="uk-card uk-card-default"> | ||
| 325 | + <form> | ||
| 326 | + <div class="uk-margin"> | ||
| 327 | + <div class="uk-inline" > | ||
| 328 | + </div> | ||
| 329 | + </div> | ||
| 330 | + </form> | ||
| 331 | + | ||
| 332 | + <div class="ct-card-body" > | ||
| 333 | + <ul class="uk-list uk-list-large uk-list-divider role-list"> | ||
| 334 | + </ul> | ||
| 335 | + </div> | ||
| 336 | + </div> | ||
| 337 | + </div> | ||
| 338 | + <div class="user_list uk-width-1-5 "> | ||
| 339 | + <div class="uk-card uk-card-default"> | ||
| 340 | + <form> | ||
| 341 | + <div class="uk-margin"> | ||
| 342 | + <div class="uk-inline" > | ||
| 343 | + </div> | ||
| 344 | + </div> | ||
| 345 | + </form> | ||
| 346 | + | ||
| 347 | + <div class="ct-card-body"> | ||
| 348 | + <ul class="uk-list uk-list-large user-list"> | ||
| 349 | + </ul> | ||
| 350 | + </div> | ||
| 351 | + </div> | ||
| 352 | + </div> | ||
| 353 | + <div class="auth_cont "> | ||
| 354 | + <div class="uk-card uk-card-default authorize_right_cont"> | ||
| 355 | + | ||
| 356 | + </div> | ||
| 357 | + </div> | ||
| 358 | + | ||
| 359 | + </div> | ||
| 360 | +</div> | ||
| 361 | + | ||
| 362 | +<script id="authorize-role-list-temp1" type="text/html"> | ||
| 363 | + {{each list as r i}} | ||
| 364 | + <li data-id="{{r.id}}" data-name="{{r.roleName}}" data-code="{{r.codeUp}}">{{r.roleName}} | ||
| 365 | + <span class="role-code">{{r.codeName}}</span> | ||
| 366 | + <div class="ct_li_desc">{{r.createDateStr}}</div> | ||
| 367 | + <span class="uk-badge">{{r.count}}</span> | ||
| 368 | + </li> | ||
| 369 | + {{/each}} | ||
| 370 | +</script> | ||
| 371 | +<script id="authorize-user-list-temp1" type="text/html"> | ||
| 372 | + {{each list as u i}} | ||
| 373 | + <li class="uk-animation-fade uk-animation-fast" data-name="{{u.name}}" data-code="{{u.userNameUp}}" data-id="{{u.id}}">{{u.name}}<span class="role-code">{{u.userName}}</span></li> | ||
| 374 | + {{/each}} | ||
| 375 | +</script> | ||
| 376 | +<script> | ||
| 377 | + var storage = window.localStorage; | ||
| 378 | + | ||
| 379 | + if (typeof String.prototype.startsWith != 'function') { | ||
| 380 | + String.prototype.startsWith = function (prefix){ | ||
| 381 | + return this.slice(0, prefix.length) === prefix; | ||
| 382 | + }; | ||
| 383 | + } | ||
| 384 | + var roles,users,role_users,modules,companyData,lineArray; | ||
| 385 | + | ||
| 386 | + var ep = EventProxy.create('query_roles', 'query_users', 'query_modules', 'query_company', 'query_line', function (rs, us, ms, cs, lines) { | ||
| 387 | + roles = rs; | ||
| 388 | + users = us; | ||
| 389 | + modules = ms; | ||
| 390 | + companyData = cs; | ||
| 391 | + lineArray=lines; | ||
| 392 | + role_users = {}; | ||
| 393 | + for(var i=0,r;r=roles[i++];){ | ||
| 394 | + r.count=0; | ||
| 395 | + role_users[r.id]=[]; | ||
| 396 | + r.createDateStr=moment(r.createDate).format('YYYY-MM-DD HH:ss'); | ||
| 397 | + r.codeUp=r.codeName.toUpperCase(); | ||
| 398 | + for(var j=0,u;u=users[j++];){ | ||
| 399 | + if(u.roles.indexOf(r.id)!=-1){ | ||
| 400 | + r.count++; | ||
| 401 | + role_users[r.id].push(u); | ||
| 402 | + } | ||
| 403 | + } | ||
| 404 | + } | ||
| 405 | + //渲染角色list | ||
| 406 | + render_role_list(roles); | ||
| 407 | + //渲染用户list | ||
| 408 | + render_user_list(users); | ||
| 409 | + | ||
| 410 | + $('.loading').remove(); | ||
| 411 | + $('.ct_page').show(); | ||
| 412 | + }); | ||
| 413 | + | ||
| 414 | + //角色点击 | ||
| 415 | + $('ul.role-list').on('click', 'li', roleClickHanlder); | ||
| 416 | + //用户点击 | ||
| 417 | + $('ul.user-list').on('click', 'li', userClickHanlder); | ||
| 418 | + | ||
| 419 | + | ||
| 420 | + function roleClickHanlder() { | ||
| 421 | + if($(this).hasClass('active') && $('ul.user-list>li.active').length==0) | ||
| 422 | + return; | ||
| 423 | + | ||
| 424 | + reset_dom(); | ||
| 425 | + $('ul.role-list>li.active').removeClass('active'); | ||
| 426 | + $(this).addClass('active'); | ||
| 427 | + //重新渲染用户list | ||
| 428 | + var id = $(this).data('id'); | ||
| 429 | + render_user_list(role_users[id]); | ||
| 430 | + //加载角色授权页面 | ||
| 431 | + $('.authorize_right_cont').load('/pages/permission/authorize_all/role_auth.html', function () { | ||
| 432 | + $('#role_authorize_wrap', this).trigger('init', {role: get_role(id), modules: modules, companyData: companyData}); | ||
| 433 | + }); | ||
| 434 | + } | ||
| 435 | + | ||
| 436 | + function userClickHanlder() { | ||
| 437 | + if($(this).hasClass('active')) | ||
| 438 | + return; | ||
| 439 | + | ||
| 440 | + reset_dom(); | ||
| 441 | + $('ul.user-list>li.active').removeClass('active'); | ||
| 442 | + $(this).addClass('active'); | ||
| 443 | + | ||
| 444 | + //加载用户授权页面 | ||
| 445 | + var id = $(this).data('id'); | ||
| 446 | + $('.authorize_right_cont').load('/pages/permission/authorize_all/user_auth.html', function () { | ||
| 447 | + $('#user_authorize_wrap', this).trigger('init', {user: get_user(id),lineArray:lineArray, companyData:companyData}); | ||
| 448 | + }); | ||
| 449 | + } | ||
| 450 | + | ||
| 451 | + //refresh-user | ||
| 452 | + $('.authorize_right_cont').on('refresh-user', function () { | ||
| 453 | + $('ul.user-list>li.active').removeClass('active').trigger('click'); | ||
| 454 | + }); | ||
| 455 | + | ||
| 456 | + function reset_dom() { | ||
| 457 | + $('#select_line_modal').remove(); | ||
| 458 | + } | ||
| 459 | + | ||
| 460 | + //滚动条 | ||
| 461 | + $('.ct_page .uk-card .ct-card-body').perfectScrollbar({suppressScrollX: true}); | ||
| 462 | + | ||
| 463 | + //query all role | ||
| 464 | + var paramsRole = {}; | ||
| 465 | + paramsRole['codeName'] = 'ROLE_ADMIN'; | ||
| 466 | + var userId=storage.getItem("editUser"); | ||
| 467 | + $get('/user',{id_eq:userId}, function (rs) { | ||
| 468 | + ep.emit('query_roles', rs.content[0].roles); | ||
| 469 | + }); | ||
| 470 | + | ||
| 471 | + | ||
| 472 | + //query all user | ||
| 473 | + var paramsUser = {}; | ||
| 474 | + paramsRole['name'] = 'name'; | ||
| 475 | + $.get('/user/all_distinct',paramsUser, function (rs) { | ||
| 476 | + var userA={}; | ||
| 477 | + for(var i=0,u;u=rs[i++];){ | ||
| 478 | + if (u.id==userId){ | ||
| 479 | + discard_field(u); | ||
| 480 | + u.userNameUp=u.userName.toUpperCase(); | ||
| 481 | + u.lastLoginDateStr=moment(u.lastLoginDate).format('YYYY-MM-DD HH:ss'); | ||
| 482 | + userA[0]=u; | ||
| 483 | + } | ||
| 484 | + } | ||
| 485 | + ep.emit('query_users', userA); | ||
| 486 | + }); | ||
| 487 | + | ||
| 488 | + //query all modules | ||
| 489 | + $.get('/module/all_distinct', function (rs) { | ||
| 490 | + ep.emit('query_modules', rs); | ||
| 491 | + }); | ||
| 492 | + | ||
| 493 | + //query all company data | ||
| 494 | + $.get('/business/all', function (rs) { | ||
| 495 | + ep.emit('query_company', rs); | ||
| 496 | + }); | ||
| 497 | + | ||
| 498 | + //query all line | ||
| 499 | + $.get('/line/all', {'remove_ne': 1}, function (rs) { | ||
| 500 | + ep.emit('query_line', rs); | ||
| 501 | + }); | ||
| 502 | + | ||
| 503 | + function discard_field(u) { | ||
| 504 | + var array = []; | ||
| 505 | + $.each(u.roles, function () { | ||
| 506 | + array.push(this.id); | ||
| 507 | + }); | ||
| 508 | + u.roles = array; | ||
| 509 | + } | ||
| 510 | + | ||
| 511 | + function render_role_list(list) { | ||
| 512 | + var htmlStr = template('authorize-role-list-temp1', {list: list}); | ||
| 513 | + $('ul.role-list').html(htmlStr); | ||
| 514 | + up_scroll(); | ||
| 515 | + } | ||
| 516 | + | ||
| 517 | + | ||
| 518 | + function render_user_list(list) { | ||
| 519 | + var htmlStr = template('authorize-user-list-temp1', {list: list}); | ||
| 520 | + $('ul.user-list').html(htmlStr); | ||
| 521 | + up_scroll(); | ||
| 522 | + } | ||
| 523 | + | ||
| 524 | + function reset_role_list(){ | ||
| 525 | + var actives = $('ul.role-list>li.active'); | ||
| 526 | + if(actives.length > 0){ | ||
| 527 | + $('ul.role-list>li.active').removeClass('active'); | ||
| 528 | + render_user_list(users); | ||
| 529 | + $('.authorize_right_cont').empty(); | ||
| 530 | + } | ||
| 531 | + } | ||
| 532 | + | ||
| 533 | + function up_scroll() { | ||
| 534 | + $('.ct_page .uk-card .ct-card-body').perfectScrollbar('update'); | ||
| 535 | + } | ||
| 536 | + | ||
| 537 | + | ||
| 538 | + | ||
| 539 | + function get_role(id) { | ||
| 540 | + for(var i=0,r;r=roles[i++];){ | ||
| 541 | + if(r.id==id) | ||
| 542 | + return r; | ||
| 543 | + } | ||
| 544 | + return null; | ||
| 545 | + } | ||
| 546 | + | ||
| 547 | + function get_user(id) { | ||
| 548 | + for(var i=0,u;u=users[i++];){ | ||
| 549 | + if(u.id==id) | ||
| 550 | + return u; | ||
| 551 | + } | ||
| 552 | + return null; | ||
| 553 | + } | ||
| 554 | + | ||
| 555 | + $(document).on('submit', 'form', function () { | ||
| 556 | + return false; | ||
| 557 | + }); | ||
| 558 | + | ||
| 559 | + function convert_buss_data(rs) { | ||
| 560 | + var baseCode; | ||
| 561 | + //找到跟节点 | ||
| 562 | + $.each(rs, function () { | ||
| 563 | + if(this.upCode == 0){ | ||
| 564 | + baseCode=this.businessCode; | ||
| 565 | + return false; | ||
| 566 | + } | ||
| 567 | + }); | ||
| 568 | + if(!baseCode){ | ||
| 569 | + alert('大爷找不到根节点,数据有问题吧!!!'); | ||
| 570 | + return; | ||
| 571 | + } | ||
| 572 | + //提取二级节点 | ||
| 573 | + var secondMap={}; | ||
| 574 | + $.each(rs, function () { | ||
| 575 | + if(this.upCode==baseCode){ | ||
| 576 | + secondMap[this.businessCode] = { | ||
| 577 | + name: this.businessName, | ||
| 578 | + childs: [] | ||
| 579 | + }; | ||
| 580 | + } | ||
| 581 | + }); | ||
| 582 | + //分公司节点 | ||
| 583 | + $.each(rs, function () { | ||
| 584 | + if(secondMap[this.upCode]) | ||
| 585 | + secondMap[this.upCode].childs.push(this); | ||
| 586 | + }); | ||
| 587 | + | ||
| 588 | + //排序 | ||
| 589 | + for(var sid in secondMap){ | ||
| 590 | + secondMap[sid].childs.sort(naturalSort); | ||
| 591 | + } | ||
| 592 | + | ||
| 593 | + return secondMap; | ||
| 594 | + } | ||
| 595 | + | ||
| 596 | + var naturalSort=function (a, b) { | ||
| 597 | + return a.businessName.localeCompare(b.businessName); | ||
| 598 | + }; | ||
| 599 | + | ||
| 600 | + var groupBy = function (list, field) { | ||
| 601 | + var rs = {}, | ||
| 602 | + key; | ||
| 603 | + $.each(list, function () { | ||
| 604 | + key = this[field]; | ||
| 605 | + if (!rs[key]) | ||
| 606 | + rs[key] = []; | ||
| 607 | + | ||
| 608 | + rs[key].push(this); | ||
| 609 | + }); | ||
| 610 | + | ||
| 611 | + return rs; | ||
| 612 | + }; | ||
| 613 | +</script> | ||
| 614 | +</body> | ||
| 615 | +</html> | ||
| 0 | \ No newline at end of file | 616 | \ No newline at end of file |
src/main/resources/static/pages/permission/user/changePWD.html
| 1 | -<div class="row"> | ||
| 2 | -<div class="col-md-12"> | ||
| 3 | -<!-- BEGIN VALIDATION STATES--> | ||
| 4 | -<div class="portlet light portlet-fit portlet-form bordered"> | ||
| 5 | -<div class="portlet-body"> | ||
| 6 | - <form class="form-horizontal" id="changePWDForm"> | ||
| 7 | - <div class="form-group" style="margin-top: 60px"> | ||
| 8 | - <label class="control-label col-md-5">原始密码: | ||
| 9 | - </label> | ||
| 10 | - <div class="col-md-4"> | ||
| 11 | - <div class="input-icon right"> | ||
| 12 | - <i class="fa"></i> | ||
| 13 | - <input type="password" class="form-control" name="oldPWD" /> </div> | ||
| 14 | - </div> | ||
| 15 | - </div> | ||
| 16 | - <div class="form-group"> | ||
| 17 | - <label class="control-label col-md-5">输入新密码: | ||
| 18 | - </label> | ||
| 19 | - <div class="col-md-4"> | ||
| 20 | - <div class="input-icon right"> | ||
| 21 | - <i class="fa"></i> | ||
| 22 | - <input type="password" class="form-control" name="newPWD" /> </div> | ||
| 23 | - </div> | ||
| 24 | - </div> | ||
| 25 | - <div class="form-group"> | ||
| 26 | - <label class="control-label col-md-5">确认新密码: | ||
| 27 | - </label> | ||
| 28 | - <div class="col-md-4"> | ||
| 29 | - <div class="input-icon right"> | ||
| 30 | - <i class="fa"></i> | ||
| 31 | - <input type="password" class="form-control" name="cnewPWD" /> </div> | ||
| 32 | - </div> | ||
| 33 | - </div> | ||
| 34 | - <div class="form-actions"> | ||
| 35 | - <div class="row"> | ||
| 36 | - <div class="col-md-offset-5 col-md-7"> | ||
| 37 | - <button type="button" id="confirm" class="btn green">确定</button> | ||
| 38 | - <button type="reset" class="btn default">取消</button> | ||
| 39 | - </div> | ||
| 40 | - </div> | ||
| 41 | - </div> | ||
| 42 | - </form> | ||
| 43 | -</div> | ||
| 44 | -</div> | ||
| 45 | -</div> | ||
| 46 | -</div> | ||
| 47 | - | ||
| 48 | -<script> | ||
| 49 | -$(function(){ | ||
| 50 | - $("#confirm").on("click",function(){ | ||
| 51 | - var data = $('#changePWDForm').serializeJSON(); | ||
| 52 | - $.post('/user/changePWD',data,function(msg){ | ||
| 53 | - layer.alert(msg); | ||
| 54 | - }); | ||
| 55 | - }); | ||
| 56 | -}); | 1 | +<div class="row"> |
| 2 | +<div class="col-md-12"> | ||
| 3 | +<!-- BEGIN VALIDATION STATES--> | ||
| 4 | +<div class="portlet light portlet-fit portlet-form bordered"> | ||
| 5 | +<div class="portlet-body"> | ||
| 6 | + <form class="form-horizontal" id="changePWDForm"> | ||
| 7 | + <div class="alert alert-danger display-hide"> | ||
| 8 | + <button class="close" data-close="alert"></button>您的输入有误,请检查下面的输入项 | ||
| 9 | + </div> | ||
| 10 | + <div class="form-group" style="margin-top: 60px"> | ||
| 11 | + <label class="control-label col-md-5">原始密码: | ||
| 12 | + </label> | ||
| 13 | + <div class="col-md-4"> | ||
| 14 | + <div class="input-icon right"> | ||
| 15 | + <i class="fa"></i> | ||
| 16 | + <input type="password" class="form-control" name="oldPWD" /> </div> | ||
| 17 | + </div> | ||
| 18 | + </div> | ||
| 19 | + <div class="form-group"> | ||
| 20 | + <label class="control-label col-md-5">输入新密码: | ||
| 21 | + </label> | ||
| 22 | + <div class="col-md-4"> | ||
| 23 | + <div class="input-icon right"> | ||
| 24 | + <i class="fa"></i> | ||
| 25 | + <input type="password" class="form-control" name="newPWD" id="newPWD"/> </div> | ||
| 26 | + </div> | ||
| 27 | + </div> | ||
| 28 | + <div class="form-group"> | ||
| 29 | + <label class="control-label col-md-5">确认新密码: | ||
| 30 | + </label> | ||
| 31 | + <div class="col-md-4"> | ||
| 32 | + <div class="input-icon right"> | ||
| 33 | + <i class="fa"></i> | ||
| 34 | + <input type="password" class="form-control" name="cnewPWD" /> </div> | ||
| 35 | + </div> | ||
| 36 | + </div> | ||
| 37 | + <div class="form-actions"> | ||
| 38 | + <div class="row"> | ||
| 39 | + <div class="col-md-offset-5 col-md-7"> | ||
| 40 | + <button type="submit" id="confirm" class="btn green">确定</button> | ||
| 41 | + <button type="reset" class="btn default">取消</button> | ||
| 42 | + </div> | ||
| 43 | + </div> | ||
| 44 | + </div> | ||
| 45 | + </form> | ||
| 46 | +</div> | ||
| 47 | +</div> | ||
| 48 | +</div> | ||
| 49 | +</div> | ||
| 50 | + | ||
| 51 | +<script> | ||
| 52 | +$(function(){ | ||
| 53 | + var form = $('#changePWDForm'); | ||
| 54 | + //表单 validate | ||
| 55 | + var error = $('.alert-danger', form); | ||
| 56 | + | ||
| 57 | + var validate = function (pwd) { | ||
| 58 | + var flag = true; | ||
| 59 | + for (var i = 1; i < pwd.length - 1; i++) { | ||
| 60 | + var first = pwd.charCodeAt(i - 1); | ||
| 61 | + var second = pwd.charCodeAt(i); | ||
| 62 | + var third = pwd.charCodeAt(i + 1); | ||
| 63 | + if (!(first >= 48 && third <= 57 || first >= 65 && third <= 90 || first >= 97 && third <= 122)) { | ||
| 64 | + continue; | ||
| 65 | + } | ||
| 66 | + if (third - second == 1 && second - first == 1) { | ||
| 67 | + flag = false; | ||
| 68 | + } | ||
| 69 | + } | ||
| 70 | + | ||
| 71 | + return flag; | ||
| 72 | + } | ||
| 73 | + | ||
| 74 | + $.validator.addMethod("passwordrule", function(value, element) { | ||
| 75 | + var reg = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*?[#?!@$%^&*-.]).{8,16}$/; | ||
| 76 | + return this.optional(element) || reg.test(value) && validate(value); | ||
| 77 | + }, "需包含大小写字母、数字、以及特殊符号的8-16位字符,并不能有123、abc这样的连续字符"); | ||
| 78 | + | ||
| 79 | + //表单 validate | ||
| 80 | + form.validate({ | ||
| 81 | + errorElement : 'span', | ||
| 82 | + errorClass : 'help-block help-block-error', | ||
| 83 | + focusInvalid : false, | ||
| 84 | + rules : { | ||
| 85 | + 'newPWD' : { | ||
| 86 | + required : true, | ||
| 87 | + minlength: 6, | ||
| 88 | + maxlength: 16, | ||
| 89 | + passwordrule:true | ||
| 90 | + }, | ||
| 91 | + 'cnewPWD' : { | ||
| 92 | + equalTo: '#newPWD' | ||
| 93 | + } | ||
| 94 | + }, | ||
| 95 | + invalidHandler : function(event, validator) { | ||
| 96 | + error.show(); | ||
| 97 | + App.scrollTo(error, -200); | ||
| 98 | + }, | ||
| 99 | + | ||
| 100 | + highlight : function(element) { | ||
| 101 | + $(element).closest('.form-group').addClass('has-error'); | ||
| 102 | + }, | ||
| 103 | + | ||
| 104 | + unhighlight : function(element) { | ||
| 105 | + $(element).closest('.form-group').removeClass('has-error'); | ||
| 106 | + }, | ||
| 107 | + | ||
| 108 | + success : function(label) { | ||
| 109 | + label.closest('.form-group').removeClass('has-error'); | ||
| 110 | + }, | ||
| 111 | + | ||
| 112 | + submitHandler : function(f) { | ||
| 113 | + var params = form.serializeJSON(); | ||
| 114 | + error.hide(); | ||
| 115 | + var keys; | ||
| 116 | + $.ajax({ | ||
| 117 | + url: "/user/login/jCryptionKey?t="+Math.random(), | ||
| 118 | + type: "Get", | ||
| 119 | + async:false, | ||
| 120 | + data: null, | ||
| 121 | + success: function(data) { | ||
| 122 | + keys = data.publickey; | ||
| 123 | + } | ||
| 124 | + }); | ||
| 125 | + //RSA加密 | ||
| 126 | + var encrypt = new JSEncrypt(); | ||
| 127 | + encrypt.setPublicKey(keys); | ||
| 128 | + params.oldPWD = encrypt.encrypt(params.oldPWD); | ||
| 129 | + params.newPWD = encrypt.encrypt(params.newPWD); | ||
| 130 | + params.cnewPWD = encrypt.encrypt(params.cnewPWD); | ||
| 131 | + $.ajax({ | ||
| 132 | + url: '/user/changePWD', | ||
| 133 | + type: 'POST', | ||
| 134 | + traditional: true, | ||
| 135 | + data: params, | ||
| 136 | + success: function(msg){ | ||
| 137 | + layer.alert(msg); | ||
| 138 | + layer.closeAll('page'); | ||
| 139 | + } | ||
| 140 | + }); | ||
| 141 | + } | ||
| 142 | + }); | ||
| 143 | +}); | ||
| 57 | </script> | 144 | </script> |
| 58 | \ No newline at end of file | 145 | \ No newline at end of file |
src/main/resources/static/pages/permission/user/edit.html
| 1 | -<div class="page-head"> | ||
| 2 | - <div class="page-title"> | ||
| 3 | - <h1>编辑用户</h1> | ||
| 4 | - </div> | ||
| 5 | -</div> | ||
| 6 | - | ||
| 7 | -<ul class="page-breadcrumb breadcrumb"> | ||
| 8 | - <li><a href="/pages/home.html" data-pjax>首页</a> <i class="fa fa-circle"></i></li> | ||
| 9 | - <li><span class="active">权限管理</span> <i class="fa fa-circle"></i></li> | ||
| 10 | - <li><a href="list.html" data-pjax>用户管理</a> <i class="fa fa-circle"></i></li> | ||
| 11 | - <li><span class="active">编辑用户</span></li> | ||
| 12 | -</ul> | ||
| 13 | - | ||
| 14 | -<div class="portlet light bordered"> | ||
| 15 | - <div class="portlet-title"> | ||
| 16 | - <div class="caption"> | ||
| 17 | - <i class="icon-equalizer font-red-sunglo"></i> <span | ||
| 18 | - class="caption-subject font-red-sunglo bold uppercase">表单</span> | ||
| 19 | - </div> | ||
| 20 | - </div> | ||
| 21 | - <div class="portlet-body form"> | ||
| 22 | - <form action="/addUser" class="form-horizontal" id="user_edit_form" > | ||
| 23 | - <div class="alert alert-danger display-hide"> | ||
| 24 | - <button class="close" data-close="alert"></button> | ||
| 25 | - 您的输入有误,请检查下面的输入项 | ||
| 26 | - </div> | ||
| 27 | - <div class="form-body"> | ||
| 28 | - <div class="form-group"> | ||
| 29 | - <label class="col-md-3 control-label">登录名</label> | ||
| 30 | - <div class="col-md-4"> | ||
| 31 | - <input type="hidden" id="id" name="id"> | ||
| 32 | - <input type="text" class="form-control" id="userName" name="userName" readonly="readonly"> | ||
| 33 | - <span class="help-block"> 登录时的帐号</span> | ||
| 34 | - </div> | ||
| 35 | - </div> | ||
| 36 | - <div class="form-group"> | ||
| 37 | - <label class="col-md-3 control-label">姓名</label> | ||
| 38 | - <div class="col-md-4"> | ||
| 39 | - <input type="text" class="form-control" id="name" name="name" readonly="readonly"> | ||
| 40 | - </div> | ||
| 41 | - </div> | ||
| 42 | - <div class="form-group"> | ||
| 43 | - <label class="col-md-3 control-label">所属机构</label> | ||
| 44 | - <div class="col-md-4"> | ||
| 45 | - <input type="text" class="form-control" id="agencies" name="agencies" > | ||
| 46 | - </div> | ||
| 47 | - </div> | ||
| 48 | - | ||
| 49 | - <div class="form-group"> | ||
| 50 | - <label class="col-md-3 control-label">角色</label> | ||
| 51 | - <div class="col-md-4"> | ||
| 52 | - <select class="form-control" id="role" name="roles[]" style="width: 160px;" multiple="multiple"> | ||
| 53 | - | ||
| 54 | - </select> | ||
| 55 | - </div> | ||
| 56 | - </div> | ||
| 57 | - | ||
| 58 | - <div class="form-group"> | ||
| 59 | - <label class="col-md-3 control-label">是否启用</label> | ||
| 60 | - <div class="col-md-4"> | ||
| 61 | - <div class="input-group"> | ||
| 62 | - <select class="form-control" id="enabled" name="enabled" style="width: 160px;"> | ||
| 63 | - <option value="1">可用</option> | ||
| 64 | - <option value="0">禁用</option> | ||
| 65 | - </select> | ||
| 66 | - </div> | ||
| 67 | - </div> | ||
| 68 | - </div> | ||
| 69 | - </div> | ||
| 70 | - <div class="form-actions"> | ||
| 71 | - <div class="row"> | ||
| 72 | - <div class="col-md-offset-3 col-md-4"> | ||
| 73 | - <button type="submit" class="btn green" ><i class="fa fa-check"></i> 提交</button> | ||
| 74 | - <a type="button" class="btn default" href="list.html" data-pjax><i class="fa fa-times"></i> 取消</a> | ||
| 75 | - </div> | ||
| 76 | - </div> | ||
| 77 | - </div> | ||
| 78 | - </form> | ||
| 79 | - <!-- END FORM--> | ||
| 80 | - </div> | ||
| 81 | -</div> | ||
| 82 | -<script> | ||
| 83 | - $(function(){ | ||
| 84 | - var id = $.url().param('no'); | ||
| 85 | - if(id){ | ||
| 86 | - $get('/user/'+id,null,function(obj){ | ||
| 87 | - $("#id").attr('value',obj.id); | ||
| 88 | - $("#userName").attr('value',obj.userName); | ||
| 89 | - $("#name").attr('value',obj.name); | ||
| 90 | - $("#agencies").attr('value',obj.agencies); | ||
| 91 | - $get('/role/all',null,function(result){ | ||
| 92 | - $.each(result,function(i,r){ | ||
| 93 | - $("#role").append("<option value='"+r.id+"'>"+r.roleName+"</option>"); | ||
| 94 | - }); | ||
| 95 | - $.each(obj.roles,function(i,obt){ | ||
| 96 | - $("#role option[value="+obt.id+"]").attr("selected",true); | ||
| 97 | - }); | ||
| 98 | - }); | ||
| 99 | - if(obj.enabled){ | ||
| 100 | - $("#enabled option[value=1]").attr("selected",true); | ||
| 101 | - }else{ | ||
| 102 | - $("#enabled option[value=0]").attr("selected",true); | ||
| 103 | - } | ||
| 104 | - }); | ||
| 105 | - | ||
| 106 | - }else { | ||
| 107 | - | ||
| 108 | - // 缺少ID | ||
| 109 | - layer.confirm('【ID缺失,请点击返回,重新进行修改操作】', {btn : [ '返回' ],icon: 3, title:'提示'}, function(index){ | ||
| 110 | - | ||
| 111 | - // 关闭弹出层 | ||
| 112 | - layer.close(index); | ||
| 113 | - | ||
| 114 | - // 跳转到list页面 | ||
| 115 | - loadPage('list.html'); | ||
| 116 | - | ||
| 117 | - }); | ||
| 118 | - } | ||
| 119 | - | ||
| 120 | - var form = $('#user_edit_form'); | ||
| 121 | - var error = $('.alert-danger', form); | ||
| 122 | - | ||
| 123 | - //表单 validate | ||
| 124 | - form.validate({ | ||
| 125 | - errorElement : 'span', | ||
| 126 | - errorClass : 'help-block help-block-error', | ||
| 127 | - focusInvalid : false, | ||
| 128 | - rules : { | ||
| 129 | - 'userName' : { | ||
| 130 | - required : true, | ||
| 131 | - maxlength: 25 | ||
| 132 | - }, | ||
| 133 | - 'name' : { | ||
| 134 | - required : true, | ||
| 135 | - maxlength: 25 | ||
| 136 | - }, | ||
| 137 | - 'role' : { | ||
| 138 | - required : true, | ||
| 139 | - minlength: 1 | ||
| 140 | - } | ||
| 141 | - }, | ||
| 142 | - invalidHandler : function(event, validator) { | ||
| 143 | - error.show(); | ||
| 144 | - App.scrollTo(error, -200); | ||
| 145 | - }, | ||
| 146 | - | ||
| 147 | - highlight : function(element) { | ||
| 148 | - $(element).closest('.form-group').addClass('has-error'); | ||
| 149 | - }, | ||
| 150 | - | ||
| 151 | - unhighlight : function(element) { | ||
| 152 | - $(element).closest('.form-group').removeClass('has-error'); | ||
| 153 | - }, | ||
| 154 | - | ||
| 155 | - success : function(label) { | ||
| 156 | - label.closest('.form-group').removeClass('has-error'); | ||
| 157 | - }, | ||
| 158 | - | ||
| 159 | - submitHandler : function(f) { | ||
| 160 | - var params = form.serializeJSON(); | ||
| 161 | - error.hide(); | ||
| 162 | - console.log(params); | ||
| 163 | - | ||
| 164 | - //检查一下用户是否存在 | ||
| 165 | - $.ajax({ | ||
| 166 | - url: '/user', | ||
| 167 | - type: 'POST', | ||
| 168 | - traditional: true, | ||
| 169 | - data: params, | ||
| 170 | - success: function(res){ | ||
| 171 | - layer.msg('修改用户信息成功.'); | ||
| 172 | - loadPage('list.html'); | ||
| 173 | - } | ||
| 174 | - }); | ||
| 175 | - } | ||
| 176 | - }); | ||
| 177 | - }); | 1 | +<div class="page-head"> |
| 2 | + <div class="page-title"> | ||
| 3 | + <h1>编辑用户</h1> | ||
| 4 | + </div> | ||
| 5 | +</div> | ||
| 6 | + | ||
| 7 | +<ul class="page-breadcrumb breadcrumb"> | ||
| 8 | + <li><a href="/pages/home.html" data-pjax>首页</a> <i class="fa fa-circle"></i></li> | ||
| 9 | + <li><span class="active">权限管理</span> <i class="fa fa-circle"></i></li> | ||
| 10 | + <li><a href="list.html" data-pjax>用户管理</a> <i class="fa fa-circle"></i></li> | ||
| 11 | + <li><span class="active">编辑用户</span></li> | ||
| 12 | +</ul> | ||
| 13 | + | ||
| 14 | +<div class="portlet light bordered"> | ||
| 15 | + <div class="portlet-title"> | ||
| 16 | + <div class="caption"> | ||
| 17 | + <i class="icon-equalizer font-red-sunglo"></i> <span | ||
| 18 | + class="caption-subject font-red-sunglo bold uppercase">表单</span> | ||
| 19 | + </div> | ||
| 20 | + </div> | ||
| 21 | + <div class="portlet-body form"> | ||
| 22 | + <form action="/addUser" class="form-horizontal" id="user_edit_form" > | ||
| 23 | + <div class="alert alert-danger display-hide"> | ||
| 24 | + <button class="close" data-close="alert"></button> | ||
| 25 | + 您的输入有误,请检查下面的输入项 | ||
| 26 | + </div> | ||
| 27 | + <div class="form-body"> | ||
| 28 | + <div class="form-group"> | ||
| 29 | + <label class="col-md-3 control-label">登录名</label> | ||
| 30 | + <div class="col-md-4"> | ||
| 31 | + <input type="hidden" id="id" name="id"> | ||
| 32 | + <input type="hidden" id="jobCode" name="jobCode"> | ||
| 33 | + <input type="hidden" id="realName" name="realName"> | ||
| 34 | + <input type="hidden" id="lastPwdDate" name="lastPwdDate"> | ||
| 35 | + <input type="hidden" id="pwdValidPeriod" name="pwdValidPeriod"> | ||
| 36 | + <input type="text" class="form-control" id="userName" name="userName" readonly="readonly"> | ||
| 37 | + <span class="help-block"> 登录时的帐号</span> | ||
| 38 | + </div> | ||
| 39 | + </div> | ||
| 40 | + <div class="form-group"> | ||
| 41 | + <label class="col-md-3 control-label">姓名</label> | ||
| 42 | + <div class="col-md-4"> | ||
| 43 | + <input type="text" class="form-control" id="name" name="name" readonly="readonly"> | ||
| 44 | + </div> | ||
| 45 | + </div> | ||
| 46 | + <div class="form-group"> | ||
| 47 | + <label class="col-md-3 control-label">所属机构</label> | ||
| 48 | + <div class="col-md-4"> | ||
| 49 | + <input type="text" class="form-control" id="agencies" name="agencies" > | ||
| 50 | + </div> | ||
| 51 | + </div> | ||
| 52 | + | ||
| 53 | + <div class="form-group"> | ||
| 54 | + <label class="col-md-3 control-label">角色</label> | ||
| 55 | + <div class="col-md-4"> | ||
| 56 | + <select class="form-control" id="role" name="roles[]" style="width: 160px;" multiple="multiple"> | ||
| 57 | + | ||
| 58 | + </select> | ||
| 59 | + </div> | ||
| 60 | + </div> | ||
| 61 | + | ||
| 62 | + <div class="form-group"> | ||
| 63 | + <label class="col-md-3 control-label">是否启用</label> | ||
| 64 | + <div class="col-md-4"> | ||
| 65 | + <div class="input-group"> | ||
| 66 | + <select class="form-control" id="enabled" name="enabled" style="width: 160px;"> | ||
| 67 | + <option value="1">可用</option> | ||
| 68 | + <option value="0">禁用</option> | ||
| 69 | + </select> | ||
| 70 | + </div> | ||
| 71 | + </div> | ||
| 72 | + </div> | ||
| 73 | + </div> | ||
| 74 | + <div> | ||
| 75 | + <!--<iframe src="authorize.html?origin=real_control_iframe" frameborder="0" style="height: 600px;width: 100%;"></iframe>--> | ||
| 76 | + </div> | ||
| 77 | + <div class="form-actions"> | ||
| 78 | + <div class="row"> | ||
| 79 | + <div class="col-md-offset-3 col-md-4"> | ||
| 80 | + <!--<a href="main.html" class="btn green" id="nextStep" ><i class="fa fa-check"></i> 下一步</a>--> | ||
| 81 | + <button type="submit" class="btn green" ><i class="fa fa-check"></i> 提交</button> | ||
| 82 | + <a type="button" class="btn default" href="list.html" data-pjax><i class="fa fa-times"></i> 取消</a> | ||
| 83 | + </div> | ||
| 84 | + </div> | ||
| 85 | + </div> | ||
| 86 | + </form> | ||
| 87 | + <!-- END FORM--> | ||
| 88 | + </div> | ||
| 89 | +</div> | ||
| 90 | + | ||
| 91 | +<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;left: 50%; | ||
| 92 | + top: 50%;transform: translate(-50%,-50%);min-width:50%;overflow: visible;bottom: inherit; right: inherit;"> | ||
| 93 | + <div class="modal-dialog"> | ||
| 94 | + <div class="modal-content"> | ||
| 95 | + <div class="modal-body" style="text-align: center;"></div> | ||
| 96 | + <div class="modal-footer" style="margin: 0 auto;"> | ||
| 97 | + <center> | ||
| 98 | + <button type="button" class="btn btn-primary" data-dismiss="modal" id="noNext" style="margin-right: 20%;padding:5px 35px;background-color: #337AB7;color: white;"> 完 成 </button> | ||
| 99 | + <button type="button" class="btn btn-primary" id="yesNext">继续配置授权</button> | ||
| 100 | + </center> | ||
| 101 | + </div> | ||
| 102 | + </div><!-- /.modal-content --> | ||
| 103 | + </div><!-- /.modal --> | ||
| 104 | +</div> | ||
| 105 | +<script> | ||
| 106 | + $(function(){ | ||
| 107 | + var id = $.url().param('no'); | ||
| 108 | + if(id){ | ||
| 109 | + $get('/user/'+id,null,function(obj){ | ||
| 110 | + $("#id").attr('value',obj.id); | ||
| 111 | + $("#userName").attr('value',obj.userName); | ||
| 112 | + $("#name").attr('value',obj.name); | ||
| 113 | + $("#agencies").attr('value',obj.agencies); | ||
| 114 | + $("#jobCode").attr('value',obj.jobCode); | ||
| 115 | + $("#realName").attr('value',obj.realName); | ||
| 116 | + $("#lastPwdDate").attr('value',moment(obj.lastPwdDate).format('YYYY-MM-DD')); | ||
| 117 | + $("#pwdValidPeriod").attr('value',obj.pwdValidPeriod); | ||
| 118 | + /*$get('/role/all',null,function(result){ | ||
| 119 | + $.each(result,function(i,r){ | ||
| 120 | + $("#role").append("<option value='"+r.id+"'>"+r.roleName+"</option>"); | ||
| 121 | + }); | ||
| 122 | + $.each(obj.roles,function(i,obt){ | ||
| 123 | + $("#role option[value="+obt.id+"]").attr("selected",true); | ||
| 124 | + }); | ||
| 125 | + });*/ | ||
| 126 | + // 查询下级角色 | ||
| 127 | + $.get('/role/findSubordinate', function (rs) { | ||
| 128 | + if(rs.status == "SUCCESS"){ | ||
| 129 | + $.each(rs.list,function(i,obj){ | ||
| 130 | + $("#role").append("<option value='"+obj.id+"'>"+obj.roleName+"</option>"); | ||
| 131 | + }); | ||
| 132 | + } | ||
| 133 | + $.each(obj.roles,function(i,obt){ | ||
| 134 | + $("#role option[value="+obt.id+"]").attr("selected",true); | ||
| 135 | + }); | ||
| 136 | + }); | ||
| 137 | + if(obj.enabled){ | ||
| 138 | + $("#enabled option[value=1]").attr("selected",true); | ||
| 139 | + }else{ | ||
| 140 | + $("#enabled option[value=0]").attr("selected",true); | ||
| 141 | + } | ||
| 142 | + }); | ||
| 143 | + | ||
| 144 | + }else { | ||
| 145 | + | ||
| 146 | + // 缺少ID | ||
| 147 | + layer.confirm('【ID缺失,请点击返回,重新进行修改操作】', {btn : [ '返回' ],icon: 3, title:'提示'}, function(index){ | ||
| 148 | + | ||
| 149 | + // 关闭弹出层 | ||
| 150 | + layer.close(index); | ||
| 151 | + | ||
| 152 | + // 跳转到list页面 | ||
| 153 | + loadPage('list.html'); | ||
| 154 | + | ||
| 155 | + }); | ||
| 156 | + } | ||
| 157 | + | ||
| 158 | + var form = $('#user_edit_form'); | ||
| 159 | + var error = $('.alert-danger', form); | ||
| 160 | + | ||
| 161 | + //表单 validate | ||
| 162 | + form.validate({ | ||
| 163 | + errorElement : 'span', | ||
| 164 | + errorClass : 'help-block help-block-error', | ||
| 165 | + focusInvalid : false, | ||
| 166 | + rules : { | ||
| 167 | + 'userName' : { | ||
| 168 | + required : true, | ||
| 169 | + maxlength: 25 | ||
| 170 | + }, | ||
| 171 | + 'name' : { | ||
| 172 | + required : true, | ||
| 173 | + maxlength: 25 | ||
| 174 | + }, | ||
| 175 | + 'role' : { | ||
| 176 | + required : true, | ||
| 177 | + minlength: 1 | ||
| 178 | + } | ||
| 179 | + }, | ||
| 180 | + invalidHandler : function(event, validator) { | ||
| 181 | + error.show(); | ||
| 182 | + App.scrollTo(error, -200); | ||
| 183 | + }, | ||
| 184 | + | ||
| 185 | + highlight : function(element) { | ||
| 186 | + $(element).closest('.form-group').addClass('has-error'); | ||
| 187 | + }, | ||
| 188 | + | ||
| 189 | + unhighlight : function(element) { | ||
| 190 | + $(element).closest('.form-group').removeClass('has-error'); | ||
| 191 | + }, | ||
| 192 | + | ||
| 193 | + success : function(label) { | ||
| 194 | + label.closest('.form-group').removeClass('has-error'); | ||
| 195 | + }, | ||
| 196 | + | ||
| 197 | + submitHandler : function(f) { | ||
| 198 | + var params = form.serializeJSON(); | ||
| 199 | + error.hide(); | ||
| 200 | + console.log(params); | ||
| 201 | + | ||
| 202 | + //检查一下用户是否存在 | ||
| 203 | + $.ajax({ | ||
| 204 | + url: '/user', | ||
| 205 | + type: 'POST', | ||
| 206 | + traditional: true, | ||
| 207 | + data: params, | ||
| 208 | + success: function(res){ | ||
| 209 | + layer.msg('修改用户信息成功.'); | ||
| 210 | + $('#myModal').modal(); | ||
| 211 | + //loadPage('list.html'); | ||
| 212 | + } | ||
| 213 | + }); | ||
| 214 | + } | ||
| 215 | + }); | ||
| 216 | + | ||
| 217 | + $('#noNext').click(function () { | ||
| 218 | + $('#myModal').modal('hide'); | ||
| 219 | + $('.modal-backdrop').remove(); | ||
| 220 | + | ||
| 221 | + loadPage('list.html'); | ||
| 222 | + }) | ||
| 223 | + $('#yesNext').click(function () { | ||
| 224 | + var storage = window.localStorage; | ||
| 225 | + storage.setItem("editUser",$('#id').val()); | ||
| 226 | + $('#myModal').modal('hide'); | ||
| 227 | + window.location.href='main.html' | ||
| 228 | + }) | ||
| 229 | + }); | ||
| 178 | </script> | 230 | </script> |
| 179 | \ No newline at end of file | 231 | \ No newline at end of file |
src/main/resources/static/pages/permission/user/forceChangePWD.html
0 → 100644
| 1 | +<div class="row"> | ||
| 2 | + <div class="col-md-12"> | ||
| 3 | + <!-- BEGIN VALIDATION STATES--> | ||
| 4 | + <div class="portlet light portlet-fit portlet-form bordered"> | ||
| 5 | + <div class="portlet-body"> | ||
| 6 | + <form class="form-horizontal" id="forceChangePWDForm"> | ||
| 7 | + <div class="alert alert-danger display-hide"> | ||
| 8 | + <button class="close" data-close="alert"></button>您的输入有误,请检查下面的输入项 | ||
| 9 | + </div> | ||
| 10 | + <div class="form-group" style="margin-top: 60px"> | ||
| 11 | + <label class="control-label col-md-5">原始密码: | ||
| 12 | + </label> | ||
| 13 | + <div class="col-md-4"> | ||
| 14 | + <div class="input-icon right"> | ||
| 15 | + <i class="fa"></i> | ||
| 16 | + <input type="password" class="form-control" name="oldPWD" /> </div> | ||
| 17 | + </div> | ||
| 18 | + </div> | ||
| 19 | + <div class="form-group"> | ||
| 20 | + <label class="control-label col-md-5">输入新密码: | ||
| 21 | + </label> | ||
| 22 | + <div class="col-md-4"> | ||
| 23 | + <div class="input-icon right"> | ||
| 24 | + <i class="fa"></i> | ||
| 25 | + <input type="password" class="form-control" name="newPWD" id="newPWD"/> </div> | ||
| 26 | + </div> | ||
| 27 | + </div> | ||
| 28 | + <div class="form-group"> | ||
| 29 | + <label class="control-label col-md-5">确认新密码: | ||
| 30 | + </label> | ||
| 31 | + <div class="col-md-4"> | ||
| 32 | + <div class="input-icon right"> | ||
| 33 | + <i class="fa"></i> | ||
| 34 | + <input type="password" class="form-control" name="cnewPWD" /> </div> | ||
| 35 | + </div> | ||
| 36 | + </div> | ||
| 37 | + <div class="form-actions"> | ||
| 38 | + <div class="row"> | ||
| 39 | + <div class="col-md-offset-5 col-md-7"> | ||
| 40 | + <button type="submit" id="confirm" class="btn green">确定</button> | ||
| 41 | + </div> | ||
| 42 | + </div> | ||
| 43 | + </div> | ||
| 44 | + </form> | ||
| 45 | + </div> | ||
| 46 | + </div> | ||
| 47 | + </div> | ||
| 48 | +</div> | ||
| 49 | + | ||
| 50 | +<script> | ||
| 51 | + $(function(){ | ||
| 52 | + var form = $('#forceChangePWDForm'); | ||
| 53 | + //表单 validate | ||
| 54 | + var error = $('.alert-danger', form); | ||
| 55 | + | ||
| 56 | + var validate = function (pwd) { | ||
| 57 | + var flag = true; | ||
| 58 | + for (var i = 1; i < pwd.length - 1; i++) { | ||
| 59 | + var first = pwd.charCodeAt(i - 1); | ||
| 60 | + var second = pwd.charCodeAt(i); | ||
| 61 | + var third = pwd.charCodeAt(i + 1); | ||
| 62 | + if (!(first >= 48 && third <= 57 || first >= 65 && third <= 90 || first >= 97 && third <= 122)) { | ||
| 63 | + continue; | ||
| 64 | + } | ||
| 65 | + if (third - second == 1 && second - first == 1) { | ||
| 66 | + flag = false; | ||
| 67 | + } | ||
| 68 | + } | ||
| 69 | + | ||
| 70 | + return flag; | ||
| 71 | + } | ||
| 72 | + | ||
| 73 | + $.validator.addMethod("passwordrule", function(value, element) { | ||
| 74 | + var reg = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*?[#?!@$%^&*-.]).{8,16}$/; | ||
| 75 | + return this.optional(element) || reg.test(value) && validate(value); | ||
| 76 | + }, "需包含大小写字母、数字、以及特殊符号的8-16位字符,并不能有123、abc这样的连续字符"); | ||
| 77 | + | ||
| 78 | + //表单 validate | ||
| 79 | + form.validate({ | ||
| 80 | + errorElement : 'span', | ||
| 81 | + errorClass : 'help-block help-block-error', | ||
| 82 | + focusInvalid : false, | ||
| 83 | + rules : { | ||
| 84 | + 'newPWD' : { | ||
| 85 | + required : true, | ||
| 86 | + minlength: 6, | ||
| 87 | + maxlength: 16, | ||
| 88 | + passwordrule:true | ||
| 89 | + }, | ||
| 90 | + 'cnewPWD' : { | ||
| 91 | + equalTo: '#newPWD' | ||
| 92 | + } | ||
| 93 | + }, | ||
| 94 | + invalidHandler : function(event, validator) { | ||
| 95 | + error.show(); | ||
| 96 | + App.scrollTo(error, -200); | ||
| 97 | + }, | ||
| 98 | + | ||
| 99 | + highlight : function(element) { | ||
| 100 | + $(element).closest('.form-group').addClass('has-error'); | ||
| 101 | + }, | ||
| 102 | + | ||
| 103 | + unhighlight : function(element) { | ||
| 104 | + $(element).closest('.form-group').removeClass('has-error'); | ||
| 105 | + }, | ||
| 106 | + | ||
| 107 | + success : function(label) { | ||
| 108 | + label.closest('.form-group').removeClass('has-error'); | ||
| 109 | + }, | ||
| 110 | + | ||
| 111 | + submitHandler : function(f) { | ||
| 112 | + var params = form.serializeJSON(); | ||
| 113 | + error.hide(); | ||
| 114 | + var keys; | ||
| 115 | + $.ajax({ | ||
| 116 | + url: "/user/login/jCryptionKey?t="+Math.random(), | ||
| 117 | + type: "Get", | ||
| 118 | + async:false, | ||
| 119 | + data: null, | ||
| 120 | + success: function(data) { | ||
| 121 | + keys = data.publickey; | ||
| 122 | + } | ||
| 123 | + }); | ||
| 124 | + //RSA加密 | ||
| 125 | + var encrypt = new JSEncrypt(); | ||
| 126 | + encrypt.setPublicKey(keys); | ||
| 127 | + params.oldPWD = encrypt.encrypt(params.oldPWD); | ||
| 128 | + params.newPWD = encrypt.encrypt(params.newPWD); | ||
| 129 | + params.cnewPWD = encrypt.encrypt(params.cnewPWD); | ||
| 130 | + $.ajax({ | ||
| 131 | + url: '/user/changePWD', | ||
| 132 | + type: 'POST', | ||
| 133 | + traditional: true, | ||
| 134 | + data: params, | ||
| 135 | + success: function(msg){ | ||
| 136 | + layer.alert(msg); | ||
| 137 | + layer.closeAll('page'); | ||
| 138 | + } | ||
| 139 | + }); | ||
| 140 | + } | ||
| 141 | + }); | ||
| 142 | + }); | ||
| 143 | +</script> | ||
| 0 | \ No newline at end of file | 144 | \ No newline at end of file |
src/main/resources/static/pages/permission/user/list.html
| 1 | -<div class="page-head"> | ||
| 2 | - <div class="page-title"> | ||
| 3 | - <h1>用户管理</h1> | ||
| 4 | - </div> | ||
| 5 | -</div> | ||
| 6 | - | ||
| 7 | -<ul class="page-breadcrumb breadcrumb"> | ||
| 8 | - <li><a href="/pages/home.html" data-pjax>首页</a> <i class="fa fa-circle"></i></li> | ||
| 9 | - <li><span class="active">权限管理</span> <i class="fa fa-circle"></i></li> | ||
| 10 | - <li><span class="active">用户管理</span></li> | ||
| 11 | -</ul> | ||
| 12 | - | ||
| 13 | -<div class="row"> | ||
| 14 | - <div class="col-md-12"> | ||
| 15 | - <!-- Begin: life time stats --> | ||
| 16 | - <div class="portlet light portlet-fit portlet-datatable bordered"> | ||
| 17 | - <div class="portlet-title"> | ||
| 18 | - <div class="caption"> | ||
| 19 | - <i class="fa fa-users font-dark"></i> <span | ||
| 20 | - class="caption-subject font-dark sbold uppercase">用户数据表</span> | ||
| 21 | - </div> | ||
| 22 | - <div class="actions"> | ||
| 23 | - <a class="btn btn-circle blue" href="add.html" data-pjax><i class="fa fa-plus"></i> 添加用户</a> | ||
| 24 | - | ||
| 25 | - </div> | ||
| 26 | - </div> | ||
| 27 | - <div class="portlet-body"> | ||
| 28 | - <div class="table-container" style="margin-top: 10px"> | ||
| 29 | - <table | ||
| 30 | - class="table table-striped table-bordered table-hover table-checkable" | ||
| 31 | - id="datatable_user"> | ||
| 32 | - <thead> | ||
| 33 | - <tr role="row" class="heading"> | ||
| 34 | - <th width="3%">#</th> | ||
| 35 | - <th width="15%">登录名</th> | ||
| 36 | - <th width="13%">姓名</th> | ||
| 37 | - <th width="100">所属机构</th> | ||
| 38 | - <th width="11%">角色</th> | ||
| 39 | - <th width="10%">状态</th> | ||
| 40 | - <th width="18%">最后登录时间</th> | ||
| 41 | - <th width="18%">操作</th> | ||
| 42 | - </tr> | ||
| 43 | - <tr role="row" class="filter"> | ||
| 44 | - <td></td> | ||
| 45 | - <td> | ||
| 46 | - <input type="text" class="form-control form-filter input-sm" name="userName_like"> | ||
| 47 | - </td> | ||
| 48 | - <td> | ||
| 49 | - <input type="text" class="form-control form-filter input-sm" name="name_like"> | ||
| 50 | - </td> | ||
| 51 | - <td> | ||
| 52 | - <input type="text" class="form-control form-filter input-sm" name="agencies_like"> | ||
| 53 | - </td> | ||
| 54 | - <td></td> | ||
| 55 | - <td> | ||
| 56 | - <select class="form-control form-filter " name="enabled_eq"> | ||
| 57 | - <option value="">请选择...</option> | ||
| 58 | - <option value="true">可用</option> | ||
| 59 | - <option value="false">禁用</option> | ||
| 60 | - </select> | ||
| 61 | - </td> | ||
| 62 | - <td></td> | ||
| 63 | - <td> | ||
| 64 | - <button class="btn btn-sm green btn-outline filter-submit margin-bottom" > | ||
| 65 | - <i class="fa fa-search"></i> 搜索</button> | ||
| 66 | - | ||
| 67 | - <button class="btn btn-sm red btn-outline filter-cancel"> | ||
| 68 | - <i class="fa fa-times"></i> 重置</button> | ||
| 69 | - </td> | ||
| 70 | - </tr> | ||
| 71 | - </thead> | ||
| 72 | - <tbody></tbody> | ||
| 73 | - </table> | ||
| 74 | - <div style="text-align: right;"> | ||
| 75 | - <ul id="pagination" class="pagination"></ul> | ||
| 76 | - </div> | ||
| 77 | - </div> | ||
| 78 | - </div> | ||
| 79 | - </div> | ||
| 80 | - </div> | ||
| 81 | -</div> | ||
| 82 | - | ||
| 83 | -<script id="user_list_temp" type="text/html"> | ||
| 84 | -{{each list as obj i}} | ||
| 85 | -<tr> | ||
| 86 | - <td style="vertical-align: middle;"> | ||
| 87 | - <input type="checkbox" class="group-checkable icheck" data-id="{{obj.id}}"> | ||
| 88 | - </td> | ||
| 89 | - <td> | ||
| 90 | - {{obj.userName}} | ||
| 91 | - </td> | ||
| 92 | - <td> | ||
| 93 | - {{obj.name}} | ||
| 94 | - </td> | ||
| 95 | - <td> | ||
| 96 | - {{obj.agencies}} | ||
| 97 | - </td> | ||
| 98 | - <td> | ||
| 99 | - {{each obj.roles as role j}} | ||
| 100 | - {{role.roleName}}、 | ||
| 101 | - {{/each}} | ||
| 102 | - </td> | ||
| 103 | - <td> | ||
| 104 | - {{if obj.enabled}} | ||
| 105 | - 可用 | ||
| 106 | - {{else}} | ||
| 107 | - 禁用 | ||
| 108 | - {{/if}} | ||
| 109 | - </td> | ||
| 110 | - <td> | ||
| 111 | - {{obj.lastLoginDate}} | ||
| 112 | - </td> | ||
| 113 | - <td> | ||
| 114 | - <a class="btn btn-sm blue btn-outline" href="edit.html?no={{obj.id}}" data-pjax><i class="fa fa-edit"></i> 编辑</a> | ||
| 115 | - <!--<button type="button" class="btn btn-sm line_allot_btn" data-id="{{obj.id}}">线调线路分配</button>--> | ||
| 116 | - </td> | ||
| 117 | -</tr> | ||
| 118 | -{{/each}} | ||
| 119 | -{{if list.length == 0}} | ||
| 120 | -<tr> | ||
| 121 | - <td colspan=8><h6 class="muted">没有找到相关数据</h6></td> | ||
| 122 | -</tr> | ||
| 123 | -{{/if}} | ||
| 124 | -</script> | ||
| 125 | - | ||
| 126 | -<script> | ||
| 127 | -$(function(){ | ||
| 128 | - var page = 0, initPagination; | ||
| 129 | - var icheckOptions = { | ||
| 130 | - checkboxClass: 'icheckbox_flat-blue', | ||
| 131 | - increaseArea: '20%' | ||
| 132 | - }; | ||
| 133 | - | ||
| 134 | - jsDoQuery(null,true); | ||
| 135 | - | ||
| 136 | - //重置 | ||
| 137 | - $('tr.filter .filter-cancel').on('click', function(){ | ||
| 138 | - $('tr.filter input, select').val('').change(); | ||
| 139 | - jsDoQuery(null, true); | ||
| 140 | - }); | ||
| 141 | - | ||
| 142 | - //提交 | ||
| 143 | - $('tr.filter .filter-submit').on('click', function(){ | ||
| 144 | - var cells = $('tr.filter')[0].cells | ||
| 145 | - ,params = {} | ||
| 146 | - ,name; | ||
| 147 | - $.each(cells, function(i, cell){ | ||
| 148 | - var items = $('input,select', cell); | ||
| 149 | - for(var j = 0, item; item = items[j++];){ | ||
| 150 | - name = $(item).attr('name'); | ||
| 151 | - if(name){ | ||
| 152 | - params[name] = $(item).val(); | ||
| 153 | - } | ||
| 154 | - } | ||
| 155 | - }); | ||
| 156 | - page = 0; | ||
| 157 | - jsDoQuery(params, true); | ||
| 158 | - }); | ||
| 159 | - | ||
| 160 | - /* | ||
| 161 | - * 获取数据 p: 要提交的参数, pagination: 是否重新分页 | ||
| 162 | - */ | ||
| 163 | - function jsDoQuery(p, pagination){ | ||
| 164 | - var params = {}; | ||
| 165 | - if(p) | ||
| 166 | - params = p; | ||
| 167 | - //更新时间排序 | ||
| 168 | - params['order'] = 'lastLoginDate'; | ||
| 169 | - params['page'] = page; | ||
| 170 | - var i = layer.load(2); | ||
| 171 | - $get('/user' ,params, function(data){ | ||
| 172 | - $.each(data.content, function(i, obj) { | ||
| 173 | - obj.lastLoginDate = moment(obj.lastLoginDate).format("YYYY-MM-DD HH:mm:ss"); | ||
| 174 | - }); | ||
| 175 | - var bodyHtm = template('user_list_temp', {list: data.content}); | ||
| 176 | - | ||
| 177 | - $('#datatable_user tbody').html(bodyHtm) | ||
| 178 | - .find('.icheck').iCheck(icheckOptions) | ||
| 179 | - .on('ifChanged', iCheckChange); | ||
| 180 | - if(pagination && data.content.length > 0){ | ||
| 181 | - //重新分页 | ||
| 182 | - initPagination = true; | ||
| 183 | - showPagination(data); | ||
| 184 | - } | ||
| 185 | - layer.close(i); | ||
| 186 | - | ||
| 187 | - $('.line_allot_btn').on('click', openAllotWindow); | ||
| 188 | - }); | ||
| 189 | - } | ||
| 190 | - | ||
| 191 | - function iCheckChange(){ | ||
| 192 | - var tr = $(this).parents('tr'); | ||
| 193 | - if(this.checked) | ||
| 194 | - tr.addClass('row-active'); | ||
| 195 | - else | ||
| 196 | - tr.removeClass('row-active'); | ||
| 197 | - | ||
| 198 | - if($('#datatable_resource input.icheck:checked').length == 1) | ||
| 199 | - $('#removeButton').removeAttr('disabled'); | ||
| 200 | - else | ||
| 201 | - $('#removeButton').attr('disabled', 'disabled'); | ||
| 202 | - } | ||
| 203 | - | ||
| 204 | - function showPagination(data){ | ||
| 205 | - //分页 | ||
| 206 | - $('#pagination').jqPaginator({ | ||
| 207 | - totalPages: data.totalPages, | ||
| 208 | - visiblePages: 6, | ||
| 209 | - currentPage: page + 1, | ||
| 210 | - first: '<li class="first"><a href="javascript:void(0);">首页<\/a><\/li>', | ||
| 211 | - prev: '<li class="prev"><a href="javascript:void(0);">上一页<\/a><\/li>', | ||
| 212 | - next: '<li class="next"><a href="javascript:void(0);">下一页<\/a><\/li>', | ||
| 213 | - last: '<li class="last"><a href="javascript:void(0);">尾页<\/a><\/li>', | ||
| 214 | - page: '<li class="page"><a href="javascript:void(0);">{{page}}<\/a><\/li>', | ||
| 215 | - onPageChange: function (num, type) { | ||
| 216 | - if(initPagination){ | ||
| 217 | - initPagination = false; | ||
| 218 | - return; | ||
| 219 | - } | ||
| 220 | - | ||
| 221 | - | ||
| 222 | - page = num - 1; | ||
| 223 | - jsDoQuery(null, false); | ||
| 224 | - } | ||
| 225 | - }); | ||
| 226 | - } | ||
| 227 | - | ||
| 228 | - function openAllotWindow() { | ||
| 229 | - var id = $(this).data('id'); | ||
| 230 | - $.get('/pages/permission/user/controlAllot.html', function (content) { | ||
| 231 | - layer.open({ | ||
| 232 | - type: 1, | ||
| 233 | - area: ['600px', '395px'], | ||
| 234 | - content: content, | ||
| 235 | - title: '线路调度权限分配', | ||
| 236 | - shift: 5, | ||
| 237 | - scrollbar: false, | ||
| 238 | - success: function () { | ||
| 239 | - $('#pageRealControlAllotWrap').trigger('init', id); | ||
| 240 | - } | ||
| 241 | - }); | ||
| 242 | - }); | ||
| 243 | - } | ||
| 244 | - | ||
| 245 | - //删除 | ||
| 246 | - $('#removeButton').on('click', function(){ | ||
| 247 | - if($(this).attr('disabled')) | ||
| 248 | - return; | ||
| 249 | - | ||
| 250 | - var id = $('#datatable_resource input.icheck:checked').data('id'); | ||
| 251 | - | ||
| 252 | - removeConfirm('确定要删除选中的数据?', '/resource/' + id ,function(){ | ||
| 253 | - $('tr.filter .filter-submit').click(); | ||
| 254 | - }); | ||
| 255 | - }); | ||
| 256 | -}); | ||
| 257 | -//改变状态 | ||
| 258 | -function changeEnabled(id,enabled){ | ||
| 259 | - $get('/user/changeEnabled',{id:id,enabled:enabled},function(result){ | ||
| 260 | - jsDoQuery(null, true); | ||
| 261 | - }) | ||
| 262 | -} | 1 | +<div class="page-head"> |
| 2 | + <div class="page-title"> | ||
| 3 | + <h1>用户管理</h1> | ||
| 4 | + </div> | ||
| 5 | +</div> | ||
| 6 | + | ||
| 7 | +<ul class="page-breadcrumb breadcrumb"> | ||
| 8 | + <li><a href="/pages/home.html" data-pjax>首页</a> <i class="fa fa-circle"></i></li> | ||
| 9 | + <li><span class="active">权限管理</span> <i class="fa fa-circle"></i></li> | ||
| 10 | + <li><span class="active">用户管理</span></li> | ||
| 11 | +</ul> | ||
| 12 | + | ||
| 13 | +<div class="row"> | ||
| 14 | + <div class="col-md-12"> | ||
| 15 | + <!-- Begin: life time stats --> | ||
| 16 | + <div class="portlet light portlet-fit portlet-datatable bordered"> | ||
| 17 | + <div class="portlet-title"> | ||
| 18 | + <div class="caption"> | ||
| 19 | + <i class="fa fa-users font-dark"></i> <span | ||
| 20 | + class="caption-subject font-dark sbold uppercase">用户数据表</span> | ||
| 21 | + </div> | ||
| 22 | + <div class="actions"> | ||
| 23 | + <a class="btn btn-circle blue" href="add.html" data-pjax><i class="fa fa-plus"></i> 添加用户</a> | ||
| 24 | + | ||
| 25 | + </div> | ||
| 26 | + </div> | ||
| 27 | + <div class="portlet-body"> | ||
| 28 | + <div class="table-container" style="margin-top: 10px"> | ||
| 29 | + <table | ||
| 30 | + class="table table-striped table-bordered table-hover table-checkable" | ||
| 31 | + id="datatable_user"> | ||
| 32 | + <thead> | ||
| 33 | + <tr role="row" class="heading"> | ||
| 34 | + <th width="3%">#</th> | ||
| 35 | + <th width="10%">登录名</th> | ||
| 36 | + <th width="10%">姓名</th> | ||
| 37 | + <th width="12%">所属机构</th> | ||
| 38 | + <th width="11%">角色</th> | ||
| 39 | + <th width="10%">状态</th> | ||
| 40 | + <th width="18%">最后登录时间</th> | ||
| 41 | + <th width="26%">操作</th> | ||
| 42 | + </tr> | ||
| 43 | + <tr role="row" class="filter"> | ||
| 44 | + <td></td> | ||
| 45 | + <td> | ||
| 46 | + <input type="text" class="form-control form-filter input-sm" name="userName_like"> | ||
| 47 | + </td> | ||
| 48 | + <td> | ||
| 49 | + <input type="text" class="form-control form-filter input-sm" name="name_like"> | ||
| 50 | + </td> | ||
| 51 | + <td> | ||
| 52 | + <input type="text" class="form-control form-filter input-sm" name="agencies_like"> | ||
| 53 | + </td> | ||
| 54 | + <td></td> | ||
| 55 | + <td> | ||
| 56 | + <select class="form-control form-filter " name="enabled_eq"> | ||
| 57 | + <option value="">请选择...</option> | ||
| 58 | + <option value="true">可用</option> | ||
| 59 | + <option value="false">禁用</option> | ||
| 60 | + </select> | ||
| 61 | + </td> | ||
| 62 | + <td></td> | ||
| 63 | + <td> | ||
| 64 | + <button class="btn btn-sm green btn-outline filter-submit margin-bottom" > | ||
| 65 | + <i class="fa fa-search"></i> 搜索</button> | ||
| 66 | + | ||
| 67 | + <button class="btn btn-sm red btn-outline filter-cancel"> | ||
| 68 | + <i class="fa fa-times"></i> 重置</button> | ||
| 69 | + </td> | ||
| 70 | + </tr> | ||
| 71 | + </thead> | ||
| 72 | + <tbody></tbody> | ||
| 73 | + </table> | ||
| 74 | + <div style="text-align: right;"> | ||
| 75 | + <ul id="pagination" class="pagination"></ul> | ||
| 76 | + </div> | ||
| 77 | + </div> | ||
| 78 | + </div> | ||
| 79 | + </div> | ||
| 80 | + </div> | ||
| 81 | +</div> | ||
| 82 | + | ||
| 83 | +<script id="user_list_temp" type="text/html"> | ||
| 84 | +{{each list as obj i}} | ||
| 85 | +<tr> | ||
| 86 | + <td style="vertical-align: middle;"> | ||
| 87 | + <!--<input type="checkbox" class="group-checkable icheck" data-id="{{obj.id}}">--> | ||
| 88 | + {{++i}} | ||
| 89 | + </td> | ||
| 90 | + <td> | ||
| 91 | + {{obj.userName}} | ||
| 92 | + </td> | ||
| 93 | + <td> | ||
| 94 | + {{obj.name}} | ||
| 95 | + </td> | ||
| 96 | + <td> | ||
| 97 | + {{obj.agencies}} | ||
| 98 | + </td> | ||
| 99 | + <td> | ||
| 100 | + {{each obj.roles as role j}} | ||
| 101 | + {{role.roleName}}、 | ||
| 102 | + {{/each}} | ||
| 103 | + </td> | ||
| 104 | + <td> | ||
| 105 | + {{if obj.enabled}} | ||
| 106 | + 可用 | ||
| 107 | + {{else}} | ||
| 108 | + 禁用 | ||
| 109 | + {{/if}} | ||
| 110 | + </td> | ||
| 111 | + <td> | ||
| 112 | + {{obj.lastLoginDate}} | ||
| 113 | + </td> | ||
| 114 | + <td> | ||
| 115 | + {{if obj.isEdit == 0}} | ||
| 116 | + <a class="btn btn-sm blue btn-outline" href="edit.html?no={{obj.id}}" data-pjax><i class="fa fa-edit"></i> 编辑</a> | ||
| 117 | + <!--<button type="button" class="btn btn-sm line_allot_btn" data-id="{{obj.id}}">线调线路分配</button>--> | ||
| 118 | + {{/if}} | ||
| 119 | + {{if obj.isAdmin}} | ||
| 120 | + <a class="btn btn-sm red btn-outline reset_password" data-id="{{obj.id}}" data-name="{{obj.userName}}" data-last="{{obj.lastPwdDate}}"><i class="fa fa-undo"></i> 重置密码</a> | ||
| 121 | + {{/if}} | ||
| 122 | + {{if obj.isAdmin}} | ||
| 123 | + <a class="btn btn-sm red btn-outline unlock" data-name="{{obj.userName}}" data-pjax><i class="fa fa-unlock"></i> 解除锁定</a> | ||
| 124 | + {{/if}} | ||
| 125 | + </td> | ||
| 126 | +</tr> | ||
| 127 | +{{/each}} | ||
| 128 | +{{if list.length == 0}} | ||
| 129 | +<tr> | ||
| 130 | + <td colspan=8><h6 class="muted">没有找到相关数据</h6></td> | ||
| 131 | +</tr> | ||
| 132 | +{{/if}} | ||
| 133 | +</script> | ||
| 134 | + | ||
| 135 | +<script> | ||
| 136 | +$(function(){ | ||
| 137 | + var page = 0, initPagination; | ||
| 138 | + var user,isAdmin = false; | ||
| 139 | + var icheckOptions = { | ||
| 140 | + checkboxClass: 'icheckbox_flat-blue', | ||
| 141 | + increaseArea: '20%' | ||
| 142 | + }; | ||
| 143 | + $.get('/user/getCurrentUser', function(data) { | ||
| 144 | + user = data; | ||
| 145 | + var roles = user.roles; | ||
| 146 | + $.each(roles,function () { | ||
| 147 | + if(this.level == 1) | ||
| 148 | + isAdmin = true; | ||
| 149 | + }) | ||
| 150 | + | ||
| 151 | + }); | ||
| 152 | + | ||
| 153 | + setTimeout(function () { | ||
| 154 | + $(document).on('click', 'a.reset_password', function () { | ||
| 155 | + var id = $(this).data('id'), name = $(this).data('name'), last = $(this).data('last'); | ||
| 156 | + $.get('/pages/permission/user/resetPWD.html', function (content) { | ||
| 157 | + layer.open({ | ||
| 158 | + type: 1, | ||
| 159 | + area: ['600px', '360px'], | ||
| 160 | + content: content, | ||
| 161 | + title: '修改密码', | ||
| 162 | + shift: 5, | ||
| 163 | + scrollbar: false, | ||
| 164 | + success: function (layero, index) { | ||
| 165 | + $(layero).find('#user_id').val(id); | ||
| 166 | + $(layero).find('#user_name').val(name); | ||
| 167 | + $(layero).find('#last_pwd_date').val(last ? moment(last).format("YYYY-MM-DD HH:mm:ss") : ''); | ||
| 168 | + $(layero).find('#window_index').val(index); | ||
| 169 | + } | ||
| 170 | + }); | ||
| 171 | + }); | ||
| 172 | + }).on('click', 'a.unlock', function () { | ||
| 173 | + var name = $(this).data('name'); | ||
| 174 | + swal({ | ||
| 175 | + title: "解除锁定", | ||
| 176 | + text: "将登录名为"+name+"的用户,锁定状态解除!", | ||
| 177 | + type: "warning", | ||
| 178 | + showCancelButton: true, | ||
| 179 | + confirmButtonColor: "#DD6B55", | ||
| 180 | + confirmButtonText: "重置", | ||
| 181 | + cancelButtonText: "取消", | ||
| 182 | + closeOnConfirm: false }, | ||
| 183 | + function(){ | ||
| 184 | + $.post('/user/unlock',{'userName':name},function(result){ | ||
| 185 | + if(result.status=='SUCCESS') { | ||
| 186 | + // 弹出添加成功提示消息 | ||
| 187 | + swal("登录名为"+name+"的用户锁定解除成功!", "success"); | ||
| 188 | + } else if(result.status=='ERROR') { | ||
| 189 | + // 弹出添加失败提示消息 | ||
| 190 | + swal("锁定解除失败!", result.msg+",请联系开发人员!", "ERROR"); | ||
| 191 | + } | ||
| 192 | + jsDoQuery(getParams(), true); | ||
| 193 | + }); | ||
| 194 | + }); | ||
| 195 | + }); | ||
| 196 | + jsDoQuery(null,true); | ||
| 197 | + | ||
| 198 | + //重置 | ||
| 199 | + $('tr.filter .filter-cancel').on('click', function(){ | ||
| 200 | + $('tr.filter input, select').val('').change(); | ||
| 201 | + jsDoQuery(null, true); | ||
| 202 | + }); | ||
| 203 | + | ||
| 204 | + function getParams() { | ||
| 205 | + var cells = $('tr.filter')[0].cells | ||
| 206 | + ,params = {} | ||
| 207 | + ,name; | ||
| 208 | + $.each(cells, function(i, cell){ | ||
| 209 | + var items = $('input,select', cell); | ||
| 210 | + for(var j = 0, item; item = items[j++];){ | ||
| 211 | + name = $(item).attr('name'); | ||
| 212 | + if(name){ | ||
| 213 | + params[name] = $(item).val(); | ||
| 214 | + } | ||
| 215 | + } | ||
| 216 | + }); | ||
| 217 | + return params; | ||
| 218 | + } | ||
| 219 | + | ||
| 220 | + //提交 | ||
| 221 | + $('tr.filter .filter-submit').on('click', function(){ | ||
| 222 | + jsDoQuery(getParams(), true); | ||
| 223 | + }); | ||
| 224 | + | ||
| 225 | + /* | ||
| 226 | + * 获取数据 p: 要提交的参数, pagination: 是否重新分页 | ||
| 227 | + */ | ||
| 228 | + function jsDoQuery(p, pagination){ | ||
| 229 | + var roles = new Map(); | ||
| 230 | + // 查询下级角色 | ||
| 231 | + $.ajax({ | ||
| 232 | + url: "/role/findSubordinate", | ||
| 233 | + type: "Get", | ||
| 234 | + async:false, | ||
| 235 | + data: null, | ||
| 236 | + success: function (rs) { | ||
| 237 | + if(rs.status == "SUCCESS"){ | ||
| 238 | + $.each(rs.list,function(i,obj){ | ||
| 239 | + roles[obj.id] = obj; | ||
| 240 | + }); | ||
| 241 | + } | ||
| 242 | + } | ||
| 243 | + }); | ||
| 244 | + var params = {}; | ||
| 245 | + if(p) | ||
| 246 | + params = p; | ||
| 247 | + //更新时间排序 | ||
| 248 | + params['order'] = 'lastLoginDate'; | ||
| 249 | + params['page'] = page; | ||
| 250 | + // params['id_eq'] = "1"; | ||
| 251 | + var i = layer.load(2); | ||
| 252 | + $get('/user' ,params, function(data){ | ||
| 253 | + var list = data.content; | ||
| 254 | + $.each(list, function(i, obj) { | ||
| 255 | + if(roles[obj.roles[0].id] != null && roles[obj.roles[0].id] != undefined){ | ||
| 256 | + obj.isEdit = 0; | ||
| 257 | + } else{ | ||
| 258 | + obj.isEdit = 1; | ||
| 259 | + } | ||
| 260 | + obj.isAdmin = isAdmin; | ||
| 261 | + obj.lastLoginDate = moment(obj.lastLoginDate).format("YYYY-MM-DD HH:mm:ss"); | ||
| 262 | + }); | ||
| 263 | + | ||
| 264 | + var bodyHtm = template('user_list_temp', {list: list}); | ||
| 265 | + | ||
| 266 | + $('#datatable_user tbody').html(bodyHtm) | ||
| 267 | + .find('.icheck').iCheck(icheckOptions) | ||
| 268 | + .on('ifChanged', iCheckChange); | ||
| 269 | + if(pagination && list.length > 0){ | ||
| 270 | + //重新分页 | ||
| 271 | + initPagination = true; | ||
| 272 | + showPagination(data); | ||
| 273 | + } | ||
| 274 | + layer.close(i); | ||
| 275 | + | ||
| 276 | + $('.line_allot_btn').on('click', openAllotWindow); | ||
| 277 | + }); | ||
| 278 | + } | ||
| 279 | + | ||
| 280 | + function iCheckChange(){ | ||
| 281 | + var tr = $(this).parents('tr'); | ||
| 282 | + if(this.checked) | ||
| 283 | + tr.addClass('row-active'); | ||
| 284 | + else | ||
| 285 | + tr.removeClass('row-active'); | ||
| 286 | + | ||
| 287 | + if($('#datatable_resource input.icheck:checked').length == 1) | ||
| 288 | + $('#removeButton').removeAttr('disabled'); | ||
| 289 | + else | ||
| 290 | + $('#removeButton').attr('disabled', 'disabled'); | ||
| 291 | + } | ||
| 292 | + | ||
| 293 | + function showPagination(data){ | ||
| 294 | + //分页 | ||
| 295 | + $('#pagination').jqPaginator({ | ||
| 296 | + totalPages: data.totalPages, | ||
| 297 | + visiblePages: 6, | ||
| 298 | + currentPage: page + 1, | ||
| 299 | + first: '<li class="first"><a href="javascript:void(0);">首页<\/a><\/li>', | ||
| 300 | + prev: '<li class="prev"><a href="javascript:void(0);">上一页<\/a><\/li>', | ||
| 301 | + next: '<li class="next"><a href="javascript:void(0);">下一页<\/a><\/li>', | ||
| 302 | + last: '<li class="last"><a href="javascript:void(0);">尾页<\/a><\/li>', | ||
| 303 | + page: '<li class="page"><a href="javascript:void(0);">{{page}}<\/a><\/li>', | ||
| 304 | + onPageChange: function (num, type) { | ||
| 305 | + if(initPagination){ | ||
| 306 | + initPagination = false; | ||
| 307 | + return; | ||
| 308 | + } | ||
| 309 | + | ||
| 310 | + | ||
| 311 | + page = num - 1; | ||
| 312 | + jsDoQuery(null, false); | ||
| 313 | + } | ||
| 314 | + }); | ||
| 315 | + } | ||
| 316 | + | ||
| 317 | + function openAllotWindow() { | ||
| 318 | + var id = $(this).data('id'); | ||
| 319 | + $.get('/pages/permission/user/controlAllot.html', function (content) { | ||
| 320 | + layer.open({ | ||
| 321 | + type: 1, | ||
| 322 | + area: ['600px', '395px'], | ||
| 323 | + content: content, | ||
| 324 | + title: '线路调度权限分配', | ||
| 325 | + shift: 5, | ||
| 326 | + scrollbar: false, | ||
| 327 | + success: function () { | ||
| 328 | + $('#pageRealControlAllotWrap').trigger('init', id); | ||
| 329 | + } | ||
| 330 | + }); | ||
| 331 | + }); | ||
| 332 | + } | ||
| 333 | + | ||
| 334 | + //删除 | ||
| 335 | + $('#removeButton').on('click', function(){ | ||
| 336 | + if($(this).attr('disabled')) | ||
| 337 | + return; | ||
| 338 | + | ||
| 339 | + var id = $('#datatable_resource input.icheck:checked').data('id'); | ||
| 340 | + | ||
| 341 | + removeConfirm('确定要删除选中的数据?', '/resource/' + id ,function(){ | ||
| 342 | + $('tr.filter .filter-submit').click(); | ||
| 343 | + }); | ||
| 344 | + }); | ||
| 345 | + },1000); | ||
| 346 | + | ||
| 347 | +}); | ||
| 348 | +//改变状态 | ||
| 349 | +function changeEnabled(id,enabled){ | ||
| 350 | + $get('/user/changeEnabled',{id:id,enabled:enabled},function(result){ | ||
| 351 | + jsDoQuery(null, true); | ||
| 352 | + }) | ||
| 353 | +} | ||
| 354 | +// 重置密码 | ||
| 355 | +function resetPassword(userId, ld) { | ||
| 356 | + $.get('/pages/permission/user/resetPWD.html', function (content) { | ||
| 357 | + layer.open({ | ||
| 358 | + type: 1, | ||
| 359 | + area: ['600px', '360px'], | ||
| 360 | + content: content, | ||
| 361 | + title: '修改密码', | ||
| 362 | + shift: 5, | ||
| 363 | + scrollbar: false, | ||
| 364 | + success: function (layero, index) { | ||
| 365 | + $(layero).find('#user_id').val(userId); | ||
| 366 | + $(layero).find('#last_pwd_date').val(ld ? moment(ld).format("YYYY-MM-DD HH:mm:ss") : ''); | ||
| 367 | + $(layero).find('#window_index').val(index); | ||
| 368 | + } | ||
| 369 | + }); | ||
| 370 | + }); | ||
| 371 | + | ||
| 372 | +} | ||
| 263 | </script> | 373 | </script> |
| 264 | \ No newline at end of file | 374 | \ No newline at end of file |
src/main/resources/static/pages/permission/user/main.html
0 → 100644
| 1 | +<iframe src="/pages/permission/user/authorize.html?origin=real_control_iframe" frameborder="0" style="height: 90%;width: 100%;"></iframe> | ||
| 2 | +<div class="form-actions"> | ||
| 3 | + <div class="row"> | ||
| 4 | + <div class="col-md-offset-3 col-md-4"> | ||
| 5 | + </div> | ||
| 6 | + </div> | ||
| 7 | +</div> | ||
| 0 | \ No newline at end of file | 8 | \ No newline at end of file |
src/main/resources/static/pages/permission/user/resetPWD.html
0 → 100644
| 1 | +<div class="row"> | ||
| 2 | + <div class="col-md-12"> | ||
| 3 | + <!-- BEGIN VALIDATION STATES--> | ||
| 4 | + <div class="portlet light portlet-fit portlet-form bordered"> | ||
| 5 | + <input type="hidden" id="window_index" name="window_index"> | ||
| 6 | + <div class="portlet-body"> | ||
| 7 | + <form class="form-horizontal" id="resetPWDForm"> | ||
| 8 | + <input type="hidden" id="user_id" name="id"> | ||
| 9 | + <input type="hidden" id="user_name"> | ||
| 10 | + <div class="form-group" style="margin-top: 60px"> | ||
| 11 | + <label class="control-label col-md-4">最近密码更新时间: | ||
| 12 | + </label> | ||
| 13 | + <div class="col-md-6"> | ||
| 14 | + <div class="input-icon right"> | ||
| 15 | + <i class="fa"></i> | ||
| 16 | + <input type="text" readonly class="form-control" id="last_pwd_date" /> </div> | ||
| 17 | + </div> | ||
| 18 | + </div> | ||
| 19 | + | ||
| 20 | + <div class="form-group" > | ||
| 21 | + <label class="control-label col-md-4">密码有效期(天): | ||
| 22 | + </label> | ||
| 23 | + <div class="col-md-6"> | ||
| 24 | + <div class="input-icon right"> | ||
| 25 | + <i class="fa"></i> | ||
| 26 | + <input type="number" class="form-control" name="pwdValidPeriod" id="pwd_valid_period" value="30" /> </div> | ||
| 27 | + </div> | ||
| 28 | + </div> | ||
| 29 | + <div class="form-actions"> | ||
| 30 | + <div class="row"> | ||
| 31 | + <div class="col-md-offset-5 col-md-7"> | ||
| 32 | + <button type="button" id="confirm" class="btn green">确定</button> | ||
| 33 | + <button type="button" class="btn default">取消</button> | ||
| 34 | + </div> | ||
| 35 | + </div> | ||
| 36 | + </div> | ||
| 37 | + </form> | ||
| 38 | + </div> | ||
| 39 | + </div> | ||
| 40 | + </div> | ||
| 41 | +</div> | ||
| 42 | + | ||
| 43 | + | ||
| 44 | +<script> | ||
| 45 | + $(function(){ | ||
| 46 | + debugger | ||
| 47 | + $("#confirm").on('click',function(){ | ||
| 48 | + var data = $('#resetPWDForm').serializeJSON(); | ||
| 49 | + var index = $('#window_index').val(), name = $('#user_name').val(); | ||
| 50 | + $.post('/user/resetPassword', data, function(result) { | ||
| 51 | + parent.layer.close(index); | ||
| 52 | + if(result.status == 'SUCCESS') { | ||
| 53 | + // 弹出添加成功提示消息 | ||
| 54 | + swal('登录名为' + name + '的用户密码重置成功!', 'success'); | ||
| 55 | + } else if(result.status == 'ERROR') { | ||
| 56 | + // 弹出添加失败提示消息 | ||
| 57 | + swal('重置失败!', result.msg + ',请联系开发人员!', 'ERROR'); | ||
| 58 | + } | ||
| 59 | + }); | ||
| 60 | + }); | ||
| 61 | + | ||
| 62 | + $("#pwd_cancel").on('click', function() { | ||
| 63 | + var index = $('#window_index').val(); | ||
| 64 | + parent.layer.close(index); | ||
| 65 | + }); | ||
| 66 | + }); | ||
| 67 | +</script> | ||
| 0 | \ No newline at end of file | 68 | \ No newline at end of file |
src/main/resources/static/real_control_v2/main.html
| @@ -114,7 +114,7 @@ | @@ -114,7 +114,7 @@ | ||
| 114 | </script> | 114 | </script> |
| 115 | 115 | ||
| 116 | <!-- 地图相关 --> | 116 | <!-- 地图相关 --> |
| 117 | -<script src="http://api.map.baidu.com/api?v=2.0&ak=IGGrr4UjwIYzatoCRFKEL8sT"></script> | 117 | +<script src="http://api.map.baidu.com/api?v=2.0&ak=1TgEKvYqohJyeGXnN6yHSSTb4psOarQw"></script> |
| 118 | <script src="http://api.map.baidu.com/library/TrafficControl/1.4/src/TrafficControl_min.js"></script> | 118 | <script src="http://api.map.baidu.com/library/TrafficControl/1.4/src/TrafficControl_min.js"></script> |
| 119 | <script src="/assets/js/baidu//MarkerClusterer.js" merge="plugins"></script> | 119 | <script src="/assets/js/baidu//MarkerClusterer.js" merge="plugins"></script> |
| 120 | <script src="/assets/js/TransGPS.js" merge="plugins"></script> | 120 | <script src="/assets/js/TransGPS.js" merge="plugins"></script> |