Commit 62ea1465a4a0cc1b7a3f4f44377aa628676e9be9

Authored by 欧保权
1 parent 2573476b

徽辰智电后端人员管理

Too many changes to show.

To preserve performance only 29 of 38 files are displayed.

  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<project xmlns="http://maven.apache.org/POM/4.0.0"
  3 + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5 + <modelVersion>4.0.0</modelVersion>
  6 +
  7 + <groupId>com.qgutech</groupId>
  8 + <artifactId>app-power</artifactId>
  9 + <version>1.0-SNAPSHOT</version>
  10 +
  11 + <parent>
  12 + <groupId>org.springframework.boot</groupId>
  13 + <artifactId>spring-boot-starter-parent</artifactId>
  14 + <version>2.2.4.RELEASE</version>
  15 + </parent>
  16 + <dependencies>
  17 + <dependency>
  18 + <groupId>org.springframework.boot</groupId>
  19 + <artifactId>spring-boot-starter-web</artifactId>
  20 + </dependency>
  21 + <!--导入配置文件处理器-->
  22 + <dependency>
  23 + <groupId>org.springframework.boot</groupId>
  24 + <artifactId>spring-boot-configuration-processor</artifactId>
  25 + <optional>true</optional>
  26 + </dependency>
  27 + <dependency>
  28 + <groupId>org.webjars</groupId>
  29 + <artifactId>jquery</artifactId>
  30 + <version>3.3.1</version>
  31 + </dependency>
  32 + <dependency>
  33 + <groupId>org.springframework.boot</groupId>
  34 + <artifactId>spring-boot-starter-thymeleaf</artifactId>
  35 + </dependency>
  36 + <dependency>
  37 + <groupId>org.springframework.boot</groupId>
  38 + <artifactId>spring-boot-starter-jdbc</artifactId>
  39 + </dependency>
  40 + <dependency>
  41 + <groupId>mysql</groupId>
  42 + <artifactId>mysql-connector-java</artifactId>
  43 + </dependency>
  44 + <dependency>
  45 + <groupId>com.alibaba</groupId>
  46 + <artifactId>druid</artifactId>
  47 + <version>1.2.23</version>
  48 + </dependency>
  49 + <dependency>
  50 + <groupId>org.mybatis.spring.boot</groupId>
  51 + <artifactId>mybatis-spring-boot-starter</artifactId>
  52 + <version>1.3.1</version>
  53 + </dependency>
  54 + <dependency>
  55 + <groupId>org.projectlombok</groupId>
  56 + <artifactId>lombok</artifactId>
  57 + </dependency>
  58 + <dependency>
  59 + <groupId>org.springframework.boot</groupId>
  60 + <artifactId>spring-boot-starter-test</artifactId>
  61 + <scope>test</scope>
  62 + </dependency>
  63 + <dependency>
  64 + <groupId>org.apache.commons</groupId>
  65 + <artifactId>commons-lang3</artifactId>
  66 + <version>3.9</version>
  67 + </dependency>
  68 + <dependency>
  69 + <groupId>commons-httpclient</groupId>
  70 + <artifactId>commons-httpclient</artifactId>
  71 + <version>3.1</version>
  72 + </dependency>
  73 + <dependency>
  74 + <groupId>org.apache.httpcomponents</groupId>
  75 + <artifactId>httpclient</artifactId>
  76 + <version>4.5.8</version>
  77 + </dependency>
  78 + <dependency>
  79 + <groupId>org.apache.commons</groupId>
  80 + <artifactId>commons-collections4</artifactId>
  81 + <version>4.2</version>
  82 + </dependency>
  83 + <dependency>
  84 + <groupId>com.alibaba</groupId>
  85 + <artifactId>fastjson</artifactId>
  86 + <version>2.0.38</version>
  87 + </dependency>
  88 + <dependency>
  89 + <groupId>junit</groupId>
  90 + <artifactId>junit</artifactId>
  91 + <version>4.12</version>
  92 + </dependency>
  93 + </dependencies>
  94 +
  95 + <build>
  96 + <finalName>${project.artifactId}</finalName>
  97 + <plugins>
  98 + <plugin>
  99 + <groupId>org.springframework.boot</groupId>
  100 + <artifactId>spring-boot-maven-plugin</artifactId>
  101 + </plugin>
  102 + </plugins>
  103 + </build>
  104 +</project>
... ...
  1 +package com.qgutech;
  2 +
  3 +import org.mybatis.spring.annotation.MapperScan;
  4 +import org.springframework.boot.SpringApplication;
  5 +import org.springframework.boot.autoconfigure.SpringBootApplication;
  6 +
  7 +/**
  8 + * @author xxx
  9 + * @date 2024/12/14 21:59
  10 + * @description
  11 + */
  12 +@MapperScan(value = "com.qgutech.mapper")
  13 +@SpringBootApplication
  14 +public class MainApplication {
  15 + public static void main(String[] args) {
  16 + SpringApplication.run(MainApplication.class, args);
  17 + }
  18 +}
... ...
  1 +package com.qgutech.common;
  2 +
  3 +/**
  4 + * @author xxx
  5 + * @date 2024/12/19 9:58
  6 + * @description
  7 + */
  8 +public class JsonResult<T> {
  9 + private boolean success = true;
  10 + private T data;
  11 + private String msg;
  12 + private String errCode;
  13 +
  14 + public JsonResult() {
  15 + }
  16 +
  17 + public JsonResult(boolean success, String msg) {
  18 + this.success = success;
  19 + this.msg = msg;
  20 + }
  21 +
  22 + public JsonResult(boolean success, String msg, T data) {
  23 + this.success = success;
  24 + this.msg = msg;
  25 + this.data = data;
  26 + }
  27 +
  28 + public JsonResult(boolean success, String errCode, String msg, T data) {
  29 + this.success = success;
  30 + this.errCode = errCode;
  31 + this.msg = msg;
  32 + this.data = data;
  33 + }
  34 +
  35 + public static JsonResult ok() {
  36 + return new JsonResult();
  37 + }
  38 +
  39 + public static JsonResult ok(String msg) {
  40 + return new JsonResult(true, msg);
  41 + }
  42 +
  43 + public static <T> JsonResult ok(String msg, T data) {
  44 + return new JsonResult(true, msg, data);
  45 + }
  46 +
  47 + public static JsonResult error() {
  48 + return new JsonResult(false, (String)null);
  49 + }
  50 +
  51 + public static JsonResult error(String msg) {
  52 + return new JsonResult(false, msg);
  53 + }
  54 +
  55 + public static <T> JsonResult error(String errCode, String msg) {
  56 + return new JsonResult(false, errCode, msg);
  57 + }
  58 +
  59 + public boolean isSuccess() {
  60 + return this.success;
  61 + }
  62 +
  63 + public T getData() {
  64 + return this.data;
  65 + }
  66 +
  67 + public String getMsg() {
  68 + return this.msg;
  69 + }
  70 +
  71 + public String getErrCode() {
  72 + return this.errCode;
  73 + }
  74 +
  75 + public void setSuccess(final boolean success) {
  76 + this.success = success;
  77 + }
  78 +
  79 + public void setData(final T data) {
  80 + this.data = data;
  81 + }
  82 +
  83 + public void setMsg(final String msg) {
  84 + this.msg = msg;
  85 + }
  86 +
  87 + public void setErrCode(final String errCode) {
  88 + this.errCode = errCode;
  89 + }
  90 +
  91 + public boolean equals(final Object o) {
  92 + if (o == this) {
  93 + return true;
  94 + } else if (!(o instanceof JsonResult)) {
  95 + return false;
  96 + } else {
  97 + JsonResult<?> other = (JsonResult)o;
  98 + if (!other.canEqual(this)) {
  99 + return false;
  100 + } else if (this.isSuccess() != other.isSuccess()) {
  101 + return false;
  102 + } else {
  103 + label49: {
  104 + Object this$data = this.getData();
  105 + Object other$data = other.getData();
  106 + if (this$data == null) {
  107 + if (other$data == null) {
  108 + break label49;
  109 + }
  110 + } else if (this$data.equals(other$data)) {
  111 + break label49;
  112 + }
  113 +
  114 + return false;
  115 + }
  116 +
  117 + Object this$msg = this.getMsg();
  118 + Object other$msg = other.getMsg();
  119 + if (this$msg == null) {
  120 + if (other$msg != null) {
  121 + return false;
  122 + }
  123 + } else if (!this$msg.equals(other$msg)) {
  124 + return false;
  125 + }
  126 +
  127 + Object this$errCode = this.getErrCode();
  128 + Object other$errCode = other.getErrCode();
  129 + if (this$errCode == null) {
  130 + if (other$errCode != null) {
  131 + return false;
  132 + }
  133 + } else if (!this$errCode.equals(other$errCode)) {
  134 + return false;
  135 + }
  136 +
  137 + return true;
  138 + }
  139 + }
  140 + }
  141 +
  142 + protected boolean canEqual(final Object other) {
  143 + return other instanceof JsonResult;
  144 + }
  145 +
  146 + public int hashCode() {
  147 + int result = 1;
  148 + result = result * 59 + (this.isSuccess() ? 79 : 97);
  149 + Object $data = this.getData();
  150 + result = result * 59 + ($data == null ? 43 : $data.hashCode());
  151 + Object $msg = this.getMsg();
  152 + result = result * 59 + ($msg == null ? 43 : $msg.hashCode());
  153 + Object $errCode = this.getErrCode();
  154 + result = result * 59 + ($errCode == null ? 43 : $errCode.hashCode());
  155 + return result;
  156 + }
  157 +
  158 + public String toString() {
  159 + return "JsonResult(success=" + this.isSuccess() + ", data=" + this.getData() + ", msg=" + this.getMsg() + ", errCode=" + this.getErrCode() + ")";
  160 + }
  161 +}
... ...
  1 +package com.qgutech.config;
  2 +
  3 +import com.alibaba.druid.pool.DruidDataSource;
  4 +import com.alibaba.druid.support.http.StatViewServlet;
  5 +import com.alibaba.druid.support.http.WebStatFilter;
  6 +import org.springframework.boot.context.properties.ConfigurationProperties;
  7 +import org.springframework.boot.web.servlet.FilterRegistrationBean;
  8 +import org.springframework.boot.web.servlet.ServletRegistrationBean;
  9 +import org.springframework.context.annotation.Bean;
  10 +import org.springframework.context.annotation.Configuration;
  11 +
  12 +import javax.servlet.Filter;
  13 +import javax.sql.DataSource;
  14 +import java.util.Arrays;
  15 +import java.util.HashMap;
  16 +import java.util.Map;
  17 +
  18 +/**
  19 + * @author xxx
  20 + * @date 2024/12/17 11:16
  21 + * @description
  22 + */
  23 +@Configuration
  24 +public class DruidConfig {
  25 + @ConfigurationProperties(prefix = "spring.datasource")
  26 + @Bean
  27 + public DataSource druid() {
  28 + return new DruidDataSource();
  29 + }
  30 +
  31 + // 配置Druid监控
  32 + // 1.配置管理后台的servlet
  33 + @Bean
  34 + public ServletRegistrationBean statViewServlet() {
  35 + ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
  36 + Map<String, String> initParams = new HashMap<>();
  37 + initParams.put("loginUsername", "admin");
  38 + initParams.put("loginPassword", "admin123");
  39 + bean.setInitParameters(initParams);
  40 + return bean;
  41 + }
  42 +
  43 + // 配置一个监控的filter
  44 + @Bean
  45 + public FilterRegistrationBean webStatFilter() {
  46 + FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
  47 + bean.setFilter(new WebStatFilter());
  48 + Map<String, String> initParams = new HashMap<>();
  49 + initParams.put("exclusions", "*.js,*.css,*.jpg,/druid/*");
  50 + bean.setInitParameters(initParams);
  51 + bean.setUrlPatterns(Arrays.asList("/*"));
  52 + return bean;
  53 + }
  54 +}
... ...
  1 +package com.qgutech.config;
  2 +
  3 +import com.qgutech.filter.LoginFilter;
  4 +import org.springframework.context.annotation.Bean;
  5 +import org.springframework.context.annotation.Configuration;
  6 +import org.springframework.web.servlet.config.annotation.*;
  7 +
  8 +/**
  9 + * @author xxx
  10 + * @date 2024/12/17 16:33
  11 + * @description
  12 + */
  13 +@Configuration
  14 +public class MvcConfig implements WebMvcConfigurer {
  15 +
  16 + @Override
  17 + public void addViewControllers(ViewControllerRegistry registry) {
  18 +// super.addViewControllers(registry);
  19 + registry.addViewController("/user/addUser").setViewName("addUser");
  20 + }
  21 + @Bean
  22 + public WebMvcConfigurer webMvcConfigurer(){
  23 + WebMvcConfigurer adapter = new WebMvcConfigurer() {
  24 + @Override
  25 + public void addViewControllers(ViewControllerRegistry registry) {
  26 + registry.addViewController("/").setViewName("login");
  27 + registry.addViewController("/login").setViewName("login");
  28 + }
  29 + // 注册拦截器
  30 + @Override
  31 + public void addInterceptors(InterceptorRegistry registry) {
  32 + InterceptorRegistration interceptorRegistration = registry.addInterceptor(new LoginFilter());
  33 + interceptorRegistration.addPathPatterns("/**");
  34 + interceptorRegistration.excludePathPatterns("/","/login","/user/userLogin","/img/**","/css/**","/js/**");
  35 + interceptorRegistration.excludePathPatterns("/user/login","/user/userLogout","/user/img/**","/user/css/**","/user/js/**");
  36 + }
  37 + };
  38 + return adapter;
  39 + }
  40 +
  41 + @Override
  42 + public void addResourceHandlers(ResourceHandlerRegistry registry) {
  43 + /**资源路径映射**/
  44 + registry.addResourceHandler("/img/**").addResourceLocations("classpath:/static/img/");
  45 + registry.addResourceHandler("/user/img/**").addResourceLocations("classpath:/static/img/");
  46 + registry.addResourceHandler("/user/css/**").addResourceLocations("classpath:/static/css/");
  47 + registry.addResourceHandler("/user/js/**").addResourceLocations("classpath:/static/js/");
  48 + }
  49 +}
... ...
  1 +package com.qgutech.config;
  2 +
  3 +import org.apache.ibatis.session.Configuration;
  4 +import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer;
  5 +import org.springframework.context.annotation.Bean;
  6 +
  7 +/**
  8 + * @author xxx
  9 + * @date 2024/12/17 14:09
  10 + * @description
  11 + */
  12 +@org.springframework.context.annotation.Configuration
  13 +public class MybatisConfig {
  14 + @Bean
  15 + public ConfigurationCustomizer configurationCustomizer(){
  16 + return new ConfigurationCustomizer() {
  17 + @Override
  18 + public void customize(Configuration configuration) {
  19 + configuration.setMapUnderscoreToCamelCase(true);
  20 + }
  21 + };
  22 + }
  23 +}
... ...
  1 +package com.qgutech.controller;
  2 +
  3 +import com.qgutech.common.JsonResult;
  4 +import com.qgutech.model.PowerModel;
  5 +import com.qgutech.service.PowerService;
  6 +import lombok.extern.slf4j.Slf4j;
  7 +import org.springframework.web.bind.annotation.PostMapping;
  8 +import org.springframework.web.bind.annotation.RequestBody;
  9 +import org.springframework.web.bind.annotation.RequestMapping;
  10 +import org.springframework.web.bind.annotation.RestController;
  11 +
  12 +import javax.annotation.Resource;
  13 +
  14 +/**
  15 + * @author xxx
  16 + * @date 2024/12/15 12:08
  17 + * @description
  18 + */
  19 +
  20 +/**
  21 + * 徽辰智电公司相关接口
  22 + */
  23 +@Slf4j
  24 +@RestController
  25 +@RequestMapping(value = "/hczd")
  26 +public class PowerController {
  27 +
  28 + @Resource
  29 + private PowerService powerService;
  30 +
  31 + /**
  32 + * 设备统计
  33 + */
  34 + @PostMapping("/index")
  35 + public JsonResult<?> index(@RequestBody PowerModel powerModel) {
  36 + JsonResult<Object> result = new JsonResult<>(true, "操作成功");
  37 + result.setData(powerService.getIndex(powerModel));
  38 + return result;
  39 + }
  40 +
  41 + /**
  42 + * BMS日期滚动数据
  43 + */
  44 + @PostMapping("/getDate")
  45 + public JsonResult<?> getDate(@RequestBody PowerModel powerModel) {
  46 + JsonResult<Object> result = new JsonResult<>(true, "操作成功");
  47 + String type = powerModel.getType();
  48 + result.setData(powerService.getDateMap(type));
  49 + return result;
  50 + }
  51 +
  52 +}
... ...
  1 +package com.qgutech.controller;
  2 +
  3 +import com.qgutech.common.JsonResult;
  4 +import com.qgutech.model.Page;
  5 +import com.qgutech.model.User;
  6 +import com.qgutech.service.UserService;
  7 +import com.qgutech.util.CookieUtil;
  8 +import com.qgutech.util.LoginCookieUtil;
  9 +import com.qgutech.util.PowerUtil;
  10 +import lombok.extern.slf4j.Slf4j;
  11 +import org.apache.commons.collections4.CollectionUtils;
  12 +import org.apache.commons.lang3.StringUtils;
  13 +import org.springframework.beans.factory.annotation.Value;
  14 +import org.springframework.stereotype.Controller;
  15 +import org.springframework.ui.Model;
  16 +import org.springframework.util.DigestUtils;
  17 +import org.springframework.web.bind.annotation.*;
  18 +import org.springframework.web.multipart.MultipartFile;
  19 +
  20 +import javax.annotation.Resource;
  21 +import javax.servlet.ServletOutputStream;
  22 +import javax.servlet.http.Cookie;
  23 +import javax.servlet.http.HttpServletRequest;
  24 +import javax.servlet.http.HttpServletResponse;
  25 +import javax.servlet.http.HttpSession;
  26 +import java.io.File;
  27 +import java.io.IOException;
  28 +import java.nio.charset.StandardCharsets;
  29 +import java.util.HashMap;
  30 +import java.util.List;
  31 +import java.util.Map;
  32 +import java.util.UUID;
  33 +
  34 +/**
  35 + * @author xxx
  36 + * @date 2024/12/17 12:10
  37 + * @description
  38 + */
  39 +@Slf4j
  40 +@Controller
  41 +@RequestMapping(value = "/user")
  42 +public class UserController {
  43 +
  44 + private final String POWER_SESSION_ID = "power_session_id";
  45 + @Resource
  46 + private UserService userService;
  47 + @Value("${power.user.dir}")
  48 + private String USER_DIR;
  49 +
  50 + @RequestMapping("/page")
  51 + public String page(String searchName, Map<String, Object> map, @RequestParam(required = false, defaultValue = "1") Integer pageNo) {
  52 + Page<User> page = new Page<>();
  53 + if (null != pageNo) {
  54 + page.setPageNo(pageNo);
  55 + }
  56 + List<User> users = userService.getUserList(searchName, page);
  57 + if (CollectionUtils.isNotEmpty(users)) {
  58 + for (User user : users) {
  59 + String photo = user.getPhoto();
  60 + if (StringUtils.isBlank(photo)) {
  61 + user.setPhoto("default.jpg");
  62 + }
  63 + }
  64 + }
  65 + map.put("list", users);
  66 + map.put("current", pageNo);
  67 + map.put("total", page.getTotal());
  68 + map.put("pages", page.getPages());
  69 + map.put("searchName", searchName);
  70 + return "indexUser";
  71 + }
  72 +
  73 + /**
  74 + * 用户登录
  75 + */
  76 + @PostMapping(value = "/login")
  77 + public String login(String loginName, String password, HttpSession session, HttpServletRequest request, HttpServletResponse response) {
  78 +// String loginName = paramUser.getLoginName();
  79 +// String password = paramUser.getPassword();
  80 + log.debug("接收到的用户名:{},密码:{}", loginName, password);
  81 + if (StringUtils.isBlank(loginName) || StringUtils.isBlank(password)) {
  82 + request.setAttribute("msg", "用户名或密码不能为空!");
  83 + return "login";//登录失败回到登录页面
  84 + }
  85 + try {
  86 + //执行登录业务逻辑
  87 + User user = userService.login(loginName, password);
  88 + //登录成功,保存用户登录记录
  89 + session.setAttribute("user", user);
  90 + String powerSessionId = UUID.randomUUID().toString().replaceAll("-", "");
  91 + setCookie(powerSessionId, request, response);
  92 + } catch (RuntimeException e) {
  93 + e.printStackTrace();
  94 + request.setAttribute("msg", e.getMessage());
  95 + return "login";//登录失败回到登录页面
  96 + } catch (Exception e) {
  97 + e.printStackTrace();
  98 + }
  99 + return "redirect:/user/page";//登录成功,跳转到查询员工信息控制器
  100 +// return "indexUser";//登录成功,跳转到查询员工信息控制器
  101 + }
  102 +
  103 + /**
  104 + * 用户登录H5
  105 + */
  106 + @PostMapping(value = "/userLogin")
  107 + @ResponseBody
  108 + public JsonResult<?> userLogin(@RequestBody User param, HttpServletRequest request, HttpServletResponse response) {
  109 + String msg = "成功";
  110 + String powerSessionId = UUID.randomUUID().toString().replaceAll("-", "");
  111 + Map<String, Object> resultMap = new HashMap<>();
  112 + resultMap.put(POWER_SESSION_ID, powerSessionId);
  113 + try {
  114 + //执行登录业务逻辑
  115 + String loginName = param.getLoginName();
  116 + String password = param.getPassword();
  117 + if (StringUtils.isBlank(loginName) || StringUtils.isBlank(password)) {
  118 + msg = "用户名或密码不能为空!";
  119 + return new JsonResult<>(false, msg, "");
  120 + }
  121 + User user = userService.login(loginName, password);
  122 + if (user != null) {
  123 + String photo = user.getPhoto();
  124 + if (StringUtils.isBlank(photo)) {
  125 + user.setPhoto("default.jpg");
  126 + }
  127 + }
  128 + resultMap.put("user", user);
  129 + //登录成功,保存用户登录记录
  130 + setCookie(powerSessionId, request, response);
  131 + } catch (RuntimeException e) {
  132 + e.printStackTrace();
  133 + msg = e.getMessage();
  134 + return new JsonResult<>(false, msg, "");
  135 + }
  136 + return new JsonResult<>(true, msg, resultMap);
  137 + }
  138 +
  139 + private void setCookie(String powerSessionId, HttpServletRequest request, HttpServletResponse response) {
  140 + String cookieDomain = CookieUtil.getCookieDomain(request);
  141 + String scheme = request.getScheme();
  142 + boolean secure = false;
  143 + boolean httpOnly = false;
  144 + if ("https".equals(scheme)) {
  145 + secure = true;
  146 + httpOnly = false;
  147 + }
  148 + LoginCookieUtil.addCookie(response, POWER_SESSION_ID, powerSessionId,
  149 + "/", null, cookieDomain, secure, httpOnly);
  150 + }
  151 +
  152 + /**
  153 + * 用户注册
  154 + */
  155 + @RequestMapping(value = "/register")
  156 + public String register(User user, String code, HttpSession session) {
  157 + log.debug("接收到的验证码:{}", code);
  158 + try {
  159 + //1.比较用户输入的验证码和session中的验证码是否一致
  160 + String sessionCode = session.getAttribute("code").toString();
  161 + //忽略大小写比较
  162 + if (!sessionCode.equalsIgnoreCase(code)) {
  163 + throw new RuntimeException("验证码输入错误");
  164 + }
  165 + //注册用户
  166 + userService.register(user);
  167 + } catch (RuntimeException e) {
  168 + e.printStackTrace();
  169 +
  170 + return "redirect:/register";//注册失败回到注册页面
  171 + }
  172 + return "redirect:/login";//注册成功回到登录页面
  173 + }
  174 +
  175 + /**
  176 + * 添加员工信息
  177 + * 文件上传:表单方式提交必须是post,表单enctype属性必须为 multipart/form-data
  178 + *
  179 + * @return
  180 + */
  181 + @PostMapping("/saveUser")
  182 + public String saveUser(User user, Model model, MultipartFile img) {
  183 + log.info("=========user==[{}]", user);
  184 + String uuid = UUID.randomUUID().toString().replaceAll("-", "");
  185 + user.setUserId(uuid);
  186 + String mobile = user.getMobile();
  187 + if (StringUtils.isEmpty(mobile)) {
  188 + model.addAttribute("saveMsg", "手机号不能为空");
  189 + return "addUser";
  190 + }
  191 + User oldUser = userService.getUserByMobile(mobile);
  192 + if (oldUser != null) {
  193 + model.addAttribute("saveMsg", "手机号已被使用!");
  194 + return "addUser";
  195 + }
  196 + //处理头像的上传
  197 + String fileName = img.getOriginalFilename();//获取文件名以及后缀
  198 + fileName = UUID.randomUUID() + "_" + fileName;//重新生成文件夹名
  199 + //指定上传文件的路径存储,这里是静态资源static的upload
  200 + String dirPath = USER_DIR + "/photo";
  201 + File filePath = new File(dirPath);
  202 + if (!filePath.exists()) {
  203 + filePath.mkdirs();
  204 + }
  205 + try {
  206 + //2.上传文件 参数:将文件写入到那个目录
  207 + img.transferTo(new File(dirPath, fileName));
  208 + } catch (IOException e) {
  209 + e.printStackTrace();
  210 + }
  211 +
  212 + //保存员工信息
  213 + user.setPhoto(fileName);//保存头像文件名
  214 + user.setLoginName(mobile);
  215 + userService.saveUser(user);
  216 + return "redirect:/user/page";
  217 + }
  218 +
  219 + @RequestMapping("/getUser/{userId}")
  220 + @ResponseBody
  221 + public User getUser(@PathVariable("userId") String id) {
  222 + return userService.getUserById(id);
  223 + }
  224 +
  225 +
  226 + @RequestMapping("/deleteUser/{userId}")
  227 + public String deleteUser(@PathVariable("userId") String userId) {
  228 + userService.deleteUserById(userId);
  229 + return "redirect:/user/page";
  230 + }
  231 +
  232 + /**
  233 + * 用户退出
  234 + *
  235 + * @param request
  236 + * @return
  237 + */
  238 + @RequestMapping("/logout")
  239 + public String logout(HttpSession session, HttpServletRequest request, HttpServletResponse response) throws Exception {
  240 + session.invalidate();
  241 + Cookie sessionIdCookie = CookieUtil.getCookie(request, POWER_SESSION_ID);
  242 + if (sessionIdCookie != null) {
  243 + String powerSessionId = sessionIdCookie.getValue();
  244 + if (powerSessionId != null) {
  245 + CookieUtil.setCookie(response, POWER_SESSION_ID, null,
  246 + "/", "0", CookieUtil.getCookieDomain(request));
  247 + request.removeAttribute(powerSessionId);
  248 + }
  249 + }
  250 + return "redirect:/login";
  251 + }
  252 +
  253 + /**
  254 + * 用户退出H5
  255 + *
  256 + * @param request
  257 + * @return
  258 + */
  259 + @RequestMapping("/userLogout")
  260 + @ResponseBody
  261 + public JsonResult<?> userLogout(HttpSession session, HttpServletRequest request, HttpServletResponse response) throws Exception {
  262 + session.invalidate();
  263 + Cookie sessionIdCookie = CookieUtil.getCookie(request, POWER_SESSION_ID);
  264 + if (sessionIdCookie != null) {
  265 + String powerSessionId = sessionIdCookie.getValue();
  266 + if (powerSessionId != null) {
  267 + CookieUtil.setCookie(response, POWER_SESSION_ID, null,
  268 + "/", "0", CookieUtil.getCookieDomain(request));
  269 + request.removeAttribute(powerSessionId);
  270 + }
  271 + }
  272 + return new JsonResult<>(true, "退出成功!", "");
  273 + }
  274 +
  275 + /**
  276 + * 生成验证码
  277 + */
  278 + @RequestMapping("/generateImageCode")
  279 + public void generateImageCode(HttpSession session, HttpServletResponse response) throws IOException {
  280 +
  281 + //1.生成4位随机字符串
  282 + String code = PowerUtil.generateVerifyCode(4);
  283 + //2.保存随机字符串到session中
  284 + session.setAttribute("code", code);
  285 + //3.将随机字符串生成图片
  286 + //4.response响应图片
  287 + response.setContentType("image/png");//指定响应类型
  288 + ServletOutputStream outputStream = response.getOutputStream();
  289 + //参数 宽,高,输出流,生成验证码
  290 + PowerUtil.outputImage(100, 60, outputStream, code);
  291 + }
  292 +
  293 + @RequestMapping("/toUpdateUser/{userId}")
  294 + public String toUpdateUser(@PathVariable("userId") String userId, Model model) {
  295 + User user = userService.getUserById(userId);
  296 + model.addAttribute("user", user);
  297 + return "updateUser";
  298 + }
  299 +
  300 + /**
  301 + * 更新员工信息
  302 + *
  303 + * @param user
  304 + * @return
  305 + */
  306 + @RequestMapping("/updateUser")
  307 + public String updateUser(User user, Model model) {
  308 + String userName = user.getUserName();
  309 + if (StringUtils.isBlank(userName)) {
  310 + model.addAttribute("updateMsg", "姓名不能为空");
  311 + return "updateUser";
  312 + }
  313 + String mobile = user.getMobile();
  314 + if (StringUtils.isEmpty(mobile)) {
  315 + model.addAttribute("updateMsg", "手机号不能为空");
  316 + return "updateUser";
  317 + }
  318 + User oldUser = userService.getUserById(user.getUserId());
  319 + String loginName = oldUser.getLoginName();
  320 + Boolean isExistMobile = userService.isExistMobile(mobile, loginName);
  321 + if (isExistMobile) {
  322 + model.addAttribute("updateMsg", "手机号已被使用!");
  323 + return "updateUser";
  324 + }
  325 + if ("admin".equals(loginName)) {
  326 + user.setLoginName("admin");
  327 + } else {
  328 + user.setLoginName(mobile);
  329 + }
  330 +
  331 + userService.updateUser(user);
  332 + //跳转员工列表
  333 + return "redirect:/user/page";//更新成功跳转到查询所有员工列表
  334 + }
  335 +
  336 + @RequestMapping("/toUpdatePasswd/{userId}")
  337 + public String toUpdatePassword(@PathVariable("userId") String userId, Model model) {
  338 + User user = userService.getUserById(userId);
  339 + model.addAttribute("user", user);
  340 + return "updatePasswd";
  341 + }
  342 +
  343 + /**
  344 + * 更新员工信息
  345 + *
  346 + * @param user
  347 + * @return
  348 + */
  349 + @RequestMapping("/updatePassword")
  350 + public String updatePassword(User user, Model model) {
  351 + String oldPassword = user.getOldPassword();
  352 + if (StringUtils.isBlank(oldPassword)) {
  353 + model.addAttribute("pdMsg", "原密码不能为空");
  354 + return "updatePasswd";
  355 + }
  356 + String password = user.getPassword();
  357 + if (StringUtils.isBlank(password)) {
  358 + model.addAttribute("pdMsg", "新密码不能为空");
  359 + return "updatePasswd";
  360 + }
  361 + User oldUser = userService.getUserById(user.getUserId());
  362 + String dbPassword = oldUser.getPassword();
  363 + String paramPassword = DigestUtils.md5DigestAsHex(oldPassword.getBytes(StandardCharsets.UTF_8));
  364 + if (!paramPassword.equals(dbPassword)) {
  365 + model.addAttribute("pdMsg", "原密码不正确");
  366 + return "updatePasswd";
  367 + }
  368 + String newPassword = DigestUtils.md5DigestAsHex(password.getBytes(StandardCharsets.UTF_8));
  369 + userService.updatePassword(user.getUserId(), newPassword);
  370 + //跳转员工列表
  371 + return "redirect:/user/page";//更新成功跳转到查询所有员工列表
  372 + }
  373 +
  374 + @RequestMapping("/resertPasswd/{userId}")
  375 + public String resertPasswd(@PathVariable("userId") String userId, Model model) {
  376 + String newPassword = DigestUtils.md5DigestAsHex("hczd".getBytes(StandardCharsets.UTF_8));
  377 + userService.updatePassword(userId, newPassword);
  378 + //跳转员工列表
  379 + return "redirect:/user/page";//更新成功跳转到查询所有员工列表
  380 + }
  381 +
  382 +}
