This commit is contained in:
2026-01-09 20:13:01 +08:00
parent 91195d3b42
commit 0282dbb0e7
665 changed files with 168201 additions and 0 deletions

View File

@@ -0,0 +1,296 @@
package com.ruoyi.cms.config;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.cms.domain.chat.ChatRequest;
import com.ruoyi.common.utils.StringUtils;
import lombok.var;
import okhttp3.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
@Component
public class ChatClient {
// 超时设置(单位:秒)
private static final int CONNECT_TIMEOUT = 30;
private static final int WRITE_TIMEOUT = 30;
private static final int READ_TIMEOUT = 300; // 流式响应不设置读取超时
// 单例 OkHttp 客户端(复用连接池)
private static final OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS)
.readTimeout(READ_TIMEOUT, TimeUnit.SECONDS)
.build();
private static final String CHAT_ENDPOINT = "chat";
private static final String CHAT_HISTORY = "history";
public static final List<String> TEXT_FILE_EXTENSIONS= Arrays.asList(".txt", ".md", ".html", ".doc", ".docx", ".pdf", ".ppt", ".pptx", ".csv", ".xls", ".xlsx");
public static final List<String> IMAGE_FILE_EXTENSIONS=Arrays.asList(".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp");
private ChatConfig chatConfig;
@Autowired
public void setChatConfig(ChatConfig chatConfig) {
this.chatConfig = chatConfig;
}
@Value("${spring.profiles.active}")
private String env;
/**
* 发送流式聊天请求
* @param chatRequest 查询请求体
* @param callback 流式响应回调接口
*/
public void sendStreamingChat(ChatRequest chatRequest, StreamCallback callback) {
String url=chatConfig.getBaseUrl()+chatConfig.getChatUrl();
// 构建请求体
String jsonBody = buildChatRequestBody(chatRequest, CHAT_ENDPOINT);
// 构建请求
Request request = null;
try {
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),jsonBody);
request = new Request.Builder()
.url(url)
.addHeader("Content-Type", "application/json")
.addHeader("Authorization", "Bearer " + chatConfig.getApiKey())
.post(body).build();
}catch (Exception e){
e.printStackTrace();
callback.onError(new RuntimeException("构建请求失败: " + e.getMessage(), e));
return;
}
// 发送异步请求
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
callback.onError(new RuntimeException("请求发送失败: " + e.getMessage(), e));
}
@Override
public void onResponse(Call call, Response response) throws IOException {
try {
if (!response.isSuccessful()) {
String errorBody = response.body() != null ? response.body().string() : "无错误信息";
String errorMsg = String.format("API 响应错误: 状态码=%d, 错误信息=%s",
response.code(), errorBody);
System.err.println(errorMsg); // 打印详细错误
callback.onError(new RuntimeException(errorMsg));
return;
}
// 处理流式响应
ResponseBody body = response.body();
if (body == null) {
callback.onError(new RuntimeException("响应体为空"));
return;
}
// 逐行读取 SSE 格式的响应
try (var bufferedSource = body.source()) {
while (!bufferedSource.exhausted()) {
String chunk = bufferedSource.readUtf8Line();
if (chunk != null && !chunk.trim().isEmpty()) {
callback.onData(chunk);
}
}
}
// 通知流结束
callback.onComplete();
} catch (Exception e) {
String errorMsg = "处理响应失败: " + e.getMessage();
System.err.println(errorMsg);
callback.onError(new RuntimeException(errorMsg, e));
} finally {
response.close();
}
}
});
}
/**
* 构建聊天请求的 JSON 体
*/
/**
* 构建聊天请求的 JSON 体
* 根据文档 [cite: 162-172] 修改为 Vision API 兼容格式
*/
private String buildChatRequestBody(ChatRequest chatRequest, String key) {
JSONObject chatObject = new JSONObject();
// 1. 设置会话ID (如果有)
if(StringUtils.isNotEmpty(chatRequest.getSessionId())){
chatObject.put("chatId", chatRequest.getSessionId());
}
if("chat".equals(key)){
// 基础参数设置
chatObject.put("stream", true);
chatObject.put("model", chatConfig.getModel()); // 需确保为 "qd-job-turbo"
chatObject.put("user", chatRequest.getSessionId());
// 2. 获取历史消息列表,如果为空则初始化
JSONArray messages = chatRequest.getMessages();
if (messages == null) {
messages = new JSONArray();
}
// 3. 构建当前用户的多模态消息内容 (Multimodal Content) [cite: 162]
JSONArray contentArray = new JSONArray();
// 3.1 添加文本内容 [cite: 166, 172]
if(StringUtils.isNotEmpty(chatRequest.getData())){
JSONObject textPart = new JSONObject();
textPart.put("type", "text");
textPart.put("text", chatRequest.getData());
contentArray.add(textPart);
}
// 3.2 添加文件内容 (图片、PDF、Excel等) [cite: 174, 180, 232]
// 文档说明image_url 字段兼容 PDF, Excel, PPT 等所有 OCR 支持的文件
if(!CollectionUtils.isEmpty(chatRequest.getFileUrl())){
for(String url : chatRequest.getFileUrl()){
String finalUrl = "";
if(Objects.equals(env, "pro")){
finalUrl = url.replace("https://fw.rc.qingdao.gov.cn/rgpp-api/api/ng", "http://10.213.6.207:19010");
}else {
finalUrl = url;
}
// 处理内网/外网地址映射 (保留你原有的逻辑)
JSONObject filePart = new JSONObject();
filePart.put("type", "image_url"); // 固定为 image_url [cite: 174]
JSONObject imageUrlObj = new JSONObject();
imageUrlObj.put("url", finalUrl); // 文件地址 [cite: 172]
filePart.put("image_url", imageUrlObj);
contentArray.add(filePart);
}
}
// 4. 将当前消息封装为 User Message 对象并加入消息列表 [cite: 151, 163]
// 只有当有内容(文本或文件)时才添加
if (!contentArray.isEmpty()) {
JSONObject currentUserMessage = new JSONObject();
currentUserMessage.put("role", "user");
currentUserMessage.put("content", contentArray); // content 为数组格式
messages.add(currentUserMessage);
}
// 5. 将完整的消息列表放入请求体 [cite: 135]
chatObject.put("messages", messages);
} else {
// 非 chat 场景的逻辑保留
chatObject.put("appId", chatConfig.getAppId());
}
return chatObject.toJSONString();
}
/**
* 简单的 JSON 转义处理(防止特殊字符破坏 JSON 格式)
*/
private String escapeJson(String value) {
if (value == null) return "";
return value
.replace("\\", "\\\\")
.replace("\"", "\\\"")
.replace("\b", "\\b")
.replace("\f", "\\f")
.replace("\n", "\\n")
.replace("\r", "\\r")
.replace("\t", "\\t");
}
/**
* 发送聊天请求并返回完整JSON响应
* @param chatRequest 用户输入的查询内容
* @return 完整的JSON响应字符串
* @throws IOException 网络请求异常
*/
public String sendChatGuest(ChatRequest chatRequest) throws IOException {
String url=chatConfig.getBaseUrl()+chatConfig.getGuestUrl();
JSONArray array = chatRequest.getMessages();
if(array==null||array.isEmpty()||array.size()==0){
array = new JSONArray();
}
JSONObject contentObject = new JSONObject();
contentObject.put("content","你是一个岗位招聘专家请根据用户的问题生成用户下一步想要提出的问题。需要以用户的口吻进行生成。结合上下文中用户提出的问题以及助手回复的答案需要猜测用户更进一步的需求例如期望的薪资期望的工作地点掌握的技能。生成的问题举例有没有薪资在9000以上的工作我的学历是本科。我希望找国企。注意不仅限于这些还要根据上下文。其次所有的问题应该限定在青岛。并且只生成3到4个。");
contentObject.put("role","system");
array.add(contentObject);
JSONObject jsonBody = new JSONObject();
jsonBody.put("stream",false);
jsonBody.put("model",chatConfig.getModel());
jsonBody.put("messages",array);
// 构建请求(使用非流式响应模式)
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), String.valueOf(jsonBody));
Request request = new Request.Builder()
.url(url)
.addHeader("Content-Type", "application/json")
.addHeader("Authorization", "Bearer " + chatConfig.getApiKey())
.post(requestBody).build();
// 发送同步请求
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) {
String errorBody = response.body() != null ? response.body().string() : "无错误信息";
String errorMsg = String.format("API 响应错误: 状态码=%d, 错误信息=%s",
response.code(), errorBody);
throw new IOException(errorMsg);
}
ResponseBody body = response.body();
if (body == null) {
throw new IOException("响应体为空");
}
JSONObject object = JSONObject.parseObject(body.string());
String choices = object.getString("choices");
if (choices != null && !choices.trim().isEmpty()) {
JSONArray jsonArray = JSONArray.parseArray(choices);
object = JSONObject.parseObject(jsonArray.getString(0));
object = object.getJSONObject("message");
String content = object.getString("content");// 消息内容
return content;
}
return body.string();
}
}
/**
* 流式响应回调接口
*/
public interface StreamCallback {
/**
* 接收分片数据
* @param chunk SSE 格式的分片数据
*/
void onData(String chunk);
/**
* 响应结束
*/
void onComplete();
/**
* 发生错误
* @param e 异常信息
*/
void onError(Throwable e);
}
}

View File

@@ -0,0 +1,115 @@
package com.ruoyi.cms.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "chat")
public class ChatConfig {
private String baseUrl;
private String chatUrl;
private String chatDetailUrl;
private String chatHistoryUrl;
private String updateNameUrl;
private String delChatUrl;
private String delAllChatUrl;
private String guestUrl;
private String praiseUrl;
private String apiKey;
private String appId;
private String model;
public String getBaseUrl() {
return baseUrl;
}
public void setBaseUrl(String baseUrl) {
this.baseUrl = baseUrl;
}
public String getChatUrl() {
return chatUrl;
}
public void setChatUrl(String chatUrl) {
this.chatUrl = chatUrl;
}
public String getChatDetailUrl() {
return chatDetailUrl;
}
public void setChatDetailUrl(String chatDetailUrl) {
this.chatDetailUrl = chatDetailUrl;
}
public String getChatHistoryUrl() {
return chatHistoryUrl;
}
public void setChatHistoryUrl(String chatHistoryUrl) {
this.chatHistoryUrl = chatHistoryUrl;
}
public String getUpdateNameUrl() {
return updateNameUrl;
}
public void setUpdateNameUrl(String updateNameUrl) {
this.updateNameUrl = updateNameUrl;
}
public String getDelChatUrl() {
return delChatUrl;
}
public void setDelChatUrl(String delChatUrl) {
this.delChatUrl = delChatUrl;
}
public String getDelAllChatUrl() {
return delAllChatUrl;
}
public void setDelAllChatUrl(String delAllChatUrl) {
this.delAllChatUrl = delAllChatUrl;
}
public String getGuestUrl() {
return guestUrl;
}
public void setGuestUrl(String guestUrl) {
this.guestUrl = guestUrl;
}
public String getPraiseUrl() {
return praiseUrl;
}
public void setPraiseUrl(String praiseUrl) {
this.praiseUrl = praiseUrl;
}
public String getApiKey() {
return apiKey;
}
public void setApiKey(String apiKey) {
this.apiKey = apiKey;
}
public String getAppId() {
return appId;
}
public void setAppId(String appId) {
this.appId = appId;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
}

View File

@@ -0,0 +1,17 @@
package com.ruoyi.cms.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
public class WebSocketConfig {
/**
* 注册 WebSocket 端点
*/
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}

View File

@@ -0,0 +1,10 @@
package com.ruoyi.cms.constant;
public class CommonConstant {
/**
* 地铁线路缓存
*/
public static final String SUBWAY_LINE_CACHE = "common_cache:subway";
public static final String COMMERICIAL_AREA = "common_cache:comericial_area";
public static final String JOB_TITLE = "common_cache:job_titile";
}

View File

@@ -0,0 +1,77 @@
package com.ruoyi.cms.controller.app;
import com.ruoyi.cms.domain.BussinessDictData;
import com.ruoyi.cms.domain.CommercialArea;
import com.ruoyi.cms.domain.SubwayLine;
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 io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
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.List;
import java.util.Map;
@RestController
@RequestMapping("/app/common")
@Api(tags = "移动端:常用参数查询")
public class AppCommonController extends BaseController {
@Autowired
private ISubwayLineService iSubwayLineService;
@Autowired
private ICommercialAreaService iCommercialAreaService;
@Autowired
private IJobTitleService iJobTitleService;
@Autowired
private IIndustryService industryService;
@Autowired
private IBussinessDictTypeService iBussinessDictTypeService;
@ApiOperation("查询地铁")
@GetMapping("/subway")
public AjaxResult subway()
{
List<SubwayLine> list = iSubwayLineService.appSubway();
return success(list);
}
@ApiOperation("查询商圈")
@GetMapping("/commercialArea")
public AjaxResult commercialArea()
{
List<CommercialArea> list = iCommercialAreaService.appCommercialArea();
return success(list);
}
@ApiOperation("查询职业 树结构")
@GetMapping("/jobTitle/treeselect")
public AjaxResult jobTitle()
{
List<TreeSelect> jobTitleList = iJobTitleService.appJobTitle();
return success(jobTitleList);
}
@ApiOperation("查询行业 树结构")
@GetMapping("/industry/treeselect")
public AjaxResult industry()
{
List<TreeSelect> industryList = industryService.appIndustry();
return success(industryList);
}
@ApiOperation("查询字典")
@GetMapping("/dict/{dictType}")
public AjaxResult listDict(@PathVariable String dictType)
{
List<BussinessDictData> dictData = iBussinessDictTypeService.selectDictDataByType(dictType);
return success(dictData);
}
@ApiOperation("字段标准")
@GetMapping("/standar/filed")
public AjaxResult standarFiled()
{
Map<String,Object> filed = iBussinessDictTypeService.standarFiled();
return success(filed);
}
}

View File

@@ -0,0 +1,58 @@
package com.ruoyi.cms.controller.app;
import com.ruoyi.cms.domain.vo.CompanyContactVo;
import com.ruoyi.cms.service.CompanyContactService;
import com.ruoyi.cms.util.ListUtil;
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.domain.entity.CompanyContact;
import com.ruoyi.common.core.page.TableDataInfo;
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;
/**
* 公司联系人
*
* @author
* @email
* @date 2025-09-30 15:57:06
*/
@RestController
@RequestMapping("/app/companycontact")
@Api(tags = "移动端:公司联系人")
public class AppCompanyContactController extends BaseController {
@Autowired
private CompanyContactService companyContactService;
/**
* 列表
*/
@ApiOperation("公司联系人列表")
@GetMapping("/list")
public TableDataInfo list(CompanyContact companyContact){
List<CompanyContact> list=companyContactService.getSelectList(companyContact);
return getDataTable(list);
}
@BussinessLog(title = "移动端保存企业联系人")
@PostMapping("/batchInsertUpdate")
public AjaxResult batchInsertUpdate(@RequestBody CompanyContactVo contactVo)
{
if (contactVo == null) {
return AjaxResult.error("请求参数不能为空");
}
List<CompanyContact> contactList = contactVo.getCompanyContactList();
if (ListUtil.isListObjectEmptyOrNull(contactList)) { // 假设 ListUtil 工具类判断 null 或空集合
return AjaxResult.error("请至少填写一条联系人信息");
}
companyContactService.insertUpadteCompanyContact(contactList);
return success();
}
}

View File

@@ -0,0 +1,155 @@
package com.ruoyi.cms.controller.app;
import com.ruoyi.common.core.domain.entity.Company;
import com.ruoyi.cms.domain.CompanyCard;
import com.ruoyi.cms.domain.query.LabelQuery;
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.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.utils.StringUtils;
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.web.bind.annotation.*;
import java.util.List;
/**
* 公司Controller
*
* @author lishundong
* @date 2024-09-04
*/
@RestController
@RequestMapping("/app/company")
@Api(tags = "移动端:公司")
public class AppCompanyController extends BaseController
{
@Autowired
private ICompanyService companyService;
@Autowired
private ICompanyCollectionService companyCollectionService;
@Autowired
private ICompanyCardService companyCardService;
@Autowired
private CompanyCardMapper companyCardMapper;
/**
* 获取公司详细信息
*/
@ApiOperation("获取公司详细信息")
@GetMapping(value = "/{companyId}")
public AjaxResult getInfo(@PathVariable("companyId") Long companyId)
{
return success(companyService.selectCompanyByCompanyId(companyId));
}
/**
* 用户收藏公司
*/
@BussinessLog(title = "用户收藏公司")
@PostMapping("/collection/{companyId}")
@ApiOperation("用户收藏公司")
public AjaxResult companyCollection(@PathVariable("companyId") Long companyId)
{
return toAjax(companyCollectionService.companyCollection(companyId));
}
/**
* 用户取消收藏公司
*/
@BussinessLog(title = "用户取消收藏公司")
@DeleteMapping("/collection/{companyId}")
@ApiOperation("用户取消收藏公司")
public AjaxResult companyCancel(@PathVariable("companyId") Long companyId)
{
return toAjax(companyCollectionService.companyCancel(companyId));
}
/**
* 公司下的岗位
*/
@GetMapping("/job/{companyId}")
@ApiOperation("公司下的岗位")
public TableDataInfo jobCompany(@ApiParam("公司id") @PathVariable Long companyId)
{
startPage();
return getDataTable(companyCollectionService.jobCompany(companyId));
}
@GetMapping("/card")
@ApiOperation("查看企业卡片")
public TableDataInfo card()
{
startPage();
return getDataTable(companyCardService.cardApp());
}
@BussinessLog(title = "收藏企业卡片")
@PutMapping("/card/collection/{companyCardId}")
@ApiOperation("收藏企业卡片")
public AjaxResult cardCollection(@PathVariable Long companyCardId)
{
companyCardService.cardCollection(companyCardId);
return success();
}
@BussinessLog(title = "取消收藏企业卡片")
@DeleteMapping("/card/collection/{companyCardId}")
@ApiOperation("取消收藏公司卡片")
public AjaxResult cardCancel(@PathVariable Long companyCardId)
{
companyCardService.cardCancel(companyCardId);
return success();
}
@GetMapping("/count/{companyId}")
@ApiOperation("公司招聘的岗位数量")
public AjaxResult count(@PathVariable Long companyId)
{
Integer count = companyService.count(companyId);
return success(count);
}
@GetMapping("/label")
@ApiOperation("公司标签下的公司")
public TableDataInfo label(LabelQuery labelQuery)
{
CompanyCard companyCard = companyCardMapper.selectById(labelQuery.getCardId());
startPage();
List<Company> companyList = companyService.label(companyCard,labelQuery);
return getDataTable(companyList);
}
@PostMapping("/register")
@ApiOperation("招聘企业登记")
@BussinessLog(title = "招聘企业登记")
public AjaxResult register(Company company)
{
companyService.register(company);
return AjaxResult.success();
}
@GetMapping("/register/status")
@ApiOperation("招聘企业登记进度查询")
public AjaxResult registerStatus()
{
Company status = companyService.registerStatus();
return AjaxResult.success(status);
}
@GetMapping("/queryCodeCompany")
@ApiOperation("根据社会信用代码查询企业")
public AjaxResult queryCodeCompany(@RequestParam("code") String code)
{
if (!StringUtils.hasText(code)) {
return AjaxResult.error("社会信用代码不能为空");
}
return AjaxResult.success(companyService.queryCodeCompany(code));
}
@ApiOperation("模糊查询公司列表")
@GetMapping("/likeList")
public TableDataInfo likeList(Company company)
{
List<Company> list = companyService.selectLikeCompanyList(company);
return getDataTable(list);
}
}

View File

@@ -0,0 +1,74 @@
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.BussinessLog;
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.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 招聘会Controller
*
* @author lishundong
* @date 2024-09-04
*/
@RestController
@RequestMapping("/app/fair")
@Api(tags = "移动端:招聘会")
public class AppFairController extends BaseController
{
@Autowired
private IJobFairService jobFairService;
@Autowired
private IFairCollectionService fairCollectionService;
/**
* 招聘会列表
*/
@BussinessLog(title = "招聘会列表")
@GetMapping
public TableDataInfo list(JobFair jobFair)
{
startPage();
List<JobFair> results = jobFairService.appList(jobFair);
return getDataTable(results);
}
/**
* 招聘会详情
*/
@BussinessLog(title = "招聘会详情")
@GetMapping("/{fairId}")
public AjaxResult appDetail(@ApiParam("招聘会id") @PathVariable Long fairId)
{
return success(jobFairService.appDetail(fairId));
}
/**
* 用户收藏招聘会
*/
@BussinessLog(title = "用户收藏招聘会")
@PostMapping("/collection/{fairId}")
public AjaxResult companyCollection(@ApiParam("招聘会id") @PathVariable Long fairId)
{
return toAjax(fairCollectionService.fairCollection(fairId));
}
/**
* 用户取消收藏招聘会
*/
@BussinessLog(title = "用户取消收藏招聘会")
@DeleteMapping("/collection/{fairId}")
public AjaxResult companyCancel(@ApiParam("招聘会id") @PathVariable Long fairId)
{
return toAjax(fairCollectionService.cancel(fairId));
}
}

View File

@@ -0,0 +1,65 @@
package com.ruoyi.cms.controller.app;
import com.ruoyi.cms.util.IdGenerator;
import com.ruoyi.cms.util.ProxyServerUtil;
import com.ruoyi.common.core.domain.entity.File;
import com.ruoyi.cms.service.IFileService;
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.utils.SecurityUtils;
import com.ruoyi.common.utils.SiteSecurityUtils;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
@RestController
@RequestMapping("/app/file")
public class AppFileController extends BaseController {
@Autowired
private IFileService fileService;
@Autowired
private IdGenerator idGenerator;
@ApiOperation("上传文件")
@PostMapping("/upload")
public AjaxResult upload(@RequestParam("file") MultipartFile file, @RequestParam(value = "bussinessid",required = false) Long bussinessId) {
if(!(SiteSecurityUtils.isLogin() || SecurityUtils.isLogin())){
return AjaxResult.error("未登录,请登录后在上传文件!");
}
return fileService.upload(file,bussinessId);
}
@ApiOperation("获取附件列表")
@GetMapping("/list")
public TableDataInfo list(File file)
{
List<File> results = fileService.selectFileList(file);
return getDataTable(results);
}
@ApiOperation("删除附件")
@DeleteMapping("/{id}")
public AjaxResult remove(@PathVariable Long id)
{
return toAjax(fileService.deleteFileByIds(new Long[]{id}));
}
@ApiOperation("上传文件")
@PostMapping("/uploadFile")
public AjaxResult uploadFile(@RequestParam("file") MultipartFile file, @RequestParam(value = "bussinessid",required = false) Long bussinessId, HttpServletRequest request) {
String proxyServer = ProxyServerUtil.getProxyServer(request);
System.out.println("获取服务器地址======================"+proxyServer);
if(!(SiteSecurityUtils.isLogin() || SecurityUtils.isLogin())){
return AjaxResult.error("未登录,请登录后在上传文件!");
}
if(bussinessId==null){
bussinessId=idGenerator.generateId();
}
return fileService.uploadFile(file,bussinessId,request);
}
}

View File

@@ -0,0 +1,240 @@
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.service.ICompanyService;
import com.ruoyi.cms.service.IESJobSearchService;
import com.ruoyi.cms.service.IJobCollectionService;
import com.ruoyi.cms.service.IJobService;
import com.ruoyi.cms.util.RoleUtils;
import com.ruoyi.cms.util.sensitiveWord.SensitiveWordChecker;
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 io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.commons.lang3.ArrayUtils;
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.List;
/**
* 岗位Controller
*
* @author lishundong
* @date 2024-09-03
*/
@RestController
@RequestMapping("/app/job")
@Api(tags = "移动端:岗位相关接口")
public class AppJobController extends BaseController
{
@Autowired
private IJobService jobService;
@Autowired
private IJobCollectionService jobCollectionService;
@Autowired
private IESJobSearchService esJobSearchService;
@Autowired
private SensitiveWordChecker sensitiveWordChecker;
/**
* 查询岗位列表
*/
@ApiOperation("查询岗位列表")
@GetMapping("/list")
public TableDataInfo list(ESJobSearch job)
{
EsPageInfo<ESJobDocument> list = jobService.appList(job);
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条推荐岗位
*/
@ApiOperation("获取推荐岗位")
@GetMapping("/recommend")
public AjaxResult recommend(ESJobSearch esJobSearch)
{
if (RoleUtils.getAppCurrentUseridCard() != null) {
esJobSearch.setCode(RoleUtils.getAppCurrentUseridCard());
esJobSearch.setUserType(RoleUtils.getAppIscompanyUser());
}
List<ESJobDocument> jobList = jobService.recommend(esJobSearch);
return success(jobList);
}
@ApiOperation("获取短视频")
@GetMapping("/littleVideo")
public AjaxResult littleVideo(ESJobSearch esJobSearch)
{
List<ESJobDocument> jobList = jobService.littleVideo(esJobSearch);
return success(jobList);
}
@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);
}
/**
* 附件工作
*/
@ApiOperation("附近工作")
@PostMapping(value = "/nearJob")
public TableDataInfo nearJob(@RequestBody ESJobSearch jobQuery)
{
EsPageInfo<ESJobDocument> list = esJobSearchService.nearJob(jobQuery);
List<ESJobDocument> jobList = list.getList();
list.setList(jobList);
return getTableDataInfo(list);
}
/**
* 附件工作
*/
@ApiOperation("区县工作")
@PostMapping(value = "/countyJob")
public TableDataInfo countyJob(@RequestBody ESJobSearch job)
{
EsPageInfo<ESJobDocument> list = jobService.countyJobList(job);
List<ESJobDocument> jobList = list.getList();
list.setList(jobList);
return getTableDataInfo(list);
}
/**
* 地铁周边
*/
@ApiOperation("地铁周边")
@PostMapping(value = "/subway")
public TableDataInfo subway(@RequestBody ESJobSearch jobQuery)
{
EsPageInfo<ESJobDocument> list = jobService.subway(jobQuery);
List<ESJobDocument> jobList = list.getList();
list.setList(jobList);
return getTableDataInfo(list);
}
/**
* 商圈周边
*/
@ApiOperation("商圈周边")
@PostMapping(value = "/commercialArea")
public TableDataInfo commercialArea(@RequestBody ESJobSearch jobQuery)
{
EsPageInfo<ESJobDocument> list = jobService.commercialArea(jobQuery);
List<ESJobDocument> jobList = list.getList();
list.setList(jobList);
return getTableDataInfo(list);
}
/**
* 获取岗位详细信息
*/
@ApiOperation("获取岗位详细信息")
@GetMapping(value = "/{jobId}")
public AjaxResult getInfo(@PathVariable("jobId") Long jobId, HttpServletRequest request)
{
if (jobId == null) {
return AjaxResult.error("jobId不能为空");
}
//Job job = jobService.selectJobByJobIdApp(jobId);
Job job = jobService.selectHttpJobByJobIdApp(jobId,request);
return success(job);
}
/**
* 用户收藏岗位
*/
@BussinessLog(title = "用户收藏岗位")
@PostMapping("/collection/{jobId}")
@ApiOperation("用户收藏")
public AjaxResult jobCollection(@ApiParam("岗位id") @PathVariable Long jobId)
{
return toAjax(jobCollectionService.jobCollection(jobId));
}
/**
* 用户取消收藏岗位
*/
@BussinessLog(title = "用户取消收藏岗位")
@DeleteMapping("/collection/{jobId}")
@ApiOperation("用户取消收藏岗位")
public AjaxResult cancel(@ApiParam("岗位id") @PathVariable Long jobId)
{
return toAjax(jobCollectionService.cancel(jobId));
}
/**
* 用户申请岗位
*/
@BussinessLog(title = "用户申请岗位")
@GetMapping("/apply/{jobId}")
@ApiOperation("用户申请岗位")
public AjaxResult apply(@ApiParam("岗位id") @PathVariable Long jobId)
{
return toAjax(jobCollectionService.apply(jobId));
}
@GetMapping("/competitiveness/{jobId}")
@ApiOperation("竞争力分析")
public AjaxResult competitiveness(@ApiParam("岗位id") @PathVariable Long jobId) {
return success(jobCollectionService.competitiveness(jobId));
}
private TableDataInfo getTableDataInfo(EsPageInfo<ESJobDocument> result){
long total = result.getTotal();
TableDataInfo rspData = new TableDataInfo();
rspData.setCode(200);
rspData.setRows(result.getList());
rspData.setTotal(total > 200 ? 200 : total);
return rspData;
}
@BussinessLog(title = "移动端发布岗位")
@PostMapping("/publishJob")
public AjaxResult fix(@RequestBody Job job)
{
// 校验描述中的敏感词
List<String> sensitiveWords = sensitiveWordChecker.checkSensitiveWords(job.getDescription());
if (!sensitiveWords.isEmpty()) {
String errorMsg = "描述中包含敏感词:" + String.join("", sensitiveWords);
return AjaxResult.error(errorMsg);
}
jobService.publishJob(job);
return success();
}
@GetMapping("/jobCompare")
@ApiOperation("根据多个岗位id查询岗位详情")
public AjaxResult jobCompare(@ApiParam("岗位ID数组") @RequestParam("jobIds") Long[] jobIds) {
if (ArrayUtils.isEmpty(jobIds)) {
return AjaxResult.error("请传递岗位ID参数jobIds多个ID用&分隔");
}
if (jobIds.length > 5) {
return AjaxResult.error("最多支持对比5个岗位请减少参数数量");
}
return success(esJobSearchService.selectByIds(jobIds));
}
@GetMapping("/applyJobList")
@ApiOperation("根据岗位id查询岗位申请人员")
public AjaxResult applyJobList(@ApiParam("岗位id") @RequestParam("jobId") Long jobId) {
if (jobId==null) {
return AjaxResult.error("请传递岗位ID");
}
return success(jobService.selectApplyJobUserList(jobId));
}
}

