岗位业务逻辑完善

This commit is contained in:
2025-12-14 09:20:06 +08:00
parent 3361633dba
commit 4ef73a8ee8
39 changed files with 1720 additions and 188 deletions

View File

@@ -1,139 +0,0 @@
package com.vetti.filter;
import com.vetti.common.constant.CacheConstants;
import com.vetti.common.constant.SecurityConstants;
import com.vetti.common.constant.TokenConstants;
import com.vetti.common.core.redis.RedisService;
import com.vetti.common.utils.JwtUtils;
import com.vetti.common.utils.MessageUtils;
import com.vetti.common.utils.StringUtils;
import com.vetti.config.IgnoreWhiteProperties;
import io.jsonwebtoken.Claims;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* APP登录鉴权
*
* @author wangxiangshun
*/
@Component
@WebFilter
public class AuthFilter implements Filter
{
private static final Logger log = LoggerFactory.getLogger(AuthFilter.class);
// 排除过滤的 uri 地址
@Autowired
private IgnoreWhiteProperties ignoreWhite;
@Autowired
private RedisService redisService;
/**
* 获取缓存key
*/
private String getTokenKey(String token)
{
return CacheConstants.LOGIN_TOKEN_KEY + token;
}
/**
* 获取请求token
*/
private String getToken(HttpServletRequest request)
{
String token = request.getHeader(SecurityConstants.AUTHORIZATION_HEADER);
// 如果前端设置了令牌前缀,则裁剪掉前缀
if (StringUtils.isNotEmpty(token) && token.startsWith(TokenConstants.PREFIX))
{
token = token.replaceFirst(TokenConstants.PREFIX, StringUtils.EMPTY);
}
return token;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
// 执行拦截逻辑
String url = httpRequest.getRequestURI();
// 跳过不需要验证的路径
if ((url != null && url.contains("/v1/app"))
&& !StringUtils.matches(url, ignoreWhite.getWhites()))
{
String token = getToken(httpRequest);
if (StringUtils.isEmpty(token))
{
// 认证失败:返回 401
sendResponse(httpResponse,HttpServletResponse.SC_UNAUTHORIZED, MessageUtils.messageCustomize("systemExceptionAuthFilter10001"));
// 中断请求
return;
}
Claims claims = JwtUtils.parseToken(token);
if (claims == null)
{
// 认证失败:返回 401
sendResponse(httpResponse,HttpServletResponse.SC_UNAUTHORIZED,MessageUtils.messageCustomize("systemExceptionAuthFilter10002"));
// 中断请求
return;
}
String userkey = JwtUtils.getUserKey(claims);
boolean islogin = redisService.hasKey(getTokenKey(userkey));
if (!islogin)
{
// 认证失败:返回 401
sendResponse(httpResponse,HttpServletResponse.SC_UNAUTHORIZED,MessageUtils.messageCustomize("systemExceptionAuthFilter10003"));
// 中断请求
return;
}
String userid = JwtUtils.getUserId(claims);
String username = JwtUtils.getUserName(claims);
if (StringUtils.isEmpty(userid) || StringUtils.isEmpty(username))
{
// 认证失败:返回 401
sendResponse(httpResponse,HttpServletResponse.SC_UNAUTHORIZED,MessageUtils.messageCustomize("systemExceptionAuthFilter10004"));
// 中断请求
return;
}
}
// 拦截通过,继续执行后续过滤器或控制器
chain.doFilter(request, response);
}
/**
* 返回响应结构体
* @param response
* @param code HTTP状态码
* @param message 提示信息
* @throws IOException
*/
private void sendResponse(HttpServletResponse response,int code, String message) throws IOException {
// 设置HTTP状态码
response.setStatus(code);
// 设置响应内容类型JSON格式便于前端解析
response.setContentType("application/json;charset=UTF-8");
// 构建响应体(包含错误信息)
String jsonResponse = String.format(
"{\"code\": "+code+", \"msg\": \"%s\"}",
message
);
// 写入响应并关闭流
PrintWriter writer = response.getWriter();
writer.write(jsonResponse);
writer.flush();
writer.close();
}
}

