Compare commits

...

3 Commits

Author SHA1 Message Date
577732344@qq.com
d144992bb0 update 2025-09-23 10:58:36 +08:00
577732344@qq.com
1039e8fcdb update 2025-09-23 10:56:48 +08:00
577732344@qq.com
c23fc9f9f5 update 2025-09-23 10:54:46 +08:00
44 changed files with 662 additions and 1468 deletions

View File

@@ -1,46 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ruoyi</artifactId>
<groupId>com.ruoyi</groupId>
<version>3.8.8</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ruoyi-abuwx</artifactId>
<description>微信小程序</description>
<dependencies>
<!-- 通用工具 -->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common</artifactId>
</dependency>
<!-- 通用工具 -->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-system</artifactId>
</dependency>
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-framework</artifactId>
</dependency>
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.31</version>
</dependency>
</dependencies>
</project>

View File

@@ -1,104 +0,0 @@
package com.ruoyi.abuwx.controller;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.abuwx.domain.AbucoderWxuser;
import com.ruoyi.abuwx.service.IAbucoderWxuserService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 微信用户Controller
*
* @author 阿卜Coder QQ932696181
* @date 2022-06-26
*/
@RestController
@RequestMapping("/abuwx/wxuser")
public class AbucoderWxuserController extends BaseController
{
@Autowired
private IAbucoderWxuserService abucoderWxuserService;
/**
* 查询微信用户列表
*/
@PreAuthorize("@ss.hasPermi('abuwx:wxuser:list')")
@GetMapping("/list")
public TableDataInfo list(AbucoderWxuser abucoderWxuser)
{
startPage();
List<AbucoderWxuser> list = abucoderWxuserService.selectAbucoderWxuserList(abucoderWxuser);
return getDataTable(list);
}
/**
* 导出微信用户列表
*/
@PreAuthorize("@ss.hasPermi('abuwx:wxuser:export')")
@Log(title = "微信用户", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, AbucoderWxuser abucoderWxuser)
{
List<AbucoderWxuser> list = abucoderWxuserService.selectAbucoderWxuserList(abucoderWxuser);
ExcelUtil<AbucoderWxuser> util = new ExcelUtil<AbucoderWxuser>(AbucoderWxuser.class);
util.exportExcel(response, list, "微信用户数据");
}
/**
* 获取微信用户详细信息
*/
@PreAuthorize("@ss.hasPermi('abuwx:wxuser:query')")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id)
{
return AjaxResult.success(abucoderWxuserService.selectAbucoderWxuserById(id));
}
/**
* 新增微信用户
*/
@PreAuthorize("@ss.hasPermi('abuwx:wxuser:add')")
@Log(title = "微信用户", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody AbucoderWxuser abucoderWxuser)
{
return toAjax(abucoderWxuserService.insertAbucoderWxuser(abucoderWxuser));
}
/**
* 修改微信用户
*/
@PreAuthorize("@ss.hasPermi('abuwx:wxuser:edit')")
@Log(title = "微信用户", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody AbucoderWxuser abucoderWxuser)
{
return toAjax(abucoderWxuserService.updateAbucoderWxuser(abucoderWxuser));
}
/**
* 删除微信用户
*/
@PreAuthorize("@ss.hasPermi('abuwx:wxuser:remove')")
@Log(title = "微信用户", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids)
{
return toAjax(abucoderWxuserService.deleteAbucoderWxuserByIds(ids));
}
}

View File

@@ -1,30 +0,0 @@
package com.ruoyi.abuwx.domain;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import lombok.Data;
@Data
public class AbucoderWxuser extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** ID */
private Long id;
/** 微信名称 */
@Excel(name = "微信名称")
private String nickname;
/** 头像 */
@Excel(name = "头像")
private String avatar;
/** OpenID */
@Excel(name = "OpenID")
private String openid;
/** 性别 */
@Excel(name = "性别")
private Integer gender;
}

View File

@@ -1,68 +0,0 @@
package com.ruoyi.abuwx.mapper;
import java.util.List;
import com.ruoyi.abuwx.domain.AbucoderWxuser;
/**
* 微信用户Mapper接口
*
* @author 阿卜Coder QQ932696181
* @date 2022-06-26
*/
public interface AbucoderWxuserMapper
{
/**
* 查询微信用户
*
* @param id 微信用户主键
* @return 微信用户
*/
public AbucoderWxuser selectAbucoderWxuserById(Long id);
/**
* 查询微信用户列表
*
* @param abucoderWxuser 微信用户
* @return 微信用户集合
*/
public List<AbucoderWxuser> selectAbucoderWxuserList(AbucoderWxuser abucoderWxuser);
/**
* 新增微信用户
*
* @param abucoderWxuser 微信用户
* @return 结果
*/
public int insertAbucoderWxuser(AbucoderWxuser abucoderWxuser);
/**
* 修改微信用户
*
* @param abucoderWxuser 微信用户
* @return 结果
*/
public int updateAbucoderWxuser(AbucoderWxuser abucoderWxuser);
/**
* 删除微信用户
*
* @param id 微信用户主键
* @return 结果
*/
public int deleteAbucoderWxuserById(Long id);
/**
* 批量删除微信用户
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteAbucoderWxuserByIds(Long[] ids);
/**
* 通过OpenID查询微信用户信息
* @param openid
* @return
*/
public AbucoderWxuser selectAbucoderWxuserOpenID(String openid);
}

View File

@@ -1,68 +0,0 @@
package com.ruoyi.abuwx.service;
import java.util.List;
import com.ruoyi.abuwx.domain.AbucoderWxuser;
/**
* 微信用户Service接口
*
* @author 阿卜Coder QQ932696181
* @date 2022-06-26
*/
public interface IAbucoderWxuserService
{
/**
* 查询微信用户
*
* @param id 微信用户主键
* @return 微信用户
*/
public AbucoderWxuser selectAbucoderWxuserById(Long id);
/**
* 查询微信用户列表
*
* @param abucoderWxuser 微信用户
* @return 微信用户集合
*/
public List<AbucoderWxuser> selectAbucoderWxuserList(AbucoderWxuser abucoderWxuser);
/**
* 新增微信用户
*
* @param abucoderWxuser 微信用户
* @return 结果
*/
public int insertAbucoderWxuser(AbucoderWxuser abucoderWxuser);
/**
* 修改微信用户
*
* @param abucoderWxuser 微信用户
* @return 结果
*/
public int updateAbucoderWxuser(AbucoderWxuser abucoderWxuser);
/**
* 批量删除微信用户
*
* @param ids 需要删除的微信用户主键集合
* @return 结果
*/
public int deleteAbucoderWxuserByIds(Long[] ids);
/**
* 删除微信用户信息
*
* @param id 微信用户主键
* @return 结果
*/
public int deleteAbucoderWxuserById(Long id);
/**
* 通过OpenID查询微信用户信息
* @param openid
* @return
*/
public AbucoderWxuser selectAbucoderWxuserOpenID(String openid);
}

View File

@@ -1,106 +0,0 @@
package com.ruoyi.abuwx.service.impl;
import java.util.List;
import com.ruoyi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.abuwx.mapper.AbucoderWxuserMapper;
import com.ruoyi.abuwx.domain.AbucoderWxuser;
import com.ruoyi.abuwx.service.IAbucoderWxuserService;
/**
* 微信用户Service业务层处理
*
* @author 阿卜Coder QQ932696181
* @date 2022-06-26
*/
@Service
public class AbucoderWxuserServiceImpl implements IAbucoderWxuserService
{
@Autowired
private AbucoderWxuserMapper abucoderWxuserMapper;
/**
* 查询微信用户
*
* @param id 微信用户主键
* @return 微信用户
*/
@Override
public AbucoderWxuser selectAbucoderWxuserById(Long id)
{
return abucoderWxuserMapper.selectAbucoderWxuserById(id);
}
/**
* 查询微信用户列表
*
* @param abucoderWxuser 微信用户
* @return 微信用户
*/
@Override
public List<AbucoderWxuser> selectAbucoderWxuserList(AbucoderWxuser abucoderWxuser)
{
return abucoderWxuserMapper.selectAbucoderWxuserList(abucoderWxuser);
}
/**
* 新增微信用户
*
* @param abucoderWxuser 微信用户
* @return 结果
*/
@Override
public int insertAbucoderWxuser(AbucoderWxuser abucoderWxuser)
{
abucoderWxuser.setCreateTime(DateUtils.getNowDate());
return abucoderWxuserMapper.insertAbucoderWxuser(abucoderWxuser);
}
/**
* 修改微信用户
*
* @param abucoderWxuser 微信用户
* @return 结果
*/
@Override
public int updateAbucoderWxuser(AbucoderWxuser abucoderWxuser)
{
abucoderWxuser.setUpdateTime(DateUtils.getNowDate());
return abucoderWxuserMapper.updateAbucoderWxuser(abucoderWxuser);
}
/**
* 批量删除微信用户
*
* @param ids 需要删除的微信用户主键
* @return 结果
*/
@Override
public int deleteAbucoderWxuserByIds(Long[] ids)
{
return abucoderWxuserMapper.deleteAbucoderWxuserByIds(ids);
}
/**
* 删除微信用户信息
*
* @param id 微信用户主键
* @return 结果
*/
@Override
public int deleteAbucoderWxuserById(Long id)
{
return abucoderWxuserMapper.deleteAbucoderWxuserById(id);
}
/**
* 通过OpenID查询微信用户信息
* @param openid
* @return
*/
@Override
public AbucoderWxuser selectAbucoderWxuserOpenID(String openid) {
return abucoderWxuserMapper.selectAbucoderWxuserOpenID(openid);
}
}

View File

@@ -1,129 +0,0 @@
package com.ruoyi.abuwxapi;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.abuwx.domain.AbucoderWxuser;
import com.ruoyi.abuwx.service.IAbucoderWxuserService;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.common.utils.http.HttpUtils;
import com.ruoyi.framework.config.ServerConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@RestController
@RequestMapping("/wxapi/")
public class WxLoginController {
private static final Logger log = LoggerFactory.getLogger(WxLoginController.class);
@Autowired
private IAbucoderWxuserService iAbucoderWxuserService;
@Autowired
private ServerConfig serverConfig;
/**
* 你自己的微信小程序APPID
*/
private final static String AppID = "你自己的微信小程序APPID";
/**
* 你自己的微信APP密钥
*/
private final static String AppSecret = "你自己的微信APP密钥";
/**
* 登录时获取的 code微信官方提供的临时凭证
* @param object
* @return
*/
@PostMapping("/wxlogin")
public AjaxResult wxLogin(@RequestBody JSONObject object){
//微信官方提供的微信小程序登录授权时使用的URL地址
String url = "https://api.weixin.qq.com/sns/jscode2session";
log.info("微信登录,传入参数:"+object);
/**
* 拼接需要的参数
* appid = AppID 你自己的微信小程序APPID
* js_code = AppSecret 你自己的微信APP密钥
* grant_type=authorization_code = code 微信官方提供的临时凭证
*/
String params = StrUtil.format("appid={}&secret={}&js_code={}&grant_type=authorization_code", AppID, AppSecret, object.get("code"));
//开始发起网络请求,若依管理系统自带网络请求工具,直接使用即可
String res = HttpUtils.sendGet(url,params);
JSONObject jsonObject = JSON.parseObject(res);
String openid = (String) jsonObject.get("openid");
if (StrUtil.isEmpty(openid)) {
return AjaxResult.error("未获取到openid");
}
/**先通过openid来查询是否存在*/
AbucoderWxuser abucoderWxuser = iAbucoderWxuserService.selectAbucoderWxuserOpenID(openid);
if (abucoderWxuser == null){
/**如果不存在就插入到我们的数据库里*/
AbucoderWxuser wxuser = new AbucoderWxuser();
wxuser.setOpenid(openid);
wxuser.setCreateTime(DateUtils.getNowDate());
iAbucoderWxuserService.insertAbucoderWxuser(wxuser);
/**返回结果集到前段*/
return AjaxResult.success(wxuser);
}else {
/**返回结果集到前段*/
return AjaxResult.success(abucoderWxuser);
}
}
@PostMapping("/upload")
@ResponseBody
public AjaxResult uploadFile(MultipartFile file) throws Exception
{
System.out.println(file);
try
{
// 上传文件路径
String filePath = RuoYiConfig.getUploadPath();
// 上传并返回新文件名称
String fileName = FileUploadUtils.upload(filePath, file);
String url = serverConfig.getUrl() + fileName;
AjaxResult ajax = AjaxResult.success();
ajax.put("url", url);
ajax.put("fileName", fileName);
ajax.put("newFileName", FileUtils.getName(fileName));
ajax.put("originalFilename", file.getOriginalFilename());
return ajax;
}
catch (Exception e)
{
return AjaxResult.error(e.getMessage());
}
}
/**
* 保存昵称与头像信息到用户信息里
* @param object
* @return
*/
@PostMapping("/saveUserInfo")
@ResponseBody
public AjaxResult saveUserInfo(@RequestBody JSONObject object){
System.out.println(object);
AbucoderWxuser abucoderWxuser = iAbucoderWxuserService.selectAbucoderWxuserOpenID(String.valueOf(object.get("openid")));
if (StringUtils.hasLength(String.valueOf(object.get("nickName")))){
abucoderWxuser.setNickname(String.valueOf(object.get("nickName")));
abucoderWxuser.setCreateBy(String.valueOf(object.get("nickName")));
}
if (StringUtils.hasLength(String.valueOf(object.get("avatarUrl")))){
abucoderWxuser.setAvatar(String.valueOf(object.get("avatarUrl")));
}
abucoderWxuser.setUpdateTime(DateUtils.getNowDate());
iAbucoderWxuserService.updateAbucoderWxuser(abucoderWxuser);
//返回前段需要的数据
return AjaxResult.success(abucoderWxuser);
}
}