View File

@@ -0,0 +1,63 @@
package com.ruoyi.cms.controller.app;
import com.ruoyi.cms.domain.Job;
import com.ruoyi.cms.domain.Notice;
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.TableDataInfo;
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;
@RestController
@RequestMapping("/app/notice")
@Api(tags = "移动端:消息")
public class AppNoticeInfoController extends BaseController {
@Autowired
private IAppNoticeService appNoticeService;
@ApiOperation("消息列表")
@GetMapping("/info")
public AjaxResult listNotRead(@RequestParam(required = false) Integer isRead)
{
List<Notice> appNoticeVO = appNoticeService.listNotRead(isRead);
return AjaxResult.success(appNoticeVO);
}
@ApiOperation("推荐岗位列表")
@GetMapping("/recommend")
public TableDataInfo recommend(@RequestParam(required = false)String jobTitle)
{
startPage();
List<Job> list = appNoticeService.recommend(jobTitle);
return getDataTable(list);
}
@ApiOperation("系统通知已读")
@PostMapping("/read/sysNotice")
@BussinessLog(title = "系统通知标记已读")
public AjaxResult sysNotice(@RequestParam String id)
{
appNoticeService.sysNotice(id);
return AjaxResult.success();
}
@ApiOperation("岗位推荐、招聘会已读")
@PostMapping("/read")
@BussinessLog(title = "岗位推荐、招聘会已读标记已读")
public AjaxResult read(@RequestParam String id)
{
appNoticeService.read(id);
return AjaxResult.success();
}
@ApiOperation("系统通知列表")
@GetMapping("/sysNotice")
public TableDataInfo sysNoticeList()
{
startPage();
List<Notice> list = appNoticeService.sysNoticeList();
return getDataTable(list);
}
}

View File

@@ -0,0 +1,61 @@
package com.ruoyi.cms.controller.app;
import com.ruoyi.cms.service.ICompanyService;
import com.ruoyi.cms.service.IJobService;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* 岗位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,107 @@
package com.ruoyi.cms.controller.app;
import com.ruoyi.cms.service.AppSkillService;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.AppSkill;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.utils.SiteSecurityUtils;
import com.ruoyi.common.utils.StringUtils;
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.web.bind.annotation.*;
import java.util.List;
/**
* 用户技能信息
*
* @author
* @email
* @date 2025-10-21 12:22:09
*/
@RestController
@RequestMapping("/app/appskill")
@Api(tags = "移动端:用户技能")
public class AppSkillController extends BaseController {
@Autowired
private AppSkillService appSkillService;
/**
* 列表
*/
@ApiOperation("获取技能列表")
@GetMapping("/list")
public TableDataInfo list(AppSkill appSkill){
startPage();
List<AppSkill> list=appSkillService.getList(appSkill);
return getDataTable(list);
}
/**
* 信息
*/
@ApiOperation("获取技能详细信息")
@GetMapping(value = "/{id}")
public AjaxResult info(@PathVariable("id") Long id){
return success(appSkillService.getAppskillById(id));
}
/**
* 保存
*/
@ApiOperation("新增技能信息")
@PostMapping("/add")
public AjaxResult save(@RequestBody AppSkill appSkill){
if(StringUtils.isEmpty(appSkill.getName())){
return AjaxResult.error("技能名称为空!");
}
if(StringUtils.isEmpty(appSkill.getLevels())){
return AjaxResult.error("技能等级为空!");
}
if(appSkill.getUserId()==null){
appSkill.setUserId(SiteSecurityUtils.getUserId());
}
return toAjax(appSkillService.insertAppskill(appSkill));
}
/**
* 修改
*/
@ApiOperation("修改技能详细信息")
@PutMapping("/edit")
public AjaxResult update(@RequestBody AppSkill appSkill){
if(appSkill.getId()==null){
return AjaxResult.error("技能id为空!");
}
if(StringUtils.isEmpty(appSkill.getName())){
return AjaxResult.error("技能名称为空!");
}
if(StringUtils.isEmpty(appSkill.getLevels())){
return AjaxResult.error("技能等级为空!");
}
if(appSkill.getUserId()==null){
appSkill.setUserId(SiteSecurityUtils.getUserId());
}
return toAjax(appSkillService.updateAppskillById(appSkill));
}
/**
* 删除
*/
@ApiOperation("删除技能详细信息")
@DeleteMapping("/{id}")
public AjaxResult delete(@ApiParam("主键id") @PathVariable Long id){
if(id==null){
return AjaxResult.error("参数id未传递!");
}
return toAjax(appSkillService.removeAppskillIds(new Long[]{id}));
}
}

View File

@@ -0,0 +1,77 @@
package com.ruoyi.cms.controller.app;
import com.ruoyi.common.annotation.BussinessLog;
import com.ruoyi.common.config.AudioTextRequestClient;
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.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.UnsupportedEncodingException;
import static com.ruoyi.common.enums.BusinessType.OTHER;
/**
* 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", AliyunNlsUtils.getNlsUrl()+"/ws/v1/");*/
@Autowired
AudioTextRequestClient audioTextRequestClient;
@BussinessLog(title = "语音转文字",businessType = OTHER)
@ApiOperation("语音转文字")
@PostMapping(value = "/asr")
public AjaxResult asr(@RequestParam("file") MultipartFile file){
try {
return AjaxResult.success("请求成功",audioTextRequestClient.getTextFromAudioFile(file));
}catch (Exception e){
e.printStackTrace();
return AjaxResult.error(e.getMessage());
}
}
@BussinessLog(title = "文字转语音",businessType = OTHER)
@ApiOperation("文字转语音")
@GetMapping(value = "/tts")
public ResponseEntity<byte[]> tts(@RequestParam("text") String text) throws UnsupportedEncodingException {
byte[] wavData = audioTextRequestClient.getAudioInputStreamFromText(text);
HttpHeaders headers = new HttpHeaders();
// WAV音频的标准MIME类型
headers.setContentType(MediaType.parseMediaType("audio/wav"));
// inline让浏览器在线播放而非下载
headers.setContentDispositionFormData("inline", System.currentTimeMillis() + ".wav");
// 设置内容长度
headers.setContentLength(wavData.length);
// 4. 返回音频数据
return new ResponseEntity<>(wavData, headers, HttpStatus.OK);
}
/*@ApiOperation("统计")
@GetMapping("/getToken")
public AjaxResult getToken()
{
SpeechRecognizerAI recognizerDemo = new SpeechRecognizerAI(appKey, id, secret, url);
AccessToken accessToken = recognizerDemo.getAccessToken();
String token = AliyunNlsUtils.getNlsUrl()+"/ws/v1/?appkey="+appKey+"&token="+accessToken.getToken();
return AjaxResult.success(token);
}*/
}

View File

@@ -0,0 +1,183 @@
package com.ruoyi.cms.controller.app;
import com.ruoyi.cms.domain.AppReviewJob;
import com.ruoyi.common.core.domain.entity.AppUser;
import com.ruoyi.common.core.domain.entity.Company;
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.cms.domain.vo.AppUserLky;
import com.ruoyi.common.core.domain.model.RegisterBody;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SiteSecurityUtils;
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.web.bind.annotation.*;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
/**
* app用户Controller
*
* @author lishundong
* @date 2024-09-03
*/
@RestController
@RequestMapping("/app/user")
@Api(tags = "移动端:用户相关")
public class AppUserController extends BaseController
{
@Autowired
private IAppUserService appUserService;
@Autowired
private IAppReviewJobService appReviewJobService;
@Autowired
private IJobCollectionService jobCollectionService;
@Autowired
private ICompanyCollectionService companyCollectionService;
@Autowired
private IJobApplyService jobApplyService;
@Autowired
private IFairCollectionService fairCollectionService;
/**
* 查询岗位列表
*/
@ApiOperation("保存注册信息")
@PostMapping("/registerUser")
@BussinessLog(title = "保存简历")
public AjaxResult registerUser(@RequestBody RegisterBody registerBody)
{
appUserService.registerAppUser(registerBody);
return AjaxResult.success();
}
@ApiOperation("保存简历")
@PostMapping("/resume")
public AjaxResult saveResume(@RequestBody AppUser appUser)
{
appUser.setUserId(SiteSecurityUtils.getUserId());
appUserService.updateAppUser(appUser);
return AjaxResult.success();
}
@ApiOperation("查看简历")
@GetMapping("/resume")
public AjaxResult getResume()
{
AppUser appUser = appUserService.selectAppUserByUserId(SiteSecurityUtils.getUserId());
return AjaxResult.success(appUser);
}
@ApiOperation("企业查看简历")
@GetMapping("/userResume/{id}")
public AjaxResult getResume(@PathVariable(name = "id", required = true) Long userId)
{
if(userId==null){
return AjaxResult.error("用户id为空!");
}
AppUser appUser = appUserService.selectAppUserByUserId(userId);
return AjaxResult.success(appUser);
}
@ApiOperation("我的浏览")
@GetMapping("/review")
public TableDataInfo review(MineJobQuery jobQuery)
{
startPage();
List<Job> jobs = appReviewJobService.review(jobQuery);
return getDataTable(jobs);
}
@ApiOperation("我的浏览-日期数组")
@GetMapping("/review/array")
public AjaxResult reviewArray(MineJobQuery jobQuery)
{
List<String> dateList = appReviewJobService.reviewArray();
return AjaxResult.success(dateList);
}
@ApiOperation("我的岗位收藏")
@GetMapping("/collection/job")
public TableDataInfo collectionJob()
{
startPage();
List<Job> jobs = jobCollectionService.collectionJob();
return getDataTable(jobs);
}
@ApiOperation("我的公司收藏")
@GetMapping("/collection/company")
public TableDataInfo collectionCompany()
{
startPage();
List<Company> jobs = companyCollectionService.collectionCompany();
return getDataTable(jobs);
}
@ApiOperation("我的招聘会收藏")
@GetMapping("/collection/fair")
public TableDataInfo collectionFair(@RequestParam(name = "type") Integer type)
{
startPage();
List<JobFair> jobs = fairCollectionService.appCollectionFair(type);
return getDataTable(jobs);
}
@ApiOperation("我申请的岗位")
@GetMapping("/apply/job")
public TableDataInfo applyJob()
{
startPage();
List<Job> jobs = jobApplyService.applyJob();
return getDataTable(jobs);
}
@ApiOperation("统计")
@GetMapping("/statistics")
public AjaxResult statistics()
{
HashMap<String,Integer> result = jobApplyService.statistics();
return AjaxResult.success(result);
}
@ApiOperation("根据条件查询用户信息")
@GetMapping("/list")
public AjaxResult getUserList(AppUser appUser)
{
List<AppUser> list = appUserService.selectAppUserList(appUser);
return AjaxResult.success(list);
}
@ApiOperation("返回求职者劳科院-当前职位名称、技能标签")
@GetMapping("/appUserInfo")
public AjaxResult appUserInfo(AppUser appUser)
{
if(!SiteSecurityUtils.isLogin()){
return AjaxResult.error("未登录!");
}
appUser.setUserId(SiteSecurityUtils.getUserId());
AppUserLky appUserLky = appUserService.selectAppUserInfo(appUser);
return AjaxResult.success(appUserLky);
}
@PostMapping("/browse")
@ApiOperation("用户浏览")
public AjaxResult browse(@RequestBody AppReviewJob appReviewJob)
{
if(appReviewJob.getJobId()==null){
return AjaxResult.error("岗位id为空");
}
if(!SiteSecurityUtils.isLogin()){
return AjaxResult.error("用户未登录!");
}
if(StringUtils.isEmpty(appReviewJob.getReviewDate())){
appReviewJob.setReviewDate(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD,new Date()));
}
appReviewJob.setUserId(SiteSecurityUtils.getUserId());
return toAjax(appReviewJobService.insertAppReviewJob(appReviewJob));
}
}

View File

@@ -0,0 +1,88 @@
package com.ruoyi.cms.controller.app;
import com.ruoyi.common.core.domain.entity.UserWorkExperiences;
import com.ruoyi.cms.service.UserWorkExperiencesService;
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.utils.SiteSecurityUtils;
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.web.bind.annotation.*;
import java.util.List;
/**
* 用户工作经历表
*
* @author
* @email
* @date 2025-10-10 16:26:26
*/
@RestController
@RequestMapping("/app/userworkexperiences")
@Api(tags = "移动端:用户工作经历")
public class AppUserWorkExperiencesController extends BaseController {
@Autowired
private UserWorkExperiencesService userWorkExperiencesService;
/**
* 列表
*/
@ApiOperation("工作经历列表信息")
@GetMapping("/list")
public TableDataInfo list(UserWorkExperiences userWorkExperiences){
if(userWorkExperiences.getUserId()==null){
userWorkExperiences.setUserId(SiteSecurityUtils.getUserId());
}
startPage();
List<UserWorkExperiences> list=userWorkExperiencesService.getWorkExperiencesList(userWorkExperiences);
return getDataTable(list);
}
/**
* 获取详细信息
*/
@ApiOperation("获取工作经历详细信息")
@GetMapping(value = "/{id}")
public AjaxResult query(@PathVariable("id") Long id){
return success(userWorkExperiencesService.getWorkExperiencesById(id));
}
/**
* 保存
*/
@ApiOperation("新增工作经历")
@PostMapping("/add")
public AjaxResult add(@RequestBody UserWorkExperiences userWorkExperiences){
if(userWorkExperiences.getUserId()==null){
userWorkExperiences.setUserId(SiteSecurityUtils.getUserId());
}
return toAjax(userWorkExperiencesService.insertWorkExperiences(userWorkExperiences));
}
/**
* 修改
*/
@ApiOperation("修改工作经历")
@PutMapping("/edit")
public AjaxResult update(@RequestBody UserWorkExperiences userWorkExperiences){
return toAjax(userWorkExperiencesService.updateWorkExperiencesById(userWorkExperiences));
}
/**
* 删除
*/
@ApiOperation("删除工作经历")
@DeleteMapping("/{id}")
public AjaxResult remove(@ApiParam("招聘会id") @PathVariable Long id){
return toAjax(userWorkExperiencesService.deleteWorkExperiencesIds(new Long[]{id}));
}
}

View File

