13
0

3 Коммиты 7acbf637d3 ... ec8d35dd25

Автор SHA1 Сообщение Дата
  西格玛许 ec8d35dd25 Merge branch 'dev/xmy' of http://8.152.4.3:3000/yp/sj-backend into dev/xmy 1 неделя назад
  西格玛许 5052422aab 1 1 неделя назад
  西格玛许 13467aa490 feat(chat): 实现消息实时推送和学员收藏功能 1 неделя назад
23 измененных файлов с 445 добавлено и 65 удалено
  1. 2 2
      ruoyi-admin/src/main/resources/application-dev.yml
  2. 2 0
      ruoyi-admin/src/main/resources/application.yml
  3. 61 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/miniapp/MiniappCollectionController.java
  4. 5 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/MainStudent.java
  5. 45 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/MainStudentCollection.java
  6. 5 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/bo/MainStudentBo.java
  7. 39 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/bo/MainStudentCollectionBo.java
  8. 47 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/vo/MainStudentCollectionVo.java
  9. 6 1
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/vo/MainStudentVo.java
  10. 12 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/mapper/MainStudentCollectionMapper.java
  11. 32 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IMainStudentCollectionService.java
  12. 0 12
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IPaymentConfigService.java
  13. 14 4
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/CsMessageServiceImpl.java
  14. 80 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/MainStudentCollectionServiceImpl.java
  15. 5 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/MainStudentServiceImpl.java
  16. 0 44
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/PaymentConfigServiceImpl.java
  17. 0 1
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/PaymentServiceImpl.java
  18. 0 1
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/WithdrawServiceImpl.java
  19. 24 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/PaymentConfigBo.java
  20. 27 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/PaymentConfigVo.java
  21. 9 0
      script/sql/add_intention_companies_field.sql
  22. 13 0
      sql/collection.sql
  23. 17 0
      test_mock_positions.sql

+ 2 - 2
ruoyi-admin/src/main/resources/application-dev.yml

@@ -96,8 +96,8 @@ spring:
 spring.data:
   redis:
     # 地址
-    host: 192.168.194.130
-    password: 123456
+    host: localhost
+#    password: 123456
     # 端口,默认为6379
     port: 6379
     # 数据库索引

+ 2 - 0
ruoyi-admin/src/main/resources/application.yml

@@ -37,6 +37,8 @@ logging:
     org.springframework: warn
     org.mybatis.spring.mapper: error
     org.apache.fury: warn
+    com.baomidou.mybatisplus: DEBUG   # 输出框架本身的日志
+    com.example.mapper: DEBUG         # 输出你的 Mapper 包下的 SQL 日志
   config: classpath:logback-plus.xml
 
 # 用户配置

+ 61 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/miniapp/MiniappCollectionController.java