View File

@@ -1,83 +0,0 @@
<?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.ruoyi.abuwx.mapper.AbucoderBannersMapper">
<resultMap type="AbucoderBanners" id="AbucoderBannersResult">
<result property="id" column="id" />
<result property="bannerTitle" column="banner_title" />
<result property="bannerUrl" column="banner_url" />
<result property="bannerImg" column="banner_img" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<result property="remark" column="remark" />
</resultMap>
<sql id="selectAbucoderBannersVo">
select id, banner_title, banner_url, banner_img, create_by, create_time, update_by, update_time, remark from abucoder_banners
</sql>
<select id="selectAbucoderBannersList" parameterType="AbucoderBanners" resultMap="AbucoderBannersResult">
<include refid="selectAbucoderBannersVo"/>
<where>
</where>
</select>
<select id="selectAbucoderBannersById" parameterType="Long" resultMap="AbucoderBannersResult">
<include refid="selectAbucoderBannersVo"/>
where id = #{id}
</select>
<insert id="insertAbucoderBanners" parameterType="AbucoderBanners" useGeneratedKeys="true" keyProperty="id">
insert into abucoder_banners
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="bannerTitle != null">banner_title,</if>
<if test="bannerUrl != null">banner_url,</if>
<if test="bannerImg != null">banner_img,</if>
<if test="createBy != null">create_by,</if>
<if test="createTime != null">create_time,</if>
<if test="updateBy != null">update_by,</if>
<if test="updateTime != null">update_time,</if>
<if test="remark != null">remark,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="bannerTitle != null">#{bannerTitle},</if>
<if test="bannerUrl != null">#{bannerUrl},</if>
<if test="bannerImg != null">#{bannerImg},</if>
<if test="createBy != null">#{createBy},</if>
<if test="createTime != null">#{createTime},</if>
<if test="updateBy != null">#{updateBy},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="remark != null">#{remark},</if>
</trim>
</insert>
<update id="updateAbucoderBanners" parameterType="AbucoderBanners">
update abucoder_banners
<trim prefix="SET" suffixOverrides=",">
<if test="bannerTitle != null">banner_title = #{bannerTitle},</if>
<if test="bannerUrl != null">banner_url = #{bannerUrl},</if>
<if test="bannerImg != null">banner_img = #{bannerImg},</if>
<if test="createBy != null">create_by = #{createBy},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="remark != null">remark = #{remark},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteAbucoderBannersById" parameterType="Long">
delete from abucoder_banners where id = #{id}
</delete>
<delete id="deleteAbucoderBannersByIds" parameterType="String">
delete from abucoder_banners where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@@ -1,84 +0,0 @@
<?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.ruoyi.abuwx.mapper.AbucoderItemsMapper">
<resultMap type="AbucoderItems" id="AbucoderItemsResult">
<result property="id" column="id" />
<result property="itemName" column="item_name" />
<result property="itemDesc" column="item_desc" />
<result property="itemContent" column="item_content" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<result property="remark" column="remark" />
</resultMap>
<sql id="selectAbucoderItemsVo">
select id, item_name, item_desc, item_content, create_by, create_time, update_by, update_time, remark from abucoder_items
</sql>
<select id="selectAbucoderItemsList" parameterType="AbucoderItems" resultMap="AbucoderItemsResult">
<include refid="selectAbucoderItemsVo"/>
<where>
<if test="itemName != null and itemName != ''"> and item_name like concat('%', #{itemName}, '%')</if>
</where>
</select>
<select id="selectAbucoderItemsById" parameterType="Long" resultMap="AbucoderItemsResult">
<include refid="selectAbucoderItemsVo"/>
where id = #{id}
</select>
<insert id="insertAbucoderItems" parameterType="AbucoderItems" useGeneratedKeys="true" keyProperty="id">
insert into abucoder_items
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="itemName != null">item_name,</if>
<if test="itemDesc != null">item_desc,</if>
<if test="itemContent != null">item_content,</if>
<if test="createBy != null">create_by,</if>
<if test="createTime != null">create_time,</if>
<if test="updateBy != null">update_by,</if>
<if test="updateTime != null">update_time,</if>
<if test="remark != null">remark,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="itemName != null">#{itemName},</if>
<if test="itemDesc != null">#{itemDesc},</if>
<if test="itemContent != null">#{itemContent},</if>
<if test="createBy != null">#{createBy},</if>
<if test="createTime != null">#{createTime},</if>
<if test="updateBy != null">#{updateBy},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="remark != null">#{remark},</if>
</trim>
</insert>
<update id="updateAbucoderItems" parameterType="AbucoderItems">
update abucoder_items
<trim prefix="SET" suffixOverrides=",">
<if test="itemName != null">item_name = #{itemName},</if>
<if test="itemDesc != null">item_desc = #{itemDesc},</if>
<if test="itemContent != null">item_content = #{itemContent},</if>
<if test="createBy != null">create_by = #{createBy},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="remark != null">remark = #{remark},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteAbucoderItemsById" parameterType="Long">
delete from abucoder_items where id = #{id}
</delete>
<delete id="deleteAbucoderItemsByIds" parameterType="String">
delete from abucoder_items where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@@ -1,88 +0,0 @@
<?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.ruoyi.abuwx.mapper.AbucoderProgramsMapper">
<resultMap type="AbucoderPrograms" id="AbucoderProgramsResult">
<result property="id" column="id" />
<result property="programName" column="program_name" />
<result property="programTag" column="program_tag" />
<result property="programImg" column="program_img" />
<result property="programContent" column="program_content" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<result property="remark" column="remark" />
</resultMap>
<sql id="selectAbucoderProgramsVo">
select id, program_name, program_tag, program_img, program_content, create_by, create_time, update_by, update_time, remark from abucoder_programs
</sql>
<select id="selectAbucoderProgramsList" parameterType="AbucoderPrograms" resultMap="AbucoderProgramsResult">
<include refid="selectAbucoderProgramsVo"/>
<where>
<if test="programName != null and programName != ''"> and program_name like concat('%', #{programName}, '%')</if>
</where>
</select>
<select id="selectAbucoderProgramsById" parameterType="Long" resultMap="AbucoderProgramsResult">
<include refid="selectAbucoderProgramsVo"/>
where id = #{id}
</select>
<insert id="insertAbucoderPrograms" parameterType="AbucoderPrograms" useGeneratedKeys="true" keyProperty="id">
insert into abucoder_programs
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="programName != null">program_name,</if>
<if test="programTag != null">program_tag,</if>
<if test="programImg != null">program_img,</if>
<if test="programContent != null">program_content,</if>
<if test="createBy != null">create_by,</if>
<if test="createTime != null">create_time,</if>
<if test="updateBy != null">update_by,</if>
<if test="updateTime != null">update_time,</if>
<if test="remark != null">remark,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="programName != null">#{programName},</if>
<if test="programTag != null">#{programTag},</if>
<if test="programImg != null">#{programImg},</if>
<if test="programContent != null">#{programContent},</if>
<if test="createBy != null">#{createBy},</if>
<if test="createTime != null">#{createTime},</if>
<if test="updateBy != null">#{updateBy},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="remark != null">#{remark},</if>
</trim>
</insert>
<update id="updateAbucoderPrograms" parameterType="AbucoderPrograms">
update abucoder_programs
<trim prefix="SET" suffixOverrides=",">
<if test="programName != null">program_name = #{programName},</if>
<if test="programTag != null">program_tag = #{programTag},</if>
<if test="programImg != null">program_img = #{programImg},</if>
<if test="programContent != null">program_content = #{programContent},</if>
<if test="createBy != null">create_by = #{createBy},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="remark != null">remark = #{remark},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteAbucoderProgramsById" parameterType="Long">
delete from abucoder_programs where id = #{id}
</delete>
<delete id="deleteAbucoderProgramsByIds" parameterType="String">
delete from abucoder_programs where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@@ -1,90 +0,0 @@
<?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.ruoyi.abuwx.mapper.AbucoderWxappConfigMapper">
<resultMap type="AbucoderWxappConfig" id="AbucoderWxappConfigResult">
<result property="id" column="id" />
<result property="appid" column="appid" />
<result property="appSecret" column="app_secret" />
<result property="state" column="state" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<result property="remark" column="remark" />
</resultMap>
<sql id="selectAbucoderWxappConfigVo">
select id, appid, app_secret, state, create_by, create_time, update_by, update_time, remark from abucoder_wxapp_config
</sql>
<select id="selectAbucoderWxappConfigList" parameterType="AbucoderWxappConfig" resultMap="AbucoderWxappConfigResult">
<include refid="selectAbucoderWxappConfigVo"/>
<where>
<if test="appid != null and appid != ''"> and appid = #{appid}</if>
<if test="appSecret != null and appSecret != ''"> and app_secret = #{appSecret}</if>
<if test="state != null "> and state = #{state}</if>
</where>
</select>
<select id="selectAbucoderWxappConfigById" parameterType="Long" resultMap="AbucoderWxappConfigResult">
<include refid="selectAbucoderWxappConfigVo"/>
where id = #{id}
</select>
<select id="selectAbucoderWxappConfig" resultMap="AbucoderWxappConfigResult">
<include refid="selectAbucoderWxappConfigVo"/>
where state = 0
</select>
<insert id="insertAbucoderWxappConfig" parameterType="AbucoderWxappConfig" useGeneratedKeys="true" keyProperty="id">
insert into abucoder_wxapp_config
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="appid != null">appid,</if>
<if test="appSecret != null">app_secret,</if>
<if test="state != null">state,</if>
<if test="createBy != null">create_by,</if>
<if test="createTime != null">create_time,</if>
<if test="updateBy != null">update_by,</if>
<if test="updateTime != null">update_time,</if>
<if test="remark != null">remark,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="appid != null">#{appid},</if>
<if test="appSecret != null">#{appSecret},</if>
<if test="state != null">#{state},</if>
<if test="createBy != null">#{createBy},</if>
<if test="createTime != null">#{createTime},</if>
<if test="updateBy != null">#{updateBy},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="remark != null">#{remark},</if>
</trim>
</insert>
<update id="updateAbucoderWxappConfig" parameterType="AbucoderWxappConfig">
update abucoder_wxapp_config
<trim prefix="SET" suffixOverrides=",">
<if test="appid != null">appid = #{appid},</if>
<if test="appSecret != null">app_secret = #{appSecret},</if>
<if test="state != null">state = #{state},</if>
<if test="createBy != null">create_by = #{createBy},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="remark != null">remark = #{remark},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteAbucoderWxappConfigById" parameterType="Long">
delete from abucoder_wxapp_config where id = #{id}
</delete>
<delete id="deleteAbucoderWxappConfigByIds" parameterType="String">
delete from abucoder_wxapp_config where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@@ -1,93 +0,0 @@
<?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.ruoyi.abuwx.mapper.AbucoderWxuserMapper">
<resultMap type="AbucoderWxuser" id="AbucoderWxuserResult">
<result property="id" column="id" />
<result property="nickname" column="nickname" />
<result property="avatar" column="avatar" />
<result property="openid" column="openid" />
<result property="gender" column="gender" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<result property="remark" column="remark" />
</resultMap>
<sql id="selectAbucoderWxuserVo">
select id, nickname, avatar, openid, gender, create_by, create_time, update_by, update_time, remark from abucoder_wxuser
</sql>
<select id="selectAbucoderWxuserList" parameterType="AbucoderWxuser" resultMap="AbucoderWxuserResult">
<include refid="selectAbucoderWxuserVo"/>
<where>
<if test="openid != null and openid != ''"> and openid = #{openid}</if>
<if test="gender != null "> and gender = #{gender}</if>
</where>
</select>
<select id="selectAbucoderWxuserById" parameterType="Long" resultMap="AbucoderWxuserResult">
<include refid="selectAbucoderWxuserVo"/>
where id = #{id}
</select>
<select id="selectAbucoderWxuserOpenID" resultMap="AbucoderWxuserResult">
<include refid="selectAbucoderWxuserVo"/>
where openid = #{openid}
</select>
<insert id="insertAbucoderWxuser" parameterType="AbucoderWxuser" useGeneratedKeys="true" keyProperty="id">
insert into abucoder_wxuser
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="nickname != null">nickname,</if>
<if test="avatar != null">avatar,</if>
<if test="openid != null">openid,</if>
<if test="gender != null">gender,</if>
<if test="createBy != null">create_by,</if>
<if test="createTime != null">create_time,</if>
<if test="updateBy != null">update_by,</if>
<if test="updateTime != null">update_time,</if>
<if test="remark != null">remark,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="nickname != null">#{nickname},</if>
<if test="avatar != null">#{avatar},</if>
<if test="openid != null">#{openid},</if>
<if test="gender != null">#{gender},</if>
<if test="createBy != null">#{createBy},</if>
<if test="createTime != null">#{createTime},</if>
<if test="updateBy != null">#{updateBy},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="remark != null">#{remark},</if>
</trim>
</insert>
<update id="updateAbucoderWxuser" parameterType="AbucoderWxuser">
update abucoder_wxuser
<trim prefix="SET" suffixOverrides=",">
<if test="nickname != null">nickname = #{nickname},</if>
<if test="avatar != null">avatar = #{avatar},</if>
<if test="openid != null">openid = #{openid},</if>
<if test="gender != null">gender = #{gender},</if>
<if test="createBy != null">create_by = #{createBy},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="remark != null">remark = #{remark},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteAbucoderWxuserById" parameterType="Long">
delete from abucoder_wxuser where id = #{id}
</delete>
<delete id="deleteAbucoderWxuserByIds" parameterType="String">
delete from abucoder_wxuser where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@@ -1,6 +1,5 @@
package com.ruoyi.cms.controller.app;
import com.ruoyi.cms.domain.AppUser;
import com.ruoyi.cms.domain.BussinessDictData;
import com.ruoyi.cms.domain.CommercialArea;
import com.ruoyi.cms.domain.SubwayLine;
@@ -8,22 +7,17 @@ import com.ruoyi.cms.service.*;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.TreeSelect;
import com.ruoyi.common.core.domain.entity.JobTitle;
import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.utils.StringUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import static com.ruoyi.common.utils.PageUtils.startPage;
@RestController
@RequestMapping("/app/common")
@Api(tags = "移动端:常用参数查询")
@@ -73,6 +67,7 @@ public class AppCommonController extends BaseController {
List<BussinessDictData> dictData = iBussinessDictTypeService.selectDictDataByType(dictType);
return success(dictData);
}
@ApiOperation("字段标准")
@GetMapping("/standar/filed")
public AjaxResult standarFiled()
{

View File

@@ -1,7 +1,6 @@
package com.ruoyi.cms.controller.app;
import com.ruoyi.cms.domain.BussinessDictData;
import com.ruoyi.cms.domain.Company;
import com.ruoyi.cms.domain.CompanyCard;
import com.ruoyi.cms.domain.query.LabelQuery;
@@ -9,16 +8,14 @@ import com.ruoyi.cms.mapper.CompanyCardMapper;
import com.ruoyi.cms.service.ICompanyCardService;
import com.ruoyi.cms.service.ICompanyCollectionService;
import com.ruoyi.cms.service.ICompanyService;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.annotation.BussinessLog;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.page.TableSupport;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@@ -46,7 +43,6 @@ public class AppCompanyController extends BaseController
* 获取公司详细信息
*/
@ApiOperation("获取公司详细信息")
@PreAuthorize("@ss.hasPermi('bussiness:company:query')")
@GetMapping(value = "/{companyId}")
public AjaxResult getInfo(@PathVariable("companyId") Long companyId)
{
@@ -55,7 +51,7 @@ public class AppCompanyController extends BaseController
/**
* 用户收藏公司
*/
@Log(title = "用户收藏公司")
@BussinessLog(title = "用户收藏公司")
@PostMapping("/collection/{companyId}")
@ApiOperation("用户收藏公司")
public AjaxResult companyCollection(@PathVariable("companyId") Long companyId)
@@ -66,7 +62,7 @@ public class AppCompanyController extends BaseController
/**
* 用户取消收藏公司
*/
@Log(title = "用户取消收藏公司")
@BussinessLog(title = "用户取消收藏公司")
@DeleteMapping("/collection/{companyId}")
@ApiOperation("用户取消收藏公司")
public AjaxResult companyCancel(@PathVariable("companyId") Long companyId)
@@ -76,7 +72,6 @@ public class AppCompanyController extends BaseController
/**
* 公司下的岗位
*/
@Log(title = "公司下的岗位")
@GetMapping("/job/{companyId}")
@ApiOperation("公司下的岗位")
public TableDataInfo jobCompany(@ApiParam("公司id") @PathVariable Long companyId)
@@ -84,7 +79,6 @@ public class AppCompanyController extends BaseController
startPage();
return getDataTable(companyCollectionService.jobCompany(companyId));
}
@Log(title = "查看企业卡片")
@GetMapping("/card")
@ApiOperation("查看企业卡片")
public TableDataInfo card()
@@ -92,7 +86,7 @@ public class AppCompanyController extends BaseController
startPage();
return getDataTable(companyCardService.cardApp());
}
@Log(title = "收藏企业卡片")
@BussinessLog(title = "收藏企业卡片")
@PutMapping("/card/collection/{companyCardId}")
@ApiOperation("收藏企业卡片")
public AjaxResult cardCollection(@PathVariable Long companyCardId)
@@ -100,7 +94,7 @@ public class AppCompanyController extends BaseController
companyCardService.cardCollection(companyCardId);
return success();
}
@Log(title = "取消收藏企业卡片")
@BussinessLog(title = "取消收藏企业卡片")
@DeleteMapping("/card/collection/{companyCardId}")
@ApiOperation("取消收藏公司卡片")
public AjaxResult cardCancel(@PathVariable Long companyCardId)
@@ -108,7 +102,6 @@ public class AppCompanyController extends BaseController
companyCardService.cardCancel(companyCardId);
return success();
}
@Log(title = "公司招聘的岗位数量")
@GetMapping("/count/{companyId}")
@ApiOperation("公司招聘的岗位数量")
public AjaxResult count(@PathVariable Long companyId)
@@ -116,7 +109,6 @@ public class AppCompanyController extends BaseController
Integer count = companyService.count(companyId);
return success(count);
}
@Log(title = "公司标签下的公司")
@GetMapping("/label")
@ApiOperation("公司标签下的公司")
public TableDataInfo label(LabelQuery labelQuery)
@@ -126,14 +118,5 @@ public class AppCompanyController extends BaseController
List<Company> companyList = companyService.label(companyCard,labelQuery);
return getDataTable(companyList);
}
@GetMapping("/importLabel500")
public void importLabel()
{
companyService.importLabel();
}
@GetMapping("/importLabelBank")
public void importLabelBank()
{
companyService.importLabelBank();
}
}