@@ -0,0 +1,235 @@
package com.ruoyi.cms.controller.app;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.cms.domain.ai.AiChatHistory;
import com.ruoyi.cms.domain.chat.ChatRequest;
import com.ruoyi.cms.service.AiChatHistoryService;
import com.ruoyi.common.annotation.BussinessLog;
import com.ruoyi.cms.config.ChatClient;
import com.ruoyi.cms.config.ChatConfig;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.SiteSecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import javax.annotation.PreDestroy;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import static com.ruoyi.common.enums.BusinessType.QUERY;
@RestController
@RequestMapping(value = "/app/chat")
@Slf4j
@Api(tags = "移动端:ai对话")
public class ChatController extends BaseController {
@Autowired
ChatClient chatClient;
@Autowired
ChatConfig chatConfig;
@Autowired
AiChatHistoryService aiChatHistoryService;
//private final ExecutorService executor = Executors.newCachedThreadPool();
// 可优化线程池配置,避免无限创建线程
private final ExecutorService executor = new ThreadPoolExecutor(
2, // 核心线程数
10, // 最大线程数
30, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(50), // 任务队列
new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略(避免任务丢失)
);
@BussinessLog(title = "查询用户的聊天历史记录",businessType = QUERY)
@ApiOperation("查询用户的聊天历史记录")
@GetMapping(value = "/getHistory")
public AjaxResult getChatHistoryList(AiChatHistory chatHistory) {
return AjaxResult.success(aiChatHistoryService.getList(chatHistory));
}
@BussinessLog(title = "查询用户的聊天详情",businessType = QUERY)
@ApiOperation("查询用户的聊天详情")
@GetMapping(value = "/detail")
public AjaxResult getChatDetail(ChatRequest request) {
return AjaxResult.success(aiChatHistoryService.getDetailList(request.getSessionId()));
}
// 处理前端聊天请求,返回 SSE 发射器
@ApiOperation("用户AI聊天")
@PostMapping("/chat")
@ResponseBody
@BussinessLog(title = "用户AI聊天",businessType = QUERY)
public SseEmitter chatStream(@RequestBody ChatRequest request) {
// 设置超时时间30分钟
SseEmitter emitter = new SseEmitter(1800000L);
long userId = 0;
if(ObjectUtil.isNotEmpty(request.getUserId())&&request.getUserId()!=0){
userId = request.getUserId();
}else{
try {
userId = SiteSecurityUtils.getLoginUser().getUserId();
}catch (Exception e) {
}
}
JSONObject contentObject = new JSONObject();
contentObject.put("content",request.getData());
contentObject.put("role","user");
JSONArray array = aiChatHistoryService.getChatHistoryData(request.getSessionId());
if(array==null||array.isEmpty()||array.size()==0){
array = new JSONArray();
}
array.add(contentObject);
request.setMessages(array);
List<String> answerList = new ArrayList<>();
long[] timeStart = {0};
// 异步处理请求并推送数据
executor.submit(() -> {
try {
// 2. 调用ChatClient的流式聊天方法正确传递参数
chatClient.sendStreamingChat(
request,
new ChatClient.StreamCallback() { // 使用内部类完整路径
@Override
public void onData(String chunk) {
try {
if(timeStart[0] == 0){
timeStart[0] = System.currentTimeMillis();
}
// 1. 处理SSE协议格式
String processedChunk = chunk.trim();
// 解析返回的chunk数据
String content = parseChatChunk(processedChunk);
if (StringUtils.isNotEmpty(content)) {
answerList.add(content);
}
emitter.send(processedChunk, MediaType.TEXT_EVENT_STREAM);
} catch (IOException e) {
emitter.completeWithError(e);
}
}
@Override
public void onComplete() {
emitter.complete();
}
@Override
public void onError(Throwable e) {
try {
emitter.send(SseEmitter.event()
.data("{\"status\":\"error\",\"message\":\"" + e.getMessage() + "\"}")
.name("error"));
} catch (IOException ex) {
// 记录日志
} finally {
emitter.completeWithError(e);
}
}
}
);
} catch (Exception e) {
emitter.completeWithError(e);
}
});
// 处理连接关闭
long finalUserId = userId;
emitter.onCompletion(() -> {
// 此处仅做资源清理,不关闭线程池
log.info("连接关闭,清理资源");
long timeEnd = System.currentTimeMillis();
double duration = (timeEnd - timeStart[0]) / 1000.0;
AiChatHistory chatHistory = new AiChatHistory();
chatHistory.setChatId(request.getSessionId());
chatHistory.setUserId((finalUserId==0)?null:finalUserId);
chatHistory.setAppId(chatConfig.getAppId());
chatHistory.setDataId(request.getDataId());
chatHistory.setTitle(request.getData());
chatHistory.setAnswerStringList(answerList);
chatHistory.setDurationSeconds(duration);
aiChatHistoryService.saveChatHistory(chatHistory);
});
return emitter;
}
@BussinessLog(title = "提供推测出的问询建议",businessType = QUERY)
@ApiOperation("提供推测出的问询建议")
@PostMapping(value = "/guest")
public AjaxResult getChatGuest(@RequestBody ChatRequest request) throws IOException {
JSONArray array = aiChatHistoryService.getChatHistoryData(request.getSessionId());
request.setMessages(array);
String result = chatClient.sendChatGuest(request);
try {
String[] strList = result.split("");
List<String> list = new ArrayList<>();
for(String str:strList){
if(StringUtils.isNotEmpty(str)){
str = str+"";
list.add(str);
}
}
return AjaxResult.success(list);
}catch (Exception e) {
return AjaxResult.error(e.getMessage());
}
}
// 解析返回的流式数据
private String parseChatChunk(String chunk) {
try {
String processed = chunk.trim();
if (processed.startsWith("data:")) {
processed = processed.substring("data:".length()).trim();
}
if (processed.isEmpty() || "[DONE]".equals(processed)) {
return null;
}
JSONObject json = JSONObject.parseObject(processed);
String choices = json.getString("choices");
if (choices != null && !choices.trim().isEmpty()) {
JSONArray jsonArray = JSONArray.parseArray(choices);
json = JSONObject.parseObject(jsonArray.getString(0));
json = json.getJSONObject("delta");
String content = json.getString("content");// 消息内容
return content;
}
return null;
} catch (Exception e) {
return null;
}
}
@PreDestroy
public void destroy() {
executor.shutdown(); // 应用退出前关闭线程池
try {
if (!executor.awaitTermination(5, TimeUnit.SECONDS)) {
executor.shutdownNow(); // 强制关闭未完成的任务
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
executor.shutdownNow();
log.error(e.getMessage());
}
}
}

View File

@@ -0,0 +1,120 @@
package com.ruoyi.cms.controller.cms;
import com.ruoyi.cms.domain.BussinessDictData;
import com.ruoyi.cms.service.IBussinessDictDataService;
import com.ruoyi.cms.service.IBussinessDictTypeService;
import com.ruoyi.common.annotation.Anonymous;
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 com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
/**
* 数据字典信息
*
* @author ruoyi
*/
@RestController
@RequestMapping("/cms/dict/data")
@Anonymous
public class BussinessDictDataController extends BaseController
{
@Autowired
private IBussinessDictDataService dictDataService;
@Autowired
private IBussinessDictTypeService dictTypeService;
@PreAuthorize("@ss.hasPermi('system:dict:list')")
@GetMapping("/list")
public TableDataInfo list(BussinessDictData dictData)
{
startPage();
List<BussinessDictData> list = dictDataService.selectDictDataList(dictData);
return getDataTable(list);
}
@Log(title = "字典数据", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('system:dict:export')")
@PostMapping("/export")
public void export(HttpServletResponse response, BussinessDictData dictData)
{
List<BussinessDictData> list = dictDataService.selectDictDataList(dictData);
ExcelUtil<BussinessDictData> util = new ExcelUtil<BussinessDictData>(BussinessDictData.class);
util.exportExcel(response, list, "字典数据");
}
/**
* 查询字典数据详细
*/
@PreAuthorize("@ss.hasPermi('system:dict:query')")
@GetMapping(value = "/{dictCode}")
public AjaxResult getInfo(@PathVariable Long dictCode)
{
return success(dictDataService.selectDictDataById(dictCode));
}
/**
* 根据字典类型查询字典数据信息
*/
@GetMapping(value = "/type/{dictType}")
public AjaxResult dictType(@PathVariable String dictType)
{
List<BussinessDictData> data = dictTypeService.selectDictDataByType(dictType);
if (StringUtils.isNull(data))
{
data = new ArrayList<BussinessDictData>();
}
return success(data);
}
/**
* 新增字典类型
*/
@PreAuthorize("@ss.hasPermi('system:dict:add')")
@Log(title = "字典数据", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody BussinessDictData dict)
{
dict.setCreateBy(getUsername());
return toAjax(dictDataService.insertDictData(dict));
}
/**
* 修改保存字典类型
*/
@PreAuthorize("@ss.hasPermi('system:dict:edit')")
@Log(title = "字典数据", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody BussinessDictData dict)
{
dict.setUpdateBy(getUsername());
return toAjax(dictDataService.updateDictData(dict));
}
/**
* 删除字典类型
*/
@PreAuthorize("@ss.hasPermi('system:dict:remove')")
@Log(title = "字典类型", businessType = BusinessType.DELETE)
@DeleteMapping("/{dictCodes}")
public AjaxResult remove(@PathVariable Long[] dictCodes)
{
dictDataService.deleteDictDataByIds(dictCodes);
return success();
}
}

View File

@@ -0,0 +1,52 @@
package com.ruoyi.cms.controller.cms;
import com.ruoyi.cms.service.BussinessDictJobCategoryService;
import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.ruoyi.common.core.domain.entity.BussinessDictJobCategory;
/**
* 技能字典表
*
* @author
* @email
* @date 2025-10-30 19:25:48
*/
@RestController
@RequestMapping("/cms/dict")
@Anonymous
public class BussinessDictJobCategoryController {
@Autowired
private BussinessDictJobCategoryService bussinessDictJobCategoryService;
/**
* 列表
*/
@GetMapping("/jobCategory")
public AjaxResult jobCategory(BussinessDictJobCategory bussinessDictJobCategory){
if (!hasAnyQueryCondition(bussinessDictJobCategory)) {
return AjaxResult.error("请传递至少一个查询条件(大类、中类、小类、名称),避免数据量过大!");
}
return AjaxResult.success(bussinessDictJobCategoryService.getList(bussinessDictJobCategory));
}
/**
* 判断是否包含至少一个有效的查询条件
*/
private boolean hasAnyQueryCondition(BussinessDictJobCategory queryParam) {
// 避免空指针(若 queryParam 可能为 null需先判断
if (queryParam == null) {
return false;
}
// 检查四个字段中是否有非空值
return StringUtils.isNotEmpty(queryParam.getLabd())
|| StringUtils.isNotEmpty(queryParam.getLabz())
|| StringUtils.isNotEmpty(queryParam.getLabx())
|| StringUtils.isNotEmpty(queryParam.getName());
}
}

View File

@@ -0,0 +1,127 @@
package com.ruoyi.cms.controller.cms;
import com.ruoyi.cms.domain.BussinessDictType;
import com.ruoyi.cms.service.IBussinessDictTypeService;
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 com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
* 数据字典信息
*
* @author ruoyi
*/
@RestController
@RequestMapping("/cms/dict/type")
public class BussinessDictTypeController extends BaseController
{
@Autowired
private IBussinessDictTypeService dictTypeService;
@PreAuthorize("@ss.hasPermi('system:dict:list')")
@GetMapping("/list")
public TableDataInfo list(BussinessDictType dictType)
{
startPage();
List<BussinessDictType> list = dictTypeService.selectDictTypeList(dictType);
return getDataTable(list);
}
@Log(title = "字典类型", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('system:dict:export')")
@PostMapping("/export")
public void export(HttpServletResponse response, BussinessDictType dictType)
{
List<BussinessDictType> list = dictTypeService.selectDictTypeList(dictType);
ExcelUtil<BussinessDictType> util = new ExcelUtil<BussinessDictType>(BussinessDictType.class);
util.exportExcel(response, list, "字典类型");
}
/**
* 查询字典类型详细
*/
@PreAuthorize("@ss.hasPermi('system:dict:query')")
@GetMapping(value = "/{dictId}")
public AjaxResult getInfo(@PathVariable Long dictId)
{
return success(dictTypeService.selectDictTypeById(dictId));
}
/**
* 新增字典类型
*/
@PreAuthorize("@ss.hasPermi('system:dict:add')")
@Log(title = "字典类型", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody BussinessDictType dict)
{
if (!dictTypeService.checkDictTypeUnique(dict))
{
return error("新增字典'" + dict.getDictName() + "'失败,字典类型已存在");
}
dict.setCreateBy(getUsername());
return toAjax(dictTypeService.insertDictType(dict));
}
/**
* 修改字典类型
*/
@PreAuthorize("@ss.hasPermi('system:dict:edit')")
@Log(title = "字典类型", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody BussinessDictType dict)
{
if (!dictTypeService.checkDictTypeUnique(dict))
{
return error("修改字典'" + dict.getDictName() + "'失败,字典类型已存在");
}
dict.setUpdateBy(getUsername());
return toAjax(dictTypeService.updateDictType(dict));
}
/**
* 删除字典类型
*/
@PreAuthorize("@ss.hasPermi('system:dict:remove')")
@Log(title = "字典类型", businessType = BusinessType.DELETE)
@DeleteMapping("/{dictIds}")
public AjaxResult remove(@PathVariable Long[] dictIds)
{
dictTypeService.deleteDictTypeByIds(dictIds);
return success();
}
/**
* 刷新字典缓存
*/
@PreAuthorize("@ss.hasPermi('system:dict:remove')")
@Log(title = "字典类型", businessType = BusinessType.CLEAN)
@DeleteMapping("/refreshCache")
public AjaxResult refreshCache()
{
dictTypeService.resetDictCache();
return success();
}
/**
* 获取字典选择框列表
*/
@GetMapping("/optionselect")
public AjaxResult optionselect()
{
List<BussinessDictType> dictTypes = dictTypeService.selectDictTypeAll();
return success(dictTypes);
}
}

View File

@@ -0,0 +1,72 @@
package com.ruoyi.cms.controller.cms;
import com.ruoyi.cms.domain.BussinessOperLog;
import com.ruoyi.cms.service.IBussinessOperLogService;
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 com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
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 javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
* 操作日志记录
*
* @author ruoyi
*/
@RestController
@RequestMapping("/cms/operlog")
@Api(tags = "后台App用户操作日志")
public class BussinessOperlogController extends BaseController
{
@Autowired
private IBussinessOperLogService operLogService;
@PreAuthorize("@ss.hasPermi('monitor:operlog:list')")
@GetMapping("/list")
@ApiOperation("日志列表")
public TableDataInfo list(BussinessOperLog operLog)
{
startPage();
List<BussinessOperLog> list = operLogService.selectOperLogList(operLog);
return getDataTable(list);
}
@Log(title = "操作日志", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('monitor:operlog:export')")
@PostMapping("/export")
@ApiOperation("日志导出excel")
public void export(HttpServletResponse response, BussinessOperLog operLog)
{
List<BussinessOperLog> list = operLogService.selectOperLogList(operLog);
ExcelUtil<BussinessOperLog> util = new ExcelUtil<BussinessOperLog>(BussinessOperLog.class);
util.exportExcel(response, list, "操作日志");
}
@Log(title = "操作日志", businessType = BusinessType.DELETE)
@PreAuthorize("@ss.hasPermi('monitor:operlog:remove')")
@DeleteMapping("/{operIds}")
@ApiOperation("删除操作日志")
public AjaxResult remove(@PathVariable Long[] operIds)
{
return toAjax(operLogService.deleteOperLogByIds(operIds));
}
@Log(title = "操作日志", businessType = BusinessType.CLEAN)
@PreAuthorize("@ss.hasPermi('monitor:operlog:remove')")
@DeleteMapping("/clean")
@ApiOperation("清空操作日志")
public AjaxResult clean()
{
operLogService.cleanOperLog();
return success();
}
}

View File

@@ -0,0 +1,276 @@
package com.ruoyi.cms.controller.cms;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import javax.servlet.http.HttpServletResponse;
import com.ruoyi.cms.domain.AppReviewJob;
import com.ruoyi.cms.domain.vo.AppUserLky;
import com.ruoyi.cms.service.IAppReviewJobService;
import com.ruoyi.cms.util.DateValidateUtil;
import com.ruoyi.cms.util.RoleUtils;
import com.ruoyi.cms.util.StringUtil;
import com.ruoyi.common.annotation.BussinessLog;
import com.ruoyi.common.core.domain.entity.AppUserShow;
import com.ruoyi.common.core.domain.model.RegisterBody;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.SiteSecurityUtils;
import com.ruoyi.common.utils.StringUtils;
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 io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import com.ruoyi.common.core.domain.entity.AppUser;
import com.ruoyi.cms.service.IAppUserService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* APP用户Controller
*
* @author lishundong
* @date 2024-09-03
*/
@RestController
@RequestMapping("/cms/appUser")
@Api(tags = "后台APP用户管理")
public class CmsAppUserController extends BaseController
{
@Autowired
private IAppUserService appUserService;
@Autowired
private IAppReviewJobService appReviewJobService;
/**
* 查询APP用户列表
*/
@ApiOperation("查询APP用户列表")
@PreAuthorize("@ss.hasPermi('cms:appUser:list')")
@GetMapping("/list")
public TableDataInfo list(AppUser appUser)
{
startPage();
List<AppUser> list = appUserService.selectAppUserList(appUser);
//身份证脱敏
list.forEach(it->{
it.setIdCard(StringUtil.desensitizeIdCard(it.getIdCard()));
});
return getDataTable(list);
}
/**
* 导出APP用户列表
*/
@ApiOperation("导出APP用户列表")
@PreAuthorize("@ss.hasPermi('cms:appUser:export')")
@Log(title = "APP用户", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, AppUser appUser)
{
List<AppUser> list = appUserService.selectAppUserList(appUser);
ExcelUtil<AppUser> util = new ExcelUtil<AppUser>(AppUser.class);
util.exportExcel(response, list, "APP用户数据");
}
/**
* 获取APP用户详细信息
*/
@ApiOperation("获取APP用户详细信息")
@PreAuthorize("@ss.hasPermi('bussiness:user:query')")
@GetMapping(value = "/{userId}")
public AjaxResult getInfo(@PathVariable("userId") Long userId)
{
return success(appUserService.selectAppUserByUserId(userId));
}
/**
* 新增APP用户
*/
@ApiOperation("新增APP用户")
@PreAuthorize("@ss.hasPermi('bussiness:user:add')")
@Log(title = "APP用户", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody AppUser appUser)
{
return toAjax(appUserService.insertAppUser(appUser));
}
/**
* 修改APP用户
*/
@ApiOperation("修改APP用户")
@Log(title = "APP用户", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody AppUser appUser)
{
if(appUser.getUserId()==null){
return AjaxResult.error("参数userId为空");
}
return toAjax(appUserService.updateAppUser(appUser));
}
/**
* 删除APP用户
*/
@ApiOperation("删除APP用户")
@PreAuthorize("@ss.hasPermi('bussiness:user:remove')")
@Log(title = "APP用户", businessType = BusinessType.DELETE)
@DeleteMapping("/{userIds}")
public AjaxResult remove(@PathVariable Long[] userIds)
{
return toAjax(appUserService.deleteAppUserByUserIds(userIds));
}
/**
* 获取APP用户详细信息pc端获取移动端简历信息
*/
@ApiOperation("pc端个人简历信息-获取APP用户详细信息")
@GetMapping(value = "/getUserInfo")
public AjaxResult getUserInfo()
{
if(!SecurityUtils.isLogin()){
return AjaxResult.error("未登录!");
}
return success(appUserService.getUserInfo());
}
/**
* 修改用户简历信息-(技能信息、经历信息)
*/
@ApiOperation("修改用户简历信息")
@PostMapping("/editRegisterUser")
@BussinessLog(title = "保存简历")
public AjaxResult editRegisterUser(@RequestBody RegisterBody registerBody)
{
if (registerBody == null) {
return AjaxResult.error("入参registerBody不能为空!");
}
if(registerBody.getAppUser()==null){
return AjaxResult.error("用户信息为空!");
}
return AjaxResult.success(appUserService.editRegisterUser(registerBody));
}
@ApiOperation("查询APP用户列表")
@GetMapping("/noTmlist")
public TableDataInfo noTmlist(AppUser appUser)
{
startPage();
List<AppUser> list = appUserService.selectNoTmAppUserList(appUser);
//身份证脱敏
list.forEach(it->{
it.setIdCard(StringUtil.desensitizeIdCard(it.getIdCard()));
});
return getDataTable(list);
}
@ApiOperation("查询我的中(已经投递的,收藏的,足迹,预约)")
@GetMapping("/getMyTj")
public AjaxResult getMyTj()
{
if(!SecurityUtils.isLogin()){
return AjaxResult.error("未登录!");
}
if(StringUtils.isEmpty(RoleUtils.getCurrentUseridCard())){
return AjaxResult.error("用户信息为空!");
}
AppUser appUser=appUserService.selectAppuserByIdcard(RoleUtils.getCurrentUseridCard());
if (Objects.isNull(appUser)) {
return AjaxResult.error("未查询到用户信息(身份证号:" + RoleUtils.getCurrentUseridCard() + "!");
}
return AjaxResult.success(appUserService.getMyTj(appUser.getUserId()));
}
@ApiOperation("返回求职者劳科院-当前职位名称、技能标签")
@GetMapping("/appUserInfo")
public AjaxResult appUserInfo(AppUser appUser)
{
if(!SecurityUtils.isLogin()){
return AjaxResult.error("未登录!");
}
if(StringUtils.isEmpty(RoleUtils.getCurrentUseridCard())){
return AjaxResult.error("用户信息为空!");
}
appUser=appUserService.selectAppuserByIdcard(RoleUtils.getCurrentUseridCard());
if (Objects.isNull(appUser)) {
return AjaxResult.error("未查询到用户信息(身份证号:" + RoleUtils.getCurrentUseridCard() + "!");
}
AppUserLky appUserLky = appUserService.selectAppUserInfo(appUser);
return AjaxResult.success(appUserLky);
}
@ApiOperation("查询APP申请用户列表")
//@PreAuthorize("@ss.hasPermi('cms:appUser:userApplyList')")
@GetMapping("/userApplyList")
public TableDataInfo userApplyList(AppUser appUser)
{
String birthDateError = DateValidateUtil.validateBirthDate(appUser.getBirthDate());
if (birthDateError != null) {
TableDataInfo errorResult = new TableDataInfo();
errorResult.setCode(400);
errorResult.setMsg(birthDateError);
errorResult.setRows(null);
errorResult.setTotal(0);
return errorResult;
}
startPage();
List<AppUserShow> list = appUserService.selectUserApplyList(appUser);
return getDataTable(list);
}
/**
* 添加足迹信息
* @param appReviewJob
* @return
*/
@PostMapping("/browse")
@ApiOperation("用户浏览")
public AjaxResult browse(@RequestBody AppReviewJob appReviewJob)
{
if (Objects.isNull(appReviewJob) || Objects.isNull(appReviewJob.getJobId())) {
return AjaxResult.error("岗位id为空");
}
if (!SecurityUtils.isLogin()) {
return AjaxResult.error("用户未登录!");
}
Long frontUserId = appReviewJob.getUserId();
String useridCard = RoleUtils.getCurrentUseridCard();
Long targetUserId;
if (Objects.nonNull(frontUserId)) {
targetUserId = frontUserId;
} else {
if (StringUtils.isEmpty(useridCard)) {
return AjaxResult.error("用户身份证信息为空无法获取用户ID!");
}
AppUser appUser = appUserService.selectAppuserByIdcard(useridCard);
if (Objects.isNull(appUser)) {
return AjaxResult.error("未查询到用户信息(身份证号:" + useridCard + "!");
}
targetUserId = appUser.getUserId();
}
appReviewJob.setUserId(targetUserId);
if(StringUtils.isEmpty(appReviewJob.getReviewDate())){
appReviewJob.setReviewDate(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD,new Date()));
}
return toAjax(appReviewJobService.insertAppReviewJob(appReviewJob));
}
}

View File

@@ -0,0 +1,361 @@
package com.ruoyi.cms.controller.cms;
import com.alibaba.fastjson.JSON;
import com.ruoyi.cms.domain.*;
import com.ruoyi.cms.domain.query.ESJobSearch;
import com.ruoyi.cms.domain.vo.CandidateVO;
import com.ruoyi.cms.domain.vo.CompanyVo;
import com.ruoyi.cms.service.*;
import com.ruoyi.cms.util.RoleUtils;
import com.ruoyi.cms.util.StringUtil;
import com.ruoyi.cms.util.sensitiveWord.SensitiveWordChecker;
import com.ruoyi.common.annotation.Anonymous;
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.domain.entity.AppUser;
import com.ruoyi.common.core.domain.entity.Company;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
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 javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
* 岗位Controller
*
* @author lishundong
* @date 2024-09-03
*/
@RestController
@RequestMapping("/cms/job")
@Api(tags = "后台:岗位管理")
@Anonymous
public class CmsJobController extends BaseController
{
@Autowired
private IJobService jobService;
@Autowired
SensitiveWordChecker sensitiveWordChecker;
@Autowired
private ICompanyService companyService;
@Autowired
private IJobCollectionService jobCollectionService;
@Autowired
private IAppUserService appUserService;
@Autowired
private IJobApplyService iJobApplyService;
@Autowired
private IAppReviewJobService iAppReviewJobService;
/**
* 查询岗位列表
*/
@ApiOperation("查询岗位列表")
// @PreAuthorize("@ss.hasPermi('cms:job:list')")
@GetMapping("/list")
public TableDataInfo list(Job job,HttpServletRequest request)
{
if (RoleUtils.isCompanyAdmin()) {
Company company = companyService.queryCodeCompany(RoleUtils.getCurrentUseridCard());
job.setCompanyId(Objects.nonNull(company) ? company.getCompanyId() : null);
}
startPage();
//List<Job> list = jobService.selectJobList(job);
List<Job> list = jobService.selectHttpJobList(job,request);
return getDataTable(list);
}
/**
* 获取岗位详细信息
*/
@ApiOperation("获取岗位详细信息")
// @PreAuthorize("@ss.hasPermi('bussiness:job:query')")
@GetMapping(value = "/{jobId}")
public AjaxResult getInfo(@PathVariable("jobId") Long jobId, HttpServletRequest request)
{
if (jobId == null) {
return AjaxResult.error("jobId不能为空");
}
//return success(jobService.selectJobByJobId(jobId));
return success(jobService.selectHttpJobByJobId(jobId,request));
}
/**
* 导出岗位列表
*/
@ApiOperation("导出岗位列表")
// @PreAuthorize("@ss.hasPermi('bussiness:job:export')")
@Log(title = "岗位", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, Job job)
{
List<Job> list = jobService.selectJobList(job);
ExcelUtil<Job> util = new ExcelUtil<Job>(Job.class);
util.exportExcel(response, list, "岗位数据");
}
/**
* 新增岗位
*/
@ApiOperation("新增岗位")
// @PreAuthorize("@ss.hasPermi('bussiness:job:add')")
@Log(title = "岗位", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody Job job)
{
// 校验描述中的敏感词
List<String> sensitiveWords = sensitiveWordChecker.checkSensitiveWords(job.getDescription());
if (!sensitiveWords.isEmpty()) {
String errorMsg = "描述中包含敏感词:" + String.join("", sensitiveWords);
return AjaxResult.error(errorMsg);
}
// 无敏感词,执行插入
return toAjax(jobService.insertJob(job));
}
/**
* 修改岗位
*/
@ApiOperation("修改岗位")
// @PreAuthorize("@ss.hasPermi('bussiness:job:edit')")
@Log(title = "岗位", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody Job job)
{
// 校验描述中的敏感词
List<String> sensitiveWords = sensitiveWordChecker.checkSensitiveWords(job.getDescription());
if (!sensitiveWords.isEmpty()) {
String errorMsg = "描述中包含敏感词:" + String.join("", sensitiveWords);
return AjaxResult.error(errorMsg);
}
return toAjax(jobService.updateJob(job));
}
/**
* 删除岗位
*/
@ApiOperation("删除岗位")
// @PreAuthorize("@ss.hasPermi('bussiness:job:remove')")
@Log(title = "岗位", businessType = BusinessType.DELETE)
@DeleteMapping("/{jobIds}")
public AjaxResult remove(@PathVariable Long[] jobIds)
{
return toAjax(jobService.deleteJobByJobIds(jobIds));
}
@ApiOperation("候选人查询")
@Log(title = "岗位", businessType = BusinessType.DELETE)
@GetMapping("/candidates")
@PreAuthorize("@ss.hasPermi('bussiness:job:candidates')")
public TableDataInfo candidates(Long jobId)
{
startPage();
List<CandidateVO> list = jobService.candidates(jobId);
return getDataTable(list);
}
@ApiOperation("获取推荐岗位")
@GetMapping("/recommend")
public AjaxResult recommend(ESJobSearch esJobSearch)
{
if (RoleUtils.isCompanyAdmin()) {
esJobSearch.setCode(RoleUtils.getCurrentUseridCard());
esJobSearch.setUserType(StringUtil.IS_COMPANY_USER);
}
//判断pageSize
Integer pageSize=esJobSearch.getPageSize();
if (pageSize == null || pageSize <= 0) {
esJobSearch.setPageSize(20);
}
List<ESJobDocument> jobList = jobService.sysRecommend(esJobSearch);
List<Job> jobs=new ArrayList<>();
jobList.stream().forEach(it->{
Job job=new Job();
BeanUtils.copyBeanProp(job, it);
job.setCompanyVo(JSON.parseObject(it.getCompanyVoJson(), CompanyVo.class));
jobs.add(job);
});
return success(jobs);
}
@ApiOperation("获取所有岗位")
@GetMapping("/selectAllJob")
public AjaxResult selectAllJob()
{
List<Job> jobList = jobService.selectAllJob();
return success(jobList);
}
@PostMapping("/collection")
@ApiOperation("用户收藏")
public AjaxResult jobCollection(@RequestBody JobCollection jobCollection)
{
if(jobCollection.getJobId()==null){
return AjaxResult.error("岗位id为空");
}
if(!SecurityUtils.isLogin()){
return AjaxResult.error("用户未登录!");
}
if(jobCollection.getUserId()==null){
String idCard=RoleUtils.getCurrentUseridCard();
AppUser appUser=appUserService.selectAppuserByIdcard(idCard);
if(appUser==null){
return AjaxResult.error("用户信息未完善,请完善身份证信息!");
}else{
jobCollection.setUserId(appUser.getUserId());
}
}
return toAjax(jobCollectionService.pcJobCollection(jobCollection));
}
@ApiOperation("获取用户岗位收藏列表")
@GetMapping("/getAppUserYhsc")
public AjaxResult getAppUserYhsc(JobCollection jobCollection)
{
if(!SecurityUtils.isLogin()){
return AjaxResult.error("用户未登录!");
}
if(jobCollection.getUserId()==null){
String idCard=RoleUtils.getCurrentUseridCard();
AppUser appUser=appUserService.selectAppuserByIdcard(idCard);
if(appUser==null){
return AjaxResult.error("用户信息未完善,请完善身份证信息!");
}else{
jobCollection.setUserId(appUser.getUserId());
}
}
return success(jobCollectionService.selectJobCollectionListJob(jobCollection));
}
@ApiOperation("获取用户岗位申请列表")
@GetMapping("/getAppUserYhsq")
public AjaxResult getAppUserYhsq(JobApply jobApply)
{
if(!SecurityUtils.isLogin()){
return AjaxResult.error("用户未登录!");
}
if(jobApply.getUserId()==null){
String idCard=RoleUtils.getCurrentUseridCard();
AppUser appUser=appUserService.selectAppuserByIdcard(idCard);
if(appUser==null){
return AjaxResult.error("用户信息未完善,请完善身份证信息!");
}else{
jobApply.setUserId(appUser.getUserId());
}
}
return success(iJobApplyService.selectJobApplyListJob(jobApply));
}
@ApiOperation("获取用户岗位访问足迹列表")
@GetMapping("/getAppUserYhfwzj")
public AjaxResult getAppUserYhfwzj(AppReviewJob appReviewJob)
{
if(!SecurityUtils.isLogin()){
return AjaxResult.error("用户未登录!");
}
if(appReviewJob.getUserId()==null){
String idCard=RoleUtils.getCurrentUseridCard();
AppUser appUser=appUserService.selectAppuserByIdcard(idCard);
if(appUser==null){
return AjaxResult.error("用户信息未完善,请完善身份证信息!");
}else{
appReviewJob.setUserId(appUser.getUserId());
}
}
return success(iAppReviewJobService.selectAppReviewJobListJob(appReviewJob));
}
@PostMapping("/collectionCancel")
@ApiOperation("取消收藏")
public AjaxResult pcCancel(@RequestBody JobCollection jobCollection)
{
if(jobCollection.getJobId()==null){
return AjaxResult.error("岗位id为空");
}
if(!SecurityUtils.isLogin()){
return AjaxResult.error("用户未登录!");
}
if(jobCollection.getUserId()==null){
String idCard=RoleUtils.getCurrentUseridCard();
AppUser appUser=appUserService.selectAppuserByIdcard(idCard);
if(appUser==null){
return AjaxResult.error("用户信息未完善,请完善身份证信息!");
}else{
jobCollection.setUserId(appUser.getUserId());
}
}
return toAjax(jobCollectionService.pcCancel(jobCollection));
}
@PostMapping("/browse")
@ApiOperation("岗位浏览")
public AjaxResult browse(@RequestBody AppReviewJob appReviewJob)
{
if(appReviewJob.getJobId()==null){
return AjaxResult.error("岗位id为空");
}
if(!SecurityUtils.isLogin()){
return AjaxResult.error("用户未登录!");
}
if(StringUtils.isEmpty(appReviewJob.getReviewDate())){
appReviewJob.setReviewDate(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD,new Date()));
}
if(appReviewJob.getUserId()==null){
String idCard=RoleUtils.getCurrentUseridCard();
AppUser appUser=appUserService.selectAppuserByIdcard(idCard);
if(appUser==null){
return AjaxResult.error("用户信息未完善,请完善身份证信息!");
}else{
appReviewJob.setUserId(appUser.getUserId());
}
}
return toAjax(iAppReviewJobService.insertAppReviewJob(appReviewJob));
}
@ApiOperation("获取推荐岗位-给数据底座的")
@GetMapping("/recommendTosjdz")
public AjaxResult recommendTosjdz(ESJobSearch esJobSearch)
{
if (RoleUtils.isCompanyAdmin()) {
esJobSearch.setCode(RoleUtils.getCurrentUseridCard());
esJobSearch.setUserType(StringUtil.IS_COMPANY_USER);
}
esJobSearch.setPageSize(20);
List<ESJobDocument> jobList = jobService.sysRecommend(esJobSearch);
jobList.stream().forEach(it->{
it.setAppJobUrl(StringUtil.BASE_WW_GW+it.getJobId());
});
return success(jobList);
}
@PostMapping("/wechat")
@ApiOperation("微信抓取功能调用的新增")
public AjaxResult wechatInsert(@RequestBody Job job) {
// 不发布
job.setIsPublish(0);
if (job.getJobContactList() == null) {
job.setJobContactList(new ArrayList<>());
}
Integer total=jobService.getTotals(job);
int totalNum = total != null ? total : 0;
System.out.println("岗位条数======================"+totalNum);
if (totalNum == 0) {
return toAjax(jobService.insertJob(job));
}
return AjaxResult.success("此岗位已存在!");
}
}

View File

@@ -0,0 +1,211 @@
package com.ruoyi.cms.controller.cms;
import com.ruoyi.cms.domain.AppNotice;
import com.ruoyi.cms.domain.Notice;
import com.ruoyi.cms.domain.vo.NoticeTotal;
import com.ruoyi.cms.service.IAppNoticeService;
import com.ruoyi.cms.service.IAppUserService;
import com.ruoyi.cms.util.notice.NoticeUtils;
import com.ruoyi.cms.util.RoleUtils;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.AppUser;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.SecurityUtils;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 公告 信息操作处理
*
* @author ruoyi
*/
@RestController
@RequestMapping("/cms/notice")
public class CmsNoticeController extends BaseController
{
@Autowired
private IAppNoticeService noticeService;
@Autowired
private IAppUserService appUserService;
/**
* 获取通知公告列表
*/
@PreAuthorize("@ss.hasPermi('system:notice:list')")
@GetMapping("/list")
public TableDataInfo list(AppNotice notice)
{
startPage();
List<AppNotice> list = noticeService.selectNoticeList(notice);
return getDataTable(list);
}
/**
* 根据通知公告编号获取详细信息
*/
@PreAuthorize("@ss.hasPermi('system:notice:query')")
@GetMapping(value = "/{noticeId}")
public AjaxResult getInfo(@PathVariable Long noticeId)
{
return success(noticeService.selectNoticeById(noticeId));
}
/**
* 新增通知公告
*/
@PreAuthorize("@ss.hasPermi('system:notice:add')")
@Log(title = "通知公告", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody AppNotice notice)
{
notice.setCreateBy(getUsername());
return toAjax(noticeService.insertNotice(notice));
}
/**
* 修改通知公告
*/
@PreAuthorize("@ss.hasPermi('system:notice:edit')")
@Log(title = "通知公告", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody AppNotice notice)
{
notice.setUpdateBy(getUsername());
return toAjax(noticeService.updateNotice(notice));
}
/**
* 删除通知公告
*/
@PreAuthorize("@ss.hasPermi('system:notice:remove')")
@Log(title = "通知公告", businessType = BusinessType.DELETE)
@DeleteMapping("/{noticeIds}")
public AjaxResult remove(@PathVariable Long[] noticeIds)
{
return toAjax(noticeService.deleteNoticeByIds(noticeIds));
}
@ApiOperation("pc端获取消息列表")
@GetMapping("/appNoticList")
public TableDataInfo selectListAppNotics(Notice notice)
{
if(!SecurityUtils.isLogin()){
error(HttpStatus.ERROR,"未登录!");
}
if(notice.getUserId()==null){
String idCard= RoleUtils.getCurrentUseridCard();
AppUser appUser=appUserService.selectAppuserByIdcard(idCard);
if(appUser==null){
error(HttpStatus.ERROR,"用户信息未完善,请完善身份证信息!");
}else{
notice.setUserId(appUser.getUserId());
}
}
startPage();
List<Notice> notices = noticeService.selectListAppNotics(notice);
return getDataTable(notices);
}
@ApiOperation("pc端获取未读消息列表")
@GetMapping("/appNoticReadList")
public TableDataInfo appNoticReadList(Notice notice)
{
if(!SecurityUtils.isLogin()){
error(HttpStatus.ERROR,"未登录!");
}
if(notice.getUserId()==null){
String idCard= RoleUtils.getCurrentUseridCard();
AppUser appUser=appUserService.selectAppuserByIdcard(idCard);
if(appUser==null){
error(HttpStatus.ERROR,"用户信息未完善,请完善身份证信息!");
}else{
notice.setUserId(appUser.getUserId());
}
}
startPage();
List<Notice> notices = noticeService.selectListAppNotRead(notice);
return getDataTable(notices);
}
@ApiOperation("pc端获已读消息列表")
@GetMapping("/appNoticYdList")
public TableDataInfo appNoticYdList(Notice notice)
{
if(!SecurityUtils.isLogin()){
error(HttpStatus.ERROR,"未登录!");
}
if(notice.getUserId()==null){
String idCard= RoleUtils.getCurrentUseridCard();
AppUser appUser=appUserService.selectAppuserByIdcard(idCard);
if(appUser==null){
error(HttpStatus.ERROR,"用户信息未完善,请完善身份证信息!");
}else{
notice.setUserId(appUser.getUserId());
}
}
startPage();
notice.setIsRead(NoticeUtils.NOTICE_YD);
notice.setRemark(NoticeUtils.NOTICE_REMARK);
List<Notice> notices = noticeService.selectListAppNotices(notice);
return getDataTable(notices);
}
@ApiOperation("系统通知标记已读")
@PostMapping("/read/sysNotice")
public AjaxResult sysNotice(@RequestParam String id)
{
Long userId=null;
if(!SecurityUtils.isLogin()){
return AjaxResult.error("未登录!");
}
if(userId==null){
String idCard= RoleUtils.getCurrentUseridCard();
AppUser appUser=appUserService.selectAppuserByIdcard(idCard);
if(appUser==null){
return AjaxResult.error("用户信息未完善,请完善身份证信息!");
}else{
userId=appUser.getUserId();
}
}
noticeService.readSysNotices(id,userId);
return AjaxResult.success();
}
/**
* 获取消息条数
*/
@ApiOperation("获取移动端用户消息条数")
@GetMapping("/noticTotal")
public AjaxResult getNoticTotal(Notice notice){
if(!SecurityUtils.isLogin()){
return AjaxResult.success("未登录!,返回为空");
}
if(notice.getUserId()==null){
String idCard= RoleUtils.getCurrentUseridCard();
AppUser appUser=appUserService.selectAppuserByIdcard(idCard);
if(appUser==null){
error(HttpStatus.ERROR,"用户信息未完善,请完善身份证信息!");
}else{
notice.setUserId(appUser.getUserId());
}
}
startPage();
NoticeTotal notices = noticeService.noticTotal(notice);
return success(notices);
}
@ApiOperation("获取移动端用户消息条数")
@DeleteMapping("/deleteNotice/{ids}")
public AjaxResult deleteNotice(@PathVariable Long[] ids){
return success(noticeService.removeNotice(ids));
}
}

View File

@@ -0,0 +1,106 @@
package com.ruoyi.cms.controller.cms;
import com.ruoyi.cms.service.AppSkillService;
import com.ruoyi.cms.service.IAppUserService;
import com.ruoyi.cms.util.RoleUtils;
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.domain.entity.AppSkill;
import com.ruoyi.common.core.domain.entity.AppUser;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.SecurityUtils;
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.web.bind.annotation.*;
import java.util.List;
/**
* 用户技能信息
*
* @author
* @email
* @date 2025-10-21 12:22:09
*/
@RestController
@RequestMapping("/cms/appskill")
@Api(tags = "后台:用户技能")
public class CmsSkillController extends BaseController {
@Autowired
private AppSkillService appSkillService;
@Autowired
private IAppUserService appUserService;
/**
* 列表
*/
@ApiOperation("获取技能列表")
@GetMapping("/list")
public TableDataInfo list(AppSkill appSkill){
startPage();
List<AppSkill> list=appSkillService.getList(appSkill);
return getDataTable(list);
}
/**
* 信息
*/
@ApiOperation("获取技能详情")
@GetMapping(value = "/{id}")
public AjaxResult info(@PathVariable("id") Long id){
return success(appSkillService.getAppskillById(id));
}
/**
* 保存
*/
@ApiOperation("新增技能")
@Log(title = "技能", businessType = BusinessType.INSERT)
@PostMapping("/add")
public AjaxResult save(@RequestBody AppSkill appSkill){
if(SecurityUtils.isLogin()){
AppUser appUser=appUserService.selectAppuserByIdcard(RoleUtils.getCurrentUseridCard());
if(appUser==null){
return AjaxResult.error("未传递userId!");
}
appSkill.setUserId(appUser.getUserId());
}else {
return AjaxResult.error("未登录!");
}
return toAjax(appSkillService.insertAppskill(appSkill));
}
/**
* 修改
*/
@ApiOperation("修改技能")
@Log(title = "技能", businessType = BusinessType.UPDATE)
@PutMapping("/edit")
public AjaxResult update(@RequestBody AppSkill appSkill){
if (appSkill.getId()==null){
return AjaxResult.error("参数id未传递!");
}
return toAjax(appSkillService.updateAppskillById(appSkill));
}
/**
* 删除
*/
@Log(title = "删除技能", businessType = BusinessType.DELETE)
@ApiOperation("技能")
@DeleteMapping("/{ids}")
public AjaxResult delete(@ApiParam("主键ids") @PathVariable Long[] ids){
if(ids==null){
return AjaxResult.error("参数ids未传递!");
}
return toAjax(appSkillService.removeAppskillIds(ids));
}
}

View File

@@ -0,0 +1,113 @@
package com.ruoyi.cms.controller.cms;
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 io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import com.ruoyi.cms.domain.CommercialArea;
import com.ruoyi.cms.service.ICommercialAreaService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 商圈Controller
*
* @author Lishundong
* @date 2024-11-12
*/
@RestController
@RequestMapping("/cms/area")
@Api(tags = "后台:商圈")
public class CommercialAreaController extends BaseController
{
@Autowired
private ICommercialAreaService commercialAreaService;
/**
* 查询商圈列表
*/
@ApiOperation("查询商圈列表")
@PreAuthorize("@ss.hasPermi('cms:area:list')")
@GetMapping("/list")
public TableDataInfo list(CommercialArea commercialArea)
{
startPage();
List<CommercialArea> list = commercialAreaService.selectCommercialAreaList(commercialArea);
return getDataTable(list);
}
/**
* 导出商圈列表
*/
@ApiOperation("导出商圈列表")
@PreAuthorize("@ss.hasPermi('cms:area:export')")
@Log(title = "商圈", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, CommercialArea commercialArea)
{
List<CommercialArea> list = commercialAreaService.selectCommercialAreaList(commercialArea);
ExcelUtil<CommercialArea> util = new ExcelUtil<CommercialArea>(CommercialArea.class);
util.exportExcel(response, list, "商圈数据");
}
/**
* 获取商圈详细信息
*/
@ApiOperation("获取商圈详细信息")
@PreAuthorize("@ss.hasPermi('cms:area:query')")
@GetMapping(value = "/{commercialAreaId}")
public AjaxResult getInfo(@PathVariable("commercialAreaId") Long commercialAreaId)
{
return success(commercialAreaService.selectCommercialAreaByCommercialAreaId(commercialAreaId));
}
/**
* 新增商圈
*/
@ApiOperation("新增商圈")
@PreAuthorize("@ss.hasPermi('cms:area:add')")
@Log(title = "商圈", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody CommercialArea commercialArea)
{
return toAjax(commercialAreaService.insertCommercialArea(commercialArea));
}
/**
* 修改商圈
*/
@ApiOperation("修改商圈")
@PreAuthorize("@ss.hasPermi('cms:area:edit')")
@Log(title = "商圈", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody CommercialArea commercialArea)
{
return toAjax(commercialAreaService.updateCommercialArea(commercialArea));
}
/**
* 删除商圈
*/
@ApiOperation("删除商圈")
@PreAuthorize("@ss.hasPermi('cms:area:remove')")
@Log(title = "商圈", businessType = BusinessType.DELETE)
@DeleteMapping("/{commercialAreaIds}")
public AjaxResult remove(@PathVariable Long[] commercialAreaIds)
{
return toAjax(commercialAreaService.deleteCommercialAreaByCommercialAreaIds(commercialAreaIds));
}
}

View File

@@ -0,0 +1,54 @@
package com.ruoyi.cms.controller.cms;
import com.ruoyi.cms.domain.CommunityUser;
import com.ruoyi.cms.service.ICommunityUserService;
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 org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/cms/communityUser")
@Api(tags = "后台:工作人员管理")
public class CommunityUserController extends BaseController {
@Autowired
private ICommunityUserService communityUserService;
@ApiOperation("查询工作人员列表")
@PreAuthorize("@ss.hasPermi('application:mgmt:list')")
@GetMapping("/list")
public TableDataInfo list(CommunityUser communityUser) {
startPage();
List<CommunityUser> list = communityUserService.selectCommunityUserList(communityUser);
return getDataTable(list);
}
@ApiOperation("新增工作人员")
@PreAuthorize("@ss.hasPermi('application:mgmt:add')")
@PostMapping
public AjaxResult add(@RequestBody CommunityUser communityUser) {
return toAjax(communityUserService.save(communityUser));
}
@ApiOperation("修改工作人员")
@PreAuthorize("@ss.hasPermi('application:mgmt:edit')")
@PutMapping
public AjaxResult update(@RequestBody CommunityUser communityUser) {
return toAjax(communityUserService.updateById(communityUser));
}
@ApiOperation("删除工作人员")
@PreAuthorize("@ss.hasPermi('application:mgmt:del')")
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable("ids") Long[] ids) {
return toAjax(communityUserService.delCommunityUser(ids));
}
}

View File

@@ -0,0 +1,116 @@
package com.ruoyi.cms.controller.cms;
import java.sql.Array;
import java.util.ArrayList;
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 io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import com.ruoyi.cms.domain.CompanyCard;
import com.ruoyi.cms.service.ICompanyCardService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 公司卡片Controller
*
* @author ${author}
* @date 2025-02-18
*/
@RestController
@RequestMapping("/cms/card")
@Api(tags = "公司卡片")
public class CompanyCardController extends BaseController
{
@Autowired
private ICompanyCardService companyCardService;
/**
* 查询公司卡片列表
*/
@ApiOperation("查询公司卡片列表")
@PreAuthorize("@ss.hasPermi('system:card:list')")
@GetMapping("/list")
public TableDataInfo list(CompanyCard companyCard)
{
startPage();
List<CompanyCard> list = companyCardService.selectCompanyCardList(companyCard);
return getDataTable(list);
}
/**
* 导出公司卡片列表
*/
@ApiOperation("导出公司卡片列表")
@PreAuthorize("@ss.hasPermi('system:card:export')")
@Log(title = "公司卡片", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, CompanyCard companyCard)
{
List<CompanyCard> list = companyCardService.selectCompanyCardList(companyCard);
ExcelUtil<CompanyCard> util = new ExcelUtil<CompanyCard>(CompanyCard.class);
util.exportExcel(response, list, "公司卡片数据");
}
/**
* 获取公司卡片详细信息
*/
@ApiOperation("获取公司卡片详细信息")
@PreAuthorize("@ss.hasPermi('system:card:query')")
@GetMapping(value = "/{companyCardId}")
public AjaxResult getInfo(@PathVariable("companyCardId") Long companyCardId)
{
return success(companyCardService.selectCompanyCardByCompanyCardId(companyCardId));
}
/**
* 新增公司卡片
*/
@ApiOperation("新增公司卡片")
@PreAuthorize("@ss.hasPermi('system:card:add')")
@Log(title = "公司卡片", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody CompanyCard companyCard)
{
return toAjax(companyCardService.insertCompanyCard(companyCard));
}
/**
* 修改公司卡片
*/
@ApiOperation("修改公司卡片")
@PreAuthorize("@ss.hasPermi('system:card:edit')")
@Log(title = "公司卡片", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody CompanyCard companyCard)
{
return toAjax(companyCardService.updateCompanyCard(companyCard));
}
/**
* 删除公司卡片
*/
@ApiOperation("删除公司卡片")
@PreAuthorize("@ss.hasPermi('system:card:remove')")
@Log(title = "公司卡片", businessType = BusinessType.DELETE)
@DeleteMapping("/{companyCardIds}")
public AjaxResult remove(@PathVariable Long[] companyCardIds)
{
return toAjax(companyCardService.deleteCompanyCardByCompanyCardIds(companyCardIds));
}
}

View File

@@ -0,0 +1,42 @@
package com.ruoyi.cms.controller.cms;
import com.ruoyi.common.core.domain.entity.CompanyContact;
import com.ruoyi.cms.service.CompanyContactService;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.page.TableDataInfo;
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;
/**
* 公司联系人
*
* @author
* @email
* @date 2025-09-30 15:57:06
*/
@RestController
@RequestMapping("/cms/companycontact")
@Api(tags = "后台:公司联系人")
public class CompanyContactController extends BaseController {
@Autowired
private CompanyContactService companyContactService;
/**
* 列表
*/
@ApiOperation("公司联系人列表")
@PreAuthorize("@ss.hasPermi('cms:companycontact:list')")
@RequestMapping("/list")
public TableDataInfo list(CompanyContact companyContact){
List<CompanyContact> list=companyContactService.getSelectList(companyContact);
return getDataTable(list);
}
}

View File

@@ -0,0 +1,142 @@
package com.ruoyi.cms.controller.cms;
import com.ruoyi.cms.util.RoleUtils;
import com.ruoyi.common.core.domain.entity.Company;
import com.ruoyi.cms.service.ICompanyService;
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 com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
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 javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
* 公司Controller
*
* @author lishundong
* @date 2024-09-04
*/
@RestController
@RequestMapping("/cms/company")
@Api(tags = "后台:公司管理")
public class CompanyController extends BaseController
{
@Autowired
private ICompanyService companyService;
/**
* 查询公司列表
*/
@ApiOperation("查询公司列表")
// @PreAuthorize("@ss.hasPermi('cms:company:list')")
@GetMapping("/list")
public TableDataInfo list(Company company)
{
if (RoleUtils.isCompanyAdmin()) {
System.out.println("企业社会信用代码============================="+RoleUtils.getCurrentUseridCard());
company.setCode(RoleUtils.getCurrentUseridCard());
}
startPage();
List<Company> list = companyService.selectCompanyList(company);
return getDataTable(list);
}
/**
* 导出公司列表
*/
@ApiOperation("导出公司列表")
// @PreAuthorize("@ss.hasPermi('app:company:export')")
@Log(title = "公司", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, Company company)
{
List<Company> list = companyService.selectCompanyList(company);
ExcelUtil<Company> util = new ExcelUtil<Company>(Company.class);
util.exportExcel(response, list, "公司数据");
}
/**
* 获取公司详细信息
*/
@ApiOperation("获取公司详细信息")
// @PreAuthorize("@ss.hasPermi('app:company:query')")
@GetMapping(value = "/{companyId}")
public AjaxResult getInfo(@PathVariable("companyId") Long companyId)
{
return success(companyService.selectCompanyByCompanyId(companyId));
}
/**
* 新增公司
*/
@ApiOperation("新增公司")
// @PreAuthorize("@ss.hasPermi('app:company:add')")
@Log(title = "公司", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody Company company)
{
return toAjax(companyService.insertCompany(company));
}
/**
* 修改公司
*/
@ApiOperation("修改公司")
// @PreAuthorize("@ss.hasPermi('app:company:edit')")
@Log(title = "公司", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody Company company)
{
return toAjax(companyService.updateCompany(company));
}
/**
* 删除公司
*/
@ApiOperation("删除公司")
// @PreAuthorize("@ss.hasPermi('app:company:remove')")
@Log(title = "公司", businessType = BusinessType.DELETE)
@DeleteMapping("/{companyIds}")
public AjaxResult remove(@PathVariable Long[] companyIds)
{
return toAjax(companyService.deleteCompanyByCompanyIds(companyIds));
}
@ApiOperation("企业资质审核列表")
@PreAuthorize("@ss.hasPermi('app:company:approval:list')")
@GetMapping("/approval/list")
public TableDataInfo approvalList(Company company)
{
startPage();
List<Company> list = companyService.approvalList(company);
return getDataTable(list);
}
@ApiOperation("企业资质修改")
// @PreAuthorize("@ss.hasPermi('app:company:approval:edit')")
@GetMapping("/approval/edit")
public AjaxResult approvalEdit(Company company)
{
startPage();
List<Company> list = companyService.approvalList(company);
return AjaxResult.success();
}
@ApiOperation("查询公司列表")
// @PreAuthorize("@ss.hasPermi('cms:company:list')")
@GetMapping("/listPage")
public TableDataInfo listPage(Company company)
{
startPage();
List<Company> list = companyService.selectCompanyList(company);
return getDataTable(list);
}
}

View File

@@ -0,0 +1,71 @@
package com.ruoyi.cms.controller.cms;
import com.ruoyi.cms.domain.EmployeeConfirm;
import com.ruoyi.cms.service.EmployeeConfirmService;
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 com.ruoyi.common.enums.BusinessType;
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;
/**
* 新入职员工确认信息
*
* @author
* @email
* @date 2025-10-10 10:42:16
*/
@RestController
@RequestMapping("/cms/employeeConfirm")
@Api(tags = "后台:新入职员工确认信息")
public class EmployeeConfirmController extends BaseController {
@Autowired
private EmployeeConfirmService employeeConfirmService;
/**
* 列表
*/
@ApiOperation("新入职员工确认信息列表")
// @PreAuthorize("@ss.hasPermi('cms:employeeConfirm:list')")
@RequestMapping("/list")
public TableDataInfo list(EmployeeConfirm employeeConfirm){
List<EmployeeConfirm> list=employeeConfirmService.getEmployeeConfirmList(employeeConfirm);
return getDataTable(list);
}
/**
* 保存
*/
@ApiOperation("新增新入职员工确认信息")
// @PreAuthorize("@ss.hasPermi('cms:employeeConfirm:add')")
@Log(title = "职员工确认信息", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody EmployeeConfirm employeeConfirm){
return toAjax(employeeConfirmService.insertEmployeeConfirm(employeeConfirm));
}
@ApiOperation("修改新入职员工确认信息")
// @PreAuthorize("@ss.hasPermi('cms:employeeConfirm:edit')")
@Log(title = "职员工确认信息", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody EmployeeConfirm employeeConfirm){
return toAjax(employeeConfirmService.updateEmployeeConfirm(employeeConfirm));
}
@ApiOperation("删除新入职员工确认信息")
// @PreAuthorize("@ss.hasPermi('app:employeeConfirm:remove')")
@Log(title = "公司", businessType = BusinessType.DELETE)
@DeleteMapping("/{employeeConfirmIds}")
public AjaxResult remove(@PathVariable Long[] employeeConfirmIds)
{
return toAjax(employeeConfirmService.deleteEmployeeConfirmIds(employeeConfirmIds));
}
}

View File

@@ -0,0 +1,246 @@
package com.ruoyi.cms.controller.cms;
import java.util.List;
import com.ruoyi.common.core.domain.entity.Industry;
import com.ruoyi.common.utils.poi.ExcelUtil;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
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 io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import com.ruoyi.cms.service.IIndustryService;
import com.ruoyi.common.core.page.TableDataInfo;
import javax.servlet.http.HttpServletResponse;
/**
* 行业Controller
*
* @author LishunDong
* @date 2024-11-12
*/
@RestController
@RequestMapping("/cms/industry")
@Api(tags = "后台:行业管理")
public class IndustryController extends BaseController
{
@Autowired
private IIndustryService industryService;
/**
* 查询行业列表
*/
@ApiOperation("查询行业列表")
@PreAuthorize("@ss.hasPermi('cms:industry:list')")
@GetMapping("/list")
public TableDataInfo list(Industry industry)
{
startPage();
List<Industry> list = industryService.selectIndustryList(industry);
return getDataTable(list);
}
@ApiOperation("行业树结构")
// @PreAuthorize("@ss.hasPermi('cms:industry:list')")
@GetMapping("/treeselect")
public AjaxResult treeselect(Industry industry)
{
List<Industry> industryList = industryService.selectIndustryList(industry);
return success(industryService.buildIndustryTreeSelect(industryList));
}
/**
* 导出行业列表
*/
@ApiOperation("导出行业列表")
@PreAuthorize("@ss.hasPermi('cms:industry:export')")
@Log(title = "行业", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, Industry industry)
{
List<Industry> list = industryService.selectIndustryList(industry);
ExcelUtil<Industry> util = new ExcelUtil<Industry>(Industry.class);
util.exportExcel(response, list, "行业数据");
}
/**
* 获取行业详细信息
*/
@ApiOperation("获取行业详细信息")
@PreAuthorize("@ss.hasPermi('cms:industry:query')")
@GetMapping(value = "/{industryId}")
public AjaxResult getInfo(@PathVariable("industryId") Long industryId)
{
return success(industryService.selectIndustryByIndustryId(industryId));
}
/**
* 新增行业
*/
@ApiOperation("新增行业")
@PreAuthorize("@ss.hasPermi('cms:industry:add')")
@Log(title = "行业", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody Industry industry)
{
return toAjax(industryService.insertIndustry(industry));
}
/**
* 修改行业
*/
@ApiOperation("修改行业")
@PreAuthorize("@ss.hasPermi('cms:industry:edit')")
@Log(title = "行业", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody Industry industry)
{
return toAjax(industryService.updateIndustry(industry));
}
/**
* 删除行业
*/
@ApiOperation("删除行业")
@PreAuthorize("@ss.hasPermi('cms:industry:remove')")
@Log(title = "行业", businessType = BusinessType.DELETE)
@DeleteMapping("/{industryId}")
public AjaxResult remove(@PathVariable Long industryId)
{
if (industryService.hasChildByIndustryId(industryId))
{
return warn("存在子行业,不允许删除");
}
Long[] industryIds = {industryId};
return toAjax(industryService.deleteIndustryByIndustryIds(industryIds));
}
@GetMapping("/import")
public AjaxResult importData()
{
industryService.importData();
return success();
}
/**
* 修改行业父级代码
* select * from industry where length(remark)=1 order by order_num;
* select * from industry where length(remark)=3 and remark like 'A%' order by order_num;
* select * from industry where length(remark)=4 and remark like 'A01%' order by order_num;
* select * from industry where length(remark)=5 and remark like 'A011%' order by order_num;
*/
@PostMapping("/updateParentHierarchy")
@Transactional(rollbackFor = Exception.class)
public void updateParentHierarchy() {
// 第一层所有1位长度的大类orderNum=1 → LENGTH(remark)=1无前缀过滤包含20个大类
Industry queryLevel1 = new Industry();
queryLevel1.setOrderNum(1L); // 对应 SQLLENGTH(remark)=1
List<Industry> level1List = industryService.selectIndustryList(queryLevel1);
if (level1List.isEmpty()) {
throw new RuntimeException("未查询到1位长度的大类数据");
}
System.out.println("共查询到 " + level1List.size() + " 个1位大类开始更新层级关系...");
// 遍历每个1位大类处理其下的3位子级
for (Industry level1 : level1List) {
Long level1Id = level1.getIndustryId();
String level1Remark = level1.getRemark();
// 跳过无效数据ID或remark为空
if (level1Id == null || level1Remark == null) {
System.out.println("跳过无效大类ID=" + level1Id + "remark=" + level1Remark);
continue;
}
System.out.println("处理大类remark=" + level1Remark + "ID=" + level1Id);
// 第二层3位长度orderNum=3 + 前缀=当前大类remark比如" B"→"B%"
Industry queryLevel2 = new Industry();
queryLevel2.setOrderNum(3L); // LENGTH(remark)=3
queryLevel2.setRemark(level1Remark); // remark like 'B%'(自动匹配当前大类前缀)
List<Industry> level2List = industryService.selectIndustryList(queryLevel2);
if (level2List.isEmpty()) {
System.out.println("大类 " + level1Remark + " 无3位子级跳过");
continue;
}
// 遍历3位子级处理其下的4位孙级
for (Industry level2 : level2List) {
Long level2Id = level2.getIndustryId();
String level2Remark = level2.getRemark();
if (level2Id == null || level2Remark == null) {
continue;
}
// 第三层4位长度orderNum=4 + 前缀=当前3位子级remark比如"B02"→"B02%"
Industry queryLevel3 = new Industry();
queryLevel3.setOrderNum(4L); // LENGTH(remark)=4
queryLevel3.setRemark(level2Remark); // remark like 'B02%'
List<Industry> level3List = industryService.selectIndustryList(queryLevel3);
if (level3List.isEmpty()) {
// 无4位孙级直接更新3位子级的父ID=1位大类ID
updateParentId(level2Id, level1Id);
continue;
}
// 遍历4位孙级处理其下的5位曾孙级
for (Industry level3 : level3List) {
Long level3Id = level3.getIndustryId();
String level3Remark = level3.getRemark();
if (level3Id == null || level3Remark == null) {
continue;
}
// 第四层5位长度orderNum=5 + 前缀=当前4位孙级remark比如"B021"→"B021%"
Industry queryLevel4 = new Industry();
queryLevel4.setOrderNum(5L); // LENGTH(remark)=5
queryLevel4.setRemark(level3Remark); // remark like 'B021%'
List<Industry> level4List = industryService.selectIndustryList(queryLevel4);
// 更新5位曾孙级的父ID=4位孙级ID
for (Industry level4 : level4List) {
if (level4.getIndustryId() != null && level4.getRemark() != null) {
updateParentId(level4.getIndustryId(), level3Id);
System.out.println("更新5位数据" + level4.getRemark() + " → 父ID=" + level3Id);
}
}
// 更新4位孙级的父ID=3位子级ID
updateParentId(level3Id, level2Id);
System.out.println("更新4位数据" + level3Remark + " → 父ID=" + level2Id);
}
// 更新3位子级的父ID=1位大类ID
updateParentId(level2Id, level1Id);
System.out.println("更新3位数据" + level2Remark + " → 父ID=" + level1Id);
}
}
System.out.println("层级关系更新完成!");
}
/**
* 修改行业父级代码
* @param targetIndustryId
* @param parentId
*/
private void updateParentId(Long targetIndustryId, Long parentId) {
Industry updateIndustry = new Industry();
updateIndustry.setIndustryId(targetIndustryId);
updateIndustry.setParentId(parentId);
industryService.updateIndustry(updateIndustry);
}
}

View File

@@ -0,0 +1,165 @@
package com.ruoyi.cms.controller.cms;
import com.alibaba.excel.util.StringUtils;
import com.ruoyi.cms.domain.Job;
import com.ruoyi.cms.domain.JobApply;
import com.ruoyi.cms.domain.vo.CandidateVO;
import com.ruoyi.cms.service.IAppUserService;
import com.ruoyi.cms.service.IJobApplyService;
import com.ruoyi.cms.util.RoleUtils;
import com.ruoyi.cms.util.StringUtil;
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.domain.entity.AppUser;
import com.ruoyi.common.core.domain.entity.Company;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
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 javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.List;
@RestController
@RequestMapping("/cms/jobApply")
@Api(tags = "后台:岗位申请")
public class JobApplyController extends BaseController {
@Autowired
IJobApplyService iJobApplyService;
@Autowired
private IAppUserService appUserService;
@GetMapping("/trendChart")
public AjaxResult trendChart(JobApply jobApply)
{
HashMap<String,Integer> result = iJobApplyService.trendChart(jobApply);
return success(result);
}
/**
* 导出APP用户列表
*/
@ApiOperation("导出岗位申请APP用户")
@PreAuthorize("@ss.hasPermi('cms:jobApply:export')")
@Log(title = "APP用户", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, Job job)
{
List<CandidateVO> list = iJobApplyService.selectAppUserList(job);
ExcelUtil<CandidateVO> util = new ExcelUtil<CandidateVO>(CandidateVO.class);
util.exportExcel(response, list, "APP用户数据");
}
@ApiOperation("获取求职者列表")
@PreAuthorize("@ss.hasPermi('cms:jobApply:applyJobUserList')")
@GetMapping("/applyJobUserList")
public TableDataInfo applyJobList(AppUser appUser)
{
if (RoleUtils.isCompanyAdmin()) {
Company company=new Company();
company.setCode(RoleUtils.getCurrentUseridCard());
}
startPage();
List<CandidateVO> list = iJobApplyService.selectApplyJobUserList(appUser);
return getDataTable(list);
}
@PutMapping
@Log(title = "岗位", businessType = BusinessType.UPDATE)
@ApiOperation("用户申请岗位")
public AjaxResult apply(@RequestBody JobApply jobApply)
{
if(jobApply.getJobId()==null){
return AjaxResult.error("岗位id为空");
}
if(!SecurityUtils.isLogin()){
return AjaxResult.error("用户未登录!");
}
if(jobApply.getUserId()==null){
String idCard=RoleUtils.getCurrentUseridCard();
AppUser appUser=appUserService.selectAppuserByIdcard(idCard);
if(appUser==null){
return AjaxResult.error("用户信息未完善,请完善身份证信息!");
}else{
jobApply.setUserId(appUser.getUserId());
}
}
return success(iJobApplyService.applyComJob(jobApply));
}
@Log(title = "岗位", businessType = BusinessType.UPDATE)
@ApiOperation("求职者管理-用户列表录用")
@PutMapping("/applyAgree")
public AjaxResult applyAgree(@RequestBody JobApply jobApply)
{
if(jobApply.getId()==null){
return AjaxResult.error("参数id为空");
}
jobApply.setHire(StringUtil.HIRE_LY);
jobApply.setHireSource(StringUtil.HIRE_SOURCE_SYSTEM);
return success(iJobApplyService.updateJobApply(jobApply));
}
@Log(title = "岗位", businessType = BusinessType.INSERT)
@ApiOperation("招聘会-岗位申请")
@PostMapping("/zphApply")
public AjaxResult zphApply(@RequestBody JobApply jobApply)
{
if(jobApply.getJobId()==null){
return AjaxResult.error("岗位id为空");
}
String idCard = jobApply.getIdCard();
if(StringUtils.isBlank(idCard)){
return AjaxResult.error("身份证为空!");
}
if (!idCard.matches(StringUtil.SFZ_VALID_REGEX)) {
return AjaxResult.error("身份证格式不正确");
}
AppUser appUser=appUserService.selectAppuserByIdcard(idCard);
if(appUser==null){
return AjaxResult.error("在系统库中未查询到当前用户信息!");
}
jobApply.setUserId(appUser.getUserId());
JobApply parm=new JobApply();
parm.setJobId(jobApply.getJobId());
parm.setUserId(appUser.getUserId());
List<JobApply> applies=iJobApplyService.selectJobApplyList(parm);
if(applies!=null&&applies.size()>0){
return AjaxResult.error("当前用户,已申请过该岗位,请勿重复申请!");
}
return success(iJobApplyService.applyComJob(jobApply));
}
@Log(title = "岗位", businessType = BusinessType.INSERT)
@ApiOperation("招聘会-岗位录用")
@PostMapping("/zphApplyAgree")
public AjaxResult zphApplyAgree(@RequestBody JobApply jobApply)
{
if(jobApply.getJobId()==null){
return AjaxResult.error("岗位id为空");
}
String idCard = jobApply.getIdCard();
if(StringUtils.isBlank(idCard)){
return AjaxResult.error("身份证为空!");
}
if (!idCard.matches(StringUtil.SFZ_VALID_REGEX)) {
return AjaxResult.error("身份证格式不正确");
}
AppUser appUser=appUserService.selectAppuserByIdcard(idCard);
if(appUser==null){
return AjaxResult.error("在系统库中未查询到当前用户信息!");
}
jobApply.setUserId(appUser.getUserId());
jobApply.setHire(StringUtil.HIRE_LY);
jobApply.setHireSource(StringUtil.HIRE_SOURCE_ZPH);
return success(iJobApplyService.updateJobZphApply(jobApply));
}
}

View File

@@ -0,0 +1,43 @@
package com.ruoyi.cms.controller.cms;
import com.ruoyi.cms.domain.JobContact;
import com.ruoyi.cms.service.JobContactService;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.page.TableDataInfo;
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;
/**
* 岗位联系人
*
* @author
* @email
* @date 2025-09-30 15:57:06
*/
@RestController
@RequestMapping("/cms/jobcontact")
@Api(tags = "后台:岗位联系人")
public class JobContactController extends BaseController {
@Autowired
private JobContactService jobContactService;
/**
* 列表
*/
@ApiOperation("岗位联系人列表")
@PreAuthorize("@ss.hasPermi('cms:jobcontact:list')")
@RequestMapping("/list")
public TableDataInfo list(JobContact jobContact){
startPage();
List<JobContact> list = jobContactService.getSelectList(jobContact);
return getDataTable(list);
}
}

View File

@@ -0,0 +1,110 @@
package com.ruoyi.cms.controller.cms;
import java.util.List;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
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 com.ruoyi.cms.domain.JobFair;
import com.ruoyi.cms.service.IJobFairService;
import com.ruoyi.common.core.page.TableDataInfo;
import javax.servlet.http.HttpServletResponse;
/**
* 招聘会信息Controller
*
* @author lishundong
* @date 2024-09-04
*/
@RestController
@RequestMapping("/cms/fair")
@Api(tags = "后台:招聘会信息")
public class JobFairController extends BaseController
{
@Autowired
private IJobFairService jobFairService;
/**
* 查询招聘会信息列表
*/
@ApiOperation("查询招聘会信息列表")
@PreAuthorize("@ss.hasPermi('jobfair:list:list')")
@GetMapping("/list")
public TableDataInfo list(JobFair jobFair)
{
startPage();
List<JobFair> list = jobFairService.selectJobFairList(jobFair);
return getDataTable(list);
}
/**
* 导出招聘会信息列表
*/
@ApiOperation("导出招聘会信息列表")
@PreAuthorize("@ss.hasPermi('app:fair:export')")
@Log(title = "招聘会信息", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, JobFair jobFair)
{
List<JobFair> list = jobFairService.selectJobFairList(jobFair);
ExcelUtil<JobFair> util = new ExcelUtil<JobFair>(JobFair.class);
util.exportExcel(response, list, "招聘会信息数据");
}
/**
* 获取招聘会信息详细信息
*/
@ApiOperation("获取招聘会信息详细信息")
@PreAuthorize("@ss.hasPermi('app:fair:query')")
@GetMapping(value = "/{jobFairId}")
public AjaxResult getInfo(@PathVariable("jobFairId") Long jobFairId)
{
return success(jobFairService.selectJobFairByJobFairId(jobFairId));
}
/**
* 新增招聘会信息
*/
@ApiOperation("新增招聘会信息")
@PreAuthorize("@ss.hasPermi('app:fair:add')")
@Log(title = "招聘会信息", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody JobFair jobFair)
{
return toAjax(jobFairService.insertJobFair(jobFair));
}
/**
* 修改招聘会信息
*/
@ApiOperation("修改招聘会信息")
@PreAuthorize("@ss.hasPermi('app:fair:edit')")
@Log(title = "招聘会信息", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody JobFair jobFair)
{
return toAjax(jobFairService.updateJobFair(jobFair));
}
/**
* 删除招聘会信息
*/
@ApiOperation("删除招聘会信息")
@PreAuthorize("@ss.hasPermi('app:fair:remove')")
@Log(title = "招聘会信息", businessType = BusinessType.DELETE)
@DeleteMapping("/{jobFairIds}")
public AjaxResult remove(@PathVariable Long[] jobFairIds)
{
return toAjax(jobFairService.deleteJobFairByJobFairIds(jobFairIds));
}
}

View File

@@ -0,0 +1,142 @@
package com.ruoyi.cms.controller.cms;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.ruoyi.cms.domain.BussinessDictData;
import com.ruoyi.common.core.domain.entity.Industry;
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 io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import com.ruoyi.common.core.domain.entity.JobTitle;
import com.ruoyi.cms.service.IJobTitleService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 岗位Controller
*
* @author Lishundong
* @date 2024-11-12
*/
@RestController
@RequestMapping("/cms/job/titile")
@Api(tags = "后台:职位接口")
public class JobTitleController extends BaseController
{
@Autowired
private IJobTitleService jobTitleService;
/**
* 查询岗位列表
*/
@ApiOperation("查询岗位列表")
@PreAuthorize("@ss.hasPermi('cms:title:list')")
@GetMapping("/list")
public TableDataInfo list(JobTitle jobTitle)
{
startPage();
List<JobTitle> list = jobTitleService.selectJobTitleList(jobTitle);
return getDataTable(list);
}
/**
* 导出岗位列表
*/
@ApiOperation("导出岗位列表")
@PreAuthorize("@ss.hasPermi('cms:title:export')")
@Log(title = "岗位", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, JobTitle jobTitle)
{
List<JobTitle> list = jobTitleService.selectJobTitleList(jobTitle);
ExcelUtil<JobTitle> util = new ExcelUtil<JobTitle>(JobTitle.class);
util.exportExcel(response, list, "岗位数据");
}
/**
* 获取岗位详细信息
*/
@ApiOperation("获取岗位详细信息")
@PreAuthorize("@ss.hasPermi('cms:title:query')")
@GetMapping(value = "/{jobId}")
public AjaxResult getInfo(@PathVariable("jobId") Long jobId)
{
return success(jobTitleService.selectJobTitleByJobId(jobId));
}
/**
* 新增岗位
*/
@ApiOperation("新增岗位")
@PreAuthorize("@ss.hasPermi('cms:title:add')")
@Log(title = "岗位", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody JobTitle jobTitle)
{
return toAjax(jobTitleService.insertJobTitle(jobTitle));
}
/**
* 修改岗位
*/
@ApiOperation("修改岗位")
@PreAuthorize("@ss.hasPermi('cms:title:edit')")
@Log(title = "岗位", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody JobTitle jobTitle)
{
return toAjax(jobTitleService.updateJobTitle(jobTitle));
}
/**
* 删除岗位
*/
@ApiOperation("删除岗位")
@PreAuthorize("@ss.hasPermi('cms:title:remove')")
@Log(title = "岗位", businessType = BusinessType.DELETE)
@DeleteMapping("/{jobId}")
public AjaxResult remove(@PathVariable Long jobId)
{
if (jobTitleService.hasChildByJobId(jobId))
{
return warn("存在子岗位,不允许删除");
}
Long[] jobIds = {jobId};
return toAjax(jobTitleService.deleteJobTitleByJobIds(jobIds));
}
@ApiOperation("行业树结构")
@GetMapping("/treeselect")
public AjaxResult treeselect(JobTitle jobTitle)
{
List<JobTitle> jobTitleList = jobTitleService.selectJobTitleList(jobTitle);
return success(jobTitleService.buildJobTitleTreeSelect(jobTitleList));
}
@GetMapping("/import")
public AjaxResult importJobTitle()
{
jobTitleService.importJobTitle();
return success();
}
@GetMapping("/levelOne")
public AjaxResult levelOne()
{
List<JobTitle> result = jobTitleService.levelOne();
return success(result);
}
}

View File

@@ -0,0 +1,171 @@
package com.ruoyi.cms.controller.cms;
import com.ruoyi.cms.domain.SensitiveWordData;
import com.ruoyi.cms.service.SensitiveWordDataService;
import com.ruoyi.cms.util.EasyExcelUtils;
import com.ruoyi.common.annotation.Anonymous;
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 com.ruoyi.common.enums.BusinessType;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;
/**
* 敏感词库
*
* @author
* @email
* @date 2025-10-10 10:42:16
*/
@RestController
@RequestMapping("/cms/sensitiveworddata")
@Api(tags = "后台:敏感词库")
@Anonymous
public class SensitiveWordDataController extends BaseController {
@Autowired
private SensitiveWordDataService sensitiveWordDataService;
/**
* 列表
*/
@ApiOperation("敏感词库详细信息")
@GetMapping("/list")
public TableDataInfo list(SensitiveWordData sensitiveWordData){
startPage();
List<SensitiveWordData> list = sensitiveWordDataService.selectSensitiveworddataList(sensitiveWordData);
return getDataTable(list);
}
/**
* 获取详细信息
*/
@ApiOperation("获取敏感词库详细信息")
@GetMapping(value = "/{id}")
public AjaxResult list(@PathVariable("id") Long id){
return success(sensitiveWordDataService.selectById(id));
}
/**
* 保存
*/
@ApiOperation("新增敏感词")
@Log(title = "敏感词", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult save(@RequestBody SensitiveWordData sensitiveWordData){
return toAjax(sensitiveWordDataService.insertSensitiveworddata(sensitiveWordData));
}
/**
* 修改
*/
@ApiOperation("修改敏感词")
@Log(title = "敏感词", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody SensitiveWordData sensitiveWordData){
return toAjax(sensitiveWordDataService.updateSensitiveworddata(sensitiveWordData));
}
/**
* 删除敏感词
*/
@ApiOperation("删除敏感词")
@Log(title = "敏感词", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids)
{
if(ids.length==0){
return AjaxResult.error("请传递参数!");
}
return toAjax(sensitiveWordDataService.deleteSensitiveworddataIds(ids));
}
/**
* 通用上传请求(单个)
*/
@PostMapping("/exoprt")
public AjaxResult uploadFile(@RequestParam("file") MultipartFile file) throws Exception
{
// 参数校验
if (file.isEmpty()) {
return AjaxResult.error("上传文件不能为空");
}
String fileName = file.getOriginalFilename();
//类型验证
if (fileName == null || !fileName.endsWith(".xlsx") && !fileName.endsWith(".xls")) {
return AjaxResult.error("请上传Excel格式的文件");
}
//名称验证
if (fileName == null || !"mgc.xlsx".equals(fileName)) {
return AjaxResult.error("请上传正确的模板文件mgc.xlsx");
}
try
{
InputStream inputStream = file.getInputStream();
EasyExcelUtils.readExcelByBatch(inputStream, SensitiveWordData.class, 100, list -> {
// 处理逻辑:如批量保存到数据库
sensitiveWordDataService.batchInsert(list);
});
}
catch (Exception e)
{
return AjaxResult.error(e.getMessage());
}
return AjaxResult.success();
}
@PostMapping("/downloadModel")
public void downloadModel(HttpServletRequest request, HttpServletResponse response)throws Exception{
String name = "mgc.xlsx";
String pathFile="/data/downloadmodel/"+name;
File url = new File(pathFile);
String resMsg = "";
try {
request.setCharacterEncoding("utf-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
try {
name = new String(name.getBytes("gb2312"), "ISO8859-1");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
response.reset();
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename="+ name);
response.setHeader("Pragma", "public");
response.setHeader("Cache-Control", "max-age=0");
InputStream in = null;
try {
in = new FileInputStream(url);
} catch (FileNotFoundException e1) {
resMsg = "文件未找到";
e1.printStackTrace();
response.getWriter().write(resMsg + ":" + name);
}
OutputStream ou = response.getOutputStream();
byte[] buffer = new byte[1024];
int i = -1;
while ((i = in.read(buffer)) != -1) {
ou.write(buffer, 0, i);
}
ou.flush();
ou.close();
in.close();
}
}

View File

@@ -0,0 +1,103 @@
package com.ruoyi.cms.controller.cms;
import com.ruoyi.cms.domain.BussinessDictType;
import com.ruoyi.cms.domain.query.Staticsquery;
import com.ruoyi.cms.service.StaticsqueryService;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/cms/statics")
public class StaticsController extends BaseController {
@Autowired
private StaticsqueryService service;
//分行业趋势分析
@GetMapping("/industry")
public AjaxResult industry(Staticsquery staticsquery)
{
Map<String,Object> result = service.industry(staticsquery);
return success(result);
}
//分行业趋势分析
@GetMapping("/industryGen")
public AjaxResult industryGen()
{
service.industryGen();
return success();
}
//分行业趋势分析
@GetMapping("/industryAreaGen")
public AjaxResult industryAreaGen()
{
service.areaGen();
return success();
}
//分行业趋势分析
@GetMapping("/salaryGen")
public AjaxResult salarysalaryGen()
{
service.salarysalaryGen();
return success();
}
@GetMapping("/salary")
public AjaxResult salary(Staticsquery staticsquery)
{
Map<String,Object> result = service.salary(staticsquery);
return success(result);
}
@GetMapping("/industryArea")
public AjaxResult industryArea(Staticsquery staticsquery)
{
Map<String,Object> result = service.industryArea(staticsquery);
return success(result);
}
//分行业趋势分析
@GetMapping("/workYearGen")
public AjaxResult workYearGen()
{
service.workYearGen();
return success();
}
@GetMapping("/workYear")
public AjaxResult workYear(Staticsquery staticsquery)
{
Map<String,Object> result = service.workYear(staticsquery);
return success(result);
}
//分行业趋势分析
@GetMapping("/educationGen")
public AjaxResult educationGen()
{
service.educationGen();
return success();
}
@GetMapping("/education")
public AjaxResult education(Staticsquery staticsquery)
{
Map<String,Object> result = service.education(staticsquery);
return success(result);
}
//分学历-分薪资
@GetMapping("/educationSalaryGen")
public AjaxResult educationSalaryGen()
{
service.educationSalaryGen();
return success();
}
@GetMapping("/educationSalary")
public AjaxResult educationSalary(Staticsquery staticsquery)
{
Map<String,Object> result = service.educationSalary(staticsquery);
return success(result);
}
}

View File

@@ -0,0 +1,100 @@
package com.ruoyi.cms.controller.cms;
import java.util.List;
import com.ruoyi.common.annotation.BussinessLog;
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 io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import com.ruoyi.cms.domain.SubwayLine;
import com.ruoyi.cms.service.ISubwayLineService;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 地铁线路Controller
*
* @author Lishundong
* @date 2024-11-12
*/
@RestController
@RequestMapping("/cms/line")
@Api(tags = "后台:地铁线路")
public class SubwayLineController extends BaseController
{
@Autowired
private ISubwayLineService subwayLineService;
/**
* 查询地铁线路列表
*/
@ApiOperation("查询地铁线路列表")
@GetMapping("/list")
@BussinessLog(title = "查询地铁线路列表", businessType = BusinessType.CLEAN)
public TableDataInfo list(SubwayLine subwayLine)
{
startPage();
List<SubwayLine> list = subwayLineService.selectSubwayLineList(subwayLine);
return getDataTable(list);
}
/**
* 获取地铁线路详细信息
*/
@ApiOperation("获取地铁线路详细信息")
@PreAuthorize("@ss.hasPermi('system:line:query')")
@GetMapping(value = "/{lineId}")
public AjaxResult getInfo(@PathVariable("lineId") Long lineId)
{
return success(subwayLineService.selectSubwayLineByLineId(lineId));
}
/**
* 新增地铁线路
*/
@ApiOperation("新增地铁线路")
@PreAuthorize("@ss.hasPermi('system:line:add')")
@Log(title = "地铁线路", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody SubwayLine subwayLine)
{
return toAjax(subwayLineService.insertSubwayLine(subwayLine));
}
/**
* 修改地铁线路
*/
@ApiOperation("修改地铁线路")
@PreAuthorize("@ss.hasPermi('system:line:edit')")
@Log(title = "地铁线路", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody SubwayLine subwayLine)
{
return toAjax(subwayLineService.updateSubwayLine(subwayLine));
}
/**
* 删除地铁线路
*/
@ApiOperation("删除地铁线路")
@PreAuthorize("@ss.hasPermi('system:line:remove')")
@Log(title = "地铁线路", businessType = BusinessType.DELETE)
@DeleteMapping("/{lineId}")
public AjaxResult remove(@PathVariable Long lineId)
{
return toAjax(subwayLineService.deleteSubwayLineByLineIds(lineId));
}
}

View File

@@ -0,0 +1,103 @@
package com.ruoyi.cms.controller.cms;
import java.util.List;
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 io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import com.ruoyi.cms.domain.SubwayStation;
import com.ruoyi.cms.service.ISubwayStationService;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 地铁站点Controller
*
* @author Lishundong
* @date 2024-11-12
*/
@RestController
@RequestMapping("/cms/station")
@Api(tags = "后台:地铁站点")
public class SubwayStationController extends BaseController
{
@Autowired
private ISubwayStationService subwayStationService;
/**
* 查询地铁站点列表
*/
@ApiOperation("查询地铁站点列表")
@GetMapping("/list")
public TableDataInfo list(SubwayStation subwayStation)
{
startPage();
List<SubwayStation> list = subwayStationService.selectSubwayStationList(subwayStation);
return getDataTable(list);
}
/**
* 获取地铁站点详细信息
*/
@ApiOperation("获取地铁站点详细信息")
@PreAuthorize("@ss.hasPermi('system:station:query')")
@GetMapping(value = "/{stationId}")
public AjaxResult getInfo(@PathVariable("stationId") Long stationId)
{
return success(subwayStationService.selectSubwayStationByStationId(stationId));
}
/**
* 新增地铁站点
*/
@ApiOperation("新增地铁站点")
@PreAuthorize("@ss.hasPermi('system:station:add')")
@Log(title = "地铁站点", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody SubwayStation subwayStation)
{
return toAjax(subwayStationService.insertSubwayStation(subwayStation));
}
/**
* 修改地铁站点
*/
@ApiOperation("修改地铁站点")
@PreAuthorize("@ss.hasPermi('system:station:edit')")
@Log(title = "地铁站点", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody SubwayStation subwayStation)
{
return toAjax(subwayStationService.updateSubwayStation(subwayStation));
}
/**
* 删除地铁站点
*/
@ApiOperation("删除地铁站点")
@PreAuthorize("@ss.hasPermi('system:station:remove')")
@Log(title = "地铁站点", businessType = BusinessType.DELETE)
@DeleteMapping("/{stationIds}")
public AjaxResult remove(@PathVariable Long[] stationIds)
{
return toAjax(subwayStationService.deleteSubwayStationByStationIds(stationIds));
}
@GetMapping("/import")
public AjaxResult importStation(){
subwayStationService.importStation();
return success();
}
}

View File

@@ -0,0 +1,34 @@
package com.ruoyi.cms.controller.cms;
import com.ruoyi.cms.service.SysAreaService;
import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysArea;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* 地区层级表
*
* @author
* @email
* @date 2025-11-10 15:56:00
*/
@RestController
@RequestMapping("/cms/dict/sysarea")
@Anonymous
public class SysAreaController {
@Autowired
private SysAreaService sysAreaService;
/**
* 列表
*/
@GetMapping("/list")
public AjaxResult jobCategory(SysArea sysArea){
return AjaxResult.success(sysAreaService.getList(sysArea));
}
}

View File

@@ -0,0 +1,108 @@
package com.ruoyi.cms.controller.cms;
import com.ruoyi.cms.service.IAppUserService;
import com.ruoyi.cms.util.RoleUtils;
import com.ruoyi.common.core.domain.entity.AppUser;
import com.ruoyi.common.core.domain.entity.UserWorkExperiences;
import com.ruoyi.cms.service.UserWorkExperiencesService;
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 com.ruoyi.common.enums.BusinessType;
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;
/**
* 用户工作经历表
*
* @author
* @email
* @date 2025-10-10 16:26:26
*/
@RestController
@RequestMapping("/cms/userworkexperiences")
@Api(tags = "后台:用户工作经历")
public class UserWorkExperiencesController extends BaseController {
@Autowired
private UserWorkExperiencesService userWorkExperiencesService;
@Autowired
private IAppUserService appUserService;
/**
* 列表
*/
@ApiOperation("工作经历列表信息")
@PreAuthorize("@ss.hasPermi('management:match:details')")
@GetMapping("/list")
public TableDataInfo list(UserWorkExperiences userWorkExperiences){
startPage();
List<UserWorkExperiences> list=userWorkExperiencesService.getWorkExperiencesList(userWorkExperiences);
return getDataTable(list);
}
/**
* 信息
*/
/**
* 获取详细信息
*/
@ApiOperation("获取工作经历详细信息")
@PreAuthorize("@ss.hasPermi('management:match:query')")
@GetMapping(value = "/{id}")
public AjaxResult query(@PathVariable("id") Long id){
return success(userWorkExperiencesService.getWorkExperiencesById(id));
}
/**
* 保存
*/
@ApiOperation("新增工作经历")
@Log(title = "工作经历", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody UserWorkExperiences userWorkExperiences){
if(userWorkExperiences.getUserId()==null){
AppUser appUser=appUserService.selectAppuserByIdcard(RoleUtils.getCurrentUseridCard());
if(appUser==null){
return AjaxResult.error("未传递userId!");
}
userWorkExperiences.setUserId(appUser.getUserId());
}
return toAjax(userWorkExperiencesService.insertWorkExperiences(userWorkExperiences));
}
/**
* 修改
*/
@ApiOperation("修改工作经历")
@Log(title = "工作经历", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult update(@RequestBody UserWorkExperiences userWorkExperiences){
if (userWorkExperiences.getId()==null){
return AjaxResult.error("参数id未传递!");
}
return toAjax(userWorkExperiencesService.updateWorkExperiencesById(userWorkExperiences));
}
/**
* 删除
*/
@ApiOperation("删除工作经历")
@Log(title = "工作经历", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids){
if(ids.length==0){
return AjaxResult.error("参数ids未传递!");
}
return toAjax(userWorkExperiencesService.deleteWorkExperiencesIds(ids));
}
}

View File

@@ -0,0 +1,68 @@
package com.ruoyi.cms.controller.cms;
import cn.hutool.core.collection.CollUtil;
import com.ruoyi.cms.domain.WechatGroup;
import com.ruoyi.cms.domain.vo.WechatGroupVo;
import com.ruoyi.cms.service.IWechatGroupService;
import com.ruoyi.common.annotation.Anonymous;
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 org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.stream.Collectors;
@RestController
@RequestMapping("/cms/wechatGroup")
@Api(tags = "后台:转发对象管理")
public class WechatGroupController extends BaseController {
@Autowired
private IWechatGroupService wechatGroupService;
@ApiOperation("查询转发对象列表")
@PreAuthorize("@ss.hasPermi('application:group:list')")
@GetMapping("/list")
public TableDataInfo list(WechatGroup wechatGroup) {
startPage();
List<WechatGroupVo> list = wechatGroupService.selectWechatGroupList(wechatGroup);
return getDataTable(list);
}
@ApiOperation("新增转发对象")
@PreAuthorize("@ss.hasPermi('application:group:add')")
@PostMapping
public AjaxResult add(@RequestBody WechatGroup wechatGroup) {
return toAjax(wechatGroupService.save(wechatGroup));
}
@ApiOperation("修改转发对象")
@PreAuthorize("@ss.hasPermi('application:group:update')")
@PutMapping
public AjaxResult update(@RequestBody WechatGroup wechatGroup) {
return toAjax(wechatGroupService.updateById(wechatGroup));
}
@ApiOperation("删除转发对象")
@PreAuthorize("@ss.hasPermi('application:group:del')")
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable("ids") Long[] ids) {
return toAjax(wechatGroupService.removeBatchByIds(CollUtil.newArrayList(ids)));
}
@GetMapping("/enableList")
@Anonymous
public List<WechatGroupVo> enableList() {
WechatGroup wechatGroup = new WechatGroup();
wechatGroup.setIsPush(1);
return wechatGroupService.selectWechatGroupList(wechatGroup)
.stream().peek(e->e.setPhoneNumber(""))
.collect(Collectors.toList());
}
}

View File

@@ -0,0 +1,29 @@
package com.ruoyi.cms.cron;
import com.ruoyi.cms.mapper.JobMapper;
import com.ruoyi.cms.service.IBussinessOperLogService;
import com.ruoyi.cms.service.ICompanyService;
import com.ruoyi.cms.service.IESJobSearchService;
import com.ruoyi.cms.service.IJobService;
import com.ruoyi.common.utils.spring.SpringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
public class JobCron {
public void isHot(){
SpringUtils.getBean(JobMapper.class).isHot();
}
public void resetEs(){
SpringUtils.getBean(IESJobSearchService.class).resetTextCache();
}
//查看索引是否存在,如果不存在,就更新
public void checkEsAndFix(){
SpringUtils.getBean(IESJobSearchService.class).checkEsAndFix();
}
//更新公司的招聘数量
public void updateJobCountOfCompany(){
SpringUtils.getBean(ICompanyService.class).updateJobCountOfCompany();
}
}

View File

@@ -0,0 +1,42 @@
package com.ruoyi.cms.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.xss.Xss;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
@Data
@ApiModel("APP通知")
@TableName(value = "app_notice")
public class AppNotice extends BaseEntity
{
@TableField(exist = false)
private static final long serialVersionUID = 1L;
@TableId(value = "notice_id",type = IdType.AUTO)
@ApiModelProperty("公司id")
private Long noticeId;
@Xss(message = "消息标题不能包含脚本字符")
@NotBlank(message = "消息标题不能为空")
@Size(min = 0, max = 50, message = "消息标题不能超过50个字符")
private String noticeTitle;
@ApiModelProperty("消息类型")
private String noticeType;
@ApiModelProperty("消息内容")
private String noticeContent;
@ApiModelProperty("消息状态 0正常 1关闭")
private String status;
}

View File

@@ -0,0 +1,39 @@
package com.ruoyi.cms.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 用户岗位浏览记录对象 app_review_job
* @author ${author}
* @date 2025-02-14
*/
@Data
@ApiModel("用户岗位浏览记录")
@TableName(value = "app_review_job")
public class AppReviewJob extends BaseEntity
{
@TableField(exist = false)
private static final long serialVersionUID = 1L;
@TableId(value = "id",type = IdType.AUTO)
private Long id;
@ApiModelProperty("用户id")
private Long userId;
@ApiModelProperty("岗位id")
private Long jobId;
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "浏览日期", width = 30, dateFormat = "yyyy-MM-dd")
@ApiModelProperty("浏览日期")
private String reviewDate;
}

View File

@@ -0,0 +1,69 @@
package com.ruoyi.cms.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.annotation.Excel.ColumnType;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
@Data
@ApiModel("业务数据表")
@TableName(value = "bussiness_dict_data")
public class BussinessDictData extends BaseEntity
{
@TableField(exist = false)
private static final long serialVersionUID = 1L;
@ApiModelProperty("字典编码")
@Excel(name = "字典编码", cellType = ColumnType.NUMERIC)
@TableId(value = "dict_code",type = IdType.AUTO)
private Long dictCode;
@ApiModelProperty("字典排序")
@Excel(name = "字典排序", cellType = ColumnType.NUMERIC)
private Long dictSort;
@Excel(name = "字典标签")
@ApiModelProperty("字典标签")
@NotBlank(message = "字典标签不能为空")
@Size(min = 0, max = 100, message = "字典标签长度不能超过100个字符")
private String dictLabel;
@Excel(name = "字典键值")
@ApiModelProperty("字典键值")
@NotBlank(message = "字典键值不能为空")
@Size(min = 0, max = 100, message = "字典键值长度不能超过100个字符")
private String dictValue;
@ApiModelProperty("字典类型")
@Excel(name = "字典类型")
@NotBlank(message = "字典类型不能为空")
@Size(min = 0, max = 100, message = "字典类型长度不能超过100个字符")
private String dictType;
@ApiModelProperty("样式属性(其他样式扩展)")
@Size(min = 0, max = 100, message = "样式属性长度不能超过100个字符")
private String cssClass;
@ApiModelProperty("表格字典样式")
@Size(min = 0, max = 100, message = "样式属性长度不能超过100个字符")
private String listClass;
@ApiModelProperty("是否默认Y是 N否")
@Excel(name = "是否默认", readConverterExp = "Y=是,N=否")
private String isDefault;
@ApiModelProperty("状态 0=正常,1=停用 ")
@Excel(name = "状态", readConverterExp = "0=正常,1=停用")
private String status;
}

View File

@@ -0,0 +1,43 @@
package com.ruoyi.cms.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.annotation.Excel.ColumnType;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
@Data
@ApiModel("字典类型表")
@TableName(value = "bussiness_dict_type")
public class BussinessDictType extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 字典主键 */
@Excel(name = "字典主键", cellType = ColumnType.NUMERIC)
private Long dictId;
/** 字典名称 */
@Excel(name = "字典名称")
@NotBlank(message = "字典名称不能为空")
@Size(min = 0, max = 100, message = "字典类型名称长度不能超过100个字符")
private String dictName;
/** 字典类型 */
@Excel(name = "字典类型")
@NotBlank(message = "字典类型不能为空")
@Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符")
@Pattern(regexp = "^[a-z][a-z0-9_]*$", message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)")
private String dictType;
/** 状态0正常 1停用 */
@Excel(name = "状态", readConverterExp = "0=正常,1=停用")
private String status;
}

View File

@@ -0,0 +1,98 @@
package com.ruoyi.cms.domain;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import com.ruoyi.common.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* app操作日志记录对象 bussiness_oper_log
* @author ${author}
* @date 2024-11-13
*/
@Data
@ApiModel("app操作日志记录")
@TableName(value = "bussiness_oper_log")
public class BussinessOperLog extends BaseEntity
{
@TableField(exist = false)
private static final long serialVersionUID = 1L;
@TableId(value = "oper_id",type = IdType.AUTO)
@ApiModelProperty("日志主键")
private Long operId;
@Excel(name = "模块标题")
@ApiModelProperty("模块标题")
private String title;
@Excel(name = "业务类型", readConverterExp = "0=其它,1=新增,2=修改,3=删除")
@ApiModelProperty("业务类型0其它 1新增 2修改 3删除")
private Integer businessType;
@Excel(name = "方法名称")
@ApiModelProperty("方法名称")
private String method;
@Excel(name = "请求方式")
@ApiModelProperty("请求方式")
private String requestMethod;
@Excel(name = "操作类别", readConverterExp = "0=其它,1=后台用户,2=手机端用户")
@ApiModelProperty("操作类别0其它 1后台用户 2手机端用户")
private Integer operatorType;
@Excel(name = "操作人员")
@ApiModelProperty("操作人员")
private String operName;
@Excel(name = "部门名称")
@ApiModelProperty("部门名称")
private String deptName;
@Excel(name = "请求URL")
@ApiModelProperty("请求URL")
private String operUrl;
@Excel(name = "主机地址")
@ApiModelProperty("主机地址")
private String operIp;
@Excel(name = "操作地点")
@ApiModelProperty("操作地点")
private String operLocation;
@Excel(name = "请求参数")
@ApiModelProperty("请求参数")
private String operParam;
@Excel(name = "返回参数")
@ApiModelProperty("返回参数")
private String jsonResult;
@Excel(name = "操作状态", readConverterExp = "0=正常,1=异常")
@ApiModelProperty("操作状态0正常 1异常")
private Integer status;
@Excel(name = "错误消息")
@ApiModelProperty("错误消息")
private String errorMsg;
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "操作时间", width = 30, dateFormat = "yyyy-MM-dd")
@ApiModelProperty("操作时间")
private Date operTime;
@Excel(name = "消耗时间")
@ApiModelProperty("消耗时间")
private Long costTime;
@ApiModelProperty("业务类型数组")
private Integer[] businessTypes;
}

View File

@@ -0,0 +1,46 @@
package com.ruoyi.cms.domain;
import java.math.BigDecimal;
import lombok.Data;
import com.ruoyi.common.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* 商圈对象 commercial_area
* @author Lishundong
* @date 2024-11-12
*/
@Data
@ApiModel("商圈")
@TableName(value = "commercial_area")
public class CommercialArea extends BaseEntity
{
@TableField(exist = false)
private static final long serialVersionUID = 1L;
@TableId(value = "commercial_area_id",type = IdType.AUTO)
@ApiModelProperty("id")
private Long commercialAreaId;
@Excel(name = "商圈名称")
@ApiModelProperty("商圈名称")
private String commercialAreaName;
@Excel(name = "纬度")
@ApiModelProperty("纬度")
private BigDecimal latitude;
@Excel(name = "经度")
@ApiModelProperty("经度")
private BigDecimal longitude;
@Excel(name = "地址")
@ApiModelProperty("地址")
private String address;
}

View File

@@ -0,0 +1,33 @@
package com.ruoyi.cms.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 工作人员配置
*/
@TableName("community_user")
@EqualsAndHashCode(callSuper = true)
@Data
public class CommunityUser extends BaseEntity {
/**
* id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 微信名
*/
private String wechatName;
/**
* 手机号
*/
private String phoneNumber;
}

View File

@@ -0,0 +1,54 @@
package com.ruoyi.cms.domain;
import lombok.Data;
import com.ruoyi.common.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* 公司卡片对象 company_card
* @author ${author}
* @date 2025-02-18
*/
@Data
@ApiModel("公司卡片")
@TableName(value = "company_card")
public class CompanyCard extends BaseEntity
{
@TableField(exist = false)
private static final long serialVersionUID = 1L;
@TableId(value = "company_card_id",type = IdType.AUTO)
@ApiModelProperty("公司卡片id")
private Long companyCardId;
@Excel(name = "卡片名称")
@ApiModelProperty("卡片名称")
private String name;
@Excel(name = "标签,逗号分开")
@ApiModelProperty("标签,逗号分开")
private String targ;
@Excel(name = "企业性质")
@ApiModelProperty("企业性质,逗号分开")
private String companyNature;
@Excel(name = "背景色")
@ApiModelProperty("背景色")
private String backgroudColor;
@ApiModelProperty("状态 0未发布 1发布")
private Integer status;
@ApiModelProperty("排序")
private Integer cardOrder;
@ApiModelProperty("描述")
private String description;
}

View File

@@ -0,0 +1,37 @@
package com.ruoyi.cms.domain;
import lombok.Data;
import com.ruoyi.common.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* 公司卡片收藏对象 company_card_collection
* @author ${author}
* @date 2025-02-18
*/
@Data
@ApiModel("公司卡片收藏")
@TableName(value = "company_card_collection")
public class CompanyCardCollection extends BaseEntity
{
@TableField(exist = false)
private static final long serialVersionUID = 1L;
@TableId(value = "company_card_collection_id",type = IdType.AUTO)
@ApiModelProperty("公司id")
private Long companyCardCollectionId;
@Excel(name = "用户id")
@ApiModelProperty("用户id")
private Long userId;
@Excel(name = "公司卡片id")
@ApiModelProperty("公司卡片id")
private Long companyCardId;
}

View File

@@ -0,0 +1,37 @@
package com.ruoyi.cms.domain;
import lombok.Data;
import com.ruoyi.common.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* 用户公司收藏对象 company_collection
* @author lishundong
* @date 2024-09-04
*/
@Data
@ApiModel("用户公司收藏")
@TableName(value = "company_collection")
public class CompanyCollection extends BaseEntity
{
@TableField(exist = false)
private static final long serialVersionUID = 1L;
@TableId(value = "id",type = IdType.AUTO)
@ApiModelProperty("id")
private Long id;
@Excel(name = "公司id")
@ApiModelProperty("公司id")
private Long companyId;
@Excel(name = "App用户id")
@ApiModelProperty("App用户id")
private Long userId;
}

View File

@@ -0,0 +1,35 @@
package com.ruoyi.cms.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 公司标签对象 company_label
* @author ${author}
* @date 2025-02-18
*/
@Data
@ApiModel("公司标签")
@TableName(value = "company_label")
public class CompanyLabel extends BaseEntity
{
@TableField(exist = false)
private static final long serialVersionUID = 1L;
@TableId(value = "id",type = IdType.AUTO)
private Long id;
@ApiModelProperty("公司标签")
private String dictValue;
@ApiModelProperty("公司id")
private Long companyId;
}

View File

@@ -0,0 +1,159 @@
package com.ruoyi.cms.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.ruoyi.common.core.domain.entity.Company;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.dromara.easyes.annotation.IndexField;
import org.dromara.easyes.annotation.IndexId;
import org.dromara.easyes.annotation.IndexName;
import org.dromara.easyes.annotation.rely.Analyzer;
import org.dromara.easyes.annotation.rely.FieldType;
import org.dromara.easyes.annotation.rely.IdType;
import java.math.BigDecimal;
import java.util.Date;
/**
* 全文索引 ES数据模型
**/
@IndexName("job_document")
@Data
public class ESJobDocument
{
@ApiModelProperty("es中的唯一id")
@IndexId(type = IdType.NONE)
@JsonIgnore
private String id;
@ApiModelProperty("岗位id")
private Long jobId;
@ApiModelProperty("公告标题")
@IndexField(fieldType = FieldType.TEXT, analyzer = Analyzer.IK_SMART, searchAnalyzer = Analyzer.IK_MAX_WORD)
private String jobTitle;
@ApiModelProperty("内容")
@IndexField(fieldType = FieldType.TEXT, analyzer = Analyzer.IK_SMART, searchAnalyzer = Analyzer.IK_MAX_WORD)
private String description;
@ApiModelProperty("最小薪资(元)")
private Long minSalary;
@ApiModelProperty("最大薪资(元)")
private Long maxSalary;
@ApiModelProperty("学历要求 对应字典education")
private String education;
@ApiModelProperty("工作经验要求 对应字典experience")
private String experience;
@ApiModelProperty("用人单位名称")
private String companyName;
@ApiModelProperty("岗位区划")
private String jobLocation;
@ApiModelProperty("工作地点区县字典代码")
private Integer jobLocationAreaCode;
@JsonFormat(pattern = "yyyy-MM-dd")
@ApiModelProperty("发布时间")
private Date postingDate;
@ApiModelProperty("招聘人数")
private Long vacancies;
@ApiModelProperty("纬度")
private BigDecimal latitude;
@ApiModelProperty("经度")
private BigDecimal longitude;
@ApiModelProperty("浏览量")
private Long view;
@ApiModelProperty("公司id")
private Long companyId;
@ApiModelProperty("是否火")
private Integer isHot;
@ApiModelProperty("申请次数")
private Integer applyNum;
@JsonIgnore
@ApiModelProperty("公司")
private Company company;
@ApiModelProperty("是否申请 0为否 1为是")
private Integer isApply;
@ApiModelProperty("是否收藏 0为否 1为是")
private Integer isCollection;
@ApiModelProperty("数据来源")
private String dataSource;
@ApiModelProperty("岗位链接")
private String jobUrl;
@JsonIgnore
@IndexField(fieldType = FieldType.GEO_POINT)
@ApiModelProperty("经纬度")
private String latAndLon;
@JsonIgnore
@ApiModelProperty("公司规模")
private String scaleDictCode;
@ApiModelProperty("行业分类")
private String industry;
@ApiModelProperty("岗位分类")
private String jobCategory;
@JsonIgnore
@ApiModelProperty("学历要求 对应字典education int类型 es方便查询")
private Integer education_int;
@JsonIgnore
@ApiModelProperty("工作经验要求 对应字典experience int类型 es方便查询")
private Integer experience_int;
@ApiModelProperty("公司规模 int类型 es方便查询")
private Integer scale;
@ApiModelProperty("岗位链接 APP内")
private String appJobUrl;
@ApiModelProperty("公司性质")
private String companyNature;
@ApiModelProperty("是否有视频介绍")
private Integer isExplain;
@ApiModelProperty("视频介绍URL")
private String explainUrl;
@ApiModelProperty("视频封面URL")
private String cover;
@ApiModelProperty("岗位类型 0疆内 1疆外")
private String jobType;
@ApiModelProperty("类型 0常规岗位 1就业见习岗位 2实习实训岗位 3社区实践岗位 对应字段字典position_type")
private String type;
@ApiModelProperty("信用代码")
private String code;
@ApiModelProperty("工作地点")
private String jobAddress;
@ApiModelProperty("公司信息")
@IndexField(fieldType = FieldType.TEXT)
private String companyVoJson;
}

View File

@@ -0,0 +1,74 @@
package com.ruoyi.cms.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 新入职员工确认信息
*
* @author
* @email
* @date 2025-10-10 10:42:16
*/
@Data
@TableName("employee_confirm")
public class EmployeeConfirm extends BaseEntity {
@TableField(exist = false)
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@TableId(value = "id",type = IdType.AUTO)
@ApiModelProperty("id")
private Long id;
/**
* 企业id
*/
@ApiModelProperty("企业id")
private Long companyId;
/**
* 姓名
*/
@ApiModelProperty("姓名")
private String contactPerson;
/**
* 身份证
*/
@ApiModelProperty("身份证")
private String idCard;
/**
* 入职日期
*/
@ApiModelProperty("入职日期")
private String entryDate;
/**
* 联系电话
*/
@ApiModelProperty("联系电话")
private String contactPersonPhone;
/**
* 劳动合同期限
*/
@ApiModelProperty("劳动合同期限")
private String contractTerm;
@ApiModelProperty("工作id")
private Long jobId;
@ApiModelProperty("移动端用户id")
private Long userId;
/**
* 申请id
*/
@TableField(exist = false)
private Long applyId;
}

View File

@@ -0,0 +1,38 @@
package com.ruoyi.cms.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 用户岗位收藏对象 job_collection
* @author lishundong
* @date 2024-09-03
*/
@Data
@ApiModel("用户和招聘会收藏")
@TableName(value = "fair_collection")
public class FairCollection extends BaseEntity
{
@TableField(exist = false)
private static final long serialVersionUID = 1L;
@TableId(value = "id",type = IdType.AUTO)
@ApiModelProperty("id")
private Long id;
@Excel(name = "招聘会id")
@ApiModelProperty("招聘会id")
private Long fairId;
@Excel(name = "App用户id")
@ApiModelProperty("App用户id")
private Long userId;
}

View File

@@ -0,0 +1,37 @@
package com.ruoyi.cms.domain;
import lombok.Data;
import com.ruoyi.common.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* 公司招聘会关联对象 fair_company
* @author lishundong
* @date 2024-09-04
*/
@Data
@ApiModel("公司招聘会关联")
@TableName(value = "fair_company")
public class FairCompany extends BaseEntity
{
@TableField(exist = false)
private static final long serialVersionUID = 1L;
@TableId(value = "id",type = IdType.AUTO)
@ApiModelProperty("id")
private Long id;
@Excel(name = "公司id")
@ApiModelProperty("公司id")
private Long companyId;
@Excel(name = "招聘会id")
@ApiModelProperty("招聘会id")
private Long jobFairId;
}

View File

@@ -0,0 +1,195 @@
package com.ruoyi.cms.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.ruoyi.cms.domain.vo.CompanyVo;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.core.domain.entity.AppUser;
import com.ruoyi.common.core.domain.entity.Company;
import com.ruoyi.common.core.domain.entity.File;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* 岗位对象 job
* @author lishundong
* @date 2024-09-04
*/
@Data
@ApiModel("岗位")
@TableName(value = "job")
public class Job extends BaseEntity
{
@TableField(exist = false)
private static final long serialVersionUID = 1L;
@TableId(value = "job_id",type = IdType.AUTO)
@ApiModelProperty("工作id")
private Long jobId;
@Excel(name = "职位名称")
@ApiModelProperty("职位名称")
private String jobTitle;
@Excel(name = "最小薪资", readConverterExp = "元=")
@ApiModelProperty("最小薪资(元)")
private Long minSalary;
@Excel(name = "最大薪资", readConverterExp = "元=")
@ApiModelProperty("最大薪资(元)")
private Long maxSalary;
@Excel(name = "学历要求 对应字典education")
@ApiModelProperty("学历要求 对应字典education")
private String education;
@Excel(name = "工作经验要求 对应字典experience")
@ApiModelProperty("工作经验要求 对应字典experience")
private String experience;
@Excel(name = "用人单位名称")
@ApiModelProperty("用人单位名称")
private String companyName;
@Excel(name = "岗位区划")
@ApiModelProperty("岗位区划")
private String jobLocation;
@ApiModelProperty("工作地点区县字典代码")
private Integer jobLocationAreaCode;
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "发布时间", width = 30, dateFormat = "yyyy-MM-dd")
@ApiModelProperty("发布时间")
private String postingDate;
@Excel(name = "招聘人数")
@ApiModelProperty("招聘人数")
private Long vacancies;
@Excel(name = "纬度")
@ApiModelProperty("纬度")
private BigDecimal latitude;
@Excel(name = "经度")
@ApiModelProperty("经度")
private BigDecimal longitude;
@Excel(name = "浏览量")
@ApiModelProperty("浏览量")
@TableField("\"view\"")
private Long view;
@Excel(name = "公司id")
@ApiModelProperty("公司id")
private Long companyId;
@ApiModelProperty("是否火")
private Integer isHot;
@ApiModelProperty("申请次数")
@JsonIgnore
private Integer applyNum;
@TableField(exist = false)
@ApiModelProperty("公司信息")
private Company company;
@TableField(exist = false)
@ApiModelProperty("是否申请 0为否 1为是")
private Integer isApply;
@TableField(exist = false)
@ApiModelProperty("是否收藏 0为否 1为是")
private Integer isCollection;
@ApiModelProperty("岗位描述")
private String description;
@ApiModelProperty("是否发布 0未发布 1发布")
private Integer isPublish;
@ApiModelProperty("数据来源")
private String dataSource;
@ApiModelProperty("岗位链接")
private String jobUrl;
@ApiModelProperty("jobRow对应id")
private Long rowId;
@TableField(exist = false)
@ApiModelProperty("公司规模")
private String scale;
@TableField(exist = false)
@ApiModelProperty("行业分类")
private String industry;
@ApiModelProperty("岗位分类")
private String jobCategory;
@TableField(exist = false)
@ApiModelProperty("公司性质")
private String companyNature;
@TableField(exist = false)
@ApiModelProperty("申请时间")
private String applyTime;
@ApiModelProperty("是否有视频介绍")
private Integer isExplain;
@ApiModelProperty("视频介绍URL")
private String explainUrl;
@ApiModelProperty("视频封面URL")
private String cover;
@TableField(exist = false)
@ApiModelProperty("薪酬")
private String compensation;
@TableField(exist = false)
@ApiModelProperty("信用代码")
private String code;
@ApiModelProperty("岗位类型 0疆内 1疆外")
private String jobType;
@ApiModelProperty("类型 0常规岗位 1就业见习岗位 2实习实训岗位 3社区实践岗位 4零工 对应字段字典position_type")
private String type;
@ApiModelProperty("工作地点")
private String jobAddress;
@TableField(exist = false)
@ApiModelProperty("岗位联系人列表")
private List<JobContact> jobContactList;
@TableField(exist = false)
@ApiModelProperty("附件列表")
private List<File> filesList;
@TableField(exist = false)
@ApiModelProperty("公司信息")
private CompanyVo companyVo;
@TableField(exist = false)
@JsonFormat(pattern = "yyyy-MM-dd")
@ApiModelProperty("时间(足迹、投简历、收藏)")
private String shareTime;
@TableField(exist = false)
@ApiModelProperty("申请人列表")
private List<AppUser> applyUsers;
}

View File

@@ -0,0 +1,50 @@
package com.ruoyi.cms.domain;
import lombok.Data;
import com.ruoyi.common.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* 岗位申请对象 job_apply
* @author lishundong
* @date 2024-09-04
*/
@Data
@ApiModel("岗位申请")
@TableName(value = "job_apply")
public class JobApply extends BaseEntity
{
@TableField(exist = false)
private static final long serialVersionUID = 1L;
@TableId(value = "id",type = IdType.AUTO)
@ApiModelProperty("id")
private Long id;
@Excel(name = "岗位id")
@ApiModelProperty("岗位id")
private Long jobId;
@Excel(name = "App用户id")
@ApiModelProperty("App用户id")
private Long userId;
@Excel(name = "匹配度")
@ApiModelProperty("匹配度")
private Long matchingDegree;
@ApiModelProperty("是否录用 0录用 2或null未录用")
private String hire;
@ApiModelProperty("录用来源 0本系统 1招聘会")
private String hireSource;
@TableField(exist = false)
@ApiModelProperty("身份证,招聘传递")
private String idCard;
}

View File

@@ -0,0 +1,38 @@
package com.ruoyi.cms.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 用户岗位收藏对象 job_collection
* @author lishundong
* @date 2024-09-03
*/
@Data
@ApiModel("用户岗位收藏")
@TableName(value = "job_collection")
public class JobCollection extends BaseEntity
{
@TableField(exist = false)
private static final long serialVersionUID = 1L;
@TableId(value = "id",type = IdType.AUTO)
@ApiModelProperty("id")
private Long id;
@Excel(name = "岗位id")
@ApiModelProperty("岗位id")
private Long jobId;
@Excel(name = "App用户id")
@ApiModelProperty("App用户id")
private Long userId;
}

View File

@@ -0,0 +1,53 @@
package com.ruoyi.cms.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 岗位联系人
*
* @author
* @email
* @date 2025-09-30 15:57:06
*/
@Data
@ApiModel("岗位联系人")
@TableName("job_contact")
public class JobContact extends BaseEntity {
@TableField(exist = false)
private static final long serialVersionUID = 1L;
/**
* id
*/
@TableId(value = "id",type = IdType.AUTO)
@ApiModelProperty("id")
private Long id;
/**
* 岗位id
*/
@ApiModelProperty("岗位id")
private Long jobId;
/**
* 联系人
*/
@ApiModelProperty("联系人")
private String contactPerson;
/**
* 联系人电话
*/
@ApiModelProperty("联系人电话")
private String contactPersonPhone;
/**
* 职务
*/
@ApiModelProperty("职务")
private String position;
}

View File

@@ -0,0 +1,83 @@
package com.ruoyi.cms.domain;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.domain.entity.Company;
import lombok.Data;
import com.ruoyi.common.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* 招聘会信息对象 job_fair
* @author lishundong
* @date 2024-09-04
*/
@Data
@ApiModel("招聘会信息")
@TableName(value = "job_fair")
public class JobFair extends BaseEntity
{
@TableField(exist = false)
private static final long serialVersionUID = 1L;
@TableId(value = "job_fair_id",type = IdType.AUTO)
@ApiModelProperty("招聘会id")
private Long jobFairId;
@Excel(name = "招聘会名称")
@ApiModelProperty("招聘会名称")
private String name;
@Excel(name = "招聘会类型 对应字典 job_fair_type")
@ApiModelProperty("招聘会类型 对应字典 job_fair_type")
private String jobFairType;
@Excel(name = "地点")
@ApiModelProperty("地点")
private String location;
@Excel(name = "纬度")
@ApiModelProperty("纬度")
private BigDecimal latitude;
@Excel(name = "经度")
@ApiModelProperty("经度")
private BigDecimal longitude;
@ApiModelProperty("描述")
private String description;
@ApiModelProperty("地点")
private String address;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "招聘会开始时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty("招聘会开始时间")
private Date startTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "招聘会结束时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty("招聘会结束时间")
private Date endTime;
@TableField(exist = false)
@ApiModelProperty("公司列表")
private List<Company> companyList;
@TableField(exist = false)
@JsonFormat(pattern = "yyyy-MM-dd")
@ApiModelProperty("程序时间")
private Date queryDate;
@TableField(exist = false)
@ApiModelProperty("是否收藏")
private Integer isCollection;
}

View File

@@ -0,0 +1,38 @@
package com.ruoyi.cms.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 用户岗位收藏对象 job_collection
* @author lishundong
* @date 2024-09-03
*/
@Data
@ApiModel("用户岗位收藏")
@TableName(value = "job_recommend")
public class JobRecomment extends BaseEntity
{
@TableField(exist = false)
private static final long serialVersionUID = 1L;
@TableId(value = "id",type = IdType.AUTO)
@ApiModelProperty("id")
private Long id;
@Excel(name = "岗位id")
@ApiModelProperty("岗位id")
private Long jobId;
@Excel(name = "App用户id")
@ApiModelProperty("App用户id")
private Long userId;
}

View File

@@ -0,0 +1,51 @@
package com.ruoyi.cms.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
@Data
@TableName(value = "notice")
public class Notice extends BaseEntity
{
@TableField(exist = false)
private static final long serialVersionUID = 1L;
@TableId(value = "notice_id",type = IdType.AUTO)
private Long noticeId;
@ApiModelProperty("标题")
private String title;
@ApiModelProperty("副标题")
private String subTitle;
@ApiModelProperty("未读数量")
private Integer notReadCount;
@ApiModelProperty("是否阅读 0未读 1已读")
private String isRead;
@JsonFormat(pattern = "MM-dd")
@ApiModelProperty("日期")
private Date date;
@ApiModelProperty("通知类型 1系统通知(包括录用) 2职位上新")
private String noticeType;
@ApiModelProperty("公告内容")
private String noticeContent;
@ApiModelProperty("用户id")
private Long userId;
@ApiModelProperty("业务id")
private Long bussinessId;
}

View File

@@ -0,0 +1,62 @@
package com.ruoyi.cms.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
@Data
@TableName(value = "row_work")
public class RowWork {
private String Id;
private String TaskId;
private String TaskName;
private String Std_class;
private String JobCategory;
private String SF;
private String ZCMC;
private String Aca112;
private String Acb22a;
private String Aac011;
private String Acb240;
private String Recruit_Num;
private String Acb202;
private String Aab302;
private String Acb241;
private String Salary;
private String SalaryLow;
private String SalaryHight;
private Date Aae397;
private String AAB004;
private String AAB022;
private String AAB019;
private String AAE006;
private String AAB092;
private String ORG;
private String ACE760;
private String AAE004;
private String AAE005;
private String Num_employers;
private String Experience;
private String Highlight;
private String Minimum_age;
private String Maximum_age;
private String Sex;
private String IndustryType;
private String IndustrySub;
private String AAB019_OK;
private String Aac011_OK;
private String Experience_OK;
private String Num_OK;
private Date Collect_time;
private String ClearFlag;
private String Province;
private String City;
private String County;
private String importdate;
private String YearMonth;
private String IsRepeat;
private String latitude;
private String longitude;
}

View File

@@ -0,0 +1,45 @@
package com.ruoyi.cms.domain;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 敏感词库
*
* @author
* @email
* @date 2025-10-10 10:42:16
*/
@Data
@TableName("sensitive_word_data")
public class SensitiveWordData extends BaseEntity {
@TableField(exist = false)
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@TableId(value = "id",type = IdType.AUTO)
@ApiModelProperty("id")
private Long id;
/**
* 敏感词
*/
@ExcelProperty(value = "敏感词", index = 0)
@ApiModelProperty("敏感词")
private String sensitiveWord;
/**
* 类型
*/
@ExcelProperty(value = "类型", index = 1)
@ApiModelProperty("类型")
private String type;
}

View File

@@ -0,0 +1,33 @@
package com.ruoyi.cms.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 文件对象 file
* @author ${author}
* @date 2025-03-18
*/
@Data
@TableName(value = "statics")
public class Statics extends BaseEntity
{
@TableField(exist = false)
private static final long serialVersionUID = 1L;
/** id */
@TableId(value = "id",type = IdType.AUTO)
private Long id;
@ApiModelProperty("时间")
private String time;
@ApiModelProperty("类型")
private String type;
@ApiModelProperty("名称")
private String name;
@ApiModelProperty("数据")
private String data;
}

View File

@@ -0,0 +1,39 @@
package com.ruoyi.cms.domain;
import lombok.Data;
import com.ruoyi.common.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.domain.BaseEntity;
import java.util.List;
/**
* 地铁线路对象 subway_line
* @author Lishundong
* @date 2024-11-12
*/
@Data
@ApiModel("地铁线路")
@TableName(value = "subway_line")
public class SubwayLine extends BaseEntity
{
@TableField(exist = false)
private static final long serialVersionUID = 1L;
@TableId(value = "line_id",type = IdType.AUTO)
@ApiModelProperty("id")
private Long lineId;
@Excel(name = "线路名称")
@ApiModelProperty("线路名称")
private String lineName;
@TableField(exist = false)
@ApiModelProperty("站点列表")
private List<SubwayStation> subwayStationList;
}

View File

@@ -0,0 +1,56 @@
package com.ruoyi.cms.domain;
import java.math.BigDecimal;
import lombok.Data;
import com.ruoyi.common.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* 地铁站点对象 subway_station
* @author Lishundong
* @date 2024-11-12
*/
@Data
@ApiModel("地铁站点")
@TableName(value = "subway_station")
public class SubwayStation extends BaseEntity
{
@TableField(exist = false)
private static final long serialVersionUID = 1L;
@TableId(value = "station_id",type = IdType.AUTO)
@ApiModelProperty("id")
private Long stationId;
@Excel(name = "地铁名称")
@ApiModelProperty("地铁名称")
private String stationName;
@Excel(name = "所属线路名称")
@ApiModelProperty("所属线路名称")
private String lineName;
@Excel(name = "线路id")
@ApiModelProperty("线路id")
private Long lineId;
@Excel(name = "纬度")
@ApiModelProperty("纬度")
private BigDecimal latitude;
@Excel(name = "经度")
@ApiModelProperty("经度")
private BigDecimal longitude;
@ApiModelProperty("排序")
private Integer stationOrder;
@ApiModelProperty("地址")
private String address;
}

View File

@@ -0,0 +1,21 @@
package com.ruoyi.cms.domain;
import lombok.Data;
@Data
public class VectorJob {
private String jobTitle; // Aca112
private String jobId; // id
private String scale; // Num_employers
private String education; // Aac011_OK
private String nature; // AAB019_OK
private String experience; // Experience_OK
private String salary; // Acb241
private String companyName; // aab004
private String area; // Aab302
private String jobLocation; // acb202
private String description; // Acb22a
private String jobUrl; // ACE760
private String minSalary;
private String maxSalary;
}

View File

@@ -0,0 +1,39 @@
package com.ruoyi.cms.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 转发对象配置
*/
@TableName("wechat_group")
@EqualsAndHashCode(callSuper = true)
@Data
public class WechatGroup extends BaseEntity {
/**
* id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 群聊名称
*/
private String name;
/**
* 工作人员 ID
*/
private Long communityId;
/**
* 是否启用 0=禁用 1=启用
*/
private Integer isPush;
}

View File

@@ -0,0 +1,37 @@
package com.ruoyi.cms.domain.ai;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
@Data
@ApiModel("ai聊天详情")
@TableName("AI_CHAT_DETAIL")
public class AiChatDetail {
@TableField(exist = false)
private static final long serialVersionUID = 1L;
@TableId(value = "id",type = IdType.AUTO)
@ApiModelProperty("id")
private Long id;
@ApiModelProperty("会话id")
private String chatId;
@ApiModelProperty("数据id")
private String dataId;
@ApiModelProperty("会话类型Human用户AI大模型")
private String obj;
@ApiModelProperty("会话内容")
private String content;
@ApiModelProperty("会话时间")
private Date time;
@ApiModelProperty("耗时")
private Double durationSeconds;
}

View File

@@ -0,0 +1,53 @@
package com.ruoyi.cms.domain.ai;
import com.alibaba.fastjson2.annotation.JSONField;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
@ApiModel("ai聊天历史记录")
@TableName("AI_CHAT_HISTORY")
public class AiChatHistory{
@TableField(exist = false)
private static final long serialVersionUID = 1L;
@TableId(value = "id",type = IdType.AUTO)
@ApiModelProperty("id")
private Long id;
@ApiModelProperty("用户id")
private Long userId;
@JSONField(name = "chatId")
@ApiModelProperty("会话id")
private String chatId;
@ApiModelProperty("应用id")
private String appId;
@JSONField(name = "title")
@ApiModelProperty("第一次的问题")
private String title;
@JSONField(name = "updateTime")
@ApiModelProperty("会话时间")
private Date updateTime;
@ApiModelProperty("是否删除")
private String delFlag;
@TableField(exist = false)
private List<String> answerStringList;
@TableField(exist = false)
private double durationSeconds;
@TableField(exist = false)
private String customTitle;
@TableField(exist = false)
private String dataId;
@TableField(exist = false)
private boolean top=false;
}

View File

@@ -0,0 +1,17 @@
package com.ruoyi.cms.domain.chat;
import com.alibaba.fastjson2.JSONArray;
import lombok.Data;
import java.util.List;
@Data
public class ChatRequest {
private String data;
private String dataId;
private String sessionId;
private long userId;
private List<String> fileUrl;
private JSONArray messages;
}

View File

@@ -0,0 +1,58 @@
package com.ruoyi.cms.domain.query;
import com.ruoyi.cms.domain.Job;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* 前端搜索对象
*
* @author ruoyi
*/
@Data
public class ESJobSearch extends Job
{
/** 搜索值 */
private String searchValue;
/** 当前记录起始索引 */
private Integer current;
/** 每页显示记录数 */
private Integer pageSize;
private String sessionId;
private String radius;
@ApiModelProperty("排序方式 0推荐 1最热 2最新发布 3最大薪资")
private Integer order;
//商圈id
private List<Long> commercialAreaIds;
//区县id
private List<String> countyIds;
//地铁id
private List<Integer> subwayIds;
/** 纬度 */
private BigDecimal latitude;
/** 经度 */
private BigDecimal longitude;
//是否发布 0未发布 1发布
private Integer isPublish;
private String salaryDictCode;
private String scaleDictCode;
private String area;
/*** 用户角色app角色0企业1求职者2网格员 3内部政府人员*/
private String userType;
}

View File

@@ -0,0 +1,9 @@
package com.ruoyi.cms.domain.query;
import lombok.Data;
@Data
public class LabelQuery {
private Long cardId;
private String companyName;
}

View File

@@ -0,0 +1,19 @@
package com.ruoyi.cms.domain.query;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.cms.domain.Job;
import com.ruoyi.common.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
@Data
public class MineJobQuery extends Job {
@JsonFormat(pattern = "yyyy-MM-dd")
@ApiModelProperty("发布时间")
private String startDate;
@JsonFormat(pattern = "yyyy-MM-dd")
@ApiModelProperty("发布时间")
private String endDate;
}

View File

@@ -0,0 +1,198 @@
package com.ruoyi.cms.domain.query;
import lombok.Data;
import java.time.Year;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@Data
public class Staticsquery {
//月/季度/年
private String timeDimension;
//岗位发布数量 招聘增长率
private String type;
private String startTime;
private String endTime;
public List<String> generateTimeRange() {
switch (timeDimension) {
case "":
return generateMonthRange();
case "季度":
return generateQuarterRange();
case "":
return generateYearRange();
default:
throw new IllegalArgumentException("Invalid time dimension: " + timeDimension);
}
}
private List<String> generateMonthRange() {
List<String> months = new ArrayList<>();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");
try {
YearMonth start = YearMonth.parse(startTime, formatter);
YearMonth end = YearMonth.parse(endTime, formatter);
if (start.isAfter(end)) {
YearMonth temp = start;
start = end;
end = temp;
}
YearMonth current = end;
while (!current.isBefore(start)) {
months.add(current.format(formatter));
current = current.minusMonths(1);
}
if (!start.isAfter(end)) {
Collections.reverse(months);
}
} catch (DateTimeParseException e) {
throw new IllegalArgumentException("Invalid month format. Please use yyyy-MM format.");
}
return months;
}
private List<String> generateQuarterRange() {
List<String> quarters = new ArrayList<>();
try {
Quarter start = Quarter.parse(startTime);
Quarter end = Quarter.parse(endTime);
if (start.isAfter(end)) {
Quarter temp = start;
start = end;
end = temp;
}
Quarter current = end;
while (!current.isBefore(start)) {
quarters.add(current.toString());
current = current.previous();
}
if (!start.isAfter(end)) {
Collections.reverse(quarters);
}
} catch (IllegalArgumentException e) {
throw new IllegalArgumentException("Invalid quarter format. Please use yyyy-第x季度 format (e.g. 2024-第一季度).");
}
return quarters;
}
private List<String> generateYearRange() {
List<String> years = new ArrayList<>();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy");
try {
Year start = Year.parse(startTime, formatter);
Year end = Year.parse(endTime, formatter);
if (start.isAfter(end)) {
Year temp = start;
start = end;
end = temp;
}
Year current = end;
while (!current.isBefore(start)) {
years.add(current.format(formatter));
current = current.minusYears(1);
}
if (!start.isAfter(end)) {
Collections.reverse(years);
}
} catch (DateTimeParseException e) {
throw new IllegalArgumentException("Invalid year format. Please use yyyy format.");
}
return years;
}
// Helper class for quarter handling with Chinese characters
private static class Quarter implements Comparable<Quarter> {
private final int year;
private final int quarter;
private static final String[] CHINESE_QUARTERS = {"第一季度", "第二季度", "第三季度", "第四季度"};
private Quarter(int year, int quarter) {
if (quarter < 1 || quarter > 4) {
throw new IllegalArgumentException("Quarter must be between 1 and 4");
}
this.year = year;
this.quarter = quarter;
}
public static Quarter parse(String quarterStr) {
String[] parts = quarterStr.split("-");
if (parts.length != 2 || !parts[1].startsWith("") || !parts[1].endsWith("季度")) {
throw new IllegalArgumentException("Invalid quarter format");
}
int year = Integer.parseInt(parts[0]);
String quarterStrPart = parts[1];
// Find which quarter this matches
int quarter = -1;
for (int i = 0; i < CHINESE_QUARTERS.length; i++) {
if (CHINESE_QUARTERS[i].equals(quarterStrPart)) {
quarter = i + 1;
break;
}
}
if (quarter == -1) {
throw new IllegalArgumentException("Invalid quarter name: " + quarterStrPart);
}
return new Quarter(year, quarter);
}
public Quarter previous() {
if (quarter == 1) {
return new Quarter(year - 1, 4);
} else {
return new Quarter(year, quarter - 1);
}
}
public boolean isBefore(Quarter other) {
if (this.year < other.year) return true;
if (this.year > other.year) return false;
return this.quarter < other.quarter;
}
public boolean isAfter(Quarter other) {
return other.isBefore(this);
}
@Override
public String toString() {
return year + "-" + CHINESE_QUARTERS[quarter - 1];
}
@Override
public int compareTo(Quarter other) {
if (this.year != other.year) {
return Integer.compare(this.year, other.year);
}
return Integer.compare(this.quarter, other.quarter);
}
}
}

View File

@@ -0,0 +1,17 @@
package com.ruoyi.cms.domain.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
@Data
public class AppNoticeVO {
private Long id;
private String title;
private String subTitle;
private Integer notReadCount;
private Integer isRead;
@JsonFormat(pattern = "MM-dd")
private Date date;
}

View File

@@ -0,0 +1,17 @@
package com.ruoyi.cms.domain.vo;
import com.ruoyi.common.core.domain.entity.AppSkill;
import lombok.Data;
@Data
public class AppSkillVo extends AppSkill {
/**
* 技能名称
*/
private String nameStr;
/**
* 技能等级
*/
private String levelStr;
}

View File

@@ -0,0 +1,22 @@
package com.ruoyi.cms.domain.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* 用户注册对象
*
* @author ruoyi
*/
@Data
public class AppUserLky
{
@ApiModelProperty("技能列表")
private List<AppSkillVo> appSkillsList;
@ApiModelProperty("当前职位名称")
private List<String> jobTitles;
}

View File

@@ -0,0 +1,21 @@
package com.ruoyi.cms.domain.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.entity.AppUser;
import lombok.Data;
import java.util.Date;
@Data
public class CandidateVO extends AppUser {
@JsonFormat(pattern = "yyyy-MM-dd")
private Date applyDate;
private Integer matchingDegree;
private String applyId;
@Excel(name = "公司名称", sort = 0)
private String companyName;
@Excel(name = "岗位名称", sort = 1)
private String jobName;
}

View File

@@ -0,0 +1,9 @@
package com.ruoyi.cms.domain.vo;
import com.ruoyi.cms.domain.CompanyCard;
import lombok.Data;
@Data
public class CompanyCardVO extends CompanyCard {
private Integer isCollection = 0;
}

View File

@@ -0,0 +1,12 @@
package com.ruoyi.cms.domain.vo;
import com.ruoyi.common.core.domain.entity.CompanyContact;
import lombok.Data;
import java.util.List;
@Data
public class CompanyContactVo {
private List<CompanyContact> companyContactList;
}

View File

@@ -0,0 +1,34 @@
package com.ruoyi.cms.domain.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.entity.CompanyContact;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* 公司对象 company
* @author lishundong
* @date 2024-09-04
*/
@Data
public class CompanyVo implements Serializable
{
@ApiModelProperty("公司id")
private Long companyId;
@Excel(name = "单位名称")
@ApiModelProperty("单位名称")
private String name;
@TableField(exist = false)
@ApiModelProperty("公司描述")
private String companyDescription;
@TableField(exist = false)
@ApiModelProperty("企业联系人列表")
private List<CompanyContact> companyContactList;
}

View File

@@ -0,0 +1,12 @@
package com.ruoyi.cms.domain.vo;
import lombok.Data;
@Data
public class CompetitivenessResponse {
private Integer totalApplicants; // 总申请人数
private Integer matchScore; // 匹配分数(0-100)
private Integer rank; // 排名
private Integer percentile; // 超过百分比(0-100)
private RadarChart radarChart; // 雷达图6维度数据
}

View File

@@ -0,0 +1,11 @@
package com.ruoyi.cms.domain.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.cms.domain.Job;
import java.util.Date;
public class JobApplyVO extends Job {
@JsonFormat(pattern = "yyyy-MM-dd")
private Date applyDate;
}

View File

@@ -0,0 +1,11 @@
package com.ruoyi.cms.domain.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.cms.domain.Job;
import java.util.Date;
public class JobCollectionVO extends Job {
@JsonFormat(pattern = "yyyy-MM-dd")
private Date collectionDate;
}

View File

@@ -0,0 +1,11 @@
package com.ruoyi.cms.domain.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.cms.domain.Job;
import java.util.Date;
public class JobReviewVO extends Job {
@JsonFormat(pattern = "yyyy-MM-dd")
private Date reviewDate;
}

View File

@@ -0,0 +1,18 @@
package com.ruoyi.cms.domain.vo;
import lombok.Data;
/**
* 消息条数
*/
@Data
public class NoticeTotal {
/**
* 未读消息
*/
private Integer qbxx;
/**
* 全部未读
*/
private Integer wdxx;
}

View File

@@ -0,0 +1,13 @@
package com.ruoyi.cms.domain.vo;
import lombok.Data;
@Data
public class RadarChart {
private Integer skill; // 技能(0-100)
private Integer experience; // 工作经验(0-100)
private Integer education; // 学历(0-100)
private Integer salary; // 薪资(0-100)
private Integer age; // 年龄(0-100)
private Integer location; // 工作地(0-100)
}

View File

@@ -0,0 +1,10 @@
package com.ruoyi.cms.domain.vo;
import lombok.Data;
@Data
public class WechatAuthVO {
private String openid;
private String unionid;
private String sessionKey;
}

View File

@@ -0,0 +1,20 @@
package com.ruoyi.cms.domain.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
@Data
public class WechatGroupVo {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
private Long id;
private String name;
private Integer isPush;
private String wechatNumber;
private String phoneNumber;
private String wechatName;
private Long communityId;
}

View File

@@ -0,0 +1,138 @@
package com.ruoyi.cms.handler;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class AliyunNlsTokenUtil {
private static final Logger logger = LoggerFactory.getLogger(AliyunNlsTokenUtil.class);
// Nginx 代理配置(与 Nginx 一致)
private static final String PROXY_HOST = "192.168.2.102";
private static final int PROXY_PORT = 10044;
// Token 接口代理地址(通过 Nginx 转发)
private static final String TOKEN_PROXY_URL = "http://" + PROXY_HOST + ":" + PROXY_PORT + "/";
// 单例 OkHttp 客户端(带代理,全局复用)
private static OkHttpClient proxyOkHttpClient;
static {
// 初始化带代理的 OkHttp 客户端(仅初始化一次)
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(PROXY_HOST, PROXY_PORT));
proxyOkHttpClient = new OkHttpClient.Builder()
.proxy(proxy)
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.retryOnConnectionFailure(true)
.build();
}
/**
* 手动生成 Token绕开 SDK 无代理逻辑)
* @param accessKeyId 阿里云 AccessKeyId
* @param accessKeySecret 阿里云 AccessKeySecret
* @param accessToken SDK 的 AccessToken 对象(用于设置 token 和 expireTime
*/
public static void generateToken(String accessKeyId, String accessKeySecret, com.alibaba.nls.client.AccessToken accessToken) throws Exception {
// 1. 生成阿里云 API 签名HMAC-SHA1
String timestamp = getIso8601UtcTimestamp();
String nonce = String.valueOf(System.currentTimeMillis());
String signature = generateSignature(accessKeyId, accessKeySecret, timestamp, nonce);
// 2. 构造请求 URL带签名参数
String requestUrl = TOKEN_PROXY_URL +
"?Action=CreateToken" +
"&Format=JSON" +
"&Version=2019-02-28" +
"&AccessKeyId=" + URLEncoder.encode(accessKeyId, "UTF-8") +
"&Timestamp=" + URLEncoder.encode(timestamp, "UTF-8") +
"&SignatureNonce=" + URLEncoder.encode(nonce, "UTF-8") +
"&Signature=" + URLEncoder.encode(signature, "UTF-8") +
"&SignatureMethod=HMAC-SHA1" +
"&SignatureVersion=1.0";
// 打印完整请求 URL用于排查参数问题
logger.info("Token 生成请求 URL{}", requestUrl);
// 3. 发送 GET 请求(走 Nginx 代理)
Request request = new Request.Builder().url(requestUrl).build();
try (Response response = proxyOkHttpClient.newCall(request).execute()) {
String responseBody = response.body() != null ? response.body().string() : "无响应内容";
logger.info("Token 接口响应 - 状态码:{},响应体:{}", response.code(), responseBody);
if (!response.isSuccessful()) {
throw new RuntimeException("Token 生成失败,状态码:" + response.code() + ",错误信息:" + responseBody);
}
com.alibaba.fastjson.JSONObject json = com.alibaba.fastjson.JSON.parseObject(responseBody);
// 4. 提取 Token 和过期时间
String token = json.getJSONObject("Token").getString("Id");
long expireTime = json.getJSONObject("Token").getLong("ExpireTime");
// 5. 反射设置到 SDK 的 AccessToken 对象
setAccessTokenField(accessToken, "token", token);
setAccessTokenField(accessToken, "expireTime", expireTime);
logger.info("Token 生成成功,过期时间:{}", expireTime);
}
}
/**
* 生成阿里云 API 签名(遵循阿里云规范)
*/
private static String generateSignature(String accessKeyId, String accessKeySecret, String timestamp, String nonce) throws Exception {
// 1. 按字典序拼接参数(必须严格排序)
StringBuilder paramBuilder = new StringBuilder();
paramBuilder.append("AccessKeyId=").append(URLEncoder.encode(accessKeyId, "UTF-8"))
.append("&Action=").append(URLEncoder.encode("CreateToken", "UTF-8"))
.append("&Format=").append(URLEncoder.encode("JSON", "UTF-8"))
.append("&SignatureMethod=").append(URLEncoder.encode("HMAC-SHA1", "UTF-8"))
.append("&SignatureNonce=").append(URLEncoder.encode(nonce, "UTF-8"))
.append("&SignatureVersion=").append(URLEncoder.encode("1.0", "UTF-8"))
.append("&Timestamp=").append(URLEncoder.encode(timestamp, "UTF-8"))
.append("&Version=").append(URLEncoder.encode("2019-02-28", "UTF-8"));
// 2. 构造签名原文Method + & + 编码后的URL + & + 编码后的参数)
String method = "GET";
String encodedUrl = URLEncoder.encode("/", "UTF-8"); // 根路径编码
String encodedParams = URLEncoder.encode(paramBuilder.toString(), "UTF-8");
String signatureText = method + "&" + encodedUrl + "&" + encodedParams;
// 调试日志:对比服务器端预期的签名原文
logger.info("本地计算的签名原文:{}", signatureText);
// 3. HMAC-SHA1 加密 + Base64 编码
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(new SecretKeySpec((accessKeySecret + "&").getBytes("UTF-8"), "HmacSHA1"));
byte[] signatureBytes = mac.doFinal(signatureText.getBytes("UTF-8"));
return Base64.getEncoder().encodeToString(signatureBytes);
}
/**
* 生成 ISO8601 格式的 UTC 时间戳2025-11-24T10:00:00Z
*/
private static String getIso8601UtcTimestamp() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("UTC")); // 强制使用 UTC 时区
return sdf.format(new Date());
}
/**
* 反射设置 AccessToken 的私有字段
*/
private static void setAccessTokenField(com.alibaba.nls.client.AccessToken accessToken, String fieldName, Object value) throws Exception {
java.lang.reflect.Field field = com.alibaba.nls.client.AccessToken.class.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(accessToken, value);
}
}

