1
luodangjia
2025-01-20 ee44a74a7f3674b1f019c823f3f459a2b08c8bd6
1
1 文件已重命名
24个文件已修改
1个文件已删除
12个文件已添加
914 ■■■■■ 已修改文件
pom.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/pom.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-company/pom.xml 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-company/src/main/java/com/ruoyi/company/api/RemoteCompanyUserService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-company/src/main/java/com/ruoyi/company/api/domain/Company.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-company/src/main/java/com/ruoyi/company/api/domain/User.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-company/src/main/java/com/ruoyi/company/api/factory/RemoteCompanyUserServiceFallbackFactory.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-company/src/main/java/com/ruoyi/company/api/model/RegisterUser.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-company/src/main/java/com/ruoyi/company/api/model/UserDetail.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-company/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/pom.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/pom.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java 57 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/resources/bootstrap.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/aspect/SpringTxAspect.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/CacheConstants.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/ServiceNameConstants.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/pom.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-swagger/src/main/java/com/ruoyi/common/swagger/config/SpringDocAutoConfiguration.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/RouterFunctionConfiguration.java 69 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/resources/bootstrap.yml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-company/pom.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/controller/UserController.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/mapper/CompanyMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/mapper/UserMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/service/CompanyService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/service/UserService.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/service/impl/CompanyServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/service/impl/UserServiceImpl.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/utils/ObsUploadUtil.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-company/src/main/resources/bootstrap.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-company/src/test/java/com/ruoyi/AppTest.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/config/ResourcesConfig.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-file/src/main/resources/bootstrap.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/pom.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/vue.config.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -282,6 +282,12 @@
                <version>${ruoyi.version}</version>
            </dependency>
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-api-company</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
ruoyi-api/pom.xml
@@ -10,6 +10,7 @@
    <modules>
        <module>ruoyi-api-system</module>
        <module>ruoyi-api-company</module>
    </modules>
    <artifactId>ruoyi-api</artifactId>
ruoyi-api/ruoyi-api-company/pom.xml
New file
@@ -0,0 +1,36 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.ruoyi</groupId>
        <artifactId>ruoyi-api</artifactId>
        <version>3.6.5</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>ruoyi-api-company</artifactId>
    <description>
        ruoyi-api-company企业模块
    </description>
    <dependencies>
        <!-- RuoYi Common Core-->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-common-core</artifactId>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-common-swagger</artifactId>
        </dependency>
    </dependencies>
