Commit 962d323a by xiang

增加web后台;调整代码结构

parent da172559
//package availCap;
package com.jinyun.cap;//package availCap;
import java.io.File;
import java.io.FileInputStream;
......
package com.jinyun.cap;
import org.jgrapht.UndirectedGraph;
import zju.devmodel.MapObject;
......
package com.jinyun.cap;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
......
package com.jinyun.cap;
public class LineParamData {
String devName;
String pole1;
......
package com.jinyun.cap;
import java.util.ArrayList;
import java.util.List;
......
package com.jinyun.cap;
public class LoadPosSw {
String canIn;
String swName;
......
package com.jinyun.cap;
public class LoadPosTf {
String canIn;
String tfName; // 最优接入位置公变的mRID
......
package com.jinyun.cap;
public class MaxMinAvailCap {
String feederName;
double availCap;
......
package com.jinyun.cap;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
......
package com.jinyun.cap;
public class TfUb {
int loadState;
String devName;
......
package com.jinyun.cap;
import org.jgrapht.UndirectedGraph
import org.jgrapht.graph.SimpleGraph
import org.jgrapht.graph.Subgraph
......
package com.jinyun.cap;
import zju.measure.DiscreteInfo
import zju.measure.MeasureInfo
......
package com.jinyun.cap;
import org.jgrapht.UndirectedGraph
import org.jgrapht.alg.ConnectivityInspector
import org.jgrapht.graph.SimpleGraph
......
plugins {
id 'org.springframework.boot' version '2.1.6.RELEASE'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
dependencies {
compile project(':jinyun:availCap')
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation group: 'io.springfox', name: 'springfox-swagger2', version: '2.9.2'
implementation group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.9.2'
implementation group: 'com.auth0', name: 'java-jwt', version: '3.18.2'
compile group: 'org.mybatis.spring.boot', name: 'mybatis-spring-boot-starter', version: '2.2.0'
compile group: 'org.projectlombok', name: 'lombok', version: '1.16.22'
compile 'com.alibaba:fastjson:1.2.4'
runtimeOnly 'org.xerial:sqlite-jdbc:3.28.0'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
test {
useJUnitPlatform()
}
package com.jinyun.web;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@EnableSwagger2
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
package com.jinyun.web;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
@Configuration
@MapperScan("com.jinyun.**.dao") // 扫描DAO
public class MybatisConfig {
@Autowired
private DataSource dataSource;
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setTypeAliasesPackage("com.jinyun.**.model"); // 扫描Model
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
sessionFactory.setMapperLocations(resolver.getResources("classpath*:**/sqlmap/*.xml")); // 扫描映射文件
return sessionFactory.getObject();
}
}
package com.jinyun.web;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.ArrayList;
import java.util.List;
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket createRestApi(){
// 添加请求参数,我们这里把token作为请求头部参数传入后端
ParameterBuilder parameterBuilder = new ParameterBuilder();
List<Parameter> parameters = new ArrayList<Parameter>();
parameterBuilder.name("token").description("令牌")
.modelRef(new ModelRef("string")).parameterType("header").required(false).build();
parameters.add(parameterBuilder.build());
return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()
.apis(RequestHandlerSelectors.any()).paths(PathSelectors.any())
.build().globalOperationParameters(parameters);
// return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
// .select()
// .apis(RequestHandlerSelectors.any())
// .paths(PathSelectors.any()).build();
}
private ApiInfo apiInfo(){
return new ApiInfoBuilder()
.title("SpringBoot API Doc")
.description("This is a restful api document of Spring Boot.")
.version("1.0")
.build();
}
}
package com.jinyun.web.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface PassToken {
boolean required() default true;
}
\ No newline at end of file
package com.jinyun.web.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface UserLoginToken {
boolean required() default true;
}
package com.jinyun.web.config;
import com.jinyun.web.interceptor.AuthenticationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authenticationInterceptor())
.addPathPatterns("/**"); // 拦截所有请求,通过判断是否有 @LoginRequired 注解 决定是否需要登录
}
@Bean
public AuthenticationInterceptor authenticationInterceptor() {
return new AuthenticationInterceptor();
}
}
package com.jinyun.web.controller;
import com.alibaba.fastjson.JSONObject;
import com.jinyun.web.annotation.UserLoginToken;
import com.jinyun.web.entity.User;
import com.jinyun.web.service.TokenService;
import com.jinyun.web.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
@Api(value = "desc of class", tags="Login",description = "登录")
@RestController
@RequestMapping("login")
public class LoginController {
@Autowired
UserService userService;
@Autowired
TokenService tokenService;
//登录
@PostMapping("/login")
public Object login( User user){
JSONObject jsonObject=new JSONObject();
User userForBase=userService.findByUsername(user);
if(userForBase==null){
jsonObject.put("message","登录失败,用户不存在");
return jsonObject;
}else {
if (!userForBase.getPassword().equals(user.getPassword())){
jsonObject.put("message","登录失败,密码错误");
return jsonObject;
}else {
String token = tokenService.getToken(userForBase);
jsonObject.put("token", token);
jsonObject.put("user", userForBase);
return jsonObject;
}
}
}
@UserLoginToken
@GetMapping("/getMessage")
public String getMessage(){
return "你已通过验证";
}
@ApiOperation("数据导入")
@PostMapping("/upload")
public String upload(@RequestBody MultipartFile[] files) throws IOException {
for(MultipartFile file:files){
String fileName = file.getOriginalFilename();
String target = "d:/";
File dest = new File(target+fileName);
try {
file.transferTo(dest);
System.out.println( "上传成功");;
} catch (IOException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
}
System.out.println( "上传失败");;
}
// String fileName = file.getOriginalFilename();
// String target = "d:/";
// File dest = new File(target+fileName);
// try {
// file.transferTo(dest);
// return "上传成功";
// } catch (IOException e) {
// e.printStackTrace();
// } catch (IllegalStateException e) {
// e.printStackTrace();
// }
return "上传成功";
}
}
package com.jinyun.web.controller;
import com.jinyun.web.service.CapService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
@Api(value = "desc of class", tags="MainPage",description = "首页")
@RestController
@RequestMapping("mainPage")
public class MainPageController {
@Autowired
CapService capService;
@ApiOperation(value = "电网统计字段", notes = "")
@RequestMapping(value = "/gridStatistics",method = RequestMethod.GET)
public Object gridStatistics() {
Map<String,Object> result = capService.gridStatistics();
return result;
}
@ApiOperation(value = "低裕度预警统计", notes = "")
@RequestMapping(value = "/lowMarginWarnStatistics",method = RequestMethod.GET)
public Object lowMarginWarnStatistics() {
Map<String,Object> result = capService.lowMarginWarnStatistics();
return result;
}
@ApiOperation(value = "配变三相不平衡度", notes = "")
@RequestMapping(value = "/transformerUnbalance",method = RequestMethod.GET)
public Object transformerUnbalance() {
Map<String,Object> result = capService.transformerUnbalance();
return result;
}
@ApiOperation(value = "配变三相不平衡度列表", notes = "")
@RequestMapping(value = "/transformerUnbalanceList",method = RequestMethod.GET)
public Object transformerUnbalanceList() {
Map<String,Object> result = capService.transformerUnbalanceList();
return result;
}
}
package com.jinyun.web.dao;
import com.jinyun.web.entity.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
public interface SysUserMapper {
public List<Map<String,Object>> selectAll();
User findByUsername(@Param("username") String username);
User findUserById(@Param("Id") String Id);
}
package com.jinyun.web.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
String Id;
String username;
String password;
}
package com.jinyun.web.interceptor;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.jinyun.web.annotation.PassToken;
import com.jinyun.web.annotation.UserLoginToken;
import com.jinyun.web.entity.User;
import com.jinyun.web.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
/**
* @author jinbin
* @date 2018-07-08 20:41
*/
public class AuthenticationInterceptor implements HandlerInterceptor {
@Autowired
UserService userService;
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception {
String token = httpServletRequest.getHeader("token");// 从 http 请求头中取出 token
// 如果不是映射到方法直接通过
if(!(object instanceof HandlerMethod)){
return true;
}
HandlerMethod handlerMethod=(HandlerMethod)object;
Method method=handlerMethod.getMethod();
//检查是否有passtoken注释,有则跳过认证
if (method.isAnnotationPresent(PassToken.class)) {
PassToken passToken = method.getAnnotation(PassToken.class);
if (passToken.required()) {
return true;
}
}
//检查有没有需要用户权限的注解
if (method.isAnnotationPresent(UserLoginToken.class)) {
UserLoginToken userLoginToken = method.getAnnotation(UserLoginToken.class);
if (userLoginToken.required()) {
// 执行认证
if (token == null) {
throw new RuntimeException("无token,请重新登录");
}
// 获取 token 中的 user id
String userId;
try {
userId = JWT.decode(token).getAudience().get(0);
} catch (JWTDecodeException j) {
throw new RuntimeException("401");
}
User user = userService.findUserById(userId);
if (user == null) {
throw new RuntimeException("用户不存在,请重新登录");
}
// 验证 token
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(user.getPassword())).build();
try {
jwtVerifier.verify(token);
} catch (JWTVerificationException e) {
throw new RuntimeException("401");
}
return true;
}
}
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
package com.jinyun.web.interceptor;
import com.alibaba.fastjson.JSONObject;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@ControllerAdvice
public class GloablExceptionHandler {
@ResponseBody
@ExceptionHandler(Exception.class)
public Object handleException(Exception e) {
String msg = e.getMessage();
if (msg == null || msg.equals("")) {
msg = "服务器出错";
}
JSONObject jsonObject = new JSONObject();
jsonObject.put("message", msg);
return jsonObject;
}
}
package com.jinyun.web.service;
import com.jinyun.cap.SqliteDb;
import com.jinyun.cap.TfUb;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/**
* @author jinbin
* @date 2018-07-08 20:52
*/
@Service("CapService")
public class CapService {
static String allFeederNameTable = "所有馈线名称";
static String allPsWarnTable = "所有馈线预警设备";
static String allPsLineWarnTable = "所有馈线线路预警设备";
static String allPsTfWarnTable = "所有馈线公变预警设备";
static String maxMinAvailCapTable = "最大最小可开放容量线路";
static String lineITableName = "电流";
static String switchTableName = "开关";
static String lineParamTableName = "参数";
static String oneLineParamTableName = "单线参数";
static String transformerTableName = "公变";
static String tfParamTableName = "公变参数";
static String availCapTableName = "可接入容量";
static String swToLineTableName = "开关线路对应";
static String swToTfTableName = "开关公变对应";
static String tfToLineTableName = "公变线路对应";
static String lineWarnTableName = "线路预警";
static String tfWarnTableName = "公变预警";
static String substationTableName = "变电站";
static String tfMonthUbTableName = "公变月不平衡度";
static String linePassRateTableName = "线路合格率";
static String tfOverLoadRateTableName = "公变越限率";
static String feederTableName = "馈线名称";
static String loadPosTable = "负荷接入位置";
static String allPsDbFile = "D:\\others\\yunqi\\项目\\缙云项目\\test\\allPsDb\\allPs.db";
static String feederDbFile = "D:\\others\\yunqi\\项目\\缙云项目\\test\\feederDb";
public Map<String, Object> gridStatistics() {
Map<String,Object> result = new HashMap<>();
result.put("110StationCount",25);
result.put("35StationCount",36);
result.put("10kVBusCount",67);
result.put("busCount",156);
result.put("transformerCount",300);
return result;
}
public Map<String, Object> lowMarginWarnStatistics() {
SqliteDb sqliteDb = new SqliteDb(allPsDbFile);
int hardLineNum = sqliteDb.queryWarnDevNum(allPsWarnTable, 1, 1);
int overLineNum = sqliteDb.queryWarnDevNum(allPsWarnTable, 2, 1);
int hardTfNum = sqliteDb.queryWarnDevNum(allPsWarnTable, 1, 2);
int overTfNum = sqliteDb.queryWarnDevNum(allPsWarnTable, 2, 2);
Map<String,Object> result = new HashMap<>();
result.put("hardLineNum",hardLineNum);
result.put("overLineNum",overLineNum);
result.put("hardTfNum",hardTfNum);
result.put("overTfNum",overTfNum);
return result;
}
public Map<String, Object> transformerUnbalance() {
SqliteDb allPsDb = new SqliteDb(allPsDbFile);
List<String> feeders = allPsDb.queryAllFeederName(allFeederNameTable); // 查询馈线名称
List<TfUb> tfUbs = new LinkedList<>();
for (String feeder : feeders) {
SqliteDb sqliteDb = new SqliteDb(feederDbFile + "\\" + feeder + ".db");
tfUbs.addAll(sqliteDb.queryTfMonthUb(feeder + tfMonthUbTableName));
}
Map<String,Object> result = new HashMap<>();
int count = 0;
for(TfUb tfUb:tfUbs){
if(count == 3) break;
if(result.containsKey(tfUb.getDevName()))
continue;
result.put(tfUb.getDevName(),tfUb.getUb());
count ++;
}
return result;
}
public Map<String, Object> transformerUnbalanceList() {
SqliteDb allPsDb = new SqliteDb(allPsDbFile);
List<String> feeders = allPsDb.queryAllFeederName(allFeederNameTable); // 查询馈线名称
List<TfUb> tfUbs = new LinkedList<>();
for (String feeder : feeders) {
SqliteDb sqliteDb = new SqliteDb(feederDbFile + "\\" + feeder + ".db");
tfUbs.addAll(sqliteDb.queryTfMonthUb(feeder + tfMonthUbTableName));
}
Map<String,Object> result = new HashMap<>();
for(TfUb tfUb:tfUbs){
result.put(tfUb.getmRID(),tfUb);
}
return result;
}
}
package com.jinyun.web.service;
import java.util.List;
import java.util.Map;
public interface SysUserService {
List<Map<String,Object>> findAll();
}
\ No newline at end of file
package com.jinyun.web.service;
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.jinyun.web.entity.User;
import org.springframework.stereotype.Service;
/**
* @author jinbin
* @date 2018-07-08 21:04
*/
@Service("TokenService")
public class TokenService {
public String getToken(User user) {
String token="";
token= JWT.create().withAudience(user.getId())// 将 user id 保存到 token 里面
.sign(Algorithm.HMAC256(user.getPassword()));// 以 password 作为 token 的密钥
return token;
}
}
package com.jinyun.web.service;
import com.jinyun.web.dao.SysUserMapper;
import com.jinyun.web.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author jinbin
* @date 2018-07-08 20:52
*/
@Service("UserService")
public class UserService {
@Autowired
SysUserMapper userMapper;
public User findByUsername(User user){
return userMapper.findByUsername(user.getUsername());
}
public User findUserById(String userId) {
return userMapper.findUserById(userId);
}
}
package com.jinyun.web.service.impl;
import com.jinyun.web.dao.SysUserMapper;
import com.jinyun.web.service.SysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
@Service
public class SysUserServiceImpl implements SysUserService {
@Autowired
SysUserMapper sysUserMapper;
@Override
public List<Map<String,Object>> findAll() {
return sysUserMapper.selectAll();
}
}
server:
port: 8080
spring:
datasource:
driverClassName: org.sqlite.JDBC
url: jdbc:sqlite:D:/test.db
username:
password:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jinyun.web.dao.SysUserMapper">
<select id="selectAll" resultType="map">
select * from test
</select>
<select id="findUserById" resultType="com.jinyun.web.entity.User">
select * from user where id=#{Id}
</select>
<select id="findByUsername" resultType="com.jinyun.web.entity.User">
select * from user where username=#{username}
</select>
</mapper>
\ No newline at end of file
include 'availCap'
include 'jinyun:availCap',
'jinyun:web'
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论