Browse Source

完善门户网站接口和后台管理接口

chenchen 6 months ago
parent
commit
65d079db1e
16 changed files with 738 additions and 88 deletions
  1. 65 15
      application-webadmin/src/main/java/com/tourism/webadmin/app/website/controller/BasicToWebController.java
  2. 98 11
      application-webadmin/src/main/java/com/tourism/webadmin/app/website/controller/TourismProjectToWebController.java
  3. 64 0
      application-webadmin/src/main/java/com/tourism/webadmin/app/website/dto/TourismProjectToWebDto.java
  4. 53 32
      application-webadmin/src/main/java/com/tourism/webadmin/back/dao/mapper/JobProjectMapper.xml
  5. 48 7
      application-webadmin/src/main/java/com/tourism/webadmin/back/dto/JobProjectDto.java
  6. 61 13
      application-webadmin/src/main/java/com/tourism/webadmin/back/model/JobProject.java
  7. 4 0
      application-webadmin/src/main/java/com/tourism/webadmin/back/model/TourismFile.java
  8. 11 0
      application-webadmin/src/main/java/com/tourism/webadmin/back/vo/BannerInfoVo.java
  9. 8 0
      application-webadmin/src/main/java/com/tourism/webadmin/back/vo/DirectoryInfoVo.java
  10. 68 10
      application-webadmin/src/main/java/com/tourism/webadmin/back/vo/JobProjectVo.java
  11. 14 0
      application-webadmin/src/main/java/com/tourism/webadmin/back/vo/TourismProjectVo.java
  12. 22 0
      application-webadmin/src/main/java/com/tourism/webadmin/config/ApplicationDevConfig.java
  13. 6 0
      common/common-additional/pom.xml
  14. 26 0
      common/common-additional/src/main/java/com/tourism/common/additional/model/FileUrlObject.java
  15. 189 0
      common/common-additional/src/main/java/com/tourism/common/additional/utils/JsonUtils.java
  16. 1 0
      common/common-core/src/main/java/com/tourism/common/core/base/model/BaseModel.java

+ 65 - 15
application-webadmin/src/main/java/com/tourism/webadmin/app/website/controller/BasicToWebController.java

@@ -1,6 +1,9 @@
 package com.tourism.webadmin.app.website.controller;
 
 import cn.dev33.satoken.annotation.SaIgnore;
+import com.tourism.common.additional.model.FileUrlObject;
+import com.tourism.common.additional.utils.JsonUtils;
+import com.tourism.common.additional.utils.StringUtils;
 import com.tourism.common.core.object.MyOrderParam;
 import com.tourism.common.core.object.MyPageData;
 import com.tourism.common.core.object.ResponseResult;
@@ -16,14 +19,17 @@ import com.tourism.webadmin.back.service.DirectoryInfoService;
 import com.tourism.webadmin.back.vo.BannerInfoVo;
 import com.tourism.webadmin.back.vo.CompanyInfoVo;
 import com.tourism.webadmin.back.vo.DirectoryInfoVo;
+import com.tourism.webadmin.config.ApplicationDevConfig;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.validation.constraints.NotNull;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.util.CollectionUtils;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.ArrayList;
 import java.util.List;
 
 @Tag(name = "门户网站基础信息接口")
