feat: 使管理端服务能运行;数据库访问添加对字典、字典值、字典值翻译的支持

This commit is contained in:
曹鹏飞 2025-01-20 10:00:46 +08:00
parent 5c0f4ba91d
commit 131dc542fa
26 changed files with 648 additions and 56 deletions

View File

@ -11,11 +11,28 @@
<version>1.0.0-SNAPSHOT</version>
<name>服务-管理端服务</name>
<description>菜单等公用功能接口</description>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.nflg</groupId>
<artifactId>nflg-mobilebroken-common</artifactId>
</dependency>
<dependency>
<groupId>com.nflg</groupId>
<artifactId>nflg-mobilebroken-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>

View File

@ -1,9 +1,17 @@
package com.nflg.mobilebroken.admin;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
@SpringBootApplication
@MapperScan("com.nflg.mobilebroken.repository.mapper")
@ComponentScan(basePackages = {"com.nflg.mobilebroken"})
@EnableMongoRepositories(basePackages = "com.nflg.mobilebroken.repository.service")
@EnableDiscoveryClient
public class AdminApplication {
public static void main(String[] args) {

View File

@ -0,0 +1,38 @@
package com.nflg.mobilebroken.admin.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.time.format.DateTimeFormatter;
@Configuration
public class JacksonConfig {
// 定义全局日期时间格式
private static final String DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
// 创建并注册 JavaTimeModule设置日期格式化
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(
java.time.LocalDateTime.class,
new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATETIME_FORMAT))
);
// 注册模块到 ObjectMapper
objectMapper.registerModule(javaTimeModule);
// 禁用时间戳默认是 true会序列化为数组
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
return objectMapper;
}
}

View File

@ -1,23 +0,0 @@
package com.nflg.mobilebroken.admin.controller;
import com.nflg.mobilebroken.admin.pojo.MenuVO;
import com.nflg.mobilebroken.common.pojo.ApiResult;
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;
/**
* 菜单管理
* @author 曹鹏飞
*/
@RestController
@RequestMapping("/menu")
public class MenuController {
@GetMapping("all")
public ApiResult<List<MenuVO>> login(String userName, String password) {
return ApiResult.success();
}
}

View File

@ -0,0 +1,46 @@
package com.nflg.mobilebroken.admin.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.nflg.mobilebroken.common.pojo.ApiResult;
import com.nflg.mobilebroken.common.pojo.PageData;
import com.nflg.mobilebroken.common.pojo.request.DictionarySearchRequest;
import com.nflg.mobilebroken.common.pojo.vo.DictionaryVO;
import com.nflg.mobilebroken.repository.service.IDictionaryService;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* 平台管理
* @author 曹鹏飞
*/
@RestController
@RequestMapping("/platform")
public class PlatformController {
@Resource
private IDictionaryService dictionaryService;
/**
* 搜索字典
* @param request 请求参数
* @return 字典列表
*/
@PostMapping("search")
public ApiResult<PageData<DictionaryVO>> search(@RequestBody DictionarySearchRequest request){
IPage<DictionaryVO> page=new Page<>();
page.setCurrent(request.getPageNum());
page.setSize(request.getPageSize());
dictionaryService.search(request,page);
PageData<DictionaryVO> pageData=new PageData<>();
pageData.setPage(page.getCurrent());
pageData.setPageSize(page.getSize());
pageData.setTotal(page.getTotal());
pageData.setItems(page.getRecords());
return ApiResult.success(pageData);
}
}

View File

@ -1,33 +0,0 @@
package com.nflg.mobilebroken.admin.pojo;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
public class MenuVO {
private Integer id;
/**
* 编号
*/
@NotBlank
private String code;
/**
* 名称
*/
private String name;
/**
* 地址
*/
private String url;
/**
* 类型1菜单2-按钮
*/
@NotBlank
private Byte type;
}

View File