... ...
  1 +package com.qgutech.filter;
  2 +
  3 +import com.qgutech.util.CookieUtil;
  4 +import org.apache.commons.lang3.StringUtils;
  5 +import org.springframework.lang.Nullable;
  6 +import org.springframework.web.servlet.HandlerInterceptor;
  7 +import org.springframework.web.servlet.ModelAndView;
  8 +
  9 +import javax.servlet.http.HttpServletRequest;
  10 +import javax.servlet.http.HttpServletResponse;
  11 +
  12 +/**
  13 + * @author xxx
  14 + * @date 2024/12/18 14:12
  15 + * @description 登录检查
  16 + */
  17 +public class LoginFilter implements HandlerInterceptor {
  18 +
  19 + @Override
  20 + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  21 +// Object user = request.getSession().getAttribute("user");
  22 + String powerSessionId = null;
  23 + String type = request.getParameter("type");
  24 + if ("mobile".equals(type)) {
  25 + powerSessionId = CookieUtil.getCookieValue(request, "power_session_id");
  26 + if (StringUtils.isBlank(powerSessionId)) {
  27 + powerSessionId = request.getParameter("power_session_id");
  28 + }
  29 + if (StringUtils.isBlank(powerSessionId)) {
  30 + //未登录
  31 + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
  32 + response.setContentType("text/plain;charset=UTF-8");
  33 + // 写入响应内容
  34 + response.getWriter().write("{\"success\":false,\"data\":\"loginOut\",\"msg\":\"登录过期,请重新登录!\",\"errCode\":\"loginOut\"}");
  35 + return false;
  36 + } else {
  37 + return true;
  38 + }
  39 + } else {
  40 + powerSessionId = CookieUtil.getCookieValue(request, "power_session_id");
  41 + if (StringUtils.isBlank(powerSessionId)) {
  42 + powerSessionId = request.getParameter("power_session_id");
  43 + }
  44 + if (StringUtils.isBlank(powerSessionId)) {
  45 + //未登录
  46 +// request.getRequestDispatcher("/login").forward(request, response);
  47 + response.sendRedirect("/power/login");
  48 + return false;
  49 + } else {
  50 + request.setAttribute("power_session_id", powerSessionId);
  51 + return true;
  52 + }
  53 + }
  54 + }
  55 +
  56 + @Override
  57 + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
  58 + }
  59 +
  60 + @Override
  61 + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
  62 + }
  63 +}
... ...
  1 +package com.qgutech.mapper;
  2 +
  3 +import com.qgutech.model.Page;
  4 +import com.qgutech.model.User;
  5 +import org.apache.ibatis.annotations.Param;
  6 +import org.apache.ibatis.annotations.Select;
  7 +
  8 +import java.util.List;
  9 +
  10 +/**
  11 + * @author xxx
  12 + * @date 2024/12/17 9:23
  13 + * @description
  14 + */
  15 +public interface UserMapper {
  16 + //根据用户名查询用户
  17 + User findByLoginName(@Param("loginName")String loginName);
  18 +
  19 + User getUserById(@Param("userId") String userId);
  20 +
  21 + List<User> getUserList(@Param("searchName") String searchName, @Param("page")Page<User> page);
  22 +
  23 + Integer getTotal(@Param("searchName") String searchName);
  24 +
  25 + //注册用户
  26 + void save(@Param("user") User user);
  27 +
  28 + // 更新用户
  29 + void updateUser (@Param("user") User user);
  30 +
  31 + void deleteUser (@Param("userId") String userId);
  32 +
  33 + User getUserByMobile(@Param("mobile") String mobile);
  34 +
  35 + User getUserExcludeLoginName(@Param("mobile")String mobile, @Param("loginName")String loginName);
  36 +
  37 + void updatePassword(@Param("userId") String userId, @Param("password") String password);
  38 +}
... ...
  1 +package com.qgutech.model;
  2 +
  3 +import org.springframework.context.ApplicationContext;
  4 +import org.springframework.web.context.ContextLoader;
  5 +
  6 +import java.lang.reflect.Method;
  7 +import java.util.ArrayList;
  8 +import java.util.List;
  9 +
  10 +/**
  11 + * @author xxx
  12 + * @date 2024/12/26 15:21
  13 + * @description
  14 + */
  15 +
  16 +
  17 +public class Page<T> {
  18 + public static final String ASC = "asc";
  19 + public static final String DESC = "desc";
  20 + protected String id;
  21 + protected int pageNo = 1;
  22 + protected int pageSize = 10;
  23 + protected int pages = 1;
  24 + protected boolean autoCount = true;
  25 + protected boolean autoPaging = true;
  26 + private String sortName;
  27 + private String sortOrder;
  28 + protected List<T> rows = new ArrayList();
  29 + protected long total = 0L;
  30 +
  31 + public int getPages() {
  32 + return pages;
  33 + }
  34 +
  35 + public void setPages(int pages) {
  36 + this.pages = pages;
  37 + }
  38 +
  39 + public String getId() {
  40 + return this.id;
  41 + }
  42 +
  43 + public void setId(String id) {
  44 + this.id = id;
  45 + }
  46 +
  47 + public Page() {
  48 + }
  49 +
  50 + public Page(int pageSize) {
  51 + this.pageSize = pageSize;
  52 + }
  53 +
  54 + public int getPageNo() {
  55 + return this.pageNo;
  56 + }
  57 +
  58 + public void setPageNo(final int pageNo) {
  59 + this.pageNo = pageNo;
  60 + if (pageNo < 1) {
  61 + this.pageNo = 1;
  62 + }
  63 +
  64 + }
  65 +
  66 + public int getPageSize() {
  67 + return this.pageSize;
  68 + }
  69 +
  70 + public void setPageSize(final int pageSize) {
  71 + this.pageSize = pageSize;
  72 + }
  73 +
  74 + public int getFirst() {
  75 + return (this.pageNo - 1) * this.pageSize + 1;
  76 + }
  77 +
  78 + public boolean isAutoCount() {
  79 + return this.autoCount;
  80 + }
  81 +
  82 + public void setAutoCount(final boolean autoCount) {
  83 + this.autoCount = autoCount;
  84 + }
  85 +
  86 + public Page<T> autoCount(final boolean theAutoCount) {
  87 + this.setAutoCount(theAutoCount);
  88 + return this;
  89 + }
  90 +
  91 + public List<T> getRows() {
  92 + return this.rows;
  93 + }
  94 +
  95 + public void setRows(final List<T> result) {
  96 + this.rows = result;
  97 + }
  98 +
  99 + public long getTotal() {
  100 + return this.total;
  101 + }
  102 +
  103 + public void setTotal(final long totalCount) {
  104 + this.total = totalCount;
  105 + }
  106 +
  107 + public long getTotalPages() {
  108 + long count = this.total / (long) this.pageSize;
  109 + if (this.total % (long) this.pageSize > 0L) {
  110 + ++count;
  111 + }
  112 +
  113 + return count;
  114 + }
  115 +
  116 + public boolean isHasNext() {
  117 + return (long) (this.pageNo + 1) <= this.getTotalPages();
  118 + }
  119 +
  120 + public int getNextPage() {
  121 + return this.isHasNext() ? this.pageNo + 1 : this.pageNo;
  122 + }
  123 +
  124 + public boolean isHasPre() {
  125 + return this.pageNo - 1 >= 1;
  126 + }
  127 +
  128 + public int getPrePage() {
  129 + return this.isHasPre() ? this.pageNo - 1 : this.pageNo;
  130 + }
  131 +
  132 + public String getSortName() {
  133 + return this.sortName;
  134 + }
  135 +
  136 + public void setSortName(String sortName) {
  137 + this.sortName = sortName;
  138 + }
  139 +
  140 + public String getSortOrder() {
  141 + return this.sortOrder;
  142 + }
  143 +
  144 + public void setSortOrder(String sortOrder) {
  145 + this.sortOrder = sortOrder;
  146 + }
  147 +
  148 + public boolean isAutoPaging() {
  149 + return this.autoPaging;
  150 + }
  151 +
  152 + public void setAutoPaging(boolean autoPaging) {
  153 + this.autoPaging = autoPaging;
  154 + }
  155 +
  156 + public String toString() {
  157 + return "Page{total=" + this.total + ", pageNo=" + this.pageNo + ", pageSize=" + this.pageSize + ", autoCount=" + this.autoCount + ", sortName='" + this.sortName + '\'' + ", sortOrder='" + this.sortOrder + '\'' + '}';
  158 + }
  159 +
  160 + public String toTwitterStylePager() {
  161 + Object redisI18nService = null;
  162 +
  163 + try {
  164 + ApplicationContext applicationContext = ContextLoader.getCurrentWebApplicationContext();
  165 + redisI18nService = applicationContext.getBean("redisI18nService");
  166 + } catch (Exception var14) {
  167 + }
  168 +
  169 + String firstPage = "首页";
  170 + String pageUp = "上一页";
  171 + String pageDown = "下一页";
  172 + String lastPage = "末页";
  173 + if (redisI18nService != null) {
  174 + try {
  175 + Method method = redisI18nService.getClass().getMethod("getI18nValue", String.class);
  176 + method.setAccessible(true);
  177 + firstPage = method.invoke(redisI18nService, "common.firstPage").toString();
  178 + pageUp = method.invoke(redisI18nService, "common.pageUp").toString();
  179 + pageDown = method.invoke(redisI18nService, "common.pageDown").toString();
  180 + lastPage = method.invoke(redisI18nService, "common.lastPage").toString();
  181 + } catch (Exception var13) {
  182 + }
  183 + }
  184 +
  185 + StringBuilder pager = new StringBuilder();
  186 + boolean isFirstRightDot = false;
  187 + boolean isFirstLefttDot = false;
  188 + boolean isShow = false;
  189 + long totalPageNum = this.getTotalPages();
  190 + pager.append("<ul>");
  191 + pager.append("<li");
  192 + if (this.pageNo == 1) {
  193 + pager.append(" class=\"active\"");
  194 + }
  195 +
  196 + pager.append("><a style=\"padding: 0 11px;line-height: 26px;\" href=\"javascript:void(0);\"");
  197 + if (this.pageNo != 1) {
  198 + pager.append(" onclick=\"T.jump('").append(this.id).append("',1)\"");
  199 + }
  200 +
  201 + pager.append(">").append(firstPage).append("</a></li>");
  202 + pager.append("<li");
  203 + if (this.pageNo == 1) {
  204 + pager.append(" class=\"active\"");
  205 + }
  206 +
  207 + pager.append("><a style=\"padding: 0 11px;line-height: 26px;\" href=\"javascript:void(0);\"");
  208 + if (this.pageNo != 1) {
  209 + pager.append(" onclick=\"T.jump('").append(this.id).append("','").append(this.pageNo - 1).append("')\"");
  210 + }
  211 +
  212 + pager.append(">").append(pageUp).append("</a></li>");
  213 +
  214 + for (int i = 1; (long) i <= totalPageNum; ++i) {
  215 + if (i == 1 || i == 2 || (long) i == totalPageNum || (long) i == totalPageNum - 1L || i == this.pageNo - 1 || i == this.pageNo - 2 || i == this.pageNo + 1 || i == this.pageNo + 2) {
  216 + isShow = true;
  217 + }
  218 +
  219 + if (this.pageNo == i) {
  220 + pager.append("<li class=\"active\"><a style=\"padding: 0 11px;line-height: 26px;\" href=\"javascript:void(0);\">");
  221 + pager.append(this.pageNo).append("</a></li>");
  222 + } else if (isShow) {
  223 + pager.append("<li><a style=\"padding: 0 11px;line-height: 26px;\" href=\"javascript:void(0);\" onclick=\"T.jump('").append(this.id).append("','").append(i).append("')\">");
  224 + pager.append(i).append("</a></li>");
  225 + } else {
  226 + if (!isFirstLefttDot && i == this.pageNo - 3) {
  227 + pager.append("<li class=\"disabled\"><a style=\"padding: 0 11px;line-height: 26px;\" href=\"javascript:void(0);\">");
  228 + pager.append("...").append("</a></li>");
  229 + isFirstLefttDot = true;
  230 + }
  231 +
  232 + if (!isFirstRightDot && i > this.pageNo) {
  233 + pager.append("<li class=\"disabled\"><a style=\"padding: 0 11px;line-height: 26px;\" href=\"javascript:void(0);\">");
  234 + pager.append("...").append("</a></li>");
  235 + isFirstRightDot = true;
  236 + }
  237 + }
  238 +
  239 + isShow = false;
  240 + }
  241 +
  242 + pager.append("<li");
  243 + if ((long) this.pageNo == this.getTotalPages() || this.getTotalPages() == 0L) {
  244 + pager.append(" class=\"active\"");
  245 + }
  246 +
  247 + pager.append("><a style=\"padding: 0 11px;line-height: 26px;\" href=\"javascript:void(0);\"");
  248 + if ((long) this.pageNo != this.getTotalPages() && this.getTotalPages() > 0L) {
  249 + pager.append(" onclick=\"T.jump('").append(this.id).append("','").append(this.pageNo + 1).append("')\"");
  250 + }
  251 +
  252 + pager.append(">").append(pageDown).append("</a></li>");
  253 + pager.append("<li");
  254 + if ((long) this.pageNo == this.getTotalPages() || this.getTotalPages() == 0L) {
  255 + pager.append(" class=\"active\"");
  256 + }
  257 +
  258 + pager.append("><a style=\"padding: 0 11px;line-height: 26px;\" href=\"javascript:void(0);\"");
  259 + if ((long) this.pageNo != this.getTotalPages() && this.getTotalPages() > 0L) {
  260 + pager.append(" onclick=\"T.jump('").append(this.id).append("','").append(this.getTotalPages()).append("')\"");
  261 + }
  262 +
  263 + pager.append(">").append(lastPage).append("</a></li>");
  264 + pager.append("</ul>");
  265 + return pager.toString();
  266 + }
  267 +}
  268 +
... ...
  1 +package com.qgutech.model;
  2 +
  3 +import lombok.Data;
  4 +
  5 +import java.io.Serializable;
  6 +
  7 +/**
  8 + * @author oo
  9 + * @since 2024/11/08
  10 + */
  11 +@Data
  12 +public class PowerModel implements Serializable {
  13 + private String id;
  14 + private String type;
  15 + // BMS-允许充电电流
  16 + private String BMS05;
  17 + private String BMS16;
  18 + private String BMS29;
  19 + // PCS-交流B相电流
  20 + private String PCS22;
  21 + // PCS-交流C相电流
  22 + private String PCS23;
  23 + // PCS-交流A相电流
  24 + private String PCS21;
  25 + // CP-B枪需求功率
  26 + private String CP27;
  27 + // CP-B枪需求电流
  28 + private String CP28;
  29 + // CP-A枪需求电流
  30 + private String CP16;
  31 + // PV-总电网取电电量
  32 + private String PV24;
  33 + // PV-绝缘阻抗
  34 + private String PV06;
  35 + // PV-电网频率
  36 + private String PV04;
  37 + // EM-A相电流
  38 + private String EM04;
  39 + // EM-C相电流
  40 + private String EM06;
  41 + // EM-B相电流
  42 + private String EM05;
  43 + // PV-总功直流功率
  44 + private String PV03;
  45 + // BMS-总电流
  46 + private String BMS02;
  47 + // BMS-总电压
  48 + private String BMS01;
  49 + // BMS-SOC
  50 + private String BMS03;
  51 + // CP-当前功率
  52 + private String CP02;
  53 + // PCS-最大放电电流
  54 + private String PCS26;
  55 + // PV-A相电流
  56 + private String PV10;
  57 + // PV-B相电流
  58 + private String PV11;
  59 + // PV-C相电流
  60 + private String PV12;
  61 + // EM-AB线电压
  62 + private String EM01;
  63 + // EM-BC线电压
  64 + private String EM02;
  65 + // EM-CA线电压
  66 + private String EM03;
  67 + // EM-电流变比
  68 + private String EM30;
  69 + // 日期
  70 + private String date;
  71 +}
... ...
  1 +package com.qgutech.model;
  2 +
  3 +import lombok.Data;
  4 +
  5 +import java.io.Serializable;
  6 +import java.util.Date;
  7 +
  8 +/**
  9 + * @author xxx
  10 + * @date 2024/12/17 12:21
  11 + * @description
  12 + */
  13 +@Data
  14 +public class User implements Serializable {
  15 +
  16 + private static final long serialVersionUID = -8665937807336805076L;
  17 + /**
  18 + * 主键
  19 + */
  20 + private String userId;
  21 +
  22 + /**
  23 + * 姓名
  24 + */
  25 + private String userName;
  26 +
  27 + /**
  28 + * 工号
  29 + */
  30 + private String employeeCode;
  31 +
  32 + /**
  33 + * 部门Id
  34 + */
  35 + private String organizeId;
  36 +
  37 + /**
  38 + * 部门名称
  39 + */
  40 + private String organizeName;
  41 + /**
  42 + * 用户名
  43 + */
  44 + private String loginName;
  45 + /**
  46 + * 密码
  47 + */
  48 + private String password;
  49 + /**
  50 + * 原密码
  51 + */
  52 + private String oldPassword;
  53 + /**
  54 + * 账号状态
  55 + */
  56 + private String accountStatus;
  57 + /**
  58 + * 身份证
  59 + */
  60 + private String idCard;
  61 + /**
  62 + * 电话
  63 + */
  64 + private String mobile;
  65 + /**
  66 + * 邮箱
  67 + */
  68 + private String email;
  69 + /**
  70 + * 性别
  71 + */
  72 + private String gender;
  73 + /**
  74 + * 头像
  75 + */
  76 + private String photo;
  77 + /**
  78 + * 创建时间
  79 + */
  80 + private Date createTime;
  81 + /**
  82 + * 创建人
  83 + */
  84 + private String createBy;
  85 + /**
  86 + * 最后修改时间
  87 + */
  88 + private Date lastModifyTime;
  89 + /**
  90 + * 最后修改人
  91 + */
  92 + private String lastModifyBy;
  93 +
  94 +}