View File

@@ -0,0 +1,98 @@
package com.vetti.web.controller.hotake;
import com.vetti.common.annotation.Log;
import com.vetti.common.core.controller.BaseController;
import com.vetti.common.core.domain.R;
import com.vetti.common.core.page.TableDataInfo;
import com.vetti.common.enums.BusinessType;
import com.vetti.hotake.domain.HotakeInitScreQuestionsReplyRecordInfo;
import com.vetti.hotake.service.IHotakeInitScreQuestionsReplyRecordInfoService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 初步筛选问题回答记录信息Controller
*
* @author wangxiangshun
* @date 2025-12-14
*/
@Api(tags ="初步筛选问题回答记录信息")
@RestController
@RequestMapping("/hotake/initScreQuestionsReplyRecordInfo")
public class HotakeInitScreQuestionsReplyRecordInfoController extends BaseController
{
@Autowired
private IHotakeInitScreQuestionsReplyRecordInfoService hotakeInitScreQuestionsReplyRecordInfoService;
/**
* 查询初步筛选问题回答记录信息列表
*/
@ApiOperation("查询初步筛选问题回答记录信息列表")
@GetMapping("/getPageList")
public TableDataInfo pageList(HotakeInitScreQuestionsReplyRecordInfo hotakeInitScreQuestionsReplyRecordInfo)
{
startPage();
List<HotakeInitScreQuestionsReplyRecordInfo> list = hotakeInitScreQuestionsReplyRecordInfoService.selectHotakeInitScreQuestionsReplyRecordInfoList(hotakeInitScreQuestionsReplyRecordInfo);
return getDataTable(list);
}
/**
* 查询初步筛选问题回答记录信息列表(无分页)
*/
@ApiOperation("查询初步筛选问题回答记录信息列表(无分页)")
@GetMapping("/getList")
public R<List<HotakeInitScreQuestionsReplyRecordInfo>> list(HotakeInitScreQuestionsReplyRecordInfo hotakeInitScreQuestionsReplyRecordInfo)
{
List<HotakeInitScreQuestionsReplyRecordInfo> list = hotakeInitScreQuestionsReplyRecordInfoService.selectHotakeInitScreQuestionsReplyRecordInfoList(hotakeInitScreQuestionsReplyRecordInfo);
return R.ok(list);
}
/**
* 获取初步筛选问题回答记录信息详细信息
*/
@ApiOperation("获取初步筛选问题回答记录信息详细信息")
@GetMapping(value = "/{id}")
public R<HotakeInitScreQuestionsReplyRecordInfo> getInfo(@PathVariable("id") Long id)
{
return R.ok(hotakeInitScreQuestionsReplyRecordInfoService.selectHotakeInitScreQuestionsReplyRecordInfoById(id));
}
/**
* 新增初步筛选问题回答记录信息
*/
@ApiOperation("新增初步筛选问题回答记录信息")
@Log(title = "初步筛选问题回答记录信息", businessType = BusinessType.INSERT)
@PostMapping
public R<?> add(@RequestBody HotakeInitScreQuestionsReplyRecordInfo hotakeInitScreQuestionsReplyRecordInfo)
{
return R.ok(hotakeInitScreQuestionsReplyRecordInfoService.insertHotakeInitScreQuestionsReplyRecordInfo(hotakeInitScreQuestionsReplyRecordInfo));
}
/**
* 修改初步筛选问题回答记录信息
*/
@ApiOperation("修改初步筛选问题回答记录信息")
@Log(title = "初步筛选问题回答记录信息", businessType = BusinessType.UPDATE)
@PutMapping
public R<?> edit(@RequestBody HotakeInitScreQuestionsReplyRecordInfo hotakeInitScreQuestionsReplyRecordInfo)
{
return R.ok(hotakeInitScreQuestionsReplyRecordInfoService.updateHotakeInitScreQuestionsReplyRecordInfo(hotakeInitScreQuestionsReplyRecordInfo));
}
/**
* 删除初步筛选问题回答记录信息
*/
@ApiOperation("删除初步筛选问题回答记录信息")
@Log(title = "初步筛选问题回答记录信息", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<?> remove(@PathVariable Long[] ids)
{
return R.ok(hotakeInitScreQuestionsReplyRecordInfoService.deleteHotakeInitScreQuestionsReplyRecordInfoByIds(ids));
}
}

View File

@@ -0,0 +1,96 @@
package com.vetti.web.controller.hotake;
import com.vetti.common.annotation.Log;
import com.vetti.common.core.controller.BaseController;
import com.vetti.common.core.domain.R;
import com.vetti.common.core.page.TableDataInfo;
import com.vetti.common.enums.BusinessType;
import com.vetti.hotake.domain.HotakeInitialScreeningQuestionsInfo;
import com.vetti.hotake.service.IHotakeInitialScreeningQuestionsInfoService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 初步筛选问题信息Controller
*
* @author wangxiangshun
* @date 2025-12-14
*/
@Api(tags ="初步筛选问题信息")
@RestController
@RequestMapping("/hotake/initialScreeningQuestionsInfo")
public class HotakeInitialScreeningQuestionsInfoController extends BaseController
{
@Autowired
private IHotakeInitialScreeningQuestionsInfoService hotakeInitialScreeningQuestionsInfoService;
/**
* 查询初步筛选问题信息列表
*/
@ApiOperation("查询初步筛选问题信息列表")
@GetMapping("/getPageList")
public TableDataInfo pageList(HotakeInitialScreeningQuestionsInfo hotakeInitialScreeningQuestionsInfo)
{
startPage();
List<HotakeInitialScreeningQuestionsInfo> list = hotakeInitialScreeningQuestionsInfoService.selectHotakeInitialScreeningQuestionsInfoList(hotakeInitialScreeningQuestionsInfo);
return getDataTable(list);
}
/**
* 查询初步筛选问题信息列表(无分页)
*/
@ApiOperation("查询初步筛选问题信息列表(无分页)")
@GetMapping("/getList")
public R<List<HotakeInitialScreeningQuestionsInfo>> list(HotakeInitialScreeningQuestionsInfo hotakeInitialScreeningQuestionsInfo)
{
List<HotakeInitialScreeningQuestionsInfo> list = hotakeInitialScreeningQuestionsInfoService.selectHotakeInitialScreeningQuestionsInfoList(hotakeInitialScreeningQuestionsInfo);
return R.ok(list);
}
/**
* 获取初步筛选问题信息详细信息
*/
@ApiOperation("获取初步筛选问题信息详细信息")
@GetMapping(value = "/{id}")
public R<HotakeInitialScreeningQuestionsInfo> getInfo(@PathVariable("id") Long id)
{
return R.ok(hotakeInitialScreeningQuestionsInfoService.selectHotakeInitialScreeningQuestionsInfoById(id));
}
/**
* 新增初步筛选问题信息
*/
@ApiOperation("新增初步筛选问题信息")
@Log(title = "初步筛选问题信息", businessType = BusinessType.INSERT)
@PostMapping
public R<?> add(@RequestBody HotakeInitialScreeningQuestionsInfo hotakeInitialScreeningQuestionsInfo)
{
return R.ok(hotakeInitialScreeningQuestionsInfoService.insertHotakeInitialScreeningQuestionsInfo(hotakeInitialScreeningQuestionsInfo));
}
/**
* 修改初步筛选问题信息
*/
@ApiOperation("修改初步筛选问题信息")
@Log(title = "初步筛选问题信息", businessType = BusinessType.UPDATE)
@PutMapping
public R<?> edit(@RequestBody HotakeInitialScreeningQuestionsInfo hotakeInitialScreeningQuestionsInfo)
{
return R.ok(hotakeInitialScreeningQuestionsInfoService.updateHotakeInitialScreeningQuestionsInfo(hotakeInitialScreeningQuestionsInfo));
}
/**
* 删除初步筛选问题信息
*/
@ApiOperation("删除初步筛选问题信息")
@Log(title = "初步筛选问题信息", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<?> remove(@PathVariable Long[] ids)
{
return R.ok(hotakeInitialScreeningQuestionsInfoService.deleteHotakeInitialScreeningQuestionsInfoByIds(ids));
}
}

View File

@@ -3,15 +3,15 @@ package com.vetti.web.controller.hotake;
import com.vetti.common.annotation.Log;
import com.vetti.common.core.controller.BaseController;
import com.vetti.common.core.domain.AjaxResult;
import com.vetti.common.core.domain.R;
import com.vetti.common.core.page.TableDataInfo;
import com.vetti.common.enums.BusinessType;
import com.vetti.common.utils.poi.ExcelUtil;
import com.vetti.hotake.domain.HotakeRolesInfo;
import com.vetti.hotake.domain.dto.HotakeRolesInfoDto;
import com.vetti.hotake.service.IHotakeRolesInfoService;
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 java.util.List;
@@ -34,9 +34,8 @@ public class HotakeRolesInfoController extends BaseController
* 查询岗位信息列表
*/
@ApiOperation("查询岗位信息列表")
@PreAuthorize("@ss.hasPermi('hotake:rolesInfo:list')")
@GetMapping("/list")
public TableDataInfo list(HotakeRolesInfo hotakeRolesInfo)
@GetMapping("/getPageList")
public TableDataInfo listPage(HotakeRolesInfo hotakeRolesInfo)
{
startPage();
List<HotakeRolesInfo> list = hotakeRolesInfoService.selectHotakeRolesInfoList(hotakeRolesInfo);
@@ -44,35 +43,30 @@ public class HotakeRolesInfoController extends BaseController
}
/**
* 导出岗位信息列表
* 查询岗位信息列表(无分页)
*/
@ApiOperation("导出岗位信息列表")
@PreAuthorize("@ss.hasPermi('hotake:rolesInfo:export')")
@Log(title = "岗位信息", businessType = BusinessType.EXPORT)
@GetMapping("/export")
public AjaxResult export(HotakeRolesInfo hotakeRolesInfo)
@ApiOperation("查询岗位信息列表(无分页)")
@GetMapping("/getList")
public R<List<HotakeRolesInfo>> list(HotakeRolesInfo hotakeRolesInfo)
{
List<HotakeRolesInfo> list = hotakeRolesInfoService.selectHotakeRolesInfoList(hotakeRolesInfo);
ExcelUtil<HotakeRolesInfo> util = new ExcelUtil<HotakeRolesInfo>(HotakeRolesInfo.class);
return util.exportExcel(list, "岗位信息数据");
return R.ok(list);
}
/**
* 获取岗位信息详细信息
*/
@ApiOperation("获取岗位信息详细信息")
@PreAuthorize("@ss.hasPermi('hotake:rolesInfo:query')")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id)
public R<HotakeRolesInfoDto> getInfo(@PathVariable("id") Long id)
{
return AjaxResult.success(hotakeRolesInfoService.selectHotakeRolesInfoById(id));
return R.ok(hotakeRolesInfoService.selectHotakeRolesInfoDtoById(id));
}
/**
* 新增岗位信息
*/
@ApiOperation("新增岗位信息")
@PreAuthorize("@ss.hasPermi('hotake:rolesInfo:add')")
@Log(title = "岗位信息", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody HotakeRolesInfo hotakeRolesInfo)
@@ -84,7 +78,6 @@ public class HotakeRolesInfoController extends BaseController
* 修改岗位信息
*/
@ApiOperation("修改岗位信息")
@PreAuthorize("@ss.hasPermi('hotake:rolesInfo:edit')")
@Log(title = "岗位信息", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody HotakeRolesInfo hotakeRolesInfo)
@@ -96,11 +89,23 @@ public class HotakeRolesInfoController extends BaseController
* 删除岗位信息
*/
@ApiOperation("删除岗位信息")
@PreAuthorize("@ss.hasPermi('hotake:rolesInfo:remove')")
@Log(title = "岗位信息", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids)
public R<?> remove(@PathVariable Long[] ids)
{
return toAjax(hotakeRolesInfoService.deleteHotakeRolesInfoByIds(ids));
return R.ok(hotakeRolesInfoService.deleteHotakeRolesInfoByIds(ids));
}
/**
* 保存岗位信息
*/
@ApiOperation("保存岗位信息")
@Log(title = "保存岗位信息", businessType = BusinessType.INSERT)
@PostMapping("/save")
public R<HotakeRolesInfoDto> save(@RequestBody HotakeRolesInfoDto hotakeRolesInfo)
{
return R.ok(hotakeRolesInfoService.saveHotakeRolesInfo(hotakeRolesInfo));
}
}