View File

@@ -0,0 +1,143 @@
//package com.ruoyi.cms.handler;
//import java.io.File;
//import java.io.FileOutputStream;
//import java.io.IOException;
//import java.nio.ByteBuffer;
//
//import com.alibaba.nls.client.AccessToken;
//import com.alibaba.nls.client.protocol.NlsClient;
//import com.alibaba.nls.client.protocol.OutputFormatEnum;
//import com.alibaba.nls.client.protocol.SampleRateEnum;
//import com.alibaba.nls.client.protocol.tts.SpeechSynthesizer;
//import com.alibaba.nls.client.protocol.tts.SpeechSynthesizerListener;
//import com.alibaba.nls.client.protocol.tts.SpeechSynthesizerResponse;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
///**
// * 此示例演示了:
// * 长文本语音合成API调用setLongText
// * 流式合成TTS。
// * 首包延迟计算。
// *
// * 说明该示例和nls-example-tts下的SpeechSynthesizerLongTextDemo不完全相同长文本语音合成是单独的产品功能是将一长串文本直接发送给服务端去合成
// * 而SpeechSynthesizerLongTextDemo演示的是将一长串文本在调用方处切割然后分段调用语音合成接口。
// */
//public class SpeechLongSynthesizerDemo {
// private static final Logger logger = LoggerFactory.getLogger(SpeechLongSynthesizerDemo.class);
// private static long startTime;
// private String appKey;
// NlsClient client;
// public SpeechLongSynthesizerDemo(String appKey, String token, String url) {
// this.appKey = appKey;
// //创建NlsClient实例应用全局创建一个即可。生命周期可和整个应用保持一致默认服务地址为阿里云线上服务地址。
// if(url.isEmpty()) {
// client = new NlsClient(token);
// } else {
// client = new NlsClient(url, token);
// }
// }
// private static SpeechSynthesizerListener getSynthesizerListener() {
// SpeechSynthesizerListener listener = null;
// try {
// listener = new SpeechSynthesizerListener() {
// File f=new File("ttsForLongText.wav");
// FileOutputStream fout = new FileOutputStream(f);
// private boolean firstRecvBinary = true;
// //语音合成结束
// @Override
// public void onComplete(SpeechSynthesizerResponse response) {
// // 调用onComplete时表示所有TTS数据已经接收完成因此为整个合成数据的延迟。该延迟可能较大不一定满足实时场景。
// System.out.println("name: " + response.getName() + ", status: " + response.getStatus()+", output file :"+f.getAbsolutePath());
// }
// //语音合成的语音二进制数据
// @Override
// public void onMessage(ByteBuffer message) {
// try {
// if(firstRecvBinary) {
// // 此处计算首包语音流的延迟,收到第一包语音流时,即可以进行语音播放,以提升响应速度(特别是实时交互场景下)。
// firstRecvBinary = false;
// long now = System.currentTimeMillis();
// logger.info("tts first latency : " + (now - SpeechLongSynthesizerDemo.startTime) + " ms");
// }
// byte[] bytesArray = new byte[message.remaining()];
// message.get(bytesArray, 0, bytesArray.length);
// //System.out.println("write array:" + bytesArray.length);
// fout.write(bytesArray);
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
// @Override
// public void onFail(SpeechSynthesizerResponse response){
// // task_id是调用方和服务端通信的唯一标识当遇到问题时需要提供此task_id以便排查。
// System.out.println(
// "task_id: " + response.getTaskId() +
// //状态码
// ", status: " + response.getStatus() +
// //错误信息
// ", status_text: " + response.getStatusText());
// }
// };
// } catch (Exception e) {
// e.printStackTrace();
// }
// return listener;
// }
// public void process(String text) {
// SpeechSynthesizer synthesizer = null;
// try {
// //创建实例,建立连接。
// synthesizer = new SpeechSynthesizer(client, getSynthesizerListener());
// synthesizer.setAppKey(appKey);
// //设置返回音频的编码格式。
// synthesizer.setFormat(OutputFormatEnum.WAV);
// //设置返回音频的采样率。
// synthesizer.setSampleRate(SampleRateEnum.SAMPLE_RATE_16K);
// //发音人。注意Java SDK不支持调用超高清场景对应的发音人例如"zhiqi"如需调用请使用restfulAPI方式。
// synthesizer.setVoice("siyue");
// //语调,范围是-500~500可选默认是0。
// synthesizer.setPitchRate(0);
// //语速,范围是-500~500默认是0。
// synthesizer.setSpeechRate(0);
// //设置用于语音合成的文本
// // 此处调用的是setLongText接口原语音合成接口是setText
// synthesizer.setLongText(text);
// //此方法将以上参数设置序列化为JSON发送给服务端并等待服务端确认。
// long start = System.currentTimeMillis();
// synthesizer.start();
// logger.info("tts start latency " + (System.currentTimeMillis() - start) + " ms");
// SpeechLongSynthesizerDemo.startTime = System.currentTimeMillis();
// //等待语音合成结束
// synthesizer.waitForComplete();
// logger.info("tts stop latency " + (System.currentTimeMillis() - start) + " ms");
// } catch (Exception e) {
// e.printStackTrace();
// } finally {
// //关闭连接
// if (null != synthesizer) {
// synthesizer.close();
// }
// }
// }
// public void shutdown() {
// client.shutdown();
// }
// public static void main(String[] args) throws Exception {
// AccessToken accessToken = new AccessToken("LTAI5tRBahK93vPNF1JDVEPA", "x95OWb4cV6ccQVtbEJ2Gxm2Uwl2thJ");
// accessToken.apply();
// String token = accessToken.getToken();
// String appKey = "mtA2pwmvCeefHT3Y";
// // url取默认值
// String url = "wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1";
//
// String ttsTextLong = "百草堂与三味书屋 鲁迅 \n" +
// "我家的后面有一个很大的园,相传叫作百草园。现在是早已并屋子一起卖给朱文公的子孙了,连那最末次的相见也已经隔了七八年,其中似乎确凿只有一些野草;但那时却是我的乐园。\n" +
// "不必说碧绿的菜畦,光滑的石井栏,高大的皂荚树,紫红的桑葚;也不必说鸣蝉在树叶里长吟,肥胖的黄蜂伏在菜花上,轻捷的叫天子(云雀)忽然从草间直窜向云霄里去了。\n" +
// "单是周围的短短的泥墙根一带,就有无限趣味。油蛉在这里低唱,蟋蟀们在这里弹琴。翻开断砖来,有时会遇见蜈蚣;还有斑蝥,倘若用手指按住它的脊梁,便会啪的一声,\n" +
// "从后窍喷出一阵烟雾。何首乌藤和木莲藤缠络着,木莲有莲房一般的果实,何首乌有臃肿的根。有人说,何首乌根是有像人形的,吃了便可以成仙,我于是常常拔它起来,牵连不断地拔起来,\n" +
// "也曾因此弄坏了泥墙,却从来没有见过有一块根像人样! 如果不怕刺,还可以摘到覆盆子,像小珊瑚珠攒成的小球,又酸又甜,色味都比桑葚要好得远......";
// SpeechLongSynthesizerDemo demo = new SpeechLongSynthesizerDemo(appKey, token, url);
// demo.process(ttsTextLong);
// demo.shutdown();
// }
//}