... ...
  1 +package com.qgutech.service;
  2 +
  3 +import com.alibaba.fastjson.JSONObject;
  4 +import com.fasterxml.jackson.databind.ObjectMapper;
  5 +import com.qgutech.model.PowerModel;
  6 +import com.qgutech.util.HttpClientUtils;
  7 +import lombok.extern.slf4j.Slf4j;
  8 +import org.apache.commons.collections4.CollectionUtils;
  9 +import org.apache.commons.collections4.MapUtils;
  10 +import org.apache.commons.lang3.StringUtils;
  11 +import org.junit.Test;
  12 +import org.springframework.beans.factory.annotation.Value;
  13 +import org.springframework.stereotype.Service;
  14 +
  15 +import java.io.IOException;
  16 +import java.text.SimpleDateFormat;
  17 +import java.time.Instant;
  18 +import java.time.LocalDateTime;
  19 +import java.time.ZoneId;
  20 +import java.time.format.DateTimeFormatter;
  21 +import java.util.*;
  22 +
  23 +/**
  24 + * 徽辰智电
  25 + *
  26 + * @author oo
  27 + * @since 2024-11-09
  28 + */
  29 +@Slf4j
  30 +@Service
  31 +public class PowerService {
  32 +
  33 + @Value("${power.panelUrl}")
  34 + private String PANEL_URL;
  35 +
  36 + @Value("${power.detailUrl}")
  37 + private String DETAIL_URL;
  38 +
  39 + @Value("${power.dateUrl}")
  40 + private String DATE_URL;
  41 +
  42 + @Value("${power.token}")
  43 + private String TOKEN;
  44 +
  45 + public Map<String, Object> getIndex(PowerModel powerModel) {
  46 + Map<String, Object> resultMap = new HashMap<>();
  47 + // Todo 累计发电量,累计经济发电量客户接口开发中
  48 + resultMap.put("allPower", "1001.55");
  49 + resultMap.put("allAmount", "9246.76");
  50 + // 设备统计
  51 + deviceCount(resultMap);
  52 + Map<String, Object> detail = getPowerDetail();
  53 + // BMS监视、PCS监视、充电桩监视、光伏监视、电能表监视
  54 + addPowerData(resultMap, detail);
  55 + ObjectMapper mapper = new ObjectMapper();
  56 + try {
  57 + String jsonString = mapper.writeValueAsString(resultMap);
  58 + System.out.println(jsonString);
  59 + log.info("=============resultMap======[{}]", jsonString);
  60 + } catch (IOException e) {
  61 + e.printStackTrace();
  62 + }
  63 + return resultMap;
  64 + }
  65 +
  66 + private Map<String, Object> getPowerDetail() {
  67 + Map<String, String> header = new HashMap<>();
  68 + header.put("X-Token", TOKEN);
  69 + String jsonStr = HttpClientUtils.doGetRequest(DETAIL_URL, header, null);
  70 + if (StringUtils.isBlank(jsonStr)) {
  71 + return new HashMap<>();
  72 + }
  73 + Map<String, Object> result = JSONObject.parseObject(jsonStr);
  74 + return result;
  75 + }
  76 +
  77 + public List<PowerModel> getDateMap(String type) {
  78 + Map<String, Map<String, String>> resultMap = new HashMap<>();
  79 + if ("BMS".equalsIgnoreCase(type)) {
  80 + // BMS-最高电压模块
  81 + Map<String, String> BMS29 = getDateDetail("BMS29", "10");
  82 + if (MapUtils.isNotEmpty(BMS29)) {
  83 + for (Map.Entry<String, String> BMS29Entry : BMS29.entrySet()) {
  84 + Map<String, String> subMap = new HashMap<>();
  85 + subMap.put("BMS29", "");
  86 + subMap.put("BMS16", "");
  87 + subMap.put("BMS05", "");
  88 + String key = BMS29Entry.getKey();
  89 + String value = BMS29Entry.getValue();
  90 + subMap.put("BMS29", value);
  91 + resultMap.put(key, subMap);
  92 + }
  93 + }
  94 + // BMS-单体最低温度
  95 + Map<String, String> BMS16 = getDateDetail("BMS16", "10");
  96 + if (MapUtils.isNotEmpty(BMS16)) {
  97 + for (Map.Entry<String, String> BMS16Entry : BMS16.entrySet()) {
  98 + String key = BMS16Entry.getKey();
  99 + String value = BMS16Entry.getValue();
  100 + if (resultMap.containsKey(key)) {
  101 + resultMap.get(key).put("BMS16", value);
  102 + }
  103 + }
  104 + }
  105 + // BMS-允许充电电流
  106 + Map<String, String> BMS05 = getDateDetail("BMS05", "10");
  107 + if (MapUtils.isNotEmpty(BMS05)) {
  108 + for (Map.Entry<String, String> BMS05Entry : BMS05.entrySet()) {
  109 + String key = BMS05Entry.getKey();
  110 + String value = BMS05Entry.getValue();
  111 + if (resultMap.containsKey(key)) {
  112 + resultMap.get(key).put("BMS05", value);
  113 + }
  114 + }
  115 + }
  116 + }
  117 +
  118 + if ("PCS".equalsIgnoreCase(type)) {
  119 + // PCS-交流B相电流
  120 + Map<String, String> PCS22 = getDateDetail("PCS22", "10");
  121 + if (MapUtils.isNotEmpty(PCS22)) {
  122 + for (Map.Entry<String, String> PCS22Entry : PCS22.entrySet()) {
  123 + Map<String, String> subMap = new HashMap<>();
  124 + subMap.put("PCS22", "");
  125 + subMap.put("PCS23", "");
  126 + subMap.put("PCS21", "");
  127 + String key = PCS22Entry.getKey();
  128 + String value = PCS22Entry.getValue();
  129 + subMap.put("PCS22", value);
  130 + resultMap.put(key, subMap);
  131 + }
  132 + }
  133 + // PCS-交流C相电流
  134 + Map<String, String> PCS23 = getDateDetail("PCS23", "10");
  135 + if (MapUtils.isNotEmpty(PCS23)) {
  136 + for (Map.Entry<String, String> PCS23Entry : PCS23.entrySet()) {
  137 + String key = PCS23Entry.getKey();
  138 + String value = PCS23Entry.getValue();
  139 + if (resultMap.containsKey(key)) {
  140 + resultMap.get(key).put("PCS23", value);
  141 + }
  142 + }
  143 + }
  144 + // PCS-交流A相电流
  145 + Map<String, String> PCS21 = getDateDetail("PCS21", "10");
  146 + if (MapUtils.isNotEmpty(PCS21)) {
  147 + for (Map.Entry<String, String> PCS21Entry : PCS21.entrySet()) {
  148 + String key = PCS21Entry.getKey();
  149 + String value = PCS21Entry.getValue();
  150 + if (resultMap.containsKey(key)) {
  151 + resultMap.get(key).put("PCS21", value);
  152 + }
  153 + }
  154 + }
  155 + }
  156 + // 充电桩
  157 + if ("CP".equalsIgnoreCase(type)) {
  158 + // CP-B枪需求功率
  159 + Map<String, String> CP27 = getDateDetail("CP27", "10");
  160 + if (MapUtils.isNotEmpty(CP27)) {
  161 + for (Map.Entry<String, String> CP27Entry : CP27.entrySet()) {
  162 + Map<String, String> subMap = new HashMap<>();
  163 + subMap.put("CP27", "");
  164 + subMap.put("CP28", "");
  165 + subMap.put("CP16", "");
  166 + String key = CP27Entry.getKey();
  167 + String value = CP27Entry.getValue();
  168 + subMap.put("CP27", value);
  169 + resultMap.put(key, subMap);
  170 + }
  171 + }
  172 + // CP-B枪需求电流
  173 + Map<String, String> CP28 = getDateDetail("CP28", "10");
  174 + if (MapUtils.isNotEmpty(CP28)) {
  175 + for (Map.Entry<String, String> CP28Entry : CP28.entrySet()) {
  176 + String key = CP28Entry.getKey();
  177 + String value = CP28Entry.getValue();
  178 + if (resultMap.containsKey(key)) {
  179 + resultMap.get(key).put("CP28", value);
  180 + }
  181 + }
  182 + }
  183 + // CP-A枪需求电流
  184 + Map<String, String> CP16 = getDateDetail("CP16", "10");
  185 + if (MapUtils.isNotEmpty(CP16)) {
  186 + for (Map.Entry<String, String> CP16Entry : CP16.entrySet()) {
  187 + String key = CP16Entry.getKey();
  188 + String value = CP16Entry.getValue();
  189 + if (resultMap.containsKey(key)) {
  190 + resultMap.get(key).put("CP16", value);
  191 + }
  192 + }
  193 + }
  194 + }
  195 + // 光伏
  196 + if ("PV".equalsIgnoreCase(type)) {
  197 + // PV-总电网取电电量
  198 + Map<String, String> PV24 = getDateDetail("PV24", "10");
  199 + if (MapUtils.isNotEmpty(PV24)) {
  200 + for (Map.Entry<String, String> PV24Entry : PV24.entrySet()) {
  201 + Map<String, String> subMap = new HashMap<>();
  202 + subMap.put("PV24", "");
  203 + subMap.put("PV06", "");
  204 + subMap.put("PV04", "");
  205 + String key = PV24Entry.getKey();
  206 + String value = PV24Entry.getValue();
  207 + subMap.put("PV24", value);
  208 + resultMap.put(key, subMap);
  209 + }
  210 + }
  211 + // PV-绝缘阻抗
  212 + Map<String, String> PV06 = getDateDetail("PV06", "10");
  213 + if (MapUtils.isNotEmpty(PV06)) {
  214 + for (Map.Entry<String, String> PV06Entry : PV06.entrySet()) {
  215 + String key = PV06Entry.getKey();
  216 + String value = PV06Entry.getValue();
  217 + if (resultMap.containsKey(key)) {
  218 + resultMap.get(key).put("PV06", value);
  219 + }
  220 + }
  221 + }
  222 + // PV-电网频率
  223 + Map<String, String> PV04 = getDateDetail("PV04", "10");
  224 + if (MapUtils.isNotEmpty(PV04)) {
  225 + for (Map.Entry<String, String> PV04Entry : PV04.entrySet()) {
  226 + String key = PV04Entry.getKey();
  227 + String value = PV04Entry.getValue();
  228 + if (resultMap.containsKey(key)) {
  229 + resultMap.get(key).put("PV04", value);
  230 + }
  231 + }
  232 + }
  233 + }
  234 + // 电能
  235 + if ("EM".equalsIgnoreCase(type)) {
  236 + // EM-A相电流
  237 + Map<String, String> EM04 = getDateDetail("EM04", "10");
  238 + if (MapUtils.isNotEmpty(EM04)) {
  239 + for (Map.Entry<String, String> EM04Entry : EM04.entrySet()) {
  240 + Map<String, String> subMap = new HashMap<>();
  241 + subMap.put("EM04", "");
  242 + subMap.put("EM06", "");
  243 + subMap.put("EM05", "");
  244 + String key = EM04Entry.getKey();
  245 + String value = EM04Entry.getValue();
  246 + subMap.put("EM04", value);
  247 + resultMap.put(key, subMap);
  248 + }
  249 + }
  250 + // EM-C相电流
  251 + Map<String, String> EM06 = getDateDetail("EM06", "10");
  252 + if (MapUtils.isNotEmpty(EM06)) {
  253 + for (Map.Entry<String, String> EM06Entry : EM06.entrySet()) {
  254 + String key = EM06Entry.getKey();
  255 + String value = EM06Entry.getValue();
  256 + if (resultMap.containsKey(key)) {
  257 + resultMap.get(key).put("EM06", value);
  258 + }
  259 + }
  260 + }
  261 + // EM-B相电流
  262 + Map<String, String> EM05 = getDateDetail("EM05", "10");
  263 + if (MapUtils.isNotEmpty(EM05)) {
  264 + for (Map.Entry<String, String> EM05Entry : EM05.entrySet()) {
  265 + String key = EM05Entry.getKey();
  266 + String value = EM05Entry.getValue();
  267 + if (resultMap.containsKey(key)) {
  268 + resultMap.get(key).put("EM05", value);
  269 + }
  270 + }
  271 + }
  272 + }
  273 + if ("INDEX_MAP".equals(type)) {
  274 + // PV-总功直流功率
  275 + Map<String, String> PV03 = getDateDetail("PV03", "50");
  276 + if (MapUtils.isNotEmpty(PV03)) {
  277 + for (Map.Entry<String, String> PV03Entry : PV03.entrySet()) {
  278 + Map<String, String> subMap = new HashMap<>();
  279 + subMap.put("PV03", "");
  280 + subMap.put("BMS02", "");
  281 + subMap.put("CP02", "");
  282 + subMap.put("EM30", "");
  283 + String key = PV03Entry.getKey();
  284 + String value = PV03Entry.getValue();
  285 + subMap.put("PV03", value);
  286 + resultMap.put(key, subMap);
  287 + }
  288 + }
  289 + // BMS-总电流
  290 + Map<String, String> BMS02 = getDateDetail("BMS02", "50");
  291 + if (MapUtils.isNotEmpty(BMS02)) {
  292 + for (Map.Entry<String, String> BMS02Entry : BMS02.entrySet()) {
  293 + String key = BMS02Entry.getKey();
  294 + String value = BMS02Entry.getValue();
  295 + if (resultMap.containsKey(key)) {
  296 + resultMap.get(key).put("BMS02", value);
  297 + }
  298 + }
  299 + }
  300 + // CP-当前功率
  301 + Map<String, String> CP02 = getDateDetail("CP02", "50");
  302 + if (MapUtils.isNotEmpty(CP02)) {
  303 + for (Map.Entry<String, String> CP02Entry : CP02.entrySet()) {
  304 + String key = CP02Entry.getKey();
  305 + String value = CP02Entry.getValue();
  306 + if (resultMap.containsKey(key)) {
  307 + resultMap.get(key).put("CP02", value);
  308 + }
  309 + }
  310 + }
  311 + // EM-电流变比
  312 + Map<String, String> EM30 = getDateDetail("EM30", "50");
  313 + if (MapUtils.isNotEmpty(EM30)) {
  314 + for (Map.Entry<String, String> EM30Entry : EM30.entrySet()) {
  315 + String key = EM30Entry.getKey();
  316 + String value = EM30Entry.getValue();
  317 + if (resultMap.containsKey(key)) {
  318 + resultMap.get(key).put("EM30", value);
  319 + }
  320 + }
  321 + }
  322 + }
  323 + if ("BMS_MAP".equals(type)) {
  324 + // BMS-允许放电电流
  325 + Map<String, String> BMS05 = getDateDetail("BMS05", "50");
  326 + if (MapUtils.isNotEmpty(BMS05)) {
  327 + for (Map.Entry<String, String> BMS05Entry : BMS05.entrySet()) {
  328 + Map<String, String> subMap = new HashMap<>();
  329 + subMap.put("BMS05", "");
  330 + subMap.put("BMS02", "");
  331 + subMap.put("BMS01", "");
  332 + subMap.put("BMS03", "");
  333 + String key = BMS05Entry.getKey();
  334 + String value = BMS05Entry.getValue();
  335 + subMap.put("BMS05", value);
  336 + resultMap.put(key, subMap);
  337 + }
  338 + }
  339 + // BMS-总电流
  340 + Map<String, String> BMS02 = getDateDetail("BMS02", "50");
  341 + if (MapUtils.isNotEmpty(BMS02)) {
  342 + for (Map.Entry<String, String> BMS02Entry : BMS02.entrySet()) {
  343 + String key = BMS02Entry.getKey();
  344 + String value = BMS02Entry.getValue();
  345 + if (resultMap.containsKey(key)) {
  346 + resultMap.get(key).put("BMS02", value);
  347 + }
  348 + }
  349 + }
  350 + // BMS-总电压
  351 + Map<String, String> BMS01 = getDateDetail("BMS01", "50");
  352 + if (MapUtils.isNotEmpty(BMS01)) {
  353 + for (Map.Entry<String, String> BMS01Entry : BMS01.entrySet()) {
  354 + String key = BMS01Entry.getKey();
  355 + String value = BMS01Entry.getValue();
  356 + if (resultMap.containsKey(key)) {
  357 + resultMap.get(key).put("BMS01", value);
  358 + }
  359 + }
  360 + }
  361 + // BMS-SOC
  362 + Map<String, String> BMS03 = getDateDetail("BMS03", "50");
  363 + if (MapUtils.isNotEmpty(BMS03)) {
  364 + for (Map.Entry<String, String> BMS03Entry : BMS03.entrySet()) {
  365 + String key = BMS03Entry.getKey();
  366 + String value = BMS03Entry.getValue();
  367 + if (resultMap.containsKey(key)) {
  368 + resultMap.get(key).put("BMS03", value);
  369 + }
  370 + }
  371 + }
  372 + }
  373 + if ("PCS_MAP".equals(type)) {
  374 + // PCS-交流A相电流
  375 + Map<String, String> PCS21 = getDateDetail("PCS21", "50");
  376 + if (MapUtils.isNotEmpty(PCS21)) {
  377 + for (Map.Entry<String, String> PCS21Entry : PCS21.entrySet()) {
  378 + Map<String, String> subMap = new HashMap<>();
  379 + subMap.put("PCS21", "");
  380 + subMap.put("PCS26", "");
  381 + subMap.put("PCS23", "");
  382 + String key = PCS21Entry.getKey();
  383 + String value = PCS21Entry.getValue();
  384 + subMap.put("PCS21", value);
  385 + resultMap.put(key, subMap);
  386 + }
  387 + }
  388 +
  389 + // PCS-最大放电电流
  390 + Map<String, String> PCS26 = getDateDetail("PCS26", "50");
  391 + if (MapUtils.isNotEmpty(PCS26)) {
  392 + for (Map.Entry<String, String> PCS26Entry : PCS26.entrySet()) {
  393 + String key = PCS26Entry.getKey();
  394 + String value = PCS26Entry.getValue();
  395 + if (resultMap.containsKey(key)) {
  396 + resultMap.get(key).put("PCS26", value);
  397 + }
  398 + }
  399 + }
  400 +
  401 + // PCS-交流C相电流
  402 + Map<String, String> PCS23 = getDateDetail("PCS23", "50");
  403 + if (MapUtils.isNotEmpty(PCS23)) {
  404 + for (Map.Entry<String, String> PCS23Entry : PCS23.entrySet()) {
  405 + String key = PCS23Entry.getKey();
  406 + String value = PCS23Entry.getValue();
  407 + if (resultMap.containsKey(key)) {
  408 + resultMap.get(key).put("PCS23", value);
  409 + }
  410 + }
  411 + }
  412 + }
  413 + if ("CP_MAP".equals(type)) {
  414 + // PCS-交流A相电流
  415 + Map<String, String> PCS21 = getDateDetail("PCS21", "50");
  416 + if (MapUtils.isNotEmpty(PCS21)) {
  417 + for (Map.Entry<String, String> PCS21Entry : PCS21.entrySet()) {
  418 + Map<String, String> subMap = new HashMap<>();
  419 + subMap.put("PCS21", "");
  420 + subMap.put("PCS22", "");
  421 + subMap.put("PCS23", "");
  422 + String key = PCS21Entry.getKey();
  423 + String value = PCS21Entry.getValue();
  424 + subMap.put("PCS21", value);
  425 + resultMap.put(key, subMap);
  426 + }
  427 + }
  428 +
  429 + // PCS-交流B相电流
  430 + Map<String, String> PCS22 = getDateDetail("PCS22", "50");
  431 + if (MapUtils.isNotEmpty(PCS22)) {
  432 + for (Map.Entry<String, String> PCS22Entry : PCS22.entrySet()) {
  433 + String key = PCS22Entry.getKey();
  434 + String value = PCS22Entry.getValue();
  435 + if (resultMap.containsKey(key)) {
  436 + resultMap.get(key).put("PCS22", value);
  437 + }
  438 + }
  439 + }
  440 +
  441 + // PCS-交流C相电流
  442 + Map<String, String> PCS23 = getDateDetail("PCS23", "50");
  443 + if (MapUtils.isNotEmpty(PCS23)) {
  444 + for (Map.Entry<String, String> PCS23Entry : PCS23.entrySet()) {
  445 + String key = PCS23Entry.getKey();
  446 + String value = PCS23Entry.getValue();
  447 + if (resultMap.containsKey(key)) {
  448 + resultMap.get(key).put("PCS23", value);
  449 + }
  450 + }
  451 + }
  452 + }
  453 + if ("PV_MAP".equals(type)) {
  454 + // PV-A相电流
  455 + Map<String, String> PV10 = getDateDetail("PV10", "50");
  456 + if (MapUtils.isNotEmpty(PV10)) {
  457 + for (Map.Entry<String, String> PV10Entry : PV10.entrySet()) {
  458 + Map<String, String> subMap = new HashMap<>();
  459 + subMap.put("PV10", "");
  460 + subMap.put("PV11", "");
  461 + subMap.put("PV12", "");
  462 + String key = PV10Entry.getKey();
  463 + String value = PV10Entry.getValue();
  464 + subMap.put("PV10", value);
  465 + resultMap.put(key, subMap);
  466 + }
  467 + }
  468 +
  469 + // PV-B相电流
  470 + Map<String, String> PV11 = getDateDetail("PV11", "50");
  471 + if (MapUtils.isNotEmpty(PV11)) {
  472 + for (Map.Entry<String, String> PV11Entry : PV11.entrySet()) {
  473 + String key = PV11Entry.getKey();
  474 + String value = PV11Entry.getValue();
  475 + if (resultMap.containsKey(key)) {
  476 + resultMap.get(key).put("PV11", value);
  477 + }
  478 + }
  479 + }
  480 +
  481 + // PV-C相电流
  482 + Map<String, String> PV12 = getDateDetail("PV12", "50");
  483 + if (MapUtils.isNotEmpty(PV12)) {
  484 + for (Map.Entry<String, String> PV12Entry : PV12.entrySet()) {
  485 + String key = PV12Entry.getKey();
  486 + String value = PV12Entry.getValue();
  487 + if (resultMap.containsKey(key)) {
  488 + resultMap.get(key).put("PV12", value);
  489 + }
  490 + }
  491 + }
  492 + }
  493 + if ("EM_MAP".equals(type)) {
  494 + // EM-CA线电压
  495 + Map<String, String> EM03 = getDateDetail("EM03", "50");
  496 + if (MapUtils.isNotEmpty(EM03)) {
  497 + for (Map.Entry<String, String> EM03Entry : EM03.entrySet()) {
  498 + Map<String, String> subMap = new HashMap<>();
  499 + subMap.put("EM03", "");
  500 + subMap.put("EM02", "");
  501 + subMap.put("EM01", "");
  502 + String key = EM03Entry.getKey();
  503 + String value = EM03Entry.getValue();
  504 + subMap.put("EM03", value);
  505 + resultMap.put(key, subMap);
  506 + }
  507 + }
  508 +
  509 + // EM-BC线电压
  510 + Map<String, String> EM02 = getDateDetail("EM02", "50");
  511 + if (MapUtils.isNotEmpty(EM02)) {
  512 + for (Map.Entry<String, String> EM02Entry : EM02.entrySet()) {
  513 + String key = EM02Entry.getKey();
  514 + String value = EM02Entry.getValue();
  515 + if (resultMap.containsKey(key)) {
  516 + resultMap.get(key).put("EM02", value);
  517 + }
  518 + }
  519 + }
  520 +
  521 + // EM-AB线电压
  522 + Map<String, String> EM01 = getDateDetail("EM01", "50");
  523 + if (MapUtils.isNotEmpty(EM01)) {
  524 + for (Map.Entry<String, String> EM01Entry : EM01.entrySet()) {
  525 + String key = EM01Entry.getKey();
  526 + String value = EM01Entry.getValue();
  527 + if (resultMap.containsKey(key)) {
  528 + resultMap.get(key).put("EM01", value);
  529 + }
  530 + }
  531 + }
  532 + }
  533 +// log.info("=========result========[{}]==========", resultMap);
  534 + List<PowerModel> resultList = new ArrayList<>();
  535 + if (MapUtils.isNotEmpty(resultMap)) {
  536 + for (Map.Entry<String, Map<String, String>> stringMapEntry : resultMap.entrySet()) {
  537 + PowerModel powerModel = new PowerModel();
  538 + String date = stringMapEntry.getKey();
  539 + Map<String, String> subMap = stringMapEntry.getValue();
  540 + powerModel.setDate(date);
  541 + powerModel.setBMS05(subMap.get("BMS05"));
  542 + powerModel.setBMS16(subMap.get("BMS16"));
  543 + powerModel.setBMS29(subMap.get("BMS29"));
  544 + powerModel.setPCS21(subMap.get("PCS21"));
  545 + powerModel.setPCS22(subMap.get("PCS22"));
  546 + powerModel.setPCS23(subMap.get("PCS23"));
  547 + powerModel.setCP16(subMap.get("CP16"));
  548 + powerModel.setCP27(subMap.get("CP27"));
  549 + powerModel.setCP28(subMap.get("CP28"));
  550 + powerModel.setPV04(subMap.get("PV04"));
  551 + powerModel.setPV06(subMap.get("PV06"));
  552 + powerModel.setPV24(subMap.get("PV24"));
  553 + powerModel.setEM04(subMap.get("EM04"));
  554 + powerModel.setEM05(subMap.get("EM05"));
  555 + powerModel.setEM06(subMap.get("EM06"));
  556 + powerModel.setPV03(subMap.get("PV03"));
  557 + powerModel.setBMS02(subMap.get("BMS02"));
  558 + powerModel.setBMS01(subMap.get("BMS01"));
  559 + powerModel.setBMS03(subMap.get("BMS03"));
  560 + powerModel.setPCS26(subMap.get("PCS26"));
  561 + powerModel.setPV10(subMap.get("PV10"));
  562 + powerModel.setPV11(subMap.get("PV11"));
  563 + powerModel.setPV12(subMap.get("PV12"));
  564 + powerModel.setEM01(subMap.get("EM01"));
  565 + powerModel.setEM02(subMap.get("EM02"));
  566 + powerModel.setEM03(subMap.get("EM03"));
  567 + powerModel.setCP02(subMap.get("CP02"));
  568 + powerModel.setEM30(subMap.get("EM30"));
  569 + resultList.add(powerModel);
  570 + }
  571 + }
  572 + log.info("=========list========[{}]==========", resultList);
  573 + return resultList;
  574 + }
  575 +
  576 + private Map<String, String> getDateDetail(String key, String limit) {
  577 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  578 + Date currentDate = new Date();
  579 + String endTime = sdf.format(currentDate);
  580 + Calendar calendar = Calendar.getInstance();
  581 + calendar.setTime(currentDate);
  582 + calendar.add(Calendar.DATE, -3);
  583 + Date startDate = calendar.getTime();
  584 + String startTime = sdf.format(startDate);
  585 + Map<String, String> header = new HashMap<>();
  586 + header.put("X-Token", TOKEN);
  587 + Map<String, String> params = new HashMap<>();
  588 + params.put("key", key);
  589 + params.put("startTime", startTime);
  590 + params.put("endTime", endTime);
  591 + params.put("limit", limit);
  592 + String jsonStr = HttpClientUtils.doGetRequest(DATE_URL, header, params);
  593 + if (StringUtils.isBlank(jsonStr)) {
  594 + return new HashMap<>();
  595 + }
  596 + Map<String, Object> result = JSONObject.parseObject(jsonStr);
  597 + Integer code = (Integer) result.get("code");
  598 + Map<String, String> resultMap = new HashMap<>();
  599 + if (code != null && code == 200) {
  600 + List<Map<String, Object>> list = (List<Map<String, Object>>) result.get("data");
  601 + if (CollectionUtils.isEmpty(list)) {
  602 + return new HashMap<>();
  603 + }
  604 + for (Map<String, Object> map : list) {
  605 + String value = String.valueOf(map.get(key.toLowerCase()));
  606 + String date = (String) map.get("ts");
  607 + String dateStr = formatDate(date);
  608 + resultMap.put(dateStr, value);
  609 + }
  610 + } else {
  611 + return new HashMap<>();
  612 + }
  613 + return resultMap;
  614 + }
  615 +
  616 + public String formatDate(String date) {
  617 + Instant instant = Instant.parse(date);
  618 + LocalDateTime localDateTime = instant.atZone(ZoneId.of("Z")).toLocalDateTime();
  619 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  620 + String formattedString = localDateTime.format(formatter);
  621 + return formattedString;
  622 + }
  623 +
  624 + private void addPowerData(Map<String, Object> resultMap, Map<String, Object> detailMap) {
  625 + Integer code = (Integer) detailMap.get("code");
  626 + if (code != null && code == 200) {
  627 + List<Map<String, Object>> list = (List<Map<String, Object>>) detailMap.get("data");
  628 + Map<String, String> bmsMap = new HashMap<>();
  629 + Map<String, String> pcsMap = new HashMap<>();
  630 + Map<String, String> cpMap = new HashMap<>();
  631 + Map<String, String> emMap = new HashMap<>();
  632 + Map<String, String> pvMap = new HashMap<>();
  633 + for (Map<String, Object> dataMap : list) {
  634 + String key = (String) dataMap.get("key");
  635 + String value = String.valueOf(dataMap.get("value"));
  636 + if ("BMS01".equals(key)) {
  637 + bmsMap.put("BMS01", value);
  638 + }
  639 + if ("BMS02".equals(key)) {
  640 + bmsMap.put("BMS02", value);
  641 + }
  642 + if ("BMS03".equals(key)) {
  643 + bmsMap.put("BMS03", value);
  644 + }
  645 + if ("BMS04".equals(key)) {
  646 + bmsMap.put("BMS04", value);
  647 + }
  648 + if ("BMS05".equals(key)) {
  649 + bmsMap.put("BMS05", value);
  650 + }
  651 + if ("BMS06".equals(key)) {
  652 + bmsMap.put("BMS06", value);
  653 + }
  654 + if ("BMS07".equals(key)) {
  655 + bmsMap.put("BMS07", value);
  656 + }
  657 + if ("BMS08".equals(key)) {
  658 + bmsMap.put("BMS08", value);
  659 + }
  660 + if ("BMS09".equals(key)) {
  661 + bmsMap.put("BMS09", value);
  662 + }
  663 + if ("BMS10".equals(key)) {
  664 + bmsMap.put("BMS10", value);
  665 + }
  666 + if ("BMS11".equals(key)) {
  667 + bmsMap.put("BMS11", value);
  668 + }
  669 + if ("BMS12".equals(key)) {
  670 + bmsMap.put("BMS12", value);
  671 + }
  672 + if ("BMS13".equals(key)) {
  673 + bmsMap.put("BMS13", value);
  674 + }
  675 + if ("BMS14".equals(key)) {
  676 + bmsMap.put("BMS14", value);
  677 + }
  678 + if ("BMS15".equals(key)) {
  679 + bmsMap.put("BMS15", value);
  680 + }
  681 + if ("BMS16".equals(key)) {
  682 + bmsMap.put("BMS16", value);
  683 + }
  684 + if ("BMS17".equals(key)) {
  685 + bmsMap.put("BMS17", value);
  686 + }
  687 + if ("BMS18".equals(key)) {
  688 + bmsMap.put("BMS18", value);
  689 + }
  690 + if ("BMS19".equals(key)) {
  691 + bmsMap.put("BMS19", value);
  692 + }
  693 + if ("BMS20".equals(key)) {
  694 + bmsMap.put("BMS20", value);
  695 + }
  696 + if ("BMS21".equals(key)) {
  697 + bmsMap.put("BMS21", value);
  698 + }
  699 + if ("BMS22".equals(key)) {
  700 + bmsMap.put("BMS22", value);
  701 + }
  702 + if ("BMS23".equals(key)) {
  703 + bmsMap.put("BMS23", value);
  704 + }
  705 + if ("BMS24".equals(key)) {
  706 + bmsMap.put("BMS24", value);
  707 + }
  708 + if ("BMS25".equals(key)) {
  709 + bmsMap.put("BMS25", value);
  710 + }
  711 + if ("BMS26".equals(key)) {
  712 + bmsMap.put("BMS26", value);
  713 + }
  714 + if ("BMS27".equals(key)) {
  715 + bmsMap.put("BMS27", value);
  716 + }
  717 + if ("BMS28".equals(key)) {
  718 + bmsMap.put("BMS28", value);
  719 + }
  720 + if ("BMS29".equals(key)) {
  721 + bmsMap.put("BMS29", value);
  722 + }
  723 + if ("BMS30".equals(key)) {
  724 + bmsMap.put("BMS30", value);
  725 + }
  726 + if ("BMS31".equals(key)) {
  727 + bmsMap.put("BMS31", value);
  728 + }
  729 + if ("BMS32".equals(key)) {
  730 + bmsMap.put("BMS32", value);
  731 + }
  732 + if ("BMS33".equals(key)) {
  733 + bmsMap.put("BMS33", value);
  734 + }
  735 + if ("BMS34".equals(key)) {
  736 + bmsMap.put("BMS34", value);
  737 + }
  738 + if ("BMS35".equals(key)) {
  739 + bmsMap.put("BMS35", value);
  740 + }
  741 + if ("BMS36".equals(key)) {
  742 + bmsMap.put("BMS36", value);
  743 + }
  744 +
  745 + if ("PCS01".equals(key)) {
  746 + pcsMap.put("PCS01", value);
  747 + }
  748 + if ("PCS02".equals(key)) {
  749 + pcsMap.put("PCS02", value);
  750 + }
  751 + if ("PCS03".equals(key)) {
  752 + pcsMap.put("PCS03", value);
  753 + }
  754 + if ("PCS04".equals(key)) {
  755 + pcsMap.put("PCS04", value);
  756 + }
  757 + if ("PCS05".equals(key)) {
  758 + pcsMap.put("PCS05", value);
  759 + }
  760 + if ("PCS06".equals(key)) {
  761 + pcsMap.put("PCS06", value);
  762 + }
  763 + if ("PCS07".equals(key)) {
  764 + pcsMap.put("PCS07", value);
  765 + }
  766 + if ("PCS08".equals(key)) {
  767 + pcsMap.put("PCS08", value);
  768 + }
  769 + if ("PCS09".equals(key)) {
  770 + pcsMap.put("PCS09", value);
  771 + }
  772 + if ("PCS10".equals(key)) {
  773 + pcsMap.put("PCS10", value);
  774 + }
  775 + if ("PCS11".equals(key)) {
  776 + pcsMap.put("PCS11", value);
  777 + }
  778 + if ("PCS12".equals(key)) {
  779 + pcsMap.put("PCS12", value);
  780 + }
  781 + if ("PCS13".equals(key)) {
  782 + pcsMap.put("PCS13", value);
  783 + }
  784 + if ("PCS14".equals(key)) {
  785 + pcsMap.put("PCS14", value);
  786 + }
  787 + if ("PCS15".equals(key)) {
  788 + pcsMap.put("PCS15", value);
  789 + }
  790 + if ("PCS16".equals(key)) {
  791 + pcsMap.put("PCS16", value);
  792 + }
  793 + if ("PCS17".equals(key)) {
  794 + pcsMap.put("PCS17", value);
  795 + }
  796 + if ("PCS18".equals(key)) {
  797 + pcsMap.put("PCS18", value);
  798 + }
  799 + if ("PCS19".equals(key)) {
  800 + pcsMap.put("PCS19", value);
  801 + }
  802 + if ("PCS20".equals(key)) {
  803 + pcsMap.put("PCS20", value);
  804 + }
  805 + if ("PCS21".equals(key)) {
  806 + pcsMap.put("PCS21", value);
  807 + }
  808 + if ("PCS22".equals(key)) {
  809 + pcsMap.put("PCS22", value);
  810 + }
  811 + if ("PCS23".equals(key)) {
  812 + pcsMap.put("PCS23", value);
  813 + }
  814 + if ("PCS24".equals(key)) {
  815 + pcsMap.put("PCS24", value);
  816 + }
  817 + if ("PCS25".equals(key)) {
  818 + pcsMap.put("PCS25", value);
  819 + }
  820 + if ("PCS26".equals(key)) {
  821 + pcsMap.put("PCS26", value);
  822 + }
  823 + if ("PCS27".equals(key)) {
  824 + pcsMap.put("PCS27", value);
  825 + }
  826 + if ("PCS28".equals(key)) {
  827 + pcsMap.put("PCS28", value);
  828 + }
  829 + if ("PCS29".equals(key)) {
  830 + pcsMap.put("PCS29", value);
  831 + }
  832 +
  833 + if ("CP01".equals(key)) {
  834 + cpMap.put("CP01", value);
  835 + }
  836 + if ("CP02".equals(key)) {
  837 + cpMap.put("CP02", value);
  838 + }
  839 + if ("CP03".equals(key)) {
  840 + cpMap.put("CP03", value);
  841 + }
  842 + if ("CP04".equals(key)) {
  843 + cpMap.put("CP04", value);
  844 + }
  845 + if ("CP05".equals(key)) {
  846 + cpMap.put("CP05", value);
  847 + }
  848 + if ("CP06".equals(key)) {
  849 + cpMap.put("CP06", value);
  850 + }
  851 + if ("CP07".equals(key)) {
  852 + cpMap.put("CP07", value);
  853 + }
  854 + if ("CP08".equals(key)) {
  855 + cpMap.put("CP08", value);
  856 + }
  857 + if ("CP09".equals(key)) {
  858 + cpMap.put("CP09", value);
  859 + }
  860 + if ("CP10".equals(key)) {
  861 + cpMap.put("CP10", value);
  862 + }
  863 + if ("CP11".equals(key)) {
  864 + cpMap.put("CP11", value);
  865 + }
  866 + if ("CP12".equals(key)) {
  867 + cpMap.put("CP12", value);
  868 + }
  869 + if ("CP13".equals(key)) {
  870 + cpMap.put("CP13", value);
  871 + }
  872 + if ("CP14".equals(key)) {
  873 + cpMap.put("CP14", value);
  874 + }
  875 + if ("CP15".equals(key)) {
  876 + cpMap.put("CP15", value);
  877 + }
  878 + if ("CP16".equals(key)) {
  879 + cpMap.put("CP16", value);
  880 + }
  881 + if ("CP17".equals(key)) {
  882 + cpMap.put("CP17", value);
  883 + }
  884 + if ("CP18".equals(key)) {
  885 + cpMap.put("CP18", value);
  886 + }
  887 + if ("CP19".equals(key)) {
  888 + cpMap.put("CP19", value);
  889 + }
  890 + if ("CP20".equals(key)) {
  891 + cpMap.put("CP20", value);
  892 + }
  893 + if ("CP21".equals(key)) {
  894 + cpMap.put("CP21", value);
  895 + }
  896 + if ("CP22".equals(key)) {
  897 + cpMap.put("CP22", value);
  898 + }
  899 + if ("CP23".equals(key)) {
  900 + cpMap.put("CP23", value);
  901 + }
  902 + if ("CP24".equals(key)) {
  903 + cpMap.put("CP24", value);
  904 + }
  905 + if ("CP25".equals(key)) {
  906 + cpMap.put("CP25", value);
  907 + }
  908 + if ("CP26".equals(key)) {
  909 + cpMap.put("CP26", value);
  910 + }
  911 + if ("CP27".equals(key)) {
  912 + cpMap.put("CP27", value);
  913 + }
  914 + if ("CP28".equals(key)) {
  915 + cpMap.put("CP28", value);
  916 + }
  917 + if ("CP29".equals(key)) {
  918 + cpMap.put("CP29", value);
  919 + }
  920 + if ("CP30".equals(key)) {
  921 + cpMap.put("CP30", value);
  922 + }
  923 +
  924 + if ("EM01".equals(key)) {
  925 + emMap.put("EM01", value);
  926 + }
  927 + if ("EM02".equals(key)) {
  928 + emMap.put("EM02", value);
  929 + }
  930 + if ("EM03".equals(key)) {
  931 + emMap.put("EM03", value);
  932 + }
  933 + if ("EM04".equals(key)) {
  934 + emMap.put("EM04", value);
  935 + }
  936 + if ("EM05".equals(key)) {
  937 + emMap.put("EM05", value);
  938 + }
  939 + if ("EM06".equals(key)) {
  940 + emMap.put("EM06", value);
  941 + }
  942 + if ("EM07".equals(key)) {
  943 + emMap.put("EM07", value);
  944 + }
  945 + if ("EM08".equals(key)) {
  946 + emMap.put("EM08", value);
  947 + }
  948 + if ("EM09".equals(key)) {
  949 + emMap.put("EM09", value);
  950 + }
  951 + if ("EM10".equals(key)) {
  952 + emMap.put("EM10", value);
  953 + }
  954 + if ("EM11".equals(key)) {
  955 + emMap.put("EM11", value);
  956 + }
  957 + if ("EM12".equals(key)) {
  958 + emMap.put("EM12", value);
  959 + }
  960 + if ("EM13".equals(key)) {
  961 + emMap.put("EM13", value);
  962 + }
  963 + if ("EM14".equals(key)) {
  964 + emMap.put("EM14", value);
  965 + }
  966 + if ("EM15".equals(key)) {
  967 + emMap.put("EM15", value);
  968 + }
  969 + if ("EM16".equals(key)) {
  970 + emMap.put("EM16", value);
  971 + }
  972 + if ("EM17".equals(key)) {
  973 + emMap.put("EM17", value);
  974 + }
  975 + if ("EM18".equals(key)) {
  976 + emMap.put("EM18", value);
  977 + }
  978 + if ("EM19".equals(key)) {
  979 + emMap.put("EM19", value);
  980 + }
  981 + if ("EM20".equals(key)) {
  982 + emMap.put("EM20", value);
  983 + }
  984 + if ("EM21".equals(key)) {
  985 + emMap.put("EM21", value);
  986 + }
  987 + if ("EM22".equals(key)) {
  988 + emMap.put("EM22", value);
  989 + }
  990 + if ("EM23".equals(key)) {
  991 + emMap.put("EM23", value);
  992 + }
  993 + if ("EM24".equals(key)) {
  994 + emMap.put("EM24", value);
  995 + }
  996 + if ("EM25".equals(key)) {
  997 + emMap.put("EM25", value);
  998 + }
  999 + if ("EM26".equals(key)) {
  1000 + emMap.put("EM26", value);
  1001 + }
  1002 + if ("EM27".equals(key)) {
  1003 + emMap.put("EM27", value);
  1004 + }
  1005 + if ("EM28".equals(key)) {
  1006 + emMap.put("EM28", value);
  1007 + }
  1008 + if ("EM29".equals(key)) {
  1009 + emMap.put("EM29", value);
  1010 + }
  1011 + if ("EM30".equals(key)) {
  1012 + emMap.put("EM30", value);
  1013 + }
  1014 +
  1015 + if ("PV01".equals(key)) {
  1016 + pvMap.put("PV01", value);
  1017 + }
  1018 + if ("PV02".equals(key)) {
  1019 + pvMap.put("PV02", value);
  1020 + }
  1021 + if ("PV03".equals(key)) {
  1022 + pvMap.put("PV03", value);
  1023 + }
  1024 + if ("PV04".equals(key)) {
  1025 + pvMap.put("PV04", value);
  1026 + }
  1027 + if ("PV05".equals(key)) {
  1028 + pvMap.put("PV05", value);
  1029 + }
  1030 + if ("PV06".equals(key)) {
  1031 + pvMap.put("PV06", value);
  1032 + }
  1033 + if ("PV07".equals(key)) {
  1034 + pvMap.put("PV07", value);
  1035 + }
  1036 + if ("PV08".equals(key)) {
  1037 + pvMap.put("PV08", value);
  1038 + }
  1039 + if ("PV09".equals(key)) {
  1040 + pvMap.put("PV09", value);
  1041 + }
  1042 + if ("PV10".equals(key)) {
  1043 + pvMap.put("PV10", value);
  1044 + }
  1045 + if ("PV11".equals(key)) {
  1046 + pvMap.put("PV11", value);
  1047 + }
  1048 + if ("PV12".equals(key)) {
  1049 + pvMap.put("PV12", value);
  1050 + }
  1051 + if ("PV13".equals(key)) {
  1052 + pvMap.put("PV13", value);
  1053 + }
  1054 + if ("PV14".equals(key)) {
  1055 + pvMap.put("PV14", value);
  1056 + }
  1057 + if ("PV15".equals(key)) {
  1058 + pvMap.put("PV15", value);
  1059 + }
  1060 + if ("PV16".equals(key)) {
  1061 + pvMap.put("PV16", value);
  1062 + }
  1063 + if ("PV17".equals(key)) {
  1064 + pvMap.put("PV17", value);
  1065 + }
  1066 + if ("PV18".equals(key)) {
  1067 + pvMap.put("PV18", value);
  1068 + }
  1069 + if ("PV19".equals(key)) {
  1070 + pvMap.put("PV19", value);
  1071 + }
  1072 + if ("PV20".equals(key)) {
  1073 + pvMap.put("PV20", value);
  1074 + }
  1075 + if ("PV21".equals(key)) {
  1076 + pvMap.put("PV21", value);
  1077 + }
  1078 + if ("PV22".equals(key)) {
  1079 + pvMap.put("PV22", value);
  1080 + }
  1081 + if ("PV23".equals(key)) {
  1082 + pvMap.put("PV23", value);
  1083 + }
  1084 + if ("PV24".equals(key)) {
  1085 + pvMap.put("PV24", value);
  1086 + }
  1087 + if ("PV25".equals(key)) {
  1088 + pvMap.put("PV25", value);
  1089 + }
  1090 + if ("PV26".equals(key)) {
  1091 + pvMap.put("PV26", value);
  1092 + }
  1093 + if ("PV27".equals(key)) {
  1094 + pvMap.put("PV27", value);
  1095 + }
  1096 + if ("PV28".equals(key)) {
  1097 + pvMap.put("PV28", value);
  1098 + }
  1099 + if ("PV29".equals(key)) {
  1100 + pvMap.put("PV29", value);
  1101 + }
  1102 + if ("PV30".equals(key)) {
  1103 + pvMap.put("PV30", value);
  1104 +
  1105 + }
  1106 + }
  1107 +
  1108 + resultMap.put("BMS", bmsMap);
  1109 + resultMap.put("PCS", pcsMap);
  1110 + resultMap.put("CP", cpMap);
  1111 + resultMap.put("PV", pvMap);
  1112 + resultMap.put("EM", emMap);
  1113 + }
  1114 + }
  1115 +
  1116 + public void deviceCount(Map<String, Object> resultMap) {
  1117 + Map<String, String> header = new HashMap<>();
  1118 + header.put("X-Token", TOKEN);
  1119 + String jsonStr = HttpClientUtils.doGetRequest(PANEL_URL, header, null);
  1120 + if (StringUtils.isBlank(jsonStr)) {
  1121 + return;
  1122 + }
  1123 + Map<String, Object> result = JSONObject.parseObject(jsonStr);
  1124 + Map<String, Object> deviceMap = new HashMap<>();
  1125 + if (MapUtils.isNotEmpty(result)) {
  1126 + Integer code = (Integer) result.get("code");
  1127 + if (code != null && code == 200) {
  1128 + JSONObject data = (JSONObject) result.get("data");
  1129 + Map<String, Object> deviceInfo = (Map<String, Object>) data.get("deviceInfo");
  1130 + Integer total = (Integer) deviceInfo.get("total");
  1131 + log.info("====设备总数===[{}]", total);
  1132 + deviceMap.put("deviceTotal", total);
  1133 + List<Map<String, Object>> list = (List<Map<String, Object>>) data.get("deviceLinkStatusInfo");
  1134 + for (Map<String, Object> map : list) {
  1135 + String linkStatus = (String) map.get("linkStatus");
  1136 + Integer deviceTotal = (Integer) map.get("deviceTotal");
  1137 + if ("inactive".equals(linkStatus)) {
  1138 + log.info("====在线设备数===[{}]", deviceTotal);
  1139 + deviceMap.put("inactiveCount", deviceTotal);
  1140 + }
  1141 + if ("offline".equals(linkStatus)) {
  1142 + log.info("====离线设备数===[{}]", deviceTotal);
  1143 + deviceMap.put("offlineCount", deviceTotal);
  1144 + }
  1145 + }
  1146 + Map<String, Object> alarmInfo = (Map<String, Object>) data.get("alarmInfo");
  1147 + // 总报警
  1148 + Integer ararmTotalCount = (Integer) alarmInfo.get("total");
  1149 + // 今日新增报警
  1150 + Integer ararmTodayCount = (Integer) alarmInfo.get("todayAdd");
  1151 + log.info("====变量报警===[{}]", ararmTodayCount);
  1152 + deviceMap.put("ararmCount", ararmTodayCount);
  1153 + }
  1154 + }
  1155 + resultMap.put("deviceInfo", deviceMap);
  1156 + log.info("========resultMap=={}", resultMap);
  1157 + }
  1158 +
  1159 + @Test
  1160 + public void test1() {
  1161 + Map<String, Object> resultMap = new HashMap<>();
  1162 + deviceCount(resultMap);
  1163 + }
  1164 +
  1165 + @Test
  1166 + public void test2() {
  1167 + PowerModel powerModel = new PowerModel();
  1168 + getIndex(powerModel);
  1169 + }
  1170 +
  1171 + @Test
  1172 + public void testDateDetail() {
  1173 +// getDateMap("BMS_MAP");
  1174 +// getDateMap("PCS_MAP");
  1175 +// getDateMap("PV_MAP");
  1176 +// getDateMap("CP_MAP");
  1177 +// getDateMap("EM_MAP");
  1178 +// getDateMap("INDEX_MAP");
  1179 + }
  1180 +}