@ -0,0 +1,14 @@
# Nacos 地址
nacos.server-addr=112.74.186.154:8848
#spring.cloud.nacos.discovery.username=nacos
#spring.cloud.nacos.discovery.password=ZLQ8vgmjoJ4?EPJ4]fs_
#spring.config.activate.on-profile=dev
logging.level.com.nflg=DEBUG
logging.level.com.alibaba.cloud.nacos.config=DEBUG
#spring.datasource.url=jdbc:mysql://112.74.186.154:13151/mobilebroken?useUnicode=true&characterEncoding=utf8mb4&tinyInt1isBit=false&useSSL=false&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=GMT%2B8
#spring.datasource.username=nflg
#spring.datasource.password=Aciga@2022
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
logging.config=classpath:logback-sit.xml

View File

@ -0,0 +1,27 @@
spring.application.name=admin
spring.profiles.active=dev
server.port=8082
# 设置最大文件大小 (默认为1MB)
spring.servlet.multipart.max-file-size=100MB
# 设置所有文件总大小 (默认为10MB)
spring.servlet.multipart.max-request-size=500MB
#spring.config.import=classpath:application-${spring.profiles.active}.properties,nacos:
#spring.config.import=nacos:
logging.level.root=info
#logging.level.com.alibaba.nacos.client=DEBUG
#logging.level.org.springframework.boot.context.config=DEBUG
#logging.config=classpath:logback-sit.xml
# 启用服务发现自动路由
spring.cloud.gateway.discovery.locator.enabled=true
spring.cloud.nacos.config.namespace=mobilebroken
spring.cloud.nacos.config.group=${spring.profiles.active}
spring.cloud.nacos.config.server-addr=${nacos.server-addr}
spring.cloud.nacos.config.file-extension=properties
spring.cloud.nacos.config.extension-configs[0].data-id=shared.properties
spring.cloud.nacos.config.extension-configs[0].group=${spring.profiles.active}
spring.cloud.nacos.config.extension-configs[0].refresh=true
spring.cloud.nacos.discovery.server-addr=${nacos.server-addr}
spring.cloud.nacos.discovery.namespace=mobilebroken
spring.cloud.nacos.discovery.group=${spring.profiles.active}
spring.cloud.nacos.discovery.metadata.env=${spring.profiles.active}

View File

@ -0,0 +1,71 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true" scan="false" scanPeriod="30 seconds">
<!--定义日志文件的存储地址 -->
<Property name="logDir" value="./logs" />
<Property name="splitSize" value="50MB" />
<!-- 控制台日志, 控制台输出 -->
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder" charset="UTF-8">
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度,%logger:显示类名 %msg日志消息%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %X{traceId} [%thread] %-5level %logger{10} %msg%n</pattern>
</encoder>
</appender>
<!-- 固定窗口滚动策略的日志输出 -->
<appender name="RollingFileAll" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
<file>${logDir}/mobilebroken-admin.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 按日期滚动,每天生成一个文件 -->
<fileNamePattern>${logDir}/%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 保留15天的日志 -->
<maxHistory>15</maxHistory>
<!-- 启动时,是否删除旧的日志文件 -->
<cleanHistoryOnStart>true</cleanHistoryOnStart>
<!-- 单天单个日志最大size -->
<maxFileSize>${splitSize}</maxFileSize>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder" charset="UTF-8">
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%logger:显示类名 %msg日志消息%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %X{traceId} [%thread] %-5level %logger{50} %msg%n</pattern>
</encoder>
</appender>
<!-- error日志 -->
<appender name="ErrorFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>error</level>
</filter>
<file>${logDir}/error/mobilebroken-gateway-error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 按日期滚动,每天生成一个文件 -->
<fileNamePattern>${logDir}/error/%d{yyyy-MM-dd}.%i.error.log</fileNamePattern>
<!-- 保留15天的日志 -->
<maxHistory>30</maxHistory>
<!-- 启动时,是否删除旧的日志文件 -->
<cleanHistoryOnStart>true</cleanHistoryOnStart>
<!-- 单天单个日志最大size -->
<maxFileSize>${splitSize}</maxFileSize>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder" charset="UTF-8">
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%logger:显示类名 %msg日志消息%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %X{traceId} [%thread] %-5level %logger{50} %msg%n</pattern>
</encoder>
</appender>
<logger name="com.nflg" level="DEBUG"/>
<!-- 日志输出级别 -->
<root level="ERROR">
<appender-ref ref="ErrorFile" />
</root>
<root level="DEBUG">
<appender-ref ref="Console" />
<appender-ref ref="RollingFileAll" />
</root>
</configuration>

