From 62c1be6187c9fabf84c3deb53c638cce3885b10a Mon Sep 17 00:00:00 2001 From: hujunbo <9094908@qq.com> Date: Tue, 27 Sep 2022 20:03:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E5=AE=8C=E6=88=90=E5=AE=9E?= =?UTF-8?q?=E9=AA=8C=E6=8A=A5=E5=91=8A=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-druid.yml | 6 + ruoyi-biemo/pom.xml | 4 - .../business/controller/ReportController.java | 22 ++- .../ruoyi/biemo/business/domain/Report.java | 53 +++-- .../biemo/business/domain/ReportStep.java | 21 ++ .../biemo/business/service/ReportService.java | 117 ++++++++++- .../com/ruoyi/biemo/core/MyConstants.java | 7 + .../biemo/core/response/MyResponseResult.java | 14 ++ .../biemo/nlp/SentimentAnalysisUtils.java | 48 ++++- .../com/ruoyi/biemo/utils/SHA256Util.java | 45 +++++ ruoyi-ui/src/api/biemo/report.js | 25 +++ ruoyi-ui/src/views/category/index.vue | 1 + ruoyi-ui/src/views/posTagging/detail.vue | 8 +- ruoyi-ui/src/views/report/index.vue | 136 ++++++++++++- ruoyi-ui/src/views/sentiment/index.vue | 186 ++++++++++++++++++ ruoyi-ui/src/views/similar/index.vue | 1 - 16 files changed, 655 insertions(+), 39 deletions(-) create mode 100644 ruoyi-biemo/src/main/java/com/ruoyi/biemo/business/domain/ReportStep.java create mode 100644 ruoyi-biemo/src/main/java/com/ruoyi/biemo/core/MyConstants.java create mode 100644 ruoyi-biemo/src/main/java/com/ruoyi/biemo/core/response/MyResponseResult.java create mode 100644 ruoyi-biemo/src/main/java/com/ruoyi/biemo/utils/SHA256Util.java create mode 100644 ruoyi-ui/src/views/sentiment/index.vue diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-admin/src/main/resources/application-druid.yml index 3716a2a..28f7586 100644 --- a/ruoyi-admin/src/main/resources/application-druid.yml +++ b/ruoyi-admin/src/main/resources/application-druid.yml @@ -81,3 +81,9 @@ sso: password: admin123 secretKey: 4ce36bf549d64d44b6cbc48e926abb05 appId: cb00a3e26b963b25e28cae6e046f1190 +report: + uploadUrl: http://test.vsp.cqooc.com/open/api/v2/upload/data + refreshUrl: http://test.vsp.cqooc.com/open/api/v2/oauth/refresh?token=TOKEN&appid=APPID&signature=SIGNATURE + validateUrl: http://vsp.cqooc.com/open/api/v2/oauth/validate?username=USERNAME&password=PASSWORD&nonce=NONCE&cnonce=CNONCE&appid=APPID&signature=SIGNATURE + uploadAttachmentUrl: http://test.vsp.cqooc.com/open/api/v2/upload/attachment?access_token=ACCESS_TOKEN&appid=APPID&originId=ORIGINID&filename=FILENAME&title=TITLE&remarks=REMARKS + getReportListUrl: http://test.vsp.cqooc.com/open/api/v2/query/data?appId=APPID&accessToken=ACCESS_TOKEN&signature=SIGNATURE diff --git a/ruoyi-biemo/pom.xml b/ruoyi-biemo/pom.xml index 7a8ffc1..b455f69 100644 --- a/ruoyi-biemo/pom.xml +++ b/ruoyi-biemo/pom.xml @@ -35,10 +35,6 @@ org.springframework.boot spring-boot-starter-data-mongodb - - org.springframework.boot - spring-boot-starter-data-redis - cn.hutool hutool-all diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/business/controller/ReportController.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/business/controller/ReportController.java index 1569f31..514dde2 100644 --- a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/business/controller/ReportController.java +++ b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/business/controller/ReportController.java @@ -4,14 +4,17 @@ import com.ruoyi.biemo.business.domain.Report; import com.ruoyi.biemo.business.service.ReportService; import com.ruoyi.biemo.core.page.Page; import com.ruoyi.biemo.core.page.PageFactory; +import com.ruoyi.biemo.nlp.SentimentAnalysisUtils; import com.ruoyi.biemo.nlp.WordVectorModelUtils; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.util.List; @@ -73,8 +76,8 @@ public class ReportController @RequestMapping public AjaxResult add(@RequestBody Report report) { - reportService.insertOrUpdateReport(report); - return AjaxResult.success(); + //reportService.insertOrUpdateReport(report); + return reportService.uploadReport(report, SecurityUtils.getUsername()); } @@ -102,4 +105,19 @@ public class ReportController return AjaxResult.success(WordVectorModelUtils.similarCount(text1,text2)); } + @PostMapping("/sentiment") + public AjaxResult sentiment(String text){ + return AjaxResult.success("查询成功",SentimentAnalysisUtils.analysis(text)); + } + + @PostMapping("/sentiment/import") + public AjaxResult sentimentImport(MultipartFile[] files,String sentimentName){ + return AjaxResult.success("模型训练成功",SentimentAnalysisUtils.analysisImport(files,sentimentName)); + } + + @GetMapping("/sentiment/getCurrSentiments") + public AjaxResult getCurrSentiments(){ + return AjaxResult.success("查询成功",SentimentAnalysisUtils.getCurrSentiments()); + } + } diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/business/domain/Report.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/business/domain/Report.java index 3bc1704..7fb2fee 100644 --- a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/business/domain/Report.java +++ b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/business/domain/Report.java @@ -10,6 +10,8 @@ import com.ruoyi.common.core.domain.BaseEntity; import org.springframework.data.elasticsearch.annotations.Document; import java.io.Serializable; +import java.util.List; +import java.util.Map; /** * 报告提交对象 report @@ -20,28 +22,41 @@ import java.io.Serializable; @Data @Document(indexName = "report") @org.springframework.data.mongodb.core.mapping.Document("report") -public class Report extends BiemoEntity -{ - private static final long serialVersionUID = 1L; - - /** 主键 */ +public class Report extends BiemoEntity { + /** + * 主键 + */ @EsId private String id; - - /** 报告名称 */ - @FieldInfo(type = "string",participle = 3) - private String name; - - /** 状态 */ - @FieldInfo(type = "keyword",participle = 0) + /** + * 报告名称 + */ + @FieldInfo(type = "string", participle = 3) + private String title; + /** + * 状态 + */ + @FieldInfo(type = "keyword", participle = 0) private Long status; - - /** 报告编号 */ - @FieldInfo(type = "keyword",participle = 0) + /** + * 报告编号 + */ + @FieldInfo(type = "keyword", participle = 0) private String reportNo; - - - - + private String accessToken; + private String appId; + private Long endTime; + private Map extData; + private String groupId; + private String groupMembers; + private String groupName; + private String openId; + private String originId; + private String roleInGroup; + private Long score; + private String signature; + private Long startTime; + private Long timeUsed; + private List steps; } diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/business/domain/ReportStep.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/business/domain/ReportStep.java new file mode 100644 index 0000000..cea0fd3 --- /dev/null +++ b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/business/domain/ReportStep.java @@ -0,0 +1,21 @@ +package com.ruoyi.biemo.business.domain; + +import lombok.Data; + +@Data +public class ReportStep { + + private String title; + private String evaluation; + private Long expectTime; + private Long maxScore; + private Long repeatCount; + private Long score; + private Long seq; + private Long startTime; + private Long endTime; + private Long timeUsed; + private String remarks; + private String scoringModel; + +} diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/business/service/ReportService.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/business/service/ReportService.java index e5f082d..68a34de 100644 --- a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/business/service/ReportService.java +++ b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/business/service/ReportService.java @@ -10,13 +10,16 @@ import com.ruoyi.biemo.business.domain.event.CategoryDeleteEvent; import com.ruoyi.biemo.business.domain.event.CategorySaveEvent; import com.ruoyi.biemo.business.domain.event.ReportDeleteEvent; import com.ruoyi.biemo.business.domain.event.ReportSaveEvent; +import com.ruoyi.biemo.core.MyConstants; import com.ruoyi.biemo.core.page.Page; +import com.ruoyi.biemo.core.response.MyResponseResult; import com.ruoyi.biemo.elasticsearch.util.EsService; import com.ruoyi.biemo.mongodb.utils.CriteriaAndWrapper; import com.ruoyi.biemo.mongodb.utils.MongoHelper; import com.ruoyi.biemo.utils.MyObjects; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.utils.SecurityUtils; @@ -192,6 +195,21 @@ public class ReportService extends EsService { private String appId = "cb00a3e26b963b25e28cae6e046f1190"; @Value("${sso.secretKey}") private String secretKey = "4ce36bf549d64d44b6cbc48e926abb05"; + + @Value("${report.uploadUrl}") + private String reportUploadUrl = "http://test.vsp.cqooc.com/open/api/v2/upload/data"; + + @Value("${report.refreshUrl}") + private String refreshUrl = "http://test.vsp.cqooc.com/open/api/v2/oauth/refresh?token=TOKEN&appid=APPID&signature=SIGNATURE"; + + @Value("${report.validateUrl}") + private String validateUrl = "http://test.vsp.cqooc.com/open/api/v2/oauth/validate?username=USERNAME&password=PASSWORD&nonce=NONCE&cnonce=CNONCE&appid=APPID&signature=SIGNATURE"; + + @Value("${report.uploadAttachmentUrl}") + private String uploadAttachmentUrl = "http://test.vsp.cqooc.com/open/api/v2/upload/attachment?access_token=ACCESS_TOKEN&appid=APPID&originId=ORIGINID&filename=FILENAME&title=TITLE&remarks=REMARKS"; + + @Value("${report.getReportListUrl}") + private String getReportListUrl = "http://test.vsp.cqooc.com/open/api/v2/query/data?appId=APPID&accessToken=ACCESS_TOKEN&signature=SIGNATURE&&originId=ORIGINID"; @Autowired private RedisCache redisCache; @@ -213,11 +231,17 @@ public class ReportService extends EsService { userName = data.getString("userName"); String openId = data.getString("openId"); String accessToken = data.getString("accessToken"); + MyResponseResult myResponseResult = new MyResponseResult(); + myResponseResult.setAccessToken(accessToken); + myResponseResult.setOpenId(openId); Long createTime = data.getLong("createTime"); Long expiresTime = data.getLong("expiresTime"); - Long expiresLong = expiresTime-createTime; - redisCache.setCacheObject(ticket, accessToken, expiresLong.intValue(), TimeUnit.MILLISECONDS); - //用户名不存在就新建 + Long expiresLong = expiresTime-System.currentTimeMillis(); + redisCache.setCacheObject(MyConstants.TOKEN_PREFIX+userName, myResponseResult, expiresLong.intValue(), TimeUnit.MILLISECONDS); + if(expiresLong<=0){ + refreshToken(accessToken,userName,myResponseResult); + } + //用户名不存在就新建 SysUser sysUser = new SysUser(); if(UserConstants.UNIQUE.equals(userService.checkUserNameUnique(userName))){ sysUser.setUserName(userName); @@ -250,6 +274,93 @@ public class ReportService extends EsService { return null; } + //验证用户信息 + + + //上报实验结果 + public AjaxResult uploadReport(Report report,String username){ + if(report==null||StringUtils.isBlank(username)){ + return AjaxResult.error("参数不能为空!"); + } + MyResponseResult myResponseResult = redisCache.getCacheObject(MyConstants.TOKEN_PREFIX+username); + if(myResponseResult!=null&&myResponseResult.getAccessToken()!=null){ + report.setAccessToken(myResponseResult.getAccessToken()); + String signature = report.getSignature(); + signature = Md5Utils.hash(appId+secretKey+report.getAccessToken()).toUpperCase(); + report.setSignature(signature); + report.setOpenId(myResponseResult.getOpenId()); + report.setOriginId(username); + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity uploadResponseEntity = restTemplate.postForEntity(reportUploadUrl, report, Map.class); + Map result = uploadResponseEntity.getBody(); + if (result != null && (Integer) result.get("code") == 0) { + return AjaxResult.success(result.get("data")); + }else{ + return AjaxResult.error(result.get("message").toString()); + } + } + return AjaxResult.error("没有授权或授权到期!"); + } + + //获取实验结果 + public Page getReportList(String username){ + RestTemplate restTemplate = new RestTemplate(); + Map map = new HashMap<>(); + MyResponseResult myResponseResult = redisCache.getCacheObject(MyConstants.TOKEN_PREFIX+username); + if(myResponseResult!=null&&StringUtils.isNotBlank(myResponseResult.getAccessToken())){ + String accessToken = myResponseResult.getAccessToken(); + String signature = Md5Utils.hash(appId+secretKey+accessToken).toUpperCase(); + map.put("APPID",appId); + map.put("ACCESS_TOKEN",accessToken); + map.put("SIGNATURE",signature); + map.put("ORIGINID",username); + ResponseEntity responseEntity = restTemplate.getForEntity(getReportListUrl,Map.class,map); + Map body = responseEntity.getBody(); + if(body!=null&&(Integer)body.get("code")==0){ + JSONObject jsonObject = (JSONObject) JSONObject.toJSON(body); + JSONObject data = jsonObject.getObject("data",JSONObject.class); + JSONObject meta = jsonObject.getObject("meta",JSONObject.class); + String total = meta.getString("total"); + String start = meta.getString("start"); + String size = meta.getString("size"); + List reportList = JSONObject.parseArray(data.getString("data"),Report.class); + Page page = new Page<>(); + page.setRows(reportList); + page.setPageNum(Integer.parseInt(start)); + page.setPageSize(Integer.parseInt(size)); + page.setTotal(Long.valueOf(total)); + return page; + } + } + return new Page(); + } + + //刷新token方法 + public String refreshToken(String oldToken,String username,MyResponseResult myResponseResult){ + String newToken = ""; + String signature = Md5Utils.hash(appId+secretKey+oldToken).toUpperCase(); + RestTemplate restTemplate = new RestTemplate(); + Map map = new HashMap<>(); + map.put("APPID",appId); + map.put("TOKEN",oldToken); + map.put("SIGNATURE",signature); + ResponseEntity responseEntity = restTemplate.getForEntity(refreshUrl,Map.class,map); + Map responseMap = responseEntity.getBody(); + if(responseMap!=null&&(Integer)responseMap.get("code")==0){ + JSONObject jsonObject = (JSONObject) JSONObject.toJSON(responseMap); + JSONObject data = jsonObject.getObject("data",JSONObject.class); + newToken = data.getString("accessToken"); + Long createTime = data.getLong("createTime"); + Long expiresTime = data.getLong("expiresTime"); + Long expiresLong = expiresTime-System.currentTimeMillis(); + myResponseResult.setAccessToken(newToken); + redisCache.setCacheObject(MyConstants.TOKEN_PREFIX+username,myResponseResult,expiresLong.intValue(),TimeUnit.MILLISECONDS); + } + return newToken; + } + + + /** * "success": true, * "code": 0, diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/core/MyConstants.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/core/MyConstants.java new file mode 100644 index 0000000..cf7f68e --- /dev/null +++ b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/core/MyConstants.java @@ -0,0 +1,7 @@ +package com.ruoyi.biemo.core; + +public class MyConstants { + + public static final String TOKEN_PREFIX = "makesoft:"; + +} diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/core/response/MyResponseResult.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/core/response/MyResponseResult.java new file mode 100644 index 0000000..e082b32 --- /dev/null +++ b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/core/response/MyResponseResult.java @@ -0,0 +1,14 @@ +package com.ruoyi.biemo.core.response; + + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class MyResponseResult implements Serializable { + + private String accessToken; + + private String openId; +} diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/nlp/SentimentAnalysisUtils.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/nlp/SentimentAnalysisUtils.java index 3bcdfb5..adee713 100644 --- a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/nlp/SentimentAnalysisUtils.java +++ b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/nlp/SentimentAnalysisUtils.java @@ -3,8 +3,12 @@ package com.ruoyi.biemo.nlp; import com.hankcs.hanlp.classification.classifiers.IClassifier; import com.hankcs.hanlp.classification.classifiers.NaiveBayesClassifier; import com.ruoyi.biemo.utils.TestUtility; +import org.springframework.web.multipart.MultipartFile; +import java.io.File; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; /** * 情感分析 @@ -13,7 +17,7 @@ public class SentimentAnalysisUtils { public static final String CORPUS_FOLDER = TestUtility.ensureTestData("ChnSentiCorp情感分析酒店评论", "http://hanlp.linrunsoft.com/release/corpus/ChnSentiCorp.zip"); public static String analysis(String text){ String result = ""; - IClassifier classifier = new NaiveBayesClassifier(); // + IClassifier classifier = new NaiveBayesClassifier(); try { classifier.train(CORPUS_FOLDER); result = classifier.classify(text); @@ -22,4 +26,46 @@ public class SentimentAnalysisUtils { } return result; } + + public static Object analysisImport(MultipartFile[] files, String name) { + if(files!=null&&files.length>0){ + File file1 = new File(CORPUS_FOLDER+"/"+name); + if(!file1.getParentFile().exists()){ + file1.mkdirs(); + } + if(!file1.exists()){ + file1.mkdirs(); + } + for(int i=0;i getCurrSentiments(){ + File file = new File(CORPUS_FOLDER); + File[] dirs = file.listFiles(); + List result = new ArrayList<>(); + if(dirs!=null&&dirs.length>0){ + for(int i=0;i +