... ...
  1 +package com.qgutech.service;
  2 +
  3 +import com.qgutech.mapper.UserMapper;
  4 +import com.qgutech.model.Page;
  5 +import com.qgutech.model.User;
  6 +import org.springframework.beans.factory.annotation.Value;
  7 +import org.springframework.stereotype.Service;
  8 +import org.springframework.util.DigestUtils;
  9 +import org.springframework.util.ObjectUtils;
  10 +import org.springframework.util.StringUtils;
  11 +
  12 +import javax.annotation.Resource;
  13 +import java.nio.charset.StandardCharsets;
  14 +import java.util.Date;
  15 +import java.util.List;
  16 +
  17 +/**
  18 + * @author xxx
  19 + * @date 2024/12/17 12:11
  20 + * @description
  21 + */
  22 +@Service
  23 +public class UserService {
  24 + @Value("${power.init.password}")
  25 + private String INIT_PASSWORD;
  26 + @Resource
  27 + private UserMapper userMapper;
  28 +
  29 + public User getUserById(String userId) {
  30 + return userMapper.getUserById(userId);
  31 + }
  32 +
  33 + public User getUserByMobile(String mobile) {
  34 + return userMapper.getUserByMobile(mobile);
  35 + }
  36 +
  37 + public void register(User user) {
  38 + //根据用户名查询数据库是否存在该用户名
  39 + User userDB = userMapper.findByLoginName(user.getUserName());
  40 + //判断用户是否存在
  41 + if (!ObjectUtils.isEmpty(userDB)) {//如果userDB不为空
  42 + throw new RuntimeException("用户名已存在");
  43 + }
  44 +// 进行注册之前给明文加密
  45 + String passwordSecret = DigestUtils.md5DigestAsHex(user.getPassword().getBytes(StandardCharsets.UTF_8));
  46 + user.setPassword(passwordSecret);
  47 + userMapper.save(user);
  48 + }
  49 +
  50 + public User login(String loginName, String password) {
  51 + //根据用户输入的用户名查询数据是否存在
  52 + User userDB = userMapper.findByLoginName(loginName);
  53 + //判断对象是否存在
  54 + if (ObjectUtils.isEmpty(userDB)) {
  55 + throw new RuntimeException("用户名输入错误");
  56 + }
  57 + if (!userDB.getPassword().equals(DigestUtils.md5DigestAsHex(password.getBytes(StandardCharsets.UTF_8)))) {
  58 + throw new RuntimeException("密码输入错误");
  59 + }
  60 + return userDB;
  61 + }
  62 +
  63 + public void updateUser(User user) {
  64 + user.setLastModifyTime(new Date());
  65 + userMapper.updateUser(user);
  66 + }
  67 +
  68 + public void saveUser(User user) {
  69 + String password = user.getPassword();
  70 + if (StringUtils.isEmpty(password)) {
  71 + password = INIT_PASSWORD;
  72 + }
  73 + String passwordSecret = DigestUtils.md5DigestAsHex(password.getBytes(StandardCharsets.UTF_8));
  74 + user.setPassword(passwordSecret);
  75 + user.setCreateTime(new Date());
  76 + user.setLastModifyTime(new Date());
  77 + user.setCreateBy("SYSTEM");
  78 + user.setLastModifyBy("SYSTEM");
  79 + userMapper.save(user);
  80 + }
  81 +
  82 + public List<User> getUserList(String searchName, Page<User> page) {
  83 + List<User> userList = userMapper.getUserList(searchName, page);
  84 + Integer total = userMapper.getTotal(searchName);
  85 + page.setTotal(total);
  86 + Integer pages = (int) Math.ceil((double) total / page.getPageSize());
  87 + page.setPages(pages);
  88 + return userList;
  89 + }
  90 +
  91 + public void deleteUserById(String userId) {
  92 + userMapper.deleteUser(userId);
  93 + }
  94 +
  95 + public Boolean isExistMobile(String mobile, String loginName) {
  96 + User user = userMapper.getUserExcludeLoginName(mobile, loginName);
  97 + if (user == null) {
  98 + return false;
  99 + }
  100 + return true;
  101 + }
  102 +
  103 + public void updatePassword(String userId, String password) {
  104 + userMapper.updatePassword(userId, password);
  105 + }
  106 +}
... ...
  1 +package com.qgutech.util;
  2 +
  3 +import org.apache.commons.codec.DecoderException;
  4 +import org.apache.commons.codec.binary.Hex;
  5 +
  6 +import javax.crypto.*;
  7 +import javax.crypto.spec.IvParameterSpec;
  8 +import javax.crypto.spec.SecretKeySpec;
  9 +import java.io.UnsupportedEncodingException;
  10 +import java.security.NoSuchAlgorithmException;
  11 +
  12 +/**
  13 + * @author xxx
  14 + * @date 2024/12/25 11:31
  15 + * @description
  16 + */
  17 +public class AESUtil {
  18 + /**
  19 + * 偏移量
  20 + *
  21 + * 说明:偏移量字符串必须是16位 当模式是CBC的时候必须设置偏移量
  22 + * 此处值与前端偏移量值保持一致
  23 + */
  24 + private static String iv = "37fa77f6a3b0462d";
  25 + private static String uniqueKey = "1234567890123456";
  26 +
  27 + /**
  28 + * 加密算法
  29 + */
  30 + private static String Algorithm = "AES";
  31 +
  32 + /**
  33 + * 算法/模式/补码方式
  34 + */
  35 + private static String AlgorithmProvider = "AES/CBC/PKCS5Padding";
  36 +
  37 + /**
  38 + * 加密
  39 + *
  40 + * @param src 加密内容
  41 + * @return
  42 + * @throws Exception
  43 + */
  44 + public static String encrypt(String src) throws Exception {
  45 + byte[] key = uniqueKey.getBytes();
  46 + SecretKey secretKey = new SecretKeySpec(key, Algorithm);
  47 + IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes("utf-8"));
  48 + Cipher cipher = Cipher.getInstance(AlgorithmProvider);
  49 + cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec);
  50 + byte[] cipherBytes = cipher.doFinal(src.getBytes("UTF-8"));
  51 + return byteToHexString(cipherBytes);
  52 + }
  53 +
  54 + /**
  55 + * 解密
  56 + *
  57 + * @param enc 加密内容
  58 + * @return
  59 + * @throws Exception
  60 + */
  61 + public static String decrypt(String enc) throws Exception {
  62 + byte[] key = uniqueKey.getBytes();
  63 + SecretKey secretKey = new SecretKeySpec(key, Algorithm);
  64 + IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes("utf-8"));
  65 + Cipher cipher = Cipher.getInstance(AlgorithmProvider);
  66 + cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);
  67 + byte[] hexBytes = hexStringToBytes(enc);
  68 + byte[] plainBytes = cipher.doFinal(hexBytes);
  69 + return new String(plainBytes, "UTF-8");
  70 + }
  71 +
  72 + /**
  73 + * 将byte数组转换为16进制字符串
  74 + *
  75 + * @param src
  76 + * @return
  77 + */
  78 + private static String byteToHexString(byte[] src) {
  79 + return Hex.encodeHexString(src);
  80 + }
  81 +
  82 + /**
  83 + * 将16进制字符串转换为byte数组
  84 + *
  85 + * @param hexString
  86 + * @return
  87 + */
  88 + private static byte[] hexStringToBytes(String hexString) throws DecoderException {
  89 + return Hex.decodeHex(hexString);
  90 + }
  91 +
  92 + /**
  93 + * AES加密、解密测试方法
  94 + *
  95 + * @param args
  96 + */
  97 + public static void main(String[] args) {
  98 + try {
  99 + // 唯一key作为密钥
  100 + // 加密前数据,此处数据与前端数据一致(加密内容包含有时间戳),请注意查看前端加密前数据
  101 + String src = "hczd";
  102 + System.out.println("密钥:" + uniqueKey);
  103 + System.out.println("原字符串:" + src);
  104 + // 加密
  105 + String encrypt = encrypt(src);
  106 + System.out.println("加密:" + encrypt);
  107 + // 解密
  108 + String decrypt = decrypt(encrypt);
  109 + System.out.println("解密:" + decrypt);
  110 + } catch (Exception e) {
  111 + e.printStackTrace();
  112 + }
  113 + }
  114 +}