View File

@@ -79,7 +79,7 @@ public class SysDictDataController extends BaseController
*/
@ApiOperation("根据字典类型查询字典数据信息(hotake_languages_type:语言类型,hotake_skills_tool_type:技能工具类型," +
"role_level:岗位级别,role_location_type:岗位地点类型,role_select_job_type:岗位选择工作类型,role_type:岗位类型," +
"role_required_skills:所需技能,role_nice_to_have_skills:拥有的好技能,role_education_requirements_type:教育要求类型," +
"role_required_skills:所需技能,role_nice_to_have_skills:加分技能,role_education_requirements_type:教育要求类型," +
"role_certification_licenses:岗位所需证书,role_benefits:岗位福利,role_publishing_channels:发布渠道)")
@GetMapping(value = "/type/{dictType}")
public R<List<SysDictData>> dictType(@PathVariable String dictType)

View File

@@ -177,4 +177,4 @@ chatGpt:
http:
client:
connect-timeout-seconds: 10
connect-timeout-seconds: 600

View File

@@ -36,6 +36,9 @@ spring:
restart:
# 热部署开关
enabled: true
mvc:
async:
request-timeout: 120000
# token配置
token:

View File

@@ -55,6 +55,10 @@ systemSysRegisterService10007 = Registration failed, please contact the system a
systemEmailUtil10001 = Sending Email Failed
systemR10001 = Operation Successful
systemR10002 = Operation Failed
HotakeRolesInfoServiceImpl10001 = The job information is abnormal. Please try again later
#管理端
# manager.页面,字段 = User Manager
VerificationEmailTiTle = Your verification code

