1、获取IP信息优化新增synchronized可重入锁防止重复获取

2、新增英语文章管理,实现后端CRUD接口
3、insert文章的时候使用多线程去调用API翻译接口
pull/254/head
xjs 4 years ago
parent b6a6a9d922
commit 94f4c23ea0

@ -15,6 +15,8 @@ import java.util.Date;
@Data
public class BaseEntity {
private static final long serialVersionUID = 1L;
/**
*
*/

@ -0,0 +1,96 @@
package com.xjs.article.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.log.annotation.Log;
import com.ruoyi.common.log.enums.BusinessType;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.xjs.article.domain.EnglishArticle;
import com.xjs.article.service.impl.EnglishArticleServiceImpl;
import com.xjs.web.MyBaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* Controller
*
* @author xiejs
* @since 2022-03-03
*/
@RestController
@RequestMapping("/article")
@Api(tags = "业务模块-英语文章管理")
public class EnglishArticleController extends MyBaseController<EnglishArticle> {
@Autowired
private EnglishArticleServiceImpl englishArticleService;
/**
*
*/
@RequiresPermissions("english:article:list")
@GetMapping("/list")
@ApiOperation("查询英语文章列表")
public AjaxResult list(EnglishArticle englishArticle) {
IPage<EnglishArticle> page = englishArticleService.selectEnglishArticleList(startPageMP(), englishArticle);
return AjaxResult.success(page);
}
@GetMapping("/test")
public AjaxResult test(EnglishArticle englishArticle) {
EnglishArticle translation = englishArticleService.translation(englishArticle);
return AjaxResult.success(translation);
}
//--------------------------代码生成------------------------------------
/**
*
*/
@RequiresPermissions("english:article:query")
@GetMapping(value = "/{id}")
@ApiOperation("获取英语文章详细信息")
public AjaxResult getInfo(@PathVariable("id") Long id) {
return AjaxResult.success(englishArticleService.selectEnglishArticleById(id));
}
/**
*
*/
@RequiresPermissions("english:article:add")
@Log(title = "英语文章", businessType = BusinessType.INSERT)
@PostMapping
@ApiOperation("新增英语文章")
public AjaxResult add(@RequestBody EnglishArticle englishArticle) {
return toAjax(englishArticleService.insertEnglishArticle(englishArticle));
}
/**
*
*/
@RequiresPermissions("english:article:edit")
@Log(title = "英语文章", businessType = BusinessType.UPDATE)
@PutMapping
@ApiOperation("修改英语文章")
public AjaxResult edit(@RequestBody EnglishArticle englishArticle) {
return toAjax(englishArticleService.updateEnglishArticle(englishArticle));
}
/**
*
*/
@RequiresPermissions("english:article:remove")
@Log(title = "英语文章", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
@ApiOperation("删除英语文章")
public AjaxResult remove(@PathVariable Long[] ids) {
return toAjax(englishArticleService.deleteEnglishArticleByIds(ids));
}
}

@ -0,0 +1,58 @@
package com.xjs.article.domain;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.ruoyi.common.core.annotation.Excel;
import com.xjs.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
/**
*
* @author xiejs
* @since 2022-03-03
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
public class EnglishArticle extends BaseEntity {
/** 主键ID */
private Long id;
/** 文章标题 */
@Excel(name = "文章标题-英文")
private String titleEnglish;
/** 文章标题-中文 */
@Excel(name = "文章标题-中文")
private String titleChinese;
/** 文章内容 */
@Excel(name = "文章内容-英文")
private String contentEnglish;
/** 文章内容-中文 */
@Excel(name = "文章内容-中文")
private String contentChinese;
/** 文章图片地址 */
@Excel(name = "文章图片地址")
private String pictureUrl;
/** 创建用户 */
@Excel(name = "创建用户")
private String createUser;
@Excel(name = "创建时间" ,dateFormat = "yyyy-MM-dd HH:mm:ss")
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@Excel(name = "修改时间" ,dateFormat = "yyyy-MM-dd HH:mm:ss")
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}

@ -0,0 +1,13 @@
package com.xjs.article.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xjs.article.domain.EnglishArticle;
/**
* Mapper
* @author xiejs
* @since 2022-03-03
*/
public interface EnglishArticleMapper extends BaseMapper<EnglishArticle> {
}

@ -0,0 +1,65 @@
package com.xjs.article.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xjs.article.domain.EnglishArticle;
/**
* service
*
* @author xiejs
* @since 2022-03-03
*/
public interface EnglishArticleService extends IService<EnglishArticle> {
/**
*
*
* @param id
* @return
*/
EnglishArticle selectEnglishArticleById(Long id);
/**
*
*
* @param englishArticle
* @param page
* @return
*/
IPage<EnglishArticle> selectEnglishArticleList(Page<EnglishArticle> page, EnglishArticle englishArticle);
/**
*
*
* @param englishArticle
* @return
*/
boolean insertEnglishArticle(EnglishArticle englishArticle);
/**
*
*
* @param englishArticle
* @return
*/
boolean updateEnglishArticle(EnglishArticle englishArticle);
/**
*
*
* @param ids
* @return
*/
boolean deleteEnglishArticleByIds(Long[] ids);
/**
*
*
* @param id
* @return
*/
boolean deleteEnglishArticleById(Long id);
}

@ -0,0 +1,126 @@
package com.xjs.article.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.constant.HttpStatus;
import com.ruoyi.common.core.domain.R;
import com.xjs.article.domain.EnglishArticle;
import com.xjs.article.mapper.EnglishArticleMapper;
import com.xjs.article.service.EnglishArticleService;
import com.xjs.business.api.RemoteTranslationFeign;
import com.xjs.business.api.domain.TranslationVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Vector;
/**
* service
*
* @author xiejs
* @since 2022-03-03
*/
@Service
public class EnglishArticleServiceImpl extends ServiceImpl<EnglishArticleMapper, EnglishArticle> implements EnglishArticleService {
@Autowired
private RemoteTranslationFeign remoteTranslationFeign;
@Override
public EnglishArticle selectEnglishArticleById(Long id) {
return super.getById(id);
}
@Override
public IPage<EnglishArticle> selectEnglishArticleList(Page<EnglishArticle> page, EnglishArticle englishArticle) {
//封装查询条件
LambdaQueryWrapper<EnglishArticle> wrapper = new LambdaQueryWrapper<>();
// todo 封装查询条件
return super.page(page, wrapper);
}
@Override
public boolean insertEnglishArticle(EnglishArticle englishArticle) {
//封装添加参数 远程调用翻译
englishArticle = this.translation(englishArticle);
return super.save(englishArticle);
}
@Override
public boolean updateEnglishArticle(EnglishArticle englishArticle) {
return super.updateById(englishArticle);
}
@Override
public boolean deleteEnglishArticleByIds(Long[] ids) {
return super.removeByIds(Arrays.asList(ids));
}
@Override
public boolean deleteEnglishArticleById(Long id) {
return super.removeById(id);
}
/**
*
*
* @param englishArticle
* @return
*/
public EnglishArticle translation(EnglishArticle englishArticle) {
// 使用线程安全的Vector
Vector<Thread> threads = new Vector<Thread>();
Thread thread1 = new Thread(() -> {
R<TranslationVo> titleR = remoteTranslationFeign.translation(englishArticle.getTitleChinese());
if (titleR.getCode() == HttpStatus.SUCCESS) {
List<Map<String, String>> transResult = titleR.getData().getTransResult();
StringBuilder sbEnglish = new StringBuilder();
for (Map<String, String> map : transResult) {
sbEnglish.append(map.get("dst"));
}
englishArticle.setTitleEnglish(sbEnglish.toString());
}
});
threads.add(thread1);
thread1.start();
Thread thread2 = new Thread(() -> {
R<TranslationVo> titleR = remoteTranslationFeign.translation(englishArticle.getContentChinese());
if (titleR.getCode() == HttpStatus.SUCCESS) {
List<Map<String, String>> transResult = titleR.getData().getTransResult();
StringBuilder sbEnglish = new StringBuilder();
for (Map<String, String> map : transResult) {
sbEnglish.append(map.get("dst"));
}
englishArticle.setContentEnglish(sbEnglish.toString());
}
});
threads.add(thread2);
thread2.start();
for (Thread thread : threads) {
// 等待所有线程执行完毕
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return englishArticle;
}
}

@ -29,7 +29,7 @@ import java.util.List;
*/
@RestController
@RequestMapping("/word")
@Api(tags = "业务模块-英语管理")
@Api(tags = "业务模块-英语单词管理")
public class EnglishWordController extends MyBaseController<EnglishWord> {
@Autowired
private IEnglishWordService englishWordService;

@ -0,0 +1,8 @@
<?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.xjs.article.mapper.EnglishArticleMapper">
</mapper>

@ -83,8 +83,8 @@ public class TranslationController {
ArrayList<TranslationFactory> factories = new ArrayList<>();
//添加了新接口只需要在这add接口进去
factories.add(youDaoTranslationFactory);
factories.add(baiDuTranslationFactory);
factories.add(rollTranslationFactory);
//factories.add(baiDuTranslationFactory);
//factories.add(rollTranslationFactory);
//--------add----------------------------;-
//随机调用集合中的接口
return RandomUtil.randomEle(factories);

@ -7,9 +7,10 @@ import java.util.List;
import java.util.Map;
/**
* VO
*
* @author xiejs
* @desc VO
* @create 2021-12-25
* @since 2021-12-25
*/
@Data
public class TranslationVo implements Serializable {

@ -29,7 +29,7 @@ public class IPServiceImpl implements IPService {
private RedisService redisService;
@Override
public IPInfoVo getIPApiData() {
public synchronized IPInfoVo getIPApiData() {
if (redisService.hasKey(IP_INFO)) {
return (IPInfoVo) redisService.getCacheObject(IP_INFO);
} else {

Loading…
Cancel
Save