... ...
  1 +//
  2 +// Source code recreated from a .class file by IntelliJ IDEA
  3 +// (powered by Fernflower decompiler)
  4 +//
  5 +
  6 +package com.qgutech.util;
  7 +
  8 +import javax.servlet.http.Cookie;
  9 +import javax.servlet.http.HttpServletRequest;
  10 +import javax.servlet.http.HttpServletResponse;
  11 +import org.apache.commons.lang3.StringUtils;
  12 +
  13 +public class CookieUtil {
  14 + private static final int MINUTE_SECONDS = 60;
  15 +
  16 + public CookieUtil() {
  17 + }
  18 +
  19 + public static void setCookie(HttpServletResponse response, String name, String value) {
  20 + setCookie(response, name, value, "/", (String)null);
  21 + }
  22 +
  23 + public static void setCookie(HttpServletResponse response, String name, String value, String path) {
  24 + setCookie(response, name, value, path, (String)null);
  25 + }
  26 +
  27 + public static void setCookie(HttpServletResponse response, String name, String value, String path, String age) {
  28 + setCookie(response, name, value, path, age, (String)null);
  29 + }
  30 +
  31 + public static void setCookie(HttpServletResponse response, String name, String value, String path, String age, String domain) {
  32 + Cookie cookie = new Cookie(name, value);
  33 + cookie.setSecure(false);
  34 + cookie.setPath(path);
  35 + if (StringUtils.isNotEmpty(domain)) {
  36 + cookie.setDomain(domain);
  37 + }
  38 +
  39 + int ageValue = getAgeIntValue(age);
  40 + if (ageValue >= 0) {
  41 + cookie.setMaxAge(ageValue);
  42 + }
  43 +
  44 + response.addCookie(cookie);
  45 + }
  46 +
  47 + public static void setHttpsCookie(HttpServletResponse response, String name, String value) {
  48 + setHttpsCookie(response, name, value, "/", (String)null);
  49 + }
  50 +
  51 + public static void setHttpsCookie(HttpServletResponse response, String name, String value, String path) {
  52 + setHttpsCookie(response, name, value, path, (String)null);
  53 + }
  54 +
  55 + public static void setHttpsCookie(HttpServletResponse response, String name, String value, String path, String age) {
  56 + setHttpsCookie(response, name, value, path, age, (String)null);
  57 + }
  58 +
  59 + public static void setHttpsCookie(HttpServletResponse response, String name, String value, String path, String age, String domain) {
  60 + Cookie cookie = new Cookie(name, value);
  61 + cookie.setSecure(true);
  62 + cookie.setPath(path);
  63 + if (StringUtils.isNotEmpty(domain)) {
  64 + cookie.setDomain(domain);
  65 + }
  66 +
  67 + int ageValue = getAgeIntValue(age);
  68 + if (ageValue >= 0) {
  69 + cookie.setMaxAge(ageValue);
  70 + }
  71 +
  72 + response.addCookie(cookie);
  73 + }
  74 +
  75 + private static int getAgeIntValue(String age) {
  76 + try {
  77 + return Integer.valueOf(age) * 60;
  78 + } catch (Exception var2) {
  79 + return -1;
  80 + }
  81 + }
  82 +
  83 + public static Cookie getCookie(HttpServletRequest request, String name) {
  84 + Cookie[] cookies = request.getCookies();
  85 + Cookie returnCookie = null;
  86 + if (cookies == null) {
  87 + return returnCookie;
  88 + } else {
  89 + for(int i = 0; i < cookies.length; ++i) {
  90 + Cookie thisCookie = cookies[i];
  91 + if (thisCookie.getName().equals(name)) {
  92 + returnCookie = thisCookie;
  93 + break;
  94 + }
  95 + }
  96 +
  97 + return returnCookie;
  98 + }
  99 + }
  100 +
  101 + public static String getCookieValue(HttpServletRequest request, String name) {
  102 + Cookie cookie = getCookie(request, name);
  103 + return cookie == null ? null : cookie.getValue();
  104 + }
  105 +
  106 + public static String getAllCookieNameAndValue(HttpServletRequest request) {
  107 + Cookie[] cookies = request.getCookies();
  108 + StringBuffer cs = new StringBuffer();
  109 +
  110 + for(int i = 0; i < cookies.length; ++i) {
  111 + cs.append(cookies[i].getName()).append("=").append(cookies[i].getValue()).append(";");
  112 + }
  113 +
  114 + return cs.toString();
  115 + }
  116 +
  117 + public static void deleteCookie(HttpServletResponse response, Cookie cookie, String path) {
  118 + if (cookie != null) {
  119 + cookie.setMaxAge(0);
  120 + cookie.setPath(path);
  121 + response.addCookie(cookie);
  122 + }
  123 +
  124 + }
  125 +
  126 + public static void deleteCookie(HttpServletResponse response, Cookie cookie) {
  127 + deleteCookie(response, cookie, "/");
  128 + }
  129 +
  130 + public static String getAppURL(HttpServletRequest request) {
  131 + StringBuffer url = new StringBuffer();
  132 + int port = request.getServerPort();
  133 + if (port < 0) {
  134 + port = 80;
  135 + }
  136 +
  137 + String scheme = request.getScheme();
  138 + url.append(scheme);
  139 + url.append("://");
  140 + url.append(request.getServerName());
  141 + if (scheme.equals("http") && port != 80 || scheme.equals("https") && port != 443) {
  142 + url.append(':');
  143 + url.append(port);
  144 + }
  145 +
  146 + url.append(request.getContextPath());
  147 + return url.toString();
  148 + }
  149 +
  150 + public static void addCookie(HttpServletResponse response, String name, String value, String path, String age, String domain, boolean isSecure, boolean isHttpOnly) {
  151 + int maxAge = getAgeIntValue(age);
  152 + addCookieByHeader(response, name, value, maxAge, path, domain, isSecure, isHttpOnly);
  153 + }
  154 +
  155 + private static void addCookieByHeader(HttpServletResponse response, String name, String value, int maxAge, String path, String domain, boolean isSecure, boolean isHttpOnly) {
  156 + StringBuilder buffer = new StringBuilder();
  157 + buffer.append(name).append("=").append(value).append(";");
  158 + if (maxAge == 0) {
  159 + buffer.append("Expires=Thu Jan 01 08:00:00 CST 1970;");
  160 + } else if (maxAge > 0) {
  161 + buffer.append("Max-Age=").append(maxAge).append(";");
  162 + }
  163 +
  164 + if (domain != null) {
  165 + buffer.append("domain=").append(domain).append(";");
  166 + }
  167 +
  168 + if (path != null) {
  169 + buffer.append("path=").append(path).append(";");
  170 + }
  171 +
  172 + if (isSecure) {
  173 + buffer.append("secure;");
  174 + }
  175 +
  176 + if (isHttpOnly) {
  177 + buffer.append("HTTPOnly;");
  178 + }
  179 +
  180 + response.addHeader("Set-Cookie", buffer.toString());
  181 + }
  182 +
  183 + public static String getCookieDomain(HttpServletRequest request) {
  184 + return request.getServerName();
  185 + }
  186 +}
  187 +
... ...
  1 +package com.qgutech.util;
  2 +
  3 +import lombok.extern.slf4j.Slf4j;
  4 +import org.apache.commons.collections4.MapUtils;
  5 +import org.apache.commons.lang3.StringUtils;
  6 +import org.apache.http.*;
  7 +import org.apache.http.client.config.RequestConfig;
  8 +import org.apache.http.client.entity.UrlEncodedFormEntity;
  9 +import org.apache.http.client.methods.CloseableHttpResponse;
  10 +import org.apache.http.client.methods.HttpGet;
  11 +import org.apache.http.client.methods.HttpPost;
  12 +import org.apache.http.impl.client.CloseableHttpClient;
  13 +import org.apache.http.message.BasicNameValuePair;
  14 +import org.apache.http.util.EntityUtils;
  15 +
  16 +import java.io.IOException;
  17 +import java.io.UnsupportedEncodingException;
  18 +import java.net.URLEncoder;
  19 +import java.util.ArrayList;
  20 +import java.util.List;
  21 +import java.util.Map;
  22 +
  23 +/**
  24 + * http请求工具类
  25 + */
  26 +@Slf4j
  27 +public class HttpClientUtils {
  28 +
  29 +
  30 + /**
  31 + * 发送post请求
  32 + *
  33 + * @return
  34 + */
  35 + public static String doPostRequest(String url, Map<String, String> header, Map<String, String> params, HttpEntity httpEntity) {
  36 + String resultStr = "";
  37 + if (StringUtils.isEmpty(url)) {
  38 + return resultStr;
  39 + }
  40 + CloseableHttpClient httpClient = null;
  41 + CloseableHttpResponse httpResponse = null;
  42 + try {
  43 + httpClient = SSLClientCustom.getHttpClinet();
  44 + HttpPost httpPost = new HttpPost(url);
  45 + // 请求头header信息
  46 + if (MapUtils.isNotEmpty(header)) {
  47 + for (Map.Entry<String, String> stringStringEntry : header.entrySet()) {
  48 + httpPost.setHeader(stringStringEntry.getKey(), stringStringEntry.getValue());
  49 + }
  50 + }
  51 + // 请求参数信息
  52 + if (MapUtils.isNotEmpty(params)) {
  53 + List<NameValuePair> paramList = new ArrayList<NameValuePair>();
  54 + for (Map.Entry<String, String> stringStringEntry : params.entrySet()) {
  55 + paramList.add(new BasicNameValuePair(stringStringEntry.getKey(), stringStringEntry.getValue()));
  56 + }
  57 + UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(paramList, Consts.UTF_8);
  58 + httpPost.setEntity(urlEncodedFormEntity);
  59 + }
  60 + //实体设置
  61 + if (httpEntity != null) {
  62 + httpPost.setEntity(httpEntity);
  63 + }
  64 + //发起请求
  65 + httpResponse = httpClient.execute(httpPost);
  66 + if (null != httpResponse && null != httpResponse.getStatusLine()) {
  67 + int statusCode = httpResponse.getStatusLine().getStatusCode();
  68 + if (statusCode == HttpStatus.SC_OK) {
  69 + HttpEntity httpResponseEntity = httpResponse.getEntity();
  70 + resultStr = EntityUtils.toString(httpResponseEntity);
  71 + } else {
  72 + StringBuffer stringBuffer = new StringBuffer();
  73 + HeaderIterator headerIterator = httpResponse.headerIterator();
  74 + while (headerIterator.hasNext()) {
  75 + stringBuffer.append("\t" + headerIterator.next());
  76 + }
  77 + log.info("异常信息:请求地址:{},响应状态和结果:{}", url, statusCode + ";" + stringBuffer);
  78 + }
  79 + } else {
  80 + log.error("请求异常,未获取正常相应,请求地址:{}", url);
  81 + }
  82 + } catch (Exception e) {
  83 + e.printStackTrace();
  84 + } finally {
  85 + HttpClientUtils.closeConnection(httpClient, httpResponse);
  86 + }
  87 + return resultStr;
  88 + }
  89 +
  90 + public static String doGetRequest(String url, Map<String, String> header, Map<String, String> params) {
  91 + String resultStr = "";
  92 + if (StringUtils.isEmpty(url)) {
  93 + return resultStr;
  94 + }
  95 + CloseableHttpClient httpClient = null;
  96 + CloseableHttpResponse httpResponse = null;
  97 + try {
  98 + httpClient = SSLClientCustom.getHttpClinet();
  99 + //请求参数信息
  100 + if (MapUtils.isNotEmpty(params)) {
  101 + url = url + buildUrl(params);
  102 + }
  103 + HttpGet httpGet = new HttpGet(url);
  104 + RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(30000) //连接超时
  105 + .setConnectionRequestTimeout(30000) //请求超时
  106 + .setSocketTimeout(30000) //套接字连接超时
  107 + .setRedirectsEnabled(true).build(); //允许重定向
  108 + httpGet.setConfig(requestConfig);
  109 + if (MapUtils.isNotEmpty(header)) {
  110 + for (Map.Entry<String, String> stringStringEntry : header.entrySet()) {
  111 + httpGet.setHeader(stringStringEntry.getKey(), stringStringEntry.getValue());
  112 + }
  113 + }
  114 + //发起请求
  115 + httpResponse = httpClient.execute(httpGet);
  116 + int statusCode = httpResponse.getStatusLine().getStatusCode();
  117 + if (statusCode == HttpStatus.SC_OK) {
  118 + resultStr = EntityUtils.toString(httpResponse.getEntity(), Consts.UTF_8);
  119 + } else {
  120 + StringBuffer stringBuffer = new StringBuffer();
  121 + HeaderIterator headerIterator = httpResponse.headerIterator();
  122 + while (headerIterator.hasNext()) {
  123 + stringBuffer.append("\t" + headerIterator.next());
  124 + }
  125 + }
  126 +
  127 + } catch (Exception e) {
  128 + e.printStackTrace();
  129 + } finally {
  130 + HttpClientUtils.closeConnection(httpClient, httpResponse);
  131 + }
  132 + return resultStr;
  133 + }
  134 +
  135 + /**
  136 + * 关掉连接释放资源
  137 + */
  138 + private static void closeConnection(CloseableHttpClient httpClient, CloseableHttpResponse httpResponse) {
  139 + if (httpClient != null) {
  140 + try {
  141 + httpClient.close();
  142 + } catch (IOException e) {
  143 + e.printStackTrace();
  144 + }
  145 + }
  146 + if (httpResponse != null) {
  147 + try {
  148 + httpResponse.close();
  149 + } catch (IOException e) {
  150 + e.printStackTrace();
  151 + }
  152 + }
  153 +
  154 + }
  155 +
  156 + /**
  157 + * 构造get请求的参数
  158 + *
  159 + * @return
  160 + */
  161 + private static String buildUrl(Map<String, String> map) {
  162 + if (MapUtils.isEmpty(map)) {
  163 + return "";
  164 + }
  165 + StringBuffer stringBuffer = new StringBuffer("?");
  166 + for (Map.Entry<String, String> stringStringEntry : map.entrySet()) {
  167 + try {
  168 + stringBuffer.append(URLEncoder.encode(stringStringEntry.getKey(), "UTF-8")).append("=");
  169 + stringBuffer.append(URLEncoder.encode(stringStringEntry.getValue(), "UTF-8")).append("&");
  170 + } catch (UnsupportedEncodingException e) {
  171 + e.printStackTrace();
  172 + }
  173 + }
  174 + String result = stringBuffer.toString();
  175 + if (StringUtils.isNotEmpty(result)) {
  176 + result = result.substring(0, result.length() - 1); //去掉结尾的&连接符
  177 + }
  178 + return result;
  179 + }
  180 +
  181 +}
... ...
  1 +package com.qgutech.util;
  2 +
  3 +import javax.servlet.http.Cookie;
  4 +import javax.servlet.http.HttpServletRequest;
  5 +import javax.servlet.http.HttpServletResponse;
  6 +import java.util.HashSet;
  7 +import java.util.Set;
  8 +
  9 +/**
  10 + * Cookie工具类,扩展了httpOnly属性
  11 + *
  12 + * @author ChenYunfei@HF
  13 + * @since 2016/9/13
  14 + */
  15 +public class LoginCookieUtil {
  16 +
  17 + private static final int MINUTE_SECONDS = 60;
  18 +
  19 + private static Set<String> httpOnlyCookieNameSet = new HashSet<String>(){{
  20 + add("JSESSIONID");
  21 + //add("oms_eln_session_id");
  22 + //add("LOGIN_SOURCE");
  23 + }
  24 + };
  25 +
  26 + public static void addCookie(HttpServletResponse response, String name, String value,
  27 + String path, String age, String domain, boolean isSecure, boolean isHttpOnly) {
  28 + int maxAge = getAgeIntValue(age);
  29 + setHttpOnly(response,name,value,maxAge,path,domain,isSecure,isHttpOnly);
  30 + }
  31 +
  32 +
  33 + public static void setCookieHttpOnly(HttpServletResponse response, HttpServletRequest request, String name, boolean isHttpOnly) {
  34 + Cookie cookie = CookieUtil.getCookie(request, name);
  35 + if (cookie == null) {
  36 + return;
  37 + }
  38 +
  39 + setHttpOnly(response, cookie, isHttpOnly);
  40 + }
  41 +
  42 + public static void setAllCookieHttpOnly(HttpServletRequest request, HttpServletResponse response, boolean isHttpOnly) {
  43 + Cookie[] cookies = request.getCookies();
  44 + if(cookies == null){
  45 + return;
  46 + }
  47 +
  48 + String path = request.getContextPath();
  49 + for (Cookie cookie : cookies) {
  50 + if(cookie == null){
  51 + continue;
  52 + }
  53 +
  54 + if(httpOnlyCookieNameSet.contains(cookie.getName())){
  55 + setHttpOnly(response, cookie, path ,true);
  56 + }
  57 + }
  58 + }
  59 +
  60 + private static void setHttpOnly(HttpServletResponse response, Cookie cookie, boolean isHttpOnly) {
  61 + setHttpOnly(response, cookie.getName(), cookie.getValue(), cookie.getMaxAge(), cookie.getPath(), cookie.getDomain(), cookie.getSecure(), isHttpOnly);
  62 + }
  63 +
  64 + private static void setHttpOnly(HttpServletResponse response, Cookie cookie, String path, boolean isHttpOnly) {
  65 + setHttpOnly(response, cookie.getName(), cookie.getValue(), cookie.getMaxAge(), path, cookie.getDomain(), cookie.getSecure(), isHttpOnly);
  66 + }
  67 +
  68 + private static void setHttpOnly(HttpServletResponse response, String name, String value, int maxAge, String path, String domain, boolean isSecure, boolean isHttpOnly) {
  69 +
  70 + StringBuilder buffer = new StringBuilder();
  71 +
  72 + buffer.append(name).append("=").append(value).append(";");
  73 +
  74 + if (maxAge == 0) {
  75 + buffer.append("Expires=Thu Jan 01 08:00:00 CST 1970;");
  76 + } else if (maxAge > 0) {
  77 + buffer.append("Max-Age=").append(maxAge).append(";");
  78 + }
  79 +
  80 + if (domain != null) {
  81 + buffer.append("domain=").append(domain).append(";");
  82 + }
  83 +
  84 + if (path != null) {
  85 + buffer.append("path=").append(path).append(";");
  86 + }
  87 +
  88 + if (isSecure) {
  89 + buffer.append("secure;");
  90 + }
  91 +
  92 + if (isHttpOnly) {
  93 + buffer.append("HTTPOnly;");
  94 + }
  95 +
  96 + response.addHeader("Set-Cookie", buffer.toString());
  97 + }
  98 +
  99 + private static int getAgeIntValue(String age) {
  100 + try {
  101 + return Integer.valueOf(age) * MINUTE_SECONDS;
  102 + } catch (Exception e) {
  103 + return -1;
  104 + }
  105 + }
  106 +}
... ...
  1 +package com.qgutech.util;
  2 +
  3 +import lombok.extern.slf4j.Slf4j;
  4 +
  5 +import javax.imageio.ImageIO;
  6 +import java.awt.*;
  7 +import java.awt.geom.AffineTransform;
  8 +import java.awt.image.BufferedImage;
  9 +import java.io.File;
  10 +import java.io.FileOutputStream;
  11 +import java.io.IOException;
  12 +import java.io.OutputStream;
  13 +import java.security.SecureRandom;
  14 +import java.util.Arrays;
  15 +
  16 +/**
  17 + * @author xxx
  18 + * @date 2024/12/17 9:13
  19 + * @description
  20 + */
  21 +@Slf4j
  22 +public class PowerUtil {
  23 +
  24 + private PowerUtil() {
  25 + }
  26 +
  27 + public static final String VERIFY_CODES = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  28 + private static SecureRandom random = new SecureRandom();
  29 +
  30 +
  31 + /**
  32 + * 使用系统默认字符源生成验证码
  33 + *
  34 + * @param verifySize 验证码长度
  35 + * @return
  36 + */
  37 + public static String generateVerifyCode(int verifySize) {
  38 + return generateVerifyCode(verifySize, VERIFY_CODES);
  39 + }
  40 +
  41 + /**
  42 + * 使用指定源生成验证码
  43 + *
  44 + * @param verifySize 验证码长度
  45 + * @param sources 验证码字符源
  46 + * @return
  47 + */
  48 + public static String generateVerifyCode(int verifySize, String sources) {
  49 + String _sources = sources;
  50 + if (_sources == null || _sources.length() == 0) {
  51 + _sources = VERIFY_CODES;
  52 + }
  53 + int codesLen = _sources.length();
  54 + SecureRandom rand = new SecureRandom();
  55 + StringBuilder verifyCode = new StringBuilder(verifySize);
  56 + for (int i = 0; i < verifySize; i++) {
  57 + verifyCode.append(_sources.charAt(rand.nextInt(codesLen - 1)));
  58 + }
  59 + return verifyCode.toString();
  60 + }
  61 +
  62 + /**
  63 + * 生成随机验证码文件,并返回验证码值
  64 + *
  65 + * @param w
  66 + * @param h
  67 + * @param outputFile
  68 + * @param verifySize
  69 + * @return
  70 + * @throws IOException
  71 + */
  72 + public static String outputVerifyImage(int w, int h, File outputFile, int verifySize) throws IOException {
  73 + String verifyCode = generateVerifyCode(verifySize);
  74 + outputImage(w, h, outputFile, verifyCode);
  75 + return verifyCode;
  76 + }
  77 +
  78 + /**
  79 + * 输出随机验证码图片流,并返回验证码值
  80 + *
  81 + * @param w
  82 + * @param h
  83 + * @param os
  84 + * @param verifySize
  85 + * @return
  86 + * @throws IOException
  87 + */
  88 + public static String outputVerifyImage(int w, int h, OutputStream os, int verifySize) throws IOException {
  89 + String verifyCode = generateVerifyCode(verifySize);
  90 + outputImage(w, h, os, verifyCode);
  91 + return verifyCode;
  92 + }
  93 +
  94 + /**
  95 + * 生成指定验证码图像文件
  96 + *
  97 + * @param w
  98 + * @param h
  99 + * @param outputFile
  100 + * @param code
  101 + * @throws IOException
  102 + */
  103 + public static void outputImage(int w, int h, File outputFile, String code) throws IOException {
  104 + if (outputFile == null) {
  105 + return;
  106 + }
  107 + File dir = outputFile.getParentFile();
  108 + if (!dir.exists()) {
  109 + dir.mkdirs();
  110 + }
  111 + FileOutputStream fos = null;
  112 + try {
  113 + outputFile.createNewFile();
  114 + fos = new FileOutputStream(outputFile);
  115 + outputImage(w, h, fos, code);
  116 + } catch (IOException e) {
  117 + log.error("生成指定验证码图像文件", e);
  118 + } finally {
  119 + try {
  120 + fos.close();
  121 + } catch (IOException e) {
  122 + log.error("生成指定验证码图像文件", e);
  123 + }
  124 + }
  125 + }
  126 +
  127 + /**
  128 + * 输出指定验证码图片流
  129 + *
  130 + * @param w
  131 + * @param h
  132 + * @param os
  133 + * @param code
  134 + * @throws IOException
  135 + */
  136 + public static void outputImage(int w, int h, OutputStream os, String code) throws IOException {
  137 + int verifySize = code.length();
  138 + BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
  139 + SecureRandom rand = new SecureRandom();
  140 + Graphics2D g2 = image.createGraphics();
  141 + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  142 + Color[] colors = new Color[5];
  143 + Color[] colorSpaces = new Color[]{Color.WHITE, Color.CYAN,
  144 + Color.GRAY, Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE,
  145 + Color.PINK, Color.YELLOW};
  146 + float[] fractions = new float[colors.length];
  147 + for (int i = 0; i < colors.length; i++) {
  148 + colors[i] = colorSpaces[rand.nextInt(colorSpaces.length)];
  149 + fractions[i] = rand.nextFloat();
  150 + }
  151 + Arrays.sort(fractions);
  152 +
  153 + g2.setColor(Color.GRAY);// 设置边框色
  154 + g2.fillRect(0, 0, w, h);
  155 +
  156 + Color c = getRandColor(200, 250);
  157 + g2.setColor(c);// 设置背景色
  158 + g2.fillRect(0, 2, w, h - 4);
  159 +
  160 + //绘制干扰线
  161 + SecureRandom random = new SecureRandom();
  162 + g2.setColor(getRandColor(160, 200));// 设置线条的颜色
  163 + for (int i = 0; i < 20; i++) {
  164 + int x = random.nextInt(w - 1);
  165 + int y = random.nextInt(h - 1);
  166 + int xl = random.nextInt(6) + 1;
  167 + int yl = random.nextInt(12) + 1;
  168 + g2.drawLine(x, y, x + xl + 40, y + yl + 20);
  169 + }
  170 +
  171 + // 添加噪点
  172 + float yawpRate = 0.05f;// 噪声率
  173 + int area = (int) (yawpRate * w * h);
  174 + for (int i = 0; i < area; i++) {
  175 + int x = random.nextInt(w);
  176 + int y = random.nextInt(h);
  177 + int rgb = getRandomIntColor();
  178 + image.setRGB(x, y, rgb);
  179 + }
  180 +
  181 + shear(g2, w, h, c);// 使图片扭曲
  182 +
  183 + g2.setColor(getRandColor(100, 160));
  184 + int fontSize = h - 4;
  185 + Font font = new Font("Algerian", Font.ITALIC, fontSize);
  186 + g2.setFont(font);
  187 + char[] chars = code.toCharArray();
  188 + for (int i = 0; i < verifySize; i++) {
  189 + AffineTransform affine = new AffineTransform();
  190 + affine.setToRotation(Math.PI / 4 * rand.nextDouble() * (rand.nextBoolean() ? 1 : -1), (w / verifySize) * i + fontSize / 2, h / 2);
  191 + g2.setTransform(affine);
  192 + g2.drawChars(chars, i, 1, ((w - 10) / verifySize) * i + 5, h / 2 + fontSize / 2 - 10);
  193 + }
  194 +
  195 + g2.dispose();
  196 + ImageIO.write(image, "jpg", os);
  197 + }
  198 +
  199 + private static Color getRandColor(int fc, int bc) {
  200 + int _fc = fc;
  201 + int _bc = bc;
  202 + if (_fc > 255) {
  203 + _fc = 255;
  204 + }
  205 +
  206 + if (_bc > 255) {
  207 + _bc = 255;
  208 + }
  209 +
  210 + int r = _fc + random.nextInt(_bc - _fc);
  211 + int g = _fc + random.nextInt(_bc - _fc);
  212 + int b = _fc + random.nextInt(_bc - _fc);
  213 + return new Color(r, g, b);
  214 + }
  215 +
  216 + private static int getRandomIntColor() {
  217 + int[] rgb = getRandomRgb();
  218 + int color = 0;
  219 + for (int c : rgb) {
  220 + color = color << 8;
  221 + color = color | c;
  222 + }
  223 + return color;
  224 + }
  225 +
  226 + private static int[] getRandomRgb() {
  227 + int[] rgb = new int[3];
  228 + for (int i = 0; i < 3; i++) {
  229 + rgb[i] = random.nextInt(255);
  230 + }
  231 + return rgb;
  232 + }
  233 +
  234 + private static void shear(Graphics g, int w1, int h1, Color color) {
  235 + shearX(g, w1, h1, color);
  236 + shearY(g, w1, h1, color);
  237 + }
  238 +
  239 + private static void shearX(Graphics g, int w1, int h1, Color color) {
  240 + int period = random.nextInt(2);
  241 + int frames = 1;
  242 + int phase = random.nextInt(2);
  243 + for (int i = 0; i < h1; i++) {
  244 + double d = (double) (period >> 1)
  245 + * Math.sin((double) i / (double) period
  246 + + (6.2831853071795862D * (double) phase)
  247 + / (double) frames);
  248 + g.copyArea(0, i, w1, 1, (int) d, 0);
  249 + g.setColor(color);
  250 + g.drawLine((int) d, i, 0, i);
  251 + g.drawLine((int) d + w1, i, w1, i);
  252 + }
  253 +
  254 + }
  255 +
  256 + private static void shearY(Graphics g, int w1, int h1, Color color) {
  257 + int period = random.nextInt(40) + 10;
  258 + int frames = 20;
  259 + int phase = 7;
  260 + for (int i = 0; i < w1; i++) {
  261 + double d = (double) (period >> 1)
  262 + * Math.sin((double) i / (double) period
  263 + + (6.2831853071795862D * (double) phase)
  264 + / (double) frames);
  265 + g.copyArea(i, 0, 1, h1, 0, (int) d);
  266 + g.setColor(color);
  267 + g.drawLine(i, (int) d, i, 0);
  268 + g.drawLine(i, (int) d + h1, i, h1);
  269 +
  270 + }
  271 +
  272 + }
  273 +}
