Merge branch 'release/3.0' into dev/dev

# Conflicts:
#	src/main/java/com/ai/da/common/constant/CommonConstant.java
#	src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java
#	src/main/java/com/ai/da/controller/PortfolioController.java
#	src/main/java/com/ai/da/model/dto/QueryPortfolioPageDTO.java
#	src/main/java/com/ai/da/service/PortfolioService.java
#	src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java
#	src/main/resources/messages_en.properties
#	src/main/resources/messages_zh.properties
This commit is contained in:
2024-10-10 23:26:20 +08:00
272 changed files with 362 additions and 779 deletions

View File

@@ -69,4 +69,6 @@ public class CommonConstant {
// 激活更改邮箱 链接有效期 毫秒 3天 // 激活更改邮箱 链接有效期 毫秒 3天
public static final Long CHANGE_MAILBOX_LINK_VALIDITY = 259200000L; public static final Long CHANGE_MAILBOX_LINK_VALIDITY = 259200000L;
public static final String RCA_WORKSHOP_TAG = "#RCAworkshop_2024";
} }

View File

@@ -6,6 +6,9 @@ import com.ai.da.common.response.Response;
import com.ai.da.mapper.primary.entity.Account; import com.ai.da.mapper.primary.entity.Account;
import com.ai.da.model.dto.*; import com.ai.da.model.dto.*;
import com.ai.da.model.vo.*; import com.ai.da.model.vo.*;
import com.ai.da.model.vo.CommentVO;
import com.ai.da.model.vo.PortfolioVO;
import com.ai.da.model.vo.UserLikeChooseVO;
import com.ai.da.service.PortfolioService; import com.ai.da.service.PortfolioService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
@@ -28,7 +31,7 @@ public class PortfolioController {
@ApiOperation(value = "发布作品集") @ApiOperation(value = "发布作品集")
@PostMapping("/publish") @PostMapping("/publish")
public Response<Boolean> preLogin(@RequestParam("file") MultipartFile canvas, @RequestParam("data") String data) { public Response<Long> preLogin(@RequestParam("file") MultipartFile canvas, @RequestParam("data") String data) {
return Response.success(portfolioService.publish(canvas, data)); return Response.success(portfolioService.publish(canvas, data));
} }
@@ -144,4 +147,11 @@ public class PortfolioController {
return Response.success(portfolioService.getFollowerList(getFollowListDTO)); return Response.success(portfolioService.getFollowerList(getFollowListDTO));
} }
/* @ApiOperation(value = "按标签名查询作品")
@GetMapping("/queryPortfolioByTag")
public Response<List<PortfolioVO>> queryPortfolioByTag(@RequestParam(value = "tagName", required = false) String tagName,
@RequestParam(value = "tagId", required = false) Long tagId) {
return Response.success(portfolioService.queryPortfolioByTag(tagName, tagId));
}*/
} }

View File

@@ -0,0 +1,31 @@
package com.ai.da.controller;
import com.ai.da.common.response.Response;
import com.ai.da.mapper.primary.entity.Product;
import com.ai.da.mapper.primary.entity.Tags;
import com.ai.da.service.ProductService;
import com.ai.da.service.TagsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
@CrossOrigin //开放前端的跨域访问
@Api(tags = "标签管理")
@RestController
@RequestMapping("/api/tags")
public class TagsController {
@Resource
private TagsService tagsService;
@ApiOperation("获取标签")
@GetMapping("/getTags")
public Response<List<Tags>> getTags(@RequestParam("userInput") String userInput) {
return Response.success(tagsService.getTags(userInput));
}
}

View File

@@ -3,6 +3,10 @@ package com.ai.da.mapper.primary;
import com.ai.da.common.config.mybatis.plus.CommonMapper; import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.primary.entity.Portfolio; import com.ai.da.mapper.primary.entity.Portfolio;
import java.util.List;
public interface PortfolioMapper extends CommonMapper<Portfolio> { public interface PortfolioMapper extends CommonMapper<Portfolio> {
Portfolio getByIdAll(Long originalPortfolioId); Portfolio getByIdAll(Long originalPortfolioId);
List<Portfolio> getByTag(Long accountId, String tagName);
} }