View File

@ -0,0 +1,13 @@
package com.nflg.mobilebroken.common.pojo.request;
import lombok.Data;
@Data
public class DictionarySearchRequest extends PageRequest {
//字典名称
private String name;
//字典编码
private String code;
}

View File

@ -0,0 +1,38 @@
package com.nflg.mobilebroken.common.pojo.vo;
import java.time.LocalDateTime;
public class DictionaryVO {
private Integer id;
/**
* 名称
*/
private String name;
/**
* 编码
*/
private String code;
/**
* 创建人
*/
private String createBy;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 最后更新人
*/
private String updateBy;
/**
* 最后更新时间
*/
private LocalDateTime updateTime;
}

View File

@ -0,0 +1,58 @@
package com.nflg.mobilebroken.repository.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
* 字典
* </p>
*
* @author 曹鹏飞
* @since 2025-01-20
*/
@Getter
@Setter
@Accessors(chain = true)
public class Dictionary implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 名称
*/
private String name;
/**
* 编码
*/
private String code;
/**
* 创建人
*/
private String createBy;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 最后更新人
*/
private String updateBy;
/**
* 最后更新时间
*/
private LocalDateTime updateTime;
}

View File

@ -0,0 +1,65 @@
package com.nflg.mobilebroken.repository.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
* 字典值
* </p>
*
* @author 曹鹏飞
* @since 2025-01-20
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("dictionary_item")
public class DictionaryItem implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 字典值编码
*/
private String code;
/**
* 字典值名称
*/
private String name;
/**
* 属性值
*/
private String value;
/**
* 创建人
*/
private String createBy;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 最后更新人
*/
private String updateBy;
/**
* 最后更新时间
*/
private LocalDateTime updateTime;
}

View File

@ -0,0 +1,62 @@
package com.nflg.mobilebroken.repository.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
* 字典值翻译
* </p>
*
* @author 曹鹏飞
* @since 2025-01-20
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("dictionary_item_translate")
public class DictionaryItemTranslate implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
/**
* 字典值id
*/
private Integer dictionaryItemId;
/**
* 语言代码
*/
private String languageCode;
/**
* 翻译值
*/
private String value;
/**
* 创建人
*/
private String createBy;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 最后更新人
*/
private String updateBy;
/**
* 最后更新时间
*/
private LocalDateTime updateTime;
}

View File

@ -0,0 +1,16 @@
package com.nflg.mobilebroken.repository.mapper;
import com.nflg.mobilebroken.repository.entity.DictionaryItem;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 字典值 Mapper 接口
* </p>
*
* @author 曹鹏飞
* @since 2025-01-20
*/
public interface DictionaryItemMapper extends BaseMapper<DictionaryItem> {
}

View File

@ -0,0 +1,16 @@
package com.nflg.mobilebroken.repository.mapper;
import com.nflg.mobilebroken.repository.entity.DictionaryItemTranslate;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 字典值翻译 Mapper 接口
* </p>
*
* @author 曹鹏飞
* @since 2025-01-20
*/
public interface DictionaryItemTranslateMapper extends BaseMapper<DictionaryItemTranslate> {
}

View File

@ -0,0 +1,16 @@
package com.nflg.mobilebroken.repository.mapper;
import com.nflg.mobilebroken.repository.entity.Dictionary;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 字典 Mapper 接口
* </p>
*
* @author 曹鹏飞
* @since 2025-01-20
*/
public interface DictionaryMapper extends BaseMapper<Dictionary> {
}

View File