... ...
  1 +package com.qgutech.util;
  2 +
  3 +import org.apache.http.config.Registry;
  4 +import org.apache.http.config.RegistryBuilder;
  5 +import org.apache.http.conn.socket.ConnectionSocketFactory;
  6 +import org.apache.http.conn.socket.PlainConnectionSocketFactory;
  7 +import org.apache.http.conn.ssl.NoopHostnameVerifier;
  8 +import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
  9 +import org.apache.http.conn.ssl.TrustStrategy;
  10 +import org.apache.http.impl.client.CloseableHttpClient;
  11 +import org.apache.http.impl.client.HttpClients;
  12 +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
  13 +import org.apache.http.ssl.SSLContextBuilder;
  14 +
  15 +import java.security.KeyManagementException;
  16 +import java.security.KeyStoreException;
  17 +import java.security.NoSuchAlgorithmException;
  18 +import java.security.cert.CertificateException;
  19 +import java.security.cert.X509Certificate;
  20 +
  21 +/**
  22 + * @author cq
  23 + * @since 2024-06-11
  24 + */
  25 +public class SSLClientCustom {
  26 +
  27 + private static final String HTTP = "http";
  28 + private static final String HTTPS = "https";
  29 + private static SSLConnectionSocketFactory sslConnectionSocketFactory = null;
  30 + //连接池管理类
  31 + private static PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = null;
  32 + //管理Https连接的上下文类
  33 + private static SSLContextBuilder sslContextBuilder = null;
  34 +
  35 + static {
  36 + try {
  37 + sslContextBuilder = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
  38 + @Override
  39 + public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
  40 +// 信任所有站点 直接返回true
  41 + return true;
  42 + }
  43 + });
  44 + sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContextBuilder.build(),
  45 + new String[]{"TLSv1", "TLSv1.1", "TLSv1.2"}, null, NoopHostnameVerifier.INSTANCE);
  46 + Registry<ConnectionSocketFactory> registryBuilder = RegistryBuilder.<ConnectionSocketFactory>create()
  47 + .register(HTTP, new PlainConnectionSocketFactory())
  48 + .register(HTTPS, sslConnectionSocketFactory)
  49 + .build();
  50 + poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(registryBuilder);
  51 + poolingHttpClientConnectionManager.setMaxTotal(200);
  52 + } catch (NoSuchAlgorithmException e) {
  53 + e.printStackTrace();
  54 + } catch (KeyStoreException e) {
  55 + e.printStackTrace();
  56 + } catch (KeyManagementException e) {
  57 + e.printStackTrace();
  58 + }
  59 + }
  60 +
  61 + /**
  62 + * 获取连接
  63 + *
  64 + * @return
  65 + * @throws Exception
  66 + */
  67 + public static CloseableHttpClient getHttpClinet() throws Exception {
  68 + CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslConnectionSocketFactory)
  69 + .setConnectionManager(poolingHttpClientConnectionManager)
  70 + .setConnectionManagerShared(true)
  71 + .build();
  72 + return httpClient;
  73 + }
  74 +}
... ...
  1 +server:
  2 + port: 8031
  3 + servlet:
  4 + context-path: /power
  5 + session:
  6 + timeout: 24h
  7 +
  8 +#连接数据库的信息
  9 +spring:
  10 + datasource:
  11 + driver-class-name: com.mysql.cj.jdbc.Driver
  12 + url: jdbc:mysql://localhost:3306/power?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
  13 + username: root
  14 +# password: Hczd@2025.com
  15 + password: 123456
  16 + type: com.alibaba.druid.pool.DruidDataSource
  17 +
  18 + #Spring Boot 默认是不注入这些属性值的,需要自己绑定
  19 + #druid 数据源专有配置
  20 + initialSize: 5
  21 + minIdle: 5
  22 + maxActive: 20
  23 + maxWait: 60000
  24 + timeBetweenEvictionRunsMillis: 60000
  25 + minEvictableIdleTimeMillis: 300000
  26 + validationQuery: SELECT 1 FROM DUAL
  27 + testWhileIdle: true
  28 + testOnBorrow: false
  29 + testOnReturn: false
  30 + poolPreparedStatements: true
  31 +
  32 + #配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入
  33 + #如果允许时报错 java.lang.ClassNotFoundException: org.apache.log4j.Priority
  34 + #则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j
  35 + filters: stat,wall
  36 + maxPoolPreparedStatementPerConnectionSize: 20
  37 + useGlobalDataSourceStat: true
  38 + connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
  39 +#禁用模板引擎缓存
  40 + thymeleaf:
  41 + cache: false
  42 + servlet:
  43 + multipart: #修改文件上传的大小限制
  44 + max-request-size: 10MB #允许请求传递文件大小最大为10M
  45 + max-file-size: 10MB #允许服务器可以处理的最大文件大小
  46 + resources:
  47 + static-locations: classpath:/static/
  48 +
  49 +mybatis:
  50 + # 扫描映射文件
  51 + mapper-locations: classpath:mapper/*.xml
  52 + # 配置别名扫描的包
  53 + type-aliases-package: com.blb.entity
  54 + configuration:
  55 + # 开启驼峰映射配置
  56 + map-underscore-to-camel-case: true
  57 +
  58 +logging:
  59 + level:
  60 + root: info
  61 + file:
  62 + name: ./logs/power.log
  63 +power:
  64 + init:
  65 + password: hczd
  66 + user:
  67 + dir: D:/web
  68 + panelUrl: http://101.43.45.142:7788/device/panel
  69 + detailUrl: http://101.43.45.142:7788/device/dWSN7SMWki/status?classify=telemetry
  70 + dateUrl: http://101.43.45.142:7788/device/dWSN7SMWki/property/history
  71 + token: pscsp_magIc_ToKEn_iNTendeD_FOr_IntErnaL_Use_onLy
... ...
  1 +<?xml version="1.0" encoding="UTF-8" ?>
  2 +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3 +<mapper namespace="com.qgutech.mapper.UserMapper">
  4 + <insert id="save" keyProperty="userId">
  5 + insert into t_uc_user
  6 + (user_id, user_name, employee_code, organize_id,
  7 + organize_name, create_time, create_by, last_modify_time, last_modify_by, login_name, password, account_status,
  8 + id_card, mobile, gender, email, photo)
  9 + values (
  10 + #{user.userId},#{user.userName},#{user.employeeCode},#{user.organizeId},
  11 + #{user.organizeName},#{user.createTime},#{user.createBy},#{user.lastModifyTime},
  12 + #{user.lastModifyBy},#{user.loginName},#{user.password},#{user.accountStatus},
  13 + #{user.idCard},#{user.mobile},#{user.gender},#{user.email},#{user.photo}
  14 + )
  15 + </insert>
  16 +
  17 + <select id="getUserById" resultType="com.qgutech.model.User">
  18 + select * from t_uc_user where user_id = #{userId} limit 1
  19 + </select>
  20 +
  21 + <select id="getUserByMobile" resultType="com.qgutech.model.User">
  22 + select * from t_uc_user where mobile = #{mobile} limit 1
  23 + </select>
  24 +
  25 + <select id="getUserList" resultType="com.qgutech.model.User">
  26 + select * from t_uc_user
  27 + <if test="searchName != null and searchName != ''">
  28 + where user_name like concat('%',trim(#{searchName}),'%')
  29 + or mobile like concat('%',trim(#{searchName}),'%')
  30 + or login_name like concat('%',trim(#{searchName}),'%')
  31 + </if>
  32 + limit ${(page.pageNo-1)*page.pageSize},${page.pageSize}
  33 + </select>
  34 + <select id="getTotal" resultType="int">
  35 + select count(*) from t_uc_user
  36 + <if test="searchName != null and searchName != ''">
  37 + where user_name like concat('%',trim(#{searchName}),'%')
  38 + or mobile like concat('%',trim(#{searchName}),'%')
  39 + or login_name like concat('%',trim(#{searchName}),'%')
  40 + </if>
  41 + </select>
  42 +
  43 + <select id="findByLoginName" resultType="com.qgutech.model.User">
  44 + select * from t_uc_user where login_name = #{loginName} limit 1
  45 + </select>
  46 +
  47 + <select id="getUserExcludeLoginName" resultType="com.qgutech.model.User">
  48 + select * from t_uc_user where login_name != #{loginName} and mobile = #{mobile} limit 1
  49 + </select>
  50 +
  51 + <update id="updateUser">
  52 + update t_uc_user set
  53 + user_name = #{user.userName},
  54 + mobile = #{user.mobile},
  55 + login_name= #{user.loginName},
  56 + last_modify_time = #{user.lastModifyTime}
  57 + where user_id = #{user.userId}
  58 + </update>
  59 +
  60 + <update id="updatePassword">
  61 + update t_uc_user set
  62 + password = #{password}
  63 + where user_id = #{userId}
  64 + </update>
  65 +
  66 + <delete id="deleteUser">
  67 + delete from t_uc_user where user_id = #{userId}
  68 + </delete>
  69 +
  70 +</mapper>
... ...
  1 +drop table t_uc_user;
  2 +CREATE TABLE
  3 + t_uc_user
  4 + (
  5 + user_id varchar(32) PRIMARY KEY,
  6 + user_name varchar(50),
  7 + employee_code varchar(32),
  8 + organize_id varchar(32),
  9 + organize_name varchar(50),
  10 + create_time TIMESTAMP(6),
  11 + create_by varchar(32),
  12 + last_modify_time TIMESTAMP(6),
  13 + last_modify_by varchar(32),
  14 + login_name varchar(50),
  15 + password varchar(50),
  16 + gender varchar(20),
  17 + account_status varchar(10),
  18 + id_card varchar(20),
  19 + mobile varchar(20),
  20 + email varchar(50),
  21 + photo varchar(100)
  22 + );
  23 +-- 给字段添加注释
  24 +alter table t_uc_user comment '人员表';
  25 +alter table t_uc_user modify user_id varchar(32) comment '主键';
  26 +alter table t_uc_user modify user_name varchar(50) comment '姓名';
  27 +alter table t_uc_user modify employee_code varchar(32) comment '工号';
  28 +alter table t_uc_user modify organize_id varchar(32) comment '直属部门id';
  29 +alter table t_uc_user modify organize_name varchar(50) comment '部门名称';
  30 +alter table t_uc_user modify login_name varchar(50) comment '用户名';
  31 +alter table t_uc_user modify account_status varchar(10) comment '用户状态 ENABLE 激活、FORBIDDEN 冻结、UNAPPROVED 待审批';
  32 +alter table t_uc_user modify id_card varchar(20) comment '身份证号码';
  33 +alter table t_uc_user modify mobile varchar(20) comment '手机号码';
  34 +alter table t_uc_user modify email varchar(50) comment '邮箱';
  35 +
  36 +INSERT INTO t_uc_user (user_id, user_name, employee_code, organize_id, organize_name, create_time, create_by, last_modify_time, last_modify_by, login_name, password, account_status,
  37 +id_card, mobile,gender, email,photo) VALUES ('880eda246b3c4802be7d7d697c1fe7c7', '系统管理员', '100000', '282095e70c5547caa51a7e5664febd03', '徽辰智电', '2024-12-17 14:35:35', '880eda246b3c4802be7d7d697c1fe7c7', '2024-12-17 14:35:35', '880eda246b3c4802be7d7d697c1fe7c7', 'admin', '21232f297a57a5a743894a0e4a801fc3', 'ENABLE', '34122545784578', '13349163615','女', '','');
... ...
  1 +div {
  2 + margin-top: 30px;
  3 + margin-left: 20px;
  4 + /*color: azure;*/
  5 +}
  6 +input {
  7 + margin-left: 15px;
  8 + border-radius: 5px;
  9 + border-style: hidden;
  10 + height: 30px;
  11 + width: 140px;
  12 + background-color: rgba(230, 230, 230, 0.8);
  13 + outline: none;
  14 + /*color: #f0edf3;*/
  15 + padding-left: 10px;
  16 +}
  17 +.button {
  18 + border-color: cornsilk;
  19 + background-color: rgba(100, 149, 237, 0.8);
  20 + color: aliceblue;
  21 + border-style: hidden;
  22 + border-radius: 5px;
  23 + width: 100px;
  24 + height: 31px;
  25 + font-size: 16px;
  26 +}
... ...
  1 +* {
  2 + margin: 0;
  3 + padding: 0;
  4 +}
  5 +
  6 +html {
  7 + height: 100%;
  8 + width: 100%;
  9 + overflow: hidden;
  10 + margin: 0;
  11 + padding: 0;
  12 + background: url(../img/bg.jpg) no-repeat 0px 0px;
  13 + background-repeat: no-repeat;
  14 + background-size: 100% 100%;
  15 + -moz-background-size: 100% 100%;
  16 +}
  17 +
  18 +body {
  19 + display: flex;
  20 + align-items: center;
  21 + justify-content: center;
  22 + height: 100%;
  23 +}
  24 +
  25 +a
  26 +#loginDiv {
  27 + width: 37%;
  28 + display: flex;
  29 + justify-content: center;
  30 + align-items: center;
  31 + height: 300px;
  32 + background-color: rgba(75, 81, 95, 0.1);
  33 + box-shadow: 7px 7px 17px rgba(52, 56, 66, 0.8);
  34 + border-radius: 5px;
  35 +}
  36 +
  37 +#name_trip {
  38 + margin-left: 50px;
  39 + color: red;
  40 +}
  41 +
  42 +p {
  43 + margin-top: 30px;
  44 + margin-left: 20px;
  45 + color: azure;
  46 +}
  47 +
  48 +input {
  49 + margin-left: 15px;
  50 + border-radius: 5px;
  51 + border-style: hidden;
  52 + height: 30px;
  53 + width: 140px;
  54 + background-color: rgba(245, 245, 245, 0.8);
  55 + outline: none;
  56 + /*color: #f0edf3;*/
  57 + padding-left: 10px;
  58 +}
  59 +
  60 +a {
  61 + text-decoration: none;
  62 + margin-left: 15px;
  63 + border-radius: 5px;
  64 + border-style: hidden;
  65 + height: 30px;
  66 + width: 140px;
  67 + background-color: rgba(245, 245, 245, 0.8);
  68 + outline: none;
  69 + /*color: #f0edf3;*/
  70 +
  71 +}
  72 +
  73 +.button {
  74 + border-color: cornsilk;
  75 + background-color: rgba(100, 149, 237, 0.8);
  76 + color: aliceblue;
  77 + border-style: hidden;
  78 + border-radius: 5px;
  79 + width: 100px;
  80 + height: 31px;
  81 + font-size: 16px;
  82 +}