View File

@@ -0,0 +1,64 @@
package com.ruoyi.cms.handler;
import com.ruoyi.cms.util.AliyunNlsUtils;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
@Component
@ServerEndpoint("/speech-recognition")
public class SpeechRecognitionWebSocketHandler {
private SpeechRecognizerAI recognizerDemo;
public SpeechRecognitionWebSocketHandler() {
// 初始化语音识别器
String appKey = "4lFYn2yPsQymwGu8";
String id = "LTAI5t9hhSqdDHqwH3RjgyYj";
String secret = "ni5aW3vxrWouMwcGqJPfh9Uu56PBuv";
String url = System.getenv().getOrDefault("NLS_GATEWAY_URL", AliyunNlsUtils.getNlsUrl()+"/ws/v1/");
recognizerDemo = new SpeechRecognizerAI(appKey, id, secret, url);
}
/**
* 连接建立成功调用的方法
*/
@OnOpen
public void onOpen(Session session) {
System.out.println("WebSocket 连接建立成功sessionId = " + session.getId());
}
/**
* 收到客户端消息后调用的方法
*/
@OnMessage(maxMessageSize=5242880)
public void onMessage(ByteBuffer message, Session session) throws IOException {
byte[] audioData = new byte[message.remaining()];
message.get(audioData);
// 处理音频数据
recognizerDemo.processStream(session, new ByteArrayInputStream(audioData), 16000);
}
/**
* 连接关闭调用的方法
*/
@OnClose
public void onClose(Session session) {
System.out.println("WebSocket 连接关闭sessionId = " + session.getId());
}
/**
* 发生错误时调用的方法
*/
@OnError
public void onError(Session session, Throwable error) {
System.err.println("WebSocket 发生错误:" + error.getMessage());
error.printStackTrace();
}
}