@ -0,0 +1,16 @@
package com.nflg.mobilebroken.repository.service;
import com.nflg.mobilebroken.repository.entity.DictionaryItem;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 字典值 服务类
* </p>
*
* @author 曹鹏飞
* @since 2025-01-20
*/
public interface IDictionaryItemService extends IService<DictionaryItem> {
}

View File

@ -0,0 +1,16 @@
package com.nflg.mobilebroken.repository.service;
import com.nflg.mobilebroken.repository.entity.DictionaryItemTranslate;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 字典值翻译 服务类
* </p>
*
* @author 曹鹏飞
* @since 2025-01-20
*/
public interface IDictionaryItemTranslateService extends IService<DictionaryItemTranslate> {
}

View File

@ -0,0 +1,20 @@
package com.nflg.mobilebroken.repository.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.nflg.mobilebroken.common.pojo.request.DictionarySearchRequest;
import com.nflg.mobilebroken.common.pojo.vo.DictionaryVO;
import com.nflg.mobilebroken.repository.entity.Dictionary;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 字典 服务类
* </p>
*
* @author 曹鹏飞
* @since 2025-01-20
*/
public interface IDictionaryService extends IService<Dictionary> {
void search(DictionarySearchRequest request, IPage<DictionaryVO> page);
}

View File

@ -0,0 +1,20 @@
package com.nflg.mobilebroken.repository.service.impl;
import com.nflg.mobilebroken.repository.entity.DictionaryItem;
import com.nflg.mobilebroken.repository.mapper.DictionaryItemMapper;
import com.nflg.mobilebroken.repository.service.IDictionaryItemService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 字典值 服务实现类
* </p>
*
* @author 曹鹏飞
* @since 2025-01-20
*/
@Service
public class DictionaryItemServiceImpl extends ServiceImpl<DictionaryItemMapper, DictionaryItem> implements IDictionaryItemService {
}

View File

@ -0,0 +1,20 @@
package com.nflg.mobilebroken.repository.service.impl;
import com.nflg.mobilebroken.repository.entity.DictionaryItemTranslate;
import com.nflg.mobilebroken.repository.mapper.DictionaryItemTranslateMapper;
import com.nflg.mobilebroken.repository.service.IDictionaryItemTranslateService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 字典值翻译 服务实现类
* </p>
*
* @author 曹鹏飞
* @since 2025-01-20
*/
@Service
public class DictionaryItemTranslateServiceImpl extends ServiceImpl<DictionaryItemTranslateMapper, DictionaryItemTranslate> implements IDictionaryItemTranslateService {
}

View File

@ -0,0 +1,36 @@
package com.nflg.mobilebroken.repository.service.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nflg.mobilebroken.common.pojo.request.DictionarySearchRequest;
import com.nflg.mobilebroken.repository.entity.Dictionary;
import com.nflg.mobilebroken.repository.mapper.DictionaryMapper;
import com.nflg.mobilebroken.repository.service.IDictionaryService;
import org.springframework.stereotype.Service;
/**
* <p>
* 字典 服务实现类
* </p>
*
* @author 曹鹏飞
* @since 2025-01-20
*/
@Service
public class DictionaryServiceImpl extends ServiceImpl<DictionaryMapper, Dictionary> implements IDictionaryService {
@Override
public void search(DictionarySearchRequest request, IPage page) {
LambdaQueryWrapper<Dictionary> queryWrapper=new LambdaQueryWrapper<>();
if (StrUtil.isNotBlank(request.getName())){
queryWrapper.like(Dictionary::getName,request.getName());
}
if (StrUtil.isNotBlank(request.getCode())){
queryWrapper.like(Dictionary::getCode,request.getCode());
}
queryWrapper.orderByDesc(Dictionary::getId);
baseMapper.selectPage(page,queryWrapper);
}
}

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.nflg.mobilebroken.repository.mapper.DictionaryItemMapper">
</mapper>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.nflg.mobilebroken.repository.mapper.DictionaryItemTranslateMapper">
</mapper>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.nflg.mobilebroken.repository.mapper.DictionaryMapper">
</mapper>