... ...
No preview for this file type
  1 +!function(t,e){"object"==typeof exports?module.exports=exports=e():"function"==typeof define&&define.amd?define([],e):t.CryptoJS=e()}(this,function(){var h,t,e,r,i,n,f,o,s,c,a,l,d,m,x,b,H,z,A,u,p,_,v,y,g,B,w,k,S,C,D,E,R,M,F,P,W,O,I,U,K,X,L,j,N,T,q,Z,V,G,J,$,Q,Y,tt,et,rt,it,nt,ot,st,ct,at,ht,lt,ft,dt,ut,pt,_t,vt,yt,gt,Bt,wt,kt,St,bt=bt||function(l){var t;if("undefined"!=typeof window&&window.crypto&&(t=window.crypto),!t&&"undefined"!=typeof window&&window.msCrypto&&(t=window.msCrypto),!t&&"undefined"!=typeof global&&global.crypto&&(t=global.crypto),!t&&"function"==typeof require)try{t=require("crypto")}catch(t){}function i(){if(t){if("function"==typeof t.getRandomValues)try{return t.getRandomValues(new Uint32Array(1))[0]}catch(t){}if("function"==typeof t.randomBytes)try{return t.randomBytes(4).readInt32LE()}catch(t){}}throw new Error("Native crypto module could not be used to get secure random number.")}var r=Object.create||function(t){var e;return n.prototype=t,e=new n,n.prototype=null,e};function n(){}var e={},o=e.lib={},s=o.Base={extend:function(t){var e=r(this);return t&&e.mixIn(t),e.hasOwnProperty("init")&&this.init!==e.init||(e.init=function(){e.$super.init.apply(this,arguments)}),(e.init.prototype=e).$super=this,e},create:function(){var t=this.extend();return t.init.apply(t,arguments),t},init:function(){},mixIn:function(t){for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e]);t.hasOwnProperty("toString")&&(this.toString=t.toString)},clone:function(){return this.init.prototype.extend(this)}},f=o.WordArray=s.extend({init:function(t,e){t=this.words=t||[],this.sigBytes=null!=e?e:4*t.length},toString:function(t){return(t||a).stringify(this)},concat:function(t){var e=this.words,r=t.words,i=this.sigBytes,n=t.sigBytes;if(this.clamp(),i%4)for(var o=0;o<n;o++){var s=r[o>>>2]>>>24-o%4*8&255;e[i+o>>>2]|=s<<24-(i+o)%4*8}else for(o=0;o<n;o+=4)e[i+o>>>2]=r[o>>>2];return this.sigBytes+=n,this},clamp:function(){var t=this.words,e=this.sigBytes;t[e>>>2]&=4294967295<<32-e%4*8,t.length=l.ceil(e/4)},clone:function(){var t=s.clone.call(this);return t.words=this.words.slice(0),t},random:function(t){for(var e=[],r=0;r<t;r+=4)e.push(i());return new f.init(e,t)}}),c=e.enc={},a=c.Hex={stringify:function(t){for(var e=t.words,r=t.sigBytes,i=[],n=0;n<r;n++){var o=e[n>>>2]>>>24-n%4*8&255;i.push((o>>>4).toString(16)),i.push((15&o).toString(16))}return i.join("")},parse:function(t){for(var e=t.length,r=[],i=0;i<e;i+=2)r[i>>>3]|=parseInt(t.substr(i,2),16)<<24-i%8*4;return new f.init(r,e/2)}},h=c.Latin1={stringify:function(t){for(var e=t.words,r=t.sigBytes,i=[],n=0;n<r;n++){var o=e[n>>>2]>>>24-n%4*8&255;i.push(String.fromCharCode(o))}return i.join("")},parse:function(t){for(var e=t.length,r=[],i=0;i<e;i++)r[i>>>2]|=(255&t.charCodeAt(i))<<24-i%4*8;return new f.init(r,e)}},d=c.Utf8={stringify:function(t){try{return decodeURIComponent(escape(h.stringify(t)))}catch(t){throw new Error("Malformed UTF-8 data")}},parse:function(t){return h.parse(unescape(encodeURIComponent(t)))}},u=o.BufferedBlockAlgorithm=s.extend({reset:function(){this._data=new f.init,this._nDataBytes=0},_append:function(t){"string"==typeof t&&(t=d.parse(t)),this._data.concat(t),this._nDataBytes+=t.sigBytes},_process:function(t){var e,r=this._data,i=r.words,n=r.sigBytes,o=this.blockSize,s=n/(4*o),c=(s=t?l.ceil(s):l.max((0|s)-this._minBufferSize,0))*o,a=l.min(4*c,n);if(c){for(var h=0;h<c;h+=o)this._doProcessBlock(i,h);e=i.splice(0,c),r.sigBytes-=a}return new f.init(e,a)},clone:function(){var t=s.clone.call(this);return t._data=this._data.clone(),t},_minBufferSize:0}),p=(o.Hasher=u.extend({cfg:s.extend(),init:function(t){this.cfg=this.cfg.extend(t),this.reset()},reset:function(){u.reset.call(this),this._doReset()},update:function(t){return this._append(t),this._process(),this},finalize:function(t){return t&&this._append(t),this._doFinalize()},blockSize:16,_createHelper:function(r){return function(t,e){return new r.init(e).finalize(t)}},_createHmacHelper:function(r){return function(t,e){return new p.HMAC.init(r,e).finalize(t)}}}),e.algo={});return e}(Math);function mt(t,e,r){return t^e^r}function xt(t,e,r){return t&e|~t&r}function Ht(t,e,r){return(t|~e)^r}function zt(t,e,r){return t&r|e&~r}function At(t,e,r){return t^(e|~r)}function Ct(t,e){return t<<e|t>>>32-e}function Dt(t,e,r,i){var n,o=this._iv;o?(n=o.slice(0),this._iv=void 0):n=this._prevBlock,i.encryptBlock(n,0);for(var s=0;s<r;s++)t[e+s]^=n[s]}function Et(t){if(255==(t>>24&255)){var e=t>>16&255,r=t>>8&255,i=255&t;255===e?(e=0,255===r?(r=0,255===i?i=0:++i):++r):++e,t=0,t+=e<<16,t+=r<<8,t+=i}else t+=1<<24;return t}function Rt(){for(var t=this._X,e=this._C,r=0;r<8;r++)ft[r]=e[r];e[0]=e[0]+1295307597+this._b|0,e[1]=e[1]+3545052371+(e[0]>>>0<ft[0]>>>0?1:0)|0,e[2]=e[2]+886263092+(e[1]>>>0<ft[1]>>>0?1:0)|0,e[3]=e[3]+1295307597+(e[2]>>>0<ft[2]>>>0?1:0)|0,e[4]=e[4]+3545052371+(e[3]>>>0<ft[3]>>>0?1:0)|0,e[5]=e[5]+886263092+(e[4]>>>0<ft[4]>>>0?1:0)|0,e[6]=e[6]+1295307597+(e[5]>>>0<ft[5]>>>0?1:0)|0,e[7]=e[7]+3545052371+(e[6]>>>0<ft[6]>>>0?1:0)|0,this._b=e[7]>>>0<ft[7]>>>0?1:0;for(r=0;r<8;r++){var i=t[r]+e[r],n=65535&i,o=i>>>16,s=((n*n>>>17)+n*o>>>15)+o*o,c=((4294901760&i)*i|0)+((65535&i)*i|0);dt[r]=s^c}t[0]=dt[0]+(dt[7]<<16|dt[7]>>>16)+(dt[6]<<16|dt[6]>>>16)|0,t[1]=dt[1]+(dt[0]<<8|dt[0]>>>24)+dt[7]|0,t[2]=dt[2]+(dt[1]<<16|dt[1]>>>16)+(dt[0]<<16|dt[0]>>>16)|0,t[3]=dt[3]+(dt[2]<<8|dt[2]>>>24)+dt[1]|0,t[4]=dt[4]+(dt[3]<<16|dt[3]>>>16)+(dt[2]<<16|dt[2]>>>16)|0,t[5]=dt[5]+(dt[4]<<8|dt[4]>>>24)+dt[3]|0,t[6]=dt[6]+(dt[5]<<16|dt[5]>>>16)+(dt[4]<<16|dt[4]>>>16)|0,t[7]=dt[7]+(dt[6]<<8|dt[6]>>>24)+dt[5]|0}function Mt(){for(var t=this._X,e=this._C,r=0;r<8;r++)wt[r]=e[r];e[0]=e[0]+1295307597+this._b|0,e[1]=e[1]+3545052371+(e[0]>>>0<wt[0]>>>0?1:0)|0,e[2]=e[2]+886263092+(e[1]>>>0<wt[1]>>>0?1:0)|0,e[3]=e[3]+1295307597+(e[2]>>>0<wt[2]>>>0?1:0)|0,e[4]=e[4]+3545052371+(e[3]>>>0<wt[3]>>>0?1:0)|0,e[5]=e[5]+886263092+(e[4]>>>0<wt[4]>>>0?1:0)|0,e[6]=e[6]+1295307597+(e[5]>>>0<wt[5]>>>0?1:0)|0,e[7]=e[7]+3545052371+(e[6]>>>0<wt[6]>>>0?1:0)|0,this._b=e[7]>>>0<wt[7]>>>0?1:0;for(r=0;r<8;r++){var i=t[r]+e[r],n=65535&i,o=i>>>16,s=((n*n>>>17)+n*o>>>15)+o*o,c=((4294901760&i)*i|0)+((65535&i)*i|0);kt[r]=s^c}t[0]=kt[0]+(kt[7]<<16|kt[7]>>>16)+(kt[6]<<16|kt[6]>>>16)|0,t[1]=kt[1]+(kt[0]<<8|kt[0]>>>24)+kt[7]|0,t[2]=kt[2]+(kt[1]<<16|kt[1]>>>16)+(kt[0]<<16|kt[0]>>>16)|0,t[3]=kt[3]+(kt[2]<<8|kt[2]>>>24)+kt[1]|0,t[4]=kt[4]+(kt[3]<<16|kt[3]>>>16)+(kt[2]<<16|kt[2]>>>16)|0,t[5]=kt[5]+(kt[4]<<8|kt[4]>>>24)+kt[3]|0,t[6]=kt[6]+(kt[5]<<16|kt[5]>>>16)+(kt[4]<<16|kt[4]>>>16)|0,t[7]=kt[7]+(kt[6]<<8|kt[6]>>>24)+kt[5]|0}return h=bt.lib.WordArray,bt.enc.Base64={stringify:function(t){var e=t.words,r=t.sigBytes,i=this._map;t.clamp();for(var n=[],o=0;o<r;o+=3)for(var s=(e[o>>>2]>>>24-o%4*8&255)<<16|(e[o+1>>>2]>>>24-(o+1)%4*8&255)<<8|e[o+2>>>2]>>>24-(o+2)%4*8&255,c=0;c<4&&o+.75*c<r;c++)n.push(i.charAt(s>>>6*(3-c)&63));var a=i.charAt(64);if(a)for(;n.length%4;)n.push(a);return n.join("")},parse:function(t){var e=t.length,r=this._map,i=this._reverseMap;if(!i){i=this._reverseMap=[];for(var n=0;n<r.length;n++)i[r.charCodeAt(n)]=n}var o=r.charAt(64);if(o){var s=t.indexOf(o);-1!==s&&(e=s)}return function(t,e,r){for(var i=[],n=0,o=0;o<e;o++)if(o%4){var s=r[t.charCodeAt(o-1)]<<o%4*2,c=r[t.charCodeAt(o)]>>>6-o%4*2,a=s|c;i[n>>>2]|=a<<24-n%4*8,n++}return h.create(i,n)}(t,e,i)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="},function(l){var t=bt,e=t.lib,r=e.WordArray,i=e.Hasher,n=t.algo,H=[];!function(){for(var t=0;t<64;t++)H[t]=4294967296*l.abs(l.sin(t+1))|0}();var o=n.MD5=i.extend({_doReset:function(){this._hash=new r.init([1732584193,4023233417,2562383102,271733878])},_doProcessBlock:function(t,e){for(var r=0;r<16;r++){var i=e+r,n=t[i];t[i]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8)}var o=this._hash.words,s=t[e+0],c=t[e+1],a=t[e+2],h=t[e+3],l=t[e+4],f=t[e+5],d=t[e+6],u=t[e+7],p=t[e+8],_=t[e+9],v=t[e+10],y=t[e+11],g=t[e+12],B=t[e+13],w=t[e+14],k=t[e+15],S=o[0],m=o[1],x=o[2],b=o[3];S=z(S,m,x,b,s,7,H[0]),b=z(b,S,m,x,c,12,H[1]),x=z(x,b,S,m,a,17,H[2]),m=z(m,x,b,S,h,22,H[3]),S=z(S,m,x,b,l,7,H[4]),b=z(b,S,m,x,f,12,H[5]),x=z(x,b,S,m,d,17,H[6]),m=z(m,x,b,S,u,22,H[7]),S=z(S,m,x,b,p,7,H[8]),b=z(b,S,m,x,_,12,H[9]),x=z(x,b,S,m,v,17,H[10]),m=z(m,x,b,S,y,22,H[11]),S=z(S,m,x,b,g,7,H[12]),b=z(b,S,m,x,B,12,H[13]),x=z(x,b,S,m,w,17,H[14]),S=A(S,m=z(m,x,b,S,k,22,H[15]),x,b,c,5,H[16]),b=A(b,S,m,x,d,9,H[17]),x=A(x,b,S,m,y,14,H[18]),m=A(m,x,b,S,s,20,H[19]),S=A(S,m,x,b,f,5,H[20]),b=A(b,S,m,x,v,9,H[21]),x=A(x,b,S,m,k,14,H[22]),m=A(m,x,b,S,l,20,H[23]),S=A(S,m,x,b,_,5,H[24]),b=A(b,S,m,x,w,9,H[25]),x=A(x,b,S,m,h,14,H[26]),m=A(m,x,b,S,p,20,H[27]),S=A(S,m,x,b,B,5,H[28]),b=A(b,S,m,x,a,9,H[29]),x=A(x,b,S,m,u,14,H[30]),S=C(S,m=A(m,x,b,S,g,20,H[31]),x,b,f,4,H[32]),b=C(b,S,m,x,p,11,H[33]),x=C(x,b,S,m,y,16,H[34]),m=C(m,x,b,S,w,23,H[35]),S=C(S,m,x,b,c,4,H[36]),b=C(b,S,m,x,l,11,H[37]),x=C(x,b,S,m,u,16,H[38]),m=C(m,x,b,S,v,23,H[39]),S=C(S,m,x,b,B,4,H[40]),b=C(b,S,m,x,s,11,H[41]),x=C(x,b,S,m,h,16,H[42]),m=C(m,x,b,S,d,23,H[43]),S=C(S,m,x,b,_,4,H[44]),b=C(b,S,m,x,g,11,H[45]),x=C(x,b,S,m,k,16,H[46]),S=D(S,m=C(m,x,b,S,a,23,H[47]),x,b,s,6,H[48]),b=D(b,S,m,x,u,10,H[49]),x=D(x,b,S,m,w,15,H[50]),m=D(m,x,b,S,f,21,H[51]),S=D(S,m,x,b,g,6,H[52]),b=D(b,S,m,x,h,10,H[53]),x=D(x,b,S,m,v,15,H[54]),m=D(m,x,b,S,c,21,H[55]),S=D(S,m,x,b,p,6,H[56]),b=D(b,S,m,x,k,10,H[57]),x=D(x,b,S,m,d,15,H[58]),m=D(m,x,b,S,B,21,H[59]),S=D(S,m,x,b,l,6,H[60]),b=D(b,S,m,x,y,10,H[61]),x=D(x,b,S,m,a,15,H[62]),m=D(m,x,b,S,_,21,H[63]),o[0]=o[0]+S|0,o[1]=o[1]+m|0,o[2]=o[2]+x|0,o[3]=o[3]+b|0},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;e[i>>>5]|=128<<24-i%32;var n=l.floor(r/4294967296),o=r;e[15+(64+i>>>9<<4)]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8),e[14+(64+i>>>9<<4)]=16711935&(o<<8|o>>>24)|4278255360&(o<<24|o>>>8),t.sigBytes=4*(e.length+1),this._process();for(var s=this._hash,c=s.words,a=0;a<4;a++){var h=c[a];c[a]=16711935&(h<<8|h>>>24)|4278255360&(h<<24|h>>>8)}return s},clone:function(){var t=i.clone.call(this);return t._hash=this._hash.clone(),t}});function z(t,e,r,i,n,o,s){var c=t+(e&r|~e&i)+n+s;return(c<<o|c>>>32-o)+e}function A(t,e,r,i,n,o,s){var c=t+(e&i|r&~i)+n+s;return(c<<o|c>>>32-o)+e}function C(t,e,r,i,n,o,s){var c=t+(e^r^i)+n+s;return(c<<o|c>>>32-o)+e}function D(t,e,r,i,n,o,s){var c=t+(r^(e|~i))+n+s;return(c<<o|c>>>32-o)+e}t.MD5=i._createHelper(o),t.HmacMD5=i._createHmacHelper(o)}(Math),e=(t=bt).lib,r=e.WordArray,i=e.Hasher,n=t.algo,f=[],o=n.SHA1=i.extend({_doReset:function(){this._hash=new r.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(t,e){for(var r=this._hash.words,i=r[0],n=r[1],o=r[2],s=r[3],c=r[4],a=0;a<80;a++){if(a<16)f[a]=0|t[e+a];else{var h=f[a-3]^f[a-8]^f[a-14]^f[a-16];f[a]=h<<1|h>>>31}var l=(i<<5|i>>>27)+c+f[a];l+=a<20?1518500249+(n&o|~n&s):a<40?1859775393+(n^o^s):a<60?(n&o|n&s|o&s)-1894007588:(n^o^s)-899497514,c=s,s=o,o=n<<30|n>>>2,n=i,i=l}r[0]=r[0]+i|0,r[1]=r[1]+n|0,r[2]=r[2]+o|0,r[3]=r[3]+s|0,r[4]=r[4]+c|0},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return e[i>>>5]|=128<<24-i%32,e[14+(64+i>>>9<<4)]=Math.floor(r/4294967296),e[15+(64+i>>>9<<4)]=r,t.sigBytes=4*e.length,this._process(),this._hash},clone:function(){var t=i.clone.call(this);return t._hash=this._hash.clone(),t}}),t.SHA1=i._createHelper(o),t.HmacSHA1=i._createHmacHelper(o),function(n){var t=bt,e=t.lib,r=e.WordArray,i=e.Hasher,o=t.algo,s=[],B=[];!function(){function t(t){for(var e=n.sqrt(t),r=2;r<=e;r++)if(!(t%r))return;return 1}function e(t){return 4294967296*(t-(0|t))|0}for(var r=2,i=0;i<64;)t(r)&&(i<8&&(s[i]=e(n.pow(r,.5))),B[i]=e(n.pow(r,1/3)),i++),r++}();var w=[],c=o.SHA256=i.extend({_doReset:function(){this._hash=new r.init(s.slice(0))},_doProcessBlock:function(t,e){for(var r=this._hash.words,i=r[0],n=r[1],o=r[2],s=r[3],c=r[4],a=r[5],h=r[6],l=r[7],f=0;f<64;f++){if(f<16)w[f]=0|t[e+f];else{var d=w[f-15],u=(d<<25|d>>>7)^(d<<14|d>>>18)^d>>>3,p=w[f-2],_=(p<<15|p>>>17)^(p<<13|p>>>19)^p>>>10;w[f]=u+w[f-7]+_+w[f-16]}var v=i&n^i&o^n&o,y=(i<<30|i>>>2)^(i<<19|i>>>13)^(i<<10|i>>>22),g=l+((c<<26|c>>>6)^(c<<21|c>>>11)^(c<<7|c>>>25))+(c&a^~c&h)+B[f]+w[f];l=h,h=a,a=c,c=s+g|0,s=o,o=n,n=i,i=g+(y+v)|0}r[0]=r[0]+i|0,r[1]=r[1]+n|0,r[2]=r[2]+o|0,r[3]=r[3]+s|0,r[4]=r[4]+c|0,r[5]=r[5]+a|0,r[6]=r[6]+h|0,r[7]=r[7]+l|0},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return e[i>>>5]|=128<<24-i%32,e[14+(64+i>>>9<<4)]=n.floor(r/4294967296),e[15+(64+i>>>9<<4)]=r,t.sigBytes=4*e.length,this._process(),this._hash},clone:function(){var t=i.clone.call(this);return t._hash=this._hash.clone(),t}});t.SHA256=i._createHelper(c),t.HmacSHA256=i._createHmacHelper(c)}(Math),function(){var n=bt.lib.WordArray,t=bt.enc;t.Utf16=t.Utf16BE={stringify:function(t){for(var e=t.words,r=t.sigBytes,i=[],n=0;n<r;n+=2){var o=e[n>>>2]>>>16-n%4*8&65535;i.push(String.fromCharCode(o))}return i.join("")},parse:function(t){for(var e=t.length,r=[],i=0;i<e;i++)r[i>>>1]|=t.charCodeAt(i)<<16-i%2*16;return n.create(r,2*e)}};function s(t){return t<<8&4278255360|t>>>8&16711935}t.Utf16LE={stringify:function(t){for(var e=t.words,r=t.sigBytes,i=[],n=0;n<r;n+=2){var o=s(e[n>>>2]>>>16-n%4*8&65535);i.push(String.fromCharCode(o))}return i.join("")},parse:function(t){for(var e=t.length,r=[],i=0;i<e;i++)r[i>>>1]|=s(t.charCodeAt(i)<<16-i%2*16);return n.create(r,2*e)}}}(),function(){if("function"==typeof ArrayBuffer){var t=bt.lib.WordArray,n=t.init;(t.init=function(t){if(t instanceof ArrayBuffer&&(t=new Uint8Array(t)),(t instanceof Int8Array||"undefined"!=typeof Uint8ClampedArray&&t instanceof Uint8ClampedArray||t instanceof Int16Array||t instanceof Uint16Array||t instanceof Int32Array||t instanceof Uint32Array||t instanceof Float32Array||t instanceof Float64Array)&&(t=new Uint8Array(t.buffer,t.byteOffset,t.byteLength)),t instanceof Uint8Array){for(var e=t.byteLength,r=[],i=0;i<e;i++)r[i>>>2]|=t[i]<<24-i%4*8;n.call(this,r,e)}else n.apply(this,arguments)}).prototype=t}}(),Math,c=(s=bt).lib,a=c.WordArray,l=c.Hasher,d=s.algo,m=a.create([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13]),x=a.create([5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11]),b=a.create([11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6]),H=a.create([8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]),z=a.create([0,1518500249,1859775393,2400959708,2840853838]),A=a.create([1352829926,1548603684,1836072691,2053994217,0]),u=d.RIPEMD160=l.extend({_doReset:function(){this._hash=a.create([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(t,e){for(var r=0;r<16;r++){var i=e+r,n=t[i];t[i]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8)}var o,s,c,a,h,l,f,d,u,p,_,v=this._hash.words,y=z.words,g=A.words,B=m.words,w=x.words,k=b.words,S=H.words;l=o=v[0],f=s=v[1],d=c=v[2],u=a=v[3],p=h=v[4];for(r=0;r<80;r+=1)_=o+t[e+B[r]]|0,_+=r<16?mt(s,c,a)+y[0]:r<32?xt(s,c,a)+y[1]:r<48?Ht(s,c,a)+y[2]:r<64?zt(s,c,a)+y[3]:At(s,c,a)+y[4],_=(_=Ct(_|=0,k[r]))+h|0,o=h,h=a,a=Ct(c,10),c=s,s=_,_=l+t[e+w[r]]|0,_+=r<16?At(f,d,u)+g[0]:r<32?zt(f,d,u)+g[1]:r<48?Ht(f,d,u)+g[2]:r<64?xt(f,d,u)+g[3]:mt(f,d,u)+g[4],_=(_=Ct(_|=0,S[r]))+p|0,l=p,p=u,u=Ct(d,10),d=f,f=_;_=v[1]+c+u|0,v[1]=v[2]+a+p|0,v[2]=v[3]+h+l|0,v[3]=v[4]+o+f|0,v[4]=v[0]+s+d|0,v[0]=_},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;e[i>>>5]|=128<<24-i%32,e[14+(64+i>>>9<<4)]=16711935&(r<<8|r>>>24)|4278255360&(r<<24|r>>>8),t.sigBytes=4*(e.length+1),this._process();for(var n=this._hash,o=n.words,s=0;s<5;s++){var c=o[s];o[s]=16711935&(c<<8|c>>>24)|4278255360&(c<<24|c>>>8)}return n},clone:function(){var t=l.clone.call(this);return t._hash=this._hash.clone(),t}}),s.RIPEMD160=l._createHelper(u),s.HmacRIPEMD160=l._createHmacHelper(u),p=bt.lib.Base,_=bt.enc.Utf8,bt.algo.HMAC=p.extend({init:function(t,e){t=this._hasher=new t.init,"string"==typeof e&&(e=_.parse(e));var r=t.blockSize,i=4*r;e.sigBytes>i&&(e=t.finalize(e)),e.clamp();for(var n=this._oKey=e.clone(),o=this._iKey=e.clone(),s=n.words,c=o.words,a=0;a<r;a++)s[a]^=1549556828,c[a]^=909522486;n.sigBytes=o.sigBytes=i,this.reset()},reset:function(){var t=this._hasher;t.reset(),t.update(this._iKey)},update:function(t){return this._hasher.update(t),this},finalize:function(t){var e=this._hasher,r=e.finalize(t);return e.reset(),e.finalize(this._oKey.clone().concat(r))}}),y=(v=bt).lib,g=y.Base,B=y.WordArray,w=v.algo,k=w.SHA1,S=w.HMAC,C=w.PBKDF2=g.extend({cfg:g.extend({keySize:4,hasher:k,iterations:1}),init:function(t){this.cfg=this.cfg.extend(t)},compute:function(t,e){for(var r=this.cfg,i=S.create(r.hasher,t),n=B.create(),o=B.create([1]),s=n.words,c=o.words,a=r.keySize,h=r.iterations;s.length<a;){var l=i.update(e).finalize(o);i.reset();for(var f=l.words,d=f.length,u=l,p=1;p<h;p++){u=i.finalize(u),i.reset();for(var _=u.words,v=0;v<d;v++)f[v]^=_[v]}n.concat(l),c[0]++}return n.sigBytes=4*a,n}}),v.PBKDF2=function(t,e,r){return C.create(r).compute(t,e)},E=(D=bt).lib,R=E.Base,M=E.WordArray,F=D.algo,P=F.MD5,W=F.EvpKDF=R.extend({cfg:R.extend({keySize:4,hasher:P,iterations:1}),init:function(t){this.cfg=this.cfg.extend(t)},compute:function(t,e){for(var r,i=this.cfg,n=i.hasher.create(),o=M.create(),s=o.words,c=i.keySize,a=i.iterations;s.length<c;){r&&n.update(r),r=n.update(t).finalize(e),n.reset();for(var h=1;h<a;h++)r=n.finalize(r),n.reset();o.concat(r)}return o.sigBytes=4*c,o}}),D.EvpKDF=function(t,e,r){return W.create(r).compute(t,e)},I=(O=bt).lib.WordArray,U=O.algo,K=U.SHA256,X=U.SHA224=K.extend({_doReset:function(){this._hash=new I.init([3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428])},_doFinalize:function(){var t=K._doFinalize.call(this);return t.sigBytes-=4,t}}),O.SHA224=K._createHelper(X),O.HmacSHA224=K._createHmacHelper(X),L=bt.lib,j=L.Base,N=L.WordArray,(T=bt.x64={}).Word=j.extend({init:function(t,e){this.high=t,this.low=e}}),T.WordArray=j.extend({init:function(t,e){t=this.words=t||[],this.sigBytes=null!=e?e:8*t.length},toX32:function(){for(var t=this.words,e=t.length,r=[],i=0;i<e;i++){var n=t[i];r.push(n.high),r.push(n.low)}return N.create(r,this.sigBytes)},clone:function(){for(var t=j.clone.call(this),e=t.words=this.words.slice(0),r=e.length,i=0;i<r;i++)e[i]=e[i].clone();return t}}),function(d){var t=bt,e=t.lib,u=e.WordArray,i=e.Hasher,l=t.x64.Word,r=t.algo,C=[],D=[],E=[];!function(){for(var t=1,e=0,r=0;r<24;r++){C[t+5*e]=(r+1)*(r+2)/2%64;var i=(2*t+3*e)%5;t=e%5,e=i}for(t=0;t<5;t++)for(e=0;e<5;e++)D[t+5*e]=e+(2*t+3*e)%5*5;for(var n=1,o=0;o<24;o++){for(var s=0,c=0,a=0;a<7;a++){if(1&n){var h=(1<<a)-1;h<32?c^=1<<h:s^=1<<h-32}128&n?n=n<<1^113:n<<=1}E[o]=l.create(s,c)}}();var R=[];!function(){for(var t=0;t<25;t++)R[t]=l.create()}();var n=r.SHA3=i.extend({cfg:i.cfg.extend({outputLength:512}),_doReset:function(){for(var t=this._state=[],e=0;e<25;e++)t[e]=new l.init;this.blockSize=(1600-2*this.cfg.outputLength)/32},_doProcessBlock:function(t,e){for(var r=this._state,i=this.blockSize/2,n=0;n<i;n++){var o=t[e+2*n],s=t[e+2*n+1];o=16711935&(o<<8|o>>>24)|4278255360&(o<<24|o>>>8),s=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),(x=r[n]).high^=s,x.low^=o}for(var c=0;c<24;c++){for(var a=0;a<5;a++){for(var h=0,l=0,f=0;f<5;f++){h^=(x=r[a+5*f]).high,l^=x.low}var d=R[a];d.high=h,d.low=l}for(a=0;a<5;a++){var u=R[(a+4)%5],p=R[(a+1)%5],_=p.high,v=p.low;for(h=u.high^(_<<1|v>>>31),l=u.low^(v<<1|_>>>31),f=0;f<5;f++){(x=r[a+5*f]).high^=h,x.low^=l}}for(var y=1;y<25;y++){var g=(x=r[y]).high,B=x.low,w=C[y];l=w<32?(h=g<<w|B>>>32-w,B<<w|g>>>32-w):(h=B<<w-32|g>>>64-w,g<<w-32|B>>>64-w);var k=R[D[y]];k.high=h,k.low=l}var S=R[0],m=r[0];S.high=m.high,S.low=m.low;for(a=0;a<5;a++)for(f=0;f<5;f++){var x=r[y=a+5*f],b=R[y],H=R[(a+1)%5+5*f],z=R[(a+2)%5+5*f];x.high=b.high^~H.high&z.high,x.low=b.low^~H.low&z.low}x=r[0];var A=E[c];x.high^=A.high,x.low^=A.low}},_doFinalize:function(){var t=this._data,e=t.words,r=(this._nDataBytes,8*t.sigBytes),i=32*this.blockSize;e[r>>>5]|=1<<24-r%32,e[(d.ceil((1+r)/i)*i>>>5)-1]|=128,t.sigBytes=4*e.length,this._process();for(var n=this._state,o=this.cfg.outputLength/8,s=o/8,c=[],a=0;a<s;a++){var h=n[a],l=h.high,f=h.low;l=16711935&(l<<8|l>>>24)|4278255360&(l<<24|l>>>8),f=16711935&(f<<8|f>>>24)|4278255360&(f<<24|f>>>8),c.push(f),c.push(l)}return new u.init(c,o)},clone:function(){for(var t=i.clone.call(this),e=t._state=this._state.slice(0),r=0;r<25;r++)e[r]=e[r].clone();return t}});t.SHA3=i._createHelper(n),t.HmacSHA3=i._createHmacHelper(n)}(Math),function(){var t=bt,e=t.lib.Hasher,r=t.x64,i=r.Word,n=r.WordArray,o=t.algo;function s(){return i.create.apply(i,arguments)}var mt=[s(1116352408,3609767458),s(1899447441,602891725),s(3049323471,3964484399),s(3921009573,2173295548),s(961987163,4081628472),s(1508970993,3053834265),s(2453635748,2937671579),s(2870763221,3664609560),s(3624381080,2734883394),s(310598401,1164996542),s(607225278,1323610764),s(1426881987,3590304994),s(1925078388,4068182383),s(2162078206,991336113),s(2614888103,633803317),s(3248222580,3479774868),s(3835390401,2666613458),s(4022224774,944711139),s(264347078,2341262773),s(604807628,2007800933),s(770255983,1495990901),s(1249150122,1856431235),s(1555081692,3175218132),s(1996064986,2198950837),s(2554220882,3999719339),s(2821834349,766784016),s(2952996808,2566594879),s(3210313671,3203337956),s(3336571891,1034457026),s(3584528711,2466948901),s(113926993,3758326383),s(338241895,168717936),s(666307205,1188179964),s(773529912,1546045734),s(1294757372,1522805485),s(1396182291,2643833823),s(1695183700,2343527390),s(1986661051,1014477480),s(2177026350,1206759142),s(2456956037,344077627),s(2730485921,1290863460),s(2820302411,3158454273),s(3259730800,3505952657),s(3345764771,106217008),s(3516065817,3606008344),s(3600352804,1432725776),s(4094571909,1467031594),s(275423344,851169720),s(430227734,3100823752),s(506948616,1363258195),s(659060556,3750685593),s(883997877,3785050280),s(958139571,3318307427),s(1322822218,3812723403),s(1537002063,2003034995),s(1747873779,3602036899),s(1955562222,1575990012),s(2024104815,1125592928),s(2227730452,2716904306),s(2361852424,442776044),s(2428436474,593698344),s(2756734187,3733110249),s(3204031479,2999351573),s(3329325298,3815920427),s(3391569614,3928383900),s(3515267271,566280711),s(3940187606,3454069534),s(4118630271,4000239992),s(116418474,1914138554),s(174292421,2731055270),s(289380356,3203993006),s(460393269,320620315),s(685471733,587496836),s(852142971,1086792851),s(1017036298,365543100),s(1126000580,2618297676),s(1288033470,3409855158),s(1501505948,4234509866),s(1607167915,987167468),s(1816402316,1246189591)],xt=[];!function(){for(var t=0;t<80;t++)xt[t]=s()}();var c=o.SHA512=e.extend({_doReset:function(){this._hash=new n.init([new i.init(1779033703,4089235720),new i.init(3144134277,2227873595),new i.init(1013904242,4271175723),new i.init(2773480762,1595750129),new i.init(1359893119,2917565137),new i.init(2600822924,725511199),new i.init(528734635,4215389547),new i.init(1541459225,327033209)])},_doProcessBlock:function(t,e){for(var r=this._hash.words,i=r[0],n=r[1],o=r[2],s=r[3],c=r[4],a=r[5],h=r[6],l=r[7],f=i.high,d=i.low,u=n.high,p=n.low,_=o.high,v=o.low,y=s.high,g=s.low,B=c.high,w=c.low,k=a.high,S=a.low,m=h.high,x=h.low,b=l.high,H=l.low,z=f,A=d,C=u,D=p,E=_,R=v,M=y,F=g,P=B,W=w,O=k,I=S,U=m,K=x,X=b,L=H,j=0;j<80;j++){var N,T,q=xt[j];if(j<16)T=q.high=0|t[e+2*j],N=q.low=0|t[e+2*j+1];else{var Z=xt[j-15],V=Z.high,G=Z.low,J=(V>>>1|G<<31)^(V>>>8|G<<24)^V>>>7,$=(G>>>1|V<<31)^(G>>>8|V<<24)^(G>>>7|V<<25),Q=xt[j-2],Y=Q.high,tt=Q.low,et=(Y>>>19|tt<<13)^(Y<<3|tt>>>29)^Y>>>6,rt=(tt>>>19|Y<<13)^(tt<<3|Y>>>29)^(tt>>>6|Y<<26),it=xt[j-7],nt=it.high,ot=it.low,st=xt[j-16],ct=st.high,at=st.low;T=(T=(T=J+nt+((N=$+ot)>>>0<$>>>0?1:0))+et+((N+=rt)>>>0<rt>>>0?1:0))+ct+((N+=at)>>>0<at>>>0?1:0),q.high=T,q.low=N}var ht,lt=P&O^~P&U,ft=W&I^~W&K,dt=z&C^z&E^C&E,ut=A&D^A&R^D&R,pt=(z>>>28|A<<4)^(z<<30|A>>>2)^(z<<25|A>>>7),_t=(A>>>28|z<<4)^(A<<30|z>>>2)^(A<<25|z>>>7),vt=(P>>>14|W<<18)^(P>>>18|W<<14)^(P<<23|W>>>9),yt=(W>>>14|P<<18)^(W>>>18|P<<14)^(W<<23|P>>>9),gt=mt[j],Bt=gt.high,wt=gt.low,kt=X+vt+((ht=L+yt)>>>0<L>>>0?1:0),St=_t+ut;X=U,L=K,U=O,K=I,O=P,I=W,P=M+(kt=(kt=(kt=kt+lt+((ht=ht+ft)>>>0<ft>>>0?1:0))+Bt+((ht=ht+wt)>>>0<wt>>>0?1:0))+T+((ht=ht+N)>>>0<N>>>0?1:0))+((W=F+ht|0)>>>0<F>>>0?1:0)|0,M=E,F=R,E=C,R=D,C=z,D=A,z=kt+(pt+dt+(St>>>0<_t>>>0?1:0))+((A=ht+St|0)>>>0<ht>>>0?1:0)|0}d=i.low=d+A,i.high=f+z+(d>>>0<A>>>0?1:0),p=n.low=p+D,n.high=u+C+(p>>>0<D>>>0?1:0),v=o.low=v+R,o.high=_+E+(v>>>0<R>>>0?1:0),g=s.low=g+F,s.high=y+M+(g>>>0<F>>>0?1:0),w=c.low=w+W,c.high=B+P+(w>>>0<W>>>0?1:0),S=a.low=S+I,a.high=k+O+(S>>>0<I>>>0?1:0),x=h.low=x+K,h.high=m+U+(x>>>0<K>>>0?1:0),H=l.low=H+L,l.high=b+X+(H>>>0<L>>>0?1:0)},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return e[i>>>5]|=128<<24-i%32,e[30+(128+i>>>10<<5)]=Math.floor(r/4294967296),e[31+(128+i>>>10<<5)]=r,t.sigBytes=4*e.length,this._process(),this._hash.toX32()},clone:function(){var t=e.clone.call(this);return t._hash=this._hash.clone(),t},blockSize:32});t.SHA512=e._createHelper(c),t.HmacSHA512=e._createHmacHelper(c)}(),Z=(q=bt).x64,V=Z.Word,G=Z.WordArray,J=q.algo,$=J.SHA512,Q=J.SHA384=$.extend({_doReset:function(){this._hash=new G.init([new V.init(3418070365,3238371032),new V.init(1654270250,914150663),new V.init(2438529370,812702999),new V.init(355462360,4144912697),new V.init(1731405415,4290775857),new V.init(2394180231,1750603025),new V.init(3675008525,1694076839),new V.init(1203062813,3204075428)])},_doFinalize:function(){var t=$._doFinalize.call(this);return t.sigBytes-=16,t}}),q.SHA384=$._createHelper(Q),q.HmacSHA384=$._createHmacHelper(Q),bt.lib.Cipher||function(){var t=bt,e=t.lib,r=e.Base,a=e.WordArray,i=e.BufferedBlockAlgorithm,n=t.enc,o=(n.Utf8,n.Base64),s=t.algo.EvpKDF,c=e.Cipher=i.extend({cfg:r.extend(),createEncryptor:function(t,e){return this.create(this._ENC_XFORM_MODE,t,e)},createDecryptor:function(t,e){return this.create(this._DEC_XFORM_MODE,t,e)},init:function(t,e,r){this.cfg=this.cfg.extend(r),this._xformMode=t,this._key=e,this.reset()},reset:function(){i.reset.call(this),this._doReset()},process:function(t){return this._append(t),this._process()},finalize:function(t){return t&&this._append(t),this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(i){return{encrypt:function(t,e,r){return h(e).encrypt(i,t,e,r)},decrypt:function(t,e,r){return h(e).decrypt(i,t,e,r)}}}});function h(t){return"string"==typeof t?w:g}e.StreamCipher=c.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var l,f=t.mode={},d=e.BlockCipherMode=r.extend({createEncryptor:function(t,e){return this.Encryptor.create(t,e)},createDecryptor:function(t,e){return this.Decryptor.create(t,e)},init:function(t,e){this._cipher=t,this._iv=e}}),u=f.CBC=((l=d.extend()).Encryptor=l.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize;p.call(this,t,e,i),r.encryptBlock(t,e),this._prevBlock=t.slice(e,e+i)}}),l.Decryptor=l.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize,n=t.slice(e,e+i);r.decryptBlock(t,e),p.call(this,t,e,i),this._prevBlock=n}}),l);function p(t,e,r){var i,n=this._iv;n?(i=n,this._iv=void 0):i=this._prevBlock;for(var o=0;o<r;o++)t[e+o]^=i[o]}var _=(t.pad={}).Pkcs7={pad:function(t,e){for(var r=4*e,i=r-t.sigBytes%r,n=i<<24|i<<16|i<<8|i,o=[],s=0;s<i;s+=4)o.push(n);var c=a.create(o,i);t.concat(c)},unpad:function(t){var e=255&t.words[t.sigBytes-1>>>2];t.sigBytes-=e}},v=(e.BlockCipher=c.extend({cfg:c.cfg.extend({mode:u,padding:_}),reset:function(){var t;c.reset.call(this);var e=this.cfg,r=e.iv,i=e.mode;this._xformMode==this._ENC_XFORM_MODE?t=i.createEncryptor:(t=i.createDecryptor,this._minBufferSize=1),this._mode&&this._mode.__creator==t?this._mode.init(this,r&&r.words):(this._mode=t.call(i,this,r&&r.words),this._mode.__creator=t)},_doProcessBlock:function(t,e){this._mode.processBlock(t,e)},_doFinalize:function(){var t,e=this.cfg.padding;return this._xformMode==this._ENC_XFORM_MODE?(e.pad(this._data,this.blockSize),t=this._process(!0)):(t=this._process(!0),e.unpad(t)),t},blockSize:4}),e.CipherParams=r.extend({init:function(t){this.mixIn(t)},toString:function(t){return(t||this.formatter).stringify(this)}})),y=(t.format={}).OpenSSL={stringify:function(t){var e=t.ciphertext,r=t.salt;return(r?a.create([1398893684,1701076831]).concat(r).concat(e):e).toString(o)},parse:function(t){var e,r=o.parse(t),i=r.words;return 1398893684==i[0]&&1701076831==i[1]&&(e=a.create(i.slice(2,4)),i.splice(0,4),r.sigBytes-=16),v.create({ciphertext:r,salt:e})}},g=e.SerializableCipher=r.extend({cfg:r.extend({format:y}),encrypt:function(t,e,r,i){i=this.cfg.extend(i);var n=t.createEncryptor(r,i),o=n.finalize(e),s=n.cfg;return v.create({ciphertext:o,key:r,iv:s.iv,algorithm:t,mode:s.mode,padding:s.padding,blockSize:t.blockSize,formatter:i.format})},decrypt:function(t,e,r,i){return i=this.cfg.extend(i),e=this._parse(e,i.format),t.createDecryptor(r,i).finalize(e.ciphertext)},_parse:function(t,e){return"string"==typeof t?e.parse(t,this):t}}),B=(t.kdf={}).OpenSSL={execute:function(t,e,r,i){i=i||a.random(8);var n=s.create({keySize:e+r}).compute(t,i),o=a.create(n.words.slice(e),4*r);return n.sigBytes=4*e,v.create({key:n,iv:o,salt:i})}},w=e.PasswordBasedCipher=g.extend({cfg:g.cfg.extend({kdf:B}),encrypt:function(t,e,r,i){var n=(i=this.cfg.extend(i)).kdf.execute(r,t.keySize,t.ivSize);i.iv=n.iv;var o=g.encrypt.call(this,t,e,n.key,i);return o.mixIn(n),o},decrypt:function(t,e,r,i){i=this.cfg.extend(i),e=this._parse(e,i.format);var n=i.kdf.execute(r,t.keySize,t.ivSize,e.salt);return i.iv=n.iv,g.decrypt.call(this,t,e,n.key,i)}})}(),bt.mode.CFB=((Y=bt.lib.BlockCipherMode.extend()).Encryptor=Y.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize;Dt.call(this,t,e,i,r),this._prevBlock=t.slice(e,e+i)}}),Y.Decryptor=Y.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize,n=t.slice(e,e+i);Dt.call(this,t,e,i,r),this._prevBlock=n}}),Y),bt.mode.ECB=((tt=bt.lib.BlockCipherMode.extend()).Encryptor=tt.extend({processBlock:function(t,e){this._cipher.encryptBlock(t,e)}}),tt.Decryptor=tt.extend({processBlock:function(t,e){this._cipher.decryptBlock(t,e)}}),tt),bt.pad.AnsiX923={pad:function(t,e){var r=t.sigBytes,i=4*e,n=i-r%i,o=r+n-1;t.clamp(),t.words[o>>>2]|=n<<24-o%4*8,t.sigBytes+=n},unpad:function(t){var e=255&t.words[t.sigBytes-1>>>2];t.sigBytes-=e}},bt.pad.Iso10126={pad:function(t,e){var r=4*e,i=r-t.sigBytes%r;t.concat(bt.lib.WordArray.random(i-1)).concat(bt.lib.WordArray.create([i<<24],1))},unpad:function(t){var e=255&t.words[t.sigBytes-1>>>2];t.sigBytes-=e}},bt.pad.Iso97971={pad:function(t,e){t.concat(bt.lib.WordArray.create([2147483648],1)),bt.pad.ZeroPadding.pad(t,e)},unpad:function(t){bt.pad.ZeroPadding.unpad(t),t.sigBytes--}},bt.mode.OFB=(et=bt.lib.BlockCipherMode.extend(),rt=et.Encryptor=et.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize,n=this._iv,o=this._keystream;n&&(o=this._keystream=n.slice(0),this._iv=void 0),r.encryptBlock(o,0);for(var s=0;s<i;s++)t[e+s]^=o[s]}}),et.Decryptor=rt,et),bt.pad.NoPadding={pad:function(){},unpad:function(){}},it=bt.lib.CipherParams,nt=bt.enc.Hex,bt.format.Hex={stringify:function(t){return t.ciphertext.toString(nt)},parse:function(t){var e=nt.parse(t);return it.create({ciphertext:e})}},function(){var t=bt,e=t.lib.BlockCipher,r=t.algo,h=[],l=[],f=[],d=[],u=[],p=[],_=[],v=[],y=[],g=[];!function(){for(var t=[],e=0;e<256;e++)t[e]=e<128?e<<1:e<<1^283;var r=0,i=0;for(e=0;e<256;e++){var n=i^i<<1^i<<2^i<<3^i<<4;n=n>>>8^255&n^99,h[r]=n;var o=t[l[n]=r],s=t[o],c=t[s],a=257*t[n]^16843008*n;f[r]=a<<24|a>>>8,d[r]=a<<16|a>>>16,u[r]=a<<8|a>>>24,p[r]=a;a=16843009*c^65537*s^257*o^16843008*r;_[n]=a<<24|a>>>8,v[n]=a<<16|a>>>16,y[n]=a<<8|a>>>24,g[n]=a,r?(r=o^t[t[t[c^o]]],i^=t[t[i]]):r=i=1}}();var B=[0,1,2,4,8,16,32,64,128,27,54],i=r.AES=e.extend({_doReset:function(){if(!this._nRounds||this._keyPriorReset!==this._key){for(var t=this._keyPriorReset=this._key,e=t.words,r=t.sigBytes/4,i=4*(1+(this._nRounds=6+r)),n=this._keySchedule=[],o=0;o<i;o++)o<r?n[o]=e[o]:(a=n[o-1],o%r?6<r&&o%r==4&&(a=h[a>>>24]<<24|h[a>>>16&255]<<16|h[a>>>8&255]<<8|h[255&a]):(a=h[(a=a<<8|a>>>24)>>>24]<<24|h[a>>>16&255]<<16|h[a>>>8&255]<<8|h[255&a],a^=B[o/r|0]<<24),n[o]=n[o-r]^a);for(var s=this._invKeySchedule=[],c=0;c<i;c++){o=i-c;if(c%4)var a=n[o];else a=n[o-4];s[c]=c<4||o<=4?a:_[h[a>>>24]]^v[h[a>>>16&255]]^y[h[a>>>8&255]]^g[h[255&a]]}}},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._keySchedule,f,d,u,p,h)},decryptBlock:function(t,e){var r=t[e+1];t[e+1]=t[e+3],t[e+3]=r,this._doCryptBlock(t,e,this._invKeySchedule,_,v,y,g,l);r=t[e+1];t[e+1]=t[e+3],t[e+3]=r},_doCryptBlock:function(t,e,r,i,n,o,s,c){for(var a=this._nRounds,h=t[e]^r[0],l=t[e+1]^r[1],f=t[e+2]^r[2],d=t[e+3]^r[3],u=4,p=1;p<a;p++){var _=i[h>>>24]^n[l>>>16&255]^o[f>>>8&255]^s[255&d]^r[u++],v=i[l>>>24]^n[f>>>16&255]^o[d>>>8&255]^s[255&h]^r[u++],y=i[f>>>24]^n[d>>>16&255]^o[h>>>8&255]^s[255&l]^r[u++],g=i[d>>>24]^n[h>>>16&255]^o[l>>>8&255]^s[255&f]^r[u++];h=_,l=v,f=y,d=g}_=(c[h>>>24]<<24|c[l>>>16&255]<<16|c[f>>>8&255]<<8|c[255&d])^r[u++],v=(c[l>>>24]<<24|c[f>>>16&255]<<16|c[d>>>8&255]<<8|c[255&h])^r[u++],y=(c[f>>>24]<<24|c[d>>>16&255]<<16|c[h>>>8&255]<<8|c[255&l])^r[u++],g=(c[d>>>24]<<24|c[h>>>16&255]<<16|c[l>>>8&255]<<8|c[255&f])^r[u++];t[e]=_,t[e+1]=v,t[e+2]=y,t[e+3]=g},keySize:8});t.AES=e._createHelper(i)}(),function(){var t=bt,e=t.lib,n=e.WordArray,r=e.BlockCipher,i=t.algo,h=[57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4],l=[14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,47,55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32],f=[1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28],d=[{0:8421888,268435456:32768,536870912:8421378,805306368:2,1073741824:512,1342177280:8421890,1610612736:8389122,1879048192:8388608,2147483648:514,2415919104:8389120,2684354560:33280,2952790016:8421376,3221225472:32770,3489660928:8388610,3758096384:0,4026531840:33282,134217728:0,402653184:8421890,671088640:33282,939524096:32768,1207959552:8421888,1476395008:512,1744830464:8421378,2013265920:2,2281701376:8389120,2550136832:33280,2818572288:8421376,3087007744:8389122,3355443200:8388610,3623878656:32770,3892314112:514,4160749568:8388608,1:32768,268435457:2,536870913:8421888,805306369:8388608,1073741825:8421378,1342177281:33280,1610612737:512,1879048193:8389122,2147483649:8421890,2415919105:8421376,2684354561:8388610,2952790017:33282,3221225473:514,3489660929:8389120,3758096385:32770,4026531841:0,134217729:8421890,402653185:8421376,671088641:8388608,939524097:512,1207959553:32768,1476395009:8388610,1744830465:2,2013265921:33282,2281701377:32770,2550136833:8389122,2818572289:514,3087007745:8421888,3355443201:8389120,3623878657:0,3892314113:33280,4160749569:8421378},{0:1074282512,16777216:16384,33554432:524288,50331648:1074266128,67108864:1073741840,83886080:1074282496,100663296:1073758208,117440512:16,134217728:540672,150994944:1073758224,167772160:1073741824,184549376:540688,201326592:524304,218103808:0,234881024:16400,251658240:1074266112,8388608:1073758208,25165824:540688,41943040:16,58720256:1073758224,75497472:1074282512,92274688:1073741824,109051904:524288,125829120:1074266128,142606336:524304,159383552:0,176160768:16384,192937984:1074266112,209715200:1073741840,226492416:540672,243269632:1074282496,260046848:16400,268435456:0,285212672:1074266128,301989888:1073758224,318767104:1074282496,335544320:1074266112,352321536:16,369098752:540688,385875968:16384,402653184:16400,419430400:524288,436207616:524304,452984832:1073741840,469762048:540672,486539264:1073758208,503316480:1073741824,520093696:1074282512,276824064:540688,293601280:524288,310378496:1074266112,327155712:16384,343932928:1073758208,360710144:1074282512,377487360:16,394264576:1073741824,411041792:1074282496,427819008:1073741840,444596224:1073758224,461373440:524304,478150656:0,494927872:16400,511705088:1074266128,528482304:540672},{0:260,1048576:0,2097152:67109120,3145728:65796,4194304:65540,5242880:67108868,6291456:67174660,7340032:67174400,8388608:67108864,9437184:67174656,10485760:65792,11534336:67174404,12582912:67109124,13631488:65536,14680064:4,15728640:256,524288:67174656,1572864:67174404,2621440:0,3670016:67109120,4718592:67108868,5767168:65536,6815744:65540,7864320:260,8912896:4,9961472:256,11010048:67174400,12058624:65796,13107200:65792,14155776:67109124,15204352:67174660,16252928:67108864,16777216:67174656,17825792:65540,18874368:65536,19922944:67109120,20971520:256,22020096:67174660,23068672:67108868,24117248:0,25165824:67109124,26214400:67108864,27262976:4,28311552:65792,29360128:67174400,30408704:260,31457280:65796,32505856:67174404,17301504:67108864,18350080:260,19398656:67174656,20447232:0,21495808:65540,22544384:67109120,23592960:256,24641536:67174404,25690112:65536,26738688:67174660,27787264:65796,28835840:67108868,29884416:67109124,30932992:67174400,31981568:4,33030144:65792},{0:2151682048,65536:2147487808,131072:4198464,196608:2151677952,262144:0,327680:4198400,393216:2147483712,458752:4194368,524288:2147483648,589824:4194304,655360:64,720896:2147487744,786432:2151678016,851968:4160,917504:4096,983040:2151682112,32768:2147487808,98304:64,163840:2151678016,229376:2147487744,294912:4198400,360448:2151682112,425984:0,491520:2151677952,557056:4096,622592:2151682048,688128:4194304,753664:4160,819200:2147483648,884736:4194368,950272:4198464,1015808:2147483712,1048576:4194368,1114112:4198400,1179648:2147483712,1245184:0,1310720:4160,1376256:2151678016,1441792:2151682048,1507328:2147487808,1572864:2151682112,1638400:2147483648,1703936:2151677952,1769472:4198464,1835008:2147487744,1900544:4194304,1966080:64,2031616:4096,1081344:2151677952,1146880:2151682112,1212416:0,1277952:4198400,1343488:4194368,1409024:2147483648,1474560:2147487808,1540096:64,1605632:2147483712,1671168:4096,1736704:2147487744,1802240:2151678016,1867776:4160,1933312:2151682048,1998848:4194304,2064384:4198464},{0:128,4096:17039360,8192:262144,12288:536870912,16384:537133184,20480:16777344,24576:553648256,28672:262272,32768:16777216,36864:537133056,40960:536871040,45056:553910400,49152:553910272,53248:0,57344:17039488,61440:553648128,2048:17039488,6144:553648256,10240:128,14336:17039360,18432:262144,22528:537133184,26624:553910272,30720:536870912,34816:537133056,38912:0,43008:553910400,47104:16777344,51200:536871040,55296:553648128,59392:16777216,63488:262272,65536:262144,69632:128,73728:536870912,77824:553648256,81920:16777344,86016:553910272,90112:537133184,94208:16777216,98304:553910400,102400:553648128,106496:17039360,110592:537133056,114688:262272,118784:536871040,122880:0,126976:17039488,67584:553648256,71680:16777216,75776:17039360,79872:537133184,83968:536870912,88064:17039488,92160:128,96256:553910272,100352:262272,104448:553910400,108544:0,112640:553648128,116736:16777344,120832:262144,124928:537133056,129024:536871040},{0:268435464,256:8192,512:270532608,768:270540808,1024:268443648,1280:2097152,1536:2097160,1792:268435456,2048:0,2304:268443656,2560:2105344,2816:8,3072:270532616,3328:2105352,3584:8200,3840:270540800,128:270532608,384:270540808,640:8,896:2097152,1152:2105352,1408:268435464,1664:268443648,1920:8200,2176:2097160,2432:8192,2688:268443656,2944:270532616,3200:0,3456:270540800,3712:2105344,3968:268435456,4096:268443648,4352:270532616,4608:270540808,4864:8200,5120:2097152,5376:268435456,5632:268435464,5888:2105344,6144:2105352,6400:0,6656:8,6912:270532608,7168:8192,7424:268443656,7680:270540800,7936:2097160,4224:8,4480:2105344,4736:2097152,4992:268435464,5248:268443648,5504:8200,5760:270540808,6016:270532608,6272:270540800,6528:270532616,6784:8192,7040:2105352,7296:2097160,7552:0,7808:268435456,8064:268443656},{0:1048576,16:33555457,32:1024,48:1049601,64:34604033,80:0,96:1,112:34603009,128:33555456,144:1048577,160:33554433,176:34604032,192:34603008,208:1025,224:1049600,240:33554432,8:34603009,24:0,40:33555457,56:34604032,72:1048576,88:33554433,104:33554432,120:1025,136:1049601,152:33555456,168:34603008,184:1048577,200:1024,216:34604033,232:1,248:1049600,256:33554432,272:1048576,288:33555457,304:34603009,320:1048577,336:33555456,352:34604032,368:1049601,384:1025,400:34604033,416:1049600,432:1,448:0,464:34603008,480:33554433,496:1024,264:1049600,280:33555457,296:34603009,312:1,328:33554432,344:1048576,360:1025,376:34604032,392:33554433,408:34603008,424:0,440:34604033,456:1049601,472:1024,488:33555456,504:1048577},{0:134219808,1:131072,2:134217728,3:32,4:131104,5:134350880,6:134350848,7:2048,8:134348800,9:134219776,10:133120,11:134348832,12:2080,13:0,14:134217760,15:133152,2147483648:2048,2147483649:134350880,2147483650:134219808,2147483651:134217728,2147483652:134348800,2147483653:133120,2147483654:133152,2147483655:32,2147483656:134217760,2147483657:2080,2147483658:131104,2147483659:134350848,2147483660:0,2147483661:134348832,2147483662:134219776,2147483663:131072,16:133152,17:134350848,18:32,19:2048,20:134219776,21:134217760,22:134348832,23:131072,24:0,25:131104,26:134348800,27:134219808,28:134350880,29:133120,30:2080,31:134217728,2147483664:131072,2147483665:2048,2147483666:134348832,2147483667:133152,2147483668:32,2147483669:134348800,2147483670:134217728,2147483671:134219808,2147483672:134350880,2147483673:134217760,2147483674:134219776,2147483675:0,2147483676:133120,2147483677:2080,2147483678:131104,2147483679:134350848}],u=[4160749569,528482304,33030144,2064384,129024,8064,504,2147483679],o=i.DES=r.extend({_doReset:function(){for(var t=this._key.words,e=[],r=0;r<56;r++){var i=h[r]-1;e[r]=t[i>>>5]>>>31-i%32&1}for(var n=this._subKeys=[],o=0;o<16;o++){var s=n[o]=[],c=f[o];for(r=0;r<24;r++)s[r/6|0]|=e[(l[r]-1+c)%28]<<31-r%6,s[4+(r/6|0)]|=e[28+(l[r+24]-1+c)%28]<<31-r%6;s[0]=s[0]<<1|s[0]>>>31;for(r=1;r<7;r++)s[r]=s[r]>>>4*(r-1)+3;s[7]=s[7]<<5|s[7]>>>27}var a=this._invSubKeys=[];for(r=0;r<16;r++)a[r]=n[15-r]},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._subKeys)},decryptBlock:function(t,e){this._doCryptBlock(t,e,this._invSubKeys)},_doCryptBlock:function(t,e,r){this._lBlock=t[e],this._rBlock=t[e+1],p.call(this,4,252645135),p.call(this,16,65535),_.call(this,2,858993459),_.call(this,8,16711935),p.call(this,1,1431655765);for(var i=0;i<16;i++){for(var n=r[i],o=this._lBlock,s=this._rBlock,c=0,a=0;a<8;a++)c|=d[a][((s^n[a])&u[a])>>>0];this._lBlock=s,this._rBlock=o^c}var h=this._lBlock;this._lBlock=this._rBlock,this._rBlock=h,p.call(this,1,1431655765),_.call(this,8,16711935),_.call(this,2,858993459),p.call(this,16,65535),p.call(this,4,252645135),t[e]=this._lBlock,t[e+1]=this._rBlock},keySize:2,ivSize:2,blockSize:2});function p(t,e){var r=(this._lBlock>>>t^this._rBlock)&e;this._rBlock^=r,this._lBlock^=r<<t}function _(t,e){var r=(this._rBlock>>>t^this._lBlock)&e;this._lBlock^=r,this._rBlock^=r<<t}t.DES=r._createHelper(o);var s=i.TripleDES=r.extend({_doReset:function(){var t=this._key.words;if(2!==t.length&&4!==t.length&&t.length<6)throw new Error("Invalid key length - 3DES requires the key length to be 64, 128, 192 or >192.");var e=t.slice(0,2),r=t.length<4?t.slice(0,2):t.slice(2,4),i=t.length<6?t.slice(0,2):t.slice(4,6);this._des1=o.createEncryptor(n.create(e)),this._des2=o.createEncryptor(n.create(r)),this._des3=o.createEncryptor(n.create(i))},encryptBlock:function(t,e){this._des1.encryptBlock(t,e),this._des2.decryptBlock(t,e),this._des3.encryptBlock(t,e)},decryptBlock:function(t,e){this._des3.decryptBlock(t,e),this._des2.encryptBlock(t,e),this._des1.decryptBlock(t,e)},keySize:6,ivSize:2,blockSize:2});t.TripleDES=r._createHelper(s)}(),function(){var t=bt,e=t.lib.StreamCipher,r=t.algo,i=r.RC4=e.extend({_doReset:function(){for(var t=this._key,e=t.words,r=t.sigBytes,i=this._S=[],n=0;n<256;n++)i[n]=n;n=0;for(var o=0;n<256;n++){var s=n%r,c=e[s>>>2]>>>24-s%4*8&255;o=(o+i[n]+c)%256;var a=i[n];i[n]=i[o],i[o]=a}this._i=this._j=0},_doProcessBlock:function(t,e){t[e]^=n.call(this)},keySize:8,ivSize:0});function n(){for(var t=this._S,e=this._i,r=this._j,i=0,n=0;n<4;n++){r=(r+t[e=(e+1)%256])%256;var o=t[e];t[e]=t[r],t[r]=o,i|=t[(t[e]+t[r])%256]<<24-8*n}return this._i=e,this._j=r,i}t.RC4=e._createHelper(i);var o=r.RC4Drop=i.extend({cfg:i.cfg.extend({drop:192}),_doReset:function(){i._doReset.call(this);for(var t=this.cfg.drop;0<t;t--)n.call(this)}});t.RC4Drop=e._createHelper(o)}(),bt.mode.CTRGladman=(ot=bt.lib.BlockCipherMode.extend(),st=ot.Encryptor=ot.extend({processBlock:function(t,e){var r,i=this._cipher,n=i.blockSize,o=this._iv,s=this._counter;o&&(s=this._counter=o.slice(0),this._iv=void 0),0===((r=s)[0]=Et(r[0]))&&(r[1]=Et(r[1]));var c=s.slice(0);i.encryptBlock(c,0);for(var a=0;a<n;a++)t[e+a]^=c[a]}}),ot.Decryptor=st,ot),at=(ct=bt).lib.StreamCipher,ht=ct.algo,lt=[],ft=[],dt=[],ut=ht.Rabbit=at.extend({_doReset:function(){for(var t=this._key.words,e=this.cfg.iv,r=0;r<4;r++)t[r]=16711935&(t[r]<<8|t[r]>>>24)|4278255360&(t[r]<<24|t[r]>>>8);var i=this._X=[t[0],t[3]<<16|t[2]>>>16,t[1],t[0]<<16|t[3]>>>16,t[2],t[1]<<16|t[0]>>>16,t[3],t[2]<<16|t[1]>>>16],n=this._C=[t[2]<<16|t[2]>>>16,4294901760&t[0]|65535&t[1],t[3]<<16|t[3]>>>16,4294901760&t[1]|65535&t[2],t[0]<<16|t[0]>>>16,4294901760&t[2]|65535&t[3],t[1]<<16|t[1]>>>16,4294901760&t[3]|65535&t[0]];for(r=this._b=0;r<4;r++)Rt.call(this);for(r=0;r<8;r++)n[r]^=i[r+4&7];if(e){var o=e.words,s=o[0],c=o[1],a=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),h=16711935&(c<<8|c>>>24)|4278255360&(c<<24|c>>>8),l=a>>>16|4294901760&h,f=h<<16|65535&a;n[0]^=a,n[1]^=l,n[2]^=h,n[3]^=f,n[4]^=a,n[5]^=l,n[6]^=h,n[7]^=f;for(r=0;r<4;r++)Rt.call(this)}},_doProcessBlock:function(t,e){var r=this._X;Rt.call(this),lt[0]=r[0]^r[5]>>>16^r[3]<<16,lt[1]=r[2]^r[7]>>>16^r[5]<<16,lt[2]=r[4]^r[1]>>>16^r[7]<<16,lt[3]=r[6]^r[3]>>>16^r[1]<<16;for(var i=0;i<4;i++)lt[i]=16711935&(lt[i]<<8|lt[i]>>>24)|4278255360&(lt[i]<<24|lt[i]>>>8),t[e+i]^=lt[i]},blockSize:4,ivSize:2}),ct.Rabbit=at._createHelper(ut),bt.mode.CTR=(pt=bt.lib.BlockCipherMode.extend(),_t=pt.Encryptor=pt.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize,n=this._iv,o=this._counter;n&&(o=this._counter=n.slice(0),this._iv=void 0);var s=o.slice(0);r.encryptBlock(s,0),o[i-1]=o[i-1]+1|0;for(var c=0;c<i;c++)t[e+c]^=s[c]}}),pt.Decryptor=_t,pt),yt=(vt=bt).lib.StreamCipher,gt=vt.algo,Bt=[],wt=[],kt=[],St=gt.RabbitLegacy=yt.extend({_doReset:function(){for(var t=this._key.words,e=this.cfg.iv,r=this._X=[t[0],t[3]<<16|t[2]>>>16,t[1],t[0]<<16|t[3]>>>16,t[2],t[1]<<16|t[0]>>>16,t[3],t[2]<<16|t[1]>>>16],i=this._C=[t[2]<<16|t[2]>>>16,4294901760&t[0]|65535&t[1],t[3]<<16|t[3]>>>16,4294901760&t[1]|65535&t[2],t[0]<<16|t[0]>>>16,4294901760&t[2]|65535&t[3],t[1]<<16|t[1]>>>16,4294901760&t[3]|65535&t[0]],n=this._b=0;n<4;n++)Mt.call(this);for(n=0;n<8;n++)i[n]^=r[n+4&7];if(e){var o=e.words,s=o[0],c=o[1],a=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),h=16711935&(c<<8|c>>>24)|4278255360&(c<<24|c>>>8),l=a>>>16|4294901760&h,f=h<<16|65535&a;i[0]^=a,i[1]^=l,i[2]^=h,i[3]^=f,i[4]^=a,i[5]^=l,i[6]^=h,i[7]^=f;for(n=0;n<4;n++)Mt.call(this)}},_doProcessBlock:function(t,e){var r=this._X;Mt.call(this),Bt[0]=r[0]^r[5]>>>16^r[3]<<16,Bt[1]=r[2]^r[7]>>>16^r[5]<<16,Bt[2]=r[4]^r[1]>>>16^r[7]<<16,Bt[3]=r[6]^r[3]>>>16^r[1]<<16;for(var i=0;i<4;i++)Bt[i]=16711935&(Bt[i]<<8|Bt[i]>>>24)|4278255360&(Bt[i]<<24|Bt[i]>>>8),t[e+i]^=Bt[i]},blockSize:4,ivSize:2}),vt.RabbitLegacy=yt._createHelper(St),bt.pad.ZeroPadding={pad:function(t,e){var r=4*e;t.clamp(),t.sigBytes+=r-(t.sigBytes%r||r)},unpad:function(t){var e=t.words,r=t.sigBytes-1;for(r=t.sigBytes-1;0<=r;r--)if(e[r>>>2]>>>24-r%4*8&255){t.sigBytes=r+1;break}}},bt});
\ No newline at end of file
... ...