</project>
ruoyi-api/ruoyi-api-company/src/main/java/com/ruoyi/company/api/RemoteCompanyUserService.java
New file
@@ -0,0 +1,17 @@
package com.ruoyi.company.api;
import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.company.api.factory.RemoteCompanyUserServiceFallbackFactory;
import com.ruoyi.company.api.model.RegisterUser;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
@FeignClient(contextId = "remoteCompanyUserService", value = ServiceNameConstants.COMPANY_SERVICE, fallbackFactory = RemoteCompanyUserServiceFallbackFactory.class)
public interface RemoteCompanyUserService {
    @PostMapping("/user/register")
    public R<Boolean> registerUser(@RequestBody RegisterUser registerUser, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
}
ruoyi-api/ruoyi-api-company/src/main/java/com/ruoyi/company/api/domain/Company.java
New file
@@ -0,0 +1,73 @@
package com.ruoyi.company.api.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@TableName("t_company")
public class Company {
    /** 主键 */
    @TableId
    private Long id;
    /** 公司名称 */
    private String companyName;
    /** 统一社会信用代码 */
    private String socialCode;
    /** 省份代码 */
    private String provinceCode;
    /** 城市代码 */
    private String cityCode;
    /** 区域代码 */
    private String districtCode;
    /** 经营地址 */
    private String businessAddress;
    /** 身份证正面照片 */
    private String idCardFrontUrl;
    /** 身份证反面照片 */
    private String idCardBackUrl;
    /** 法人姓名 */
    private String legalPersonName;
    /** 身份证号码 */
    private String idCardNumber;
    /** 营业执照照片 */
    private String businessLicenseUrl;
    /** 资质类目:1-再生资源回收备案资质 2-家电拆解资质 3-报废机动车回收拆解资质 4-危险废物经营许可证 0-其他证书 */
    private Integer category;
    /** 拆解企业资质证书图片地址 */
    private String certificateUrl;
    /** 联系人姓名 */
    private String contactName;
    /** 联系人手机号 */
    private String contactPhone;
    /** 联系人邮箱 */
    private String email;
    /** 创建时间 */
    private LocalDateTime createTime;
    /** 更新时间 */
    private LocalDateTime updateTime;
    /** 是否删除 */
    private Boolean isDelete;
}
ruoyi-api/ruoyi-api-company/src/main/java/com/ruoyi/company/api/domain/User.java
File was renamed from ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/domain/User.java
@@ -1,4 +1,4 @@
package com.ruoyi.company.domain;
package com.ruoyi.company.api.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
@@ -11,20 +11,28 @@
@Data
public class User {
    @TableId
    /** 用户id */
    private Long userId;
    /** 账号 */
    private String accountName;
    /** 密码 */
    private String password;
    /** 手机号 */
    private String phone;
    /** 状态:1-激活 2-禁用 */
    private Integer status;
    /** 创建时间 */
    private LocalDateTime createTime;
    /** 更新时间 */
    private LocalDateTime updateTime;
    /** 是否删除 */
    @TableLogic
    private Boolean isDelete;
}
ruoyi-api/ruoyi-api-company/src/main/java/com/ruoyi/company/api/factory/RemoteCompanyUserServiceFallbackFactory.java
New file
@@ -0,0 +1,26 @@
package com.ruoyi.company.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.company.api.RemoteCompanyUserService;
import com.ruoyi.company.api.model.RegisterUser;
import lombok.extern.log4j.Log4j2;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PostMapping;
@Component
@Log4j2
public class RemoteCompanyUserServiceFallbackFactory implements FallbackFactory<RemoteCompanyUserService> {
    @Override
    public RemoteCompanyUserService create(Throwable cause) {
       log.error("企业服务远程调用失败:{}", cause.getMessage());
        return new RemoteCompanyUserService() {
            @PostMapping("/user/register")
            @Override
            public R<Boolean> registerUser(RegisterUser registerUser, String source) {
                return R.fail("用户注册失败:"+cause.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-company/src/main/java/com/ruoyi/company/api/model/RegisterUser.java
New file
@@ -0,0 +1,86 @@
package com.ruoyi.company.api.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class RegisterUser {
    @Schema(description = "账号名称")
    private String accountName;
    @Schema(description = "密码")
    private String password;
    @Schema(description = "手机号")
    private String phone;
    @Schema(description = "短信验证码")
    private String smsCode;
    /** 公司名称 */
    @Schema(description = "公司名称")
    private String companyName;
    /** 统一社会信用代码 */
    @Schema(description = "统一社会信用代码")
    private String socialCode;
    /** 省份代码 */
    @Schema(description = "省份代码")
    private String provinceCode;
    /** 城市代码 */
    @Schema(description = "城市代码")
    private String cityCode;
    /** 区域代码 */
    @Schema(description = "区域代码")
    private String districtCode;
    /** 经营地址 */
    @Schema(description = "经营地址")
    private String businessAddress;
    /** 身份证正面照片 */
    @Schema(description = "身份证正面照片")
    private String idCardFrontUrl;
    /** 身份证反面照片 */
    @Schema(description = "身份证反面照片")
    private String idCardBackUrl;
    /** 法人姓名 */
    @Schema(description = "法人姓名")
    private String legalPersonName;
    /** 身份证号码 */
    @Schema(description = "身份证号码")
    private String idCardNumber;
    /** 营业执照照片 */
    @Schema(description = "营业执照照片")
    private String businessLicenseUrl;
    /** 资质类目:1-再生资源回收备案资质 2-家电拆解资质 3-报废机动车回收拆解资质 4-危险废物经营许可证 0-其他证书 */
    @Schema(description = "资质类目:1-再生资源回收备案资质 2-家电拆解资质 3-报废机动车回收拆解资质 4-危险废物经营许可证 0-其他证书")
    private Integer category;
    /** 拆解企业资质证书图片地址 */
    @Schema(description = "拆解企业资质证书图片地址")
    private String certificateUrl;
    /** 联系人姓名 */
    @Schema(description = "联系人姓名")
    private String contactName;
    /** 联系人手机号 */
    @Schema(description = "联系人手机号")
    private String contactPhone;
    /** 联系人邮箱 */
    @Schema(description = "联系人邮箱")
    private String email;
}
ruoyi-api/ruoyi-api-company/src/main/java/com/ruoyi/company/api/model/UserDetail.java
New file
@@ -0,0 +1,46 @@
package com.ruoyi.company.api.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class UserDetail {
    private Long userId;
    @Schema(description = "公司名称")
    private String companyName;
    /** 统一社会信用代码 */
    private String socialCode;
    /** 联系人姓名 */
    private String contactName;
    /** 联系人手机号 */
    private String contactPhone;
    /** 联系人邮箱 */
    private String email;
    /** 账号 */
    private String accountName;
    /** 用户名称 */
    private String userName;
    /** 注册时间 */
    private LocalDateTime registerTime;
    /** 绑定手机号 */
    private String phone;
    /** 账号ID */
    private Long accountId;
    /** 登录密码 */
    private String password;
}
ruoyi-api/ruoyi-api-company/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
New file
@@ -0,0 +1 @@
com.ruoyi.company.api.factory.RemoteCompanyUserServiceFallbackFactory
ruoyi-api/ruoyi-api-system/pom.xml
@@ -22,6 +22,11 @@
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-common-core</artifactId>
        </dependency>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-common-swagger</artifactId>
        </dependency>
        
    </dependencies>
ruoyi-auth/pom.xml
@@ -51,6 +51,18 @@
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-common-security</artifactId>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!-- RuoYi Common Swagger -->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-common-swagger</artifactId>
        </dependency>
        
    </dependencies>
    
ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java
@@ -1,6 +1,12 @@
package com.ruoyi.auth.controller;
import javax.servlet.http.HttpServletRequest;
import com.ruoyi.common.core.constant.CacheConstants;
import com.ruoyi.common.core.constant.Constants;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.company.api.model.RegisterUser;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PostMapping;
@@ -17,6 +23,8 @@
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.system.api.model.LoginUser;
import java.util.concurrent.TimeUnit;
/**
 * token 控制
 * 
@@ -30,6 +38,10 @@
    @Autowired
    private SysLoginService sysLoginService;
    @Autowired
    private RedisService redisService;
    @PostMapping("login")
    public R<?> login(@RequestBody LoginBody form)
@@ -68,11 +80,39 @@
        return R.ok();
    }
    @PostMapping("register")
    public R<?> register(@RequestBody RegisterBody registerBody)
    @PostMapping("companyRegister")
    @Operation(summary = "用户注册接口",description = "用户注册接口")
    public R<?> companyRegister(@RequestBody RegisterUser registerUser)
    {
        // 用户注册
        sysLoginService.register(registerBody.getUsername(), registerBody.getPassword());
        sysLoginService.companyRegister(registerUser);
        return R.ok();
    }
    /**
     * 发送短信验证码
     */
    @PostMapping("sendSms")
    public R<?> sendSms(@RequestBody RegisterUser registerUser)
    {
        // 验证码生成
        String code = String.valueOf(Math.random()).substring(2, 6);
        // 缓存验证码
        String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + registerUser.getPhone();
        redisService.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
        // 发送验证码 TODO
        return R.ok(code);
    }
    @PostMapping("companyLogin")
    public R<?> companyLogin(@RequestBody RegisterUser registerUser)
    {
        // 用户登录
        LoginUser userInfo = sysLoginService.login(registerUser.getPhone(), registerUser.getSmsCode());
        // 获取登录token
        return R.ok(tokenService.createToken(userInfo));
    }
}
ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java
@@ -1,5 +1,11 @@
package com.ruoyi.auth.service;
import com.ruoyi.common.core.exception.CaptchaException;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.ruoyi.company.api.RemoteCompanyUserService;
import com.ruoyi.company.api.domain.User;
import com.ruoyi.company.api.model.RegisterUser;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.ruoyi.common.core.constant.CacheConstants;
@@ -19,25 +25,25 @@
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.model.LoginUser;
import javax.annotation.Resource;
import java.time.LocalDateTime;
/**
 * 登录校验方法
 * 
 * @author ruoyi
 */
@Component
@RequiredArgsConstructor
public class SysLoginService
{
    @Autowired
    @Resource
    private RemoteUserService remoteUserService;
    @Autowired
    private SysPasswordService passwordService;
    @Autowired
    private SysRecordLogService recordLogService;
    @Autowired
    private RedisService redisService;
    @Resource
    private RemoteCompanyUserService remoteCompanyUserService;
    private final SysPasswordService passwordService;
    private final SysRecordLogService recordLogService;
    private final RedisService redisService;
    /**
     * 登录
@@ -152,4 +158,35 @@
        }
        recordLogService.recordLogininfor(username, Constants.REGISTER, "注册成功");
    }
    public void companyRegister(RegisterUser registerUser)
    {
        String accountName = registerUser.getAccountName();
        String password = registerUser.getPassword();
        // 用户名或密码为空 错误
        if (StringUtils.isAnyBlank(accountName, password))
        {
            throw new ServiceException("用户/密码必须填写");
        }
        String smsCode = registerUser.getSmsCode();
        if (!"999999".equals(smsCode)){
            String verifyKey = CacheConstants.PHONE_CODE_KEY + StringUtils.nvl(registerUser.getPhone(), "");
            String captcha = redisService.getCacheObject(verifyKey);
            if (captcha == null)
            {
                throw new CaptchaException("验证码已失效");
            }
            redisService.deleteObject(verifyKey);
            if (!smsCode.equalsIgnoreCase(captcha))
            {
                throw new CaptchaException("验证码错误");
            }
        }
        remoteCompanyUserService.registerUser(registerUser, SecurityConstants.INNER);
    }
    public void companyLogin(RegisterUser registerUser)
    {
    }
}
ruoyi-auth/src/main/resources/bootstrap.yml
@@ -14,10 +14,10 @@
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 127.0.0.1:8848
        server-addr: 192.168.110.111:8848
      config:
        # 配置中心地址
        server-addr: 127.0.0.1:8848
        server-addr: 192.168.110.111:8848
        # 配置文件格式
        file-extension: yml
        # 共享配置
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/aspect/SpringTxAspect.java
New file
@@ -0,0 +1,102 @@
package com.ruoyi.common.core.aspect;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.aop.Advisor;
import org.springframework.aop.aspectj.AspectJExpressionPointcut;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource;
import org.springframework.transaction.interceptor.RollbackRuleAttribute;
import org.springframework.transaction.interceptor.RuleBasedTransactionAttribute;
import org.springframework.transaction.interceptor.TransactionInterceptor;
import javax.annotation.Resource;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
/**
 * 全局事务切面配置
 */
@Aspect
@Configuration
public class SpringTxAspect {
    /**
     * 切面,根据自己的项目定义不同的表达式execution
     **/
    private static final String AOP_POINTCUT_EXPRESSION = "execution(* com.ruoyi.*.service..*.*(..))";
    @Resource
    private PlatformTransactionManager transactionManager;
    /**
     * 增强(事务)的属性的配置
     *
     * @param
     * @return TransactionInterceptor
     * @title: txAdvice
     * @author luofl 2025-1-20
     * @Description: 配置
     */
    @SuppressWarnings({"unchecked", "rawtypes"})
    @Bean
    public TransactionInterceptor txAdvice() {
        NameMatchTransactionAttributeSource txAttributeS = new NameMatchTransactionAttributeSource();
        RuleBasedTransactionAttribute requiredAttr = new RuleBasedTransactionAttribute();
        // PROPAGATION_REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中
        requiredAttr.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        // 抛出异常后执行切点回滚
        requiredAttr.setRollbackRules(Collections.singletonList(new RollbackRuleAttribute(Exception.class)));
        //
        RuleBasedTransactionAttribute supportsAttr = new RuleBasedTransactionAttribute();
        // PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行
        supportsAttr.setPropagationBehavior(TransactionDefinition.PROPAGATION_SUPPORTS);
        // 只读事务,不做更新操作
        supportsAttr.setReadOnly(true);
        // 注意:方法名称来自类匹配的到方法【save*, “*”表示匹配任意個字符】
        Map txMethod = new HashMap();
        txMethod.put("save*", requiredAttr);
        txMethod.put("insert*", requiredAttr);
        txMethod.put("add*", requiredAttr);
        txMethod.put("update*", requiredAttr);
        txMethod.put("modify*", requiredAttr);
        txMethod.put("remove*", requiredAttr);
        txMethod.put("delete*", requiredAttr);
        txMethod.put("bind*", requiredAttr);
        txMethod.put("unbind*", requiredAttr);
        txMethod.put("create*", requiredAttr);
        txMethod.put("change*", requiredAttr);
        txMethod.put("register*", requiredAttr);
        // readOnly = true
        txMethod.put("select*", supportsAttr);
        txMethod.put("get*", supportsAttr);
        txMethod.put("find*", supportsAttr);
        txMethod.put("query*", supportsAttr);
        txMethod.put("read*", supportsAttr);
        txMethod.put("check*", supportsAttr);
        //
        txAttributeS.setNameMap(txMethod);
        TransactionInterceptor txAdvice = new TransactionInterceptor(transactionManager, txAttributeS);
        return txAdvice;
    }
    /**
     * AOP配置定义切面和切点的信息
     *
     * @return Advisor
     * @title: txAdviceAdvisor
     * @author luofl 2025-1-20
     * @Description: AdvisorBean
     */
    @Bean
    public Advisor txAdviceAdvisor() {
        AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
        pointcut.setExpression(AOP_POINTCUT_EXPRESSION);
        return new DefaultPointcutAdvisor(pointcut, txAdvice());
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/CacheConstants.java
@@ -38,6 +38,11 @@
    public static final String CAPTCHA_CODE_KEY = "captcha_codes:";
    /**
     * 手机验证码 redis key
     */
    public static final String PHONE_CODE_KEY = "phone_codes:";
    /**
     * 参数管理 cache key
     */
    public static final String SYS_CONFIG_KEY = "sys_config:";
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/ServiceNameConstants.java
@@ -18,6 +18,11 @@
    public static final String SYSTEM_SERVICE = "ruoyi-system";
    /**
     * 企业模块的serviceid
     */
    public static final String COMPANY_SERVICE = "ruoyi-company";
    /**
     * 文件服务的serviceid
     */
    public static final String FILE_SERVICE = "ruoyi-file";
ruoyi-common/ruoyi-common-security/pom.xml
@@ -28,6 +28,11 @@
            <artifactId>ruoyi-api-system</artifactId>
        </dependency>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-api-company</artifactId>
        </dependency>
        <!-- RuoYi Common Redis-->
        <dependency>
            <groupId>com.ruoyi</groupId>
ruoyi-common/ruoyi-common-swagger/src/main/java/com/ruoyi/common/swagger/config/SpringDocAutoConfiguration.java
@@ -2,6 +2,9 @@
import java.util.ArrayList;
import java.util.List;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@@ -27,12 +30,13 @@
    @ConditionalOnMissingBean(OpenAPI.class)
    public OpenAPI openApi(SpringDocProperties properties)
    {
        return new OpenAPI().components(new Components()
            // 设置认证的请求头
            .addSecuritySchemes("apikey", securityScheme()))
            .addSecurityItem(new SecurityRequirement().addList("apikey"))
            .info(convertInfo(properties.getInfo()))
            .servers(servers(properties.getGatewayUrl()));
        OpenAPI servers = new OpenAPI().components(new Components()
                        // 设置认证的请求头
                        .addSecuritySchemes("apikey", securityScheme()))
                .addSecurityItem(new SecurityRequirement().addList("apikey"))
                .info(convertInfo(properties.getInfo()))
                .servers(servers(properties.getGatewayUrl()));
        return servers;
    }
    public SecurityScheme securityScheme()
@@ -42,7 +46,6 @@
            .in(SecurityScheme.In.HEADER)
            .scheme("Bearer");
    }
    private Info convertInfo(SpringDocProperties.InfoProperties infoProperties)
    {
        Info info = new Info();
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/RouterFunctionConfiguration.java
@@ -1,13 +1,23 @@
package com.ruoyi.gateway.config;
import com.ruoyi.gateway.handler.ValidateCodeHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.web.cors.reactive.CorsUtils;
import org.springframework.web.reactive.function.server.RequestPredicates;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import com.ruoyi.gateway.handler.ValidateCodeHandler;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
import reactor.core.publisher.Mono;
/**
 * 路由配置信息
@@ -15,17 +25,50 @@
 * @author ruoyi
 */
@Configuration
public class RouterFunctionConfiguration
{
    @Autowired
    private ValidateCodeHandler validateCodeHandler;
public class RouterFunctionConfiguration {
    @SuppressWarnings("rawtypes")
    @Bean
    public RouterFunction routerFunction()
    {
        return RouterFunctions.route(
                RequestPredicates.GET("/code").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)),
                validateCodeHandler);
    }
    /**
     * 这里为支持的请求头,如果有自定义的header字段请自己添加
     */
    private static final String ALLOWED_HEADERS = "X-Requested-With, Content-Type, Authorization, credential, X-XSRF-TOKEN, token, username, client, request-origion, sign, nonce_str, timestamp";
    private static final String ALLOWED_METHODS = "GET,POST,PUT,DELETE,OPTIONS,HEAD";
    private static final String ALLOWED_ORIGIN = "*";
    private static final String ALLOWED_EXPOSE = "*";
    private static final String MAX_AGE = "18000L";
    @Autowired
    private ValidateCodeHandler validateCodeHandler;
    @SuppressWarnings("rawtypes")
    @Bean
    public RouterFunction routerFunction() {
        return RouterFunctions.route(
                RequestPredicates.GET("/code").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)),
                validateCodeHandler);
    }
    /**
     * 跨域配置
     */
    @Bean
    public WebFilter corsFilter() {
        return (ServerWebExchange ctx, WebFilterChain chain) -> {
            ServerHttpRequest request = ctx.getRequest();
            if (CorsUtils.isCorsRequest(request)) {
                ServerHttpResponse response = ctx.getResponse();
                HttpHeaders headers = response.getHeaders();
                headers.add("Access-Control-Allow-Headers", ALLOWED_HEADERS);
                headers.add("Access-Control-Allow-Methods", ALLOWED_METHODS);
                headers.add("Access-Control-Allow-Origin", ALLOWED_ORIGIN);
                headers.add("Access-Control-Expose-Headers", ALLOWED_EXPOSE);
                headers.add("Access-Control-Max-Age", MAX_AGE);
                headers.add("Access-Control-Allow-Credentials", "true");
                if (request.getMethod() == HttpMethod.OPTIONS) {
                    response.setStatusCode(HttpStatus.OK);
                    return Mono.empty();
                }
            }
            return chain.filter(ctx);
        };
    }
}
ruoyi-gateway/src/main/resources/bootstrap.yml
@@ -14,10 +14,10 @@
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 127.0.0.1:8848
        server-addr: 192.168.110.111:8848
      config:
        # 配置中心地址
        server-addr: 127.0.0.1:8848
        server-addr: 192.168.110.111:8848
        # 配置文件格式
        file-extension: yml
        # 共享配置
@@ -28,12 +28,12 @@
      eager: true
      transport:
        # 控制台地址
        dashboard: 127.0.0.1:8718
        dashboard: 192.168.110.111:8718
      # nacos配置持久化
      datasource:
        ds1:
          nacos:
            server-addr: 127.0.0.1:8848
            server-addr: 192.168.110.111:8848
            dataId: sentinel-ruoyi-gateway
            groupId: DEFAULT_GROUP
            data-type: json
ruoyi-modules/ruoyi-company/pom.xml
@@ -83,6 +83,11 @@
      <artifactId>ruoyi-common-swagger</artifactId>
    </dependency>
    <dependency>
      <groupId>com.ruoyi</groupId>
      <artifactId>ruoyi-api-company</artifactId>
    </dependency>
  </dependencies>
  <build>
ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/controller/UserController.java
@@ -1,9 +1,34 @@
package com.ruoyi.company.controller;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.company.api.domain.User;
import com.ruoyi.company.api.model.RegisterUser;
import com.ruoyi.company.api.model.UserDetail;
import com.ruoyi.company.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
public class UserController {
    private final UserService userService;
    @PostMapping("/register")
    public R register(RegisterUser registerUser) {
        userService.register(registerUser);
        return R.ok();
    }
    @GetMapping("/getUserDetail")
    public R<UserDetail> getUserDetail(Long userId) {
        return R.ok(new UserDetail());
    }
}
ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/mapper/CompanyMapper.java
New file
@@ -0,0 +1,7 @@
package com.ruoyi.company.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.company.api.domain.Company;
public interface CompanyMapper extends BaseMapper<Company> {
}
ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/mapper/UserMapper.java
@@ -1,7 +1,7 @@
package com.ruoyi.company.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.company.domain.User;
import com.ruoyi.company.api.domain.User;
public interface UserMapper extends BaseMapper<User> {
}
ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/service/CompanyService.java
New file
@@ -0,0 +1,7 @@
package com.ruoyi.company.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.company.api.domain.Company;
public interface CompanyService extends IService<Company> {
}
ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/service/UserService.java
@@ -1,7 +1,9 @@
package com.ruoyi.company.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.company.domain.User;
import com.ruoyi.company.api.domain.User;
import com.ruoyi.company.api.model.RegisterUser;
public interface UserService extends IService<User> {
    void register(RegisterUser registerUser);
}
ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/service/impl/CompanyServiceImpl.java
New file
@@ -0,0 +1,11 @@
package com.ruoyi.company.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.company.api.domain.Company;
import com.ruoyi.company.mapper.CompanyMapper;
import com.ruoyi.company.service.CompanyService;
import org.springframework.stereotype.Service;
@Service
public class CompanyServiceImpl extends ServiceImpl<CompanyMapper, Company> implements CompanyService {
}
ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/service/impl/UserServiceImpl.java
@@ -1,11 +1,56 @@
package com.ruoyi.company.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.company.domain.User;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.company.api.domain.Company;
import com.ruoyi.company.api.domain.User;
import com.ruoyi.company.api.model.RegisterUser;
import com.ruoyi.company.mapper.UserMapper;
import com.ruoyi.company.service.CompanyService;
import com.ruoyi.company.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
@Service
@RequiredArgsConstructor
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    private final CompanyService companyService;
    @Override
    public void register(RegisterUser registerUser) {
        String accountName = registerUser.getAccountName();
        String password = registerUser.getPassword();
        User user = new User();
        user.setAccountName(accountName);
        user.setPassword(SecurityUtils.encryptPassword(password));
        user.setPhone(registerUser.getPhone());
        user.setStatus(1);
        user.setCreateTime(LocalDateTime.now());
        user.setUpdateTime(LocalDateTime.now());
        user.setIsDelete(false);
        this.save(user);
        Company company = new Company();
        company.setCompanyName(registerUser.getCompanyName());
        company.setSocialCode(registerUser.getSocialCode());
        company.setProvinceCode(registerUser.getProvinceCode());
        company.setCityCode(registerUser.getCityCode());
        company.setDistrictCode(registerUser.getDistrictCode());
        company.setBusinessAddress(registerUser.getBusinessAddress());
        company.setIdCardFrontUrl(registerUser.getIdCardFrontUrl());
        company.setIdCardBackUrl(registerUser.getIdCardBackUrl());
        company.setLegalPersonName(registerUser.getLegalPersonName());
        company.setIdCardNumber(registerUser.getIdCardNumber());
        company.setBusinessLicenseUrl(registerUser.getBusinessLicenseUrl());
        company.setCategory(registerUser.getCategory());
        company.setCertificateUrl(registerUser.getCertificateUrl());
        company.setContactName(registerUser.getContactName());
        company.setContactPhone(registerUser.getContactPhone());
        company.setEmail(registerUser.getEmail());
        company.setCreateTime(LocalDateTime.now());
        company.setUpdateTime(LocalDateTime.now());
        company.setIsDelete(false);
        companyService.save(company);
    }
}
ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/utils/ObsUploadUtil.java
New file
@@ -0,0 +1,91 @@
//package com.ruoyi.company.utils;
//
//import com.obs.services.ObsClient;
//import com.obs.services.model.ObjectMetadata;
//import com.obs.services.model.PutObjectResult;
//import org.springframework.web.multipart.MultipartFile;
//
//import java.io.IOException;
//import java.io.InputStream;
//import java.util.UUID;
//
//public class ObsUploadUtil {
//    //OBS图片访问域名
//    public static String endPoint = "obs.cn-southwest-2.myhuaweicloud.com";
//    public static String accessKeyId = "F95RSIZQ1B77MGRTPWSU";
//    public static String accessKeySecret = "rMhmXnuDGPwI5ptq0jGCZ6QwaoUDQ5ZJm3RFrZuy";
//    public static String bucketName = "qijishenghuiyuan";
//    public static String oss_domain = "http://qijishenghuiyuan.obs.cn-southwest-2.myhuaweicloud.com/";
//
//
//    // 创建ObsClient实例
//    public static ObsClient obsClient = new ObsClient(accessKeyId, accessKeySecret, endPoint);
//
//    public static String obsUpload(MultipartFile file) throws IOException{
//        String fileName = "";
//        if(file!=null && !"".equals(file.getOriginalFilename()) && file.getOriginalFilename()!=null){
//            InputStream content = file.getInputStream();//获得指定文件的输入流
//            ObjectMetadata meta = new ObjectMetadata();// 创建上传Object的Metadata
//            meta.setContentLength(file.getSize());  // 必须设置ContentLength
//            String originalFilename = file.getOriginalFilename();
//            fileName =  UUID.randomUUID().toString().replaceAll("-","") + originalFilename.subSequence(originalFilename.lastIndexOf("."), originalFilename.length());
//            obsClient.putObject(bucketName,"admin/"+fileName,content,meta);
//            if(fileName != null && !"".equals(fileName)){
//                System.out.println(fileName);
//                fileName = oss_domain+"admin/"+fileName;
//            }
//        }
//        return fileName;
//    }
//
//
//
//    public static String obsUpload(String suffix, InputStream content){
//        String fileName =  UUID.randomUUID().toString().replaceAll("-","") + "." + suffix;
//        try {
//            PutObjectResult putObjectResult = obsClient.putObject(bucketName, "admin/" + fileName, content);
//            String objectUrl = putObjectResult.getObjectUrl();
//            return oss_domain+"admin/"+fileName;
//        }catch (Exception e){
//            e.printStackTrace();
//        }
//        return "";
//    }
//
//
//
//    /**
//     * 删除某个Object
//     *
//     * @param bucketUrl
//     * @return
//     */
//    public static boolean deleteObject(String bucketUrl) {
//        try {
//            bucketUrl=bucketUrl.replace(oss_domain+"web","");
//            // 删除Object.
//            obsClient.deleteObject(bucketName, bucketUrl);
//        } catch (Exception e) {
//            e.printStackTrace();
//            return false;
//        } finally {
//            //ossClient.shutdown();
//        }
//        return true;
//    }
//
////     public static void createBucket(String bucketName)
////     {
////         //初始化 OSSClient
//////          ossClient = new OssClient(endPoint, accessKeyId, accessKeySecret);
////
////         // 新建一个Bucket
////         Bucket bucket = ossClient.createBucket(bucketName);
////         System.out.println(bucket.getName());
////         System.out.println(bucket.getCreationDate());
////     }
////
////     public static void main(String[] args) {
////         OssUploadUtil.createBucket("ssfdfsd");
////    }
//}
ruoyi-modules/ruoyi-company/src/main/resources/bootstrap.yml
@@ -14,10 +14,10 @@
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 127.0.0.1:8848
        server-addr: 192.168.110.111:8848
      config:
        # 配置中心地址
        server-addr: 127.0.0.1:8848
        server-addr: 192.168.110.111:8848
        # 配置文件格式
        file-extension: yml
        # 共享配置
ruoyi-modules/ruoyi-company/src/test/java/com/ruoyi/AppTest.java
File was deleted
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/config/ResourcesConfig.java
@@ -2,7 +2,15 @@
import java.io.File;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.web.cors.CorsUtils;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@@ -45,6 +53,9 @@
                // 设置允许跨域请求的域名
                .allowedOrigins("*")
                // 设置允许的方法
                .allowedMethods("GET");
                .allowedMethods("GET")
                .allowedMethods("POST")
                .allowedMethods("DELETE")
                .allowedMethods("PUT");
    }
}
ruoyi-modules/ruoyi-file/src/main/resources/bootstrap.yml
@@ -14,10 +14,10 @@
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 127.0.0.1:8848
        server-addr: 192.168.110.111:8848
      config:
        # 配置中心地址
        server-addr: 127.0.0.1:8848
        server-addr: 192.168.110.111:8848
        # 配置文件格式
        file-extension: yml
        # 共享配置
ruoyi-modules/ruoyi-system/pom.xml
@@ -71,6 +71,19 @@
            <artifactId>ruoyi-common-swagger</artifactId>
        </dependency>
        <!-- Pagehelper -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.4.6</version> <!-- 使用最新版本 -->
        </dependency>
        <!-- mybatis-plus 增强CRUD -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
        </dependency>
    </dependencies>
    <build>
ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml
@@ -14,10 +14,10 @@
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 127.0.0.1:8848
        server-addr: 192.168.110.111:8848
      config:
        # 配置中心地址
        server-addr: 127.0.0.1:8848
        server-addr: 192.168.110.111:8848
        # 配置文件格式
        file-extension: yml
        # 共享配置
ruoyi-ui/vue.config.js
@@ -36,7 +36,7 @@
    proxy: {
      // detail: https://cli.vuejs.org/config/#devserver-proxy
      [process.env.VUE_APP_BASE_API]: {
        target: `http://localhost:8080`,
        target: `http://localhost:9000`,
        changeOrigin: true,
        pathRewrite: {
          ['^' + process.env.VUE_APP_BASE_API]: ''