diff --git a/stdiet-admin/src/main/java/com/stdiet/web/controller/MyApplicationRunner.java b/stdiet-admin/src/main/java/com/stdiet/web/controller/MyApplicationRunner.java index 0d98fe060..873f04d6b 100644 --- a/stdiet-admin/src/main/java/com/stdiet/web/controller/MyApplicationRunner.java +++ b/stdiet-admin/src/main/java/com/stdiet/web/controller/MyApplicationRunner.java @@ -1,7 +1,10 @@ package com.stdiet.web.controller; import com.stdiet.common.config.AliyunOSSConfig; +import com.stdiet.common.core.domain.entity.SysUser; +import com.stdiet.common.utils.StringUtils; import com.stdiet.common.utils.oss.AliyunOSSUtils; +import com.stdiet.common.utils.poi.ExcelUtil; import com.stdiet.custom.domain.SysNutritionQuestion; import com.stdiet.custom.domain.SysWxUserInfo; import com.stdiet.custom.domain.SysWxUserLog; @@ -23,6 +26,7 @@ import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import java.io.File; +import java.io.FileInputStream; import java.util.List; @Component @@ -38,19 +42,13 @@ public class MyApplicationRunner implements ApplicationRunner { @Autowired private ISysNutritionQuestionService sysNutritionQuestionService; - @Autowired - private ISysWxUserLogService sysWxUserLogService; + @Override public void run(ApplicationArguments args) throws Exception { - System.out.println("项目启动调用方法"); - - /*SysNutritionQuestion sysNutritionQuestion = new SysNutritionQuestion(); - sysNutritionQuestion.setTitle("如何防止猝死"); - sysNutritionQuestion.setContent("少熬夜,少暴饮暴食"); - sysNutritionQuestion.setKey("猝死"); - sysNutritionQuestionService.insertSysNutritionQuestion(sysNutritionQuestion);*/ + System.out.println("--------------项目启动调用方法开始----------"); + System.out.println("--------------项目启动调用方法结束-------------"); } @@ -75,4 +73,36 @@ public class MyApplicationRunner implements ApplicationRunner { } }*/ } + + /** + * 导入营养小知识方法 + * @param path + */ + public void importNutritionQuestion(String path){ + try{ + int count = 0; + ExcelUtil util = new ExcelUtil(SysNutritionQuestion.class); + File file = new File(path); + List questionList = util.importExcel(new FileInputStream(file)); + System.out.println(questionList.size()); + for (SysNutritionQuestion sysNutritionQuestion : questionList) { + //System.out.println(sysNutritionQuestion); + if(StringUtils.isNotEmpty(sysNutritionQuestion.getTitle()) + && StringUtils.isNotEmpty(sysNutritionQuestion.getContent())){ + //System.out.println(sysNutritionQuestion.getTitle() + "\n"); + sysNutritionQuestion.setShowFlag(1); + if(sysNutritionQuestionService.insertSysNutritionQuestion(sysNutritionQuestion) > 0){ + count++; + Thread.sleep(100); + System.out.println(count); + } + + } + } + System.out.println("结束:"+count); + }catch (Exception e){ + e.printStackTrace(); + } + + } } diff --git a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysNutritionQuestionController.java b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysNutritionQuestionController.java index 6ad638a3b..09bef3393 100644 --- a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysNutritionQuestionController.java +++ b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysNutritionQuestionController.java @@ -2,6 +2,9 @@ package com.stdiet.custom.controller; import java.util.List; +import com.stdiet.common.utils.StringUtils; +import com.stdiet.custom.domain.SysCustomerCase; +import org.apache.ibatis.annotations.Param; import org.aspectj.weaver.loadtime.Aj; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; @@ -104,4 +107,19 @@ public class SysNutritionQuestionController extends BaseController { return toAjax(sysNutritionQuestionService.regenerateNutritionQuestionIndex() ? 1 : 0); } + + /** + * 修改营养小知识是否微信展示状态 + */ + @PreAuthorize("@ss.hasPermi('custom:nutritionQuestion:edit')") + @Log(title = "微信展示状态修改", businessType = BusinessType.UPDATE) + @GetMapping("/updateWxShow") + public AjaxResult updateWxShow(@RequestParam("id")String id, @RequestParam("showFlag")Integer showFlag) + { + if(StringUtils.isEmpty(id) || showFlag == null){ + return AjaxResult.error(); + } + Long[] ids = {Long.parseLong(id)}; + return toAjax(sysNutritionQuestionService.updateWxShowByIds(showFlag, ids)); + } } \ No newline at end of file diff --git a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/WechatAppletController.java b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/WechatAppletController.java index e3d2c4d18..564385447 100644 --- a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/WechatAppletController.java +++ b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/WechatAppletController.java @@ -285,10 +285,11 @@ public class WechatAppletController extends BaseController { } /** - * 获取微信用户记录详细信息 + * 获取小程序展示的营养小知识列表 */ @GetMapping(value = "/getNutritionQuestionList") public AjaxResult getNutritionQuestionList(SysNutritionQuestion sysNutritionQuestion, @RequestParam(value = "pageNum", defaultValue = "1") int pageNum, @RequestParam(value = "pageSize", defaultValue = "10")int pageSize) { + sysNutritionQuestion.setShowFlag(1); Map result = sysNutritionQuestionService.getNutritionQuestionListByKey(sysNutritionQuestion, pageNum, pageSize); return AjaxResult.success(result); } diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysNutritionQuestion.java b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysNutritionQuestion.java index 3b1d20905..3d24b93bb 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysNutritionQuestion.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysNutritionQuestion.java @@ -18,6 +18,8 @@ public class SysNutritionQuestion extends BaseEntity /** $column.columnComment */ private Long id; + private Long[] ids; + /** 标题 */ @Excel(name = "标题") private String title; diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/dto/response/NutritionQuestionResponse.java b/stdiet-custom/src/main/java/com/stdiet/custom/dto/response/NutritionQuestionResponse.java index dc69dc30c..5806e7640 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/dto/response/NutritionQuestionResponse.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/dto/response/NutritionQuestionResponse.java @@ -1,9 +1,11 @@ package com.stdiet.custom.dto.response; +import com.fasterxml.jackson.annotation.JsonFormat; import com.stdiet.common.annotation.Excel; import lombok.Data; import java.io.Serializable; +import java.util.Date; @Data public class NutritionQuestionResponse implements Serializable { @@ -14,14 +16,14 @@ public class NutritionQuestionResponse implements Serializable { private String id; /** 标题 */ - @Excel(name = "标题") private String title; /** 内容 */ - @Excel(name = "内容") private String content; /** 关键词,逗号隔开 */ - @Excel(name = "关键词,逗号隔开") private String key; + + /** 小程序是否显示,0不显示 1显示 */ + private String showFlag; } diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysNutritionQuestionMapper.java b/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysNutritionQuestionMapper.java index baab54945..0375c3cf0 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysNutritionQuestionMapper.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysNutritionQuestionMapper.java @@ -79,4 +79,12 @@ public interface SysNutritionQuestionMapper * @return */ public List getNutritionQuestionListByPage(@Param("start")int start, @Param("pageSize")int pageSize); + + /** + * 更新微信展示状态 + * @param wxShow 是否展示 0不展示 1展示 + * @param ids id数组 + * @return + */ + public int updateWxShowByIds(@Param("wxShow")Integer wxShow, @Param("array") Long[] ids); } \ No newline at end of file diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysNutritionQuestionService.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysNutritionQuestionService.java index 55ed7cae0..93f504de8 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysNutritionQuestionService.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysNutritionQuestionService.java @@ -73,4 +73,12 @@ public interface ISysNutritionQuestionService */ public boolean regenerateNutritionQuestionIndex(); + /** + * 更新微信展示状态 + * @param wxShow 是否展示 0不展示 1展示 + * @param ids id数组 + * @return + */ + public int updateWxShowByIds(Integer wxShow, Long[] ids); + } \ No newline at end of file diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysNutritionQuestionServiceImpl.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysNutritionQuestionServiceImpl.java index 493926e3c..0287f99a1 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysNutritionQuestionServiceImpl.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysNutritionQuestionServiceImpl.java @@ -6,12 +6,17 @@ import java.util.List; import java.util.Map; import com.stdiet.common.utils.DateUtils; +import com.stdiet.common.utils.StringUtils; import com.stdiet.common.utils.reflect.ReflectUtils; import com.stdiet.custom.dto.response.NutritionQuestionResponse; import com.stdiet.custom.utils.LuceneIndexUtils; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.TextField; +import org.apache.lucene.index.Term; +import org.apache.lucene.queryparser.classic.MultiFieldQueryParser; +import org.apache.lucene.search.*; +import org.apache.lucene.util.Version; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -35,10 +40,19 @@ public class SysNutritionQuestionServiceImpl implements ISysNutritionQuestionSer public String index_path; //建立索引的字段名称 - public static final String[] index_field_array = {"id", "title", "content", "key"}; + public static final String[] index_field_array = {"id", "title", "content", "key", "showFlag"}; //查询字段 public static final String[] index_select_field_array = {"title", "content", "key"}; + public static Map nutritionQuestionBoostMap = null; + + static{ + nutritionQuestionBoostMap = new HashMap<>(); + nutritionQuestionBoostMap.put("key", 100); + nutritionQuestionBoostMap.put("title", 80); + nutritionQuestionBoostMap.put("content", 60); + } + /** * 查询营养知识小问答 * @@ -74,7 +88,7 @@ public class SysNutritionQuestionServiceImpl implements ISysNutritionQuestionSer { sysNutritionQuestion.setCreateTime(DateUtils.getNowDate()); if(sysNutritionQuestionMapper.insertSysNutritionQuestion(sysNutritionQuestion) > 0){ - return createNutritionQuestionIndex(sysNutritionQuestion) ? 1 : 0; + return createNutritionQuestionIndex(sysNutritionQuestion.getId()) ? 1 : 0; } return 0; } @@ -90,7 +104,7 @@ public class SysNutritionQuestionServiceImpl implements ISysNutritionQuestionSer { sysNutritionQuestion.setUpdateTime(DateUtils.getNowDate()); if(sysNutritionQuestionMapper.updateSysNutritionQuestion(sysNutritionQuestion) > 0){ - return updateNutritionQuestionIndex(sysNutritionQuestion) ? 1 : 0; + return updateNutritionQuestionIndex(sysNutritionQuestion.getId()) ? 1 : 0; } return 0; } @@ -152,7 +166,24 @@ public class SysNutritionQuestionServiceImpl implements ISysNutritionQuestionSer try{ //建立索引 LuceneIndexUtils luceneIndexUtils = LuceneIndexUtils.getLuceneIndexUtils(index_path); - Map indexMap = luceneIndexUtils.queryByKeyword(sysNutritionQuestion.getKey(), index_select_field_array, pageNum, pageSize); + + //建立查询语句 + BooleanQuery booleanQuery = new BooleanQuery(); + + //装配 + MultiFieldQueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_44, index_select_field_array, luceneIndexUtils.analyzer); + + //解析输入关键字 + Query keywordQuery = StringUtils.isEmpty(sysNutritionQuestion.getKey()) ? new WildcardQuery(new Term(LuceneIndexUtils.default_primary_key, "*")) : queryParser.parse(sysNutritionQuestion.getKey()); + + booleanQuery.add(keywordQuery, BooleanClause.Occur.MUST); + + if(sysNutritionQuestion.getShowFlag() != null){ + Query showFlagQuery = new TermQuery(new Term("showFlag", sysNutritionQuestion.getShowFlag().intValue()+"")); + booleanQuery.add(showFlagQuery, BooleanClause.Occur.MUST); + } + + Map indexMap = luceneIndexUtils.queryByKeyword(booleanQuery, StringUtils.isNotEmpty(sysNutritionQuestion.getKey()), pageNum, pageSize); total = (int)indexMap.get("total"); List documentList = (List)indexMap.get("data"); if(documentList != null && documentList.size() > 0){ @@ -204,7 +235,8 @@ public class SysNutritionQuestionServiceImpl implements ISysNutritionQuestionSer * @param sysNutritionQuestion * @return */ - private boolean createNutritionQuestionIndex(SysNutritionQuestion sysNutritionQuestion){ + private boolean createNutritionQuestionIndex(Long id){ + SysNutritionQuestion sysNutritionQuestion = selectSysNutritionQuestionById(id); try{ //建立索引 LuceneIndexUtils luceneIndexUtils = LuceneIndexUtils.getLuceneIndexUtils(index_path); @@ -221,8 +253,9 @@ public class SysNutritionQuestionServiceImpl implements ISysNutritionQuestionSer * @param sysNutritionQuestion * @return */ - private boolean updateNutritionQuestionIndex(SysNutritionQuestion sysNutritionQuestion){ + private boolean updateNutritionQuestionIndex(Long id){ try{ + SysNutritionQuestion sysNutritionQuestion = selectSysNutritionQuestionById(id); //建立索引 LuceneIndexUtils luceneIndexUtils = LuceneIndexUtils.getLuceneIndexUtils(index_path); Document document = nutritionQuestionToDocument(sysNutritionQuestion); @@ -247,10 +280,19 @@ public class SysNutritionQuestionServiceImpl implements ISysNutritionQuestionSer return nutritionQuestionResponse; } + /** + * + * @param sysNutritionQuestion + * @return + */ private Document nutritionQuestionToDocument(SysNutritionQuestion sysNutritionQuestion){ Document document = new Document(); for (String fieldName : index_field_array) { - document.add(new TextField(fieldName, ReflectUtils.getFieldValue(sysNutritionQuestion, fieldName)+"", Field.Store.YES)); + TextField field = new TextField(fieldName, ReflectUtils.getFieldValue(sysNutritionQuestion, fieldName)+"", Field.Store.YES); + if(nutritionQuestionBoostMap.containsKey(fieldName)){ + field.setBoost(nutritionQuestionBoostMap.get(fieldName).floatValue()); + } + document.add(field); } return document; } @@ -258,12 +300,24 @@ public class SysNutritionQuestionServiceImpl implements ISysNutritionQuestionSer private List nutritionQuestionToDocument(List sysNutritionQuestionList){ List result = new ArrayList<>(); for (SysNutritionQuestion sysNutritionQuestion : sysNutritionQuestionList) { - Document document = new Document(); - for (String fieldName : index_field_array) { - document.add(new TextField(fieldName, ReflectUtils.getFieldValue(sysNutritionQuestion, fieldName)+"", Field.Store.YES)); - } - result.add(document); + result.add(nutritionQuestionToDocument(sysNutritionQuestion)); } return result; } + + /** + * 更新微信展示状态 + * @param wxShow 是否展示 0不展示 1展示 + * @param ids id数组 + * @return + */ + public int updateWxShowByIds(Integer wxShow, Long[] ids){ + if(sysNutritionQuestionMapper.updateWxShowByIds(wxShow, ids) > 0){ + for (Long id : ids) { + updateNutritionQuestionIndex(id); + } + return 1; + } + return 0; + } } \ No newline at end of file diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/utils/LuceneIndexUtils.java b/stdiet-custom/src/main/java/com/stdiet/custom/utils/LuceneIndexUtils.java index 64289bc04..b7af09341 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/utils/LuceneIndexUtils.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/utils/LuceneIndexUtils.java @@ -26,29 +26,39 @@ import java.util.Map; public class LuceneIndexUtils { //分词器 - private IKAnalyzer analyzer = null; + public static IKAnalyzer analyzer = null; + //分词器工具 + private static IndexWriterConfig config = null; //索引库 private Directory directory = null; - //分词器工具 - private IndexWriterConfig config = null; //流 private IndexWriter indexWriter= null; + //获得读取对象 + private IndexSearcher indexSearcher = null; public static final String default_primary_key = "id"; - public static final Integer max_select_count = 1000; + public static final Integer max_select_count = 10000; + + static{ + //分词器 + analyzer = new IKAnalyzer(); + //使用智能分词 + analyzer.setUseSmart(true); + //工具装配分词器 + config = new IndexWriterConfig(Version.LUCENE_44, analyzer); + + } public static LuceneIndexUtils getLuceneIndexUtils(String indexPath){ LuceneIndexUtils luceneIndexUtils = new LuceneIndexUtils(); try { - //分词器 - luceneIndexUtils.analyzer = new IKAnalyzer(); - //使用智能分词 - luceneIndexUtils.analyzer.setUseSmart(true); //索引库 luceneIndexUtils.directory = FSDirectory.open(new File(indexPath)); - //工具装配分词器 - luceneIndexUtils.config = new IndexWriterConfig(Version.LUCENE_44, luceneIndexUtils.analyzer); + //读索引库流 + IndexReader reader = DirectoryReader.open(luceneIndexUtils.directory); + //获得读取对象 + luceneIndexUtils.indexSearcher = new IndexSearcher(reader); } catch (Exception e) { e.printStackTrace(); } @@ -220,34 +230,21 @@ public class LuceneIndexUtils { /** * 查询索引库的数据(根据输入关键字) - * @param keyword * @return * @throws Exception */ - public Map queryByKeyword(String keyword, String[] columns, int pageNum, int pageSize) throws Exception { + public Map queryByKeyword(BooleanQuery query, Boolean boostSort, int pageNum, int pageSize) throws Exception { Map result = new HashMap<>(); - //指定读取索引库的列数据 - //String[] columns = {"articleId","articleName","articleImage","articleContent"}; - - //装配 - MultiFieldQueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_44, columns, analyzer); - - //解析输入关键字 - Query query = StringUtils.isEmpty(keyword) ? new WildcardQuery(new Term(default_primary_key, "*")) : queryParser.parse(keyword); - - //读索引库流 - IndexReader reader = DirectoryReader.open(directory); - - //获得读取对象 - IndexSearcher indexSearcher = new IndexSearcher(reader); - //排序 - SortField sortField = new SortField(default_primary_key, SortField.Type.INT, true); - Sort sort = new Sort(sortField); + Sort sort = null; + if(boostSort == null || !boostSort){ + SortField sortField = new SortField(default_primary_key, SortField.Type.INT, true); + sort = new Sort(sortField); + } //装配解析结果 指定读取量级 - TopDocs search = indexSearcher.search(query, max_select_count, sort); + TopDocs search = sort == null ? indexSearcher.search(query, max_select_count) : indexSearcher.search(query, max_select_count, sort); //获得数据地址数组 ScoreDoc[] scoreDocs = search.scoreDocs; @@ -265,6 +262,7 @@ public class LuceneIndexUtils { end = scoreDocs.length; } for (int i = start; i < end; i++) { + //System.out.println(scoreDocs[i].score); //进集合 装配 list.add(indexSearcher.doc(scoreDocs[i].doc)); } diff --git a/stdiet-custom/src/main/resources/mapper/custom/SysNutritionQuestionMapper.xml b/stdiet-custom/src/main/resources/mapper/custom/SysNutritionQuestionMapper.xml index 9f2371a4d..608cda60f 100644 --- a/stdiet-custom/src/main/resources/mapper/custom/SysNutritionQuestionMapper.xml +++ b/stdiet-custom/src/main/resources/mapper/custom/SysNutritionQuestionMapper.xml @@ -24,7 +24,9 @@ - + + + @@ -98,7 +100,7 @@ + + + update sys_nutrition_question set show_flag = #{wxShow} where id in + + #{id} + + + + + \ No newline at end of file diff --git a/stdiet-ui/src/api/custom/nutritionQuestion.js b/stdiet-ui/src/api/custom/nutritionQuestion.js index f6367aee8..ae2e9098f 100644 --- a/stdiet-ui/src/api/custom/nutritionQuestion.js +++ b/stdiet-ui/src/api/custom/nutritionQuestion.js @@ -50,4 +50,13 @@ export function exportNutritionQuestion(query) { method: 'get', params: query }) +} + +//更新营养知识小问答的展示状态 +export function updateWxShow(data){ + return request({ + url: '/custom/nutritionQuestion/updateWxShow', + method: 'get', + params: data + }) } \ No newline at end of file diff --git a/stdiet-ui/src/views/custom/nutritionQuestion/index.vue b/stdiet-ui/src/views/custom/nutritionQuestion/index.vue index b71367fe7..fb624bef8 100644 --- a/stdiet-ui/src/views/custom/nutritionQuestion/index.vue +++ b/stdiet-ui/src/views/custom/nutritionQuestion/index.vue @@ -7,9 +7,20 @@ placeholder="请输入关键词" clearable size="small" - @keyup.enter.native="handleQuery" /> + + + + + + + 搜索 @@ -81,6 +92,18 @@ + + + +