View File

@@ -0,0 +1,15 @@
package com.ai.da.mapper.primary;
import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.primary.entity.PortfolioTags;
import java.time.LocalDateTime;
public interface PortfolioTagsMapper extends CommonMapper<PortfolioTags> {
void deleteByPortfolioId(Long portfolioId);
// portfolioId与tagId建立唯一约束 如果组合 portfolio_id 和 tag_id 已经存在,插入操作会被忽略。
void insertIgnore(Long portfolioId, Long tagId, LocalDateTime time);
}

View File

@@ -0,0 +1,17 @@
package com.ai.da.mapper.primary;
import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.primary.entity.Tags;
import com.ai.da.model.dto.TagsDTO;
import java.util.List;
import java.util.Map;
public interface TagsMapper extends CommonMapper<Tags> {
List<Map<String, String>> getMatchingTags(String userInput);
List<TagsDTO> getTagByPortfolioId(Long portfolioId);
}

View File

@@ -0,0 +1,14 @@
package com.ai.da.mapper.primary.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@TableName("t_portfolio_tags")
@Data
public class PortfolioTags extends BaseEntity{
private Long portfolioId;
private Long tagId;
}

View File

@@ -0,0 +1,13 @@
package com.ai.da.mapper.primary.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@TableName("t_tags")
@Data
public class Tags extends BaseEntity{
private String tagName;
}

View File

@@ -2,11 +2,11 @@ package com.ai.da.model.dto;
import com.ai.da.mapper.primary.entity.Portfolio; import com.ai.da.mapper.primary.entity.Portfolio;
import lombok.Data; import lombok.Data;
import org.springframework.web.multipart.MultipartFile; import java.util.List;
import java.io.File;
@Data @Data
public class PortfolioDTO extends Portfolio { public class PortfolioDTO extends Portfolio {
private Long userLikeGroupId; private Long userLikeGroupId;
private List<TagsDTO> tagsDTO;
} }

View File

@@ -2,11 +2,8 @@ package com.ai.da.model.dto;
import com.ai.da.model.vo.PageQueryBaseVo; import com.ai.da.model.vo.PageQueryBaseVo;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import java.util.List;
@Data @Data
@ApiModel("作品集分页查询") @ApiModel("作品集分页查询")
public class QueryPortfolioPageDTO extends PageQueryBaseVo { public class QueryPortfolioPageDTO extends PageQueryBaseVo {
@@ -16,4 +13,6 @@ public class QueryPortfolioPageDTO extends PageQueryBaseVo {
private Integer getLikePortfolio; private Integer getLikePortfolio;
private Long accountId; private Long accountId;
private Long tagId;
} }

View File

@@ -0,0 +1,6 @@
package com.ai.da.model.dto;
import com.ai.da.mapper.primary.entity.Tags;
public class TagsDTO extends Tags {
}

View File

@@ -1,12 +1,11 @@
package com.ai.da.model.vo; package com.ai.da.model.vo;
import com.ai.da.model.dto.PortfolioDTO;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import java.util.List;
@AllArgsConstructor @AllArgsConstructor
@Data @Data
@ApiModel("用户choose详细-响应") @ApiModel("用户choose详细-响应")
@@ -24,4 +23,7 @@ public class UserLikeChooseVO {
private String sex; private String sex;
private Integer beenPublished; private Integer beenPublished;
// private Portfolio portfolio;
private PortfolioDTO portfolioDTO;
} }

View File