@@ -41,6 +47,8 @@ public class BasicToWebController {
     private CompanyInfoService companyInfoService;
     @Autowired
     private DirectoryInfoService directoryInfoService;
+    @Autowired
+    private ApplicationDevConfig applicationDevConfig;
 
     /**
      * 列出符合过滤条件的banner管理列表。
@@ -55,7 +63,27 @@ public class BasicToWebController {
         bannerInfoFilter.setEnable(1);
         String orderBy = MyOrderParam.buildOrderBy(new MyOrderParam(), BannerInfo.class);
         List<BannerInfo> bannerInfoList = bannerInfoService.getBannerInfoListWithRelation(bannerInfoFilter, orderBy);
-        return ResponseResult.success(MyPageUtil.makeResponseData(bannerInfoList, BannerInfoVo.class));
+        MyPageData<BannerInfoVo> bannerInfoVoMyPageData = MyPageUtil.makeResponseData(bannerInfoList, BannerInfoVo.class);
+
+        List<BannerInfoVo> dataList = bannerInfoVoMyPageData.getDataList();
+        //先把imgUrl由jaon转换为List<FileUrlObject>
+        dataList.stream().forEach(item ->
+        {
+            if (StringUtils.isNotEmpty(item.getImgUrl())) {
+                List<FileUrlObject> fileUrlObjectList = JsonUtils.parseFileUrlArray(item.getImgUrl(), FileUrlObject.class);
+                if (!CollectionUtils.isEmpty(fileUrlObjectList)) {
+                    ArrayList<String> arrayList = new ArrayList<>();
+                    //遍历每个元素的数组对象,对元素的url对象进行拼接
+                    for (FileUrlObject y : fileUrlObjectList) {
+                        String imgUrlAfterConvert =
+                                applicationDevConfig.getHostIpPort() + y.getDownloadUri() + "?id=" + item.getId() + "&fieldName=imgUrl&asImage=true&filename=" + y.getFilename();
+                        arrayList.add(imgUrlAfterConvert);
+                    }
+                    item.setImgUrlsAfterConvert(arrayList);
+                }
+            }
+        });
+        return ResponseResult.success(bannerInfoVoMyPageData);
     }
 
     /**
@@ -77,20 +105,42 @@ public class BasicToWebController {
         String orderBy = MyOrderParam.buildOrderBy(new MyOrderParam(), DirectoryInfo.class);
         List<DirectoryInfo> directoryInfoList =
                 directoryInfoService.getDirectoryInfoListWithRelation(directoryInfoFilter, orderBy);
-        return ResponseResult.success(MyPageUtil.makeResponseData(directoryInfoList, DirectoryInfoVo.class));
-    }
 
-    /**
-     * 列出符合过滤条件的公司信息管理列表。
-     *  @return 应答结果对象,包含查询结果集。
-     */
-    @GetMapping("/companyList")
-    public ResponseResult<MyPageData<CompanyInfoVo>> companyInfoList(@NotNull(message = "公司类型(companyType)不能为空") Integer companyType) {
-        CompanyInfo companyInfoFilter = new CompanyInfo();
-        companyInfoFilter.setCompanyType(companyType);
-        String orderBy = MyOrderParam.buildOrderBy(new MyOrderParam(), CompanyInfo.class);
-        List<CompanyInfo> companyInfoList =
-                companyInfoService.getCompanyInfoListWithRelation(companyInfoFilter, orderBy);
-        return ResponseResult.success(MyPageUtil.makeResponseData(companyInfoList, CompanyInfoVo.class));
+        MyPageData<DirectoryInfoVo> directoryInfoVoMyPageData = MyPageUtil.makeResponseData(directoryInfoList, DirectoryInfoVo.class);
+
+        List<DirectoryInfoVo> dataList = directoryInfoVoMyPageData.getDataList();
+        //先把imgUrl由jaon转换为List<FileUrlObject>
+        dataList.stream().forEach(item ->
+        {
+            if (StringUtils.isNotEmpty(item.getHotPictureUrl())) {
+                List<FileUrlObject> fileUrlObjectList = JsonUtils.parseFileUrlArray(item.getHotPictureUrl(), FileUrlObject.class);
+                if (!CollectionUtils.isEmpty(fileUrlObjectList)) {
+                    ArrayList<String> arrayList = new ArrayList<>();
+                    //遍历每个元素的数组对象,对元素的url对象进行拼接
+                    for (FileUrlObject y : fileUrlObjectList) {
+                        String hotPictureUrlsAfterConvert =
+                                applicationDevConfig.getHostIpPort() + y.getDownloadUri() + "?id=" + item.getId() + "&fieldName=hotPictureUrl&asImage=true&filename=" + y.getFilename();
+                        arrayList.add(hotPictureUrlsAfterConvert);
+                    }
+                    item.setHotPictureUrlsAfterConvert(arrayList);
+                }
+            }
+        });
+
+        return ResponseResult.success(directoryInfoVoMyPageData);
     }
+
+//    /**
+//     * 列出符合过滤条件的公司信息管理列表。
+//     *  @return 应答结果对象,包含查询结果集。
+//     */
+//    @GetMapping("/companyList")
+//    public ResponseResult<MyPageData<CompanyInfoVo>> companyInfoList(@NotNull(message = "公司类型(companyType)不能为空") Integer companyType) {
+//        CompanyInfo companyInfoFilter = new CompanyInfo();
+//        companyInfoFilter.setCompanyType(companyType);
+//        String orderBy = MyOrderParam.buildOrderBy(new MyOrderParam(), CompanyInfo.class);
+//        List<CompanyInfo> companyInfoList =
+//                companyInfoService.getCompanyInfoListWithRelation(companyInfoFilter, orderBy);
+//        return ResponseResult.success(MyPageUtil.makeResponseData(companyInfoList, CompanyInfoVo.class));
+//    }
 }

+ 98 - 11
application-webadmin/src/main/java/com/tourism/webadmin/app/website/controller/TourismProjectToWebController.java

@@ -2,7 +2,12 @@ package com.tourism.webadmin.app.website.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.annotation.SaIgnore;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.github.pagehelper.page.PageMethod;
+import com.tourism.common.additional.model.FileUrlObject;
+import com.tourism.common.additional.utils.JsonUtils;
+import com.tourism.common.additional.utils.MapConvertUtils;
+import com.tourism.common.additional.utils.StringUtils;
 import com.tourism.common.core.annotation.MyRequestBody;
 import com.tourism.common.core.constant.ErrorCodeEnum;
 import com.tourism.common.core.object.*;
@@ -10,20 +15,25 @@ import com.tourism.common.core.upload.UpDownloaderFactory;
 import com.tourism.common.core.util.MyModelUtil;
 import com.tourism.common.core.util.MyPageUtil;
 import com.tourism.common.redis.cache.SessionCacheHelper;
+import com.tourism.webadmin.app.website.dto.TourismProjectToWebDto;
 import com.tourism.webadmin.back.dto.TourismProjectDto;
 import com.tourism.webadmin.back.model.DirectoryInfo;
+import com.tourism.webadmin.back.model.TourismFile;
 import com.tourism.webadmin.back.model.TourismProject;
 import com.tourism.webadmin.back.service.TourismProjectService;
 import com.tourism.webadmin.back.vo.TourismProjectVo;
 import com.tourism.webadmin.config.ApplicationConfig;
