Lucky-AdminLucky-Admin
简介
快速开始
代码生成
  • Lucky-Admin-Vue3
  • Ruo-Yi
  • Vue-Admin
  • Sa-Token
  • vue3-element-admin
简介
快速开始
代码生成
  • Lucky-Admin-Vue3
  • Ruo-Yi
  • Vue-Admin
  • Sa-Token
  • vue3-element-admin
  • Lucky-Admin

    • 在线预览
    • 简介
    • 快速开始
    • 代码生成
    • 常见问题
  • 社交

知悉

若在此栏中没有获取到有用的信息,可以反馈到issues中。我们将十分感谢您的反馈,并尽快处理您的反馈信息。

增加用户默认密码(admin123)

系统接口:/system/sys-users/saveOne

配置位置:src/main/resources/application.yml

lucky:
  system:
    defaultPassword: admin123

系统个性化配置包

配置位置:src/main/java/cn/anlucky/admin/system/config/lucky/所有文件

  1. 支持在 application.yml 中使用 包括但不限于 application-dev.yml application-prod.yml 中
  2. 配置方式可参考 src/main/java/cn/anlucky/admin/system/config/lucky/LuckyConfig.java
  3. application.yml中的配置可参考 src/main/resources/application.yml

文件上传

文件上传可参考例子用户头像上传 前端路径:src\views\profile\index.vue

// 封装formData满足后端MultipartFile文件上传格式,不可直接传入File

const formData = new FormData();

formData.append("file", file);
// 携带其他数据可继续增加
// 如:formData.append("type", "avatar");
// 调用接口
uploadAvatar(formData)
    .then((res) => {
    loadUserProfile()
})
    .finally(() => {
    loading.value = false;
});

/**
 * 修改用户头像
 * @param formData 文件
 * @returns 文件信息
 */
export const uploadAvatar = (formData:FormData) => {
  return request.upload<ISysFile>("/user/uploadAvatar",formData);
};

多文件上传

以头像上传为例子,可修改为

// 接口
/**
 * 修改用户头像
 * @param formData 文件
 * @returns 文件信息
 */
export const uploadAvatar = (formData:FormData) => {
  return request.upload<ISysFile>("/user/uploadAvatar",formData);
};

// !!重要
const formData = new FormData();
const files:File[] = [];
files.push(file)
files.foreach(file=>{
    formData.append("files", file,file.name);
})
// !!
uploadAvatar(formData)
    .then((res) => {
    loadUserProfile()
})
    .finally(() => {
    loading.value = false;
});

重要

  1. 前端formData.append('files', file, file.name),字段名files(第一个参数)必须与后端params参数完全一致,这是 SpringBoot 绑定参数的核心规则。
  2. formData.append('files', file, file.name) 第三个参数必须传递原始文件名,否则后端file.getOriginalFilename()会获取不到值。

文件上传配置

限制文件上传大小有两种方式

  1. Tomcat限制文件传输大小,当文件大小大于设置大小时Tomcat将会拒绝连接,前端页面上将会报错:ERR_CONNECTION_RESET 连接错误设置位置在src/main/resources/application.yml
# 此方式不经过controller资源消耗较小,但报错信息不够明确
 servlet:
    multipart:
      enabled: true
      # 设置单个文件的最大大小
      max-file-size: 100MB
      # 设置请求中所有文件的最大总大小
      max-request-size: 100MB
  1. 系统接受文件的传输,在后端系统重进行文件大小判断,此方式经过后端controller,将会在业务程序中进行判断设置位置在src/main/resources/application.yml
# 此方式经过controller,资源消耗根据文件大小决定,报错信息可控,明确
lucky:
  file:
    # 文件上传路径
    uploadPath: D:/UPLOAD
    # 支持上传的文件类型
    fileType: jpeg,jpg,png,gif
    # 文件最大大小 MB
    fileMaxSize: 10
    # 文件名最大长度
    fileNameMaxLength: 100

提示

文件上传类型的支持 fileType 请用英文逗号进行间隔

文件上传接口

系统中内置了上传文件到本地的功能,如果要实现上传文件到其他地方,请自行实现接口src/main/java/cn/anlucky/admin/system/service/FileUploadService.java

实现方式可参考:cn/anlucky/admin/system/service/impl/FileUploadServiceImpl.java

警告

在实现多文件上传时,不可直接循环调用uploadFile,因为会触发AOP多次触发,可能会有不必要的资源消耗

所以您在多文件上传时需要单独写uploadFiles

文件上传AOP