@@ -0,0 +1,61 @@
+package org.dromara.main.controller.miniapp;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.main.domain.bo.MainStudentCollectionBo;
+import org.dromara.main.domain.vo.MainStudentCollectionVo;
+import org.dromara.main.service.IMainStudentCollectionService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 小程序收藏接口
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/miniapp/collection")
+public class MiniappCollectionController extends BaseController {
+
+    private final IMainStudentCollectionService collectionService;
+
+    /**
+     * 查询收藏列表
+     */
+    @SaIgnore
+    @GetMapping("/list")
+    public TableDataInfo<MainStudentCollectionVo> list(MainStudentCollectionBo bo, PageQuery pageQuery) {
+        return collectionService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 添加收藏
+     */
+    @SaIgnore
+    @PostMapping
+    public R<Void> add(@RequestBody MainStudentCollectionBo bo) {
+        return toAjax(collectionService.insertByBo(bo));
+    }
+
+    /**
+     * 取消收藏
+     */
+    @SaIgnore
+    @DeleteMapping("/{id}")
+    public R<Void> remove(@PathVariable Long id) {
+        return toAjax(collectionService.deleteById(id));
+    }
+
+    /**
+     * 检查是否已收藏
+     */
+    @SaIgnore
+    @GetMapping("/check")
+    public R<MainStudentCollectionVo> check(Long studentId, Long targetId, String type) {
+        return R.ok(collectionService.checkCollection(studentId, targetId, type));
+    }
+}

+ 5 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/MainStudent.java

@@ -78,6 +78,11 @@ public class MainStudent extends BaseEntity {
      */
     private String jobIntention;
 
+    /**
+     * 意向公司列表(公司名称,逗号分隔)
+     */
+    private String intentionCompanies;
+
     /**
      * 建议类型(1全职 2实习 3兼职)
      */

+ 45 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/MainStudentCollection.java

@@ -0,0 +1,45 @@
+package org.dromara.main.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import java.io.Serial;
+
+/**
+ * 学员收藏对象 main_student_collection
+ *
+ * @author Cascade
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("main_student_collection")
+public class MainStudentCollection extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 学员ID
+     */
+    private Long studentId;
+
+    /**
+     * 收藏目标ID(岗位ID/测评ID)
+     */
+    private Long targetId;
+
+    /**
+     * 收藏类型(job:岗位, assessment:测评)
+     */
+    private String type;
+
+}

+ 5 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/bo/MainStudentBo.java

@@ -74,6 +74,11 @@ public class MainStudentBo extends BaseEntity {
      */
     private String jobIntention;
 
+    /**
+     * 意向公司列表(公司名称,逗号分隔)
+     */
+    private String intentionCompanies;
+
     /**
      * 建议类型(1全职 2实习 3兼职)
      */

+ 39 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/bo/MainStudentCollectionBo.java

@@ -0,0 +1,39 @@
+package org.dromara.main.domain.bo;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import java.io.Serial;
+
+/**
+ * 学员收藏业务对象 main_student_collection
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class MainStudentCollectionBo extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 学员ID
+     */
+    private Long studentId;
+
+    /**
+     * 收藏目标ID(岗位ID/测评ID)
+     */
+    private Long targetId;
+
+    /**
+     * 收藏类型(job:岗位, assessment:测评)
+     */
+    private String type;
+
+}

+ 47 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/vo/MainStudentCollectionVo.java

@@ -0,0 +1,47 @@
+package org.dromara.main.domain.vo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.main.domain.MainStudentCollection;
+
+import java.io.Serial;
+
+/**
+ * 学员收藏视图对象 main_student_collection
+ */
+@Data
+@AutoMapper(target = MainStudentCollection.class)
+@EqualsAndHashCode(callSuper = true)
+public class MainStudentCollectionVo extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 学员ID
+     */
+    private Long studentId;
+
+    /**
+     * 收藏目标ID(岗位ID/测评ID)
+     */
+    private Long targetId;
+
+    /**
+     * 收藏类型(job:岗位, assessment:测评)
+     */
+    private String type;
+
+    /**
+     * 目标详情数据(岗位详情或测评详情)
+     */
+    private Object targetData;
+
+}

+ 6 - 1
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/vo/MainStudentVo.java