View File

@@ -0,0 +1,148 @@
package com.ruoyi.cms.handler;
import com.alibaba.nls.client.AccessToken;
import com.alibaba.nls.client.protocol.InputFormatEnum;
import com.alibaba.nls.client.protocol.NlsClient;
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 com.ruoyi.cms.util.AliyunNlsUtils;
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 = new AccessToken(id, secret);
try {
if(AliyunNlsUtils.USE_TEST_ENV){
accessToken.apply(); // 申请 Token
}else{
AliyunNlsTokenUtil.generateToken(id, secret, this.accessToken);
}
//accessToken.apply(); // 申请 Token
logger.info("Token: {}, Expire Time: {}", accessToken.getToken(), accessToken.getExpireTime());
// 初始化 NlsClient
if (url.isEmpty()) {
this.client = new NlsClient(accessToken.getToken()); // 使用默认服务地址
} else {
this.client = new NlsClient(url, accessToken.getToken()); // 使用自定义服务地址
}
} catch (Exception e) {
logger.error("Failed to initialize NlsClient: {}", e.getMessage());
}
}
public void processStream(Session session, InputStream inputStream, int sampleRate) {
SpeechRecognizer recognizer = null;
try {
// 创建 SpeechRecognizer 实例
recognizer = new SpeechRecognizer(client, new SpeechRecognizerListener() {
@Override
public void onRecognitionResultChanged(SpeechRecognizerResponse response) {
// 打印中间识别结果
String text = response.getRecognizedText();
logger.info("中间识别结果: {}", text);
sendResult(session, text,false);
}
@Override
public void onRecognitionCompleted(SpeechRecognizerResponse response) {
// 打印最终识别结果
String text = response.getRecognizedText();
logger.info("最终识别结果: {}", text);
sendResult(session, text,true);
}
@Override
public void onStarted(SpeechRecognizerResponse response) {
logger.info("识别开始, TaskId: {}", response.getTaskId());
}
@Override
public void onFail(SpeechRecognizerResponse response) {
logger.error("识别失败: {}", response.getStatusText());
}
});
// 设置语音识别参数
recognizer.setAppKey(appKey);
recognizer.setFormat(InputFormatEnum.PCM);
recognizer.setSampleRate(sampleRate == 16000 ?
SampleRateEnum.SAMPLE_RATE_16K : SampleRateEnum.SAMPLE_RATE_8K);
recognizer.setEnableIntermediateResult(true);
recognizer.addCustomedParam("enable_voice_detection", true);
// 启动识别
recognizer.start();
// 读取音频流并发送
byte[] buffer = new byte[3200];
int len;
while ((len = inputStream.read(buffer)) > 0) {
recognizer.send(buffer, len);
}
// 停止识别
recognizer.stop();
} catch (Exception e) {
logger.error("处理音频流时出错: {}", e.getMessage());
} finally {
if (recognizer != null) {
recognizer.close();
}
}
}
private void sendResult(Session session, String text,Boolean asrEnd) {
try {
session.getBasicRemote().sendText("{\"text\": \"" + text + "\",\"asrEnd\":\"" + asrEnd + "\"}");
} catch (IOException e) {
logger.error("发送识别结果失败: {}", e.getMessage());
}
}
public void shutdown() {
if (client != null) {
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

@@ -0,0 +1,151 @@
package com.ruoyi.cms.handler;
import com.alibaba.nls.client.AccessToken;
import com.alibaba.nls.client.protocol.NlsClient;
import com.alibaba.nls.client.protocol.OutputFormatEnum;
import com.alibaba.nls.client.protocol.SampleRateEnum;
import com.alibaba.nls.client.protocol.tts.SpeechSynthesizer;
import com.alibaba.nls.client.protocol.tts.SpeechSynthesizerListener;
import com.alibaba.nls.client.protocol.tts.SpeechSynthesizerResponse;
import com.ruoyi.cms.util.AliyunNlsUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.nio.ByteBuffer;
@Component
@ServerEndpoint("/speech-synthesis")
public class SpeechSynthesisWebSocketHandler {
private static final Logger logger = LoggerFactory.getLogger(SpeechSynthesisWebSocketHandler.class);
private NlsClient client;
private String appKey = "mtA2pwmvCeefHT3Y";
private String accessKeyId = "LTAI5tRBahK93vPNF1JDVEPA";
private String accessKeySecret = "x95OWb4cV6ccQVtbEJ2Gxm2Uwl2thJ";
private String url = AliyunNlsUtils.getNlsUrl()+"/ws/v1/";
public SpeechSynthesisWebSocketHandler() {
// Initialize NLS client with token
AccessToken accessToken = new AccessToken(accessKeyId, accessKeySecret);
try {
if(AliyunNlsUtils.USE_TEST_ENV){
accessToken.apply();
}else{
AliyunNlsTokenUtil.generateToken(accessKeyId, accessKeySecret, accessToken);
}
//accessToken.apply();
String token = accessToken.getToken();
if(url.isEmpty()) {
this.client = new NlsClient(token);
} else {
this.client = new NlsClient(url, token);
}
} catch (Exception e) {
logger.error("Failed to initialize NLS client", e);
}
}
@OnOpen
public void onOpen(Session session) {
logger.info("WebSocket connected for speech synthesis, sessionId: {}", session.getId());
}
@OnMessage(maxMessageSize=5242880)
public void onMessage(String text, Session session) {
logger.info("Received text for synthesis: {}", text);
SpeechSynthesizer synthesizer = null;
try {
// Create synthesizer with a session-specific listener
synthesizer = new SpeechSynthesizer(client, createSynthesizerListener(session));
// Configure synthesizer
synthesizer.setAppKey(appKey);
synthesizer.setFormat(OutputFormatEnum.WAV);
synthesizer.setSampleRate(SampleRateEnum.SAMPLE_RATE_16K);
synthesizer.setVoice("aiqi");
synthesizer.setPitchRate(0);
synthesizer.setSpeechRate(0);
// Use long text synthesis
synthesizer.setLongText(text);
// Start synthesis
synthesizer.start();
} catch (Exception e) {
logger.error("Error during speech synthesis", e);
try {
session.close(new CloseReason(CloseReason.CloseCodes.UNEXPECTED_CONDITION, "Synthesis error"));
} catch (IOException ioException) {
logger.error("Error closing session", ioException);
}
} finally {
// Note: We can't close the synthesizer here because synthesis is async
// It should be closed in the listener's onComplete/onFail methods
}
}
@OnClose
public void onClose(Session session) {
logger.info("WebSocket closed for speech synthesis, sessionId: {}", session.getId());
}
@OnError
public void onError(Session session, Throwable error) {
logger.error("WebSocket error for session {}: {}", session.getId(), error.getMessage(), error);
}
private SpeechSynthesizerListener createSynthesizerListener(Session session) {
return new SpeechSynthesizerListener() {
private boolean firstRecvBinary = true;
private long startTime;
@Override
public void onComplete(SpeechSynthesizerResponse response) {
logger.info("Synthesis completed for session {}, status: {}", session.getId(), response.getStatus());
try {
// Send a close message or marker to indicate completion
session.getBasicRemote().sendText("{\"status\":\"complete\"}");
} catch (IOException e) {
logger.error("Error sending completion message", e);
}
}
@Override
public void onMessage(ByteBuffer message) {
try {
if (firstRecvBinary) {
firstRecvBinary = false;
startTime = System.currentTimeMillis();
logger.info("First audio packet received for session {}", session.getId());
}
// Send audio data to client
byte[] bytesArray = new byte[message.remaining()];
message.get(bytesArray, 0, bytesArray.length);
session.getBasicRemote().sendBinary(ByteBuffer.wrap(bytesArray));
} catch (IOException e) {
logger.error("Error sending audio data to client", e);
}
}
@Override
public void onFail(SpeechSynthesizerResponse response) {
logger.error("Synthesis failed for session {}: task_id: {}, status: {}, status_text: {}",
session.getId(), response.getTaskId(), response.getStatus(), response.getStatusText());
try {
session.close(new CloseReason(CloseReason.CloseCodes.UNEXPECTED_CONDITION,
"Synthesis failed: " + response.getStatusText()));
} catch (IOException e) {
logger.error("Error closing failed session", e);
}
}
};
}
}

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