View File

@@ -4,7 +4,7 @@ package com.ruoyi.cms.controller.app;
import com.ruoyi.cms.domain.JobFair;
import com.ruoyi.cms.service.IFairCollectionService;
import com.ruoyi.cms.service.IJobFairService;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.annotation.BussinessLog;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
@@ -33,7 +33,7 @@ public class AppFairController extends BaseController
/**
* 招聘会列表
*/
@Log(title = "招聘会列表")
@BussinessLog(title = "招聘会列表")
@GetMapping
public TableDataInfo list(JobFair jobFair)
{
@@ -45,7 +45,7 @@ public class AppFairController extends BaseController
/**
* 招聘会详情
*/
@Log(title = "招聘会详情")
@BussinessLog(title = "招聘会详情")
@GetMapping("/{fairId}")
public AjaxResult appDetail(@ApiParam("招聘会id") @PathVariable Long fairId)
{
@@ -55,7 +55,7 @@ public class AppFairController extends BaseController
/**
* 用户收藏招聘会
*/
@Log(title = "用户收藏招聘会")
@BussinessLog(title = "用户收藏招聘会")
@PostMapping("/collection/{fairId}")
public AjaxResult companyCollection(@ApiParam("招聘会id") @PathVariable Long fairId)
{
@@ -65,7 +65,7 @@ public class AppFairController extends BaseController
/**
* 用户取消收藏招聘会
*/
@Log(title = "用户取消收藏招聘会")
@BussinessLog(title = "用户取消收藏招聘会")
@DeleteMapping("/collection/{fairId}")
public AjaxResult companyCancel(@ApiParam("招聘会id") @PathVariable Long fairId)
{

View File

@@ -1,6 +1,7 @@
package com.ruoyi.cms.controller.app;
import com.ruoyi.cms.service.IFileService;
import com.ruoyi.common.annotation.BussinessLog;
import com.ruoyi.common.core.domain.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
@@ -14,6 +15,7 @@ import org.springframework.web.multipart.MultipartFile;
public class AppFileController {
@Autowired
private IFileService fileService;
@BussinessLog(title = "上传文件")
@PostMapping("/upload")
public AjaxResult uploadFile(@RequestParam("file") MultipartFile file, @RequestParam(value = "bussinessId",required = false) Long bussinessId) {
return fileService.uploadFile(file,bussinessId);

View File

@@ -8,6 +8,7 @@ import com.ruoyi.cms.domain.vo.RadarChart;
import com.ruoyi.cms.service.IESJobSearchService;
import com.ruoyi.cms.service.IJobCollectionService;
import com.ruoyi.cms.service.IJobService;
import com.ruoyi.common.annotation.BussinessLog;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
@@ -18,8 +19,9 @@ import io.swagger.annotations.ApiParam;
import org.dromara.easyes.core.biz.EsPageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
import java.util.List;
import java.util.Random;
/**
* 岗位Controller
@@ -39,37 +41,28 @@ public class AppJobController extends BaseController
@Autowired
private IESJobSearchService esJobSearchService;
private Calendar calendar = Calendar.getInstance();
private Date date = new Date();
{
calendar.set(Calendar.YEAR, 2025); // 设置年份
calendar.set(Calendar.MONTH, Calendar.JULY); // 设置月份7月
calendar.set(Calendar.DAY_OF_MONTH, 12); // 设置日期
date = calendar.getTime(); // 转换为Date对象
}
/**
* 查询岗位列表
*/
@ApiOperation("查询岗位列表")
@GetMapping("/list")
public TableDataInfo list(ESJobSearch job, HttpServletRequest request)
public TableDataInfo list(ESJobSearch job)
{
// 打印请求参数
System.out.println("Request Parameters:");
request.getParameterMap().forEach((key, value) -> {
System.out.println(key + " = " + String.join(", ", value));
});
// 打印请求头
System.out.println("Request Headers:");
Enumeration<String> headerNames = request.getHeaderNames();
Iterator<String> iterator = Collections.list(headerNames).iterator();
iterator.forEachRemaining(headerName -> {
System.out.println(headerName + " = " + request.getHeader(headerName));
});
EsPageInfo<ESJobDocument> list = jobService.appList(job);
return getTableDataInfo(list);
return getTableDataInfo2(list,job);
}
private TableDataInfo getTableDataInfo2(EsPageInfo<ESJobDocument> list, ESJobSearch job) {
long total = list.getTotal();
TableDataInfo rspData = new TableDataInfo();
rspData.setCode(200);
rspData.setRows(list.getList());
rspData.setTotal(total > 200 ? 200 : total);
job.setCompany(null);
rspData.setData(job);
return rspData;
}
/**
* 获取5条推荐岗位
*/
@@ -78,12 +71,9 @@ public class AppJobController extends BaseController
public AjaxResult recommend(ESJobSearch esJobSearch)
{
List<ESJobDocument> jobList = jobService.recommend(esJobSearch);
for (ESJobDocument esJobDocument:jobList){
esJobDocument.setPostingDate(date);
}
return success(jobList);
}
@ApiOperation("获取littleVideo")
@ApiOperation("获取短视频")
@GetMapping("/littleVideo")
public AjaxResult littleVideo(ESJobSearch esJobSearch)
{
@@ -91,21 +81,13 @@ public class AppJobController extends BaseController
return success(jobList);
}
@ApiOperation("获取littleVideo")
@ApiOperation("随机获取短视频")
@GetMapping("/littleVideo/random")
public AjaxResult littleVideo(@RequestParam(required = true) String uuid,@RequestParam(required = false) Integer count,@RequestParam(required = false) String jobTitle)
{
List<ESJobDocument> jobList = jobService.littleVideoRandom(uuid,count,jobTitle);
return success(jobList);
}
/**
* 获取5条推荐岗位
*/
@GetMapping("/updateLon")
public void updateLon()
{
jobService.updateLon();
}
/**
* 附件工作
*/
@@ -115,9 +97,6 @@ public class AppJobController extends BaseController
{
EsPageInfo<ESJobDocument> list = esJobSearchService.nearJob(jobQuery);
List<ESJobDocument> jobList = list.getList();
for (ESJobDocument esJobDocument:jobList){
esJobDocument.setPostingDate(date);
}
list.setList(jobList);
return getTableDataInfo(list);
}
@@ -130,9 +109,6 @@ public class AppJobController extends BaseController
{
EsPageInfo<ESJobDocument> list = jobService.countyJobList(job);
List<ESJobDocument> jobList = list.getList();
for (ESJobDocument esJobDocument:jobList){
esJobDocument.setPostingDate(date);
}
list.setList(jobList);
return getTableDataInfo(list);
}
@@ -145,9 +121,6 @@ public class AppJobController extends BaseController
{
EsPageInfo<ESJobDocument> list = jobService.subway(jobQuery);
List<ESJobDocument> jobList = list.getList();
for (ESJobDocument esJobDocument:jobList){
esJobDocument.setPostingDate(date);
}
list.setList(jobList);
return getTableDataInfo(list);
}
@@ -161,9 +134,6 @@ public class AppJobController extends BaseController
{
EsPageInfo<ESJobDocument> list = jobService.commercialArea(jobQuery);
List<ESJobDocument> jobList = list.getList();
for (ESJobDocument esJobDocument:jobList){
esJobDocument.setPostingDate(date);
}
list.setList(jobList);
return getTableDataInfo(list);
}
@@ -175,14 +145,13 @@ public class AppJobController extends BaseController
public AjaxResult getInfo(@PathVariable("jobId") Long jobId)
{
Job job = jobService.selectJobByJobIdApp(jobId);
job.setPostingDate(date);
return success(job);
}
/**
* 用户收藏岗位
*/
@Log(title = "用户收藏岗位")
@BussinessLog(title = "用户收藏岗位")
@PostMapping("/collection/{jobId}")
@ApiOperation("用户收藏")
public AjaxResult jobCollection(@ApiParam("岗位id") @PathVariable Long jobId)
@@ -193,7 +162,7 @@ public class AppJobController extends BaseController
/**
* 用户取消收藏岗位
*/
@Log(title = "用户取消收藏岗位")
@BussinessLog(title = "用户取消收藏岗位")
@DeleteMapping("/collection/{jobId}")
@ApiOperation("用户取消收藏岗位")
public AjaxResult cancel(@ApiParam("岗位id") @PathVariable Long jobId)
@@ -203,38 +172,17 @@ public class AppJobController extends BaseController
/**
* 用户申请岗位
*/
@Log(title = "用户申请岗位")
@BussinessLog(title = "用户申请岗位")
@GetMapping("/apply/{jobId}")
@ApiOperation("用户申请岗位")
public AjaxResult apply(@ApiParam("岗位id") @PathVariable Long jobId)
{
return toAjax(jobCollectionService.apply(jobId));
}
@Log(title = "竞争力分析")
@GetMapping("/competitiveness/{jobId}")
@ApiOperation("竞争力分析")
public AjaxResult competitiveness(@ApiParam("岗位id") @PathVariable Long jobId) {
// Generate random values for the response
Random random = new Random();
// Build radar chart with random values between 60-95
RadarChart radarChart = new RadarChart();
radarChart.setAge(60 + random.nextInt(36)); // 60-95
radarChart.setExperience(60 + random.nextInt(36));
radarChart.setEducation(60 + random.nextInt(36));
radarChart.setSkill(60 + random.nextInt(36));
radarChart.setSalary(60 + random.nextInt(36));
radarChart.setLocation(60 + random.nextInt(36));
// Build response with random values
CompetitivenessResponse response = new CompetitivenessResponse();
response.setTotalApplicants(0); // Always 0 as requested
response.setMatchScore(60 + random.nextInt(41)); // 60-100
response.setRank(1 + random.nextInt(10)); // 1-10
response.setPercentile(random.nextInt(101)); // 0-100
response.setRadarChart(radarChart);
return success(response);
return success(jobCollectionService.competitiveness(jobId));
}
private TableDataInfo getTableDataInfo(EsPageInfo<ESJobDocument> result){
long total = result.getTotal();
@@ -244,45 +192,5 @@ public class AppJobController extends BaseController
rspData.setTotal(total > 200 ? 200 : total);
return rspData;
}
@GetMapping("/import")
public AjaxResult importData()
{
jobService.importData();
return success();
}
@GetMapping("/importRow")
public AjaxResult importRow()
{
jobService.importRow();
return success();
}
@GetMapping("/update")
public AjaxResult update()
{
jobService.updateEs();
return success();
}
@PostMapping("/getWechatUrl")
public AjaxResult getWechatUrl(@RequestBody HashMap<String,String> url)
{
String s = url.get("imgUrl");
return AjaxResult.success(jobService.getWechatUrl(s));
}
@PostMapping("/insert")
public AjaxResult insertTemp(@RequestBody Job job)
{
return AjaxResult.success(jobService.insertTemp(job));
}
@ApiOperation("生成分享的html")
@GetMapping("/htmlGen/{id}")
public AjaxResult htmlGen(@PathVariable(required = true) Long id)
{
String result = jobService.htmlGen(id);
return AjaxResult.success(result);
}
@GetMapping("/fix")
public void fix()
{
jobService.fix();
}
}

View File

@@ -1,15 +1,12 @@
package com.ruoyi.cms.controller.app;
import com.ruoyi.cms.domain.AppUser;
import com.ruoyi.cms.domain.Job;
import com.ruoyi.cms.domain.Notice;
import com.ruoyi.cms.domain.vo.AppNoticeVO;
import com.ruoyi.cms.service.IAppNoticeService;
import com.ruoyi.common.annotation.BussinessLog;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.PageDomain;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.utils.SecurityUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
@@ -17,8 +14,6 @@ import org.springframework.web.bind.annotation.*;
import java.util.List;
import static com.ruoyi.common.utils.PageUtils.startPage;
@RestController
@RequestMapping("/app/notice")
@Api(tags = "移动端:消息")
@@ -43,6 +38,7 @@ public class AppNoticeInfoController extends BaseController {
}
@ApiOperation("系统通知已读")
@PostMapping("/read/sysNotice")
@BussinessLog(title = "系统通知标记已读")
public AjaxResult sysNotice(@RequestParam String id)
{
appNoticeService.sysNotice(id);
@@ -50,6 +46,7 @@ public class AppNoticeInfoController extends BaseController {
}
@ApiOperation("岗位推荐、招聘会已读")
@PostMapping("/read")
@BussinessLog(title = "岗位推荐、招聘会已读标记已读")
public AjaxResult read(@RequestParam String id)
{
appNoticeService.read(id);

View File

@@ -0,0 +1,73 @@
package com.ruoyi.cms.controller.app;
import com.ruoyi.cms.domain.ESJobDocument;
import com.ruoyi.cms.domain.Job;
import com.ruoyi.cms.domain.query.ESJobSearch;
import com.ruoyi.cms.domain.vo.CompetitivenessResponse;
import com.ruoyi.cms.domain.vo.RadarChart;
import com.ruoyi.cms.service.ICompanyService;
import com.ruoyi.cms.service.IESJobSearchService;
import com.ruoyi.cms.service.IJobCollectionService;
import com.ruoyi.cms.service.IJobService;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.dromara.easyes.core.biz.EsPageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Random;
/**
* 岗位Controller
*
* @author lishundong
* @date 2024-09-03
*/
@RestController
@RequestMapping("/app/script")
@Api(tags = "移动端:脚本")
public class AppScriptController extends BaseController
{
@Autowired
private IJobService jobService;
@Autowired
private ICompanyService companyService;
//更新经纬度
@GetMapping("/updateLon")
public void updateLon()
{
jobService.updateLon();
}
//导入数据
@GetMapping("/import")
public AjaxResult importData()
{
jobService.importData();
return success();
}
//导入原始数据
@GetMapping("/importRow")
public AjaxResult importRow(@RequestParam String path)
{
jobService.importRow(path);
return success();
}
// 导入500强
@GetMapping("/importLabel500")
public void importLabel()
{
companyService.importLabel();
}
// 随机导入3个公司到银行标签
@GetMapping("/importLabelBank")
public void importLabelBank()
{
companyService.importLabelBank();
}
}

View File

@@ -0,0 +1,37 @@
package com.ruoyi.cms.controller.app;
import com.alibaba.nls.client.AccessToken;
import com.ruoyi.cms.handler.SpeechRecognizerAI;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* app语音Controller
*
* @author lishundong
* @date 2024-09-03
*/
@RestController
@RequestMapping("/app/speech")
@Api(tags = "移动端:用户相关")
public class AppSpeechController extends BaseController
{
private String appKey = "4lFYn2yPsQymwGu8";
private String id = "LTAI5t9hhSqdDHqwH3RjgyYj";
private String secret = "ni5aW3vxrWouMwcGqJPfh9Uu56PBuv";
private String url = System.getenv().getOrDefault("NLS_GATEWAY_URL", "wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1");
@ApiOperation("统计")
@GetMapping("/getToken")
public AjaxResult getToken()
{
SpeechRecognizerAI recognizerDemo = new SpeechRecognizerAI(appKey, id, secret, url);
AccessToken accessToken = recognizerDemo.getAccessToken();
String token = "wss://nls-gateway.cn-shanghai.aliyuncs.com/ws/v1?appkey="+appKey+"&token="+accessToken.getToken();
return AjaxResult.success(token);
}
}

View File

@@ -6,6 +6,7 @@ import com.ruoyi.cms.domain.Job;
import com.ruoyi.cms.domain.JobFair;
import com.ruoyi.cms.domain.query.MineJobQuery;
import com.ruoyi.cms.service.*;
import com.ruoyi.common.annotation.BussinessLog;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
@@ -46,6 +47,7 @@ public class AppUserController extends BaseController
*/
@ApiOperation("保存简历")
@PostMapping("/resume")
@BussinessLog(title = "保存简历")
public AjaxResult saveResume(@RequestBody AppUser appUser)
{
appUser.setUserId(SecurityUtils.getUserId());

View File

@@ -24,7 +24,7 @@ import java.util.List;
*/
@RestController
@RequestMapping("/cms/operlog")
@Api(tags = "后台App用户日志")
@Api(tags = "后台App用户操作日志")
public class BussinessOperlogController extends BaseController
{
@Autowired

View File

@@ -121,9 +121,9 @@ public class CmsJobController extends BaseController
return success();
}
@GetMapping("/importRow")
public AjaxResult importRow()
public AjaxResult importRow(@RequestParam String path)
{
jobService.importRow();
jobService.importRow(path);
return success();
}
}

View File

@@ -42,7 +42,9 @@ public class CommercialArea extends BaseEntity
@Excel(name = "经度")
@ApiModelProperty("经度")
private BigDecimal longitude;
/** 地址 */
@Excel(name = "地址")
@ApiModelProperty("地址")
private String address;
}

View File

@@ -46,5 +46,5 @@ public class CompanyCard extends BaseEntity
private Integer status;
private Integer cardOrder;
private String description;
private String icon;
}

View File

@@ -16,7 +16,7 @@ import java.util.Date;
/**
* 全文索引 ES数据模型
**/
@IndexName("job_document_gt")
@IndexName("job_document")
@Data
public class ESJobDocument
{

View File

@@ -51,4 +51,6 @@ public class ESJobSearch extends Job
private String salaryDictCode;
private String scaleDictCode;
private String area;
}

View File

@@ -17,9 +17,9 @@ public class SpeechRecognitionWebSocketHandler {
public SpeechRecognitionWebSocketHandler() {
// 初始化语音识别器
String appKey = "LuvNcrddU3PH8Tau";
String id = "LTAI5tRBahK93vPNF1JDVEPA";
String secret = "x95OWb4cV6ccQVtbEJ2Gxm2Uwl2thJ";
String appKey = "4lFYn2yPsQymwGu8";
String id = "LTAI5t9hhSqdDHqwH3RjgyYj";
String secret = "ni5aW3vxrWouMwcGqJPfh9Uu56PBuv";
String url = System.getenv().getOrDefault("NLS_GATEWAY_URL", "wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1");
recognizerDemo = new SpeechRecognizerAI(appKey, id, secret, url);
}
@@ -44,6 +44,7 @@ public class SpeechRecognitionWebSocketHandler {
recognizerDemo.processStream(session, new ByteArrayInputStream(audioData), 16000);
}
/**
* 连接关闭调用的方法
*/

View File

@@ -7,23 +7,24 @@ import com.alibaba.nls.client.protocol.SampleRateEnum;
import com.alibaba.nls.client.protocol.asr.SpeechRecognizer;
import com.alibaba.nls.client.protocol.asr.SpeechRecognizerListener;
import com.alibaba.nls.client.protocol.asr.SpeechRecognizerResponse;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.websocket.Session;
import java.io.IOException;
import java.io.InputStream;
@Data
public class SpeechRecognizerAI {
private static final Logger logger = LoggerFactory.getLogger(SpeechRecognizerAI.class);
private String appKey;
private NlsClient client;
private AccessToken accessToken;
public SpeechRecognizerAI(String appKey, String id, String secret, String url) {
this.appKey = appKey;
// 获取 AccessToken
AccessToken accessToken = new AccessToken(id, secret);
accessToken = new AccessToken(id, secret);
try {
accessToken.apply(); // 申请 Token
logger.info("Token: {}, Expire Time: {}", accessToken.getToken(), accessToken.getExpireTime());
@@ -114,4 +115,28 @@ public class SpeechRecognizerAI {
client.shutdown();
}
}
/**
* 获取当前有效的 AccessToken
*
* @param id 阿里云 AccessKey ID
* @param secret 阿里云 AccessKey Secret
* @return 返回申请到的 AccessToken 字符串,失败时返回 null
*/
public static String getAccessToken(String id, String secret) {
try {
AccessToken accessToken = new AccessToken(id, secret);
accessToken.apply(); // 申请 token
if (accessToken.getToken() != null) {
logger.info("成功获取 Token: {}, 过期时间: {}", accessToken.getToken(), accessToken.getExpireTime());
return accessToken.getToken();
} else {
logger.error("get token fail:"+accessToken.getToken());
return null;
}
} catch (IOException e) {
logger.error("申请 Token 时发生网络错误: {}", e.getMessage());
return null;
}
}
}

View File

@@ -18,4 +18,6 @@ public interface AppUserMapper extends BaseMapper<AppUser>
* @return APP用户集合
*/
public List<AppUser> selectAppUserList(AppUser appUser);
List<AppUser> selectByJobId(Long jobId);
}

View File

@@ -22,7 +22,7 @@ public interface JobApplyMapper extends BaseMapper<JobApply>
*/
public List<JobApply> selectJobApplyList(JobApply jobApply);
//todo
List<Job> applyJob(Long userId);
List<CandidateVO> candidates(Long jobId);

View File

@@ -4,6 +4,7 @@ import java.util.List;
import com.ruoyi.cms.domain.Job;
import com.ruoyi.cms.domain.JobCollection;
import com.ruoyi.cms.domain.vo.CompetitivenessResponse;
/**
* 用户岗位收藏Service接口
@@ -70,5 +71,5 @@ public interface IJobCollectionService
List<Job> collectionJob();
String competitiveness(Long jobId);
CompetitivenessResponse competitiveness(Long jobId);
}

View File

@@ -78,7 +78,7 @@ public interface IJobService
Job selectJobByJobIdApp(Long jobId);
void importRow();
void importRow(String path);
List<CandidateVO> candidates(Long jobId);
@@ -88,13 +88,4 @@ public interface IJobService
List<ESJobDocument> littleVideoRandom(String uuid, Integer count,String jobTitle);
void updateEs();
AppWechatEntity getWechatUrl(String wechatUrl);
String insertTemp(Job job);
String htmlGen(Long id);
void fix();
}

View File

@@ -1,25 +1,20 @@
package com.ruoyi.cms.service.impl;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Arrays;
import java.util.stream.Collectors;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.cms.domain.AppReviewJob;
import com.ruoyi.cms.domain.Company;
import com.ruoyi.cms.domain.Job;
import com.ruoyi.cms.domain.query.MineJobQuery;
import com.ruoyi.cms.mapper.AppReviewJobMapper;
import com.ruoyi.cms.service.IAppReviewJobService;
import com.ruoyi.cms.service.IJobService;
import com.ruoyi.common.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* 用户岗位浏览记录Service业务层处理
@@ -32,8 +27,7 @@ public class AppReviewJobServiceImpl extends ServiceImpl<AppReviewJobMapper, App
{
@Autowired
private AppReviewJobMapper appReviewJobMapper;
@Autowired
private IJobService jobService;
private SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
/**
* 查询用户岗位浏览记录

View File

@@ -168,7 +168,7 @@ public class BussinessDictDataServiceImpl implements IBussinessDictDataService
type.replace("学历","");
}
if(Objects.equals(type, "不限学历")||Objects.equals(type, "学历不限")){
return "11";
return "-1";
}
if(Objects.equals(type, "中专")){
return "1";

View File

@@ -51,7 +51,7 @@ public class ESJobSearchImpl implements IESJobSearchService
/**
* 项目启动时,初始化索引及数据
*/
// @PostConstruct
@PostConstruct
public void init()
{
resetTextCache();
@@ -75,7 +75,7 @@ public class ESJobSearchImpl implements IESJobSearchService
public void resetTextCache() {
logger.info("正在重新刷新es");
// 删除并重新创建索引
esJobDocumentMapper.deleteIndex("job_document_gt");
esJobDocumentMapper.deleteIndex("job_document");
esJobDocumentMapper.createIndex();
// 分批次处理数据
@@ -107,14 +107,14 @@ public class ESJobSearchImpl implements IESJobSearchService
if(!StringUtil.isEmptyOrNull(job.getExperience())){
esJobDocument.setExperience_int(Integer.valueOf(job.getExperience()));
}else {
esJobDocument.setExperience("8");
esJobDocument.setEducation_int(8);
esJobDocument.setExperience("0");
esJobDocument.setEducation_int(0);
}
if(!StringUtil.isEmptyOrNull(job.getEducation())){
esJobDocument.setEducation_int(Integer.valueOf(job.getEducation()));
}else {
esJobDocument.setEducation("11");
esJobDocument.setExperience_int(11);
esJobDocument.setEducation("-1");
esJobDocument.setExperience_int(-1);
}
if (esJobDocument.getLatitude() != null) {
esJobDocument.setLatAndLon(esJobDocument.getLatitude().toString() + "," + esJobDocument.getLongitude().toString());
@@ -137,37 +137,97 @@ public class ESJobSearchImpl implements IESJobSearchService
@Override
public List<ESJobDocument> selectTextListExceptJobId(ESJobSearch esJobSearch, List<Long> jobIds) {
ESJobSearch newSearch = new ESJobSearch();
BeanUtils.copyProperties(esJobSearch,newSearch);
//查询
if(SecurityUtils.isLogin()){
AppUser appUser = appUserService.selectAppUserByUserId(SecurityUtils.getUserId());
if(!ListUtil.isEmptyOrNull(appUser.getJobTitle())&&!StringUtil.isEmptyOrNull(esJobSearch.getJobTitle())){
esJobSearch.setJobTitle(String.join(",", appUser.getJobTitle()));
if(!ListUtil.isEmptyOrNull(appUser.getJobTitle())){
List<String> jobTitle = appUser.getJobTitle();
newSearch.setJobTitle(String.join(",", jobTitle));
}
if(!StringUtil.isEmptyOrNull(appUser.getEducation())&&!StringUtil.isEmptyOrNull(esJobSearch.getEducation())){
esJobSearch.setEducation(appUser.getEducation());
if(!StringUtil.isEmptyOrNull(esJobSearch.getJobTitle())){
newSearch.setJobTitle(esJobSearch.getJobTitle());
}
if(!StringUtil.isEmptyOrNull(appUser.getEducation())){
newSearch.setEducation(appUser.getEducation());
}
if(!StringUtil.isEmptyOrNull(esJobSearch.getEducation())){
newSearch.setEducation(esJobSearch.getEducation());
}
if(!StringUtil.isEmptyOrNull(appUser.getArea())){
esJobSearch.setJobLocationAreaCode(Integer.valueOf(appUser.getArea()));
newSearch.setArea(appUser.getArea());
}
if(!StringUtil.isEmptyOrNull(appUser.getExperience())&&!StringUtil.isEmptyOrNull(esJobSearch.getExperience())){
esJobSearch.setExperience(appUser.getExperience());
if(!StringUtil.isEmptyOrNull(esJobSearch.getArea())){
newSearch.setArea(esJobSearch.getArea());
}
if(!StringUtil.isEmptyOrNull(appUser.getExperience())){
newSearch.setExperience(appUser.getExperience());
}
if(!StringUtil.isEmptyOrNull(esJobSearch.getExperience())){
newSearch.setExperience(esJobSearch.getExperience());
}
if(!StringUtil.isEmptyOrNull(appUser.getSalaryMax())){
esJobSearch.setMaxSalary(Long.valueOf(appUser.getSalaryMax()));
newSearch.setMaxSalary(Long.valueOf(appUser.getSalaryMax()));
}
if(!StringUtil.isEmptyOrNull(appUser.getSalaryMin())){
esJobSearch.setMaxSalary(Long.valueOf(appUser.getSalaryMin()));
newSearch.setMinSalary(Long.valueOf(appUser.getSalaryMin()));
}
}
LambdaEsQueryWrapper<ESJobDocument> wrapper = getWrapper(esJobSearch);
if(!ListUtil.isListEmptyOrNull(jobIds)){
wrapper.in(ESJobDocument::getJobId, jobIds);
}
LambdaEsQueryWrapper<ESJobDocument> wrapper = getWrapper(newSearch,jobIds);
//todo 暂时
wrapper.limit(esJobSearch.getPageSize());
wrapper.orderByDesc(ESJobDocument::getCompanyId);
return esJobDocumentMapper.selectList(wrapper);
List<ESJobDocument> esJobDocuments = esJobDocumentMapper.selectList(wrapper);
if (esJobDocuments.size() < esJobSearch.getPageSize()) {
// 定义要逐步放宽的搜索条件字段
List<Runnable> relaxConditions = new ArrayList<>();
relaxConditions.add(() -> newSearch.setArea(null));
relaxConditions.add(() -> newSearch.setExperience(null));
relaxConditions.add(() -> newSearch.setMaxSalary(null));
relaxConditions.add(() -> newSearch.setMinSalary(null));
relaxConditions.add(() -> newSearch.setEducation(null));
relaxConditions.add(()-> newSearch.setJobTitle(null));
// 保存所有查询到的文档
List<ESJobDocument> allDocuments = new ArrayList<>(esJobDocuments);
// 记录已经放宽的条件数量
int relaxedConditions = 0;
// 继续放宽条件直到满足分页或所有条件都已放宽
while (allDocuments.size() < esJobSearch.getPageSize()
&& relaxedConditions < relaxConditions.size()) {
// 放宽下一个条件
relaxConditions.get(relaxedConditions).run();
relaxedConditions++;
// 查询新增的文档(不包含之前已经查询到的)
wrapper = getWrapper(newSearch, jobIds);
wrapper.limit(esJobSearch.getPageSize() - allDocuments.size());
if (!allDocuments.isEmpty()) {
// 排除已经查询到的文档ID
Set<String> existingIds = allDocuments.stream()
.map(ESJobDocument::getId)
.collect(Collectors.toSet());
wrapper.not().in(ESJobDocument::getId, existingIds);
}
List<ESJobDocument> newDocuments = esJobDocumentMapper.selectList(wrapper);
allDocuments.addAll(newDocuments);
}
// 如果总数超过分页大小,截取所需数量
if (allDocuments.size() > esJobSearch.getPageSize()) {
esJobDocuments = allDocuments.subList(0, esJobSearch.getPageSize());
} else {
esJobDocuments = allDocuments;
}
}
return esJobDocuments;
}
@@ -221,7 +281,7 @@ public class ESJobSearchImpl implements IESJobSearchService
public EsPageInfo<ESJobDocument> nearJob(ESJobSearch jobQuery) {
Integer pageNum = jobQuery.getCurrent();
Integer pageSize = jobQuery.getPageSize();
LambdaEsQueryWrapper<ESJobDocument> wrapper = getWrapper(jobQuery);
LambdaEsQueryWrapper<ESJobDocument> wrapper = getWrapper(jobQuery,null);
EsPageInfo<ESJobDocument> esJobDocumentEsPageInfo = esJobDocumentMapper.pageQuery(wrapper, pageNum, pageSize);
return esJobDocumentEsPageInfo;
}
@@ -230,7 +290,7 @@ public class ESJobSearchImpl implements IESJobSearchService
public EsPageInfo<ESJobDocument> countyJobList(ESJobSearch jobQuery) {
Integer pageNum = jobQuery.getCurrent();
Integer pageSize = jobQuery.getPageSize();
LambdaEsQueryWrapper<ESJobDocument> wrapper = getWrapper(jobQuery);
LambdaEsQueryWrapper<ESJobDocument> wrapper = getWrapper(jobQuery, null);
if(jobQuery.getCountyIds()!=null){
wrapper.and(x->x.in(ESJobDocument::getJobLocationAreaCode,jobQuery.getCountyIds()));
}
@@ -242,7 +302,7 @@ public class ESJobSearchImpl implements IESJobSearchService
public EsPageInfo<ESJobDocument> subway(ESJobSearch jobQuery) {
Integer pageNum = jobQuery.getCurrent();
Integer pageSize = jobQuery.getPageSize();
LambdaEsQueryWrapper<ESJobDocument> wrapper = getWrapper(jobQuery);
LambdaEsQueryWrapper<ESJobDocument> wrapper = getWrapper(jobQuery,null);
EsPageInfo<ESJobDocument> esJobDocumentEsPageInfo = esJobDocumentMapper.pageQuery(wrapper, pageNum, pageSize);
return esJobDocumentEsPageInfo;
}
@@ -251,7 +311,7 @@ public class ESJobSearchImpl implements IESJobSearchService
public EsPageInfo<ESJobDocument> commercialArea(ESJobSearch jobQuery) {
Integer pageNum = jobQuery.getCurrent();
Integer pageSize = jobQuery.getPageSize();
LambdaEsQueryWrapper<ESJobDocument> wrapper = getWrapper(jobQuery);
LambdaEsQueryWrapper<ESJobDocument> wrapper = getWrapper(jobQuery,null);
if(jobQuery.getLongitude()!=null){
wrapper.geoDistance(ESJobDocument::getLatAndLon,Double.valueOf(jobQuery.getRadius()), DistanceUnit.KILOMETERS,new GeoPoint(Double.parseDouble(jobQuery.getLatitude().toString()), Double.parseDouble(jobQuery.getLongitude().toString())));
}
@@ -263,7 +323,6 @@ public class ESJobSearchImpl implements IESJobSearchService
public List<ESJobDocument> littleVideo(ESJobSearch esJobSearch) {
LambdaEsQueryWrapper<ESJobDocument> wrapper = new LambdaEsQueryWrapper<>();
wrapper.eq(ESJobDocument::getIsExplain, 1);
wrapper.orderByDesc(ESJobDocument::getIsExplain);
wrapper.limit(esJobSearch.getPageSize());
return esJobDocumentMapper.selectList(wrapper);
}
@@ -297,29 +356,17 @@ public class ESJobSearchImpl implements IESJobSearchService
return esJobDocumentMapper.selectList(wrapper);
}
private LambdaEsQueryWrapper<ESJobDocument> getWrapper(ESJobSearch esJobSearch){
List<String> searchList = new ArrayList<>();
if(!StringUtil.isEmptyOrNull(esJobSearch.getJobTitle())){
searchList.add(esJobSearch.getJobTitle());
}else {
if(SecurityUtils.isLogin()){
AppUser appUser = appUserService.selectAppUserByUserId(SecurityUtils.getUserId());
List<String> jobTitleList = appUser.getJobTitle();
if(!jobTitleList.isEmpty()){
searchList.addAll(jobTitleList);
}
}
}
private LambdaEsQueryWrapper<ESJobDocument> getWrapper(ESJobSearch esJobSearch,List<Long> jobIds){
LambdaEsQueryWrapper<ESJobDocument> wrapper = new LambdaEsQueryWrapper<>();
if (!searchList.isEmpty())
{
for (String keyWords:searchList){
wrapper.or(a -> a.like(ESJobDocument::getJobTitle, keyWords, 5.0f)
.or()
.like(ESJobDocument::getDescription, keyWords, 1.0f)
if(!StringUtil.isEmptyOrNull(esJobSearch.getJobTitle())){
for (String keyWord:esJobSearch.getJobTitle().split(",")) {
wrapper.and(a -> a.match(ESJobDocument::getJobTitle, keyWord, 5.0f)
);
}
}
if(esJobSearch.getLongitude()!=null){
wrapper.geoDistance(ESJobDocument::getLatAndLon,Double.valueOf(esJobSearch.getRadius()), DistanceUnit.KILOMETERS,new GeoPoint(Double.parseDouble(esJobSearch.getLatitude().toString()), Double.parseDouble(esJobSearch.getLongitude().toString())));
}
@@ -344,6 +391,10 @@ public class ESJobSearchImpl implements IESJobSearchService
Integer maxValue = StringUtil.findMaxValue(esJobSearch.getScale());
wrapper.and(x->x.le(ESJobDocument::getScale,maxValue));
}
if(!StringUtil.isEmptyOrNull(esJobSearch.getArea())){
List<Integer> integers = StringUtil.convertStringToIntegerList(esJobSearch.getArea());
wrapper.and(x->x.in(ESJobDocument::getJobLocationAreaCode,integers));
}
if(Objects.nonNull(esJobSearch.getOrder())){
if(esJobSearch.getOrder()==1){
wrapper.orderByDesc(ESJobDocument::getIsHot);
@@ -352,7 +403,9 @@ public class ESJobSearchImpl implements IESJobSearchService
wrapper.orderByDesc(ESJobDocument::getPostingDate);
}
}
//TODO LIST
if(!ListUtil.isListEmptyOrNull(jobIds)){
wrapper.not().in(ESJobDocument::getJobId, jobIds);
}
return wrapper;
}
@@ -362,6 +415,13 @@ public class ESJobSearchImpl implements IESJobSearchService
Integer pageNum = jobQuery.getCurrent();
Integer pageSize = jobQuery.getPageSize();
LambdaEsQueryWrapper<ESJobDocument> wrapper = new LambdaEsQueryWrapper<>();
// if(SecurityUtils.isLogin()){
// AppUser appUser = appUserService.selectAppUserByUserId(SecurityUtils.getUserId());
// if(!ListUtil.isEmptyOrNull(appUser.getJobTitle())){
// List<String> jobTitle = appUser.getJobTitle();
// jobQuery.setJobTitle(String.join(",", jobTitle));
// }
// }
if(!StringUtil.isEmptyOrNull(jobQuery.getJobTitle())){
wrapper.and(a->a.match(ESJobDocument::getJobTitle,jobQuery.getJobTitle(),5.0f)
.or()
@@ -370,7 +430,10 @@ public class ESJobSearchImpl implements IESJobSearchService
if(!StringUtil.isEmptyOrNull(jobQuery.getEducation())){
wrapper.and(a->a.le(ESJobDocument::getEducation,jobQuery.getEducation()));
}
if(!StringUtil.isEmptyOrNull(jobQuery.getArea())){
List<Integer> integers = StringUtil.convertStringToIntegerList(jobQuery.getArea());
wrapper.and(x->x.in(ESJobDocument::getJobLocationAreaCode,integers));
}
if(!StringUtil.isEmptyOrNull(jobQuery.getExperience())){
wrapper.and(a->a.le(ESJobDocument::getExperience,jobQuery.getExperience()));
}
@@ -430,6 +493,7 @@ public class ESJobSearchImpl implements IESJobSearchService
for (ESJobDocument esJobDocument : esJobDocuments) {
Job job = new Job();
BeanUtils.copyProperties(esJobDocument,job);
job.setJobId(null);
jobMapper.insert(job);
}
}

View File

@@ -1,21 +1,24 @@
package com.ruoyi.cms.service.impl;
import java.util.List;
import java.util.Arrays;
import java.time.LocalDate;
import java.time.Period;
import java.time.ZoneId;
import java.util.*;
import java.util.stream.Collectors;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.cms.domain.AppUser;
import com.ruoyi.cms.domain.Job;
import com.ruoyi.cms.domain.JobApply;
import com.ruoyi.cms.domain.*;
import com.ruoyi.cms.domain.vo.CompetitivenessResponse;
import com.ruoyi.cms.domain.vo.RadarChart;
import com.ruoyi.cms.mapper.AppUserMapper;
import com.ruoyi.cms.mapper.JobApplyMapper;
import com.ruoyi.cms.mapper.JobMapper;
import com.ruoyi.cms.service.IBussinessDictTypeService;
import com.ruoyi.common.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import com.ruoyi.cms.mapper.JobCollectionMapper;
import com.ruoyi.cms.domain.JobCollection;
import com.ruoyi.cms.service.IJobCollectionService;
import org.springframework.transaction.annotation.Transactional;
@@ -34,6 +37,10 @@ public class JobCollectionServiceImpl extends ServiceImpl<JobCollectionMapper,Jo
private JobApplyMapper jobApplyMapper;
@Autowired
private AppUserMapper appUserMapper;
@Autowired
private JobMapper jobMapper;
@Autowired
private IBussinessDictTypeService iBussinessDictTypeService;
/**
* 查询用户岗位收藏
*
@@ -147,9 +154,237 @@ public class JobCollectionServiceImpl extends ServiceImpl<JobCollectionMapper,Jo
}
@Override
public String competitiveness(Long jobId) {
AppUser appUser = appUserMapper.selectById(SecurityUtils.getUserId());
String education = appUser.getEducation();
return "90.5";
public CompetitivenessResponse competitiveness(Long jobId) {
// 查询岗位信息
Job job = jobMapper.selectById(jobId);
if (job == null) {
throw new RuntimeException("岗位不存在");
}
// 获取所有申请该岗位的用户
List<AppUser> appUsers = appUserMapper.selectByJobId(jobId);
Long applyCount = (long) appUsers.size();
if (appUsers.isEmpty()) {
// 没有人申请返回默认值或0
CompetitivenessResponse emptyResponse = new CompetitivenessResponse();
emptyResponse.setTotalApplicants(0);
emptyResponse.setMatchScore(0);
emptyResponse.setRank(0);
emptyResponse.setPercentile(0);
RadarChart radarChart = new RadarChart();
emptyResponse.setRadarChart(radarChart);
return emptyResponse;
}
// ================== 数据字典映射(用于排序比较)==================
// 假设你有字典工具类,如 DictUtils.getSort("education", value) 返回排序值
// 这里我们用 Map 模拟字典排序(越小要求越低)
// 获取字典数据
List<BussinessDictData> educationDict = iBussinessDictTypeService.selectDictDataByType("education");
List<BussinessDictData> experienceDict = iBussinessDictTypeService.selectDictDataByType("experience");
// 构建学历排序映射dictLabel -> dictSort越小要求越低
Map<String, Integer> educationRank = educationDict.stream()
.collect(Collectors.toMap(
BussinessDictData::getDictLabel,
data -> Math.toIntExact(data.getDictSort()),
(a, b) -> a // 若有重复 key保留第一个
));
Map<String, Integer> experienceRank = experienceDict.stream()
.collect(Collectors.toMap(
BussinessDictData::getDictLabel,
data -> Math.toIntExact(data.getDictSort()),
(a, b) -> a
));
// ================== 提取岗位要求 ==================
Integer jobEducationRank = educationRank.getOrDefault(job.getEducation(), 999);
Integer jobExperienceRank = experienceRank.getOrDefault(job.getExperience(), 999);
Integer jobMinSalary = job.getMinSalary() != null ? job.getMinSalary().intValue() : 0;
String jobLocation = job.getJobLocation();
// ================== 聚合用户数据用于分析 ==================
List<UserCompetitiveness> userScores = new ArrayList<>();
for (AppUser user : appUsers) {
int matchScore = 0;
int totalFactors = 6; // 年龄、经验、学历、技能(暂用期望岗位匹配)、薪资、地点
// 1. 学历匹配(越接近越好)
Integer userEduRank = educationRank.getOrDefault(user.getEducation(), 999);
if (userEduRank <= jobEducationRank) {
matchScore += 1; // 达标
} else if (userEduRank == jobEducationRank + 1) {
matchScore += 0.5; // 略高也算匹配
}
// 2. 经验匹配
Integer userExpRank = experienceRank.getOrDefault(user.getExperience(), 999);
if (userExpRank >= jobExperienceRank) {
matchScore += 1; // 满足经验要求
}
// 3. 薪资匹配(用户期望 <= 岗位最大薪资,且不低于最小太多)
Integer userMinSalary = parseSalary(user.getSalaryMin());
if (userMinSalary != null && userMinSalary <= job.getMaxSalary()) {
if (userMinSalary >= job.getMinSalary()) {
matchScore += 1;
} else if (userMinSalary >= job.getMinSalary() * 0.8) {
matchScore += 0.5;
}
}
// 4. 地点匹配
if (user.getArea() != null && user.getArea().contains(jobLocation) || jobLocation.contains(user.getArea())) {
matchScore += 1;
}
// 5. 年龄估算(从生日计算)
int userAge = getUserAge(user.getBirthDate());
// 假设最佳年龄区间为 22-35越接近越匹配
if (userAge >= 22 && userAge <= 35) {
matchScore += 1;
} else if (userAge >= 18 && userAge <= 45) {
matchScore += 0.5;
}
// 6. 技能/岗位匹配(简化:期望岗位是否包含该岗位关键词)
boolean jobMatch = user.getJobTitle() != null &&
user.getJobTitle().stream().anyMatch(title -> title.contains(job.getJobTitle()) || job.getJobTitle().contains(title));
if (jobMatch) {
matchScore += 1;
}
// 匹配度0-6 → 映射为 0-100 分
int finalScore = (int) Math.round((matchScore / (double) totalFactors) * 100);
userScores.add(new UserCompetitiveness(user, finalScore));
}
// 按匹配度降序
userScores.sort((a, b) -> Integer.compare(b.getScore(), a.getScore()));
// ================== 计算雷达图数据(取平均值)==================
RadarChart radarChart = new RadarChart();
double avgAgeScore = userScores.stream().mapToInt(u -> getAgeScore(u.getUser().getBirthDate())).average().orElse(0);
double avgExperienceScore = userScores.stream().mapToInt(u -> getExperienceScore(u.getUser().getExperience(), job.getExperience(), experienceRank)).average().orElse(0);
double avgEducationScore = userScores.stream().mapToInt(u -> getEducationScore(u.getUser().getEducation(), job.getEducation(), educationRank)).average().orElse(0);
double avgSkillScore = userScores.stream().mapToInt(u -> getSkillScore(u.getUser(), job)).average().orElse(0);
double avgSalaryScore = userScores.stream().mapToInt(u -> getSalaryScore(u.getUser(), job)).average().orElse(0);
double avgLocationScore = userScores.stream().mapToInt(u -> getLocationScore(u.getUser(), job)).average().orElse(0);
radarChart.setAge((int) avgAgeScore);
radarChart.setExperience((int) avgExperienceScore);
radarChart.setEducation((int) avgEducationScore);
radarChart.setSkill((int) avgSkillScore);
radarChart.setSalary((int) avgSalaryScore);
radarChart.setLocation((int) avgLocationScore);
// ================== 返回响应 ==================
CompetitivenessResponse response = new CompetitivenessResponse();
response.setTotalApplicants(Math.toIntExact(applyCount));
// Top 用户的匹配分
int topMatchScore = userScores.get(0).getScore();
response.setMatchScore(topMatchScore);
// 排名Top1
response.setRank(1);
// 百分位top用户超过多少人100%
response.setPercentile(100);
response.setRadarChart(radarChart);
return response;
}
private int getUserAge(Date birthDate) {
if (birthDate == null) return 0;
try {
LocalDate birth = birthDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
return Period.between(birth, LocalDate.now()).getYears();
} catch (Exception e) {
return 0;
}
}
private int getEducationScore(String userEdu, String jobEdu, Map<String, Integer> rankMap) {
if (userEdu == null || jobEdu == null) return 60;
Integer u = rankMap.getOrDefault(userEdu, 999);
Integer j = rankMap.getOrDefault(jobEdu, 999);
if (u <= j) return 90;
if (u == j + 1) return 75;
return 60;
}
private int getExperienceScore(String userExp, String jobExp, Map<String, Integer> rankMap) {
if (userExp == null || jobExp == null) return 60;
Integer u = rankMap.getOrDefault(userExp, 999);
Integer j = rankMap.getOrDefault(jobExp, 999);
if (u >= j) return 90;
if (u >= j - 1) return 75; // 容忍略低一年
return 60;
}
private int getSalaryScore(AppUser user, Job job) {
Integer min = parseSalary(user.getSalaryMin());
if (min == null) return 60;
if (job.getMinSalary() == null || job.getMaxSalary() == null) return 60;
long jobMin = job.getMinSalary();
long jobMax = job.getMaxSalary();
if (min >= jobMin && min <= jobMax) return 90;
if (min >= jobMin * 0.8 && min <= jobMax * 1.2) return 75;
return 60;
}
private int getLocationScore(AppUser user, Job job) {
String area = user.getArea();
String loc = job.getJobLocation();
if (area != null && (area.contains(loc) || loc.contains(area))) return 90;
return 60;
}
private int getSkillScore(AppUser user, Job job) {
String jobTitle = job.getJobTitle();
List<String> userTitles = user.getJobTitle();
if (jobTitle == null || userTitles == null || userTitles.isEmpty()) return 60;
boolean match = userTitles.stream()
.anyMatch(title -> title != null &&
(title.contains(jobTitle) || jobTitle.contains(title)));
return match ? 90 : 60;
}
private Integer parseSalary(String salaryStr) {
if (salaryStr == null || salaryStr.trim().isEmpty()) return null;
try {
// 提取第一个连续数字
String numberStr = salaryStr.replaceAll("[^0-9]", "");
return numberStr.isEmpty() ? null : Integer.parseInt(numberStr);
} catch (Exception e) {
return null;
}
}
private int getAgeScore(Date birthDate) {
int age = getUserAge(birthDate);
if (age == 0) return 60; // 无法获取年龄,默认低分
if (age >= 22 && age <= 35) return 90;
if (age >= 18 && age <= 45) return 75;
return 60;
}
private static class UserCompetitiveness {
private final AppUser user;
private final int score;
public UserCompetitiveness(AppUser user, int score) {
this.user = user;
this.score = score;
}
public AppUser getUser() {
return user;
}
public int getScore() {
return score;
}
}
}

View File

@@ -295,7 +295,6 @@ public class JobServiceImpl extends ServiceImpl<JobMapper,Job> implements IJobSe
}else {
jobList = cacheObject.toList(Long.class);
}
//从kafka中消费 bert模型跑出来的结果
//从es中查询
List<ESJobDocument> jobListResult = iesJobSearchService.selectTextListExceptJobId(esJobSearch,jobList);
//存入当前session中查看的岗位 避免重复 todo 定时删除 key上保存用户信息
@@ -331,41 +330,34 @@ public class JobServiceImpl extends ServiceImpl<JobMapper,Job> implements IJobSe
@Override
public Job selectJobByJobIdApp(Long jobId) {
try {
Job job = new Job();
ESJobDocument esJobDocument = iesJobSearchService.selectById(jobId);
BeanUtils.copyProperties(esJobDocument,job);
Job job = jobMapper.selectById(jobId);
//查询公司信息
if(Objects.nonNull(job.getCompanyId())){
Company company = companyMapper.selectById(job.getCompanyId());
job.setCompany(company);
}
// if(SecurityUtils.isLogin()){
// //查询申请信息
// Long applyCount = jobApplyMapper.selectCount(Wrappers.<JobApply>lambdaQuery().eq(JobApply::getJobId, jobId).eq(JobApply::getUserId, SecurityUtils.getUserId()));
// job.setIsApply(applyCount>0?1:0);
// //查询收藏信息
// Long collectionCount = jobCollectionMapper.selectCount(Wrappers.<JobCollection>lambdaQuery().eq(JobCollection::getJobId, jobId).eq(JobCollection::getUserId, SecurityUtils.getUserId()));
// job.setIsCollection(collectionCount>0?1:0);
// //todo asyn
// //保存浏览记录
// List<AppReviewJob> appReviewJobs = appReviewJobMapper.selectList(Wrappers.<AppReviewJob>lambdaQuery().eq(AppReviewJob::getUserId, SecurityUtils.getUserId()).eq(AppReviewJob::getJobId, jobId));
// //之前相同岗位的记录删除 保存最新的浏览记录
// if(!appReviewJobs.isEmpty()){
// appReviewJobMapper.deleteBatchIds(appReviewJobs.stream().map(AppReviewJob::getId).collect(Collectors.toList()));
// }
// AppReviewJob appReviewJob = new AppReviewJob();
// appReviewJob.setUserId(SecurityUtils.getUserId());
// appReviewJob.setReviewDate(new Date());
// appReviewJob.setJobId(jobId);
// appReviewJobMapper.insert(appReviewJob);
// }
//浏览量+1
// this.view(jobId);
if(SecurityUtils.isLogin()){
//查询申请信息
Long applyCount = jobApplyMapper.selectCount(Wrappers.<JobApply>lambdaQuery().eq(JobApply::getJobId, jobId).eq(JobApply::getUserId, SecurityUtils.getUserId()));
job.setIsApply(applyCount>0?1:0);
//查询收藏信息
Long collectionCount = jobCollectionMapper.selectCount(Wrappers.<JobCollection>lambdaQuery().eq(JobCollection::getJobId, jobId).eq(JobCollection::getUserId, SecurityUtils.getUserId()));
job.setIsCollection(collectionCount>0?1:0);
//todo asyn
//保存浏览记录
List<AppReviewJob> appReviewJobs = appReviewJobMapper.selectList(Wrappers.<AppReviewJob>lambdaQuery().eq(AppReviewJob::getUserId, SecurityUtils.getUserId()).eq(AppReviewJob::getJobId, jobId));
//之前相同岗位的记录删除 保存最新的浏览记录
if(!appReviewJobs.isEmpty()){
appReviewJobMapper.deleteBatchIds(appReviewJobs.stream().map(AppReviewJob::getId).collect(Collectors.toList()));
}
AppReviewJob appReviewJob = new AppReviewJob();
appReviewJob.setUserId(SecurityUtils.getUserId());
appReviewJob.setReviewDate(new Date());
appReviewJob.setJobId(jobId);
appReviewJobMapper.insert(appReviewJob);
}
this.view(jobId);
return job;
}catch (Exception e){
return this.selectJobByJobId(jobId);
}
}
@@ -398,12 +390,9 @@ public class JobServiceImpl extends ServiceImpl<JobMapper,Job> implements IJobSe
@Override
public List<ESJobDocument> littleVideo(ESJobSearch esJobSearch) {
return iesJobSearchService.littleVideo(esJobSearch);
}
@Override
public void updateEs() {
iesJobSearchService.updateEs();
return iesJobSearchService.littleVideo(esJobSearch);
}
@Override
@@ -450,77 +439,12 @@ public class JobServiceImpl extends ServiceImpl<JobMapper,Job> implements IJobSe
return esJobDocuments;
}
// @Override
// public void importRow() {
//
//
// try {
// logger.info("开始导入Excel数据...");
//
// // 读取Excel文件中的数据
// List<RowWork> rowWorks = ExcelToObject.readExcelToObjects("D:\\QD\\青岛市近一个月数据.xlsx", RowWork.class);
// logger.info("从Excel中读取到 {} 条数据", rowWorks.size());
//
// // 从数据库中获取已有的数据
// List<RowWork> rowWorksInMysql = jobMapper.selectAllRowWork();
// logger.info("从数据库中查询到 {} 条已有数据", rowWorksInMysql.size());
//
// // 创建一个Set来存储数据库中已有的记录的唯一标识
// Set<String> existingRecords = new HashSet<>();
// for (RowWork rowWork : rowWorksInMysql) {
// String uniqueKey = rowWork.getJobCategory() + "_" + rowWork.getAca112() + "_" + rowWork.getAcb202();
// existingRecords.add(uniqueKey);
// }
// logger.info("已加载 {} 条唯一标识到内存", existingRecords.size());
//
// // 创建一个列表来收集待插入的数据
// List<RowWork> batchList = new ArrayList<>();
// int batchSize = 100; // 每批次插入的数量
// int totalInserted = 0; // 记录总共插入的数据量
//
// // 遍历Excel中的数据进行去重并收集待插入的数据
// for (RowWork rowWork : rowWorks) {
// String uniqueKey = rowWork.getStd_class() + "_" + rowWork.getAca112() + "_" + rowWork.getAcb202();
// if (!existingRecords.contains(uniqueKey)) {
// batchList.add(rowWork); // 添加到待插入列表
// existingRecords.add(uniqueKey); // 添加到已存在集合,避免重复
// // 当待插入列表达到批次大小时,执行批量插入
// if (batchList.size() >= batchSize) {
// try {
// jobMapper.insertBatchRowWork(batchList); // 批量插入
// totalInserted += batchList.size();
// logger.info("成功插入 {} 条数据,当前总共插入 {} 条数据", batchList.size(), totalInserted);
// batchList.clear(); // 清空列表,准备下一批次
// } catch (Exception e) {
// logger.error("批量插入失败: " + e.getMessage(), e);
// }
// }
// }
// }
//
// // 插入剩余的数据如果不足100条
// if (!batchList.isEmpty()) {
// try {
// jobMapper.insertBatchRowWork(batchList); // 插入剩余数据
// totalInserted += batchList.size();
// logger.info("成功插入剩余的 {} 条数据,当前总共插入 {} 条数据", batchList.size(), totalInserted);
// } catch (Exception e) {
// logger.error("批量插入剩余数据失败: " + e.getMessage(), e);
// }
// }
//
// logger.info("数据导入完成,总共插入 {} 条数据", totalInserted);
// } catch (Exception e) {
// logger.error("导入数据过程中发生异常: " + e.getMessage(), e);
// throw new RuntimeException(e);
// }
// }
@Override
public void importRow() {
public void importRow(String path) {
try {
logger.info("开始导入Excel数据...");
// 读取Excel文件中的数据
List<RowWork> rowWorks = ExcelToObject.readExcelToObjects("/home/lapuda/Desktop/import.xlsx", RowWork.class);
List<RowWork> rowWorks = ExcelToObject.readExcelToObjects(path, RowWork.class);
logger.info("从Excel中读取到 {} 条数据", rowWorks.size());
// 按ORG分类存储数据
@@ -651,11 +575,22 @@ public class JobServiceImpl extends ServiceImpl<JobMapper,Job> implements IJobSe
for (RowWork rowWork : rowWorks) {
try {
Job job = new Job();
if(StringUtil.isEmptyOrNull(rowWork.getAca112())){
continue;
}
job.setJobTitle(rowWork.getAca112());
job.setMinSalary(Long.valueOf(rowWork.getSalaryLow()));
job.setMaxSalary(Long.valueOf(rowWork.getSalaryHight()));
job.setEducation(iBussinessDictDataService.findCode(dictData, rowWork.getAac011()));
job.setExperience(iBussinessDictDataService.findCode(expData, rowWork.getExperience()));
if(Objects.isNull(rowWork.getAac011())){
job.setEducation("-1");
}else {
job.setEducation(iBussinessDictDataService.findCode(dictData, rowWork.getAac011()));
}
if(Objects.isNull(rowWork.getExperience())){
job.setExperience("0");
}else {
job.setExperience(iBussinessDictDataService.findCode(expData, rowWork.getExperience()));
}
job.setCompanyName(rowWork.getAAB004());
job.setJobLocation(rowWork.getAAE006());
job.setPostingDate(new Date());
@@ -673,7 +608,11 @@ public class JobServiceImpl extends ServiceImpl<JobMapper,Job> implements IJobSe
job.setCompanyId(getCompanyId(allCompany, rowWork.getAAB004()));
job.setIsHot(0);
job.setApplyNum(0);
job.setJobLocationAreaCode(Integer.valueOf(Objects.requireNonNull(iBussinessDictDataService.findCode(areaData, rowWork.getCounty()))));
if(Objects.isNull(rowWork.getCounty())){
job.setJobLocationAreaCode(null);
}else {
job.setJobLocationAreaCode(Integer.valueOf(Objects.requireNonNull(iBussinessDictDataService.findCode(areaData, rowWork.getCounty()))));
}
job.setDescription(rowWork.getAcb22a());
job.setIsPublish(1);
job.setDataSource(rowWork.getORG());
@@ -730,19 +669,28 @@ public class JobServiceImpl extends ServiceImpl<JobMapper,Job> implements IJobSe
Company companyNew = new Company();
companyNew.setName(company.getName());
companyNew.setLocation(company.getLocation());
companyNew.setScale(iBussinessDictDataService.findCode(scaleData,company.getScale()));
if(Objects.isNull(company.getScale())){
companyNew.setScale("0");
}else {
companyNew.setScale(iBussinessDictDataService.findCode(scaleData,company.getScale()));
}
companyNew.setDelFlag("0");
companyNew.setCreateBy("system");
companyNew.setCreateTime(new Date());
companyNew.setRemark("add");
companyNew.setDescription(company.getDescription());
companyNew.setIndustry(findIndustry(treeSelects,company));
companyNew.setNature(iBussinessDictDataService.findCode(natureData,company.getNature()));
if(Objects.isNull(company.getNature())){
companyNew.setNature("8");
}else {
companyNew.setNature(iBussinessDictDataService.findCode(natureData,company.getNature()));
}
companyList.add(companyNew);
}
return companyList;
}
private String findIndustry(List<TreeSelect> treeSelects, Company company) {
if(company.getRemark()==null){return "";}
if(Objects.equals(company.getRemark(), "")){return "";}
@@ -776,108 +724,5 @@ public class JobServiceImpl extends ServiceImpl<JobMapper,Job> implements IJobSe
}
return jobs;
}
@Autowired
private WechatUtil wechatUtil;
@Override
public AppWechatEntity getWechatUrl(String weChatUrl) {
return wechatUtil.sign(weChatUrl);
}
@Override
public String insertTemp(Job job) {
String companyName = job.getCompanyName();
Company company = new Company();
company.setName(companyName);
companyMapper.insert(company);
job.setCompanyId(company.getCompanyId());
this.insertJob(job);
System.out.println(job.getJobId());
String url = "https://qd.zhaopinzao8dian.com/app#/packageA/pages/post/post?jobId="+Base64.getEncoder().encodeToString(String.valueOf(job.getJobId()).getBytes());
return url;
}
@Override
public String htmlGen(Long id) {
ESJobDocument esJobDocument = iesJobSearchService.selectById(id);
String jobTitle = esJobDocument.getJobTitle();
Long maxSalary = esJobDocument.getMaxSalary();
Long minSalary = esJobDocument.getMinSalary();
String companyName = esJobDocument.getCompanyName();
Long vacancies = esJobDocument.getVacancies();
// 1. 从服务器获取模板文件内容
String templateContent = fetchTemplateFromServer();
if (templateContent == null || templateContent.isEmpty()) {
return "";
}
// 2. 替换模板中的动态变量
String htmlContent = templateContent
.replace("${jobTitle}", jobTitle)
.replace("${companyName}", companyName)
.replace("${minSalary}", String.valueOf(minSalary))
.replace("${maxSalary}", String.valueOf(maxSalary))
.replace("${vacancies}", String.valueOf(vacancies))
.replace("${jobId}", String.valueOf(id));
// 3. 检查并创建目录
String directoryPath = "/data/file/share";
String directoryPath_domain = "/file/share";
File directory = new File(directoryPath);
if (!directory.exists()) {
directory.mkdirs();
}
// 4. 生成HTML文件
String fileName = "share_" + id + ".html";
String filePath = directoryPath + "/" + fileName;
File htmlFile = new File(filePath);
try {
// 如果文件已存在,先删除
if (htmlFile.exists()) {
return "https://qd.zhaopinzao8dian.com/file/share/"+fileName;
}
// 写入新内容
FileWriter writer = new FileWriter(htmlFile);
writer.write(htmlContent);
writer.close();
return "https://qd.zhaopinzao8dian.com/file/share/"+fileName;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
private String fetchTemplateFromServer() {
String templateUrl = "https://qd.zhaopinzao8dian.com/file/share/template.html";
try {
URL url = new URL(templateUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
BufferedReader reader = new BufferedReader(
new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line).append("\n");
}
reader.close();
return response.toString();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
public void fix() {
iesJobSearchService.fix();
}
}

View File

@@ -1,5 +1,7 @@
package com.ruoyi.cms.util;
import com.ruoyi.cms.domain.query.ESJobSearch;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -47,4 +49,13 @@ public class StringUtil {
}
public static List<String> convertStringToStringList(String input) {
if (isEmptyOrNull(input)) {
return new ArrayList<>();
}
return Arrays.stream(input.split(",")) // 按逗号分割字符串
.map(String::trim) // 去除每个部分的前后空格
.collect(Collectors.toList()); // 收集为List
}
}

View File

@@ -54,4 +54,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="experience != null "> and experience = #{experience}</if>
</where>
</select>
<select id="selectByJobId" resultType="com.ruoyi.cms.domain.AppUser" parameterType="java.lang.Long">
SELECT * FROM app_user WHERE user_id IN (
select DISTINCT au.USER_ID from APP_USER au
INNER JOIN JOB_APPLY ja ON ja.USER_ID = au.USER_ID
WHERE au.DEL_FLAG = 0 AND ja.DEL_FLAG = 0 AND ja.JOB_Id = #{jobId})
</select>
</mapper>

View File

@@ -19,11 +19,10 @@
<result property="companyNature" column="company_nature" />
<result property="cardOrder" column="card_order" />
<result property="description" column="description" />
<result property="icon" column="icon" />
</resultMap>
<sql id="selectCompanyCardVo">
select company_card_id, name, targ, backgroud_color, del_flag, create_by, create_time, update_by, update_time, remark,status,company_nature,card_order,description,icon from company_card
select company_card_id, name, targ, backgroud_color, del_flag, create_by, create_time, update_by, update_time, remark,status,company_nature,card_order,description from company_card
</sql>
<select id="selectCompanyCardList" parameterType="CompanyCard" resultMap="CompanyCardResult">

View File

@@ -30,14 +30,14 @@
</where>
</select>
<select id="applyJob" resultType="com.ruoyi.cms.domain.Job">
select '2025-4-1' as applyTime,*
from job
where del_flag = 0
and is_publish = 1
and job_id in (SELECT DISTINCT (job_id)
FROM qd.job_apply
where del_flag = 0 and user_id = #{userId}
order by create_time desc)
SELECT ja.create_time AS applyTime, j.*
FROM job j
INNER JOIN job_apply ja ON j.job_id = ja.job_id
WHERE j.del_flag = 0
AND j.is_publish = 1
AND ja.del_flag = 0
AND ja.user_id = #{userId}
ORDER BY ja.create_time DESC
</select>
<select id="candidates" resultType="com.ruoyi.cms.domain.vo.CandidateVO">
SELECT au.*,jc.create_time as apply_date,jc.matching_degree

View File

@@ -23,7 +23,7 @@ public class TableDataInfo implements Serializable
/** 消息内容 */
private String msg;
private Object data;
/**
* 表格数据对象
*/
@@ -82,4 +82,13 @@ public class TableDataInfo implements Serializable
{
this.msg = msg;
}
public Object getData()
{
return data;
}
public void setData(Object data)
{
this.data = data;
}
}

View File

@@ -137,8 +137,7 @@ public class SysMenuServiceImpl implements ISysMenuService
}
else
{
//todo 用户权限bug修改
menus = menuMapper.selectMenuTreeAll();
menus = menuMapper.selectMenuTreeByUserId(userId);
}
return getChildPerms(menus, 0);
}