+import com.tourism.webadmin.config.ApplicationDevConfig;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
 import jakarta.validation.constraints.NotNull;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 import static java.util.stream.Collectors.toList;
@@ -44,20 +54,18 @@ public class TourismProjectToWebController {
 
     @Autowired
     private TourismProjectService tourismProjectService;
+    @Autowired
+    private ApplicationDevConfig applicationDevConfig;
 
     /**
      * 列出符合过滤条件的旅游项目管理列表。
      *
      * @param tourismProjectDtoFilter 过滤对象。
-     * @param orderParam 排序参数。
-     * @param pageParam 分页参数。
      * @return 应答结果对象,包含查询结果集。
      */
-    @PostMapping("/list")
+    @GetMapping("/list")
     public ResponseResult<MyPageData<TourismProjectVo>> list(
-            @MyRequestBody TourismProjectDto tourismProjectDtoFilter,
-            @MyRequestBody MyOrderParam orderParam,
-            @MyRequestBody MyPageParam pageParam) {
+            @Valid @ModelAttribute TourismProjectToWebDto tourismProjectDtoFilter) {
 //        if(tourismProjectDtoFilter.getBelongTab() == null){
 //            return ResponseResult.error(ErrorCodeEnum.ARGUMENT_NULL_EXIST,"所属分类(belongTab)不能为空!");
 //        }
@@ -73,13 +81,44 @@ public class TourismProjectToWebController {
         TourismProject tourismProjectFilter = MyModelUtil.copyTo(tourismProjectDtoFilter, TourismProject.class);
         //首页展示的为启用的内容
         tourismProjectFilter.setEnable(1);
-        String orderBy = MyOrderParam.buildOrderBy(orderParam, TourismProject.class);
-        if (pageParam != null) {
-            PageMethod.startPage(pageParam.getPageNum(), pageParam.getPageSize(), pageParam.getCount());
+        String orderBy = MyOrderParam.buildOrderBy(tourismProjectDtoFilter.getOrderParamList(), TourismProject.class);
+        if (tourismProjectDtoFilter.getPageNum() != null && tourismProjectDtoFilter.getPageSize() != null && tourismProjectDtoFilter.getCount() != null) {
+            PageMethod.startPage(tourismProjectDtoFilter.getPageNum(), tourismProjectDtoFilter.getPageSize(), tourismProjectDtoFilter.getCount());
         }
         List<TourismProject> tourismProjectList =
                 tourismProjectService.getTourismProjectListWithRelation(tourismProjectFilter, orderBy);
-        return ResponseResult.success(MyPageUtil.makeResponseData(tourismProjectList, TourismProjectVo.class));
+        MyPageData<TourismProjectVo> tourismProjectVoMyPageData = MyPageUtil.makeResponseData(tourismProjectList, TourismProjectVo.class);
+
+        List<TourismProjectVo> dataList = tourismProjectVoMyPageData.getDataList();
+        //先把imgUrl由jaon转换为List<FileUrlObject>
+        dataList.stream().forEach(item ->
+        {
+            if(StringUtils.isNotEmpty(item.getHomeHotPicture())) {
+                List<FileUrlObject> fileUrlObjectList = JsonUtils.parseFileUrlArray(item.getHomeHotPicture(), FileUrlObject.class);
+                if (!CollectionUtils.isEmpty(fileUrlObjectList)) {
+                    ArrayList<String> arrayList = new ArrayList<>();
+                    for (FileUrlObject y : fileUrlObjectList) {
+                        String homeHotPicturesAfterConvert =
+                                applicationDevConfig.getHostIpPort() + y.getDownloadUri() + "?id=" + item.getId() + "&fieldName=homeHotPicture&asImage=true&filename=" + y.getFilename();
+                        arrayList.add(homeHotPicturesAfterConvert);
+                    }
+                    item.setHomeHotPicturesAfterConvert(arrayList);
+                }
+            }
+            if(StringUtils.isNotEmpty(item.getTourismUrl())){
+                List<FileUrlObject> fileUrlObjectList = JsonUtils.parseFileUrlArray(item.getTourismUrl(), FileUrlObject.class);
+                if (!CollectionUtils.isEmpty(fileUrlObjectList)) {
+                    ArrayList<String> arrayList = new ArrayList<>();
+                    for (FileUrlObject y : fileUrlObjectList) {
+                        String tourismUrlsAfterConvert =
+                                applicationDevConfig.getHostIpPort() + y.getDownloadUri() + "?id=" + item.getId() + "&fieldName=tourismUrl&asImage=true&filename=" + y.getFilename();
+                        arrayList.add(tourismUrlsAfterConvert);
+                    }
+                    item.setHomeHotPicturesAfterConvert(arrayList);
+                }
+            }
+        });
+        return ResponseResult.success(tourismProjectVoMyPageData);
     }
 
     /**
@@ -96,6 +135,54 @@ public class TourismProjectToWebController {
             return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST);
         }
         TourismProjectVo tourismProjectVo = MyModelUtil.copyTo(tourismProject, TourismProjectVo.class);
+        //先把imgUrl由jaon转换为List<FileUrlObject>
+        if (StringUtils.isNotEmpty(tourismProjectVo.getTourismUrl())) {
+            List<FileUrlObject> fileUrlObjectList = JsonUtils.parseFileUrlArray(tourismProjectVo.getTourismUrl(), FileUrlObject.class);
+            if (!CollectionUtils.isEmpty(fileUrlObjectList)) {
+                ArrayList<String> arrayList = new ArrayList<>();
+                //遍历每个元素的数组对象,对元素的url对象进行拼接
+                for (FileUrlObject y : fileUrlObjectList) {
+                    String tourismUrlsAfterConvert =
+                            applicationDevConfig.getHostIpPort() + y.getDownloadUri() + "?id=" + tourismProjectVo.getId() + "&fieldName=tourismUrl&asImage=true&filename=" + y.getFilename();
+                    arrayList.add(tourismUrlsAfterConvert);
+                }
+                tourismProjectVo.setTourismUrlsAfterConvert(arrayList);
+            }
+        }
+        if (StringUtils.isNotEmpty(tourismProjectVo.getHomeHotPicture())) {
+            List<FileUrlObject> fileUrlObjectList = JsonUtils.parseFileUrlArray(tourismProjectVo.getHomeHotPicture(), FileUrlObject.class);
+            if (!CollectionUtils.isEmpty(fileUrlObjectList)) {
+                ArrayList<String> arrayList = new ArrayList<>();
+                //遍历每个元素的数组对象,对元素的url对象进行拼接
+                for (FileUrlObject y : fileUrlObjectList) {
+                    String homeHotPicturesAfterConvert =
+                            applicationDevConfig.getHostIpPort() + y.getDownloadUri() + "?id=" + tourismProjectVo.getId() + "&fieldName=homeHotPicture&asImage=true&filename=" + y.getFilename();
+                    arrayList.add(homeHotPicturesAfterConvert);
+                }
+                tourismProjectVo.setTourismUrlsAfterConvert(arrayList);
+            }
+        }
+        if(tourismProjectVo.getTourismFile() != null){
+            // 使用 Jackson 的 ObjectMapper 进行转换
+            ObjectMapper objectMapper = new ObjectMapper();
+            TourismFile tourismFile = objectMapper.convertValue(tourismProjectVo.getTourismFile(), TourismFile.class);
+            if(StringUtils.isNotEmpty(tourismFile.getFileUrl())){
+                List<FileUrlObject> fileUrlObjectList = JsonUtils.parseFileUrlArray(tourismFile.getFileUrl(), FileUrlObject.class);
+                if(!CollectionUtils.isEmpty(fileUrlObjectList)){
+                    ArrayList<String> arrayList = new ArrayList<>();
+                    //遍历每个元素的数组对象,对元素的url对象进行拼接
+                    for (FileUrlObject y : fileUrlObjectList) {
+                        String imgUrlAfterConvert =
+                                applicationDevConfig.getHostIpPort() + y.getDownloadUri() + "?id=" + tourismFile.getId() + "&fieldName=fileUrl&asImage=true&filename=" + y.getFilename();
+                        arrayList.add(imgUrlAfterConvert);
+                    }
+                    tourismFile.setFileUrlsAfterConvert(arrayList);
+                }
+//                Map<String, Object> tourismFile1 = new HashMap<>();
+//                tourismFile1.put("tourismFile",tourismFile);
+                tourismProjectVo.setTourismFile(MapConvertUtils.convertObjectToMap(tourismFile));
+            }
+        }
         return ResponseResult.success(tourismProjectVo);
     }
 }

+ 64 - 0
application-webadmin/src/main/java/com/tourism/webadmin/app/website/dto/TourismProjectToWebDto.java

@@ -0,0 +1,64 @@
+package com.tourism.webadmin.app.website.dto;
+
+import com.tourism.common.core.object.MyOrderParam;
+import com.tourism.common.core.validator.ConstDictRef;
+import com.tourism.webadmin.back.model.constant.Hotspot;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 门户预定管理Dto对象。
+ *
+ * @author 吃饭睡觉
+ * @date 2024-09-06
+ */
+@Schema(description = "TourismProjectToWebDto对象")
+@Data
+public class TourismProjectToWebDto {
+
+
+    /**
+     * 所属分类。
+     */
+    @Schema(description = "所属分类。")
+    @NotNull(message = "所属分类不能为空")
+    private Long belongTab;
+
+    /**
+     * 是否为热点项目。
+     */
+    @Schema(description = "是否热点,0非热点,1热点。")
+    private Integer isHotspot;
+
+    /**
+     * 分页号码,从1开始计数。
+     */
+    @Schema(description = "分页号码。")
+    private Integer pageNum;
+
+    /**
+     * 每页大小。
+     */
+    @Schema(description = "每页大小。")
+    private Integer pageSize;
+
+    /**
+     * 是否统计totalCount。
+     */
+    @Schema(description = "每页大小。")
+    private Boolean count;
+
+    /**
+     * 排序。
+     */
+    @Schema(description = "排序。")
+    private MyOrderParam orderParamList;
+
+    /**
+     * 菜单id。
+     */
+    private List<Long> directoryInfoIds;
+}

+ 53 - 32
application-webadmin/src/main/java/com/tourism/webadmin/back/dao/mapper/JobProjectMapper.xml

@@ -8,7 +8,6 @@
         <result column="belong_tab" jdbcType="BIGINT" property="belongTab"/>
         <result column="job_area" jdbcType="VARCHAR" property="jobArea"/>
         <result column="job_people" jdbcType="INTEGER" property="jobPeople"/>
-<!--        <result column="job_pay" jdbcType="VARCHAR" property="jobPay"/>-->
         <result column="job_education" jdbcType="VARCHAR" property="jobEducation"/>
         <result column="job_language" jdbcType="VARCHAR" property="jobLanguage"/>
         <result column="job_contract" jdbcType="VARCHAR" property="jobContract"/>
@@ -31,39 +30,54 @@
         <result column="salary_cap" jdbcType="DECIMAL" property="salaryCap"/>
         <result column="salary_floor" jdbcType="DECIMAL" property="salaryFloor"/>
         <result column="salary_unit" jdbcType="VARCHAR" property="salaryUnit"/>
+        <result column="city" jdbcType="VARCHAR" property="city"/>
+        <result column="address" jdbcType="VARCHAR" property="address"/>
+        <result column="page_view_number" jdbcType="INTEGER" property="pageViewNumber"/>
+        <result column="dept" jdbcType="VARCHAR" property="dept"/>
+        <result column="sex" jdbcType="CHAR" property="sex"/>
+        <result column="age_cap" jdbcType="TINYINT" property="ageCap"/>
+        <result column="age_floor" jdbcType="TINYINT" property="ageFloor"/>
+        <result column="favourite_count" jdbcType="INTEGER" property="favouriteCount"/>
     </resultMap>
 
     <insert id="insertList">
         INSERT INTO tour_job_project
-        (id,
-        job_title,
-        job_label,
-        belong_tab,
-        job_area,
-        job_people,
---         job_pay,
-        job_education,
-        job_language,
-        job_contract,
-        job_deadline,
-        job_require,
-        job_welfare,
-        job_time,
-        job_post,
-        job_advantage,
-        job_url,
-        is_hotspot,
-        show_order,
-        enable,
-        remarks,
-        create_user_id,
-        create_time,
-        update_user_id,
-        update_time,
-        data_state,
-        salary_cap,
-        salary_floor,
-        salary_unit)
+            (id,
+            job_title,
+            job_label,
+            belong_tab,
+            job_area,
+            job_people,
+            job_education,
+            job_language,
+            job_contract,
+            job_deadline,
+            job_require,
+            job_welfare,
+            job_time,
+            job_post,
+            job_advantage,
+            job_url,
+            is_hotspot,
+            show_order,
+            enable,
+            remarks,
+            create_user_id,
+            create_time,
+            update_user_id,
+            update_time,
+            data_state,
+            salary_cap,
+            salary_floor,
+            salary_unit,
+            city,
+            address,
+            page_view_number,
+            dept,
+            sex,
+            age_cap,
+            age_floor,
+            favourite_count)
         VALUES
         <foreach collection="list" index="index" item="item" separator="," >
             (#{item.id},
@@ -72,7 +86,6 @@
             #{item.belongTab},
             #{item.jobArea},
             #{item.jobPeople},
---             #{item.jobPay},
             #{item.jobEducation},
             #{item.jobLanguage},
             #{item.jobContract},
@@ -94,7 +107,15 @@
             #{item.dataState},
             #{item.salaryCap},
             #{item.salaryFloor},
-            #{item.salaryUnit})
+            #{item.salaryUnit},
+            #{item.city},
+            #{item.address},
+            #{item.pageViewNumber},
+            #{item.dept},
+            #{item.sex},
+            #{item.ageCap},
+            #{item.ageFloor},
+            #{item.favouriteCount})
         </foreach>
     </insert>
 

+ 48 - 7
application-webadmin/src/main/java/com/tourism/webadmin/back/dto/JobProjectDto.java

@@ -61,12 +61,6 @@ public class JobProjectDto {
     @Schema(description = "招聘人数。")
     private Integer jobPeople;
 
-//    /**
-//     * 职位月薪。
-//     */
-//    @Schema(description = "职位月薪。")
-//    private String jobPay;
-
     /**
      * 学历要求。
      */
@@ -172,6 +166,54 @@ public class JobProjectDto {
     private String salaryUnit;
 
     /**
+     * 城市(二级)。
+     */
+    @Schema(description = "城市(二级)。")
+    private String city;
+
+    /**
+     * 详细地址。
+     */
+    @Schema(description = "详细地址。")
+    private String address;
+
+    /**
+     * 浏览量。
+     */
+    @Schema(description = "浏览量。")
+    private Integer pageViewNumber;
+
+    /**
+     * 招聘部门。
+     */
+    @Schema(description = "招聘部门。")
+    private String dept;
+
+    /**
+     * 性别要求(1:男 2:女 3:不限)。
+     */
+    @Schema(description = "性别要求(1:男 2:女 3:其它)。")
+    private String sex;
+
+    /**
+     * 年龄上限。
+     */
+    @Schema(description = "年龄上限。")
+    private Integer ageCap;
+
+    /**
+     * 年龄下限。
+     */
+    @Schema(description = "年龄下限。")
+    private Integer ageFloor;
+
+    /**
+     * 收藏量。
+     */
+    @Schema(description = "收藏量。")
+    private Integer favouriteCount;
+
+    /**
      * job_title LIKE搜索字符串。
      * NOTE: 可支持LIKE操作符的列表数据过滤。
      */
@@ -181,6 +223,5 @@ public class JobProjectDto {
     /**
      * 菜单id。
      */
-    @Schema(description = "子级菜单ids")
     private List<Long> directoryInfoIds;
 }

+ 61 - 13
application-webadmin/src/main/java/com/tourism/webadmin/back/model/JobProject.java

@@ -61,12 +61,6 @@ public class JobProject extends BaseModel {
     @TableField(value = "job_people")
     private Integer jobPeople;
 
-//    /**
-//     * 职位月薪。
-//     */
-//    @TableField(value = "job_pay")
-//    private String jobPay;
-
     /**
      * 学历要求。
      */
@@ -153,29 +147,77 @@ public class JobProject extends BaseModel {
     private String remarks;
 
     /**
+     * 逻辑删除标记字段(1: 正常 -1: 已删除)。
+     */
+    @TableLogic
+    @TableField(value = "data_state")
+    private Integer dataState;
+
+    /**
      * 工资上限。
      */
     @TableField(value = "salary_cap")
     private BigDecimal salaryCap;
 
     /**
+     * 工资下限。
+     */
+    @TableField(value = "salary_floor")
+    private BigDecimal salaryFloor;
+
+    /**
      * 工资单位。
      */
     @TableField(value = "salary_unit")
     private String salaryUnit;
 
     /**
-     * 工资下限
+     * 城市(二级)
      */
-    @TableField(value = "salary_floor")
-    private BigDecimal salaryFloor;
+    @TableField(value = "city")
+    private String city;
 
     /**
-     * 逻辑删除标记字段(1: 正常 -1: 已删除)
+     * 详细地址
      */
-    @TableLogic
-    @TableField(value = "data_state")
-    private Integer dataState;
+    @TableField(value = "address")
+    private String address;
+
+    /**
+     * 浏览量。
+     */
+    @TableField(value = "page_view_number")
+    private Integer pageViewNumber;
+
+    /**
+     * 招聘部门。
+     */
+    @TableField(value = "dept")
+    private String dept;
+
+    /**
+     * 性别要求(1:男 2:女 3:不限)。
+     */
+    @TableField(value = "sex")
+    private String sex;
+
+    /**
+     * 年龄上限。
+     */
+    @TableField(value = "age_cap")
+    private Integer ageCap;
+
+    /**
+     * 年龄下限。
+     */
+    @TableField(value = "age_floor")
+    private Integer ageFloor;
+
+    /**
+     * 收藏量。
+     */
+    @TableField(value = "favourite_count")
+    private Integer favouriteCount;
 
     /**
      * job_title LIKE搜索字符串。
@@ -221,6 +263,12 @@ public class JobProject extends BaseModel {
     @TableField(exist = false)
     private Map<String, Object> enableDictMap;
 
+    @RelationGlobalDict(
+            masterIdField = "sex",
+            dictCode = "JobSex")
+    @TableField(exist = false)
+    private Map<String, Object> sexDictMap;
+
     /**
      * 菜单id。
      */

+ 4 - 0
application-webadmin/src/main/java/com/tourism/webadmin/back/model/TourismFile.java

@@ -8,6 +8,7 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 import java.util.Date;
+import java.util.List;
 
 /**
  * 旅游图集实体对象。
@@ -69,4 +70,7 @@ public class TourismFile extends BaseModel {
     @TableLogic
     @TableField(value = "data_state")
     private Integer dataState;
+
+    @TableField(exist = false)
+    private List<String> fileUrlsAfterConvert;
 }

+ 11 - 0
application-webadmin/src/main/java/com/tourism/webadmin/back/vo/BannerInfoVo.java

@@ -1,12 +1,15 @@
 package com.tourism.webadmin.back.vo;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.tourism.common.additional.model.FileUrlObject;
 import com.tourism.common.core.base.vo.BaseVo;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -85,4 +88,12 @@ public class BannerInfoVo extends BaseVo {
      */
     @Schema(description = "mainBanner 常量字典关联数据")
     private Map<String, Object> mainBannerDictMap;
+
+    /**
+     * imgUrlsAfterConvert 转换后的图片对象。
+     */
+    @Schema(description = "imgUrlsAfterConvert 转换后的图片对象")
+    private List<String> imgUrlsAfterConvert;
+
+
 }

+ 8 - 0
application-webadmin/src/main/java/com/tourism/webadmin/back/vo/DirectoryInfoVo.java

@@ -1,11 +1,13 @@
 package com.tourism.webadmin.back.vo;
 
+import com.tourism.common.additional.model.FileUrlObject;
 import com.tourism.common.core.base.vo.BaseVo;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 import java.util.Date;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -96,4 +98,10 @@ public class DirectoryInfoVo extends BaseVo {
      */
     @Schema(description = "isHotspot 常量字典关联数据")
     private Map<String, Object> isHotspotDictMap;
+
+    /**
+     * hotPictureUrlsAfterConvert 转换后的热点图片url。
+     */
+    @Schema(description = "转换后的热点图片url")
+    private List<String> hotPictureUrlsAfterConvert;
 }

+ 68 - 10
application-webadmin/src/main/java/com/tourism/webadmin/back/vo/JobProjectVo.java

@@ -1,9 +1,14 @@
 package com.tourism.webadmin.back.vo;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.tourism.common.core.base.vo.BaseVo;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -21,7 +26,7 @@ public class JobProjectVo extends BaseVo {
      * 主键id。
      */
     @Schema(description = "主键id")
-    private String id;
+    private Long id;
 
     /**
      * 出国劳务标题。
@@ -39,7 +44,7 @@ public class JobProjectVo extends BaseVo {
      * 所属分类。
      */
     @Schema(description = "所属分类")
-    private String belongTab;
+    private Long belongTab;
 
     /**
      * 工作国家或地区。
@@ -53,12 +58,6 @@ public class JobProjectVo extends BaseVo {
     @Schema(description = "招聘人数")
     private Integer jobPeople;
 
-//    /**
-//     * 职位月薪。
-//     */
-//    @Schema(description = "职位月薪")
-//    private String jobPay;
-
     /**
      * 学历要求。
      */
@@ -147,13 +146,13 @@ public class JobProjectVo extends BaseVo {
      * 工资上限。
      */
     @Schema(description = "工资上限")
-    private String salaryCap;
+    private BigDecimal salaryCap;
 
     /**
      * 工资下限。
      */
     @Schema(description = "工资下限")
-    private String salaryFloor;
+    private BigDecimal salaryFloor;
 
     /**
      * 工资单位。
@@ -162,6 +161,54 @@ public class JobProjectVo extends BaseVo {
     private String salaryUnit;
 
     /**
+     * 城市(二级)。
+     */
+    @Schema(description = "城市(二级)")
+    private String city;
+
+    /**
+     * 详细地址。
+     */
+    @Schema(description = "详细地址")
+    private String address;
+
+    /**
+     * 浏览量。
+     */
+    @Schema(description = "浏览量")
+    private Integer pageViewNumber;
+
+    /**
+     * 招聘部门。
+     */
+    @Schema(description = "招聘部门")
+    private String dept;
+
+    /**
+     * 性别要求(1:男 2:女 3:不限)。
+     */
+    @Schema(description = "性别要求(1:男 2:女 3:其它)")
+    private String sex;
+
+    /**
+     * 年龄上限。
+     */
+    @Schema(description = "年龄上限")
+    private Integer ageCap;
+
+    /**
+     * 年龄下限。
+     */
+    @Schema(description = "年龄下限")
+    private Integer ageFloor;
+
+    /**
+     * 收藏量。
+     */
+    @Schema(description = "收藏量")
+    private Integer favouriteCount;
+
+    /**
      * id 的一对一关联数据对象,数据对应类型为JobFileVo。
      */
     @Schema(description = "id 的一对一关联数据对象,数据对应类型为JobFileVo")
@@ -190,4 +237,15 @@ public class JobProjectVo extends BaseVo {
      */
     @Schema(description = "enable 常量字典关联数据")
     private Map<String, Object> enableDictMap;
+
+    /**
+     * sex 全局字典关联数据。
+     */
+    @Schema(description = "sex 全局字典关联数据")
+    private Map<String, Object> sexDictMap;
+
+    /**
+     * 菜单id。
+     */
+    private List<Long> directoryInfoIds;
 }

+ 14 - 0
application-webadmin/src/main/java/com/tourism/webadmin/back/vo/TourismProjectVo.java

@@ -1,11 +1,13 @@
 package com.tourism.webadmin.back.vo;
 
+import com.tourism.common.additional.model.FileUrlObject;
 import com.tourism.common.core.base.vo.BaseVo;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 import java.math.BigDecimal;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -168,4 +170,16 @@ public class TourismProjectVo extends BaseVo {
      */
     @Schema(description = "enable 常量字典关联数据")
     private Map<String, Object> enableDictMap;
+
+    /**
+     * tourismUrl 转换后的图片对象。
+     */
+    @Schema(description = "tourismUrl转换后的图片对象")
+    private List<String> tourismUrlsAfterConvert;
+
+    /**
+     * homeHotPicture 转换后的图片对象。
+     */
+    @Schema(description = "homeHotPicture转换后的图片对象")
+    private List<String> homeHotPicturesAfterConvert;
 }

+ 22 - 0
application-webadmin/src/main/java/com/tourism/webadmin/config/ApplicationDevConfig.java

@@ -0,0 +1,22 @@
+package com.tourism.webadmin.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 应用程序自定义的程序属性配置文件(dev)。
+ *
+ * @author 吃饭睡觉
+ * @date 2024-09-06
+ */
+@Data
+@Configuration
+@ConfigurationProperties(prefix = "application-dev")
+public class ApplicationDevConfig {
+    /**
+     * dev的ip+port
+     */
+    private String hostIpPort;
+
+}

+ 6 - 0
common/common-additional/pom.xml

@@ -52,5 +52,11 @@
             <version>2.3</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.23</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 </project>

+ 26 - 0
common/common-additional/src/main/java/com/tourism/common/additional/model/FileUrlObject.java

@@ -0,0 +1,26 @@
+package com.tourism.common.additional.model;
+
+import lombok.Data;
+
+@Data
+public class FileUrlObject {
+    /**
+     * 名称。
+     */
+    private String name;
+
+    /**
+     * 下载路径。
+     */
+    private String downloadUri;
+
+    /**
+     * 文件名。
+     */
+    private String filename;
+
+    /**
+     * 更新路径。
+     */
+    private String uploadPath;
+}

+ 189 - 0
common/common-additional/src/main/java/com/tourism/common/additional/utils/JsonUtils.java

@@ -0,0 +1,189 @@
+package com.tourism.common.additional.utils;
+
+import cn.hutool.core.lang.Dict;
+import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.exc.MismatchedInputException;
+import com.tourism.common.additional.model.FileUrlObject;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * JSON 工具类
+ *
+ * @author 芋道源码
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public class JsonUtils {
+
+    private static final ObjectMapper OBJECT_MAPPER = SpringUtil.getBean(ObjectMapper.class);
+
+    public static ObjectMapper getObjectMapper() {
+        return OBJECT_MAPPER;
+    }
+
+    /**
+     * 将对象转换为JSON格式的字符串
+     *
+     * @param object 要转换的对象
+     * @return JSON格式的字符串,如果对象为null,则返回null
+     * @throws RuntimeException 如果转换过程中发生JSON处理异常,则抛出运行时异常
+     */
+    public static String toJsonString(Object object) {
+        if (ObjectUtil.isNull(object)) {
+            return null;
+        }
+        try {
+            return OBJECT_MAPPER.writeValueAsString(object);
+        } catch (JsonProcessingException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 将JSON格式的字符串转换为指定类型的对象
+     *
+     * @param text  JSON格式的字符串
+     * @param clazz 要转换的目标对象类型
+     * @param <T>   目标对象的泛型类型
+     * @return 转换后的对象,如果字符串为空则返回null
+     * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常
+     */
+    public static <T> T parseObject(String text, Class<T> clazz) {
+        if (StringUtils.isEmpty(text)) {
+            return null;
+        }
+        try {
+            return OBJECT_MAPPER.readValue(text, clazz);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 将字节数组转换为指定类型的对象
+     *
+     * @param bytes 字节数组
+     * @param clazz 要转换的目标对象类型
+     * @param <T>   目标对象的泛型类型
+     * @return 转换后的对象,如果字节数组为空则返回null
+     * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常
+     */
+    public static <T> T parseObject(byte[] bytes, Class<T> clazz) {
+        if (ArrayUtil.isEmpty(bytes)) {
+            return null;
+        }
+        try {
+            return OBJECT_MAPPER.readValue(bytes, clazz);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 将JSON格式的字符串转换为指定类型的对象,支持复杂类型
+     *
+     * @param text          JSON格式的字符串
+     * @param typeReference 指定类型的TypeReference对象
+     * @param <T>           目标对象的泛型类型
+     * @return 转换后的对象,如果字符串为空则返回null
+     * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常
+     */
+    public static <T> T parseObject(String text, TypeReference<T> typeReference) {
+        if (StringUtils.isBlank(text)) {
+            return null;
+        }
+        try {
+            return OBJECT_MAPPER.readValue(text, typeReference);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 将JSON格式的字符串转换为Dict对象
+     *
+     * @param text JSON格式的字符串
+     * @return 转换后的Dict对象,如果字符串为空或者不是JSON格式则返回null
+     * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常
+     */
+    public static Dict parseMap(String text) {
+        if (StringUtils.isBlank(text)) {
+            return null;
+        }
+        try {
+            return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructType(Dict.class));
+        } catch (MismatchedInputException e) {
+            // 类型不匹配说明不是json
+            return null;
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 将JSON格式的字符串转换为Dict对象的列表
+     *
+     * @param text JSON格式的字符串
+     * @return 转换后的Dict对象的列表,如果字符串为空则返回null
+     * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常
+     */
+    public static List<Dict> parseArrayMap(String text) {
+        if (StringUtils.isBlank(text)) {
+            return null;
+        }
+        try {
+            return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, Dict.class));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 将JSON格式的字符串转换为指定类型对象的列表
+     *
+     * @param text  JSON格式的字符串
+     * @param clazz 要转换的目标对象类型
+     * @param <T>   目标对象的泛型类型
+     * @return 转换后的对象的列表,如果字符串为空则返回空列表
+     * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常
+     */
+    public static <T> List<T> parseArray(String text, Class<T> clazz) {
+        if (StringUtils.isEmpty(text)) {
+            return new ArrayList<>();
+        }
+        try {
+            return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, clazz));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 将JSON格式的字符串转换为指定类型对象的列表
+     *
+     * @param text  JSON格式的字符串
+     * @param clazz 要转换的目标对象类型
+     * @param <T>   目标对象的泛型类型
+     * @return 转换后的对象的列表,如果字符串为空则返回空列表
+     * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常
+     */
+    public static <T> List<T> parseFileUrlArray(String text, Class<T> clazz) {
+        if (StringUtils.isEmpty(text)) {
+            return new ArrayList<>();
+        }
+        try {
+            return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, clazz));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}

+ 1 - 0
common/common-core/src/main/java/com/tourism/common/core/base/model/BaseModel.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import lombok.Data;
 
 import java.util.Date;
+import java.util.List;
 
 /**
  * 实体对象的公共基类,所有子类均必须包含基类定义的数据表字段和实体对象字段。