2.0版本
BIN
image/03.png
|
Before Width: | Height: | Size: 123 KiB After Width: | Height: | Size: 674 KiB |
BIN
image/04.png
|
Before Width: | Height: | Size: 127 KiB After Width: | Height: | Size: 284 KiB |
BIN
image/05.png
|
Before Width: | Height: | Size: 129 KiB After Width: | Height: | Size: 918 KiB |
BIN
image/06.png
|
Before Width: | Height: | Size: 284 KiB After Width: | Height: | Size: 319 KiB |
BIN
image/07.png
|
Before Width: | Height: | Size: 674 KiB After Width: | Height: | Size: 184 KiB |
BIN
image/08.png
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 532 KiB |
BIN
image/09.png
|
Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 184 KiB |
BIN
image/10.png
|
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 1.3 MiB |
BIN
image/11.png
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 3.4 MiB |
BIN
image/12.png
Normal file
|
After Width: | Height: | Size: 111 KiB |
25
pom.xml
@@ -4,7 +4,7 @@
|
|||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
<groupId>com.xmzs</groupId>
|
<groupId>org.ruoyi</groupId>
|
||||||
<artifactId>ruoyi-ai</artifactId>
|
<artifactId>ruoyi-ai</artifactId>
|
||||||
<version>${revision}</version>
|
<version>${revision}</version>
|
||||||
|
|
||||||
@@ -58,6 +58,7 @@
|
|||||||
<maven-surefire-plugin.version>3.0.0</maven-surefire-plugin.version>
|
<maven-surefire-plugin.version>3.0.0</maven-surefire-plugin.version>
|
||||||
<flatten-maven-plugin.version>1.3.0</flatten-maven-plugin.version>
|
<flatten-maven-plugin.version>1.3.0</flatten-maven-plugin.version>
|
||||||
<weixin-java-miniapp.version>4.5.0</weixin-java-miniapp.version>
|
<weixin-java-miniapp.version>4.5.0</weixin-java-miniapp.version>
|
||||||
|
<weixin-java-pay.version>4.6.0</weixin-java-pay.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<profiles>
|
<profiles>
|
||||||
@@ -114,7 +115,7 @@
|
|||||||
|
|
||||||
<!-- common 的依赖配置-->
|
<!-- common 的依赖配置-->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.xmzs</groupId>
|
<groupId>org.ruoyi</groupId>
|
||||||
<artifactId>ruoyi-common-bom</artifactId>
|
<artifactId>ruoyi-common-bom</artifactId>
|
||||||
<version>${revision}</version>
|
<version>${revision}</version>
|
||||||
<type>pom</type>
|
<type>pom</type>
|
||||||
@@ -307,33 +308,21 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.xmzs</groupId>
|
<groupId>org.ruoyi</groupId>
|
||||||
<artifactId>ruoyi-system</artifactId>
|
<artifactId>ruoyi-system</artifactId>
|
||||||
<version>${revision}</version>
|
<version>${revision}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.xmzs</groupId>
|
|
||||||
<artifactId>ruoyi-job</artifactId>
|
|
||||||
<version>${revision}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.xmzs</groupId>
|
<groupId>org.ruoyi</groupId>
|
||||||
<artifactId>ruoyi-midjourney</artifactId>
|
<artifactId>ruoyi-fusion</artifactId>
|
||||||
<version>${revision}</version>
|
<version>${revision}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.xmzs</groupId>
|
<groupId>org.ruoyi</groupId>
|
||||||
<artifactId>ruoyi-generator</artifactId>
|
|
||||||
<version>${revision}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.xmzs</groupId>
|
|
||||||
<artifactId>ruoyi-demo</artifactId>
|
<artifactId>ruoyi-demo</artifactId>
|
||||||
<version>${revision}</version>
|
<version>${revision}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<parent>
|
<parent>
|
||||||
<artifactId>ruoyi-ai</artifactId>
|
<artifactId>ruoyi-ai</artifactId>
|
||||||
<groupId>com.xmzs</groupId>
|
<groupId>org.ruoyi</groupId>
|
||||||
<version>${revision}</version>
|
<version>${revision}</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
@@ -23,16 +23,19 @@
|
|||||||
<groupId>com.mysql</groupId>
|
<groupId>com.mysql</groupId>
|
||||||
<artifactId>mysql-connector-j</artifactId>
|
<artifactId>mysql-connector-j</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- Oracle -->
|
<!-- Oracle -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.oracle.database.jdbc</groupId>
|
<groupId>com.oracle.database.jdbc</groupId>
|
||||||
<artifactId>ojdbc8</artifactId>
|
<artifactId>ojdbc8</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- PostgreSql -->
|
<!-- PostgreSql -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.postgresql</groupId>
|
<groupId>org.postgresql</groupId>
|
||||||
<artifactId>postgresql</artifactId>
|
<artifactId>postgresql</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- SqlServer -->
|
<!-- SqlServer -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.microsoft.sqlserver</groupId>
|
<groupId>com.microsoft.sqlserver</groupId>
|
||||||
@@ -40,68 +43,35 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.xmzs</groupId>
|
<groupId>org.ruoyi</groupId>
|
||||||
<artifactId>ruoyi-common-doc</artifactId>
|
<artifactId>ruoyi-common-doc</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.xmzs</groupId>
|
<groupId>org.ruoyi</groupId>
|
||||||
<artifactId>ruoyi-system</artifactId>
|
<artifactId>ruoyi-system</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.xmzs</groupId>
|
<groupId>org.ruoyi</groupId>
|
||||||
<artifactId>ruoyi-common-chat</artifactId>
|
<artifactId>ruoyi-fusion</artifactId>
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.xmzs</groupId>
|
|
||||||
<artifactId>ruoyi-job</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.xmzs</groupId>
|
|
||||||
<artifactId>ruoyi-midjourney</artifactId>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!-- 代码生成-->
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.xmzs</groupId>
|
|
||||||
<artifactId>ruoyi-generator</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- demo模块 -->
|
<!-- demo模块 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.xmzs</groupId>
|
<groupId>org.ruoyi</groupId>
|
||||||
<artifactId>ruoyi-demo</artifactId>
|
<artifactId>ruoyi-demo</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- <dependency>-->
|
|
||||||
<!-- <groupId>de.codecentric</groupId>-->
|
|
||||||
<!-- <artifactId>spring-boot-admin-starter-client</artifactId>-->
|
|
||||||
<!-- </dependency>-->
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-test</artifactId>
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- skywalking 整合 logback -->
|
|
||||||
<!-- <dependency>-->
|
|
||||||
<!-- <groupId>org.apache.skywalking</groupId>-->
|
|
||||||
<!-- <artifactId>apm-toolkit-logback-1.x</artifactId>-->
|
|
||||||
<!-- <version>${与你的agent探针版本保持一致}</version>-->
|
|
||||||
<!-- </dependency>-->
|
|
||||||
<!-- <dependency>-->
|
|
||||||
<!-- <groupId>org.apache.skywalking</groupId>-->
|
|
||||||
<!-- <artifactId>apm-toolkit-trace</artifactId>-->
|
|
||||||
<!-- <version>${与你的agent探针版本保持一致}</version>-->
|
|
||||||
<!-- </dependency>-->
|
|
||||||
|
|
||||||
<!-- 添加thumbnailator依赖 -->
|
<!-- 添加thumbnailator依赖 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>net.coobird</groupId>
|
<groupId>net.coobird</groupId>
|
||||||
|
|||||||
21
ruoyi-admin/src/main/java/org/ruoyi/RuoYiApplication.java
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
package org.ruoyi;
|
||||||
|
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 启动程序
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
*/
|
||||||
|
@SpringBootApplication
|
||||||
|
public class RuoYiApplication {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SpringApplication application = new SpringApplication(RuoYiApplication.class);
|
||||||
|
application.setApplicationStartup(new BufferingApplicationStartup(2048));
|
||||||
|
application.run(args);
|
||||||
|
System.out.println("(♥◠‿◠)ノ゙ RuoYiAi启动成功 ლ(´ڡ`ლ)゙");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package org.ruoyi;
|
||||||
|
|
||||||
|
import org.springframework.boot.builder.SpringApplicationBuilder;
|
||||||
|
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* web容器中进行部署
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
*/
|
||||||
|
public class RuoYiServletInitializer extends SpringBootServletInitializer {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
|
||||||
|
return application.sources(RuoYiApplication.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,162 @@
|
|||||||
|
package org.ruoyi.controller;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.annotation.SaIgnore;
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import org.ruoyi.common.core.constant.Constants;
|
||||||
|
import org.ruoyi.common.core.domain.R;
|
||||||
|
import org.ruoyi.common.core.domain.model.EmailLoginBody;
|
||||||
|
import org.ruoyi.common.core.domain.model.LoginBody;
|
||||||
|
import org.ruoyi.common.core.domain.model.RegisterBody;
|
||||||
|
import org.ruoyi.common.core.domain.model.SmsLoginBody;
|
||||||
|
import org.ruoyi.common.core.domain.model.VisitorLoginBody;
|
||||||
|
import org.ruoyi.common.core.utils.MapstructUtils;
|
||||||
|
import org.ruoyi.common.core.utils.StreamUtils;
|
||||||
|
import org.ruoyi.common.core.utils.StringUtils;
|
||||||
|
import org.ruoyi.common.satoken.utils.LoginHelper;
|
||||||
|
import org.ruoyi.common.tenant.helper.TenantHelper;
|
||||||
|
import org.ruoyi.system.domain.bo.SysTenantBo;
|
||||||
|
import org.ruoyi.system.domain.vo.LoginTenantVo;
|
||||||
|
import org.ruoyi.system.domain.vo.SysTenantVo;
|
||||||
|
import org.ruoyi.system.domain.vo.TenantListVo;
|
||||||
|
import org.ruoyi.system.service.ISysTenantService;
|
||||||
|
|
||||||
|
import org.ruoyi.system.service.SysLoginService;
|
||||||
|
import org.ruoyi.system.service.SysRegisterService;
|
||||||
|
import org.ruoyi.system.domain.vo.LoginVo;
|
||||||
|
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 认证
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
*/
|
||||||
|
@SaIgnore
|
||||||
|
@Validated
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/auth")
|
||||||
|
public class AuthController {
|
||||||
|
|
||||||
|
private final SysLoginService loginService;
|
||||||
|
private final SysRegisterService registerService;
|
||||||
|
private final ISysTenantService tenantService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 登录方法
|
||||||
|
*
|
||||||
|
* @param body 登录信息
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
@PostMapping("/login")
|
||||||
|
public R<LoginVo> login(@Validated @RequestBody LoginBody body) {
|
||||||
|
body.setTenantId(Constants.TENANT_ID);
|
||||||
|
LoginVo loginVo = new LoginVo();
|
||||||
|
// 生成令牌
|
||||||
|
String token = loginService.login(
|
||||||
|
body.getTenantId(),
|
||||||
|
body.getUsername(), body.getPassword(),
|
||||||
|
body.getCode(), body.getUuid());
|
||||||
|
loginVo.setToken(token);
|
||||||
|
loginVo.setUserInfo(LoginHelper.getLoginUser());
|
||||||
|
return R.ok(loginVo);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 短信登录
|
||||||
|
*
|
||||||
|
* @param body 登录信息
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
@PostMapping("/smsLogin")
|
||||||
|
public R<LoginVo> smsLogin(@Validated @RequestBody SmsLoginBody body) {
|
||||||
|
LoginVo loginVo = new LoginVo();
|
||||||
|
// 生成令牌
|
||||||
|
String token = loginService.smsLogin(body.getTenantId(), body.getPhonenumber(), body.getSmsCode());
|
||||||
|
loginVo.setToken(token);
|
||||||
|
return R.ok(loginVo);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 访客登录
|
||||||
|
* @param loginBody 登录信息
|
||||||
|
* @return token信息
|
||||||
|
*/
|
||||||
|
@PostMapping("/visitorLogin")
|
||||||
|
public R<LoginVo> visitorLogin(@RequestBody VisitorLoginBody loginBody) {
|
||||||
|
LoginVo loginVo = new LoginVo();
|
||||||
|
return R.ok(loginVo);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 邮件登录
|
||||||
|
*
|
||||||
|
* @param body 登录信息
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
@PostMapping("/emailLogin")
|
||||||
|
public R<LoginVo> emailLogin(@Validated @RequestBody EmailLoginBody body) {
|
||||||
|
LoginVo loginVo = new LoginVo();
|
||||||
|
// 生成令牌
|
||||||
|
String token = loginService.emailLogin(body.getTenantId(), body.getEmail(), body.getEmailCode());
|
||||||
|
loginVo.setToken(token);
|
||||||
|
return R.ok(loginVo);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 退出登录
|
||||||
|
*/
|
||||||
|
@PostMapping("/logout")
|
||||||
|
public R<Void> logout() {
|
||||||
|
loginService.logout();
|
||||||
|
return R.ok("退出成功");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户注册
|
||||||
|
*/
|
||||||
|
@PostMapping("/register")
|
||||||
|
public R<Void> register(@Validated @RequestBody RegisterBody user, HttpServletRequest request) {
|
||||||
|
String domainName = request.getServerName();
|
||||||
|
user.setDomainName(domainName);
|
||||||
|
registerService.register(user);
|
||||||
|
return R.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重置密码
|
||||||
|
*/
|
||||||
|
@PostMapping("/reset/password")
|
||||||
|
@SaIgnore
|
||||||
|
public R<Void> resetPassWord(@Validated @RequestBody RegisterBody user) {
|
||||||
|
registerService.resetPassWord(user);
|
||||||
|
return R.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 登录页面租户下拉框
|
||||||
|
*
|
||||||
|
* @return 租户列表
|
||||||
|
*/
|
||||||
|
@GetMapping("/tenant/list")
|
||||||
|
public R<LoginTenantVo> tenantList(HttpServletRequest request) throws Exception {
|
||||||
|
List<SysTenantVo> tenantList = tenantService.queryList(new SysTenantBo());
|
||||||
|
List<TenantListVo> voList = MapstructUtils.convert(tenantList, TenantListVo.class);
|
||||||
|
// 获取域名
|
||||||
|
String host = new URL(request.getRequestURL().toString()).getHost();
|
||||||
|
// 根据域名进行筛选
|
||||||
|
List<TenantListVo> list = StreamUtils.filter(voList, vo -> StringUtils.equals(vo.getDomain(), host));
|
||||||
|
// 返回对象
|
||||||
|
LoginTenantVo vo = new LoginTenantVo();
|
||||||
|
vo.setVoList(CollUtil.isNotEmpty(list) ? list : voList);
|
||||||
|
vo.setTenantEnabled(TenantHelper.isEnable());
|
||||||
|
return R.ok(vo);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,152 @@
|
|||||||
|
package org.ruoyi.controller;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.annotation.SaIgnore;
|
||||||
|
import cn.hutool.captcha.AbstractCaptcha;
|
||||||
|
import cn.hutool.captcha.generator.CodeGenerator;
|
||||||
|
import cn.hutool.core.util.IdUtil;
|
||||||
|
import cn.hutool.core.util.RandomUtil;
|
||||||
|
import org.ruoyi.common.core.constant.Constants;
|
||||||
|
import org.ruoyi.common.core.constant.GlobalConstants;
|
||||||
|
import org.ruoyi.common.core.domain.R;
|
||||||
|
import org.ruoyi.common.core.exception.ServiceException;
|
||||||
|
import org.ruoyi.common.core.service.ConfigService;
|
||||||
|
import org.ruoyi.common.core.utils.SpringUtils;
|
||||||
|
import org.ruoyi.common.core.utils.StringUtils;
|
||||||
|
import org.ruoyi.common.core.utils.reflect.ReflectUtils;
|
||||||
|
import org.ruoyi.common.mail.utils.MailUtils;
|
||||||
|
import org.ruoyi.common.redis.utils.RedisUtils;
|
||||||
|
import org.ruoyi.common.sms.config.properties.SmsProperties;
|
||||||
|
import org.ruoyi.common.sms.core.SmsTemplate;
|
||||||
|
import org.ruoyi.common.sms.entity.SmsResult;
|
||||||
|
import org.ruoyi.common.web.config.properties.CaptchaProperties;
|
||||||
|
import org.ruoyi.common.web.enums.CaptchaType;
|
||||||
|
import org.ruoyi.system.domain.request.EmailRequest;
|
||||||
|
import org.ruoyi.system.domain.vo.CaptchaVo;
|
||||||
|
import jakarta.validation.Valid;
|
||||||
|
import jakarta.validation.constraints.NotBlank;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.expression.Expression;
|
||||||
|
import org.springframework.expression.ExpressionParser;
|
||||||
|
import org.springframework.expression.spel.standard.SpelExpressionParser;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import java.time.Duration;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 验证码操作处理
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
*/
|
||||||
|
@SaIgnore
|
||||||
|
@Slf4j
|
||||||
|
@Validated
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@RestController
|
||||||
|
public class CaptchaController {
|
||||||
|
|
||||||
|
private final CaptchaProperties captchaProperties;
|
||||||
|
private final SmsProperties smsProperties;
|
||||||
|
private final ConfigService configService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 短信验证码
|
||||||
|
*
|
||||||
|
* @param phonenumber 用户手机号
|
||||||
|
*/
|
||||||
|
@GetMapping("/resource/sms/code")
|
||||||
|
public R<Void> smsCode(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber) {
|
||||||
|
if (!smsProperties.getEnabled()) {
|
||||||
|
return R.fail("当前系统没有开启短信功能!");
|
||||||
|
}
|
||||||
|
String key = GlobalConstants.CAPTCHA_CODE_KEY + phonenumber;
|
||||||
|
String code = RandomUtil.randomNumbers(4);
|
||||||
|
RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
|
||||||
|
// 验证码模板id 自行处理 (查数据库或写死均可)
|
||||||
|
String templateId = "";
|
||||||
|
Map<String, String> map = new HashMap<>(1);
|
||||||
|
map.put("code", code);
|
||||||
|
SmsTemplate smsTemplate = SpringUtils.getBean(SmsTemplate.class);
|
||||||
|
SmsResult result = smsTemplate.send(phonenumber, templateId, map);
|
||||||
|
if (!result.isSuccess()) {
|
||||||
|
log.error("验证码短信发送异常 => {}", result);
|
||||||
|
return R.fail(result.getMessage());
|
||||||
|
}
|
||||||
|
return R.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 邮箱验证码
|
||||||
|
*
|
||||||
|
* @param emailRequest 用户邮箱
|
||||||
|
*/
|
||||||
|
@PostMapping("/resource/email/code")
|
||||||
|
public R<Void> emailCode(@RequestBody @Valid EmailRequest emailRequest) {
|
||||||
|
String key = GlobalConstants.CAPTCHA_CODE_KEY + emailRequest.getUsername();
|
||||||
|
String code = RandomUtil.randomNumbers(4);
|
||||||
|
RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
|
||||||
|
// 检验邮箱后缀
|
||||||
|
String suffix = configService.getConfigValue("mail", "suffix");
|
||||||
|
String prompt = configService.getConfigValue("mail", "prompt");
|
||||||
|
if(StringUtils.isNotEmpty(suffix)){
|
||||||
|
// 动态的域名列表
|
||||||
|
String[] invalidDomains = suffix.split(",");
|
||||||
|
for (String domain : invalidDomains) {
|
||||||
|
if (emailRequest.getUsername().endsWith(domain)) {
|
||||||
|
throw new ServiceException(prompt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 自定义邮箱模板
|
||||||
|
String model = configService.getConfigValue("mail", "mailModel");
|
||||||
|
String mailTitle = configService.getConfigValue("mail", "mailTitle");
|
||||||
|
String replacedModel = model.replace("{code}", code);
|
||||||
|
try {
|
||||||
|
MailUtils.sendHtml(emailRequest.getUsername(), mailTitle, replacedModel);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("邮箱验证码发送异常 => {}", e.getMessage());
|
||||||
|
return R.fail(e.getMessage());
|
||||||
|
}
|
||||||
|
return R.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成验证码
|
||||||
|
*/
|
||||||
|
@GetMapping("/auth/code")
|
||||||
|
public R<CaptchaVo> getCode() {
|
||||||
|
CaptchaVo captchaVo = new CaptchaVo();
|
||||||
|
boolean captchaEnabled = captchaProperties.getEnable();
|
||||||
|
if (!captchaEnabled) {
|
||||||
|
captchaVo.setCaptchaEnabled(false);
|
||||||
|
return R.ok(captchaVo);
|
||||||
|
}
|
||||||
|
// 保存验证码信息
|
||||||
|
String uuid = IdUtil.simpleUUID();
|
||||||
|
String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + uuid;
|
||||||
|
// 生成验证码
|
||||||
|
CaptchaType captchaType = captchaProperties.getType();
|
||||||
|
boolean isMath = CaptchaType.MATH == captchaType;
|
||||||
|
Integer length = isMath ? captchaProperties.getNumberLength() : captchaProperties.getCharLength();
|
||||||
|
CodeGenerator codeGenerator = ReflectUtils.newInstance(captchaType.getClazz(), length);
|
||||||
|
AbstractCaptcha captcha = SpringUtils.getBean(captchaProperties.getCategory().getClazz());
|
||||||
|
captcha.setGenerator(codeGenerator);
|
||||||
|
captcha.createCode();
|
||||||
|
String code = captcha.getCode();
|
||||||
|
if (isMath) {
|
||||||
|
ExpressionParser parser = new SpelExpressionParser();
|
||||||
|
Expression exp = parser.parseExpression(StringUtils.remove(code, "="));
|
||||||
|
code = exp.getValue(String.class);
|
||||||
|
}
|
||||||
|
RedisUtils.setCacheObject(verifyKey, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
|
||||||
|
captchaVo.setUuid(uuid);
|
||||||
|
captchaVo.setImg(captcha.getImageBase64());
|
||||||
|
return R.ok(captchaVo);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
package org.ruoyi.controller;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.annotation.SaIgnore;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 首页
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
*/
|
||||||
|
@SaIgnore
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@Controller
|
||||||
|
public class IndexController {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 访问首页,提示语
|
||||||
|
*/
|
||||||
|
@GetMapping("/")
|
||||||
|
public String index() {
|
||||||
|
return "index.html";
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/success")
|
||||||
|
public String success(){
|
||||||
|
return "paySuccess.html";
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/cancel")
|
||||||
|
public String cancel(){
|
||||||
|
return "cancel";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -47,41 +47,9 @@ spring:
|
|||||||
master:
|
master:
|
||||||
type: ${spring.datasource.type}
|
type: ${spring.datasource.type}
|
||||||
driverClassName: com.mysql.cj.jdbc.Driver
|
driverClassName: com.mysql.cj.jdbc.Driver
|
||||||
# jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
|
url: jdbc:mysql://43.139.70.230:3306/ruoyi-ai?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
|
||||||
# rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
|
username: ruoyi-ai
|
||||||
url: ${DB_URL}
|
password: TZ7yaGtSRWeeBaBJ
|
||||||
username: ${DB_USERNAME}
|
|
||||||
password: ${DB_PASSWORD}
|
|
||||||
|
|
||||||
|
|
||||||
# 从库数据源
|
|
||||||
# slave:
|
|
||||||
# lazy: true
|
|
||||||
# type: ${spring.datasource.type}
|
|
||||||
# driverClassName: com.mysql.cj.jdbc.Driver
|
|
||||||
# url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
|
|
||||||
# username:
|
|
||||||
# password:
|
|
||||||
# oracle:
|
|
||||||
# type: ${spring.datasource.type}
|
|
||||||
# driverClassName: oracle.jdbc.OracleDriver
|
|
||||||
# url: jdbc:oracle:thin:@//localhost:1521/XE
|
|
||||||
# username: ROOT
|
|
||||||
# password: root
|
|
||||||
# hikari:
|
|
||||||
# connectionTestQuery: SELECT 1 FROM DUAL
|
|
||||||
# postgres:
|
|
||||||
# type: ${spring.datasource.type}
|
|
||||||
# driverClassName: org.postgresql.Driver
|
|
||||||
# url: jdbc:postgresql://localhost:5432/postgres?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true
|
|
||||||
# username: root
|
|
||||||
# password: root
|
|
||||||
# sqlserver:
|
|
||||||
# type: ${spring.datasource.type}
|
|
||||||
# driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
|
|
||||||
# url: jdbc:sqlserver://localhost:1433;DatabaseName=tempdb;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true
|
|
||||||
# username: SA
|
|
||||||
# password: root
|
|
||||||
hikari:
|
hikari:
|
||||||
# 最大连接池数量
|
# 最大连接池数量
|
||||||
maxPoolSize: 20
|
maxPoolSize: 20
|
||||||
@@ -104,15 +72,15 @@ spring:
|
|||||||
spring.data:
|
spring.data:
|
||||||
redis:
|
redis:
|
||||||
# 地址
|
# 地址
|
||||||
host: ${REDIS_HOST}
|
host: 127.0.0.1
|
||||||
# 端口,默认为6379
|
# 端口,默认为6379
|
||||||
port: ${REDIS_PORT}
|
port: 6379
|
||||||
# 数据库索引
|
# 数据库索引
|
||||||
database: 0
|
database: 0
|
||||||
# 密码(如没有密码请注释掉)
|
# 密码(如没有密码请注释掉)
|
||||||
#password:
|
#password:
|
||||||
# 连接超时时间
|
# 连接超时时间
|
||||||
timeout: 10s
|
timeout: 10S
|
||||||
# 是否开启ssl
|
# 是否开启ssl
|
||||||
ssl: false
|
ssl: false
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
|
|
||||||
# 项目相关配置
|
# 项目相关配置
|
||||||
ruoyi:
|
ruoyi:
|
||||||
# 名称
|
# 名称
|
||||||
name: "xmzs"
|
name: "ruoyi"
|
||||||
# 版本
|
# 版本
|
||||||
version: ${revision}
|
version: ${revision}
|
||||||
# 版权年份
|
# 版权年份
|
||||||
@@ -48,7 +49,7 @@ server:
|
|||||||
# 日志配置
|
# 日志配置
|
||||||
logging:
|
logging:
|
||||||
level:
|
level:
|
||||||
com.xmzs: '@logging.level@'
|
org.ruoyi: @logging.level@
|
||||||
org.springframework: warn
|
org.springframework: warn
|
||||||
config: classpath:logback-plus.xml
|
config: classpath:logback-plus.xml
|
||||||
|
|
||||||
@@ -69,14 +70,14 @@ spring:
|
|||||||
# 国际化资源文件路径
|
# 国际化资源文件路径
|
||||||
basename: i18n/messages
|
basename: i18n/messages
|
||||||
profiles:
|
profiles:
|
||||||
active: '@profiles.active@'
|
active: @profiles.active@
|
||||||
# 文件上传
|
# 文件上传
|
||||||
servlet:
|
servlet:
|
||||||
multipart:
|
multipart:
|
||||||
# 单个文件大小
|
# 单个文件大小
|
||||||
max-file-size: 10MB
|
max-file-size: 50MB
|
||||||
# 设置总上传的文件大小
|
# 设置总上传的文件大小
|
||||||
max-request-size: 20MB
|
max-request-size: 200MB
|
||||||
mvc:
|
mvc:
|
||||||
format:
|
format:
|
||||||
date-time: yyyy-MM-dd HH:mm:ss
|
date-time: yyyy-MM-dd HH:mm:ss
|
||||||
@@ -117,8 +118,7 @@ sa-token:
|
|||||||
security:
|
security:
|
||||||
# 排除路径
|
# 排除路径
|
||||||
excludes:
|
excludes:
|
||||||
# 修改用户头像
|
# 支付回调
|
||||||
- /system/user/edit/avatar
|
|
||||||
- /pay/returnUrl
|
- /pay/returnUrl
|
||||||
- /pay/notifyUrl
|
- /pay/notifyUrl
|
||||||
# 上传文件
|
# 上传文件
|
||||||
@@ -160,11 +160,11 @@ tenant:
|
|||||||
mybatis-plus:
|
mybatis-plus:
|
||||||
# 不支持多包, 如有需要可在注解配置 或 提升扫包等级
|
# 不支持多包, 如有需要可在注解配置 或 提升扫包等级
|
||||||
# 例如 com.**.**.mapper
|
# 例如 com.**.**.mapper
|
||||||
mapperPackage: com.xmzs.**.mapper
|
mapperPackage: org.ruoyi.**.mapper
|
||||||
# 对应的 XML 文件位置
|
# 对应的 XML 文件位置
|
||||||
mapperLocations: classpath*:mapper/**/*Mapper.xml
|
mapperLocations: classpath*:mapper/**/*Mapper.xml
|
||||||
# 实体扫描,多个package用逗号或者分号分隔
|
# 实体扫描,多个package用逗号或者分号分隔
|
||||||
typeAliasesPackage: com.xmzs.**.domain
|
typeAliasesPackage: org.ruoyi.**.domain
|
||||||
# 启动时是否检查 MyBatis XML 文件的存在,默认不检查
|
# 启动时是否检查 MyBatis XML 文件的存在,默认不检查
|
||||||
checkConfigLocation: false
|
checkConfigLocation: false
|
||||||
configuration:
|
configuration:
|
||||||
@@ -245,13 +245,13 @@ springdoc:
|
|||||||
#这里定义了两个分组,可定义多个,也可以不定义
|
#这里定义了两个分组,可定义多个,也可以不定义
|
||||||
group-configs:
|
group-configs:
|
||||||
- group: 1.演示模块
|
- group: 1.演示模块
|
||||||
packages-to-scan: com.xmzs.demo
|
packages-to-scan: org.ruoyi.demo
|
||||||
- group: 2.通用模块
|
- group: 2.通用模块
|
||||||
packages-to-scan: com.xmzs.web
|
packages-to-scan: org.ruoyi.web
|
||||||
- group: 3.系统模块
|
- group: 3.系统模块
|
||||||
packages-to-scan: com.xmzs.system
|
packages-to-scan: org.ruoyi.system
|
||||||
- group: 4.代码生成模块
|
- group: 4.代码生成模块
|
||||||
packages-to-scan: com.xmzs.generator
|
packages-to-scan: org.ruoyi.generator
|
||||||
|
|
||||||
# 防止XSS攻击
|
# 防止XSS攻击
|
||||||
xss:
|
xss:
|
||||||
@@ -290,9 +290,9 @@ management:
|
|||||||
logfile:
|
logfile:
|
||||||
external-file: ./logs/sys-console.log
|
external-file: ./logs/sys-console.log
|
||||||
|
|
||||||
--- # websocket
|
# websocket
|
||||||
websocket:
|
websocket:
|
||||||
enabled: false
|
enabled: true
|
||||||
# 路径
|
# 路径
|
||||||
path: ''
|
path: ''
|
||||||
# 设置访问源地址
|
# 设置访问源地址
|
||||||
@@ -307,83 +307,72 @@ wx:
|
|||||||
token: #微信小程序消息服务器配置的token
|
token: #微信小程序消息服务器配置的token
|
||||||
aesKey: #微信小程序消息服务器配置的EncodingAESKey
|
aesKey: #微信小程序消息服务器配置的EncodingAESKey
|
||||||
msgDataFormat: JSON
|
msgDataFormat: JSON
|
||||||
|
|
||||||
|
# 知识库配置
|
||||||
|
chain:
|
||||||
|
split:
|
||||||
|
chunk:
|
||||||
|
endspliter: "<STOP>"
|
||||||
|
# 分块文本大小
|
||||||
|
size: 500
|
||||||
|
overlay: 0
|
||||||
|
qaspliter: "######"
|
||||||
|
# 知识库中检索的条数
|
||||||
|
limits: 5
|
||||||
|
vectorization:
|
||||||
|
type: openai
|
||||||
|
openai:
|
||||||
|
model: 'text-embedding-3-small'
|
||||||
baidu:
|
baidu:
|
||||||
# 是否开启文本审核
|
model: bge-large-zh
|
||||||
enabled: false
|
zhipu:
|
||||||
# 文本审核
|
model: embedding-2
|
||||||
textReview:
|
# 智普API KEY
|
||||||
apiKey: '' # apiKey
|
token: xx
|
||||||
secretKey: '' # secretKey
|
vector:
|
||||||
appKey: xxxxxxxxxxxxxxxxx
|
store:
|
||||||
secretKey: xxxxxxxxxxxxxxxxxxxxxxx
|
type: weaviate
|
||||||
|
weaviate:
|
||||||
|
protocol: http
|
||||||
|
host: 127.0.0.1:6038
|
||||||
|
classname: LocalKnowledge
|
||||||
|
milvus:
|
||||||
|
host: 127.0.0.1
|
||||||
|
port: 19530
|
||||||
|
dimension: 1536
|
||||||
|
collection: LocalKnowledge
|
||||||
|
llm:
|
||||||
|
openai:
|
||||||
|
token: sk-xx
|
||||||
|
model: gpt-4-1106-preview
|
||||||
|
chatglm:
|
||||||
|
baseurl: http://127.0.0.1:8000/
|
||||||
|
model: chatglm2-6b
|
||||||
|
baidu:
|
||||||
|
appKey: xx
|
||||||
|
secretKey: xx
|
||||||
|
model: ernie_bot
|
||||||
|
zhipu:
|
||||||
|
model: glm-4
|
||||||
|
audio:
|
||||||
|
type: openai
|
||||||
|
text:
|
||||||
|
type: openai
|
||||||
|
function:
|
||||||
|
type: baidu
|
||||||
|
vision:
|
||||||
|
type: openai
|
||||||
|
image:
|
||||||
|
type: openai
|
||||||
|
|
||||||
wechat:
|
upload:
|
||||||
# 是否使用微信 true/false
|
path: /data/upload
|
||||||
enable: true
|
|
||||||
# 生成的登录二维码路径 默认与项目同级
|
|
||||||
qrPath: "./"
|
|
||||||
|
|
||||||
keyword:
|
proxy:
|
||||||
# 重置会话指令
|
socket:
|
||||||
reset: "重置会话"
|
host: 127.0.0.1
|
||||||
# ai画图指令(DALL·E模型 https://platform.openai.com/docs/models/dall-e)
|
port: 7890
|
||||||
# generation 根据关键词生成图片(https://platform.openai.com/docs/guides/images/generations)
|
|
||||||
image: "ai画图"
|
|
||||||
# ai语音指令(TTS模型 https://platform.openai.com/docs/api-reference/audio)
|
|
||||||
audio: "ai语音"
|
|
||||||
|
|
||||||
#绘画价格配置(元)
|
resource:
|
||||||
mj:
|
domain: http://127.0.0.1:${server.port}/resources
|
||||||
# 放大
|
|
||||||
upsample: 0.1
|
|
||||||
# 变化
|
|
||||||
change: 0.3
|
|
||||||
# 图生图
|
|
||||||
blend: 0.3
|
|
||||||
# 图生文
|
|
||||||
describe: 0.1
|
|
||||||
# 文生图
|
|
||||||
imagine: 0.3
|
|
||||||
# 局部重绘
|
|
||||||
inpaint: 0.3
|
|
||||||
# 提示词分析
|
|
||||||
shorten: 0.1
|
|
||||||
# 换脸
|
|
||||||
faceSwapping: 0.3
|
|
||||||
|
|
||||||
--- # mail 邮件发送
|
|
||||||
mail:
|
|
||||||
enabled: true
|
|
||||||
host: smtp.163.com
|
|
||||||
port: 465
|
|
||||||
# 是否需要用户名密码验证
|
|
||||||
auth: true
|
|
||||||
# 发送方,遵循RFC-822标准
|
|
||||||
from: ageerle@163.com
|
|
||||||
# 用户名(注意:如果使用foxmail邮箱,此处user为qq号)
|
|
||||||
user: ageerle@163.com
|
|
||||||
# 密码(填写授权码)
|
|
||||||
pass: ${MAIL_PASS}
|
|
||||||
# 使用 STARTTLS安全连接,STARTTLS是对纯文本通信协议的扩展。
|
|
||||||
starttlsEnable: true
|
|
||||||
# 使用SSL安全连接
|
|
||||||
sslEnable: true
|
|
||||||
# SMTP超时时长,单位毫秒,缺省值不超时
|
|
||||||
timeout: 0
|
|
||||||
# Socket连接超时值,单位毫秒,缺省值不超时
|
|
||||||
connectionTimeout: 0
|
|
||||||
|
|
||||||
# chatgpt和mj共用一个key
|
|
||||||
chat:
|
|
||||||
apiKey: ${CHAT_API_KEY}
|
|
||||||
apiHost: ${CHAT_API_HOST}
|
|
||||||
# 支付配置信息
|
|
||||||
pay:
|
|
||||||
pid: ${PAY_PID}
|
|
||||||
key: ${PAY_KEY}
|
|
||||||
payUrl: 'https://pay.pandarobot.chat/mapi.php'
|
|
||||||
notify_url: 'https://www.pandarobot.chat/pay/returnUrl'
|
|
||||||
return_url: 'https://www.pandarobot.chat/pay/notifyUrl'
|
|
||||||
type: 'wxpay'
|
|
||||||
device: 'pc'
|
|
||||||
sign_type: 'MD5'
|
|
||||||
|
|||||||
@@ -1,9 +1,2 @@
|
|||||||
Application Version: ${revision}
|
Application Version: ${revision}
|
||||||
Spring Boot Version: ${spring-boot.version}
|
Spring Boot Version: ${spring-boot.version}
|
||||||
██ ██ ██ ██
|
|
||||||
██████ ░██ ░██ ░██ █████ ██████ ░██
|
|
||||||
░██░░░██ ██████ ███████ ░██ ██████ █████ ░██ ██████ ██████ ██░░░██░██░░░██ ██████
|
|
||||||
░██ ░██ ░░░░░░██ ░░██░░░██ ██████ ░░░░░░██ █████ ██░░░██░██████ ░░░░░░██ ░░░██░ ░██ ░██░██ ░██░░░██░
|
|
||||||
░██████ ███████ ░██ ░██ ██░░░██ ███████ ░░░░░ ░██ ░░ ░██░░░██ ███████ ░██ ░░██████░██████ ░██
|
|
||||||
░██░░░ ██░░░░██ ░██ ░██░██ ░██ ██░░░░██ ░██ ██░██ ░██ ██░░░░██ ░██ ░░░░░██░██░░░ ░██
|
|
||||||
░██ ░░████████ ███ ░██░░██████░░████████ ░░█████ ░██ ░██░░████████ ░░██ █████ ░██ ░░██
|
|
||||||
|
|||||||
46
ruoyi-admin/src/main/resources/static/.gitignore
vendored
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
######################################################################
|
||||||
|
# Build Tools
|
||||||
|
|
||||||
|
.gradle
|
||||||
|
/build/
|
||||||
|
!gradle/wrapper/gradle-wrapper.jar
|
||||||
|
|
||||||
|
target/
|
||||||
|
!.mvn/wrapper/maven-wrapper.jar
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# IDE
|
||||||
|
|
||||||
|
### STS ###
|
||||||
|
.apt_generated
|
||||||
|
.classpath
|
||||||
|
.factorypath
|
||||||
|
.project
|
||||||
|
.settings
|
||||||
|
.springBeans
|
||||||
|
|
||||||
|
### IntelliJ IDEA ###
|
||||||
|
.idea
|
||||||
|
*.iws
|
||||||
|
*.iml
|
||||||
|
*.ipr
|
||||||
|
|
||||||
|
### JRebel ###
|
||||||
|
rebel.xml
|
||||||
|
|
||||||
|
### NetBeans ###
|
||||||
|
nbproject/private/
|
||||||
|
build/*
|
||||||
|
nbbuild/
|
||||||
|
nbdist/
|
||||||
|
.nb-gradle/
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Others
|
||||||
|
*.log
|
||||||
|
*.xml.versionsBackup
|
||||||
|
*.swp
|
||||||
|
|
||||||
|
!*/build/*.java
|
||||||
|
!*/build/*.html
|
||||||
|
!*/build/*.xml
|
||||||
0
ruoyi-admin/src/main/resources/static/.nojekyll
Normal file
1
ruoyi-admin/src/main/resources/static/CNAME
Normal file
@@ -0,0 +1 @@
|
|||||||
|
plus-doc.dromara.org
|
||||||
74
ruoyi-admin/src/main/resources/static/README.md
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
# 框架介绍
|
||||||
|
- - -
|
||||||
|
- `RuoYi-Vue-Plus` 分布式集群框架 [文档跳转](/ruoyi-vue-plus/home.md)
|
||||||
|
- `RuoYi-Cloud-Plus` 微服务框架 [文档跳转](/ruoyi-cloud-plus/home.md)
|
||||||
|
- `plus-ui` 统一 Vue3 前端项目 [文档跳转](/plus-ui/home.md)
|
||||||
|
- `plus-doc` 统一文档项目
|
||||||
|
|
||||||
|
## 特别赞助
|
||||||
|
|
||||||
|
<a href="https://gitee.com/dromara/MaxKey"><img src="https://foruda.gitee.com/images/1700187453544179968/7342304a_1766278.png" width="400px" height="100px"></a>
|
||||||
|
<a href="http://ccflow.org/?frm=ryPlus"><img src="https://foruda.gitee.com/images/1704162419429172656/d0521e59_1766278.png" width="400px" height="100px"></a>
|
||||||
|
<br>
|
||||||
|
<a href="http://www.shuduokeji.com"><img src="https://foruda.gitee.com/images/1705569347386939952/3f187980_1766278.jpeg" width="400px" height="100px"></a>
|
||||||
|
<a href="https://www.jnpfsoft.com/index.html?from=plus-doc"><img src="https://foruda.gitee.com/images/1711681233267310022/2ffbcff2_1766278.png" width="400px" height="100px"></a>
|
||||||
|
<br>
|
||||||
|
<a href="https://item.jd.com/13928958.html?from=plus-doc"><img src="https://foruda.gitee.com/images/1723791569938403230/769e98da_1766278.jpeg" width="400px" height="100px"></a>
|
||||||
|
|
||||||
|
[如何成为赞助商 加群联系作者详谈](/common/add_group.md)
|
||||||
|
|
||||||
|
## 代码地址
|
||||||
|
|
||||||
|
| 介绍 | 项目名 | 项目地址 | 注意事项 |
|
||||||
|
|------------|:-----------------|------------------------------------------------------------------------------------------------------------------------|----------------------------|
|
||||||
|
| 🔥 分布式集群框架 | RuoYi-Vue-Plus | - [Gitee](https://gitee.com/dromara/RuoYi-Vue-Plus)<br> - [GitHub](https://github.com/dromara/RuoYi-Vue-Plus) | 重写RuoYi-Vue全方位升级(不兼容原框架) |
|
||||||
|
| 🔥 微服务框架 | RuoYi-Cloud-Plus | - [Gitee](https://gitee.com/dromara/RuoYi-Cloud-Plus)<br>- [GitHub](https://github.com/dromara/RuoYi-Cloud-Plus) | 重写RuoYi-Cloud全方位升级(不兼容原框架) |
|
||||||
|
| 🔥 统一前端项目 | plus-ui | - [Gitee](https://gitee.com/JavaLionLi/plus-ui)<br>- [GitHub](https://github.com/JavaLionLi/plus-ui) | Vue与Cloud项目通用前端 |
|
||||||
|
| 🔥 统一文档项目 | plus-doc | - [Gitee](https://gitee.com/dromara/plus-doc)<br>- [GitHub](https://github.com/dromara/plus-doc) | 通用文档 |
|
||||||
|
|
||||||
|
|
||||||
|
## 业务功能
|
||||||
|
|
||||||
|
| 功能 | 介绍 |
|
||||||
|
|-------|---------------------------------------|
|
||||||
|
| 租户管理 | 配置系统租户,支持 SaaS 场景下的多租户功能。 |
|
||||||
|
| 用户管理 | 用户是系统操作者,该功能主要完成系统用户配置。 |
|
||||||
|
| 部门管理 | 配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。 |
|
||||||
|
| 岗位管理 | 配置系统用户所属担任职务。 |
|
||||||
|
| 菜单管理 | 配置系统菜单,操作权限,按钮权限标识等。 |
|
||||||
|
| 角色管理 | 角色菜单权限分配、设置角色按机构进行数据范围权限划分。 |
|
||||||
|
| 字典管理 | 对系统中经常使用的一些较为固定的数据进行维护。 |
|
||||||
|
| 参数管理 | 对系统动态配置常用参数。 |
|
||||||
|
| 通知公告 | 系统通知公告信息发布维护。 |
|
||||||
|
| 操作日志 | 系统正常操作日志记录和查询;系统异常信息日志记录和查询。 |
|
||||||
|
| 登录日志 | 系统登录日志记录查询包含登录异常。 |
|
||||||
|
| 文件管理 | 系统文件上传、下载等管理。 |
|
||||||
|
| 定时任务 | 在线(添加、修改、删除)任务调度包含执行结果日志。 |
|
||||||
|
| 代码生成 | 前后端代码的生成(java、html、xml、sql)支持CRUD下载 。 |
|
||||||
|
| 系统接口 | 根据业务代码自动生成相关的api接口文档。 |
|
||||||
|
| 服务监控 | 监视集群系统CPU、内存、磁盘、堆栈、在线日志、Spring相关配置等。 |
|
||||||
|
| 缓存监控 | 对系统的缓存信息查询,命令统计等。 |
|
||||||
|
| 在线构建器 | 拖动表单元素生成相应的HTML代码。 |
|
||||||
|
| 使用案例 | 系统的一些功能案例 |
|
||||||
|
|
||||||
|
## 关注作者
|
||||||
|
|
||||||
|
作者博客: [https://lionli.blog.csdn.net/?type=blog](https://lionli.blog.csdn.net/?type=blog)
|
||||||
|
|
||||||
|
公众号: **<狮子领域 程序圈>**
|
||||||
|
<br>
|
||||||
|

|
||||||
|
|
||||||
|
## 捐献作者
|
||||||
|
|
||||||
|
**作者为兼职做开源,平时还需要工作,如果帮到了您可以请作者吃个盒饭**
|
||||||
|
<br>
|
||||||
|
<img src="https://foruda.gitee.com/images/1725259663554875162/bd86a165_1766278.png" width="300px" height="450px" /><img src="https://foruda.gitee.com/images/1725259708005620620/22833e19_1766278.jpeg" width="300px" height="450px" />
|
||||||
|
|
||||||
|
## Dromara 全家福
|
||||||
|
|
||||||
|
社区仓库地址: [dromara开源社区](https://gitee.com/organizations/dromara/projects)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
32
ruoyi-admin/src/main/resources/static/_coverpage.md
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
<!-- _coverpage.md -->
|
||||||
|
<html>
|
||||||
|
<img src="./static/image/logo2.png" width="260px" height="260px">
|
||||||
|
<div style="display: flex; align-content:center; justify-content: center;">
|
||||||
|
<div >
|
||||||
|
<div style="font-weight: bold; font-size: 40px;">百搭AI</div>
|
||||||
|
<!-- <div style="font-weight: bold; font-size: 40px;margin-bottom: 30px;">多租户权限管理系统</div> -->
|
||||||
|
|
||||||
|
[](https://gitee.com/ageerle/ruoyi-ai)
|
||||||
|
[](https://github.com/dromara/RuoYi-Vue-Plus)
|
||||||
|
[](https://gitee.com/ageerle/ruoyi-ai/blob/master/LICENSE)
|
||||||
|
<br>
|
||||||
|
[](https://gitee.com/ageerle/ruoyi-ai)
|
||||||
|
[]()
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</html>
|
||||||
|
|
||||||
|
> 百搭AI是一个整合了多种大语言模型API的开源平台,实现了AI对话、绘图、声音克隆和私有知识库等功能。
|
||||||
|
>
|
||||||
|
> 平台配备管理后台,支持微信支付、微信公众号、微信多开、Stripe国际支付和百度文本审核等运营功能。
|
||||||
|
>
|
||||||
|
> 项目采用Java+Vue+Vben5技术栈构建,遵循MIT License,允许二次开发并用于商业销售。
|
||||||
|
|
||||||
|
Copyright © 2023-2024 版权所有:ageerle@163.com 备案号:<a href="https://beian.miit.gov.cn/">鄂ICP备2023007672号</a>
|
||||||
|
|
||||||
|
[开始使用 Let's Go](/README.md)
|
||||||
2
ruoyi-admin/src/main/resources/static/_footer.md
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
<!-- _footer.md 页脚配置 -->
|
||||||
|
对文档有疑问?欢迎您帮助我们 [完善此文档](https://gitee.com/JavaLionLi/plus-doc) !
|
||||||
9
ruoyi-admin/src/main/resources/static/_navbar.md
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<!-- _navbar.md -->
|
||||||
|
|
||||||
|
* [文档导航](/README.md)
|
||||||
|
* [Vue版本](/ruoyi-vue-plus/home.md)
|
||||||
|
* [Cloud版本](/ruoyi-cloud-plus/home.md)
|
||||||
|
* [前端文档](/plus-ui/home.md)
|
||||||
|
* [常见问题](/questions/lombok.md)
|
||||||
|
* [视频教程](/common/video.md)
|
||||||
|
* [演示系统](/common/demo_system.md)
|
||||||
16
ruoyi-admin/src/main/resources/static/_sidebar.md
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<!-- _sidebar.md -->
|
||||||
|
- **特别赞助**
|
||||||
|
- [](http://ccflow.org/?frm=ryPlus)
|
||||||
|
- [](http://www.shuduokeji.com)
|
||||||
|
- [](https://www.jnpfsoft.com/index.html?from=plus-doc)
|
||||||
|
|
||||||
|
- **开始**
|
||||||
|
- [框架介绍](/README.md)
|
||||||
|
- [演示系统](/common/demo_system.md)
|
||||||
|
- [官方视频教程](/common/video.md)
|
||||||
|
- [粉丝专栏](/common/column.md)
|
||||||
|
- [参与贡献项目](/common/contribution.md)
|
||||||
|
- [如何提交PR](/common/pr.md)
|
||||||
|
- [如何加群](/common/add_group.md)
|
||||||
|
- [使用者登记](/common/user_register.md)
|
||||||
|
- [黑名单](/common/blacklist.md)
|
||||||
27
ruoyi-admin/src/main/resources/static/common/add_group.md
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# 加群方式
|
||||||
|
- - -
|
||||||
|
### 交流群(不提供任何问题解答 纯交流)
|
||||||
|
|
||||||
|
**加 <小助手> 微信备注 <加群>**<br>
|
||||||
|
**视频课程咨询或其他问题咨询请查看下方信息(小助手是机器人)**
|
||||||
|
|
||||||
|
<img src="https://foruda.gitee.com/images/1680762410689884638/60b546ca_1766278.png" width="300" height="300">
|
||||||
|
|
||||||
|
### VIP群(付费加群 提供问题解答、技术支持、技术分享)
|
||||||
|
|
||||||
|
首先感谢 `RuoYi` 提供分享开源 框架基于 `RuoYi` 重写大部分功能实现<br>
|
||||||
|
项目代码、文档 均开源免费可商用 遵循开源协议在项目中保留开源协议文件即可<br>
|
||||||
|
VIP群是作者提供的私人服务 不代表着项目收费
|
||||||
|
|
||||||
|
> 问问题等于做习题 听作者解答问题等于习题讲解<br>
|
||||||
|
> 一个人接触的问题有限 一群人接触的问题无限 早进群早接触更多的问题(每天99+)<br>
|
||||||
|
> 承诺: 看见必回复 让你感受作者有多话痨<br>
|
||||||
|
|
||||||
|
两种途径:
|
||||||
|
1. 购买官方视频进群 [官方视频](/common/video.md)
|
||||||
|
2. 扫描下方二维码付款进群(无视频)
|
||||||
|
|
||||||
|
支付后申请加群即可 QQ群号 : **<637757165>**<br>
|
||||||
|
|
||||||
|
**加群扫码**<br>
|
||||||
|
<img src="https://foruda.gitee.com/images/1725259839682556495/2897bc86_1766278.png" width="300px" height="450px" /><img src="https://foruda.gitee.com/images/1725259806547656944/f870a5c7_1766278.jpeg" width="300px" height="450px" />
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
# 黑名单
|
||||||
|
- - -
|
||||||
|
|
||||||
|
地址: https://github.com/QNAV/RuoYi-X-Plus
|
||||||
|
<br>
|
||||||
|
上榜缘由 使用本框架二次开源并未有任何声明与标注 将所有代码的作者名全都改成了自己 剽窃本框架代码
|
||||||
|
|
||||||
18
ruoyi-admin/src/main/resources/static/common/column.md
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# 粉丝专栏
|
||||||
|
- - -
|
||||||
|
**由上到下 从易到难**
|
||||||
|
|
||||||
|
> 粉丝整理 欢迎投稿
|
||||||
|
|
||||||
|
| 作者 | 文档地址 | 说明 |
|
||||||
|
|---------------|---------------------------------------------------------------|--------------------|
|
||||||
|
| 抓蛙师 | https://www.bilibili.com/video/BV1TG41157Ef/ | 学会问问题(小白必看) |
|
||||||
|
| 抓蛙师 | https://www.bilibili.com/video/BV1mr4y1j75M | Vue框架基础视频专栏(新人必看) |
|
||||||
|
| 抓蛙师 | https://www.bilibili.com/video/BV1Na411u7eC | Vue框架改造视频专栏(新人必看) |
|
||||||
|
| 抓蛙师 | https://www.bilibili.com/video/BV1te4y1D7hi | 小程序鉴权与uniapp联动 |
|
||||||
|
| 抓蛙师 | https://www.bilibili.com/video/BV1zt4y137UP | 公众号集成 |
|
||||||
|
| mayuanfei | https://note.youdao.com/s/XpvKnxAb | 入门专栏(新人必看) |
|
||||||
|
| 程序猿一枚_ | https://blog.csdn.net/zhaozhiqiang1981/category_12221291.html | 玩转RuoYi-Cloud-Plus |
|
||||||
|
| 程序猿一枚_ | https://www.bilibili.com/video/BV1yA411r7ji/ | Cloud环境搭建以及进阶开发 |
|
||||||
|
| MichelleChung | https://blog.csdn.net/michelle_zhong/category_11109741.html | 源码解析专栏(进阶必看) |
|
||||||
|
| MichelleChung | https://blog.csdn.net/michelle_zhong/category_12058476.html | Cloud源码解析专栏 |
|
||||||
69
ruoyi-admin/src/main/resources/static/common/contribution.md
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
# 参与贡献的方式
|
||||||
|
- - -
|
||||||
|
参与贡献开源的方式有很多种 听作者来介绍
|
||||||
|
|
||||||
|
## 为开源项目点一个Star
|
||||||
|
|
||||||
|
> Star的多少关系到项目能否被更多人看到
|
||||||
|
<br>
|
||||||
|
同时Star也是作者前进的动力(作者每天都在盯着Star 涨了会开心 跌了会失落)
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
> 大家在寻找开源项目的时候, 大多数情况也是会先看Star比较多的项目
|
||||||
|
<br>
|
||||||
|
所以请给您觉得好的开源项目点一个小小的Star, 让好的项目能够被更多人看到
|
||||||
|
<br>
|
||||||
|
|
||||||
|

|
||||||
|
<br>
|
||||||
|
<font size="4">Vue版本: [Gitee我要点Star](https://gitee.com/dromara/RuoYi-Vue-Plus/stargazers) [Github我要点Star](https://github.com/dromara/RuoYi-Vue-Plus)</font>
|
||||||
|
<br>
|
||||||
|
<font size="4">Cloud版本: [Gitee我要点Star](https://gitee.com/dromara/RuoYi-Cloud-Plus/stargazers) [Github我要点Star](https://github.com/dromara/RuoYi-Cloud-Plus)</font>
|
||||||
|
|
||||||
|
## 为社区处理问题
|
||||||
|
|
||||||
|
> Issue是社区的交流地 大家会在这里提出自己的问题 或者是项目的功能异常
|
||||||
|
|
||||||
|
> 提问的规范在Issue的模板里已经写好了 按照模板填写有助于作者或者其他社区人员快速有效的回答问题
|
||||||
|

|
||||||
|
|
||||||
|
> 为提出问题的小伙伴答疑 可以有效降的帮助别人<br>
|
||||||
|
> 而且可以降低社区人员的精力分散 使精力全部投入到项目设计研发中
|
||||||
|

|
||||||
|
|
||||||
|
## 改进社区文档
|
||||||
|
|
||||||
|
> 大家都知道 我们程序员都不擅长写作<br>
|
||||||
|
> 有时候作者把文档写完了也不知道用户是什么感觉 是否能看懂<br>
|
||||||
|
|
||||||
|
> 所以参与社区文档建设绝对是一件意义重大的事情<br>
|
||||||
|
> 大家可以在Issue提出观后感 觉得哪看不懂 觉得哪应该详细说明<br>
|
||||||
|
> 当然了 大家也可以对文档进行改进后提交PR修改申请
|
||||||
|
|
||||||
|
<font size="6">文档仓库: [plus-doc](https://gitee.com/JavaLionLi/plus-doc) 👈点他点他</font>
|
||||||
|

|
||||||
|
|
||||||
|
## 贡献代码
|
||||||
|
|
||||||
|
> 想参与贡献代码的小伙伴 重点来了: 作者会经常在Issue里发布需求认领<br>
|
||||||
|
> 觉得自己能做的可以在Issue里跟作者讨论 如需求还不够清晰 或者做的过程中遇到了什么问题
|
||||||
|
|
||||||
|
<img src="https://foruda.gitee.com/images/1678936513184771725/f26349dd_1766278.png" width="550px" height="450px" />
|
||||||
|
|
||||||
|
> 需求确定了以后就可以开始专注的写代码了<br>
|
||||||
|
> 但在开始写代码之前 一定要先看一下如何正确的提交PR
|
||||||
|
|
||||||
|
<font size="4">一点要仔细看: [如何提交PR](/common/pr.md) 👈点他点他</font>
|
||||||
|
|
||||||
|
## 如何成为项目成员
|
||||||
|
|
||||||
|
> 1.对框架有重大贡献者(由作者与团队成员判定)<br>
|
||||||
|
> 2.完成社区发布的两项复杂任务<br>
|
||||||
|
> 3.持续完成社区发布的简单任务若干(作者会关注到)<br>
|
||||||
|
> 4.持续为社区优化文档或处理issue若干(作者会关注到)<br>
|
||||||
|
|
||||||
|
## 项目成员待遇
|
||||||
|
|
||||||
|
> 1.可免费进入vip收费群<br>
|
||||||
|
> 2.每年还会发放IDEA正版授权<br>
|
||||||
|
|
||||||
13
ruoyi-admin/src/main/resources/static/common/demo_system.md
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# 系统演示(请大家不要乱改数据 影响他人体验 谢谢配合)
|
||||||
|
- - -
|
||||||
|
**感谢 `孤舟烟雨` 贡献的演示服务器**
|
||||||
|
|
||||||
|
**1核2G 小服务器 经不起压测 请理性操作 违者直接封IP**
|
||||||
|
|
||||||
|
> 访问地址: [http://43.138.9.96/](http://43.138.9.96/)
|
||||||
|
|
||||||
|
> 登录账户 admin/admin123
|
||||||
|
|
||||||
|
> Admin监控中心 ruoyi/123456
|
||||||
|
|
||||||
|
> 任务调度中心 admin/123456
|
||||||
37
ruoyi-admin/src/main/resources/static/common/pr.md
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# 如何提交PR贡献代码
|
||||||
|
- - -
|
||||||
|
### 步骤一 Fork项目到自己仓库
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 步骤二 基于dev分支 新建一个此PR功能点的专属分支
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
### 步骤三 使用Git工具 将自己仓库的项目拉去到本地做代码编写
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 步骤四 使用Idea打开项目 切换到新建的功能分支
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 步骤五 将编写好的代码 提交到自己的远程仓库
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 步骤六 创建PR申请(此操作在自己仓库或者要PR的仓库都可以)
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
### 步骤七 等待作者评审 按要求更改 直到没有问题后被作者合并
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 评审期间 如需对PR内容做更改 直接在新功能分支提交代码即可
|
||||||
|
### 无需重复提交PR申请 这边会自动比对两个分支的差异
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
# 使用者登记
|
||||||
|
- - -
|
||||||
|
**使用此开源项目的公司或者组织**
|
||||||
|
> Vue版本登记地址: https://gitee.com/dromara/RuoYi-Vue-Plus/issues/I4QP39
|
||||||
|
|
||||||
|
> Cloud版本登记地址: https://gitee.com/dromara/RuoYi-Cloud-Plus/issues/I4VJ7G
|
||||||
|
|
||||||
|
| 公司名 | 官网 | LOGO |
|
||||||
|
|-------------------|:-------------------------------|----------------------------------------------------------------------------------------------------------------|
|
||||||
|
| 中国联通(长春分公司) | http://www.10010.com | <img src="https://foruda.gitee.com/images/1679554727740431371/bd179d0f_1766278.png" width="300" height="200"> |
|
||||||
|
| 中国电信(湖南分公司) | http://www.189.cn/hn/ | <img src="https://foruda.gitee.com/images/1699838764871886313/61b44b7d_1766278.png" width="300" height="200"> |
|
||||||
|
| 南京感知信息技术有限公司 | https://njgzxx.cn/ | <img src="https://foruda.gitee.com/images/1725589695335847776/10bb2088_1766278.png" width="400" height="200"> |
|
||||||
|
| 陕西骏景索道运营管理有限公司 | https://www.junjingsuodao.com/ | <img src="https://foruda.gitee.com/images/1724394959451680041/24ac17ff_7408092.png" width="300" height="200"> |
|
||||||
|
| 悠码科技有限公司 | https://orise.trytowish.cn/ | <img src="https://foruda.gitee.com/images/1722916054523975884/686ee49e_8929785.png" width="200" height="200"> |
|
||||||
|
| 苏州龙的信息系统股份有限公司 | http://www.longdayinfo.com/ | <img src="https://foruda.gitee.com/images/1721182313605689705/f676882a_2113976.png" width="400" height="200"> |
|
||||||
|
| 北京数通智达科技有限公司 | http://www.bzdtech.com/ | <img src="https://foruda.gitee.com/images/1717744899576682096/7d6cf41f_1766278.png" width="400" height="200"> |
|
||||||
|
| 广州六六七七科技有限公司 | https://artiversehub.ai/ | <img src="https://foruda.gitee.com/images/1716976454631958575/44abbb05_1766278.png" width="300" height="200"> |
|
||||||
|
| 宁波三品软件科技有限公司 | http://nbsanpin.com/ | <img src="https://foruda.gitee.com/images/1715845257022437822/1a096edc_14415359.png" width="300" height="200"> |
|
||||||
|
| 北京御一科技信息技术有限公司 | https://www.yudoctor.com | <img src="https://foruda.gitee.com/images/1715157943995574211/09aa2229_1766278.png" width="400" height="200"> |
|
||||||
|
| 成都卡恩特医疗科技有限公司 | http://www.scknot.com | <img src="https://foruda.gitee.com/images/1711091474880818044/96ddef90_1766278.png" width="400" height="200"> |
|
||||||
|
| 无锡科艾思科技有限公司 | https://www.kyoeis.com | <img src="https://foruda.gitee.com/images/1710929131545545232/a87f838e_1766278.png" width="400" height="200"> |
|
||||||
|
| 深圳市海联天下科技有限公司 | www.sealinkin.com | <img src="https://foruda.gitee.com/images/1709870697911145583/453db298_1766278.png" width="400" height="200"> |
|
||||||
|
| 上海非定义旅游服务有限公司 | http://www.anonymity.love/ | <img src="https://foruda.gitee.com/images/1706165274431234456/f4be93d3_1766278.png" width="400" height="200"> |
|
||||||
|
| 重庆威爱云科技有限公司 | https://www.51vive.com | <img src="https://foruda.gitee.com/images/1700460635019084607/f073724d_1766278.png" width="400" height="200"> |
|
||||||
|
| 中城智联(成都)创新科技有限公司 | http://www.zc-zl.com/ | <img src="https://foruda.gitee.com/images/1699841115050735040/0d6893d1_1766278.png" width="300" height="200"> |
|
||||||
|
| 浙江海亮股份有限公司 | https://www.hailiangstock.com | <img src="https://foruda.gitee.com/images/1699841174631804104/fd3466fd_1766278.png" width="300" height="200"> |
|
||||||
|
| 河北雄安山禾咨询工程有限公司 | https://shanheqei.club/ | <img src="https://foruda.gitee.com/images/1699855302878416881/6bfdb2d5_1766278.png" width="300" height="200"> |
|
||||||
|
| 数舵(河北雄安)信息科技有限公司 | http://www.shuduokeji.com | <img src="https://foruda.gitee.com/images/1698888517162767014/8a2840ff_1766278.png" width="400" height="200"> |
|
||||||
|
| 南昌鼎欣科技股份有限公司 | https://www.openzt.com | <img src="https://foruda.gitee.com/images/1697701810520579719/4da9666e_1766278.png" width="400" height="200"> |
|
||||||
|
| 东莞市码载网络科技有限公司 | https://www.codeload.top | <img src="https://foruda.gitee.com/images/1697618746817506398/57af2eaa_10583761.png" width="400" height="200"> |
|
||||||
|
| 北京农信通科技有限责任公司 | http://www.nxt.com.cn | <img src="https://foruda.gitee.com/images/1696428611360166577/72e7f7c4_971517.png" width="400" height="200"> |
|
||||||
|
| 中康腾华网络科技(重庆)有限公司 | https://www.zkthwlkj.com/ | <img src="https://foruda.gitee.com/images/1695112845600729239/a16e34e2_1766278.png" width="200" height="100"> |
|
||||||
|
| 杭州码恒信息科技有限公司 | http://www.mh-barcode.com/ | <img src="https://foruda.gitee.com/images/1690881482450489558/2d689bc1_1766278.png" width="400" height="200"> |
|
||||||
|
| 南京晶益科技有限公司 | https://www.nanjingjingyi.com/ | <img src="https://foruda.gitee.com/images/1689576488369281878/bec504ce_1766278.png" width="400" height="200"> |
|
||||||
|
| 合肥智享亿云科技有限公司 | http://www.izxyy.com | <img src="https://foruda.gitee.com/images/1685096398913604988/e6c16816_1766278.png" width="300" height="200"> |
|
||||||
|
| 锡简科技 | https://www.xj-fast.com | <img src="https://foruda.gitee.com/images/1683858424104223718/172f2c2e_1766278.png" width="300" height="200"> |
|
||||||
|
| 福建亘前科技有限公司 | https://genqian.top | <img src="https://foruda.gitee.com/images/1683170298723703161/891feff4_1766278.png" width="400" height="200"> |
|
||||||
|
| 北京联宇信通科技有限公司 | http://www.lyxtkj.com/ | <img src="https://foruda.gitee.com/images/1680068618387237935/5e195ad8_1766278.png" width="400" height="200"> |
|
||||||
|
| 厦门市熵时光科技有限公司 | https://www.xetsoft.com | <img src="https://foruda.gitee.com/images/1672299365177532128/f0e78c26_1766278.png" width="400" height="200"> |
|
||||||
|
| 广州润沁教育科技有限公司 | https://www.ca163.net | <img src="https://foruda.gitee.com/images/1678976000893686992/1acbda54_1766278.png" width="400" height="200"> |
|
||||||
|
| 广东乐善智能装备股份有限公司 | https://www.china-leshan.com/ | <img src="https://foruda.gitee.com/images/1672299473733272899/2065e28c_1766278.png" width="400" height="200"> |
|
||||||
|
| 数字江西科技有限公司 | https://www.digitaljx.com/ | <img src="https://foruda.gitee.com/images/1660527156328976445/屏幕截图.png" width="300" height="200"> |
|
||||||
|
| 上海极锐星瀚传感技术有限公司 | http://www.jrsensing.com/ | <img src="https://foruda.gitee.com/images/1669694597446652604/6997f99a_1766278.png" width="400" height="100"> |
|
||||||
|
| 北京数影互联科技有限公司 | http://www.dataflying.top/ | <img src="https://foruda.gitee.com/images/1686118090145603656/46dbe579_1766278.png" width="200" height="100"> |
|
||||||
|
| 广州创服信息科技有限公司 | https://www.cfkjcloud.com | <img src="https://foruda.gitee.com/images/1678975960889135530/85fa904f_1766278.png" width="400" height="200"> |
|
||||||
|
| 茂名云智科技有限公司 | http://www.winzkj.com | <img src="https://foruda.gitee.com/images/1678975967691323451/6343e6b7_1766278.png" width="400" height="200"> |
|
||||||
|
| 成都时光旅迹科技有限公司 | https://www.ttmup.com/ | <img src="https://foruda.gitee.com/images/1678975973935607983/a0f8dce2_1766278.png" width="400" height="200"> |
|
||||||
|
| 成都炫影全息科技有限公司 | http://xyqxgs.com | <img src="https://foruda.gitee.com/images/1678975979873588062/e34db081_1766278.png" width="400" height="200"> |
|
||||||
|
| 中山厚德快速模具有限公司 | http://hordrt.com | <img src="https://foruda.gitee.com/images/1678975986213675141/7436dcb9_1766278.png" width="400" height="200"> |
|
||||||
|
| 深圳市深南夙星科技有限公司 | http://www.szsnsx.com/ | <img src="https://foruda.gitee.com/images/1678975994674685698/a2c05a6e_1766278.png" width="400" height="200"> |
|
||||||
|
| 陕西华恒军创信息科技有限公司 | http://hhjc.cc | <img src="https://foruda.gitee.com/images/1678976006389002991/3786a1bc_1766278.png" width="400" height="200"> |
|
||||||
|
| 河南小牛信息科技有限公司 | http://www.hnxn888.com/ | <img src="https://foruda.gitee.com/images/1681106560964010687/d8969ed2_1766278.png" width="200" height="100"> |
|
||||||
|
| 武汉华智讯网络信息技术有限公司 | http://www.xun188.com | <img src="https://foruda.gitee.com/images/1678975944577016382/93c4541d_1766278.png" width="200" height="100"> |
|
||||||
|
| 易税信息技术有限公司 | https://www.etax.top | <img src="https://foruda.gitee.com/images/1678975950137235651/211a63c4_1766278.png" width="200" height="100"> |
|
||||||
|
| 广西华景城建筑设计有限公司 | http://www.hjcadc.com | <img src="https://foruda.gitee.com/images/1678975955216975234/e83c8c6e_1766278.png" width="200" height="100"> |
|
||||||
|
| 铭创科技有限公司 | https://www.mcck.cn/ | <img src="https://foruda.gitee.com/images/1693967206668467582/8c234a6d_1766278.png" width="200" height="100"> |
|
||||||
|
| 西安鼎慧网络科技有限公司 | | <img src="https://foruda.gitee.com/images/1721271356660437424/b85c5754_8776295.jpeg" width="400" height="200"> |
|
||||||
|
| 营口鼎瑞网络科技有限公司 | | <img src="https://foruda.gitee.com/images/1715836865319520119/5dc34a5f_8693506.png" width="400" height="200"> |
|
||||||
|
| 南昌漫库书店有限公司 | | <img src="https://foruda.gitee.com/images/1687656369793887183/ce1a33f6_1766278.png" width="200" height="100"> |
|
||||||
|
| 广西文韬智能科技有限公司 | | <img src="https://foruda.gitee.com/images/1678976034543683491/8d8a1ebe_1766278.png" width="200" height="100"> |
|
||||||
|
| 贵州亿瑞祺科技有限公司 | |
|
||||||
|
| 贵州新绿视界环保科技有限公司 | |
|
||||||
|
| 湖南智才伯乐数据科技有限公司 | |
|
||||||
|
| 德州商储超市有限公司 | |
|
||||||
|
| 曲沃亿分科技中心 | |
|
||||||
|
| 南京杰度信息技术有限公司 | |
|
||||||
|
| 武汉忆秋科技有限公司 | |
|
||||||
|
| 济南千惠网络科技有限公司 | |
|
||||||
|
| 江苏泛联科技有限公司 | |
|
||||||
|
| 沈阳市果冻网络信息科技有限责任公司 | |
|
||||||
|
| 灵劲科技有限公司 | |
|
||||||
|
| 亿世达餐饮管理(北京)有限公司 | |
|
||||||
|
| 深圳市凯帝电子商务有限公司 | |
|
||||||
|
| 成都数智源蓉卡科技有限公司 | |
|
||||||
|
| 上海振福信息科技有限公司 | |
|
||||||
|
| 重庆六客会科技有限公司 | |
|
||||||
|
| 无限创优(西安)科技有限公司 | |
|
||||||
|
| 惠族网络科技发展有限公司 | |
|
||||||
|
| 纳森科技有限公司 | |
|
||||||
|
|
||||||
85
ruoyi-admin/src/main/resources/static/common/video.md
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
# 视频教程(联合出品)
|
||||||
|
|
||||||
|
### 主讲与后期剪辑: `抓蛙师`
|
||||||
|
|
||||||
|
抓蛙师简介: B站知名UP主 B站首页: https://space.bilibili.com/520725002
|
||||||
|
|
||||||
|
### 知识点统筹与内容审核: `疯狂的狮子Li`
|
||||||
|
|
||||||
|
疯狂的狮子Li简介: RuoYi-Vue-Plus 与 RuoYi-Cloud-Plus 作者
|
||||||
|
|
||||||
|
## 已完结🎉🎉🎉 优惠价: 598(仅限前500名) ~~原价: 698~~
|
||||||
|
|
||||||
|
**注意: 视频采用 RuoYi-Vue-Plus 版本 4.X 分支讲解!!! (内容为通用技术与版本关联性不大)**<br>
|
||||||
|
**内容为框架内所用到的技术与设计原理(打破不知道、不会用、不知应用场景等问题)**
|
||||||
|
|
||||||
|
课程简介: https://www.bilibili.com/video/BV16j411D7BX/
|
||||||
|
<br>
|
||||||
|
试看课程: https://www.bilibili.com/video/BV1uS411P7JD/
|
||||||
|
<br>
|
||||||
|
试看课程: https://www.bilibili.com/video/BV1vLbNeuESn/
|
||||||
|
<br>
|
||||||
|
试看课程: https://www.bilibili.com/video/BV1xV4y127KM/
|
||||||
|
<br>
|
||||||
|
试看课程: https://www.bilibili.com/video/BV1W5v8eBEgs/
|
||||||
|
<br>
|
||||||
|
课程总结: https://www.bilibili.com/video/BV1734y1g7fk/
|
||||||
|
<br>
|
||||||
|
|
||||||
|
## 购买方式
|
||||||
|
|
||||||
|
**小本生意 用心录制 拒绝砍价 已更新到 236 集 课程完结**<br>
|
||||||
|
> 课程咨询或购买请联系 价格598<br>
|
||||||
|
> QQ: 906670865 (疯狂的狮子Li)<br>
|
||||||
|
> QQ: 770492966 (抓蛙师)
|
||||||
|
|
||||||
|
## 购买前常见问题答疑
|
||||||
|
> 问题1: 购买后是否有群可以解答问题<br>
|
||||||
|
> 答: 购买后有专属课程付费群(千人大群)讲师在线答疑
|
||||||
|
>
|
||||||
|
> 问题2: 是否持续更新 如新版本功能<br>
|
||||||
|
> 答: 课程目录即为全部课程内容 以课程目录为准 明年大概会出二期来讲新版本内容<br>
|
||||||
|
> 因为持续更新会导致前面的技术老旧 新购买的人无法及时学习新技术<br>
|
||||||
|
> 故而采用分期出课程制度 已经购买过的老客户 再次购买下一次会给力度非常大的折扣
|
||||||
|
>
|
||||||
|
> 问题3: 目前视频未全部录制完成 后续更新是否二次收费<br>
|
||||||
|
> 答: 视频目录即为全部视频内容 一次收费后续更新仍然可看直到视频全部更新完成(明年出二期课程不算在内)
|
||||||
|
>
|
||||||
|
> 问题4: 视频如何下载如何观看<br>
|
||||||
|
> 答: 视频文件已加密 采用专门的播放器(播放器只限制截图录屏等不限制其他软件使用) 由管理员发放授权码观看<br>
|
||||||
|
> 支持通过 百度云 或者 阿里云 网盘下载视频资源
|
||||||
|
>
|
||||||
|
> 问题5: 视频平均时长和总时长大概多久<br>
|
||||||
|
> 答: 视频每集短的大概10分钟以上 长的大概40个分钟左右 平均时长20多分钟每集<br>
|
||||||
|
> 目前已经录制了236集总时长为80多个小时
|
||||||
|
>
|
||||||
|
> 问题6: 是否有讲解 Cloud 版本相关内容<br>
|
||||||
|
> 答: 视频主要讲解内容为框架内所用到的技术与设计原理 无论什么版本 功能和设计都是一样的<br>
|
||||||
|
> Cloud 版本只是多了 alibaba 的几个组件完全可以B站自学
|
||||||
|
|
||||||
|
## 课程目录
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
## 学员观后感
|
||||||
|
|
||||||
|
| | |
|
||||||
|
|---------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------|
|
||||||
|
|  |  |
|
||||||
|
|  |  |
|
||||||
|
|  |  |
|
||||||
|
|  |  |
|
||||||
|
|  |  |
|
||||||
|
|  |  |
|
||||||
|
|  |  |
|
||||||
@@ -1,104 +1,74 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html lang="en">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<!-- Meta, title, CSS, favicons, etc. -->
|
<meta charset="UTF-8">
|
||||||
<meta charset="utf-8">
|
<title>plus-doc</title>
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="description" content="Description">
|
||||||
<meta name="description" content="Padna Home">
|
<meta name="viewport"
|
||||||
<meta name="keywords" content="Padna,Homepage">
|
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
|
||||||
<meta name="author" content="Padna">
|
<!-- 设置浏览器图标 -->
|
||||||
<title>熊猫助手</title>
|
<link rel="icon" href="./static/image/favicon.ico" type="image/x-icon"/>
|
||||||
<link rel="stylesheet" type="text/css" href="./assets/css/onlinewebfonts.css"/>
|
<link rel="shortcut icon" href="./static/image/favicon.ico" type="image/x-icon"/>
|
||||||
<link rel="stylesheet" type="text/css" href="./assets/css/vno.css">
|
<meta charset="UTF-8">
|
||||||
<link rel="stylesheet" type="text/css" href="./assets/css/iconfont.css">
|
<!-- 默认主题 -->
|
||||||
<link rel="icon" href="./assets/svg/favicon.svg">
|
<link rel="stylesheet" href="./static/css/vue.css">
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<span class="mobile btn-mobile-menu">
|
<div id="app"></div>
|
||||||
<i class="social iconfont icon-list btn-mobile-menu__icon"></i>
|
<script>
|
||||||
<i class="social iconfont icon-angleup btn-mobile-close__icon hidden"></i>
|
window.$docsify = {
|
||||||
</span>
|
// 项目名称
|
||||||
<header id="panel" class="panel-cover">
|
name: 'ruoyi-ai',
|
||||||
<div class="panel-main">
|
// 仓库地址,点击右上角的Github章鱼猫头像会跳转到此地址
|
||||||
<div class="panel-main__inner panel-inverted">
|
repo: 'https://gitee.com/ruoyi-ai',
|
||||||
<div class="panel-main__content">
|
// 侧边栏支持,默认加载的是项目根目录下的_sidebar.md文件
|
||||||
<div class="ih-item circle effect right_to_left">
|
loadSidebar: true,
|
||||||
<a href="#" title="" class="blog-button">
|
// 导航栏支持,默认加载的是项目根目录下的_navbar.md文件
|
||||||
<div>
|
loadNavbar: true,
|
||||||
<img src="./assets/img/logo1.jpg" alt="img" class="js-avatar iUp profilepic"></div>
|
// 封面支持,默认加载的是项目根目录下的_coverpage.md文件
|
||||||
</a>
|
coverpage: true,
|
||||||
</div>
|
// 最大支持渲染的标题层级
|
||||||
<h1 class="panel-cover__title panel-title iUp">
|
maxLevel: 5,
|
||||||
<a href="#" title="Dmego Home">ageerle</a>
|
// 自定义侧边栏后默认不会再生成目录,设置生成目录的最大层级(建议配置为2-4)
|
||||||
</h1>
|
subMaxLevel: 4,
|
||||||
<p class="panel-cover__subtitle panel-subtitle iUp">Code Create Life</p>
|
// 小屏设备下合并导航栏到侧边栏
|
||||||
<hr class="panel-cover__divider iUp" />
|
mergeNavbar: true,
|
||||||
<p id="description" class="panel-cover__description iUp">如何得与凉风约, 不共尘沙一并来!
|
// 页脚支持,默认加载的是 _footer.md
|
||||||
<br/>
|
loadFooter: true,
|
||||||
<strong>-「中牟道中」</strong>
|
// 首页只展示封面(默认为false,与README.md进行拼接)
|
||||||
</p>
|
onlyCover: true,
|
||||||
<div class="navigation-wrapper iUp">
|
search: {
|
||||||
<div>
|
maxAge: 86400000,// 过期时间,单位毫秒,默认一天
|
||||||
<nav class="cover-navigation cover-navigation--primary">
|
paths: 'auto',// 注意:仅适用于 paths: 'auto' 模式
|
||||||
<ul class="navigation">
|
placeholder: '👉👉👉在这里搜索关键字👈👈👈',
|
||||||
<li class="navigation__item">
|
noData: '找不到结果',
|
||||||
<a href="#" class="blog-button">首页</a>
|
depth: 4,
|
||||||
</li>
|
hideOtherSidebarContent: false,
|
||||||
<li class="navigation__item">
|
namespace: 'Docsify-Guide',
|
||||||
<a href="#" class="blog-button" target="_blank">博客</a>
|
}
|
||||||
</li>
|
}
|
||||||
<li class="navigation__item">
|
</script>
|
||||||
<a href="#" class="blog-button" target="_blank">简历</a>
|
<!-- docsify的js依赖 -->
|
||||||
</li>
|
<script src="./static/js/docsify.min.js"></script>
|
||||||
<li class="navigation__item">
|
<!-- emoji表情支持 -->
|
||||||
<a href="#" class="blog-button" target="_blank">关于</a>
|
<script src="./static/js/emoji.min.js"></script>
|
||||||
</li>
|
<!-- 图片放大缩小支持 -->
|
||||||
</ul>
|
<script src="./static/js/zoom-image.min.js"></script>
|
||||||
</nav>
|
<!-- 搜索功能支持 -->
|
||||||
</div>
|
<script src="./static/js/search.min.js"></script>
|
||||||
<div class="iUp">
|
<!--在所有的代码块上添加一个简单的Click to copy按钮来允许用户从你的文档中轻易地复制代码-->
|
||||||
<nav class="cover-navigation navigation--social">
|
<script src="./static/js/docsify-copy-code.min.js"></script>
|
||||||
<ul class="navigation">
|
|
||||||
<li class="navigation__item">
|
|
||||||
<a href="https://github.com/ageerle/ruoyi-ai" title="github" target="_blank">
|
|
||||||
<i class='social iconfont icon-github'></i>
|
|
||||||
<span class="label">github</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li class="navigation__item">
|
|
||||||
<a href="https://blog.csdn.net/weixin_42416319" title="csdn" target="_blank">
|
|
||||||
<i class='social iconfont icon-csdn'></i>
|
|
||||||
<span class="label">csdn</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li class="navigation__item">
|
<!-- 回到顶部 -->
|
||||||
<a href="https://gitee.com/ageerle/ruoyi-ai" title="gitee" target="_blank">
|
<script src="./static/js/docsify-scroll-to-top.min.js"></script>
|
||||||
<i class='social iconfont icon-cnblogs'></i>
|
<!-- 分页导航 -->
|
||||||
<span class="label">gitee</span>
|
<script src="./static/js/docsify-pagination.min.js"></script>
|
||||||
</a>
|
<!-- 页脚-->
|
||||||
</li>
|
<script src="./static/js/docsify-footer.min.js"></script>
|
||||||
|
|
||||||
</ul>
|
<!-- 代码高亮 -->
|
||||||
</nav>
|
<script src="./static/js/prism-typescript.min.js"></script>
|
||||||
</div>
|
<script src="./static/js/prism-bash.min.js"></script>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="panel-cover--overlay cover-slate">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="remark iUp">
|
|
||||||
<p class="power" >
|
|
||||||
Copyright © 2023-2024 版权所有:xmzs 备案号:<a href="https://beian.miit.gov.cn/">鄂ICP备20231008611号</a>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
<script type="text/javascript" src="./assets/js/main.js"></script>
|
|
||||||
<script type="text/javascript" src="./assets/json/images.json?cb=getBingImages"></script>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
22
ruoyi-admin/src/main/resources/static/plus-ui/_sidebar.md
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<!-- _sidebar.md -->
|
||||||
|
- **特别赞助**
|
||||||
|
- [](http://ccflow.org/?frm=ryPlus)
|
||||||
|
- [](http://www.shuduokeji.com)
|
||||||
|
- [](https://www.jnpfsoft.com/index.html?from=plus-doc)
|
||||||
|
|
||||||
|
|
||||||
|
* **简介**
|
||||||
|
* [项目简介](/plus-ui/home.md)
|
||||||
|
* **开发文档**
|
||||||
|
* [通用方法](/plus-ui/devdoc/common_func.md)
|
||||||
|
* [开发规范](/plus-ui/devdoc/dev_norm.md)
|
||||||
|
* [请求流程](/plus-ui/devdoc/request_process.md)
|
||||||
|
* [路由使用](/plus-ui/devdoc/router_use.md)
|
||||||
|
* [组件使用](/plus-ui/devdoc/component_use.md)
|
||||||
|
* [权限使用](/plus-ui/devdoc/permissions_use.md)
|
||||||
|
* [页签缓存](/plus-ui/devdoc/page_cache.md)
|
||||||
|
* [使用图标](/plus-ui/devdoc/icon_use.md)
|
||||||
|
* [使用字典](/plus-ui/devdoc/dict_use.md)
|
||||||
|
* [使用参数](/plus-ui/devdoc/param_use.md)
|
||||||
|
* [异常处理](/plus-ui/devdoc/exception_handling.md)
|
||||||
|
* [内容复制](/plus-ui/devdoc/content_copy.md)
|
||||||
@@ -0,0 +1,234 @@
|
|||||||
|
# 通用方法
|
||||||
|
- - -
|
||||||
|
|
||||||
|
### $tab对象
|
||||||
|
> `$tab`对象用于做页签操作、刷新页签、关闭页签、打开页签、修改页签等,它定义在`plugins/tab.ts`文件中,它有如下方法
|
||||||
|
* 打开页签
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// 打开页签
|
||||||
|
proxy?.$tab.openPage('/system/user');
|
||||||
|
// 打开页签并指定页签标题
|
||||||
|
proxy?.$tab.openPage('/system/user', '用户管理');
|
||||||
|
proxy?.$tab.openPage('/system/user', '用户管理').then(() => {
|
||||||
|
// 执行结束的逻辑
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
* 修改页签
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// 修改当前页签
|
||||||
|
const obj = Object.assign({}, route, { title: '自定义标题' });
|
||||||
|
proxy?.$tab.updatePage(obj);
|
||||||
|
```
|
||||||
|
* 关闭页签
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// 关闭当前
|
||||||
|
proxy?.$tab.closePage();
|
||||||
|
// 关闭指定页签
|
||||||
|
const obj = { path: "/system/user", name: "User" };
|
||||||
|
proxy?.$tab.closePage(obj);
|
||||||
|
|
||||||
|
proxy?.$tab.closePage(obj).then(() => {
|
||||||
|
// 执行结束的逻辑
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
* 刷新页签
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// 刷新当前页签
|
||||||
|
proxy?.$tab.refreshPage();
|
||||||
|
|
||||||
|
// 刷新指定页签
|
||||||
|
const obj = { path: "/system/user", name: "User" };
|
||||||
|
proxy?.$tab.refreshPage(obj);
|
||||||
|
|
||||||
|
proxy?.$tab.refreshPage(obj).then(() => {
|
||||||
|
// 执行结束的逻辑
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
* 关闭所有页签
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
proxy?.$tab.closeAllPage();
|
||||||
|
|
||||||
|
proxy?.$tab.closeAllPage().then(() => {
|
||||||
|
// 执行结束的逻辑
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
* 关闭左侧页签
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// 关闭当前页签的左侧页签
|
||||||
|
proxy?.$tab.closeLeftPage();
|
||||||
|
|
||||||
|
// 关闭指定页签的左侧页签
|
||||||
|
const obj = { path: "/system/user", name: "User" };
|
||||||
|
proxy?.$tab.closeLeftPage(obj);
|
||||||
|
|
||||||
|
proxy?.$tab.closeLeftPage(obj).then(() => {
|
||||||
|
// 执行结束的逻辑
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
* 关闭右侧页签
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// 关闭当前页签的右侧页签
|
||||||
|
proxy?.$tab.closeRightPage();
|
||||||
|
|
||||||
|
// 关闭指定页签的右侧页签
|
||||||
|
const obj = { path: "/system/user", name: "User" };
|
||||||
|
proxy?.$tab.closeRightPage(obj);
|
||||||
|
|
||||||
|
proxy?.$tab.closeRightPage(obj).then(() => {
|
||||||
|
// 执行结束的逻辑
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
* 关闭其他页签
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
proxy?.$tab.closeOtherPage();
|
||||||
|
|
||||||
|
const obj = { path: "/system/user", name: "User" };
|
||||||
|
proxy?.$tab.closeOtherPage(obj);
|
||||||
|
|
||||||
|
proxy?.$tab.closeOtherPage(obj).then(() => {
|
||||||
|
// 执行结束的逻辑
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### $modal对象
|
||||||
|
> `$modal`对象用于做消息提示、通知提示、对话框提醒、二次确认、遮罩等,它定义在`plugins/modal.ts`文件中,它有如下方法
|
||||||
|
|
||||||
|
* 提供成功、警告和错误等反馈信息
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
proxy?.$modal.msg("默认反馈");
|
||||||
|
proxy?.$modal.msgError("错误反馈");
|
||||||
|
proxy?.$modal.msgSuccess("成功反馈");
|
||||||
|
proxy?.$modal.msgWarning("警告反馈");
|
||||||
|
```
|
||||||
|
|
||||||
|
* 提供成功、警告和错误等提示信息
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
proxy?.$modal.alert("默认提示");
|
||||||
|
proxy?.$modal.alertError("错误提示");
|
||||||
|
proxy?.$modal.alertSuccess("成功提示");
|
||||||
|
proxy?.$modal.alertWarning("警告提示");
|
||||||
|
```
|
||||||
|
|
||||||
|
* 提供成功、警告和错误等通知信息
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
proxy?.$modal.notify("默认通知");
|
||||||
|
proxy?.$modal.notifyError("错误通知");
|
||||||
|
proxy?.$modal.notifySuccess("成功通知");
|
||||||
|
proxy?.$modal.notifyWarning("警告通知");
|
||||||
|
```
|
||||||
|
|
||||||
|
* 提供确认窗体信息
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
proxy?.$modal.confirm('确认信息').then(function() {
|
||||||
|
...
|
||||||
|
}).then(() => {
|
||||||
|
...
|
||||||
|
}).catch(() => {});
|
||||||
|
```
|
||||||
|
|
||||||
|
* 提供遮罩层信息
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// 打开遮罩层
|
||||||
|
proxy?.$modal.loading("正在导出数据,请稍后...");
|
||||||
|
|
||||||
|
// 关闭遮罩层
|
||||||
|
proxy?.$modal.closeLoading();
|
||||||
|
```
|
||||||
|
|
||||||
|
### $auth对象
|
||||||
|
> `$auth`对象用于验证用户是否拥有某(些)权限或角色,它定义在`plugins/auth.ts`文件中,它有如下方法
|
||||||
|
|
||||||
|
* 验证用户权限
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// 验证用户是否具备某权限
|
||||||
|
proxy?.$auth.hasPermi("system:user:add");
|
||||||
|
// 验证用户是否含有指定权限,只需包含其中一个
|
||||||
|
proxy?.$auth.hasPermiOr(["system:user:add", "system:user:update"]);
|
||||||
|
// 验证用户是否含有指定权限,必须全部拥有
|
||||||
|
proxy?.$auth.hasPermiAnd(["system:user:add", "system:user:update"]);
|
||||||
|
```
|
||||||
|
|
||||||
|
* 验证用户角色
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// 验证用户是否具备某角色
|
||||||
|
proxy?.$auth.hasRole("admin");
|
||||||
|
// 验证用户是否含有指定角色,只需包含其中一个
|
||||||
|
proxy?.$auth.hasRoleOr(["admin", "common"]);
|
||||||
|
// 验证用户是否含有指定角色,必须全部拥有
|
||||||
|
proxy?.$auth.hasRoleAnd(["admin", "common"]);
|
||||||
|
```
|
||||||
|
|
||||||
|
### $cache对象
|
||||||
|
> `$cache`对象用于处理缓存。我们并不建议您直接使用`sessionStorage`或`localStorage`(vue3版本推荐使用useStorage),因为项目的缓存策略可能发生变化,通过`$cache`对象做一层调用代理则是一个不错的选择。`$cache`提供`session`和`local`两种级别的缓存,如下:
|
||||||
|
|
||||||
|
| 对象名称 | 缓存类型 |
|
||||||
|
| -------- | ---------------------------------- |
|
||||||
|
| session | 会话级缓存,通过sessionStorage实现 |
|
||||||
|
| local | 本地级缓存,通过localStorage实现 |
|
||||||
|
|
||||||
|
|
||||||
|
**示例**
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// local 普通值
|
||||||
|
proxy?.$cache.local.set('key', 'local value')
|
||||||
|
console.log(proxy?.$cache.local.get('key')) // 输出'local value'
|
||||||
|
|
||||||
|
// session 普通值
|
||||||
|
proxy?.$cache.session.set('key', 'session value')
|
||||||
|
console.log(proxy?.$cache.session.get('key')) // 输出'session value'
|
||||||
|
|
||||||
|
// local JSON值
|
||||||
|
proxy?.$cache.local.setJSON('jsonKey', { localProp: 1 })
|
||||||
|
console.log(proxy?.$cache.local.getJSON('jsonKey')) // 输出'{localProp: 1}'
|
||||||
|
|
||||||
|
// session JSON值
|
||||||
|
proxy?.$cache.session.setJSON('jsonKey', { sessionProp: 1 })
|
||||||
|
console.log(proxy?.$cache.session.getJSON('jsonKey')) // 输出'{sessionProp: 1}'
|
||||||
|
|
||||||
|
// 删除值
|
||||||
|
proxy?.$cache.local.remove('key')
|
||||||
|
proxy?.$cache.session.remove('key')
|
||||||
|
```
|
||||||
|
|
||||||
|
### $download对象
|
||||||
|
|
||||||
|
> `$download`对象用于文件下载,它定义在`plugins/download.ts`文件中,它有如下方法
|
||||||
|
|
||||||
|
* 通过ossId从存储中下载文件
|
||||||
|
|
||||||
|
``` typescript
|
||||||
|
// 默认下载方法
|
||||||
|
proxy?.$download.oss(ossId);
|
||||||
|
```
|
||||||
|
|
||||||
|
* 根据请求地址下载zip包
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
const url = '/tool/gen/batchGenCode?tables=' + tableNames;
|
||||||
|
const name = 'ruoyi';
|
||||||
|
|
||||||
|
// 默认方法
|
||||||
|
proxy?.$download.zip(url, name);
|
||||||
|
```
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
# 组件使用
|
||||||
|
- - -
|
||||||
|
|
||||||
|
vue 注册组件的两种方式
|
||||||
|
在 `@/components` 下创建的.vue文件自动为全局组件,可直接在任意位置使用。
|
||||||
|
|
||||||
|
### 局部注册
|
||||||
|
在对应页使用`components`注册组件。
|
||||||
|
```typescript
|
||||||
|
<script setup lang=ts>
|
||||||
|
import ComponentA from './ComponentA.vue'
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<ComponentA />
|
||||||
|
</template>
|
||||||
|
```
|
||||||
|
|
||||||
|
### 全局注册
|
||||||
|
我们可以使用[ Vue 应用实例](https://cn.vuejs.org/guide/essentials/application.html)的 `.component()` 方法,让组件在当前 Vue 应用中全局可用。
|
||||||
|
```typescript
|
||||||
|
import { createApp } from 'vue'
|
||||||
|
|
||||||
|
const app = createApp({})
|
||||||
|
|
||||||
|
app.component(
|
||||||
|
// 注册的名字
|
||||||
|
'MyComponent',
|
||||||
|
// 组件的实现
|
||||||
|
{
|
||||||
|
/* ... */
|
||||||
|
}
|
||||||
|
)
|
||||||
|
```
|
||||||
|
如果使用单文件组件,你可以注册被导入的 `.vue` 文件:
|
||||||
|
```typescript
|
||||||
|
import MyComponent from './App.vue'
|
||||||
|
|
||||||
|
app.component('MyComponent', MyComponent)
|
||||||
|
```
|
||||||
|
`.component()` 方法可以被链式调用:
|
||||||
|
```typescript
|
||||||
|
app
|
||||||
|
.component('ComponentA', ComponentA)
|
||||||
|
.component('ComponentB', ComponentB)
|
||||||
|
.component('ComponentC', ComponentC)
|
||||||
|
```
|
||||||
|
全局注册的组件可以在此应用的任意组件的模板中使用:
|
||||||
|
```Typescript
|
||||||
|
// 这在当前应用的任意组件中都可用
|
||||||
|
<ComponentA/>
|
||||||
|
<ComponentB/>
|
||||||
|
<ComponentC/>
|
||||||
|
```
|
||||||
|
所有的子组件也可以使用全局注册的组件,这意味着这三个组件也都可以在彼此内部使用。
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
# 内容复制
|
||||||
|
- - -
|
||||||
|
|
||||||
|
文档建设中
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
# 开发规范
|
||||||
|
- - -
|
||||||
|
|
||||||
|
### 新增view
|
||||||
|
> 在`@/views`文件下创建对应的文件夹,一般性一个路由对应一个文件, 该模块下的功能就建议在本文件夹下创建一个新文件夹,各个功能模块维护自己的`utils`或`components`组件。
|
||||||
|
|
||||||
|
### 新增api
|
||||||
|
> 在`@/api`文件夹下创建本模块对应的api服务。
|
||||||
|
> 在api服务同级创建`types.ts`类型声明文件。
|
||||||
|
|
||||||
|
### 新增组件
|
||||||
|
> 在全局的`@/components`写一些全局的组件,如富文本,各种搜索组件,封装的分页组件等等能被公用的组件。 每个页面或者模块特定的业务组件则会写在当前`@/views`下面。
|
||||||
|
如:`@/views/system/user/components/xxx.vue`。这样拆分大大减轻了维护成本。
|
||||||
|
|
||||||
|
### 新增样式
|
||||||
|
> 页面的样式和组件是一个道理,全局的`@/style`放置一下全局公用的样式,每一个页面的样式就写在当前 views下面,请记住加上scoped 就只会作用在当前组件内了,避免造成全局的样式污染。
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
# 使用字典
|
||||||
|
- - -
|
||||||
|
|
||||||
|
文档建设中
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
# 异常处理
|
||||||
|
- - -
|
||||||
|
|
||||||
|
文档建设中
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
# 使用图标
|
||||||
|
- - -
|
||||||
|
|
||||||
|
文档建设中
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
# 页签缓存
|
||||||
|
- - -
|
||||||
|
|
||||||
|
文档建设中
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
# 使用参数
|
||||||
|
- - -
|
||||||
|
|
||||||
|
文档建设中
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
# 权限使用
|
||||||
|
- - -
|
||||||
|
|
||||||
|
文档建设中
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
# 请求流程
|
||||||
|
- - -
|
||||||
|
|
||||||
|
### 交互流程
|
||||||
|
一个完整的前端UI交互到服务器端处理流程是这样的:
|
||||||
|
|
||||||
|
1. UI 组件交互操作;
|
||||||
|
2. 调用统一管理的 api service 请求函数;
|
||||||
|
3. 使用封装的 request.js 发送请求;
|
||||||
|
4. 获取服务端返回;
|
||||||
|
5. 更新 data;
|
||||||
|
|
||||||
|
为了方便管理维护,统一的请求处理都放在`@/src/api`文件夹中,并且一般按照`model`维度进行拆分文件,如:
|
||||||
|
```
|
||||||
|
api/
|
||||||
|
system/
|
||||||
|
user/
|
||||||
|
index.ts
|
||||||
|
types.ts
|
||||||
|
role/
|
||||||
|
index.ts
|
||||||
|
types.ts
|
||||||
|
monitor/
|
||||||
|
operlog/
|
||||||
|
index.ts
|
||||||
|
types.ts
|
||||||
|
logininfor/
|
||||||
|
index.ts
|
||||||
|
types.ts
|
||||||
|
...
|
||||||
|
```
|
||||||
|
> **提示**
|
||||||
|
> 其中`@/src/utils/request.ts`是基于 axios 的封装,便于统一处理 POST,GET 等请求参数,请求头,以及错误提示信息等。 它封装了全局request拦截器、response拦截器、统一的错误处理、统一做了超时处理、baseURL设置等。
|
||||||
|
|
||||||
|
### 请求示例
|
||||||
|
```typescript
|
||||||
|
// @/api/system/user/index.ts
|
||||||
|
import request from '@/utils/request';
|
||||||
|
import { AxiosPromise } from 'axios';
|
||||||
|
import { UserQuery, UserVO } from './types';
|
||||||
|
|
||||||
|
export const listUser = (query: UserQuery): AxiosPromise<UserVO[]> => {
|
||||||
|
return request({
|
||||||
|
url: '/system/user/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// @/views/system/user/index.vue
|
||||||
|
import api from '@/api/system/user';
|
||||||
|
const res = await api.listUser(proxy?.addDateRange(queryParams.value, dateRange.value));
|
||||||
|
```
|
||||||
|
> **提示**
|
||||||
|
> 如果有不同的`baseURL`,直接通过覆盖的方式,让它具有不同的`baseURL`。
|
||||||
|
> ```typescript
|
||||||
|
> export const listUser = (query: UserQuery): AxiosPromise<UserVO[]> => {
|
||||||
|
> return request({
|
||||||
|
> url: '/system/user/list',
|
||||||
|
> method: 'get',
|
||||||
|
> params: query,
|
||||||
|
> baseURL: process.env.BASE_API
|
||||||
|
> });
|
||||||
|
> };
|
||||||
|
> ```
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
# 路由使用
|
||||||
|
- - -
|
||||||
|
|
||||||
|
框架的核心是通过路由自动生成对应导航,所以除了路由的基本配置,还需要了解框架提供了哪些配置项。
|
||||||
|
### 路由配置
|
||||||
|
```typescript
|
||||||
|
// 当设置 true 的时候该路由不会在侧边栏出现 如401,login等页面,或者如一些编辑页面/edit/1
|
||||||
|
hidden: true // (默认 false)
|
||||||
|
|
||||||
|
//当设置 noRedirect 的时候该路由在面包屑导航中不可被点击
|
||||||
|
redirect: 'noRedirect'
|
||||||
|
|
||||||
|
// 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面
|
||||||
|
// 只有一个时,会将那个子路由当做根路由显示在侧边栏--如引导页面
|
||||||
|
// 若你想不管路由下面的 children 声明的个数都显示你的根路由
|
||||||
|
// 你可以设置 alwaysShow: true,这样它就会忽略之前定义的规则,一直显示根路由
|
||||||
|
alwaysShow: true
|
||||||
|
|
||||||
|
name: 'router-name' // 设定路由的名字,一定要填写不然使用<keep-alive>时会出现各种问题
|
||||||
|
query: '{"id": 1, "name": "ry"}' // 访问路由的默认传递参数
|
||||||
|
roles: ['admin', 'common'] // 访问路由的角色权限
|
||||||
|
permissions: ['a:a:a', 'b:b:b'] // 访问路由的菜单权限
|
||||||
|
|
||||||
|
meta: {
|
||||||
|
title: 'title' // 设置该路由在侧边栏和面包屑中展示的名字
|
||||||
|
icon: 'svg-name' // 设置该路由的图标,支持 svg-class,也支持 el-icon-x element-ui 的 icon
|
||||||
|
noCache: true // 如果设置为true,则不会被 <keep-alive> 缓存(默认 false)
|
||||||
|
breadcrumb: false // 如果设置为false,则不会在breadcrumb面包屑中显示(默认 true)
|
||||||
|
affix: true // 如果设置为true,它则会固定在tags-view中(默认 false)
|
||||||
|
|
||||||
|
// 当路由设置了该属性,则会高亮相对应的侧边栏。
|
||||||
|
// 这在某些场景非常有用,比如:一个文章的列表页路由为:/article/list
|
||||||
|
// 点击文章进入文章详情页,这时候路由为/article/1,但你想在侧边栏高亮文章列表的路由,就可以进行如下设置
|
||||||
|
activeMenu: '/article/list'
|
||||||
|
}
|
||||||
|
```
|
||||||
|
**普通示例**
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
path: '/system/test',
|
||||||
|
component: Layout,
|
||||||
|
redirect: 'noRedirect',
|
||||||
|
hidden: false,
|
||||||
|
alwaysShow: true,
|
||||||
|
meta: { title: '系统管理', icon : "system" },
|
||||||
|
children: [{
|
||||||
|
path: 'index',
|
||||||
|
component: (resolve) => require(['@/views/index'], resolve),
|
||||||
|
name: 'Test',
|
||||||
|
meta: {
|
||||||
|
title: '测试管理',
|
||||||
|
icon: 'user'
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
**外链示例**
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
path: 'http://ruoyi.vip',
|
||||||
|
meta: { title: '若依官网', icon : "guide" }
|
||||||
|
}
|
||||||
|
```
|
||||||
|
### 静态路由
|
||||||
|
代表那些不需要动态判断权限的路由,如登录页、404、等通用页面,在`@/router/index.ts`配置对应的公共路由。
|
||||||
|
### 动态路由
|
||||||
|
代表那些需要根据用户动态判断权限并通过addRoutes动态添加的页面,在`@/store/modules/permission.ts`加载后端接口路由配置。
|
||||||
|
> **提示**
|
||||||
|
> * 动态路由可以在系统管理-菜单管理进行新增和修改操作,前端加载会自动请求接口获取菜单信息并转换成前端对应的路由。
|
||||||
|
> * 动态路由在生产环境下会默认使用路由懒加载,实现方式参考loadView方法的判断。
|
||||||
|
### 常用方法
|
||||||
|
想要跳转到不同的页面,使用`router.push`方法
|
||||||
|
```Typescript
|
||||||
|
const router = useRouter();
|
||||||
|
router.push({ path: "/system/user" });
|
||||||
|
```
|
||||||
|
跳转页面并设置请求参数,使用`query`属性
|
||||||
|
```Typescript
|
||||||
|
const router = useRouter();
|
||||||
|
router.push({ path: "/system/user", query: {id: "1", name: "若依"} });
|
||||||
|
```
|
||||||
|
更多使用可以参考[vue-router](https://router.vuejs.org/zh/)官方文档。
|
||||||