@@ -11,7 +11,7 @@ import org.springframework.web.multipart.MultipartFile;
import java.util.List; import java.util.List;
public interface PortfolioService extends IService<Portfolio> { public interface PortfolioService extends IService<Portfolio> {
Boolean publish(MultipartFile canvas, String data); Long publish(MultipartFile canvas, String data);
PortfolioVO update(PortfolioDTO portfolioDTO); PortfolioVO update(PortfolioDTO portfolioDTO);
@@ -60,4 +60,6 @@ public interface PortfolioService extends IService<Portfolio> {
Long getPortfolioCount(Long accountId); Long getPortfolioCount(Long accountId);
List<Long> getFolloweeList(Long accountId); List<Long> getFolloweeList(Long accountId);
// List<PortfolioVO> queryPortfolioByTag(String tagName, Long tagId);
} }

View File

@@ -0,0 +1,14 @@
package com.ai.da.service;
import com.ai.da.mapper.primary.entity.Tags;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
public interface TagsService extends IService<Tags> {
List<Tags> getTags(String tagPrefix);
Tags addTag(String tagName);
}

View File

@@ -4,6 +4,7 @@ import com.ai.da.common.config.exception.BusinessException;
import com.ai.da.common.constant.CommonConstant; import com.ai.da.common.constant.CommonConstant;
import com.ai.da.common.context.UserContext; import com.ai.da.common.context.UserContext;
import com.ai.da.common.response.PageBaseResponse; import com.ai.da.common.response.PageBaseResponse;
import com.ai.da.common.response.ResultEnum;
import com.ai.da.common.utils.CopyUtil; import com.ai.da.common.utils.CopyUtil;
import com.ai.da.common.utils.MinioUtil; import com.ai.da.common.utils.MinioUtil;
import com.ai.da.common.utils.RedisUtil; import com.ai.da.common.utils.RedisUtil;
@@ -115,19 +116,35 @@ public class PortfolioServiceImpl extends ServiceImpl<PortfolioMapper, Portfolio
@Resource @Resource
private UserFollowMapper userFollowMapper; private UserFollowMapper userFollowMapper;
@Resource
private PortfolioTagsMapper portfolioTagsMapper;
@Resource
private TagsService tagsService;
@Resource
private TagsMapper tagsMapper;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Boolean publish(MultipartFile file, String data) { public Long publish(MultipartFile file, String data) {
Long resultPortfolioId = null;
AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder(); AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder();
PortfolioDTO portfolioDTO = JSONObject.parseObject(data, PortfolioDTO.class); PortfolioDTO portfolioDTO = JSONObject.parseObject(data, PortfolioDTO.class);
QueryWrapper<Portfolio> existSameNameQw = new QueryWrapper<>(); QueryWrapper<Portfolio> existSameNameQw = new QueryWrapper<>();
existSameNameQw.lambda().ne(Portfolio::getId, portfolioDTO.getId());
existSameNameQw.lambda().eq(Portfolio::getPortfolioName, portfolioDTO.getPortfolioName()); existSameNameQw.lambda().eq(Portfolio::getPortfolioName, portfolioDTO.getPortfolioName());
existSameNameQw.lambda().eq(Portfolio::getAccountId, authPrincipalVo.getId()); existSameNameQw.lambda().eq(Portfolio::getAccountId, authPrincipalVo.getId());
List<Portfolio> portfoliosSameName = portfolioMapper.selectList(existSameNameQw); List<Portfolio> portfoliosSameName = portfolioMapper.selectList(existSameNameQw);
if (!CollectionUtils.isEmpty(portfoliosSameName)) { if (!CollectionUtils.isEmpty(portfoliosSameName)) {
throw new BusinessException("The title of the published work has been used."); throw new BusinessException("The title of the published work has been used.");
} }
// 判断用户是否参与#RCAworkshop_2024的活动
if (hasParticipatedRCAWorkshop(authPrincipalVo.getId(), portfolioDTO.getTagsDTO(), portfolioDTO.getId(), portfolioDTO.getUserLikeGroupId())){
throw new BusinessException("you.have.participated.in.the.event", ResultEnum.PROMPT.getCode());
}
if (file != null && file.getOriginalFilename() != null) { if (file != null && file.getOriginalFilename() != null) {
Long portfolioId;
String upload = minioUtil.upload("aida-canvas", String.valueOf(authPrincipalVo.getId()), file); String upload = minioUtil.upload("aida-canvas", String.valueOf(authPrincipalVo.getId()), file);
Canvas canvas = new Canvas(); Canvas canvas = new Canvas();
canvas.setUrl(upload); canvas.setUrl(upload);
@@ -196,6 +213,8 @@ public class PortfolioServiceImpl extends ServiceImpl<PortfolioMapper, Portfolio
} else { } else {
portfolioMapper.insert(portfolio); portfolioMapper.insert(portfolio);
} }
resultPortfolioId = portfolio.getId();
portfolioId = portfolio.getId();
List<UserLike> userLikeList = userLikeService.getUserLikeList(portfolioDTO.getUserLikeGroupId()); List<UserLike> userLikeList = userLikeService.getUserLikeList(portfolioDTO.getUserLikeGroupId());
for (UserLike userLike : userLikeList) { for (UserLike userLike : userLikeList) {
@@ -287,11 +306,22 @@ public class PortfolioServiceImpl extends ServiceImpl<PortfolioMapper, Portfolio
} else { } else {
portfolioMapper.insert(portfolio); portfolioMapper.insert(portfolio);
} }
resultPortfolioId = portfolio.getId();
portfolioId = portfolio.getId();
}
// id不为空 表示更新发布;为空,表示新发布
if (!Objects.isNull(portfolioDTO.getId())){
portfolioId = portfolioDTO.getId();
// 删除作品的所有与标签的关联关系
portfolioTagsMapper.deleteByPortfolioId(portfolioId);
}
// 记录作品添加的标签
if (!portfolioDTO.getTagsDTO().isEmpty()){
addTagsForPortfolio(portfolioDTO.getTagsDTO(), portfolioId);
} }
} }
return resultPortfolioId;
return Boolean.TRUE;
} }
@Override @Override
@@ -520,7 +550,6 @@ public class PortfolioServiceImpl extends ServiceImpl<PortfolioMapper, Portfolio
return PageBaseResponse.success(convert); return PageBaseResponse.success(convert);
} }
@Override @Override
public PortfolioVO detail(PortfolioDTO portfolioDTO) { public PortfolioVO detail(PortfolioDTO portfolioDTO) {
AuthPrincipalVo userHolder = UserContext.getUserHolder(); AuthPrincipalVo userHolder = UserContext.getUserHolder();
@@ -988,6 +1017,9 @@ public class PortfolioServiceImpl extends ServiceImpl<PortfolioMapper, Portfolio
throw new BusinessException("You do not have the permission to delete portfolio."); throw new BusinessException("You do not have the permission to delete portfolio.");
} }
portfolioMapper.deleteById(id); portfolioMapper.deleteById(id);
// 删除作品与标签的关联记录
portfolioTagsMapper.deleteByPortfolioId(id);
return Boolean.TRUE; return Boolean.TRUE;
} }
@@ -1087,6 +1119,89 @@ public class PortfolioServiceImpl extends ServiceImpl<PortfolioMapper, Portfolio
return null; return null;
} }
// 验证该用户是否已参加活动
public Boolean hasParticipatedRCAWorkshop(Long accountId, List<TagsDTO> tags, Long portfolioId, Long userLikeGroupId) {
List<String> collect = tags.stream().map(Tags::getTagName).collect(Collectors.toList());
if (!collect.contains(CommonConstant.RCA_WORKSHOP_TAG)){
return false;
}else {
UserLikeGroup userLikeGroup = userLikeGroupService.getById(userLikeGroupId);
// 不是原创的作品不能参与活动
if (userLikeGroup.getOriginal().equals(0)){
throw new BusinessException("only.original.works.can.participate.in.the.event", ResultEnum.PROMPT.getCode());
}
List<Portfolio> byTag = baseMapper.getByTag(accountId, CommonConstant.RCA_WORKSHOP_TAG);
if (byTag.isEmpty()){
return false;
}else if (!Objects.isNull(portfolioId)){
boolean contains = byTag.stream().map(Portfolio::getId).collect(Collectors.toList()).contains(portfolioId);
return !contains;
}else {
return true;
}
}
}
public void addTagsForPortfolio(List<TagsDTO> tagsDTOS, Long portfolioId) {
// 遍历数组添加到t_portfolio_tags表中没有id的tag添加到t_tags表中
tagsDTOS.forEach(tag -> {
Long tagId;
if (Objects.isNull(tag.getId())){
Tags tags = tagsService.addTag(tag.getTagName());
tagId = tags.getId();
}else {
tagId = tag.getId();
}
portfolioTagsMapper.insertIgnore(portfolioId, tagId, LocalDateTime.now());
});
}
public PageBaseResponse<PortfolioVO> queryPortfolioByTag(String tagName, Long tagId, Integer page, Integer size) {
long bestMatchTagId;
if (Objects.isNull(tagId)){
List<Map<String, String>> matchingTags = tagsMapper.getMatchingTags(tagName);
Map<String, String> tagMap = matchingTags.get(0);
bestMatchTagId = Long.parseLong(tagMap.get("id"));
}else {
bestMatchTagId = tagId;
}
QueryWrapper<PortfolioTags> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("tag_id", bestMatchTagId).select("portfolio_id");
List<PortfolioTags> portfolioTags = portfolioTagsMapper.selectList(queryWrapper);
List<Long> portfolioIdList = portfolioTags.stream().map(PortfolioTags::getPortfolioId).collect(Collectors.toList());
if (!portfolioIdList.isEmpty()){
QueryWrapper<Portfolio> qw = new QueryWrapper<>();
qw.in("id", portfolioIdList);
Page<Portfolio> portfolioPage = baseMapper.selectPage(new Page<>(page, size), qw);
// 将 Portfolio 转换为 PortfolioVO 并进行相关处理
IPage<PortfolioVO> convert = portfolioPage.convert((Function<Portfolio, PortfolioVO>) portfolio -> {
if (portfolio != null) {
PortfolioVO vo = CopyUtil.copyObject(portfolio, PortfolioVO.class);
Canvas canvas = canvasMapper.selectById(vo.getCanvasId());
vo.setCanvasUrl(minioUtil.getPreSignedUrl(canvas.getUrl(), 24 * 60));
vo.setLikeNum(redisUtil.getLikeCount(vo.getId()));
vo.setViewNums(redisUtil.getViewCount(vo.getId()));
Long accountId = vo.getAccountId();
vo.setUserName(accountMapper.selectById(accountId).getUserName());
if (vo.getOriginal() == 0) {
vo.setOriginalUserName(accountMapper.selectById(vo.getOriginalAccountId()).getUserName());
}
return vo;
}
return null;
});
return PageBaseResponse.success(convert);
}else {
return PageBaseResponse.success(new Page<>());
}
}
public void follow(Long followeeId) { public void follow(Long followeeId) {
Long accountId = UserContext.getUserHolder().getId(); Long accountId = UserContext.getUserHolder().getId();
// 1、不能关注自己 // 1、不能关注自己

View File

@@ -0,0 +1,45 @@
package com.ai.da.service.impl;
import com.ai.da.mapper.primary.TagsMapper;
import com.ai.da.mapper.primary.entity.Tags;
import com.ai.da.service.TagsService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
@Slf4j
@Service
public class TagsServiceImpl extends ServiceImpl<TagsMapper, Tags> implements TagsService {
public List<Tags> getTags(String tagPrefix){
// 1、根据tag前缀,查询
QueryWrapper<Tags> queryWrapper = new QueryWrapper<>();
queryWrapper.likeRight("tag_name", tagPrefix);
// 需返回标签内容和id
return baseMapper.selectList(queryWrapper);
}
public Tags addTag(String tagName) {
// 1、判断有无该tag
QueryWrapper<Tags> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("tag_name", tagName);
Tags tags = baseMapper.selectOne(queryWrapper);
// 2、没有该数据时插入新标签并返回标签id等
if (Objects.isNull(tags)){
tags = new Tags();
tags.setTagName(tagName);
tags.setCreateTime(LocalDateTime.now());
baseMapper.insert(tags);
}
return tags;
}
}

View File

@@ -8,6 +8,7 @@ import com.ai.da.common.enums.CreditsEventsEnum;
import com.ai.da.common.utils.*; import com.ai.da.common.utils.*;
import com.ai.da.mapper.primary.*; import com.ai.da.mapper.primary.*;
import com.ai.da.mapper.primary.entity.*; import com.ai.da.mapper.primary.entity.*;
import com.ai.da.model.dto.PortfolioDTO;
import com.ai.da.model.dto.ProductImageLikeDTO; import com.ai.da.model.dto.ProductImageLikeDTO;
import com.ai.da.model.dto.ToProductImageDTO; import com.ai.da.model.dto.ToProductImageDTO;
import com.ai.da.model.vo.*; import com.ai.da.model.vo.*;
@@ -69,6 +70,8 @@ public class UserLikeGroupServiceImpl extends ServiceImpl<UserLikeGroupMapper, U
private LibraryMapper libraryMapper; private LibraryMapper libraryMapper;
@Resource @Resource
private PortfolioMapper portfolioMapper; private PortfolioMapper portfolioMapper;
@Resource
private TagsMapper tagsMapper;
@Override @Override
public void deleteUserGroup(Long userGroupId) { public void deleteUserGroup(Long userGroupId) {
@@ -155,10 +158,15 @@ public class UserLikeGroupServiceImpl extends ServiceImpl<UserLikeGroupMapper, U
QueryWrapper<Portfolio> qw = new QueryWrapper<>(); QueryWrapper<Portfolio> qw = new QueryWrapper<>();
qw.lambda().eq(Portfolio::getUserLikeGroupSourceId, userGroupId); qw.lambda().eq(Portfolio::getUserLikeGroupSourceId, userGroupId);
List<Portfolio> portfolios = portfolioMapper.selectList(qw); List<Portfolio> portfolios = portfolioMapper.selectList(qw);
// Portfolio portfolio = new Portfolio();
PortfolioDTO portfolioDTO = new PortfolioDTO();
if (CollectionUtil.isNotEmpty(portfolios)) { if (CollectionUtil.isNotEmpty(portfolios)) {
// portfolio = portfolios.get(0);
portfolioDTO = CopyUtil.copyObject(portfolios.get(0), PortfolioDTO.class);
beenPublished = 1; beenPublished = 1;
portfolioDTO.setTagsDTO(tagsMapper.getTagByPortfolioId(portfolioDTO.getId()));
} }
return new UserLikeChooseVO(userGroupId, userLikeVOS, userLikeCollection, sex, beenPublished); return new UserLikeChooseVO(userGroupId, userLikeVOS, userLikeCollection, sex, beenPublished, portfolioDTO);
} }
@Override @Override

View File

@@ -9,4 +9,14 @@
from portfolio from portfolio
where id = #{originalPortfolioId} where id = #{originalPortfolioId}
</select> </select>
<select id="getByTag" resultType="com.ai.da.mapper.primary.entity.Portfolio">
SELECT p.*
FROM portfolio p
JOIN t_portfolio_tags pt ON p.id = pt.portfolio_id
JOIN t_tags t ON pt.tag_id = t.id
WHERE p.account_id = #{accountId}
AND t.tag_name = #{tagName};
</select>
</mapper> </mapper>

View File

@@ -0,0 +1,16 @@
<?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.ai.da.mapper.primary.PortfolioTagsMapper">
<delete id="deleteByPortfolioId">
DELETE
FROM t_portfolio_tags
WHERE portfolio_id = #{portfolioId};
</delete>
<insert id="insertIgnore">
INSERT
IGNORE INTO t_portfolio_tags (portfolio_id, tag_id, create_time)
VALUES (#{portfolioId}, #{tagId}, #{time});
</insert>
</mapper>

View File

@@ -0,0 +1,20 @@
<?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.ai.da.mapper.primary.TagsMapper">
<select id="getMatchingTags" resultType="java.util.List">
SELECT id, tag_name, MATCH(tag_name) AGAINST(#{userInput}) AS relevance
FROM t_tags
WHERE MATCH(tag_name) AGAINST(#{userInput})
ORDER BY relevance DESC;
</select>
<select id="getTagByPortfolioId" resultType="com.ai.da.mapper.primary.entity.Tags">
SELECT t.*
FROM t_tags t
JOIN t_portfolio_tags pt ON t.id = pt.tag_id
WHERE pt.portfolio_id = #{portfolioId};
</select>
</mapper>

View File

@@ -145,6 +145,8 @@ subscription.success=Subscription Success
unsubscribe.success=Unsubscribe Success unsubscribe.success=Unsubscribe Success
you.have.not.followed.the.current.user=You have not followed the current user you.have.not.followed.the.current.user=You have not followed the current user
remaining.modifications=Remaining modifications are 0 remaining.modifications=Remaining modifications are 0
you.have.participated.in.the.event=You have participated in the event.
only.original.works.can.participate.in.the.event=Sorry, only original works can participate in the event.
# 可能会报异常 # 可能会报异常
# Informative: # Informative:

View File

@@ -140,6 +140,8 @@ subscription.success=关注成功
unsubscribe.success=取消关注成功 unsubscribe.success=取消关注成功
you.have.not.followed.the.current.user=您还未关注当前用户 you.have.not.followed.the.current.user=您还未关注当前用户
remaining.modifications=剩余修改次数为0 remaining.modifications=剩余修改次数为0
you.have.participated.in.the.event=您已经参与活动。
only.original.works.can.participate.in.the.event=抱歉,只有原创作品能参与活动。
# 可能会报异常 # 可能会报异常
# Informative: # Informative:

Binary file not shown.

View File

@@ -1,77 +0,0 @@
{
"groups": [
{
"name": "file",
"type": "com.ai.da.common.config.FileProperties",
"sourceType": "com.ai.da.common.config.FileProperties"
},
{
"name": "file.linux",
"type": "com.ai.da.common.config.FileProperties$ElPath",
"sourceType": "com.ai.da.common.config.FileProperties",
"sourceMethod": "getLinux()"
},
{
"name": "file.mac",
"type": "com.ai.da.common.config.FileProperties$ElPath",
"sourceType": "com.ai.da.common.config.FileProperties",
"sourceMethod": "getMac()"
},
{
"name": "file.sys",
"type": "com.ai.da.common.config.FileProperties$ElPath",
"sourceType": "com.ai.da.common.config.FileProperties",
"sourceMethod": "getSys()"
},
{
"name": "file.windows",
"type": "com.ai.da.common.config.FileProperties$ElPath",
"sourceType": "com.ai.da.common.config.FileProperties",
"sourceMethod": "getWindows()"
},
{
"name": "spring.security",
"type": "com.ai.da.common.security.config.SecurityProperties",
"sourceType": "com.ai.da.common.security.config.SecurityProperties"
}
],
"properties": [
{
"name": "file.linux-domain",
"type": "java.lang.String",
"sourceType": "com.ai.da.common.config.FileProperties"
},
{
"name": "spring.security.auth-api",
"type": "java.lang.String",
"sourceType": "com.ai.da.common.security.config.SecurityProperties"
},
{
"name": "spring.security.ignore-paths",
"type": "java.lang.String[]",
"sourceType": "com.ai.da.common.security.config.SecurityProperties"
},
{
"name": "spring.security.jwt-expiration",
"type": "java.lang.Long",
"sourceType": "com.ai.da.common.security.config.SecurityProperties",
"defaultValue": 0
},
{
"name": "spring.security.jwt-secret",
"type": "java.lang.String",
"sourceType": "com.ai.da.common.security.config.SecurityProperties"
},
{
"name": "spring.security.jwt-token-header",
"type": "java.lang.String",
"sourceType": "com.ai.da.common.security.config.SecurityProperties"
},
{
"name": "spring.security.jwt-token-prefix",
"type": "java.lang.String",
"sourceType": "com.ai.da.common.security.config.SecurityProperties"
}
],
"hints": []
}

View File

@@ -1,38 +0,0 @@
server.port=5566
#datasource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://18.167.251.121:3306/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
spring.datasource.username=root
spring.datasource.password=QWa998345
#security
spring.security.jwtSecret=JWTSECRET
spring.security.jwtTokenHeader=Authorization
spring.security.jwtTokenPrefix=Bearer-
## 24Сʱ
spring.security.jwtExpiration=8640000000
#spring security权限设置 认证了token还要认证权限 不然报错Full authentication is required to access this resource
spring.security.ignorePaths=/,/favicon.ico,/doc.html,/webjars/**,/swagger-resources,/v2/api-docs,\
/api/account/**,/api/element/**,/api/python/**,/api/design/**,/api/history/**,/api/library/**,/api/third/party/**
spring.security.authApi=/auth/login
rsa.private_key=MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A==
#mybatis
mybatis-plus.global-config.banner=false
mybatis-plus.mapper-locations=classpath:mapper/*Mapper.xml
#mybatis-plus.configuration.log-impl= org.apache.ibatis.logging.stdout.StdOutImpl
spring.mvc.pathmatch.matching-strategy=ant_path_matcher
file.mac.path=~/file/
file.linux.path=/workspace/home/aida/file/
#linux服务器域名(预览和下载用)
file.linuxDomain=https://www.aida.com.hk/download/
file.windows.path=D:\\upload\\
spring.servlet.multipart.max-file-size = 5MB
spring.servlet.multipart.max-request-size= 5MB
#访问python服务的ip(对应环境)
access.python.ip=http://43.198.80.117

View File

@@ -1,44 +0,0 @@
server.port=5567
#datasource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://18.167.251.121:33006/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
spring.datasource.username=root
spring.datasource.password=root
#security
spring.security.jwtSecret=JWTSECRET
spring.security.jwtTokenHeader=Authorization
spring.security.jwtTokenPrefix=Bearer-
## 24Сʱ
spring.security.jwtExpiration=8640000000
#spring security权限设置 认证了token还要认证权限 不然报错Full authentication is required to access this resource
spring.security.ignorePaths=/,/favicon.ico,/doc.html,/webjars/**,/swagger-resources,/v2/api-docs,\
/api/account/**,/api/element/**,/api/python/**,/api/design/**,/api/history/**,/api/library/**,/api/third/party/**
spring.security.authApi=/auth/login
rsa.private_key=MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A==
#mybatis
mybatis-plus.global-config.banner=false
mybatis-plus.mapper-locations=classpath:mapper/*Mapper.xml
#mybatis-plus.configuration.log-impl= org.apache.ibatis.logging.stdout.StdOutImpl
spring.mvc.pathmatch.matching-strategy=ant_path_matcher
file.mac.path=~/file/
file.linux.path=/workspace/home/aida/file/
#linux服务器域名(预览和下载用)
file.linuxDomain=http://18.162.111.141:5568/download/
file.windows.path=D:\\upload\\
spring.servlet.multipart.max-file-size = 5MB
spring.servlet.multipart.max-request-size= 5MB
#访问python服务的ip(对应环境)
access.python.ip=http://18.167.251.121

View File

@@ -1,5 +0,0 @@
#<23><><EFBFBD><EFBFBD>application-test<73>ļ<EFBFBD>(<28><><EFBFBD>Ի<EFBFBD><D4BB><EFBFBD>)
#spring.profiles.active=test
#<23><><EFBFBD><EFBFBD>application-prod<6F>ļ<EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
spring.profiles.active=test

Some files were not shown because too many files have changed in this diff Show More