Merge remote-tracking branch 'origin/main'

This commit is contained in:
wangyilin 2024-10-30 11:28:46 +08:00
commit 6963b69b21
26 changed files with 2553 additions and 756 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
</profile>
</component>

View File

@ -3,7 +3,7 @@
<view class="swiperDemo">
<nut-swiper ref="swiperRef" pagination-visible pagination-color="#e53e31" :auto-play="3000" :init-page="0">
<nut-swiper-item v-for="(item, index) in list" :key="index" style="height: 180px">
<image src="@/assets/images/01.png" alt="" style="height: 100%; width: 100%" draggable="false"/>
<image :src="item" alt="" style="height: 100%; width: 100%" draggable="false"/>
</nut-swiper-item>
</nut-swiper>
</view>
@ -30,7 +30,7 @@ import Taro from "@tarojs/taro";
import icon from '@/assets/images/project.png'
import './index.scss'
const list = ref(['https://storage.360buyimg.com/jdc-article/NutUItaro34.jpg',])
const list = ref(['/assets/images/01.png',])
const swiperRef = ref() //
const subModuleList = ref([
{

View File

@ -78,6 +78,10 @@ class CustomRequest {
}
get<T>(url: string, params?: object, options: ApiOptions = {loading: false}): Promise<JsonResult<T>> {
options.header = {
...options.header,
"content-type": 'application/x-www-form-urlencoded'
}
return this.request<T>(url, "GET", options, params)
}
@ -86,6 +90,10 @@ class CustomRequest {
}
delete<T>(url: string, params?: object, options: ApiOptions = {loading: false}): Promise<JsonResult<T>> {
options.header = {
...options.header,
"content-type": 'application/x-www-form-urlencoded'
}
return this.request(url, "DELETE", options, params)
}

View File

@ -228,11 +228,7 @@ const deleteUssrID = (snowFlakeId: string) => {
}
//
const dialogOk = async () => {
await api.delete(`/projectManageIndex/deleteSecurityUserByServiceProjectId`, {securityUserId: securityUserId.value}, {
header: {
"content-type": 'application/x-www-form-urlencoded'
}
})
await api.delete(`/projectManageIndex/deleteSecurityUserByServiceProjectId`, {securityUserId: securityUserId.value})
initServiceProjectSecurityUserList()
}
//

View File

@ -7,53 +7,19 @@ export {}
/* prettier-ignore */
declare module 'vue' {
export interface GlobalComponents {
AAvatar: typeof import('ant-design-vue/es')['Avatar']
AButton: typeof import('ant-design-vue/es')['Button']
ACard: typeof import('ant-design-vue/es')['Card']
ACascader: typeof import('ant-design-vue/es')['Cascader']
ACheckbox: typeof import('ant-design-vue/es')['Checkbox']
ACheckboxGroup: typeof import('ant-design-vue/es')['CheckboxGroup']
ACol: typeof import('ant-design-vue/es')['Col']
AConfigProvider: typeof import('ant-design-vue/es')['ConfigProvider']
ADatePicker: typeof import('ant-design-vue/es')['DatePicker']
ADivider: typeof import('ant-design-vue/es')['Divider']
ADrawer: typeof import('ant-design-vue/es')['Drawer']
ADropdown: typeof import('ant-design-vue/es')['Dropdown']
AForm: typeof import('ant-design-vue/es')['Form']
AFormItem: typeof import('ant-design-vue/es')['FormItem']
AInput: typeof import('ant-design-vue/es')['Input']
AInputNumber: typeof import('ant-design-vue/es')['InputNumber']
AInputPassword: typeof import('ant-design-vue/es')['InputPassword']
ALayout: typeof import('ant-design-vue/es')['Layout']
ALayoutContent: typeof import('ant-design-vue/es')['LayoutContent']
ALayoutHeader: typeof import('ant-design-vue/es')['LayoutHeader']
ALayoutSider: typeof import('ant-design-vue/es')['LayoutSider']
AMenu: typeof import('ant-design-vue/es')['Menu']
AMenuItem: typeof import('ant-design-vue/es')['MenuItem']
AModal: typeof import('ant-design-vue/es')['Modal']
APagination: typeof import('ant-design-vue/es')['Pagination']
APopconfirm: typeof import('ant-design-vue/es')['Popconfirm']
APopover: typeof import('ant-design-vue/es')['Popover']
ARadio: typeof import('ant-design-vue/es')['Radio']
ARadioGroup: typeof import('ant-design-vue/es')['RadioGroup']
ARangePicker: typeof import('ant-design-vue/es')['RangePicker']
ARow: typeof import('ant-design-vue/es')['Row']
ASelect: typeof import('ant-design-vue/es')['Select']
ASelectOption: typeof import('ant-design-vue/es')['SelectOption']
ASpace: typeof import('ant-design-vue/es')['Space']
ASpin: typeof import('ant-design-vue/es')['Spin']
ASubMenu: typeof import('ant-design-vue/es')['SubMenu']
ATable: typeof import('ant-design-vue/es')['Table']
ATabPane: typeof import('ant-design-vue/es')['TabPane']
ATabs: typeof import('ant-design-vue/es')['Tabs']
ATag: typeof import('ant-design-vue/es')['Tag']
ATextarea: typeof import('ant-design-vue/es')['Textarea']
ATimePicker: typeof import('ant-design-vue/es')['TimePicker']
ATimeRangePicker: typeof import('ant-design-vue/es')['TimeRangePicker']
ATooltip: typeof import('ant-design-vue/es')['Tooltip']
ATreeSelect: typeof import('ant-design-vue/es')['TreeSelect']
FormProMax: typeof import('./src/components/form/FormProMax.vue')['default']
HelloWorld: typeof import('./src/components/HelloWorld.vue')['default']
IconFont: typeof import('./src/components/iconfont/IconFont.vue')['default']
Layout: typeof import('./src/components/layout/layout.vue')['default']
LayoutHeader: typeof import('./src/components/layout/header/LayoutHeader.vue')['default']
@ -61,7 +27,6 @@ declare module 'vue' {
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
SingleImageFileUpload: typeof import('./src/components/upload/SingleImageFileUpload.vue')['default']
Sliber: typeof import('./src/components/layout/sliber/sliber.vue')['default']
SystemMenus: typeof import('./src/components/layout/SystemMenus.vue')['default']
TableProMax: typeof import('./src/components/table/TableProMax.vue')['default']
TelephoneLogin: typeof import('./src/components/login/TelephoneLogin.vue')['default']

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -0,0 +1,17 @@
package com.changhu.common.annotation;
import com.changhu.common.enums.OpenApiType;
import java.lang.annotation.*;
/**
* @author 20252
* @createTime 2024/10/9 下午5:14
* @desc 检查openApi
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CheckOpenApi {
OpenApiType value();
}

View File

@ -0,0 +1,21 @@
package com.changhu.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
import java.util.List;
/**
* @author 20252
* @createTime 2024/10/9 下午5:10
* @desc OpenApiType...
*/
@Getter
@AllArgsConstructor
public enum OpenApiType {
Information_on_enterprises_and_institutions("获取企事业单位信息", Arrays.asList("1fe0aaf3-45a4-4be3-a989-75e914a3f36e", "1fe0aaf3-45a4-a989-75e914a3f36e"));
private final String desc;
private final List<String> openApiKeys;
}

View File

@ -52,8 +52,16 @@ public class JavaClassToTsUtil {
* @return ts类型
*/
private static String convertJavaTypeToTS(Class<?> type) {
Set<Class<?>> stringList = Set.of(String.class);
Set<Class<?>> boolList = Set.of(Boolean.class, boolean.class);
Set<Class<?>> stringList = Set.of(
String.class,
LocalDateTime.class,
LocalDate.class,
LocalTime.class
);
Set<Class<?>> boolList = Set.of(
Boolean.class,
boolean.class
);
Set<Class<?>> numberList = Set.of(
Integer.class, int.class,
Double.class, double.class,
@ -63,15 +71,12 @@ public class JavaClassToTsUtil {
BigDecimal.class,
Byte.class, byte.class
);
Set<Class<?>> dateList = Set.of(LocalDateTime.class, LocalDate.class, LocalTime.class);
if (stringList.contains(type)) {
return "string";
} else if (boolList.contains(type)) {
return "boolean";
} else if (numberList.contains(type)) {
return "number";
} else if (dateList.contains(type)) {
return "Dayjs";
} else {
return "unsupported";
}

View File

@ -3,9 +3,11 @@ package com.changhu.config;
import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.stp.StpUtil;
import com.changhu.support.interceptor.JsonBodyInterceptor;
import com.changhu.support.interceptor.OpenApiInterceptor;
import com.changhu.support.interceptor.UserTypeInterceptor;
import org.jetbrains.annotations.NotNull;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@ -25,6 +27,7 @@ public class WebConfig implements WebMvcConfigurer {
public WebConfig() {
whiteList.add("/common/**");
whiteList.add("/open/**");
whiteList.add("/test/**");
whiteList.add("/login");
whiteList.add("/logout");
@ -55,6 +58,20 @@ public class WebConfig implements WebMvcConfigurer {
registry.addInterceptor(new JsonBodyInterceptor());
// 注册clientType 拦截器 用于校验当前用户是否匹配操作客户端
registry.addInterceptor(new UserTypeInterceptor());
// 注册开放接口 拦截器 用于校验第三方是否携带指定apiKey
registry.addInterceptor(new OpenApiInterceptor())
.addPathPatterns("/open/**");
}
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOriginPatterns("*")
.allowedMethods("GET", "POST", "OPTION", "PUT", "DELETE")
.allowedHeaders("Content-Type", "X-Requested-With", "accept", "Origin", "Access-Control-Request-Method",
"Access-Control-Request-Headers", "Authorization","Token","*")
.allowCredentials(true)
.maxAge(3600);
}
@Override

View File

@ -0,0 +1,47 @@
package com.changhu.controller;
import cn.hutool.core.util.IdUtil;
import com.changhu.common.annotation.CheckOpenApi;
import com.changhu.common.annotation.JsonBody;
import com.changhu.common.enums.OpenApiType;
import com.changhu.common.pojo.vo.SelectNodeVo;
import com.changhu.pojo.dto.EnterprisesUnitDetailDTO;
import com.changhu.service.OpenApiService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
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 java.util.List;
/**
* @author 20252
* @createTime 2024/10/9 下午5:02
* @desc 可以给第三方对接的controller
*/
@Tag(name = "开放接口")
@JsonBody
@RequestMapping("/open")
public class OpenController {
@Autowired
private OpenApiService openApiService;
@Operation(summary = "获取企事业单位列表")
@CheckOpenApi(value = OpenApiType.Information_on_enterprises_and_institutions)
@GetMapping("/getEnterprisesUnit")
public List<SelectNodeVo<Long>> getEnterprisesUnit(@Schema(description = "行政区划代码") @RequestParam String code,
@Schema(description = "行政区划等级") @RequestParam Integer level) {
return openApiService.getEnterprisesUnit(code, level);
}
@Operation(summary = "企事业单位详情")
@CheckOpenApi(value = OpenApiType.Information_on_enterprises_and_institutions)
@GetMapping("/enterprisesUnitDetailById")
public EnterprisesUnitDetailDTO enterprisesUnitDetailById(@Schema(description = "企事业单位id") @RequestParam Long enterprisesUnitId) {
return openApiService.enterprisesUnitDetailById(enterprisesUnitId);
}
}

View File

@ -6,6 +6,8 @@ import com.changhu.module.management.pojo.entity.ServiceProject;
import com.changhu.module.management.pojo.queryParams.ServiceProjectPagerQueryParams;
import com.changhu.module.management.pojo.vo.ServiceProjectPagerVo;
import com.changhu.module.miniProgram.pojo.vo.IndexServiceProjectListVo;
import com.changhu.pojo.dto.EnterprisesUnitDetailDTO;
import com.changhu.pojo.dto.ServiceProjectDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@ -36,4 +38,12 @@ public interface ServiceProjectMapper extends BaseMapper<ServiceProject> {
*/
List<IndexServiceProjectListVo> getServiceProjectList(@Param("policeUnitId") Long policeUnitId,
@Param("projectManagerMiniProgramUserId") Long projectManagerMiniProgramUserId);
/**
* 获取企事业单位下的服务项目
*
* @param enterprisesUnitId 企事业单位id
* @return 服务项目列表
*/
List<ServiceProjectDTO> getServiceProjectByEnterprisesUnitId(@Param("enterprisesUnitId") Long enterprisesUnitId);
}

View File

@ -6,8 +6,12 @@ import com.changhu.module.management.pojo.entity.ServiceProject;
import com.changhu.module.management.pojo.params.ServiceProjectSaveOrUpdateParams;
import com.changhu.module.management.pojo.queryParams.ServiceProjectPagerQueryParams;
import com.changhu.module.management.pojo.vo.ServiceProjectPagerVo;
import com.changhu.pojo.dto.EnterprisesUnitDetailDTO;
import com.changhu.pojo.dto.ServiceProjectDTO;
import com.changhu.support.mybatisplus.pojo.params.PageParams;
import java.util.List;
/**
* service_project (服务项目) 服务类
* author: luozhun
@ -29,4 +33,12 @@ public interface ServiceProjectService extends IService<ServiceProject> {
* @param params 参数
*/
void saveOrUpdate(ServiceProjectSaveOrUpdateParams params);
/**
* 获取企事业单位下的服务项目
*
* @param enterprisesUnitId 企事业单位id
* @return 服务项目列表
*/
List<ServiceProjectDTO> getServiceProjectByEnterprisesUnitId(Long enterprisesUnitId);
}

View File

@ -11,9 +11,13 @@ import com.changhu.module.management.pojo.params.ServiceProjectSaveOrUpdateParam
import com.changhu.module.management.pojo.queryParams.ServiceProjectPagerQueryParams;
import com.changhu.module.management.pojo.vo.ServiceProjectPagerVo;
import com.changhu.module.management.service.ServiceProjectService;
import com.changhu.pojo.dto.EnterprisesUnitDetailDTO;
import com.changhu.pojo.dto.ServiceProjectDTO;
import com.changhu.support.mybatisplus.pojo.params.PageParams;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* service_project (服务项目) 服务实现类
* author: luozhun
@ -36,4 +40,9 @@ public class ServiceProjectServiceImpl extends ServiceImpl<ServiceProjectMapper,
throw new MessageException();
}
}
@Override
public List<ServiceProjectDTO> getServiceProjectByEnterprisesUnitId(Long enterprisesUnitId) {
return baseMapper.getServiceProjectByEnterprisesUnitId(enterprisesUnitId);
}
}

View File

@ -3,6 +3,7 @@ package com.changhu.module.miniProgram.pojo.entity;
import java.io.Serial;
import java.io.Serializable;
import com.changhu.common.db.enums.Sex;
import com.changhu.support.mybatisplus.pojo.entity.BaseEntity;
import lombok.Data;
import lombok.AllArgsConstructor;
@ -56,7 +57,7 @@ public class SecurityUser extends BaseEntity implements Serializable {
/**
* 性别
*/
private Integer sex;
private Sex sex;
/**
* 籍贯

View File

@ -0,0 +1,43 @@
package com.changhu.pojo.dto;
import cn.hutool.core.util.DesensitizedUtil;
import com.changhu.common.annotation.Desensitized;
import com.changhu.common.db.enums.IsOrNot;
import com.changhu.common.db.enums.ServiceProjectType;
import com.changhu.common.db.enums.Sex;
import com.changhu.module.management.pojo.model.ContactPersonInfo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
import java.util.List;
/**
* @author 20252
* @createTime 2024/10/10 上午9:13
* @desc EnterprisesUnitDetailDTO...
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class EnterprisesUnitDetailDTO {
@Schema(description = "企事业单位id")
private Long snowFlakeId;
@Schema(description = "名字")
private String name;
@Schema(description = "地址")
private String address;
@Schema(description = "联系人")
private ContactPersonInfo contactPersonInfo;
@Schema(description = "备注")
private String remark;
@Schema(description = "创建时间")
private LocalDateTime createTime;
@Schema(description = "服务项目列表")
private List<ServiceProjectDTO> serviceProjectList;
}

View File

@ -0,0 +1,110 @@
package com.changhu.pojo.dto;
import com.alibaba.fastjson2.annotation.JSONField;
import com.changhu.common.db.enums.IsOrNot;
import com.changhu.common.db.enums.ServiceProjectType;
import com.changhu.common.db.enums.Sex;
import com.changhu.module.management.pojo.model.LegalPersonInfo;
import com.changhu.support.fastjson2.serializer.MinioPrefixSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
/**
* @author 20252
* @createTime 2024/10/10 上午9:35
* @desc ServiceProjectDTO...
*/
@Data
public class ServiceProjectDTO {
@Schema(description = "服务项目id")
private Long snowFlakeId;
@Schema(description = "项目经理信息")
private ProjectManagerInfo projectManagerInfo;
@Schema(description = "保安单位信息")
private SecurityUnitInfo securityUnitInfo;
@Schema(description = "名字")
private String name;
@Schema(description = "类型")
private ServiceProjectType type;
@Schema(description = "是否自招保安")
private IsOrNot isRecruitSecurity;
@Schema(description = "保安证号")
private String idNumber;
@Schema(description = "服务面积")
private Double serviceArea;
@Schema(description = "楼栋数量")
private Integer buildingTotal;
@Schema(description = "户数")
private Integer houseTotal;
@Schema(description = "工作人员数量")
private Integer staffTotal;
@Schema(description = "保安人员数量")
private Integer securityUserTotal;
@Schema(description = "备注")
private String remark;
@Schema(description = "创建时间")
private LocalDateTime createTime;
@Schema(description = "保安人员列表")
private List<SecurityUserInfo> securityUserList;
@Data
static class SecurityUnitInfo {
@Schema(description = "保安单位名称")
private String name;
@Schema(description = "统一社会编码")
private String socialCode;
@JSONField(serializeUsing = MinioPrefixSerializer.class)
@Schema(description = "营业执照")
private String businessLicense;
@Schema(description = "法人信息")
private LegalPersonInfo legalPersonInfo;
@Schema(description = "详细地址")
private String address;
@Schema(description = "公司性质")
private String nature;
}
@Data
static class ProjectManagerInfo {
@Schema(description = "名称")
private String name;
@Schema(description = "性别")
private Sex sex;
@Schema(description = "手机号")
private String telephone;
@Schema(description = "身份证")
private String idCard;
}
@Data
static class SecurityUserInfo {
@Schema(description = "id")
private Long snowFlakeId;
@Schema(description = "名字")
private String name;
@Schema(description = "手机号")
private String telephone;
@Schema(description = "工作岗位")
private String workPost;
@Schema(description = "性别")
private Sex sex;
@Schema(description = "户籍地")
private String nativePlace;
@Schema(description = "身份证")
private String idCard;
@Schema(description = "出身日期")
private java.time.LocalDate dateOfBirth;
@Schema(description = "保安证号")
private String securityNumber;
@Schema(description = "家庭住址")
private String homeAddress;
@Schema(description = "备注")
private String remark;
@Schema(description = "创建时间")
private String createTime;
}
}

View File

@ -0,0 +1,30 @@
package com.changhu.service;
import com.changhu.common.pojo.vo.SelectNodeVo;
import com.changhu.pojo.dto.EnterprisesUnitDetailDTO;
import java.util.List;
/**
* @author 20252
* @createTime 2024/10/9 下午5:28
* @desc 开放接口
*/
public interface OpenApiService {
/**
* 获取企事业单位列表
*
* @param code 行政区划代码
* @param level 行政区划等级
* @return 企事业单位列表
*/
List<SelectNodeVo<Long>> getEnterprisesUnit(String code, Integer level);
/**
* 企事业单位详情
*
* @param enterprisesUnitId 单位id
* @return 企事业单位详情
*/
EnterprisesUnitDetailDTO enterprisesUnitDetailById(Long enterprisesUnitId);
}

View File

@ -0,0 +1,60 @@
package com.changhu.service.impl;
import com.baomidou.mybatisplus.extension.toolkit.Db;
import com.changhu.common.exception.MessageException;
import com.changhu.common.pojo.vo.SelectNodeVo;
import com.changhu.module.management.pojo.entity.EnterprisesUnit;
import com.changhu.module.management.service.ServiceProjectService;
import com.changhu.pojo.dto.EnterprisesUnitDetailDTO;
import com.changhu.pojo.dto.ServiceProjectDTO;
import com.changhu.service.OpenApiService;
import com.changhu.support.mybatisplus.pojo.entity.BaseEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author 20252
* @createTime 2024/10/9 下午5:29
* @desc OpenApiServiceImpl...
*/
@Service
public class OpenApiServiceImpl implements OpenApiService {
@Autowired
private ServiceProjectService serviceProjectService;
@Override
public List<SelectNodeVo<Long>> getEnterprisesUnit(String code, Integer level) {
return Db.lambdaQuery(EnterprisesUnit.class)
.eq(level == 1, EnterprisesUnit::getProvince, code)
.eq(level == 2, EnterprisesUnit::getCity, code)
.eq(level == 3, EnterprisesUnit::getDistricts, code)
.eq(level == 4, EnterprisesUnit::getStreet, code)
.list()
.stream()
.map(item -> SelectNodeVo.<Long>builder()
.value(item.getSnowFlakeId())
.label(item.getName())
.build())
.toList();
}
@Override
public EnterprisesUnitDetailDTO enterprisesUnitDetailById(Long enterprisesUnitId) {
return Db.lambdaQuery(EnterprisesUnit.class)
.eq(BaseEntity::getSnowFlakeId, enterprisesUnitId)
.oneOpt()
.map(item -> EnterprisesUnitDetailDTO.builder()
.snowFlakeId(item.getSnowFlakeId())
.name(item.getName())
.address(item.getAddress())
.contactPersonInfo(item.getContactPersonInfo())
.remark(item.getRemark())
.serviceProjectList(serviceProjectService.getServiceProjectByEnterprisesUnitId(item.getSnowFlakeId()))
.createTime(item.getCreateTime())
.build())
.orElseThrow(() -> new MessageException("企事业单位不存在"));
}
}

View File

@ -0,0 +1,27 @@
package com.changhu.support.fastjson2.serializer;
import cn.hutool.extra.spring.SpringUtil;
import com.alibaba.fastjson2.JSONWriter;
import com.alibaba.fastjson2.writer.ObjectWriter;
import java.lang.reflect.Type;
/**
* @author 20252
* @createTime 2024/10/10 下午3:19
* @desc MinioPrefixSerializer...
*/
public class MinioPrefixSerializer implements ObjectWriter<String> {
private final String minioPrefix = SpringUtil.getProperty("minio.url");
public static final MinioPrefixSerializer instance = new MinioPrefixSerializer();
private MinioPrefixSerializer() {
}
@Override
public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) {
jsonWriter.writeString(minioPrefix + object);
}
}

View File

@ -0,0 +1,38 @@
package com.changhu.support.interceptor;
import com.changhu.common.annotation.CheckOpenApi;
import com.changhu.common.exception.MessageException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import java.time.LocalDateTime;
import java.util.List;
/**
* @author 20252
* @createTime 2024/10/9 下午5:05
* @desc OpenApiInterceptor...
*/
@Slf4j
public class OpenApiInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Object handler) {
String header = request.getHeader("X-API-KEY");
log.info("apiKey:{} {} 请求:{}", header, LocalDateTime.now(), request.getRequestURI());
if (handler instanceof HandlerMethod handlerMethod) {
CheckOpenApi methodAnnotation = handlerMethod.getMethodAnnotation(CheckOpenApi.class);
if (methodAnnotation != null) {
List<String> openApiKeys = methodAnnotation.value().getOpenApiKeys();
if (!openApiKeys.contains(header)) {
throw new MessageException("openApiKey error!");
}
}
}
return true;
}
}

View File

@ -23,7 +23,7 @@ knife4j:
spring:
application:
# 服务名称
name: managementDevServer
name: policeSecurityDevServer
servlet:
multipart:
# 设置单个文件最大大小为500MB
@ -90,10 +90,10 @@ spring:
cache-names: common
data:
redis:
database: 10
password: lonsung301
database: 1
password: redis_csPDNr
port: 6380
host: 172.10.10.238
host: 118.253.177.137
timeout: 10s
lettuce:
pool:
@ -116,7 +116,7 @@ logging:
config: classpath:conf/log4j2.xml
minio:
url: http://118.253.177.137:9000
url: https://www.hnjinglian.cn:9000
accessKey: admin
secretKey: lonsung301
bucketName: police-security-dev

View File

@ -1,5 +1,5 @@
server:
port: 8090
port: 8765
springdoc:
swagger-ui:
@ -23,10 +23,7 @@ knife4j:
spring:
application:
# 服务名称
name: managementProdServer
mvc:
# 如果找不到对应的handler 就抛出404异常
throw-exception-if-no-handler-found: true
name: policeSecurityProdServer
servlet:
multipart:
# 设置单个文件最大大小为500MB
@ -42,9 +39,9 @@ spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://172.10.10.238:3306/management_prod?serverTimezone=Asia/Shanghai&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false
username: management_prod
password: lonsung301
url: jdbc:mysql://118.253.177.137:3306/police_security_dev?serverTimezone=Asia/Shanghai&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false
username: police_security_dev
password: GejDeCNj3ZBSNxSP
# druid 连接池管理
druid:
# 初始化时建立物理连接的个数
@ -91,17 +88,12 @@ spring:
cache:
type: redis
cache-names: common
mail:
host: smtp.qq.com
port: 587
username: 2025254074@qq.com
password: vgkvmhlwfogucbfd
data:
redis:
database: 0
password: lonsung301
password: redis_csPDNr
port: 6380
host: 172.10.10.238
host: 118.253.177.137
timeout: 10s
lettuce:
pool:
@ -124,10 +116,10 @@ logging:
config: classpath:conf/log4j2.xml
minio:
url: http://172.10.10.238:9000
url: https://www.hnjinglian.cn:9000
accessKey: admin
secretKey: lonsung301
bucketName: management-prod
bucketName: police-security-dev
sa-token:
# token 名称(同时也是 cookie 名称)
@ -146,6 +138,16 @@ sa-token:
is-log: true
# 是否尝试从 cookie 里读取 token
is-read-cookie: false
# jwt秘钥
jwt-secret-key: a29216f8-cd60-4e96-89c5-ab6012159052
wx:
miniapp:
#微信小程序的appid
appid: wx0acd1c4fcf94bdd3
#微信小程序的Secret
secret: 4b700dbacb42ef258537ddc61d964a17
msgDataFormat: JSON
project:
env: prod

View File

@ -82,4 +82,56 @@
group by eu.snow_flake_id
order by any_value(sp.create_time) desc;
</select>
<resultMap id="ServiceProjectDTOResultMap" type="com.changhu.pojo.dto.ServiceProjectDTO">
<result
column="projectManagerInfo"
typeHandler="com.baomidou.mybatisplus.extension.handlers.Fastjson2TypeHandler"
property="projectManagerInfo"/>
<result
column="securityUnitInfo"
typeHandler="com.baomidou.mybatisplus.extension.handlers.Fastjson2TypeHandler"
property="securityUnitInfo" />
<result
column="securityUserList"
typeHandler="com.baomidou.mybatisplus.extension.handlers.Fastjson2TypeHandler"
property="securityUserList" />
</resultMap>
<select id="getServiceProjectByEnterprisesUnitId" resultMap="ServiceProjectDTOResultMap">
SELECT
sp.*,
IF(mpu.snow_flake_id IS NOT NULL,json_object( 'name', mpu.NAME, 'sex', mpu.sex, 'telephone', mpu.telephone, 'idCard', mpu.id_card ),NULL) AS 'projectManagerInfo',
json_object(
'name',su1.name,
'socialCode',su1.social_code,
'businessLicense',su1.business_license,
'legalPersonInfo',su1.legal_person_info,
'address',su1.address,
'nature',su1.nature
) as 'securityUnitInfo',
if(COUNT(su.snow_flake_id)>0,JSON_ARRAYAGG(json_object(
'snowFlakeId',su.snow_flake_id,
'name',su.name,
'telephone',su.telephone,
'workPost',su.work_post,
'sex',su.sex,
'nativePlace',su.native_place,
'idCard',su.id_card,
'dateOfBirth',su.date_of_birth,
'securityNumber',su.security_number,
'homeAddress',su.home_address,
'remark',su.remark,
'createTime',su.create_time
)),JSON_ARRAY()) as 'securityUserList'
FROM
service_project sp
left join security_unit su1 on sp.security_unit_id = su1.snow_flake_id
LEFT JOIN mini_program_user mpu ON sp.project_manager_mini_program_user_id = mpu.snow_flake_id AND mpu.identity = 'project_manager'
left join security_user su on su.service_project_id = sp.snow_flake_id and su.delete_flag = 0
WHERE
sp.delete_flag = 0
AND sp.enterprises_unit_id = #{enterprisesUnitId}
group by sp.snow_flake_id
ORDER BY
sp.create_time DESC
</select>
</mapper>