15 KiB
15 KiB
Lyzsys 常见问题 (FAQ)
📖 目录
快速导航
新手入门
开发相关
部署相关
后端开发问题
Q1: 如何快速开始?
A: 按照以下步骤操作:
-
克隆项目
git clone https://github.com/your-org/lyzsys.git cd lyzsys/lyzsys_backend -
导入数据库
mysql -u root -p < sql/lyzsys.sql -
修改配置
# application.yaml spring: datasource: url: jdbc:mysql://localhost:3306/lyzsys username: root password: your_password -
启动项目
mvn spring-boot:run -
访问系统
- 后端地址: http://localhost:48080
- API 文档: http://localhost:48080/doc.html
Q2: 如何添加新的业务模块?
A: 按照以下步骤创建新模块:
-
创建模块目录
lyzsys-module-xxx/ ├── src/ │ └── main/ │ ├── java/ │ └── resources/ └── pom.xml -
创建模块 pom.xml
<parent> <groupId>cn.iocoder</groupId> <artifactId>lyzsys-backend</artifactId> <version>1.0.0</version> </parent> <artifactId>lyzsys-module-xxx</artifactId> <packaging>jar</packaging> <dependencies> <!-- 依赖其他模块 --> </dependencies> -
创建标准包结构
cn.iocoder.lyzsys.module.xxx/ ├── api/ ├── controller/ │ ├── admin/ │ └── app/ ├── service/ ├── dal/ │ ├── dataobject/ │ ├── mysql/ │ └── redis/ ├── convert/ └── enums/ -
在主 pom.xml 中添加模块
<modules> <module>lyzsys-module-xxx</module> </modules> -
在 lyzsys-server 中引入
<dependency> <groupId>cn.iocoder</groupId> <artifactId>lyzsys-module-xxx</artifactId> </dependency>
Q3: 如何实现权限控制?
A: Lyzsys 提供了多层次的权限控制:
1. 接口权限
使用 @PreAuthorize 注解:
@PostMapping("/create")
@PreAuthorize("@ss.hasPermission('system:user:create')")
public CommonResult<Long> createUser(@Valid @RequestBody UserCreateReqVO reqVO) {
return success(userService.createUser(reqVO));
}
2. 数据权限
使用 @DataScope 注解:
@DataScope(deptAlias = "d", userAlias = "u")
public List<UserDO> getUserList() {
return userMapper.selectList();
}
3. 前端权限
使用权限指令:
<!-- 有权限时显示 -->
<el-button v-hasPermi="['system:user:create']">创建</el-button>
<!-- 有角色时显示 -->
<el-button v-hasRole="['admin']">管理员操作</el-button>
Q4: 如何使用代码生成器?
A: 代码生成器使用步骤:
-
访问代码生成
- 登录系统后,进入「基础设施」→「代码生成」
-
导入数据库表
- 点击「导入」按钮
- 选择要生成的表
-
配置生成信息
- 基本信息:模块名、业务名、功能名
- 生成信息:包路径、模块名、业务名
- 字段信息:字段显示、查询条件、必填项
-
生成代码
- 点击「生成代码」按钮
- 下载代码压缩包
-
导入项目
- 解压代码到对应模块
- 创建菜单和权限
Q5: 如何实现文件上传?
A: 文件上传实现步骤:
1. 配置文件存储
lyzsys:
upload:
base-url: http://your-domain.com
storage:
minio:
endpoint: http://localhost:9000
access-key: your_access_key
secret-key: your_secret_key
bucket-name: lyzsys
2. 后端上传
@PostMapping("/upload")
public CommonResult<String> uploadFile(@RequestParam("file") MultipartFile file) {
String url = fileService.uploadFile(file);
return success(url);
}
3. 前端上传
<el-upload
:action="uploadUrl"
:headers="uploadHeaders"
:on-success="handleSuccess"
>
<el-button type="primary">上传文件</el-button>
</el-upload>
Q6: 如何使用 Redis 缓存?
A: Redis 缓存使用方法:
1. 使用 Spring Cache
@Cacheable(value = "user", key = "#id")
public UserDO getUser(Long id) {
return userMapper.selectById(id);
}
@CachePut(value = "user", key = "#user.id")
public UserDO updateUser(UserDO user) {
userMapper.updateById(user);
return user;
}
@CacheEvict(value = "user", key = "#id")
public void deleteUser(Long id) {
userMapper.deleteById(id);
}
2. 使用 RedisTemplate
@Autowired
private RedisTemplate<String, UserDO> redisTemplate;
public UserDO getUser(Long id) {
String key = "user:" + id;
UserDO user = redisTemplate.opsForValue().get(key);
if (user == null) {
user = userMapper.selectById(id);
redisTemplate.opsForValue().set(key, user, 1, TimeUnit.HOURS);
}
return user;
}
前端开发问题
Q7: 如何修改前端页面?
A: 前端页面修改步骤:
-
找到页面文件
- 页面文件位于
src/views/目录 - 按照模块分类,如
src/views/system/user/
- 页面文件位于
-
修改页面内容
<template> <div class="user-list"> <!-- 页面内容 --> </div> </template> <script setup lang="ts"> // 脚本逻辑 </script> <style scoped lang="scss"> // 样式 </style> -
热更新
- 修改后自动热更新,无需重启
-
构建测试
pnpm build:prod
Q8: 如何调用后端 API?
A: API 调用方法:
1. 定义 API
// src/api/system/user/index.ts
import request from '@/utils/request'
export function getUserPage(params: UserPageReqVO) {
return request.get({ url: '/system/user/page', params })
}
export function createUser(data: UserCreateReqVO) {
return request.post({ url: '/system/user/create', data })
}
2. 调用 API
<script setup lang="ts">
import { ref } from 'vue'
import { getUserPage } from '@/api/system/user'
const loading = ref(false)
const tableData = ref([])
async function fetchUsers() {
loading.value = true
try {
const { data } = await getUserPage({
pageNo: 1,
pageSize: 10
})
tableData.value = data.list
} finally {
loading.value = false
}
}
</script>
Q9: 如何实现国际化?
A: 国际化实现步骤:
1. 添加语言文件
// src/locales/zh-CN/common.ts
export default {
title: 'Lyzsys 管理系统',
logout: '退出登录'
}
// src/locales/en/common.ts
export default {
title: 'Lyzsys Admin',
logout: 'Logout'
}
2. 使用翻译
<template>
<h1>{{ $t('common.title') }}</h1>
</template>
<script setup lang="ts">
import { useI18n } from '@/hooks/web/useI18n'
const { t } = useI18n()
const title = t('common.title')
</script>
Q10: 如何自定义主题?
A: 主题定制方法:
1. 修改主题色
// styles/variables.scss
$primary-color: #409eff;
$success-color: #67c23a;
$warning-color: #e6a23c;
$danger-color: #f56c6c;
2. 动态切换主题
import { useAppStore } from '@/store/modules/app'
const appStore = useAppStore()
// 切换暗黑模式
function toggleDarkMode() {
appStore.setDarkMode(!appStore.getDarkMode)
}
Q11: 如何使用 Element Plus 组件?
A: Element Plus 组件使用:
1. 表格组件
<el-table :data="tableData" border>
<el-table-column prop="name" label="姓名" />
<el-table-column prop="email" label="邮箱" />
<el-table-column label="操作">
<template #default="{ row }">
<el-button link @click="handleEdit(row)">编辑</el-button>
</template>
</el-table-column>
</el-table>
2. 表单组件
<el-form :model="form" :rules="rules" ref="formRef">
<el-form-item label="用户名" prop="username">
<el-input v-model="form.username" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleSubmit">提交</el-button>
</el-form-item>
</el-form>
3. 对话框组件
<el-dialog v-model="visible" title="提示">
<span>这是一段内容</span>
<template #footer>
<el-button @click="visible = false">取消</el-button>
<el-button type="primary" @click="visible = false">确定</el-button>
</template>
</el-dialog>
部署运维问题
Q12: 如何部署到生产环境?
A: 生产部署步骤:
后端部署
-
打包项目
mvn clean package -DskipTests -
上传到服务器
scp lyzsys-server.jar user@server:/opt/lyzsys/ -
启动服务
java -jar lyzsys-server.jar --spring.profiles.active=prod
前端部署
-
构建项目
pnpm build:prod -
部署到 Nginx
scp -r dist/* user@server:/var/www/lyzsys/ -
配置 Nginx
server { listen 80; server_name your-domain.com; root /var/www/lyzsys; location / { try_files $uri $uri/ /index.html; } location /admin-api/ { proxy_pass http://localhost:48080/admin-api/; } }
Q13: 如何配置数据库连接?
A: 数据库连接配置:
spring:
datasource:
url: jdbc:mysql://localhost:3306/lyzsys?useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: your_password
driver-class-name: com.mysql.cj.jdbc.Driver
# 连接池配置
hikari:
minimum-idle: 5
maximum-pool-size: 20
idle-timeout: 30000
connection-timeout: 30000
Q14: 如何配置 SSL 证书?
A: SSL 证书配置步骤:
-
获取证书
certbot certonly --standalone -d your-domain.com -
配置 Nginx
server { listen 443 ssl http2; server_name your-domain.com; ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; } server { listen 80; server_name your-domain.com; return 301 https://$server_name$request_uri; }
Q15: 如何进行备份和恢复?
A: 备份恢复方法:
数据库备份
# 备份
mysqldump -u root -p lyzsys > lyzsys_backup.sql
# 恢复
mysql -u root -p lyzsys < lyzsys_backup.sql
文件备份
# 备份
tar -czf lyzsys_backup.tar.gz /var/www/lyzsys
# 恢复
tar -xzf lyzsys_backup.tar.gz -C /
性能优化问题
Q16: 如何进行性能优化?
A: 性能优化建议:
后端优化
-
数据库优化
- 添加索引
- 优化 SQL
- 使用缓存
-
代码优化
- 批量操作
- 异步处理
- 减少数据库查询
-
JVM 优化
java -Xms2g -Xmx2g \ -XX:+UseG1GC \ -XX:MaxGCPauseMillis=200 \ -jar lyzsys-server.jar
前端优化
-
代码分割
const UserList = defineAsyncComponent(() => import('./views/system/user/index.vue')) -
资源优化
- 压缩代码
- 使用 CDN
- 图片优化
-
缓存优化
- 浏览器缓存
- 本地存储
- Service Worker
Q17: 如何处理高并发?
A: 高并发处理方案:
-
水平扩展
- 应用集群
- 负载均衡
- 数据库主从
-
缓存策略
- Redis 缓存
- 本地缓存
- 缓存预热
-
异步处理
- 消息队列
- 异步任务
- 线程池
-
限流降级
- 接口限流
- 服务降级
- 熔断保护
功能定制问题
Q18: 如何修改 Logo 和标题?
A: 品牌定制方法:
1. 修改前端
// src/config/index.ts
export default {
title: '你的系统名称',
logo: '/logo.png'
}
2. 修改后端
lyzsys:
info:
name: '你的系统名称'
version: '1.0.0'
Q19: 如何集成第三方服务?
A: 第三方集成方法:
1. 短信集成
@Service
public class SmsServiceImpl implements SmsService {
@Autowired
private SmsClient smsClient;
public void sendSms(String mobile, String content) {
SmsSendReqDTO req = new SmsSendReqDTO();
req.setMobile(mobile);
req.setContent(content);
smsClient.send(req);
}
}
2. 支付集成
@Service
public class PayServiceImpl implements PayService {
@Autowired
private PayClient payClient;
public String createOrder(PayOrderCreateReqDTO req) {
return payClient.createOrder(req);
}
}
故障排查问题
Q20: 如何查看错误日志?
A: 日志查看方法:
后端日志
# 查看应用日志
tail -f logs/lyzsys.log
# 查看错误日志
grep ERROR logs/lyzsys.log
# 查看 Nginx 日志
tail -f /var/log/nginx/error.log
前端日志
// 浏览器控制台
console.log('日志信息')
console.error('错误信息')
// 网络请求
// Network 标签查看请求详情
Q21: 常见错误及解决方案
1. 数据库连接失败
错误: Could not get JDBC Connection
解决方案:
- 检查数据库是否启动
- 检查连接信息是否正确
- 检查防火墙是否开放端口
2. Redis 连接失败
错误: Unable to connect to Redis
解决方案:
- 检查 Redis 是否启动
- 检查 Redis 密码是否正确
- 检查 Redis 地址是否正确
3. 前端页面空白
错误: 页面无法显示
解决方案:
- 检查 Nginx 配置
- 检查前端路由配置
- 检查浏览器控制台错误
4. API 请求失败
错误: Network Error
解决方案:
- 检查后端服务是否启动
- 检查 API 地址是否正确
- 检查跨域配置
文档版本: v1.0.0 最后更新: 2025-01-19 维护团队: Lyzsys 开发团队