View File

@@ -54,6 +54,9 @@ systemEmailUtil10001 = 发送邮件失败
systemR10001 = 操作成功
systemR10002 = 操作失败
HotakeRolesInfoServiceImpl10001 = 岗位信息异常,请稍后再试
#管理端
# manager.页面,字段 = 用户管理
VerificationEmailTiTle = 你的验证码

View File

@@ -177,4 +177,4 @@ chatGpt:
http:
client:
connect-timeout-seconds: 10
connect-timeout-seconds: 600

View File

@@ -36,6 +36,9 @@ spring:
restart:
# 热部署开关
enabled: true
mvc:
async:
request-timeout: 120000
# token配置
token:

View File

@@ -55,6 +55,10 @@ systemSysRegisterService10007 = Registration failed, please contact the system a
systemEmailUtil10001 = Sending Email Failed
systemR10001 = Operation Successful
systemR10002 = Operation Failed
HotakeRolesInfoServiceImpl10001 = The job information is abnormal. Please try again later
#管理端
# manager.页面,字段 = User Manager
VerificationEmailTiTle = Your verification code

View File

@@ -54,6 +54,9 @@ systemEmailUtil10001 = 发送邮件失败
systemR10001 = 操作成功
systemR10002 = 操作失败
HotakeRolesInfoServiceImpl10001 = 岗位信息异常,请稍后再试
#管理端
# manager.页面,字段 = 用户管理
VerificationEmailTiTle = 你的验证码