文件上传AOP中写了环绕通知,其中方法handleBefore(List<MultipartFile> files)中是在文件上传之前调用,此方法中检测了文件大小、文件名称长度、支持上传的文件类型是否符合规则

重要

若您要添加规则,请在这里添加整个系统的规则,若为某一个业务的规则,请单独在业务接口中进行判断

文件上传基本流程

  1. 调用接口uploadFile上传文件成功之后将会返回SysFile对象

  2. 系统中提供的SysFile文件列表,您可以根据自己的需要来决定是否保存到数据库当中去

  3. 理论上来讲文件的哈希(file_hash)和文件的绝对路径(storage_path)是不允许重复的,但考虑到部分用户不考虑重复上传同一文件的情况,所以在数据库建表时我们没有设置字段的唯一约束,若您需要唯一约束可以增加或在业务层面进行判断

  4. 上传文件接口请保证接口专注于做某一项事情,尤其是上传文件,不要将业务代码写入上传文件当中去,若您需要,请再另外抽象接口来实现您的业务需求

  5. 事务管理,文件的事务与数据库事务是不一样的事务,当文件上传成功,数据库报错时,已经上传成功的文件不会被回滚,但数据库保存成功,文件上传保存失败则会回滚数据库

重要

若您的业务中需要上传文件,请详细了解系统文件上传流程以及执行方式,因为这样可能会让你少走很多的弯路

WebSocket配置

配置位置前端

开发环境:.env.development

生产环境:.env.production

VITE_APP_WS_ENDPOINT=http://localhost:8080/dev-api/ws

本项目的通知公告采用了STOMP发布订阅模式

具体后端配置代码位置:cn/anlucky/admin/websocket/config/WebSocketConfiguration.java

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer {
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws")
                .setAllowedOriginPatterns("*")
                .addInterceptors(new WebSocketAuthHandshakeInterceptor()); // 连接握手鉴权拦截器
    }

    /**
     * 配置消息代理
     */
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        // 客户端订阅消息的请求前缀,topic一般用于广播推送,queue用于点对点推送
        registry.enableSimpleBroker("/topic","/queue");
        // 客户端发送消息的请求前缀
        registry.setApplicationDestinationPrefixes("/app");
        // 点对点消息的用户前缀(对应 @SendToUser 注解)
        registry.setUserDestinationPrefix("/user");

    }

    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        // 信息拦截器
        // registration.interceptors(new WebsocketInterceptor());
    }
}

websocket连接判断

判断websocket是否已经连接,需要看通知铃铛的颜色是否为绿色,若为绿色则表示websocket已经正常连接并且可以通信,当然您也可以去打开debug模式,以通知公告为例子,代码位置为:前端src\composables\websocket\useNoticeSync.ts 与其相同的字典配置位置为同目录下的:src\composables\websocket\useDictSync.ts

  const stomp = useStomp({
    reconnectDelay: 20000,
    connectionTimeout: 10000,
    useExponentialBackoff: false,
    maxReconnectAttempts: 3,
    autoRestoreSubscriptions: true,
    debug: false, // 在这里打开debug为true
  });

打开debug模式后,将会输出websocket的连接信息日志

字典实时更新

所有用户订阅了字典通知:/topic/public/dictChange在字典项目变更时:修改、删除将会通知用户前端从而删除浏览器缓存的字典在下次查询时会自动缓存新的内容到浏览器

重要

必须配置websocket才生效

通知公告

在websocket配置连通,发布通知之后会通知所有的用户更新自己的通知列表,用户统一订阅通知消息/topic/public/notice会在发布、撤回、删除通知时进行刷新从而显示通知未读条数。

IP取真实地址

在登录时会获取登录IP的真实地址,本项目使用的是高德地图提供的API,其中秘钥需要自己去申请,个人开发者在2026年2月27日时为每个月15W额度,注意申请的KEY为WEB服务,请在申请的时候看清楚

高德地图开放平台:高德开放平台 | 高德地图API

大概的申请步骤 (全程大概5分钟)

  1. 注册开放平台账户并实名认证,可使用支付宝快速实名
  2. 在控制台中创建应用
  3. 在创建的应用下添加Key,服务平台选择:WEB服务
  4. 提交审核,一分钟左右
  5. 刷新页面即可看到Key,配置到后端项目中即可

高德IP定位服务文档:IP定位-基础 API 文档-开发指南-Web服务 API|高德地图API

最近更新:: 2026/2/27 19:17
Contributors: DuYiFan
Prev
代码生成