@@ -66,7 +66,7 @@ public class MainStudentVo implements Serializable {
      */
     private Long avatar;
 
-    @Translation(type=TransConstant.OSS_ID_TO_URL)
+    @Translation(type=TransConstant.OSS_ID_TO_URL,mapper="avatar")
     private String avatarUrl;
 
     /**
@@ -92,6 +92,11 @@ public class MainStudentVo implements Serializable {
      */
     private String jobIntention;
 
+    /**
+     * 意向公司列表(公司名称,逗号分隔)
+     */
+    private String intentionCompanies;
+
     /**
      * 建议类型(1全职 2实习 3兼职)
      */

+ 12 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/mapper/MainStudentCollectionMapper.java

@@ -0,0 +1,12 @@
+package org.dromara.main.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.main.domain.MainStudentCollection;
+import org.dromara.main.domain.vo.MainStudentCollectionVo;
+
+/**
+ * 学员收藏Mapper接口
+ */
+public interface MainStudentCollectionMapper extends BaseMapperPlus<MainStudentCollection, MainStudentCollectionVo> {
+
+}

+ 32 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IMainStudentCollectionService.java

@@ -0,0 +1,32 @@
+package org.dromara.main.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.main.domain.bo.MainStudentCollectionBo;
+import org.dromara.main.domain.vo.MainStudentCollectionVo;
+
+/**
+ * 学员收藏服务接口
+ */
+public interface IMainStudentCollectionService {
+
+    /**
+     * 查询学员收藏列表
+     */
+    TableDataInfo<MainStudentCollectionVo> queryPageList(MainStudentCollectionBo bo, PageQuery pageQuery);
+
+    /**
+     * 新增学员收藏
+     */
+    Boolean insertByBo(MainStudentCollectionBo bo);
+
+    /**
+     * 取消收藏
+     */
+    Boolean deleteById(Long id);
+
+    /**
+     * 检查是否已收藏
+     */
+    MainStudentCollectionVo checkCollection(Long studentId, Long targetId, String type);
+}

+ 0 - 12
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IPaymentConfigService.java

@@ -1,12 +0,0 @@
-package org.dromara.main.service;
-
-import org.dromara.main.domain.PaymentConfig;
-
-public interface IPaymentConfigService {
-
-    PaymentConfig getEnabledAlipayConfig();
-
-    PaymentConfig getEnabledReceiveConfig();
-
-    PaymentConfig getEnabledTransferConfig();
-}

+ 14 - 4
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/CsMessageServiceImpl.java

@@ -24,6 +24,7 @@ import org.dromara.main.mapper.CsSessionMapper;
 import org.dromara.main.mapper.MainCompanyApplyMapper;
 import org.dromara.main.service.ICsMessageService;
 import org.dromara.main.service.ICsSessionService;
+import org.springframework.messaging.simp.SimpMessagingTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
@@ -53,6 +54,7 @@ public class CsMessageServiceImpl implements ICsMessageService {
     private final SysUserMapper sysUserMapper;
     private final ICsSessionService sessionService;
     private final Converter converter;
+    private final SimpMessagingTemplate messagingTemplate;
 
     @Override
     public TableDataInfo<CsMessageVo> queryHistoryMessages(Long sessionId, Long beforeMsgId, PageQuery pageQuery) {
@@ -90,7 +92,9 @@ public class CsMessageServiceImpl implements ICsMessageService {
         sessionService.updateLastMessage(bo.getSessionId(),
             StrUtil.sub(bo.getContent(), 0, 100));
 
-        return converter.convert(message, CsMessageVo.class);
+        CsMessageVo vo = converter.convert(message, CsMessageVo.class);
+        messagingTemplate.convertAndSend("/topic/session/" + bo.getSessionId(), vo);
+        return vo;
     }
 
     @Override
@@ -127,7 +131,9 @@ public class CsMessageServiceImpl implements ICsMessageService {
             baseMapper.insert(message);
             sessionService.updateLastMessage(sessionId, "[图片]");
 
-            return converter.convert(message, CsMessageVo.class);
+            CsMessageVo vo = converter.convert(message, CsMessageVo.class);
+            messagingTemplate.convertAndSend("/topic/session/" + sessionId, vo);
+            return vo;
         } catch (Exception e) {
             throw new RuntimeException("上传图片失败: " + e.getMessage(), e);
         }
@@ -167,7 +173,9 @@ public class CsMessageServiceImpl implements ICsMessageService {
             baseMapper.insert(message);
             sessionService.updateLastMessage(sessionId, "[文件]" + fileName);
 
-            return converter.convert(message, CsMessageVo.class);
+            CsMessageVo vo = converter.convert(message, CsMessageVo.class);
+            messagingTemplate.convertAndSend("/topic/session/" + sessionId, vo);
+            return vo;
         } catch (Exception e) {
             throw new RuntimeException("上传文件失败: " + e.getMessage(), e);
         }
@@ -191,7 +199,9 @@ public class CsMessageServiceImpl implements ICsMessageService {
         baseMapper.insert(message);
         sessionService.updateLastMessage(bo.getSessionId(), "[岗位推荐]");
 
-        return converter.convert(message, CsMessageVo.class);
+        CsMessageVo vo = converter.convert(message, CsMessageVo.class);
+        messagingTemplate.convertAndSend("/topic/session/" + bo.getSessionId(), vo);
+        return vo;
     }
 
     @Override

+ 80 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/MainStudentCollectionServiceImpl.java

@@ -0,0 +1,80 @@
+package org.dromara.main.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
+import cn.hutool.core.util.ObjectUtil;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.main.domain.MainStudentCollection;
+import org.dromara.main.domain.bo.MainStudentCollectionBo;
+import org.dromara.main.domain.vo.MainStudentCollectionVo;
+import org.dromara.main.mapper.MainStudentCollectionMapper;
+import org.dromara.main.mapper.MainPositionMapper;
+import org.dromara.main.mapper.MainExamEvaluationMapper;
+import org.dromara.main.service.IMainStudentCollectionService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@RequiredArgsConstructor
+@Service
+public class MainStudentCollectionServiceImpl implements IMainStudentCollectionService {
+
+    private final MainStudentCollectionMapper baseMapper;
+    private final MainPositionMapper positionMapper;
+    private final MainExamEvaluationMapper assessmentMapper;
+
+    @Override
+    public TableDataInfo<MainStudentCollectionVo> queryPageList(MainStudentCollectionBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<MainStudentCollection> lqw = Wrappers.lambdaQuery();
+        lqw.eq(ObjectUtil.isNotNull(bo.getStudentId()), MainStudentCollection::getStudentId, bo.getStudentId());
+        lqw.eq(ObjectUtil.isNotNull(bo.getType()), MainStudentCollection::getType, bo.getType());
+        lqw.orderByDesc(MainStudentCollection::getCreateTime);
+
+        Page<MainStudentCollectionVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        List<MainStudentCollectionVo> records = result.getRecords();
+
+        // 填充目标数据
+        for (MainStudentCollectionVo record : records) {
+            if ("job".equals(record.getType())) {
+                record.setTargetData(positionMapper.selectVoById(record.getTargetId()));
+            } else if ("assessment".equals(record.getType())) {
+                record.setTargetData(assessmentMapper.selectVoById(record.getTargetId()));
+            }
+        }
+
+        return TableDataInfo.build(result);
+    }
+
+    @Override
+    public Boolean insertByBo(MainStudentCollectionBo bo) {
+        // 先检查是否已收藏
+        LambdaQueryWrapper<MainStudentCollection> lqw = Wrappers.lambdaQuery();
+        lqw.eq(MainStudentCollection::getStudentId, bo.getStudentId())
+           .eq(MainStudentCollection::getTargetId, bo.getTargetId())
+           .eq(MainStudentCollection::getType, bo.getType());
+        if (baseMapper.exists(lqw)) {
+            return true; // 已存在视为成功
+        }
+
+        MainStudentCollection add = BeanUtil.toBean(bo, MainStudentCollection.class);
+        return baseMapper.insert(add) > 0;
+    }
+
+    @Override
+    public Boolean deleteById(Long id) {
+        return baseMapper.deleteById(id) > 0;
+    }
+
+    @Override
+    public MainStudentCollectionVo checkCollection(Long studentId, Long targetId, String type) {
+        LambdaQueryWrapper<MainStudentCollection> lqw = Wrappers.lambdaQuery();
+        lqw.eq(MainStudentCollection::getStudentId, studentId)
+           .eq(MainStudentCollection::getTargetId, targetId)
+           .eq(MainStudentCollection::getType, type);
+        return baseMapper.selectVoOne(lqw);
+    }
+}

+ 5 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/MainStudentServiceImpl.java

@@ -222,6 +222,11 @@ public class MainStudentServiceImpl implements IMainStudentService {
         result.setMobile(student.getMobile());
         result.setName(student.getName());
         result.setIsNewUser(isNewUser);
+        // 获取完整的学员信息以获取头像URL
+        MainStudentVo studentVo = baseMapper.selectVoById(student.getId());
+        if (studentVo != null) {
+            result.setAvatarUrl(studentVo.getAvatarUrl());
+        }
         return result;
     }
 }

+ 0 - 44
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/PaymentConfigServiceImpl.java

@@ -1,44 +0,0 @@
-package org.dromara.main.service.impl;
-
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import lombok.RequiredArgsConstructor;
-import org.dromara.main.domain.PaymentConfig;
-import org.dromara.main.mapper.PaymentConfigMapper;
-import org.dromara.main.service.IPaymentConfigService;
-import org.springframework.stereotype.Service;
-
-@RequiredArgsConstructor
-@Service
-public class PaymentConfigServiceImpl implements IPaymentConfigService {
-
-    private final PaymentConfigMapper paymentConfigMapper;
-
-    @Override
-    public PaymentConfig getEnabledAlipayConfig() {
-        return getEnabledReceiveConfig();
-    }
-
-    @Override
-    public PaymentConfig getEnabledReceiveConfig() {
-        return paymentConfigMapper.selectOne(
-            Wrappers.<PaymentConfig>lambdaQuery()
-                .eq(PaymentConfig::getConfigType, 1)
-                .eq(PaymentConfig::getPaymentType, 1)
-                .eq(PaymentConfig::getIsEnabled, 1)
-                .orderByDesc(PaymentConfig::getCreateTime)
-                .last("limit 1")
-        );
-    }
-
-    @Override
-    public PaymentConfig getEnabledTransferConfig() {
-        return paymentConfigMapper.selectOne(
-            Wrappers.<PaymentConfig>lambdaQuery()
-                .eq(PaymentConfig::getConfigType, 2)
-                .eq(PaymentConfig::getPaymentType, 1)
-                .eq(PaymentConfig::getIsEnabled, 1)
-                .orderByDesc(PaymentConfig::getCreateTime)
-                .last("limit 1")
-        );
-    }
-}

+ 0 - 1
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/PaymentServiceImpl.java

@@ -20,7 +20,6 @@ import org.dromara.main.domain.vo.PaymentVo;
 import org.dromara.main.mapper.MainBackOrderMapper;
 import org.dromara.main.mapper.MainOrderMapper;
 import org.dromara.main.mapper.PaymentMapper;
-import org.dromara.main.service.IPaymentConfigService;
 import org.dromara.main.service.IPaymentService;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;

+ 0 - 1
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/WithdrawServiceImpl.java

@@ -28,7 +28,6 @@ import org.dromara.main.domain.vo.WithdrawVo;
 import org.dromara.main.mapper.CompanyAccountFlowMapper;
 import org.dromara.main.mapper.WithdrawAccountMapper;
 import org.dromara.main.mapper.WithdrawMapper;
-import org.dromara.main.service.IPaymentConfigService;
 import org.dromara.main.service.IWithdrawService;
 import org.dromara.system.domain.SysTenant;
 import org.dromara.system.domain.vo.SysTenantVo;

+ 24 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/PaymentConfigBo.java

@@ -0,0 +1,24 @@
+package org.dromara.system.domain.bo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 支付配置BO
+ */
+@Data
+public class PaymentConfigBo {
+
+    // 微信支付配置
+    private String mchId;
+    private String apiV3Key;
+    private String notifyUrl;
+
+    // 微信支付公钥配置(新商户需要)
+    private String publicKeyId;
+
+    // 价格配置
+    private BigDecimal shortPrice;
+    private BigDecimal strongPrice;
+}

+ 27 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/PaymentConfigVo.java

@@ -0,0 +1,27 @@
+package org.dromara.system.domain.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 支付配置VO
+ */
+@Data
+public class PaymentConfigVo {
+
+    // 微信支付配置
+    private String mchId;
+    private String apiV3Key;
+    private String notifyUrl;
+    private Boolean privateKeyUploaded;
+    private Boolean certUploaded;
+
+    // 微信支付公钥配置(新商户需要)
+    private String publicKeyId;
+    private Boolean publicKeyUploaded;
+
+    // 价格配置
+    private BigDecimal shortPrice;
+    private BigDecimal strongPrice;
+}

+ 9 - 0
script/sql/add_intention_companies_field.sql

@@ -0,0 +1,9 @@
+-- 为 main_student 表添加意向公司字段
+-- 执行日期: 2026-04-07
+
+ALTER TABLE `main_student` 
+ADD COLUMN `intention_companies` varchar(500) DEFAULT '' COMMENT '意向公司列表(公司名称,逗号分隔)' AFTER `job_intention`;
+
+-- 更新说明:
+-- job_intention: 存储求职意向类型(如: 审计,咨询,税务)
+-- intention_companies: 存储意向公司名称列表(如: 德勤,普华永道,毕马威)

+ 13 - 0
sql/collection.sql

@@ -0,0 +1,13 @@
+-- 1. 学员收藏表
+CREATE TABLE `main_student_collection` (
+  `id` bigint(20) NOT NULL COMMENT '主键',
+  `student_id` bigint(20) NOT NULL COMMENT '学员ID',
+  `target_id` bigint(20) NOT NULL COMMENT '收藏目标ID(岗位ID/测评ID)',
+  `type` varchar(20) NOT NULL COMMENT '收藏类型(job:岗位, assessment:测评)',
+  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+  `create_by` varchar(64) DEFAULT NULL COMMENT '创建者',
+  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+  `update_by` varchar(64) DEFAULT NULL COMMENT '更新者',
+  PRIMARY KEY (`id`),
+  KEY `idx_student_type` (`student_id`,`type`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学员收藏表';

+ 17 - 0
test_mock_positions.sql

@@ -0,0 +1,17 @@
+INSERT INTO `main_position` (
+  `id`, `tenant_id`, `post_name`, `post_description`, `work_province`, `work_city`, 
+  `post_type`, `education_requirement`, `school_requirement`, `grade_requirement`, 
+  `salary_range`, `recruit_num`, `is_urgent`, `create_time`, `create_by`, `del_flag`
+) VALUES 
+(
+  900000001, '000000', '高级审计经理', '负责审计项目统筹和团队管理,有丰富的审计经验。', '浙江省', '杭州市', 
+  '全职', '本科', '双一流', '5-10年', '20-30K', 2, 0, NOW(), 'admin', '0'
+),
+(
+  900000002, '000000', '审计实习生', '协助完成基础审计底稿,学习财务审计流程,表现优异可转正。', '浙江省', '杭州市', 
+  '实习', '本科', '不限', '经验不限', '3-5K', 5, 1, NOW(), 'admin', '0'
+),
+(
+  900000003, '000000', '驻场兼职财务助理', '周末双休兼职,处理企业日常财务票据与报销整理。', '浙江省', '宁波市', 
+  '兼职', '大专', '不限', '3年及以下', '150-200/天', 3, 0, NOW(), 'admin', '0'
+);