├── 数据库设计 ├── test.txt └── 白马湖飞行.docx ├── client ├── src │ ├── main │ │ ├── resources │ │ │ └── application.properties │ │ └── java │ │ │ └── com │ │ │ └── zzk │ │ │ └── client │ │ │ └── clientServe │ │ │ ├── Gps.java │ │ │ ├── TcpProtocol.java │ │ │ ├── ClientHeartbeatHandler.java │ │ │ └── EncoderHandler.java │ └── test │ │ └── java │ │ └── com │ │ └── zzk │ │ └── client │ │ └── ClientApplicationTests.java ├── .mvn │ └── wrapper │ │ ├── maven-wrapper.jar │ │ └── maven-wrapper.properties └── .gitignore ├── fly-ui ├── public │ ├── robots.txt │ ├── favicon.png │ ├── favicon2.ico │ └── drone │ │ └── drone.png ├── src │ ├── components │ │ ├── ParentView │ │ │ └── index.vue │ │ ├── Map │ │ │ ├── eventBus │ │ │ │ └── eventBus.js │ │ │ └── search │ │ │ │ └── search.vue │ │ ├── IconSelect │ │ │ └── requireIcons.js │ │ ├── RuoYi │ │ │ ├── Doc │ │ │ │ └── index.vue │ │ │ └── Git │ │ │ │ └── index.vue │ │ ├── iFrame │ │ │ └── index.vue │ │ ├── Screenfull │ │ │ └── index.vue │ │ ├── Hamburger │ │ │ └── index.vue │ │ ├── DictData │ │ │ └── index.js │ │ └── DictTag │ │ │ └── index.vue │ ├── assets │ │ ├── drone │ │ │ └── drone.png │ │ ├── images │ │ │ ├── img.png │ │ │ ├── bgFooter.png │ │ │ ├── bgIndex.jpg │ │ │ ├── bgIndex2.jpg │ │ │ ├── bgIndex3.jpg │ │ │ ├── profile.jpg │ │ │ ├── login-background.jpg │ │ │ └── login-background1.jpg │ │ ├── logo │ │ │ ├── logo.png │ │ │ └── logo2.png │ │ ├── 401_images │ │ │ └── 401.gif │ │ ├── 404_images │ │ │ ├── 404.png │ │ │ └── 404_cloud.png │ │ ├── icons │ │ │ ├── svg │ │ │ │ ├── chart.svg │ │ │ │ ├── size.svg │ │ │ │ ├── link.svg │ │ │ │ ├── guide.svg │ │ │ │ ├── money.svg │ │ │ │ ├── email.svg │ │ │ │ ├── drag.svg │ │ │ │ ├── documentation.svg │ │ │ │ ├── fullscreen.svg │ │ │ │ ├── user.svg │ │ │ │ ├── lock.svg │ │ │ │ ├── excel.svg │ │ │ │ ├── example.svg │ │ │ │ ├── slider.svg │ │ │ │ ├── star.svg │ │ │ │ ├── search.svg │ │ │ │ ├── table.svg │ │ │ │ ├── education.svg │ │ │ │ ├── tab.svg │ │ │ │ ├── message.svg │ │ │ │ ├── switch.svg │ │ │ │ ├── theme.svg │ │ │ │ ├── code.svg │ │ │ │ ├── druid.svg │ │ │ │ ├── peoples.svg │ │ │ │ ├── input.svg │ │ │ │ ├── server.svg │ │ │ │ ├── textarea.svg │ │ │ │ ├── time.svg │ │ │ │ ├── edit.svg │ │ │ │ ├── nested.svg │ │ │ │ ├── row.svg │ │ │ │ ├── monitor.svg │ │ │ │ ├── tree-table.svg │ │ │ │ ├── eye.svg │ │ │ │ ├── build.svg │ │ │ │ ├── clipboard.svg │ │ │ │ ├── list.svg │ │ │ │ ├── download.svg │ │ │ │ ├── icon.svg │ │ │ │ ├── international.svg │ │ │ │ ├── question.svg │ │ │ │ ├── wechat.svg │ │ │ │ ├── skill.svg │ │ │ │ ├── people.svg │ │ │ │ ├── post.svg │ │ │ │ ├── checkbox.svg │ │ │ │ ├── language.svg │ │ │ │ ├── eye-open.svg │ │ │ │ ├── validCode.svg │ │ │ │ ├── radio.svg │ │ │ │ ├── select.svg │ │ │ │ └── upload.svg │ │ │ ├── index.js │ │ │ └── svgo.yml │ │ └── styles │ │ │ ├── element-variables.scss │ │ │ └── transition.scss │ ├── utils │ │ ├── errorCode.js │ │ ├── dict │ │ │ ├── DictData.js │ │ │ ├── DictConverter.js │ │ │ ├── index.js │ │ │ └── DictMeta.js │ │ ├── auth.js │ │ ├── generator │ │ │ ├── css.js │ │ │ └── drawingDefault.js │ │ └── jsencrypt.js │ ├── api │ │ ├── menu.js │ │ ├── monitor │ │ │ ├── server.js │ │ │ ├── online.js │ │ │ ├── operlog.js │ │ │ ├── jobLog.js │ │ │ ├── logininfor.js │ │ │ └── cache.js │ │ ├── system │ │ │ ├── post.js │ │ │ ├── notice.js │ │ │ ├── fly │ │ │ │ ├── drone.js │ │ │ │ ├── planPath.js │ │ │ │ ├── historyPath.js │ │ │ │ └── area.js │ │ │ ├── dept.js │ │ │ ├── dict │ │ │ │ ├── data.js │ │ │ │ └── type.js │ │ │ ├── menu.js │ │ │ └── config.js │ │ └── login.js │ ├── layout │ │ └── components │ │ │ ├── index.js │ │ │ ├── IframeToggle │ │ │ └── index.vue │ │ │ ├── Sidebar │ │ │ ├── FixiOSBug.js │ │ │ ├── Item.vue │ │ │ └── Link.vue │ │ │ ├── InnerLink │ │ │ └── index.vue │ │ │ └── AppMain.vue │ ├── views │ │ ├── redirect.vue │ │ ├── components │ │ │ └── icons │ │ │ │ └── svg-icons.js │ │ ├── monitor │ │ │ └── druid │ │ │ │ └── index.vue │ │ ├── tool │ │ │ └── swagger │ │ │ │ └── index.vue │ │ └── fly │ │ │ └── flylist │ │ │ └── testmap.vue │ ├── plugins │ │ └── index.js │ ├── store │ │ ├── index.js │ │ ├── getters.js │ │ └── modules │ │ │ └── dict.js │ ├── directive │ │ ├── permission │ │ │ ├── hasRole.js │ │ │ └── hasPermi.js │ │ ├── index.js │ │ └── dialog │ │ │ └── dragWidth.js │ ├── settings.js │ └── App.vue ├── .env.production ├── .env.staging ├── .eslintignore ├── .env.development ├── .gitignore ├── .editorconfig ├── README.md ├── babel.config.js └── build │ └── index.js ├── Fly ├── ry.bat ├── .github │ └── FUNDING.yml ├── doc │ └── 若依环境使用手册.docx ├── fly-admin │ └── src │ │ └── main │ │ ├── resources │ │ ├── META-INF │ │ │ └── spring-devtools.properties │ │ ├── mybatis │ │ │ └── mybatis-config.xml │ │ └── i18n │ │ │ └── messages.properties │ │ └── java │ │ └── com │ │ └── zzk │ │ ├── web │ │ ├── netty │ │ │ └── Handler │ │ │ │ ├── DTObject.java │ │ │ │ ├── Gps.java │ │ │ │ ├── TcpProtocol.java │ │ │ │ └── EncoderHandler.java │ │ └── controller │ │ │ ├── system │ │ │ └── SysIndexController.java │ │ │ └── monitor │ │ │ └── ServerController.java │ │ └── RuoYiServletInitializer.java ├── fly-generator │ ├── src │ │ └── main │ │ │ ├── resources │ │ │ ├── vm │ │ │ │ ├── vue │ │ │ │ │ └── v3 │ │ │ │ │ │ └── readme.txt │ │ │ │ └── js │ │ │ │ │ └── api.js.vm │ │ │ └── generator.yml │ │ │ └── java │ │ │ └── com │ │ │ └── zzk │ │ │ └── generator │ │ │ ├── util │ │ │ └── VelocityInitializer.java │ │ │ └── service │ │ │ └── IGenTableColumnService.java │ └── pom.xml ├── fly-common │ └── src │ │ └── main │ │ └── java │ │ └── com │ │ └── zzk │ │ └── common │ │ ├── core │ │ └── domain │ │ │ └── model │ │ │ ├── RegisterBody.java │ │ │ └── LoginBody.java │ │ ├── enums │ │ ├── DataSourceType.java │ │ ├── BusinessStatus.java │ │ ├── LimitType.java │ │ ├── OperatorType.java │ │ ├── UserStatus.java │ │ ├── BusinessType.java │ │ └── HttpMethod.java │ │ ├── exception │ │ ├── DemoModeException.java │ │ ├── user │ │ │ ├── CaptchaException.java │ │ │ ├── CaptchaExpireException.java │ │ │ ├── UserPasswordNotMatchException.java │ │ │ ├── UserException.java │ │ │ └── UserPasswordRetryLimitExceedException.java │ │ ├── file │ │ │ ├── FileException.java │ │ │ ├── FileSizeLimitExceededException.java │ │ │ └── FileNameLengthLimitExceededException.java │ │ ├── UtilException.java │ │ ├── job │ │ │ └── TaskException.java │ │ └── GlobalException.java │ │ ├── utils │ │ ├── LogUtils.java │ │ ├── poi │ │ │ └── ExcelHandlerAdapter.java │ │ ├── MessageUtils.java │ │ ├── bean │ │ │ └── BeanValidators.java │ │ ├── PageUtils.java │ │ ├── ExceptionUtil.java │ │ └── uuid │ │ │ └── IdUtils.java │ │ ├── annotation │ │ ├── Excels.java │ │ ├── Anonymous.java │ │ ├── RepeatSubmit.java │ │ ├── DataSource.java │ │ ├── DataScope.java │ │ ├── RateLimiter.java │ │ └── Log.java │ │ ├── filter │ │ └── PropertyPreExcludeFilter.java │ │ ├── xss │ │ ├── Xss.java │ │ └── XssValidator.java │ │ └── constant │ │ ├── ScheduleConstants.java │ │ └── CacheConstants.java ├── fly-system │ ├── src │ │ └── main │ │ │ ├── java │ │ │ └── com │ │ │ │ └── zzk │ │ │ │ └── system │ │ │ │ ├── domain │ │ │ │ ├── vo │ │ │ │ │ └── fly │ │ │ │ │ │ ├── PageResult.java │ │ │ │ │ │ ├── DroneQueryVo.java │ │ │ │ │ │ ├── AreaQueryVo.java │ │ │ │ │ │ └── PlanPathQueryVo.java │ │ │ │ ├── fly │ │ │ │ │ ├── ObjectIdSerializer.java │ │ │ │ │ └── Location.java │ │ │ │ ├── SysRoleDept.java │ │ │ │ ├── SysRoleMenu.java │ │ │ │ ├── SysUserPost.java │ │ │ │ └── SysUserRole.java │ │ │ │ ├── service │ │ │ │ ├── ISysLogininforService.java │ │ │ │ ├── ISysOperLogService.java │ │ │ │ ├── fly │ │ │ │ │ ├── IHistoryPathService.java │ │ │ │ │ └── IPlanPathService.java │ │ │ │ ├── ISysUserOnlineService.java │ │ │ │ └── ISysNoticeService.java │ │ │ │ └── mapper │ │ │ │ ├── SysLogininforMapper.java │ │ │ │ ├── SysRoleMenuMapper.java │ │ │ │ ├── SysUserPostMapper.java │ │ │ │ ├── SysRoleDeptMapper.java │ │ │ │ ├── SysOperLogMapper.java │ │ │ │ └── SysNoticeMapper.java │ │ │ └── resources │ │ │ └── mapper │ │ │ └── system │ │ │ ├── SysUserPostMapper.xml │ │ │ ├── SysRoleMenuMapper.xml │ │ │ └── SysRoleDeptMapper.xml │ └── pom.xml ├── fly-quartz │ ├── src │ │ └── main │ │ │ └── java │ │ │ └── com │ │ │ └── zzk │ │ │ └── quartz │ │ │ ├── util │ │ │ ├── QuartzJobExecution.java │ │ │ └── QuartzDisallowConcurrentExecution.java │ │ │ ├── task │ │ │ └── RyTask.java │ │ │ └── service │ │ │ └── ISysJobLogService.java │ └── pom.xml ├── fly-framework │ └── src │ │ └── main │ │ └── java │ │ └── com │ │ └── zzk │ │ └── framework │ │ ├── security │ │ └── context │ │ │ ├── AuthenticationContextHolder.java │ │ │ └── PermissionContextHolder.java │ │ ├── datasource │ │ ├── DynamicDataSource.java │ │ └── DynamicDataSourceContextHolder.java │ │ ├── manager │ │ ├── ShutdownManager.java │ │ └── AsyncManager.java │ │ ├── config │ │ ├── ServerConfig.java │ │ └── ApplicationConfig.java │ │ └── web │ │ └── domain │ │ └── server │ │ └── Mem.java ├── .gitignore └── LICENSE ├── README.assets ├── 未命名文件.png ├── 无人机飞行管控平台3.png ├── image-20230523215925304.png ├── image-20230523220314903.png ├── image-20230523220501801.png ├── image-20230523221158105.png ├── image-20230523222107497.png └── image-20230523225815873.png └── .gitignore /数据库设计/test.txt: -------------------------------------------------------------------------------- 1 | phonenumber -------------------------------------------------------------------------------- /client/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /fly-ui/public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: / -------------------------------------------------------------------------------- /Fly/ry.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zozikng/Fly/HEAD/Fly/ry.bat -------------------------------------------------------------------------------- /Fly/.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | custom: http://doc.ruoyi.vip/fly-vue/other/donate.html 2 | -------------------------------------------------------------------------------- /数据库设计/白马湖飞行.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zozikng/Fly/HEAD/数据库设计/白马湖飞行.docx -------------------------------------------------------------------------------- /Fly/doc/若依环境使用手册.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zozikng/Fly/HEAD/Fly/doc/若依环境使用手册.docx -------------------------------------------------------------------------------- /README.assets/未命名文件.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zozikng/Fly/HEAD/README.assets/未命名文件.png -------------------------------------------------------------------------------- /fly-ui/public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zozikng/Fly/HEAD/fly-ui/public/favicon.png -------------------------------------------------------------------------------- /fly-ui/src/components/ParentView/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /README.assets/无人机飞行管控平台3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zozikng/Fly/HEAD/README.assets/无人机飞行管控平台3.png -------------------------------------------------------------------------------- /fly-ui/public/favicon2.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zozikng/Fly/HEAD/fly-ui/public/favicon2.ico -------------------------------------------------------------------------------- /fly-ui/public/drone/drone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zozikng/Fly/HEAD/fly-ui/public/drone/drone.png -------------------------------------------------------------------------------- /fly-ui/src/assets/drone/drone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zozikng/Fly/HEAD/fly-ui/src/assets/drone/drone.png -------------------------------------------------------------------------------- /fly-ui/src/assets/images/img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zozikng/Fly/HEAD/fly-ui/src/assets/images/img.png -------------------------------------------------------------------------------- /fly-ui/src/assets/logo/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zozikng/Fly/HEAD/fly-ui/src/assets/logo/logo.png -------------------------------------------------------------------------------- /fly-ui/src/assets/logo/logo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zozikng/Fly/HEAD/fly-ui/src/assets/logo/logo2.png -------------------------------------------------------------------------------- /Fly/fly-admin/src/main/resources/META-INF/spring-devtools.properties: -------------------------------------------------------------------------------- 1 | restart.include.json=/com.alibaba.fastjson.*.jar -------------------------------------------------------------------------------- /fly-ui/src/components/Map/eventBus/eventBus.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | //兄弟组件之间进行通行 3 | export default new Vue() 4 | -------------------------------------------------------------------------------- /client/.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zozikng/Fly/HEAD/client/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /fly-ui/src/assets/401_images/401.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zozikng/Fly/HEAD/fly-ui/src/assets/401_images/401.gif -------------------------------------------------------------------------------- /fly-ui/src/assets/404_images/404.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zozikng/Fly/HEAD/fly-ui/src/assets/404_images/404.png -------------------------------------------------------------------------------- /fly-ui/src/assets/images/bgFooter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zozikng/Fly/HEAD/fly-ui/src/assets/images/bgFooter.png -------------------------------------------------------------------------------- /fly-ui/src/assets/images/bgIndex.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zozikng/Fly/HEAD/fly-ui/src/assets/images/bgIndex.jpg -------------------------------------------------------------------------------- /fly-ui/src/assets/images/bgIndex2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zozikng/Fly/HEAD/fly-ui/src/assets/images/bgIndex2.jpg -------------------------------------------------------------------------------- /fly-ui/src/assets/images/bgIndex3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zozikng/Fly/HEAD/fly-ui/src/assets/images/bgIndex3.jpg -------------------------------------------------------------------------------- /fly-ui/src/assets/images/profile.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zozikng/Fly/HEAD/fly-ui/src/assets/images/profile.jpg -------------------------------------------------------------------------------- /README.assets/image-20230523215925304.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zozikng/Fly/HEAD/README.assets/image-20230523215925304.png -------------------------------------------------------------------------------- /README.assets/image-20230523220314903.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zozikng/Fly/HEAD/README.assets/image-20230523220314903.png -------------------------------------------------------------------------------- /README.assets/image-20230523220501801.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zozikng/Fly/HEAD/README.assets/image-20230523220501801.png -------------------------------------------------------------------------------- /README.assets/image-20230523221158105.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zozikng/Fly/HEAD/README.assets/image-20230523221158105.png -------------------------------------------------------------------------------- /README.assets/image-20230523222107497.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zozikng/Fly/HEAD/README.assets/image-20230523222107497.png -------------------------------------------------------------------------------- /README.assets/image-20230523225815873.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zozikng/Fly/HEAD/README.assets/image-20230523225815873.png -------------------------------------------------------------------------------- /fly-ui/src/assets/404_images/404_cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zozikng/Fly/HEAD/fly-ui/src/assets/404_images/404_cloud.png -------------------------------------------------------------------------------- /fly-ui/src/assets/images/login-background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zozikng/Fly/HEAD/fly-ui/src/assets/images/login-background.jpg -------------------------------------------------------------------------------- /fly-ui/src/assets/images/login-background1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zozikng/Fly/HEAD/fly-ui/src/assets/images/login-background1.jpg -------------------------------------------------------------------------------- /Fly/fly-generator/src/main/resources/vm/vue/v3/readme.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zozikng/Fly/HEAD/Fly/fly-generator/src/main/resources/vm/vue/v3/readme.txt -------------------------------------------------------------------------------- /fly-ui/.env.production: -------------------------------------------------------------------------------- 1 | # 页面标题 2 | VUE_APP_TITLE = 无人机飞行管控平台 3 | 4 | # 生产环境配置 5 | ENV = 'production' 6 | 7 | # 无人机飞行管控平台/生产环境 8 | VUE_APP_BASE_API = '/prod-api' 9 | -------------------------------------------------------------------------------- /fly-ui/src/utils/errorCode.js: -------------------------------------------------------------------------------- 1 | export default { 2 | '401': '认证失败,无法访问系统资源', 3 | '403': '当前操作没有权限', 4 | '404': '访问资源不存在', 5 | 'default': '系统未知错误,请反馈给管理员' 6 | } 7 | -------------------------------------------------------------------------------- /fly-ui/.env.staging: -------------------------------------------------------------------------------- 1 | # 页面标题 2 | VUE_APP_TITLE = 无人机飞行管控平台 3 | 4 | NODE_ENV = production 5 | 6 | # 测试环境配置 7 | ENV = 'staging' 8 | 9 | # 无人机飞行管控平台/测试环境 10 | VUE_APP_BASE_API = '/stage-api' 11 | -------------------------------------------------------------------------------- /fly-ui/src/api/menu.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 获取路由 4 | export const getRouters = () => { 5 | return request({ 6 | url: '/getRouters', 7 | method: 'get' 8 | }) 9 | } -------------------------------------------------------------------------------- /fly-ui/src/api/monitor/server.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 获取服务信息 4 | export function getServer() { 5 | return request({ 6 | url: '/monitor/server', 7 | method: 'get' 8 | }) 9 | } -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/chart.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fly-ui/.eslintignore: -------------------------------------------------------------------------------- 1 | # 忽略build目录下类型为js的文件的语法检查 2 | build/*.js 3 | # 忽略src/assets目录下文件的语法检查 4 | src/assets 5 | # 忽略public目录下文件的语法检查 6 | public 7 | # 忽略当前目录下为js的文件的语法检查 8 | *.js 9 | # 忽略当前目录下为vue的文件的语法检查 10 | *.vue -------------------------------------------------------------------------------- /fly-ui/.env.development: -------------------------------------------------------------------------------- 1 | # 页面标题 2 | VUE_APP_TITLE = 无人机飞行管控平台 3 | 4 | # 开发环境配置 5 | ENV = 'development' 6 | 7 | # 无人机飞行管控平台/开发环境 8 | VUE_APP_BASE_API = '/dev-api' 9 | 10 | # 路由懒加载 11 | VUE_CLI_BABEL_TRANSPILE_MODULES = true 12 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/size.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/core/domain/model/RegisterBody.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.core.domain.model; 2 | 3 | /** 4 | * 用户注册对象 5 | * 6 | * @author ruoyi 7 | */ 8 | public class RegisterBody extends LoginBody 9 | { 10 | 11 | } 12 | -------------------------------------------------------------------------------- /Fly/fly-generator/src/main/resources/generator.yml: -------------------------------------------------------------------------------- 1 | # 代码生成 2 | gen: 3 | # 作者 4 | author: ruoyi 5 | # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool 6 | packageName: com.zzk.system 7 | # 自动去除表前缀,默认是false 8 | autoRemovePre: false 9 | # 表前缀(生成类名不会包含表前缀,多个用逗号分隔) 10 | tablePrefix: sys_ -------------------------------------------------------------------------------- /fly-ui/src/layout/components/index.js: -------------------------------------------------------------------------------- 1 | export { default as AppMain } from './AppMain' 2 | export { default as Navbar } from './Navbar' 3 | export { default as Settings } from './Settings' 4 | export { default as Sidebar } from './Sidebar/index.vue' 5 | export { default as TagsView } from './TagsView/index.vue' 6 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/link.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/enums/DataSourceType.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.enums; 2 | 3 | /** 4 | * 数据源 5 | * 6 | * @author ruoyi 7 | */ 8 | public enum DataSourceType 9 | { 10 | /** 11 | * 主库 12 | */ 13 | MASTER, 14 | 15 | /** 16 | * 从库 17 | */ 18 | SLAVE 19 | } 20 | -------------------------------------------------------------------------------- /fly-ui/src/views/redirect.vue: -------------------------------------------------------------------------------- 1 | 13 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/enums/BusinessStatus.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.enums; 2 | 3 | /** 4 | * 操作状态 5 | * 6 | * @author ruoyi 7 | * 8 | */ 9 | public enum BusinessStatus 10 | { 11 | /** 12 | * 成功 13 | */ 14 | SUCCESS, 15 | 16 | /** 17 | * 失败 18 | */ 19 | FAIL, 20 | } 21 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/enums/LimitType.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.enums; 2 | 3 | /** 4 | * 限流类型 5 | * 6 | * @author ruoyi 7 | */ 8 | 9 | public enum LimitType 10 | { 11 | /** 12 | * 默认策略全局限流 13 | */ 14 | DEFAULT, 15 | 16 | /** 17 | * 根据请求者IP进行限流 18 | */ 19 | IP 20 | } 21 | -------------------------------------------------------------------------------- /client/src/test/java/com/zzk/client/ClientApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.zzk.client; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class ClientApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /fly-ui/src/utils/dict/DictData.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @classdesc 字典数据 3 | * @property {String} label 标签 4 | * @property {*} value 标签 5 | * @property {Object} raw 原始数据 6 | */ 7 | export default class DictData { 8 | constructor(label, value, raw) { 9 | this.label = label 10 | this.value = value 11 | this.raw = raw 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/guide.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fly-ui/src/components/IconSelect/requireIcons.js: -------------------------------------------------------------------------------- 1 | 2 | const req = require.context('../../assets/icons/svg', false, /\.svg$/) 3 | const requireAll = requireContext => requireContext.keys() 4 | 5 | const re = /\.\/(.*)\.svg/ 6 | 7 | const icons = requireAll(req).map(i => { 8 | return i.match(re)[1] 9 | }) 10 | 11 | export default icons 12 | -------------------------------------------------------------------------------- /fly-ui/src/views/components/icons/svg-icons.js: -------------------------------------------------------------------------------- 1 | const req = require.context('../../../assets/icons/svg', false, /\.svg$/) 2 | const requireAll = requireContext => requireContext.keys() 3 | 4 | const re = /\.\/(.*)\.svg/ 5 | 6 | const svgIcons = requireAll(req).map(i => { 7 | return i.match(re)[1] 8 | }) 9 | 10 | export default svgIcons 11 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import SvgIcon from '@/components/SvgIcon'// svg component 3 | 4 | // register globally 5 | Vue.component('svg-icon', SvgIcon) 6 | 7 | const req = require.context('./svg', false, /\.svg$/) 8 | const requireAll = requireContext => requireContext.keys().map(requireContext) 9 | requireAll(req) 10 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/money.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fly-ui/src/utils/auth.js: -------------------------------------------------------------------------------- 1 | import Cookies from 'js-cookie' 2 | 3 | const TokenKey = 'Admin-Token' 4 | 5 | export function getToken() { 6 | return Cookies.get(TokenKey) 7 | } 8 | 9 | export function setToken(token) { 10 | return Cookies.set(TokenKey, token) 11 | } 12 | 13 | export function removeToken() { 14 | return Cookies.remove(TokenKey) 15 | } 16 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/exception/DemoModeException.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.exception; 2 | 3 | /** 4 | * 演示模式异常 5 | * 6 | * @author ruoyi 7 | */ 8 | public class DemoModeException extends RuntimeException 9 | { 10 | private static final long serialVersionUID = 1L; 11 | 12 | public DemoModeException() 13 | { 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/email.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fly-ui/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | dist/ 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | **/*.log 8 | 9 | tests/**/coverage/ 10 | tests/e2e/reports 11 | selenium-debug.log 12 | 13 | # Editor directories and files 14 | .idea 15 | .vscode 16 | *.suo 17 | *.ntvs* 18 | *.njsproj 19 | *.sln 20 | *.local 21 | 22 | package-lock.json 23 | yarn.lock 24 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/drag.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svgo.yml: -------------------------------------------------------------------------------- 1 | # replace default config 2 | 3 | # multipass: true 4 | # full: true 5 | 6 | plugins: 7 | 8 | # - name 9 | # 10 | # or: 11 | # - name: false 12 | # - name: true 13 | # 14 | # or: 15 | # - name: 16 | # param1: 1 17 | # param2: 2 18 | 19 | - removeAttrs: 20 | attrs: 21 | - 'fill' 22 | - 'fill-rule' 23 | -------------------------------------------------------------------------------- /fly-ui/src/views/monitor/druid/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | -------------------------------------------------------------------------------- /fly-ui/src/views/tool/swagger/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/enums/OperatorType.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.enums; 2 | 3 | /** 4 | * 操作人类别 5 | * 6 | * @author ruoyi 7 | */ 8 | public enum OperatorType 9 | { 10 | /** 11 | * 其它 12 | */ 13 | OTHER, 14 | 15 | /** 16 | * 后台用户 17 | */ 18 | MANAGE, 19 | 20 | /** 21 | * 手机端用户 22 | */ 23 | MOBILE 24 | } 25 | -------------------------------------------------------------------------------- /Fly/fly-admin/src/main/java/com/zzk/web/netty/Handler/DTObject.java: -------------------------------------------------------------------------------- 1 | package com.zzk.web.netty.Handler; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * @description: 解决办法是将传输的对象进行二次包装,将全名类信息包含进去: 7 | * @program: nettyTestDemo 8 | * @author: zzk 9 | * @created: 2021/12/04 19:08 10 | */ 11 | @Data 12 | public class DTObject { 13 | private String className; 14 | private byte[] object; 15 | } 16 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/utils/LogUtils.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.utils; 2 | 3 | /** 4 | * 处理并记录日志文件 5 | * 6 | * @author ruoyi 7 | */ 8 | public class LogUtils 9 | { 10 | public static String getBlock(Object msg) 11 | { 12 | if (msg == null) 13 | { 14 | msg = ""; 15 | } 16 | return "[" + msg.toString() + "]"; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/exception/user/CaptchaException.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.exception.user; 2 | 3 | /** 4 | * 验证码错误异常类 5 | * 6 | * @author ruoyi 7 | */ 8 | public class CaptchaException extends UserException 9 | { 10 | private static final long serialVersionUID = 1L; 11 | 12 | public CaptchaException() 13 | { 14 | super("user.jcaptcha.error", null); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /fly-ui/src/api/monitor/online.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 查询在线用户列表 4 | export function list(query) { 5 | return request({ 6 | url: '/monitor/online/list', 7 | method: 'get', 8 | params: query 9 | }) 10 | } 11 | 12 | // 强退用户 13 | export function forceLogout(tokenId) { 14 | return request({ 15 | url: '/monitor/online/' + tokenId, 16 | method: 'delete' 17 | }) 18 | } 19 | -------------------------------------------------------------------------------- /fly-ui/src/components/RuoYi/Doc/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /fly-ui/src/components/RuoYi/Git/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /Fly/fly-system/src/main/java/com/zzk/system/domain/vo/fly/PageResult.java: -------------------------------------------------------------------------------- 1 | package com.zzk.system.domain.vo.fly; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.Collections; 6 | import java.util.List; 7 | 8 | @Data 9 | public class PageResult { 10 | 11 | private Integer pageNum = 0; 12 | private Integer pagesize = 0; 13 | private Long total = 0L; 14 | private List> items = Collections.emptyList(); 15 | } 16 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/exception/user/CaptchaExpireException.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.exception.user; 2 | 3 | /** 4 | * 验证码失效异常类 5 | * 6 | * @author ruoyi 7 | */ 8 | public class CaptchaExpireException extends UserException 9 | { 10 | private static final long serialVersionUID = 1L; 11 | 12 | public CaptchaExpireException() 13 | { 14 | super("user.jcaptcha.expire", null); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/documentation.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/fullscreen.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/utils/poi/ExcelHandlerAdapter.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.utils.poi; 2 | 3 | /** 4 | * Excel数据格式处理适配器 5 | * 6 | * @author ruoyi 7 | */ 8 | public interface ExcelHandlerAdapter 9 | { 10 | /** 11 | * 格式化 12 | * 13 | * @param value 单元格数据值 14 | * @param args excel注解args参数组 15 | * 16 | * @return 处理后的值 17 | */ 18 | Object format(Object value, String[] args); 19 | } 20 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/user.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/lock.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fly-ui/.editorconfig: -------------------------------------------------------------------------------- 1 | # 告诉EditorConfig插件,这是根文件,不用继续往上查找 2 | root = true 3 | 4 | # 匹配全部文件 5 | [*] 6 | # 设置字符集 7 | charset = utf-8 8 | # 缩进风格,可选space、tab 9 | indent_style = space 10 | # 缩进的空格数 11 | indent_size = 2 12 | # 结尾换行符,可选lf、cr、crlf 13 | end_of_line = lf 14 | # 在文件结尾插入新行 15 | insert_final_newline = true 16 | # 删除一行中的前后空格 17 | trim_trailing_whitespace = true 18 | 19 | # 匹配md结尾的文件 20 | [*.md] 21 | insert_final_newline = false 22 | trim_trailing_whitespace = false 23 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/exception/user/UserPasswordNotMatchException.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.exception.user; 2 | 3 | /** 4 | * 用户密码不正确或不符合规范异常类 5 | * 6 | * @author ruoyi 7 | */ 8 | public class UserPasswordNotMatchException extends UserException 9 | { 10 | private static final long serialVersionUID = 1L; 11 | 12 | public UserPasswordNotMatchException() 13 | { 14 | super("user.password.not.match", null); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/excel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/annotation/Excels.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.annotation; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * Excel注解集 10 | * 11 | * @author ruoyi 12 | */ 13 | @Target(ElementType.FIELD) 14 | @Retention(RetentionPolicy.RUNTIME) 15 | public @interface Excels 16 | { 17 | public Excel[] value(); 18 | } 19 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/exception/user/UserException.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.exception.user; 2 | 3 | import com.zzk.common.exception.base.BaseException; 4 | 5 | /** 6 | * 用户信息异常类 7 | * 8 | * @author ruoyi 9 | */ 10 | public class UserException extends BaseException 11 | { 12 | private static final long serialVersionUID = 1L; 13 | 14 | public UserException(String code, Object[] args) 15 | { 16 | super("user", code, args, null); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /fly-ui/README.md: -------------------------------------------------------------------------------- 1 | ## 开发 2 | 3 | ```bash 4 | # 克隆项目 5 | git clone https://gitee.com/y_project/RuoYi-Vue 6 | 7 | # 进入项目目录 8 | cd ruoyi-ui 9 | 10 | # 安装依赖 11 | npm install 12 | 13 | # 建议不要直接使用 cnpm 安装依赖,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题 14 | npm install --registry=https://registry.npmmirror.com 15 | 16 | # 启动服务 17 | npm run dev 18 | ``` 19 | 20 | 浏览器访问 http://localhost:80 21 | 22 | ## 发布 23 | 24 | ```bash 25 | # 构建测试环境 26 | npm run build:stage 27 | 28 | # 构建生产环境 29 | npm run build:prod 30 | ``` -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/exception/file/FileException.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.exception.file; 2 | 3 | import com.zzk.common.exception.base.BaseException; 4 | 5 | /** 6 | * 文件信息异常类 7 | * 8 | * @author ruoyi 9 | */ 10 | public class FileException extends BaseException 11 | { 12 | private static final long serialVersionUID = 1L; 13 | 14 | public FileException(String code, Object[] args) 15 | { 16 | super("file", code, args, null); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/exception/file/FileSizeLimitExceededException.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.exception.file; 2 | 3 | /** 4 | * 文件名大小限制异常类 5 | * 6 | * @author ruoyi 7 | */ 8 | public class FileSizeLimitExceededException extends FileException 9 | { 10 | private static final long serialVersionUID = 1L; 11 | 12 | public FileSizeLimitExceededException(long defaultMaxSize) 13 | { 14 | super("upload.exceed.maxSize", new Object[] { defaultMaxSize }); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/example.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fly-ui/src/plugins/index.js: -------------------------------------------------------------------------------- 1 | import tab from './tab' 2 | import auth from './auth' 3 | import cache from './cache' 4 | import modal from './modal' 5 | import download from './download' 6 | 7 | export default { 8 | install(Vue) { 9 | // 页签操作 10 | Vue.prototype.$tab = tab 11 | // 认证对象 12 | Vue.prototype.$auth = auth 13 | // 缓存对象 14 | Vue.prototype.$cache = cache 15 | // 模态框对象 16 | Vue.prototype.$modal = modal 17 | // 下载文件 18 | Vue.prototype.$download = download 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Fly/fly-quartz/src/main/java/com/zzk/quartz/util/QuartzJobExecution.java: -------------------------------------------------------------------------------- 1 | package com.zzk.quartz.util; 2 | 3 | import org.quartz.JobExecutionContext; 4 | import com.zzk.quartz.domain.SysJob; 5 | 6 | /** 7 | * 定时任务处理(允许并发执行) 8 | * 9 | * @author ruoyi 10 | * 11 | */ 12 | public class QuartzJobExecution extends AbstractQuartzJob 13 | { 14 | @Override 15 | protected void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception 16 | { 17 | JobInvokeUtil.invokeMethod(sysJob); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /fly-ui/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | // https://github.com/vuejs/vue-cli/tree/master/packages/@vue/babel-preset-app 4 | '@vue/cli-plugin-babel/preset' 5 | ], 6 | 'env': { 7 | 'development': { 8 | // babel-plugin-dynamic-import-node plugin only does one thing by converting all import() to require(). 9 | // This plugin can significantly increase the speed of hot updates, when you have a large number of pages. 10 | 'plugins': ['dynamic-import-node'] 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/exception/file/FileNameLengthLimitExceededException.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.exception.file; 2 | 3 | /** 4 | * 文件名称超长限制异常类 5 | * 6 | * @author ruoyi 7 | */ 8 | public class FileNameLengthLimitExceededException extends FileException 9 | { 10 | private static final long serialVersionUID = 1L; 11 | 12 | public FileNameLengthLimitExceededException(int defaultFileNameLength) 13 | { 14 | super("upload.filename.exceed.length", new Object[] { defaultFileNameLength }); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/annotation/Anonymous.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.annotation; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | 9 | /** 10 | * 匿名访问不鉴权注解 11 | * 12 | * @author ruoyi 13 | */ 14 | @Target({ ElementType.METHOD, ElementType.TYPE }) 15 | @Retention(RetentionPolicy.RUNTIME) 16 | @Documented 17 | public @interface Anonymous 18 | { 19 | } 20 | -------------------------------------------------------------------------------- /client/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | target/ 3 | !.mvn/wrapper/maven-wrapper.jar 4 | !**/src/main/**/target/ 5 | !**/src/test/**/target/ 6 | 7 | ### STS ### 8 | .apt_generated 9 | .classpath 10 | .factorypath 11 | .project 12 | .settings 13 | .springBeans 14 | .sts4-cache 15 | 16 | ### IntelliJ IDEA ### 17 | .idea 18 | *.iws 19 | *.iml 20 | *.ipr 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ 28 | build/ 29 | !**/src/main/**/build/ 30 | !**/src/test/**/build/ 31 | 32 | ### VS Code ### 33 | .vscode/ 34 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/exception/user/UserPasswordRetryLimitExceedException.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.exception.user; 2 | 3 | /** 4 | * 用户错误最大次数异常类 5 | * 6 | * @author ruoyi 7 | */ 8 | public class UserPasswordRetryLimitExceedException extends UserException 9 | { 10 | private static final long serialVersionUID = 1L; 11 | 12 | public UserPasswordRetryLimitExceedException(int retryLimitCount, int lockTime) 13 | { 14 | super("user.password.retry.limit.exceed", new Object[] { retryLimitCount, lockTime }); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /fly-ui/src/api/monitor/operlog.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 查询操作日志列表 4 | export function list(query) { 5 | return request({ 6 | url: '/monitor/operlog/list', 7 | method: 'get', 8 | params: query 9 | }) 10 | } 11 | 12 | // 删除操作日志 13 | export function delOperlog(operId) { 14 | return request({ 15 | url: '/monitor/operlog/' + operId, 16 | method: 'delete' 17 | }) 18 | } 19 | 20 | // 清空操作日志 21 | export function cleanOperlog() { 22 | return request({ 23 | url: '/monitor/operlog/clean', 24 | method: 'delete' 25 | }) 26 | } 27 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/slider.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/star.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fly-ui/src/api/monitor/jobLog.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 查询调度日志列表 4 | export function listJobLog(query) { 5 | return request({ 6 | url: '/monitor/jobLog/list', 7 | method: 'get', 8 | params: query 9 | }) 10 | } 11 | 12 | // 删除调度日志 13 | export function delJobLog(jobLogId) { 14 | return request({ 15 | url: '/monitor/jobLog/' + jobLogId, 16 | method: 'delete' 17 | }) 18 | } 19 | 20 | // 清空调度日志 21 | export function cleanJobLog() { 22 | return request({ 23 | url: '/monitor/jobLog/clean', 24 | method: 'delete' 25 | }) 26 | } 27 | -------------------------------------------------------------------------------- /fly-ui/src/utils/generator/css.js: -------------------------------------------------------------------------------- 1 | const styles = { 2 | 'el-rate': '.el-rate{display: inline-block; vertical-align: text-top;}', 3 | 'el-upload': '.el-upload__tip{line-height: 1.2;}' 4 | } 5 | 6 | function addCss(cssList, el) { 7 | const css = styles[el.tag] 8 | css && cssList.indexOf(css) === -1 && cssList.push(css) 9 | if (el.children) { 10 | el.children.forEach(el2 => addCss(cssList, el2)) 11 | } 12 | } 13 | 14 | export function makeUpCss(conf) { 15 | const cssList = [] 16 | conf.fields.forEach(el => addCss(cssList, el)) 17 | return cssList.join('\n') 18 | } 19 | -------------------------------------------------------------------------------- /Fly/fly-admin/src/main/java/com/zzk/RuoYiServletInitializer.java: -------------------------------------------------------------------------------- 1 | package com.zzk; 2 | 3 | import org.springframework.boot.builder.SpringApplicationBuilder; 4 | import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; 5 | 6 | /** 7 | * web容器中进行部署 8 | * 9 | * @author ruoyi 10 | */ 11 | public class RuoYiServletInitializer extends SpringBootServletInitializer 12 | { 13 | @Override 14 | protected SpringApplicationBuilder configure(SpringApplicationBuilder application) 15 | { 16 | return application.sources(RuoYiApplication.class); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Fly/fly-system/src/main/java/com/zzk/system/domain/fly/ObjectIdSerializer.java: -------------------------------------------------------------------------------- 1 | package com.zzk.system.domain.fly; 2 | 3 | import com.fasterxml.jackson.core.JsonGenerator; 4 | import com.fasterxml.jackson.databind.JsonSerializer; 5 | import com.fasterxml.jackson.databind.SerializerProvider; 6 | 7 | import java.io.IOException; 8 | 9 | public class ObjectIdSerializer extends JsonSerializer { 10 | 11 | @Override 12 | public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { 13 | gen.writeString(value.toString()); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /fly-ui/src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | import app from './modules/app' 4 | import dict from './modules/dict' 5 | import user from './modules/user' 6 | import tagsView from './modules/tagsView' 7 | import permission from './modules/permission' 8 | import settings from './modules/settings' 9 | import getters from './getters' 10 | 11 | Vue.use(Vuex) 12 | 13 | const store = new Vuex.Store({ 14 | modules: { 15 | app, 16 | dict, 17 | user, 18 | tagsView, 19 | permission, 20 | settings 21 | }, 22 | getters 23 | }) 24 | 25 | export default store 26 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/search.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/table.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/enums/UserStatus.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.enums; 2 | 3 | /** 4 | * 用户状态 5 | * 6 | * @author ruoyi 7 | */ 8 | public enum UserStatus 9 | { 10 | OK("0", "正常"), DISABLE("1", "停用"), DELETED("2", "删除"); 11 | 12 | private final String code; 13 | private final String info; 14 | 15 | UserStatus(String code, String info) 16 | { 17 | this.code = code; 18 | this.info = info; 19 | } 20 | 21 | public String getCode() 22 | { 23 | return code; 24 | } 25 | 26 | public String getInfo() 27 | { 28 | return info; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Fly/fly-quartz/src/main/java/com/zzk/quartz/util/QuartzDisallowConcurrentExecution.java: -------------------------------------------------------------------------------- 1 | package com.zzk.quartz.util; 2 | 3 | import org.quartz.DisallowConcurrentExecution; 4 | import org.quartz.JobExecutionContext; 5 | import com.zzk.quartz.domain.SysJob; 6 | 7 | /** 8 | * 定时任务处理(禁止并发执行) 9 | * 10 | * @author ruoyi 11 | * 12 | */ 13 | @DisallowConcurrentExecution 14 | public class QuartzDisallowConcurrentExecution extends AbstractQuartzJob 15 | { 16 | @Override 17 | protected void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception 18 | { 19 | JobInvokeUtil.invokeMethod(sysJob); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/education.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/exception/UtilException.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.exception; 2 | 3 | /** 4 | * 工具类异常 5 | * 6 | * @author ruoyi 7 | */ 8 | public class UtilException extends RuntimeException 9 | { 10 | private static final long serialVersionUID = 8247610319171014183L; 11 | 12 | public UtilException(Throwable e) 13 | { 14 | super(e.getMessage(), e); 15 | } 16 | 17 | public UtilException(String message) 18 | { 19 | super(message); 20 | } 21 | 22 | public UtilException(String message, Throwable throwable) 23 | { 24 | super(message, throwable); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/filter/PropertyPreExcludeFilter.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.filter; 2 | 3 | import com.alibaba.fastjson2.filter.SimplePropertyPreFilter; 4 | 5 | /** 6 | * 排除JSON敏感属性 7 | * 8 | * @author ruoyi 9 | */ 10 | public class PropertyPreExcludeFilter extends SimplePropertyPreFilter 11 | { 12 | public PropertyPreExcludeFilter() 13 | { 14 | } 15 | 16 | public PropertyPreExcludeFilter addExcludes(String... filters) 17 | { 18 | for (int i = 0; i < filters.length; i++) 19 | { 20 | this.getExcludes().add(filters[i]); 21 | } 22 | return this; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /fly-ui/src/layout/components/IframeToggle/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | 11 | 12 | 13 | 25 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/tab.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fly-ui/src/utils/dict/DictConverter.js: -------------------------------------------------------------------------------- 1 | import DictOptions from './DictOptions' 2 | import DictData from './DictData' 3 | 4 | export default function(dict, dictMeta) { 5 | const label = determineDictField(dict, dictMeta.labelField, ...DictOptions.DEFAULT_LABEL_FIELDS) 6 | const value = determineDictField(dict, dictMeta.valueField, ...DictOptions.DEFAULT_VALUE_FIELDS) 7 | return new DictData(dict[label], dict[value], dict) 8 | } 9 | 10 | /** 11 | * 确定字典字段 12 | * @param {DictData} dict 13 | * @param {...String} fields 14 | */ 15 | function determineDictField(dict, ...fields) { 16 | return fields.find(f => Object.prototype.hasOwnProperty.call(dict, f)) 17 | } 18 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/message.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/switch.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/theme.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fly-ui/src/layout/components/Sidebar/FixiOSBug.js: -------------------------------------------------------------------------------- 1 | export default { 2 | computed: { 3 | device() { 4 | return this.$store.state.app.device 5 | } 6 | }, 7 | mounted() { 8 | // In order to fix the click on menu on the ios device will trigger the mouseleave bug 9 | this.fixBugIniOS() 10 | }, 11 | methods: { 12 | fixBugIniOS() { 13 | const $subMenu = this.$refs.subMenu 14 | if ($subMenu) { 15 | const handleMouseleave = $subMenu.handleMouseleave 16 | $subMenu.handleMouseleave = (e) => { 17 | if (this.device === 'mobile') { 18 | return 19 | } 20 | handleMouseleave(e) 21 | } 22 | } 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/code.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Fly/fly-system/src/main/java/com/zzk/system/domain/vo/fly/DroneQueryVo.java: -------------------------------------------------------------------------------- 1 | package com.zzk.system.domain.vo.fly; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * @description: 无人机查询vo 7 | * @program: Fly 8 | * @author: zzk 9 | * @created: 2023/03/10 13:45 10 | */ 11 | @Data 12 | public class DroneQueryVo { 13 | 14 | private Integer pageNum = 1; 15 | private Integer pageSize = 10; 16 | private String droneName; //无人机名称 17 | private String model; //无人机型号 18 | private String userId;//用户id 19 | private String username;//用户名称 20 | private String currentBatteryLevel;//当前电池量 21 | private String status;//状态 22 | 23 | private String droneId;//飞行器id 24 | 25 | private String cardId;//飞行器id 26 | 27 | } 28 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/druid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/src/main/java/com/zzk/client/clientServe/Gps.java: -------------------------------------------------------------------------------- 1 | package com.zzk.client.clientServe; 2 | 3 | public class Gps { 4 | 5 | private double wgLat; // 纬度 6 | private double wgLon; // 经度 7 | 8 | public Gps(){ 9 | 10 | } 11 | 12 | public Gps(double wgLat, double wgLon) { 13 | setWgLat(wgLat); 14 | setWgLon(wgLon); 15 | } 16 | 17 | public double getWgLat() { 18 | return wgLat; 19 | } 20 | 21 | public void setWgLat(double wgLat) { 22 | this.wgLat = wgLat; 23 | } 24 | 25 | public double getWgLon() { 26 | return wgLon; 27 | } 28 | 29 | public void setWgLon(double wgLon) { 30 | this.wgLon = wgLon; 31 | } 32 | 33 | @Override 34 | public String toString() { 35 | return wgLat + "," + wgLon; 36 | } 37 | 38 | } 39 | 40 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/peoples.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fly-ui/src/utils/generator/drawingDefault.js: -------------------------------------------------------------------------------- 1 | export default [ 2 | { 3 | layout: 'colFormItem', 4 | tagIcon: 'input', 5 | label: '手机号', 6 | vModel: 'mobile', 7 | formId: 6, 8 | tag: 'el-input', 9 | placeholder: '请输入手机号', 10 | defaultValue: '', 11 | span: 24, 12 | style: { width: '100%' }, 13 | clearable: true, 14 | prepend: '', 15 | append: '', 16 | 'prefix-icon': 'el-icon-mobile', 17 | 'suffix-icon': '', 18 | maxlength: 11, 19 | 'show-word-limit': true, 20 | readonly: false, 21 | disabled: false, 22 | required: true, 23 | changeTag: true, 24 | regList: [{ 25 | pattern: '/^1(3|4|5|7|8|9)\\d{9}$/', 26 | message: '手机号格式错误' 27 | }] 28 | } 29 | ] 30 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/input.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/server.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Fly/fly-quartz/src/main/java/com/zzk/quartz/task/RyTask.java: -------------------------------------------------------------------------------- 1 | package com.zzk.quartz.task; 2 | 3 | import org.springframework.stereotype.Component; 4 | import com.zzk.common.utils.StringUtils; 5 | 6 | /** 7 | * 定时任务调度测试 8 | * 9 | * @author ruoyi 10 | */ 11 | @Component("ryTask") 12 | public class RyTask 13 | { 14 | public void ryMultipleParams(String s, Boolean b, Long l, Double d, Integer i) 15 | { 16 | System.out.println(StringUtils.format("执行多参方法: 字符串类型{},布尔类型{},长整型{},浮点型{},整形{}", s, b, l, d, i)); 17 | } 18 | 19 | public void ryParams(String params) 20 | { 21 | System.out.println("执行有参方法:" + params); 22 | } 23 | 24 | public void ryNoParams() 25 | { 26 | System.out.println("执行无参方法"); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Build and Release Folders 2 | bin-debug/ 3 | bin-release/ 4 | [Oo]bj/ 5 | [Bb]in/ 6 | 7 | # Other files and folders 8 | .settings/ 9 | 10 | # Executables 11 | *.swf 12 | *.air 13 | *.ipa 14 | *.apk 15 | 16 | # Project files, i.e. `.project`, `.actionScriptProperties` and `.flexProperties` 17 | # should NOT be excluded as they contain compiler settings and other important 18 | # information for Eclipse / Flash Builder. 19 | .DS_Store 20 | node_modules 21 | /dist 22 | 23 | 24 | # local env files 25 | .env.local 26 | .env.*.local 27 | 28 | # Log files 29 | npm-debug.log* 30 | yarn-debug.log* 31 | yarn-error.log* 32 | pnpm-debug.log* 33 | 34 | # Editor directories and files 35 | .idea 36 | .vscode 37 | *.suo 38 | *.ntvs* 39 | *.njsproj 40 | *.sln 41 | *.sw? 42 | -------------------------------------------------------------------------------- /fly-ui/src/directive/permission/hasRole.js: -------------------------------------------------------------------------------- 1 | /** 2 | * v-hasRole 角色权限处理 3 | * Copyright (c) 2019 ruoyi 4 | */ 5 | 6 | import store from '@/store' 7 | 8 | export default { 9 | inserted(el, binding, vnode) { 10 | const { value } = binding 11 | const super_admin = "admin"; 12 | const roles = store.getters && store.getters.roles 13 | 14 | if (value && value instanceof Array && value.length > 0) { 15 | const roleFlag = value 16 | 17 | const hasRole = roles.some(role => { 18 | return super_admin === role || roleFlag.includes(role) 19 | }) 20 | 21 | if (!hasRole) { 22 | el.parentNode && el.parentNode.removeChild(el) 23 | } 24 | } else { 25 | throw new Error(`请设置角色权限标签值"`) 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Fly/fly-framework/src/main/java/com/zzk/framework/security/context/AuthenticationContextHolder.java: -------------------------------------------------------------------------------- 1 | package com.zzk.framework.security.context; 2 | 3 | import org.springframework.security.core.Authentication; 4 | 5 | /** 6 | * 身份验证信息 7 | * 8 | * @author ruoyi 9 | */ 10 | public class AuthenticationContextHolder 11 | { 12 | private static final ThreadLocal contextHolder = new ThreadLocal<>(); 13 | 14 | public static Authentication getContext() 15 | { 16 | return contextHolder.get(); 17 | } 18 | 19 | public static void setContext(Authentication context) 20 | { 21 | contextHolder.set(context); 22 | } 23 | 24 | public static void clearContext() 25 | { 26 | contextHolder.remove(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /fly-ui/src/layout/components/Sidebar/Item.vue: -------------------------------------------------------------------------------- 1 | 34 | -------------------------------------------------------------------------------- /fly-ui/src/api/monitor/logininfor.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 查询登录日志列表 4 | export function list(query) { 5 | return request({ 6 | url: '/monitor/logininfor/list', 7 | method: 'get', 8 | params: query 9 | }) 10 | } 11 | 12 | // 删除登录日志 13 | export function delLogininfor(infoId) { 14 | return request({ 15 | url: '/monitor/logininfor/' + infoId, 16 | method: 'delete' 17 | }) 18 | } 19 | 20 | // 解锁用户登录状态 21 | export function unlockLogininfor(userName) { 22 | return request({ 23 | url: '/monitor/logininfor/unlock/' + userName, 24 | method: 'get' 25 | }) 26 | } 27 | 28 | // 清空登录日志 29 | export function cleanLogininfor() { 30 | return request({ 31 | url: '/monitor/logininfor/clean', 32 | method: 'delete' 33 | }) 34 | } 35 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/textarea.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/annotation/RepeatSubmit.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.annotation; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Inherited; 6 | import java.lang.annotation.Retention; 7 | import java.lang.annotation.RetentionPolicy; 8 | import java.lang.annotation.Target; 9 | 10 | /** 11 | * 自定义注解防止表单重复提交 12 | * 13 | * @author ruoyi 14 | * 15 | */ 16 | @Inherited 17 | @Target(ElementType.METHOD) 18 | @Retention(RetentionPolicy.RUNTIME) 19 | @Documented 20 | public @interface RepeatSubmit 21 | { 22 | /** 23 | * 间隔时间(ms),小于此时间视为重复提交 24 | */ 25 | public int interval() default 5000; 26 | 27 | /** 28 | * 提示消息 29 | */ 30 | public String message() default "不允许重复提交,请稍候再试"; 31 | } 32 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/utils/MessageUtils.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.utils; 2 | 3 | import org.springframework.context.MessageSource; 4 | import org.springframework.context.i18n.LocaleContextHolder; 5 | import com.zzk.common.utils.spring.SpringUtils; 6 | 7 | /** 8 | * 获取i18n资源文件 9 | * 10 | * @author ruoyi 11 | */ 12 | public class MessageUtils 13 | { 14 | /** 15 | * 根据消息键和参数 获取消息 委托给spring messageSource 16 | * 17 | * @param code 消息键 18 | * @param args 参数 19 | * @return 获取国际化翻译值 20 | */ 21 | public static String message(String code, Object... args) 22 | { 23 | MessageSource messageSource = SpringUtils.getBean(MessageSource.class); 24 | return messageSource.getMessage(code, args, LocaleContextHolder.getLocale()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/time.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/xss/Xss.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.xss; 2 | 3 | import javax.validation.Constraint; 4 | import javax.validation.Payload; 5 | import java.lang.annotation.ElementType; 6 | import java.lang.annotation.Retention; 7 | import java.lang.annotation.RetentionPolicy; 8 | import java.lang.annotation.Target; 9 | 10 | /** 11 | * 自定义xss校验注解 12 | * 13 | * @author ruoyi 14 | */ 15 | @Retention(RetentionPolicy.RUNTIME) 16 | @Target(value = { ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER }) 17 | @Constraint(validatedBy = { XssValidator.class }) 18 | public @interface Xss 19 | { 20 | String message() 21 | 22 | default "不允许任何脚本运行"; 23 | 24 | Class>[] groups() default {}; 25 | 26 | Class extends Payload>[] payload() default {}; 27 | } 28 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/enums/BusinessType.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.enums; 2 | 3 | /** 4 | * 业务操作类型 5 | * 6 | * @author ruoyi 7 | */ 8 | public enum BusinessType 9 | { 10 | /** 11 | * 其它 12 | */ 13 | OTHER, 14 | 15 | /** 16 | * 新增 17 | */ 18 | INSERT, 19 | 20 | /** 21 | * 修改 22 | */ 23 | UPDATE, 24 | 25 | /** 26 | * 删除 27 | */ 28 | DELETE, 29 | 30 | /** 31 | * 授权 32 | */ 33 | GRANT, 34 | 35 | /** 36 | * 导出 37 | */ 38 | EXPORT, 39 | 40 | /** 41 | * 导入 42 | */ 43 | IMPORT, 44 | 45 | /** 46 | * 强退 47 | */ 48 | FORCE, 49 | 50 | /** 51 | * 生成代码 52 | */ 53 | GENCODE, 54 | 55 | /** 56 | * 清空数据 57 | */ 58 | CLEAN, 59 | } 60 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/edit.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/annotation/DataSource.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.annotation; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Inherited; 6 | import java.lang.annotation.Retention; 7 | import java.lang.annotation.RetentionPolicy; 8 | import java.lang.annotation.Target; 9 | import com.zzk.common.enums.DataSourceType; 10 | 11 | /** 12 | * 自定义多数据源切换注解 13 | * 14 | * 优先级:先方法,后类,如果方法覆盖了类上的数据源类型,以方法的为准,否则以类上的为准 15 | * 16 | * @author ruoyi 17 | */ 18 | @Target({ ElementType.METHOD, ElementType.TYPE }) 19 | @Retention(RetentionPolicy.RUNTIME) 20 | @Documented 21 | @Inherited 22 | public @interface DataSource 23 | { 24 | /** 25 | * 切换数据源名称 26 | */ 27 | public DataSourceType value() default DataSourceType.MASTER; 28 | } 29 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/utils/bean/BeanValidators.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.utils.bean; 2 | 3 | import java.util.Set; 4 | import javax.validation.ConstraintViolation; 5 | import javax.validation.ConstraintViolationException; 6 | import javax.validation.Validator; 7 | 8 | /** 9 | * bean对象属性验证 10 | * 11 | * @author ruoyi 12 | */ 13 | public class BeanValidators 14 | { 15 | public static void validateWithException(Validator validator, Object object, Class>... groups) 16 | throws ConstraintViolationException 17 | { 18 | Set> constraintViolations = validator.validate(object, groups); 19 | if (!constraintViolations.isEmpty()) 20 | { 21 | throw new ConstraintViolationException(constraintViolations); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/nested.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fly-ui/src/directive/index.js: -------------------------------------------------------------------------------- 1 | import hasRole from './permission/hasRole' 2 | import hasPermi from './permission/hasPermi' 3 | import dialogDrag from './dialog/drag' 4 | import dialogDragWidth from './dialog/dragWidth' 5 | import dialogDragHeight from './dialog/dragHeight' 6 | import clipboard from './module/clipboard' 7 | 8 | const install = function(Vue) { 9 | Vue.directive('hasRole', hasRole) 10 | Vue.directive('hasPermi', hasPermi) 11 | Vue.directive('clipboard', clipboard) 12 | Vue.directive('dialogDrag', dialogDrag) 13 | Vue.directive('dialogDragWidth', dialogDragWidth) 14 | Vue.directive('dialogDragHeight', dialogDragHeight) 15 | } 16 | 17 | if (window.Vue) { 18 | window['hasRole'] = hasRole 19 | window['hasPermi'] = hasPermi 20 | Vue.use(install); // eslint-disable-line 21 | } 22 | 23 | export default install 24 | -------------------------------------------------------------------------------- /fly-ui/src/directive/permission/hasPermi.js: -------------------------------------------------------------------------------- 1 | /** 2 | * v-hasPermi 操作权限处理 3 | * Copyright (c) 2019 ruoyi 4 | */ 5 | 6 | import store from '@/store' 7 | 8 | export default { 9 | inserted(el, binding, vnode) { 10 | const { value } = binding 11 | const all_permission = "*:*:*"; 12 | const permissions = store.getters && store.getters.permissions 13 | 14 | if (value && value instanceof Array && value.length > 0) { 15 | const permissionFlag = value 16 | 17 | const hasPermissions = permissions.some(permission => { 18 | return all_permission === permission || permissionFlag.includes(permission) 19 | }) 20 | 21 | if (!hasPermissions) { 22 | el.parentNode && el.parentNode.removeChild(el) 23 | } 24 | } else { 25 | throw new Error(`请设置操作权限标签值`) 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/exception/job/TaskException.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.exception.job; 2 | 3 | /** 4 | * 计划策略异常 5 | * 6 | * @author ruoyi 7 | */ 8 | public class TaskException extends Exception 9 | { 10 | private static final long serialVersionUID = 1L; 11 | 12 | private Code code; 13 | 14 | public TaskException(String msg, Code code) 15 | { 16 | this(msg, code, null); 17 | } 18 | 19 | public TaskException(String msg, Code code, Exception nestedEx) 20 | { 21 | super(msg, nestedEx); 22 | this.code = code; 23 | } 24 | 25 | public Code getCode() 26 | { 27 | return code; 28 | } 29 | 30 | public enum Code 31 | { 32 | TASK_EXISTS, NO_TASK_EXISTS, TASK_ALREADY_STARTED, UNKNOWN, CONFIG_ERROR, TASK_NODE_NOT_AVAILABLE 33 | } 34 | } -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/annotation/DataScope.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.annotation; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | 9 | /** 10 | * 数据权限过滤注解 11 | * 12 | * @author ruoyi 13 | */ 14 | @Target(ElementType.METHOD) 15 | @Retention(RetentionPolicy.RUNTIME) 16 | @Documented 17 | public @interface DataScope 18 | { 19 | /** 20 | * 部门表的别名 21 | */ 22 | public String deptAlias() default ""; 23 | 24 | /** 25 | * 用户表的别名 26 | */ 27 | public String userAlias() default ""; 28 | 29 | /** 30 | * 权限字符(用于多个角色匹配符合要求的权限)默认根据权限注解@ss获取,多个权限用逗号分隔开来 31 | */ 32 | public String permission() default ""; 33 | } 34 | -------------------------------------------------------------------------------- /fly-ui/src/store/getters.js: -------------------------------------------------------------------------------- 1 | const getters = { 2 | sidebar: state => state.app.sidebar, 3 | size: state => state.app.size, 4 | device: state => state.app.device, 5 | dict: state => state.dict.dict, 6 | visitedViews: state => state.tagsView.visitedViews, 7 | cachedViews: state => state.tagsView.cachedViews, 8 | token: state => state.user.token, 9 | avatar: state => state.user.avatar, 10 | name: state => state.user.name, 11 | introduction: state => state.user.introduction, 12 | roles: state => state.user.roles, 13 | permissions: state => state.user.permissions, 14 | permission_routes: state => state.permission.routes, 15 | topbarRouters:state => state.permission.topbarRouters, 16 | defaultRoutes:state => state.permission.defaultRoutes, 17 | sidebarRouters:state => state.permission.sidebarRouters, 18 | } 19 | export default getters 20 | -------------------------------------------------------------------------------- /Fly/fly-admin/src/main/java/com/zzk/web/netty/Handler/Gps.java: -------------------------------------------------------------------------------- 1 | package com.zzk.web.netty.Handler; 2 | 3 | import lombok.Data; 4 | import org.springframework.stereotype.Component; 5 | 6 | @Data 7 | @Component 8 | public class Gps { 9 | 10 | private double wgLat; // 纬度 11 | private double wgLon; // 经度 12 | 13 | public Gps(){ 14 | 15 | } 16 | 17 | public Gps(double wgLat, double wgLon) { 18 | setWgLat(wgLat); 19 | setWgLon(wgLon); 20 | } 21 | 22 | public double getWgLat() { 23 | return wgLat; 24 | } 25 | 26 | public void setWgLat(double wgLat) { 27 | this.wgLat = wgLat; 28 | } 29 | 30 | public double getWgLon() { 31 | return wgLon; 32 | } 33 | 34 | public void setWgLon(double wgLon) { 35 | this.wgLon = wgLon; 36 | } 37 | 38 | @Override 39 | public String toString() { 40 | return wgLat + "," + wgLon; 41 | } 42 | 43 | } 44 | 45 | -------------------------------------------------------------------------------- /Fly/fly-system/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | fly 7 | com.zzk 8 | 3.8.5 9 | 10 | 4.0.0 11 | 12 | fly-system 13 | 14 | 15 | system系统模块 16 | 17 | 18 | 19 | 20 | 21 | 22 | com.zzk 23 | fly-common 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /Fly/fly-framework/src/main/java/com/zzk/framework/datasource/DynamicDataSource.java: -------------------------------------------------------------------------------- 1 | package com.zzk.framework.datasource; 2 | 3 | import java.util.Map; 4 | import javax.sql.DataSource; 5 | import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; 6 | 7 | /** 8 | * 动态数据源 9 | * 10 | * @author ruoyi 11 | */ 12 | public class DynamicDataSource extends AbstractRoutingDataSource 13 | { 14 | public DynamicDataSource(DataSource defaultTargetDataSource, Map targetDataSources) 15 | { 16 | super.setDefaultTargetDataSource(defaultTargetDataSource); 17 | super.setTargetDataSources(targetDataSources); 18 | super.afterPropertiesSet(); 19 | } 20 | 21 | @Override 22 | protected Object determineCurrentLookupKey() 23 | { 24 | return DynamicDataSourceContextHolder.getDataSourceType(); 25 | } 26 | } -------------------------------------------------------------------------------- /Fly/.gitignore: -------------------------------------------------------------------------------- 1 | ###################################################################### 2 | # Build Tools 3 | 4 | .gradle 5 | /build/ 6 | !gradle/wrapper/gradle-wrapper.jar 7 | 8 | target/ 9 | !.mvn/wrapper/maven-wrapper.jar 10 | 11 | ###################################################################### 12 | # IDE 13 | 14 | ### STS ### 15 | .apt_generated 16 | .classpath 17 | .factorypath 18 | .project 19 | .settings 20 | .springBeans 21 | 22 | ### IntelliJ IDEA ### 23 | .idea 24 | *.iws 25 | *.iml 26 | *.ipr 27 | 28 | ### JRebel ### 29 | rebel.xml 30 | 31 | ### NetBeans ### 32 | nbproject/private/ 33 | build/* 34 | nbbuild/ 35 | dist/ 36 | nbdist/ 37 | .nb-gradle/ 38 | 39 | ###################################################################### 40 | # Others 41 | *.log 42 | *.xml.versionsBackup 43 | *.swp 44 | 45 | !*/build/*.java 46 | !*/build/*.html 47 | !*/build/*.xml 48 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/row.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Fly/fly-admin/src/main/java/com/zzk/web/controller/system/SysIndexController.java: -------------------------------------------------------------------------------- 1 | package com.zzk.web.controller.system; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.web.bind.annotation.RequestMapping; 5 | import org.springframework.web.bind.annotation.RestController; 6 | import com.zzk.common.config.RuoYiConfig; 7 | import com.zzk.common.utils.StringUtils; 8 | 9 | /** 10 | * 首页 11 | * 12 | * @author ruoyi 13 | */ 14 | @RestController 15 | public class SysIndexController 16 | { 17 | /** 系统基础配置 */ 18 | @Autowired 19 | private RuoYiConfig ruoyiConfig; 20 | 21 | /** 22 | * 访问首页,提示语 23 | */ 24 | @RequestMapping("/") 25 | public String index() 26 | { 27 | return StringUtils.format("欢迎使用{}后台管理框架,当前版本:v{},请通过前端地址访问。", ruoyiConfig.getName(), ruoyiConfig.getVersion()); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/monitor.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fly-ui/src/components/iFrame/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | 37 | -------------------------------------------------------------------------------- /fly-ui/src/layout/components/Sidebar/Link.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 44 | -------------------------------------------------------------------------------- /fly-ui/src/settings.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | /** 3 | * 侧边栏主题 深色主题theme-dark,浅色主题theme-light 4 | */ 5 | sideTheme: 'theme-dark', 6 | 7 | /** 8 | * 是否系统布局配置 9 | */ 10 | showSettings: false, 11 | 12 | /** 13 | * 是否显示顶部导航 14 | */ 15 | topNav: false, 16 | 17 | /** 18 | * 是否显示 tagsView 19 | */ 20 | tagsView: true, 21 | 22 | /** 23 | * 是否固定头部 24 | */ 25 | fixedHeader: false, 26 | 27 | /** 28 | * 是否显示logo 29 | */ 30 | sidebarLogo: true, 31 | 32 | /** 33 | * 是否显示动态标题 34 | */ 35 | dynamicTitle: false, 36 | 37 | /** 38 | * @type {string | array} 'production' | ['production', 'development'] 39 | * @description Need show err logs component. 40 | * The default is only used in the production env 41 | * If you want to also use it in dev, you can pass ['production', 'development'] 42 | */ 43 | errorLog: 'production' 44 | } 45 | -------------------------------------------------------------------------------- /fly-ui/src/api/system/post.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 查询岗位列表 4 | export function listPost(query) { 5 | return request({ 6 | url: '/system/post/list', 7 | method: 'get', 8 | params: query 9 | }) 10 | } 11 | 12 | // 查询岗位详细 13 | export function getPost(postId) { 14 | return request({ 15 | url: '/system/post/' + postId, 16 | method: 'get' 17 | }) 18 | } 19 | 20 | // 新增岗位 21 | export function addPost(data) { 22 | return request({ 23 | url: '/system/post', 24 | method: 'post', 25 | data: data 26 | }) 27 | } 28 | 29 | // 修改岗位 30 | export function updatePost(data) { 31 | return request({ 32 | url: '/system/post', 33 | method: 'put', 34 | data: data 35 | }) 36 | } 37 | 38 | // 删除岗位 39 | export function delPost(postId) { 40 | return request({ 41 | url: '/system/post/' + postId, 42 | method: 'delete' 43 | }) 44 | } 45 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/tree-table.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Fly/fly-admin/src/main/resources/mybatis/mybatis-config.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /fly-ui/src/api/system/notice.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 查询公告列表 4 | export function listNotice(query) { 5 | return request({ 6 | url: '/system/notice/list', 7 | method: 'get', 8 | params: query 9 | }) 10 | } 11 | 12 | // 查询公告详细 13 | export function getNotice(noticeId) { 14 | return request({ 15 | url: '/system/notice/' + noticeId, 16 | method: 'get' 17 | }) 18 | } 19 | 20 | // 新增公告 21 | export function addNotice(data) { 22 | return request({ 23 | url: '/system/notice', 24 | method: 'post', 25 | data: data 26 | }) 27 | } 28 | 29 | // 修改公告 30 | export function updateNotice(data) { 31 | return request({ 32 | url: '/system/notice', 33 | method: 'put', 34 | data: data 35 | }) 36 | } 37 | 38 | // 删除公告 39 | export function delNotice(noticeId) { 40 | return request({ 41 | url: '/system/notice/' + noticeId, 42 | method: 'delete' 43 | }) 44 | } -------------------------------------------------------------------------------- /Fly/fly-admin/src/main/java/com/zzk/web/controller/monitor/ServerController.java: -------------------------------------------------------------------------------- 1 | package com.zzk.web.controller.monitor; 2 | 3 | import org.springframework.security.access.prepost.PreAuthorize; 4 | import org.springframework.web.bind.annotation.GetMapping; 5 | import org.springframework.web.bind.annotation.RequestMapping; 6 | import org.springframework.web.bind.annotation.RestController; 7 | import com.zzk.common.core.domain.AjaxResult; 8 | import com.zzk.framework.web.domain.Server; 9 | 10 | /** 11 | * 服务器监控 12 | * 13 | * @author ruoyi 14 | */ 15 | @RestController 16 | @RequestMapping("/monitor/server") 17 | public class ServerController 18 | { 19 | @PreAuthorize("@ss.hasPermi('monitor:server:list')") 20 | @GetMapping() 21 | public AjaxResult getInfo() throws Exception 22 | { 23 | Server server = new Server(); 24 | server.copyTo(); 25 | return AjaxResult.success(server); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /fly-ui/src/api/system/fly/drone.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 查询无人机列表列表 4 | export function listDrone(data) { 5 | return request({ 6 | url: '/fly/flylist/list', 7 | method: 'post', 8 | data: data 9 | }) 10 | } 11 | 12 | // 查询无人机列表详细 13 | export function getDrone(id) { 14 | return request({ 15 | url: '/fly/flylist/details/' + id, 16 | method: 'get' 17 | }) 18 | } 19 | 20 | // 新增无人机列表 21 | export function addDrone(data) { 22 | return request({ 23 | url: '/fly/flylist/add', 24 | method: 'post', 25 | data: data 26 | }) 27 | } 28 | 29 | // 修改无人机列表 30 | export function updateDrone(data) { 31 | return request({ 32 | url: '/fly/flylist/edit', 33 | method: 'Post', 34 | data: data 35 | }) 36 | } 37 | 38 | // 删除无人机列表 39 | export function delDrone(id) { 40 | return request({ 41 | url: '/fly/flylist/delete/' + id, 42 | method: 'get' 43 | }) 44 | } 45 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/enums/HttpMethod.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.enums; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | import org.springframework.lang.Nullable; 6 | 7 | /** 8 | * 请求方式 9 | * 10 | * @author ruoyi 11 | */ 12 | public enum HttpMethod 13 | { 14 | GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE; 15 | 16 | private static final Map mappings = new HashMap<>(16); 17 | 18 | static 19 | { 20 | for (HttpMethod httpMethod : values()) 21 | { 22 | mappings.put(httpMethod.name(), httpMethod); 23 | } 24 | } 25 | 26 | @Nullable 27 | public static HttpMethod resolve(@Nullable String method) 28 | { 29 | return (method != null ? mappings.get(method) : null); 30 | } 31 | 32 | public boolean matches(String method) 33 | { 34 | return (this == resolve(method)); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /client/src/main/java/com/zzk/client/clientServe/TcpProtocol.java: -------------------------------------------------------------------------------- 1 | package com.zzk.client.clientServe; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | /** 8 | * @description: Tcp协议 9 | * @program: nettyTestDemo 10 | * @author: zzk 11 | * @created: 2021/12/04 19:03 12 | */ 13 | @Data 14 | @AllArgsConstructor 15 | @NoArgsConstructor 16 | public class TcpProtocol { 17 | /** 18 | * 起始位 19 | */ 20 | private byte header1=0x77; 21 | private byte header2=0x77; 22 | /** 23 | * 包长度 24 | */ 25 | private byte len; 26 | /** 27 | * 协议号 28 | * 0x01:登录信息包 29 | * 0x02:定位数据包 30 | * 0x03: 心跳数据包 31 | */ 32 | //private byte protocol; 33 | /** 34 | * 数据 35 | */ 36 | private byte [] data; 37 | /** 38 | * 停止位 39 | */ 40 | private byte tail1=0x0D; 41 | private byte tail2=0x0A; 42 | 43 | 44 | } 45 | -------------------------------------------------------------------------------- /Fly/fly-admin/src/main/java/com/zzk/web/netty/Handler/TcpProtocol.java: -------------------------------------------------------------------------------- 1 | package com.zzk.web.netty.Handler; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | /** 8 | * @description: Tcp协议 9 | * @program: nettyTestDemo 10 | * @author: zzk 11 | * @created: 2021/12/04 19:03 12 | */ 13 | @Data 14 | @AllArgsConstructor 15 | @NoArgsConstructor 16 | public class TcpProtocol { 17 | /** 18 | * 起始位 19 | */ 20 | private byte header1=0x77; 21 | private byte header2=0x77; 22 | /** 23 | * 包长度 24 | */ 25 | private byte len; 26 | /** 27 | * 协议号 28 | * 0x01:登录信息包 29 | * 0x02:定位数据包 30 | * 0x03: 心跳数据包 31 | */ 32 | //private byte protocol; 33 | /** 34 | * 数据 35 | */ 36 | private byte [] data; 37 | /** 38 | * 停止位 39 | */ 40 | private byte tail1=0x0D; 41 | private byte tail2=0x0A; 42 | 43 | 44 | } 45 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/eye.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/build.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fly-ui/src/assets/styles/element-variables.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * I think element-ui's default theme color is too light for long-term use. 3 | * So I modified the default color and you can modify it to your liking. 4 | **/ 5 | 6 | /* theme color */ 7 | $--color-primary: #1890ff; 8 | $--color-success: #13ce66; 9 | $--color-warning: #ffba00; 10 | $--color-danger: #ff4949; 11 | // $--color-info: #1E1E1E; 12 | 13 | $--button-font-weight: 400; 14 | 15 | // $--color-text-regular: #1f2d3d; 16 | 17 | $--border-color-light: #dfe4ed; 18 | $--border-color-lighter: #e6ebf5; 19 | 20 | $--table-border: 1px solid #dfe6ec; 21 | 22 | /* icon font path, required */ 23 | $--font-path: '~element-ui/lib/theme-chalk/fonts'; 24 | 25 | @import "~element-ui/packages/theme-chalk/src/index"; 26 | 27 | // the :export directive is the magic sauce for webpack 28 | // https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass 29 | :export { 30 | theme: $--color-primary; 31 | } 32 | -------------------------------------------------------------------------------- /Fly/fly-system/src/main/java/com/zzk/system/service/ISysLogininforService.java: -------------------------------------------------------------------------------- 1 | package com.zzk.system.service; 2 | 3 | import java.util.List; 4 | import com.zzk.system.domain.SysLogininfor; 5 | 6 | /** 7 | * 系统访问日志情况信息 服务层 8 | * 9 | * @author ruoyi 10 | */ 11 | public interface ISysLogininforService 12 | { 13 | /** 14 | * 新增系统登录日志 15 | * 16 | * @param logininfor 访问日志对象 17 | */ 18 | public void insertLogininfor(SysLogininfor logininfor); 19 | 20 | /** 21 | * 查询系统登录日志集合 22 | * 23 | * @param logininfor 访问日志对象 24 | * @return 登录记录集合 25 | */ 26 | public List selectLogininforList(SysLogininfor logininfor); 27 | 28 | /** 29 | * 批量删除系统登录日志 30 | * 31 | * @param infoIds 需要删除的登录日志ID 32 | * @return 结果 33 | */ 34 | public int deleteLogininforByIds(Long[] infoIds); 35 | 36 | /** 37 | * 清空系统登录日志 38 | */ 39 | public void cleanLogininfor(); 40 | } 41 | -------------------------------------------------------------------------------- /Fly/fly-framework/src/main/java/com/zzk/framework/manager/ShutdownManager.java: -------------------------------------------------------------------------------- 1 | package com.zzk.framework.manager; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.springframework.stereotype.Component; 6 | import javax.annotation.PreDestroy; 7 | 8 | /** 9 | * 确保应用退出时能关闭后台线程 10 | * 11 | * @author ruoyi 12 | */ 13 | @Component 14 | public class ShutdownManager 15 | { 16 | private static final Logger logger = LoggerFactory.getLogger("sys-user"); 17 | 18 | @PreDestroy 19 | public void destroy() 20 | { 21 | shutdownAsyncManager(); 22 | } 23 | 24 | /** 25 | * 停止异步执行任务 26 | */ 27 | private void shutdownAsyncManager() 28 | { 29 | try 30 | { 31 | logger.info("====关闭后台任务任务线程池===="); 32 | AsyncManager.me().shutdown(); 33 | } 34 | catch (Exception e) 35 | { 36 | logger.error(e.getMessage(), e); 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /fly-ui/src/api/system/fly/planPath.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 查询无人机历史路径列表 4 | export function planPathList(data) { 5 | return request({ 6 | url: '/fly/planpath/list', 7 | method: 'post', 8 | data: data 9 | }) 10 | } 11 | 12 | // 查询无人机历史路径列表详细 13 | export function planPathQuery(id) { 14 | return request({ 15 | url: '/fly/planpath/details/' + id, 16 | method: 'get' 17 | }) 18 | } 19 | 20 | // 上传无人历史路径机列表 21 | export const uploadPlanPath=(data) =>{ 22 | return request({ 23 | url: '/fly/planpath/upload', 24 | method: 'post', 25 | data: data 26 | }) 27 | } 28 | 29 | 30 | // 删除无人机历史路径列表 31 | export function deletePlanPath(id) { 32 | return request({ 33 | url: '/fly/planpath/delete/' + id, 34 | method: 'get' 35 | }) 36 | } 37 | 38 | // 修改无人机列表 39 | export function updatePlanPath(data) { 40 | return request({ 41 | url: '/fly/planpath/edit', 42 | method: 'Post', 43 | data: data 44 | }) 45 | } 46 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/clipboard.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Fly/fly-framework/src/main/java/com/zzk/framework/config/ServerConfig.java: -------------------------------------------------------------------------------- 1 | package com.zzk.framework.config; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | import org.springframework.stereotype.Component; 5 | import com.zzk.common.utils.ServletUtils; 6 | 7 | /** 8 | * 服务相关配置 9 | * 10 | * @author ruoyi 11 | */ 12 | @Component 13 | public class ServerConfig 14 | { 15 | /** 16 | * 获取完整的请求路径,包括:域名,端口,上下文访问路径 17 | * 18 | * @return 服务地址 19 | */ 20 | public String getUrl() 21 | { 22 | HttpServletRequest request = ServletUtils.getRequest(); 23 | return getDomain(request); 24 | } 25 | 26 | public static String getDomain(HttpServletRequest request) 27 | { 28 | StringBuffer url = request.getRequestURL(); 29 | String contextPath = request.getServletContext().getContextPath(); 30 | return url.delete(url.length() - request.getRequestURI().length(), url.length()).append(contextPath).toString(); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Fly/fly-system/src/main/java/com/zzk/system/mapper/SysLogininforMapper.java: -------------------------------------------------------------------------------- 1 | package com.zzk.system.mapper; 2 | 3 | import java.util.List; 4 | import com.zzk.system.domain.SysLogininfor; 5 | 6 | /** 7 | * 系统访问日志情况信息 数据层 8 | * 9 | * @author ruoyi 10 | */ 11 | public interface SysLogininforMapper 12 | { 13 | /** 14 | * 新增系统登录日志 15 | * 16 | * @param logininfor 访问日志对象 17 | */ 18 | public void insertLogininfor(SysLogininfor logininfor); 19 | 20 | /** 21 | * 查询系统登录日志集合 22 | * 23 | * @param logininfor 访问日志对象 24 | * @return 登录记录集合 25 | */ 26 | public List selectLogininforList(SysLogininfor logininfor); 27 | 28 | /** 29 | * 批量删除系统登录日志 30 | * 31 | * @param infoIds 需要删除的登录日志ID 32 | * @return 结果 33 | */ 34 | public int deleteLogininforByIds(Long[] infoIds); 35 | 36 | /** 37 | * 清空系统登录日志 38 | * 39 | * @return 结果 40 | */ 41 | public int cleanLogininfor(); 42 | } 43 | -------------------------------------------------------------------------------- /Fly/fly-system/src/main/java/com/zzk/system/mapper/SysRoleMenuMapper.java: -------------------------------------------------------------------------------- 1 | package com.zzk.system.mapper; 2 | 3 | import java.util.List; 4 | import com.zzk.system.domain.SysRoleMenu; 5 | 6 | /** 7 | * 角色与菜单关联表 数据层 8 | * 9 | * @author ruoyi 10 | */ 11 | public interface SysRoleMenuMapper 12 | { 13 | /** 14 | * 查询菜单使用数量 15 | * 16 | * @param menuId 菜单ID 17 | * @return 结果 18 | */ 19 | public int checkMenuExistRole(Long menuId); 20 | 21 | /** 22 | * 通过角色ID删除角色和菜单关联 23 | * 24 | * @param roleId 角色ID 25 | * @return 结果 26 | */ 27 | public int deleteRoleMenuByRoleId(Long roleId); 28 | 29 | /** 30 | * 批量删除角色菜单关联信息 31 | * 32 | * @param ids 需要删除的数据ID 33 | * @return 结果 34 | */ 35 | public int deleteRoleMenu(Long[] ids); 36 | 37 | /** 38 | * 批量新增角色菜单信息 39 | * 40 | * @param roleMenuList 角色菜单列表 41 | * @return 结果 42 | */ 43 | public int batchRoleMenu(List roleMenuList); 44 | } 45 | -------------------------------------------------------------------------------- /Fly/fly-system/src/main/java/com/zzk/system/mapper/SysUserPostMapper.java: -------------------------------------------------------------------------------- 1 | package com.zzk.system.mapper; 2 | 3 | import java.util.List; 4 | import com.zzk.system.domain.SysUserPost; 5 | 6 | /** 7 | * 用户与岗位关联表 数据层 8 | * 9 | * @author ruoyi 10 | */ 11 | public interface SysUserPostMapper 12 | { 13 | /** 14 | * 通过用户ID删除用户和岗位关联 15 | * 16 | * @param userId 用户ID 17 | * @return 结果 18 | */ 19 | public int deleteUserPostByUserId(Long userId); 20 | 21 | /** 22 | * 通过岗位ID查询岗位使用数量 23 | * 24 | * @param postId 岗位ID 25 | * @return 结果 26 | */ 27 | public int countUserPostById(Long postId); 28 | 29 | /** 30 | * 批量删除用户和岗位关联 31 | * 32 | * @param ids 需要删除的数据ID 33 | * @return 结果 34 | */ 35 | public int deleteUserPost(Long[] ids); 36 | 37 | /** 38 | * 批量新增用户岗位信息 39 | * 40 | * @param userPostList 用户角色列表 41 | * @return 结果 42 | */ 43 | public int batchUserPost(List userPostList); 44 | } 45 | -------------------------------------------------------------------------------- /fly-ui/src/api/system/fly/historyPath.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 查询无人机历史路径列表 4 | export function historyPathList(data) { 5 | return request({ 6 | url: '/fly/historypath/list', 7 | method: 'post', 8 | data: data 9 | }) 10 | } 11 | 12 | // 查询无人机历史路径列表详细 13 | export function historyPathQuery(id) { 14 | return request({ 15 | url: '/fly/historypath/details/' + id, 16 | method: 'get' 17 | }) 18 | } 19 | 20 | // 上传无人历史路径机列表 21 | export const uploadHistoryPath=(data) =>{ 22 | return request({ 23 | url: '/fly/historypath/upload', 24 | method: 'post', 25 | data: data 26 | }) 27 | } 28 | 29 | 30 | // 删除无人机历史路径列表 31 | export function deleteHistoryPath(id) { 32 | return request({ 33 | url: '/fly/historypath/delete/' + id, 34 | method: 'get' 35 | }) 36 | 37 | } 38 | // 修改无人机列表 39 | export function updateHistoryPath(data) { 40 | return request({ 41 | url: '/fly/historypatht/edit', 42 | method: 'Post', 43 | data: data 44 | }) 45 | } 46 | -------------------------------------------------------------------------------- /Fly/fly-generator/src/main/java/com/zzk/generator/util/VelocityInitializer.java: -------------------------------------------------------------------------------- 1 | package com.zzk.generator.util; 2 | 3 | import java.util.Properties; 4 | import org.apache.velocity.app.Velocity; 5 | import com.zzk.common.constant.Constants; 6 | 7 | /** 8 | * VelocityEngine工厂 9 | * 10 | * @author ruoyi 11 | */ 12 | public class VelocityInitializer 13 | { 14 | /** 15 | * 初始化vm方法 16 | */ 17 | public static void initVelocity() 18 | { 19 | Properties p = new Properties(); 20 | try 21 | { 22 | // 加载classpath目录下的vm文件 23 | p.setProperty("resource.loader.file.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); 24 | // 定义字符集 25 | p.setProperty(Velocity.INPUT_ENCODING, Constants.UTF8); 26 | // 初始化Velocity引擎,指定配置Properties 27 | Velocity.init(p); 28 | } 29 | catch (Exception e) 30 | { 31 | throw new RuntimeException(e); 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Fly/fly-system/src/main/java/com/zzk/system/mapper/SysRoleDeptMapper.java: -------------------------------------------------------------------------------- 1 | package com.zzk.system.mapper; 2 | 3 | import java.util.List; 4 | import com.zzk.system.domain.SysRoleDept; 5 | 6 | /** 7 | * 角色与部门关联表 数据层 8 | * 9 | * @author ruoyi 10 | */ 11 | public interface SysRoleDeptMapper 12 | { 13 | /** 14 | * 通过角色ID删除角色和部门关联 15 | * 16 | * @param roleId 角色ID 17 | * @return 结果 18 | */ 19 | public int deleteRoleDeptByRoleId(Long roleId); 20 | 21 | /** 22 | * 批量删除角色部门关联信息 23 | * 24 | * @param ids 需要删除的数据ID 25 | * @return 结果 26 | */ 27 | public int deleteRoleDept(Long[] ids); 28 | 29 | /** 30 | * 查询部门使用数量 31 | * 32 | * @param deptId 部门ID 33 | * @return 结果 34 | */ 35 | public int selectCountRoleDeptByDeptId(Long deptId); 36 | 37 | /** 38 | * 批量新增角色部门信息 39 | * 40 | * @param roleDeptList 角色部门列表 41 | * @return 结果 42 | */ 43 | public int batchRoleDept(List roleDeptList); 44 | } 45 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/list.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/annotation/RateLimiter.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.annotation; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | import com.zzk.common.constant.CacheConstants; 9 | import com.zzk.common.enums.LimitType; 10 | 11 | /** 12 | * 限流注解 13 | * 14 | * @author ruoyi 15 | */ 16 | @Target(ElementType.METHOD) 17 | @Retention(RetentionPolicy.RUNTIME) 18 | @Documented 19 | public @interface RateLimiter 20 | { 21 | /** 22 | * 限流key 23 | */ 24 | public String key() default CacheConstants.RATE_LIMIT_KEY; 25 | 26 | /** 27 | * 限流时间,单位秒 28 | */ 29 | public int time() default 60; 30 | 31 | /** 32 | * 限流次数 33 | */ 34 | public int count() default 100; 35 | 36 | /** 37 | * 限流类型 38 | */ 39 | public LimitType limitType() default LimitType.DEFAULT; 40 | } 41 | -------------------------------------------------------------------------------- /Fly/fly-framework/src/main/java/com/zzk/framework/security/context/PermissionContextHolder.java: -------------------------------------------------------------------------------- 1 | package com.zzk.framework.security.context; 2 | 3 | import org.springframework.web.context.request.RequestAttributes; 4 | import org.springframework.web.context.request.RequestContextHolder; 5 | import com.zzk.common.core.text.Convert; 6 | 7 | /** 8 | * 权限信息 9 | * 10 | * @author ruoyi 11 | */ 12 | public class PermissionContextHolder 13 | { 14 | private static final String PERMISSION_CONTEXT_ATTRIBUTES = "PERMISSION_CONTEXT"; 15 | 16 | public static void setContext(String permission) 17 | { 18 | RequestContextHolder.currentRequestAttributes().setAttribute(PERMISSION_CONTEXT_ATTRIBUTES, permission, 19 | RequestAttributes.SCOPE_REQUEST); 20 | } 21 | 22 | public static String getContext() 23 | { 24 | return Convert.toStr(RequestContextHolder.currentRequestAttributes().getAttribute(PERMISSION_CONTEXT_ATTRIBUTES, 25 | RequestAttributes.SCOPE_REQUEST)); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /fly-ui/src/App.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 24 | 41 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/download.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Fly/fly-framework/src/main/java/com/zzk/framework/config/ApplicationConfig.java: -------------------------------------------------------------------------------- 1 | package com.zzk.framework.config; 2 | 3 | import java.util.TimeZone; 4 | import org.mybatis.spring.annotation.MapperScan; 5 | import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; 6 | import org.springframework.context.annotation.Bean; 7 | import org.springframework.context.annotation.Configuration; 8 | import org.springframework.context.annotation.EnableAspectJAutoProxy; 9 | 10 | /** 11 | * 程序注解配置 12 | * 13 | * @author ruoyi 14 | */ 15 | @Configuration 16 | // 表示通过aop框架暴露该代理对象,AopContext能够访问 17 | @EnableAspectJAutoProxy(exposeProxy = true) 18 | // 指定要扫描的Mapper类的包的路径 19 | @MapperScan("com.zzk.**.mapper") 20 | public class ApplicationConfig 21 | { 22 | /** 23 | * 时区配置 24 | */ 25 | @Bean 26 | public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() 27 | { 28 | return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault()); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /fly-ui/build/index.js: -------------------------------------------------------------------------------- 1 | const { run } = require('runjs') 2 | const chalk = require('chalk') 3 | const config = require('../vue.config.js') 4 | const rawArgv = process.argv.slice(2) 5 | const args = rawArgv.join(' ') 6 | 7 | if (process.env.npm_config_preview || rawArgv.includes('--preview')) { 8 | const report = rawArgv.includes('--report') 9 | 10 | run(`vue-cli-service build ${args}`) 11 | 12 | const port = 9526 13 | const publicPath = config.publicPath 14 | 15 | var connect = require('connect') 16 | var serveStatic = require('serve-static') 17 | const app = connect() 18 | 19 | app.use( 20 | publicPath, 21 | serveStatic('./dist', { 22 | index: ['index.html', '/'] 23 | }) 24 | ) 25 | 26 | app.listen(port, function () { 27 | console.log(chalk.green(`> Preview at http://localhost:${port}${publicPath}`)) 28 | if (report) { 29 | console.log(chalk.green(`> Report at http://localhost:${port}${publicPath}report.html`)) 30 | } 31 | 32 | }) 33 | } else { 34 | run(`vue-cli-service build ${args}`) 35 | } 36 | -------------------------------------------------------------------------------- /fly-ui/src/api/system/fly/area.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 查询无人机历史路径列表 4 | export function areaList(data) { 5 | return request({ 6 | url: '/fly/area/list', 7 | method: 'post', 8 | data: data 9 | }) 10 | } 11 | export function areaListAll() { 12 | return request({ 13 | url: '/fly/area/listall', 14 | method: 'post', 15 | }) 16 | } 17 | // 查询无人机历史路径列表详细 18 | export function areaQuery(id) { 19 | return request({ 20 | url: '/fly/area/details/' + id, 21 | method: 'get' 22 | }) 23 | } 24 | 25 | // 上传无人历史路径机列表 26 | export const uploadArea=(data) =>{ 27 | return request({ 28 | url: '/fly/area/upload', 29 | method: 'post', 30 | data: data 31 | }) 32 | } 33 | 34 | 35 | // 删除无人机历史路径列表 36 | export function deleteArea(id) { 37 | return request({ 38 | url: '/fly/area/delete/' + id, 39 | method: 'get' 40 | }) 41 | } 42 | 43 | // 修改无人机列表 44 | export function updateArea(data) { 45 | return request({ 46 | url: '/fly/area/edit', 47 | method: 'post', 48 | data: data 49 | }) 50 | } 51 | -------------------------------------------------------------------------------- /fly-ui/src/assets/styles/transition.scss: -------------------------------------------------------------------------------- 1 | // global transition css 2 | 3 | /* fade */ 4 | .fade-enter-active, 5 | .fade-leave-active { 6 | transition: opacity 0.28s; 7 | } 8 | 9 | .fade-enter, 10 | .fade-leave-active { 11 | opacity: 0; 12 | } 13 | 14 | /* fade-transform */ 15 | .fade-transform--move, 16 | .fade-transform-leave-active, 17 | .fade-transform-enter-active { 18 | transition: all .5s; 19 | } 20 | 21 | .fade-transform-leave-active { 22 | position: absolute; 23 | } 24 | 25 | .fade-transform-enter { 26 | opacity: 0; 27 | transform: translateX(-30px); 28 | } 29 | 30 | .fade-transform-leave-to { 31 | opacity: 0; 32 | transform: translateX(30px); 33 | } 34 | 35 | /* breadcrumb transition */ 36 | .breadcrumb-enter-active, 37 | .breadcrumb-leave-active { 38 | transition: all .5s; 39 | } 40 | 41 | .breadcrumb-enter, 42 | .breadcrumb-leave-active { 43 | opacity: 0; 44 | transform: translateX(20px); 45 | } 46 | 47 | .breadcrumb-move { 48 | transition: all .5s; 49 | } 50 | 51 | .breadcrumb-leave-active { 52 | position: absolute; 53 | } 54 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/utils/PageUtils.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.utils; 2 | 3 | import com.github.pagehelper.PageHelper; 4 | import com.zzk.common.core.page.PageDomain; 5 | import com.zzk.common.core.page.TableSupport; 6 | import com.zzk.common.utils.sql.SqlUtil; 7 | 8 | /** 9 | * 分页工具类 10 | * 11 | * @author ruoyi 12 | */ 13 | public class PageUtils extends PageHelper 14 | { 15 | /** 16 | * 设置请求分页数据 17 | */ 18 | public static void startPage() 19 | { 20 | PageDomain pageDomain = TableSupport.buildPageRequest(); 21 | Integer pageNum = pageDomain.getPageNum(); 22 | Integer pageSize = pageDomain.getPageSize(); 23 | String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); 24 | Boolean reasonable = pageDomain.getReasonable(); 25 | PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable); 26 | } 27 | 28 | /** 29 | * 清理分页的线程变量 30 | */ 31 | public static void clearPage() 32 | { 33 | PageHelper.clearPage(); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/xss/XssValidator.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.xss; 2 | 3 | import com.zzk.common.utils.StringUtils; 4 | import javax.validation.ConstraintValidator; 5 | import javax.validation.ConstraintValidatorContext; 6 | import java.util.regex.Matcher; 7 | import java.util.regex.Pattern; 8 | 9 | /** 10 | * 自定义xss校验注解实现 11 | * 12 | * @author ruoyi 13 | */ 14 | public class XssValidator implements ConstraintValidator 15 | { 16 | private static final String HTML_PATTERN = "<(\\S*?)[^>]*>.*?|<.*? />"; 17 | 18 | @Override 19 | public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) 20 | { 21 | if (StringUtils.isBlank(value)) 22 | { 23 | return true; 24 | } 25 | return !containsHtml(value); 26 | } 27 | 28 | public static boolean containsHtml(String value) 29 | { 30 | Pattern pattern = Pattern.compile(HTML_PATTERN); 31 | Matcher matcher = pattern.matcher(value); 32 | return matcher.matches(); 33 | } 34 | } -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fly-ui/src/store/modules/dict.js: -------------------------------------------------------------------------------- 1 | const state = { 2 | dict: new Array() 3 | } 4 | const mutations = { 5 | SET_DICT: (state, { key, value }) => { 6 | if (key !== null && key !== "") { 7 | state.dict.push({ 8 | key: key, 9 | value: value 10 | }) 11 | } 12 | }, 13 | REMOVE_DICT: (state, key) => { 14 | try { 15 | for (let i = 0; i < state.dict.length; i++) { 16 | if (state.dict[i].key == key) { 17 | state.dict.splice(i, i) 18 | return true 19 | } 20 | } 21 | } catch (e) { 22 | } 23 | }, 24 | CLEAN_DICT: (state) => { 25 | state.dict = new Array() 26 | } 27 | } 28 | 29 | const actions = { 30 | // 设置字典 31 | setDict({ commit }, data) { 32 | commit('SET_DICT', data) 33 | }, 34 | // 删除字典 35 | removeDict({ commit }, key) { 36 | commit('REMOVE_DICT', key) 37 | }, 38 | // 清空字典 39 | cleanDict({ commit }) { 40 | commit('CLEAN_DICT') 41 | } 42 | } 43 | 44 | export default { 45 | namespaced: true, 46 | state, 47 | mutations, 48 | actions 49 | } 50 | 51 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/utils/ExceptionUtil.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.utils; 2 | 3 | import java.io.PrintWriter; 4 | import java.io.StringWriter; 5 | import org.apache.commons.lang3.exception.ExceptionUtils; 6 | 7 | /** 8 | * 错误信息处理类。 9 | * 10 | * @author ruoyi 11 | */ 12 | public class ExceptionUtil 13 | { 14 | /** 15 | * 获取exception的详细错误信息。 16 | */ 17 | public static String getExceptionMessage(Throwable e) 18 | { 19 | StringWriter sw = new StringWriter(); 20 | e.printStackTrace(new PrintWriter(sw, true)); 21 | return sw.toString(); 22 | } 23 | 24 | public static String getRootErrorMessage(Exception e) 25 | { 26 | Throwable root = ExceptionUtils.getRootCause(e); 27 | root = (root == null ? e : root); 28 | if (root == null) 29 | { 30 | return ""; 31 | } 32 | String msg = root.getMessage(); 33 | if (msg == null) 34 | { 35 | return "null"; 36 | } 37 | return StringUtils.defaultString(msg); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Fly/fly-system/src/main/java/com/zzk/system/domain/vo/fly/AreaQueryVo.java: -------------------------------------------------------------------------------- 1 | package com.zzk.system.domain.vo.fly; 2 | 3 | import lombok.Data; 4 | import org.springframework.data.mongodb.core.mapping.Field; 5 | import org.springframework.format.annotation.DateTimeFormat; 6 | 7 | import java.util.Date; 8 | 9 | /** 10 | * @description: 查询禁飞区Vo 11 | * @program: Fly 12 | * @author: zzk 13 | * @created: 2023/04/02 16:55 14 | */ 15 | @Data 16 | public class AreaQueryVo { 17 | private Integer pageNum = 1; 18 | private Integer pageSize = 10; 19 | 20 | 21 | 22 | /** 23 | * 禁飞区名称 24 | */ 25 | @Field("areaName") 26 | private String areaName; 27 | 28 | 29 | 30 | /** 31 | * 创建用户id 32 | */ 33 | @Field("userId") 34 | private String userId; 35 | /** 36 | * 创建用户名称 37 | */ 38 | @Field("username") 39 | private String username; 40 | 41 | /** 42 | * 禁飞区创建时间 43 | */ 44 | @Field("createdAt") 45 | @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) 46 | private Date createdAt; 47 | 48 | 49 | 50 | } 51 | -------------------------------------------------------------------------------- /Fly/fly-system/src/main/java/com/zzk/system/mapper/SysOperLogMapper.java: -------------------------------------------------------------------------------- 1 | package com.zzk.system.mapper; 2 | 3 | import java.util.List; 4 | import com.zzk.system.domain.SysOperLog; 5 | 6 | /** 7 | * 操作日志 数据层 8 | * 9 | * @author ruoyi 10 | */ 11 | public interface SysOperLogMapper 12 | { 13 | /** 14 | * 新增操作日志 15 | * 16 | * @param operLog 操作日志对象 17 | */ 18 | public void insertOperlog(SysOperLog operLog); 19 | 20 | /** 21 | * 查询系统操作日志集合 22 | * 23 | * @param operLog 操作日志对象 24 | * @return 操作日志集合 25 | */ 26 | public List selectOperLogList(SysOperLog operLog); 27 | 28 | /** 29 | * 批量删除系统操作日志 30 | * 31 | * @param operIds 需要删除的操作日志ID 32 | * @return 结果 33 | */ 34 | public int deleteOperLogByIds(Long[] operIds); 35 | 36 | /** 37 | * 查询操作日志详细 38 | * 39 | * @param operId 操作ID 40 | * @return 操作日志对象 41 | */ 42 | public SysOperLog selectOperLogById(Long operId); 43 | 44 | /** 45 | * 清空操作日志 46 | */ 47 | public void cleanOperLog(); 48 | } 49 | -------------------------------------------------------------------------------- /fly-ui/src/api/system/dept.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 查询部门列表 4 | export function listDept(query) { 5 | return request({ 6 | url: '/system/dept/list', 7 | method: 'get', 8 | params: query 9 | }) 10 | } 11 | 12 | // 查询部门列表(排除节点) 13 | export function listDeptExcludeChild(deptId) { 14 | return request({ 15 | url: '/system/dept/list/exclude/' + deptId, 16 | method: 'get' 17 | }) 18 | } 19 | 20 | // 查询部门详细 21 | export function getDept(deptId) { 22 | return request({ 23 | url: '/system/dept/' + deptId, 24 | method: 'get' 25 | }) 26 | } 27 | 28 | // 新增部门 29 | export function addDept(data) { 30 | return request({ 31 | url: '/system/dept', 32 | method: 'post', 33 | data: data 34 | }) 35 | } 36 | 37 | // 修改部门 38 | export function updateDept(data) { 39 | return request({ 40 | url: '/system/dept', 41 | method: 'put', 42 | data: data 43 | }) 44 | } 45 | 46 | // 删除部门 47 | export function delDept(deptId) { 48 | return request({ 49 | url: '/system/dept/' + deptId, 50 | method: 'delete' 51 | }) 52 | } -------------------------------------------------------------------------------- /Fly/fly-system/src/main/java/com/zzk/system/service/ISysOperLogService.java: -------------------------------------------------------------------------------- 1 | package com.zzk.system.service; 2 | 3 | import java.util.List; 4 | import com.zzk.system.domain.SysOperLog; 5 | 6 | /** 7 | * 操作日志 服务层 8 | * 9 | * @author ruoyi 10 | */ 11 | public interface ISysOperLogService 12 | { 13 | /** 14 | * 新增操作日志 15 | * 16 | * @param operLog 操作日志对象 17 | */ 18 | public void insertOperlog(SysOperLog operLog); 19 | 20 | /** 21 | * 查询系统操作日志集合 22 | * 23 | * @param operLog 操作日志对象 24 | * @return 操作日志集合 25 | */ 26 | public List selectOperLogList(SysOperLog operLog); 27 | 28 | /** 29 | * 批量删除系统操作日志 30 | * 31 | * @param operIds 需要删除的操作日志ID 32 | * @return 结果 33 | */ 34 | public int deleteOperLogByIds(Long[] operIds); 35 | 36 | /** 37 | * 查询操作日志详细 38 | * 39 | * @param operId 操作ID 40 | * @return 操作日志对象 41 | */ 42 | public SysOperLog selectOperLogById(Long operId); 43 | 44 | /** 45 | * 清空操作日志 46 | */ 47 | public void cleanOperLog(); 48 | } 49 | -------------------------------------------------------------------------------- /fly-ui/src/utils/dict/index.js: -------------------------------------------------------------------------------- 1 | import Dict from './Dict' 2 | import { mergeOptions } from './DictOptions' 3 | 4 | export default function(Vue, options) { 5 | mergeOptions(options) 6 | Vue.mixin({ 7 | data() { 8 | if (this.$options === undefined || this.$options.dicts === undefined || this.$options.dicts === null) { 9 | return {} 10 | } 11 | const dict = new Dict() 12 | dict.owner = this 13 | return { 14 | dict 15 | } 16 | }, 17 | created() { 18 | if (!(this.dict instanceof Dict)) { 19 | return 20 | } 21 | options.onCreated && options.onCreated(this.dict) 22 | this.dict.init(this.$options.dicts).then(() => { 23 | options.onReady && options.onReady(this.dict) 24 | this.$nextTick(() => { 25 | this.$emit('dictReady', this.dict) 26 | if (this.$options.methods && this.$options.methods.onDictReady instanceof Function) { 27 | this.$options.methods.onDictReady.call(this, this.dict) 28 | } 29 | }) 30 | }) 31 | }, 32 | }) 33 | } 34 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/utils/uuid/IdUtils.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.utils.uuid; 2 | 3 | /** 4 | * ID生成器工具类 5 | * 6 | * @author ruoyi 7 | */ 8 | public class IdUtils 9 | { 10 | /** 11 | * 获取随机UUID 12 | * 13 | * @return 随机UUID 14 | */ 15 | public static String randomUUID() 16 | { 17 | return UUID.randomUUID().toString(); 18 | } 19 | 20 | /** 21 | * 简化的UUID,去掉了横线 22 | * 23 | * @return 简化的UUID,去掉了横线 24 | */ 25 | public static String simpleUUID() 26 | { 27 | return UUID.randomUUID().toString(true); 28 | } 29 | 30 | /** 31 | * 获取随机UUID,使用性能更好的ThreadLocalRandom生成UUID 32 | * 33 | * @return 随机UUID 34 | */ 35 | public static String fastUUID() 36 | { 37 | return UUID.fastUUID().toString(); 38 | } 39 | 40 | /** 41 | * 简化的UUID,去掉了横线,使用性能更好的ThreadLocalRandom生成UUID 42 | * 43 | * @return 简化的UUID,去掉了横线 44 | */ 45 | public static String fastSimpleUUID() 46 | { 47 | return UUID.fastUUID().toString(true); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /Fly/fly-generator/src/main/java/com/zzk/generator/service/IGenTableColumnService.java: -------------------------------------------------------------------------------- 1 | package com.zzk.generator.service; 2 | 3 | import java.util.List; 4 | import com.zzk.generator.domain.GenTableColumn; 5 | 6 | /** 7 | * 业务字段 服务层 8 | * 9 | * @author ruoyi 10 | */ 11 | public interface IGenTableColumnService 12 | { 13 | /** 14 | * 查询业务字段列表 15 | * 16 | * @param tableId 业务字段编号 17 | * @return 业务字段集合 18 | */ 19 | public List selectGenTableColumnListByTableId(Long tableId); 20 | 21 | /** 22 | * 新增业务字段 23 | * 24 | * @param genTableColumn 业务字段信息 25 | * @return 结果 26 | */ 27 | public int insertGenTableColumn(GenTableColumn genTableColumn); 28 | 29 | /** 30 | * 修改业务字段 31 | * 32 | * @param genTableColumn 业务字段信息 33 | * @return 结果 34 | */ 35 | public int updateGenTableColumn(GenTableColumn genTableColumn); 36 | 37 | /** 38 | * 删除业务字段信息 39 | * 40 | * @param ids 需要删除的数据ID 41 | * @return 结果 42 | */ 43 | public int deleteGenTableColumnByIds(String ids); 44 | } 45 | -------------------------------------------------------------------------------- /Fly/fly-system/src/main/java/com/zzk/system/domain/SysRoleDept.java: -------------------------------------------------------------------------------- 1 | package com.zzk.system.domain; 2 | 3 | import org.apache.commons.lang3.builder.ToStringBuilder; 4 | import org.apache.commons.lang3.builder.ToStringStyle; 5 | 6 | /** 7 | * 角色和部门关联 sys_role_dept 8 | * 9 | * @author ruoyi 10 | */ 11 | public class SysRoleDept 12 | { 13 | /** 角色ID */ 14 | private Long roleId; 15 | 16 | /** 部门ID */ 17 | private Long deptId; 18 | 19 | public Long getRoleId() 20 | { 21 | return roleId; 22 | } 23 | 24 | public void setRoleId(Long roleId) 25 | { 26 | this.roleId = roleId; 27 | } 28 | 29 | public Long getDeptId() 30 | { 31 | return deptId; 32 | } 33 | 34 | public void setDeptId(Long deptId) 35 | { 36 | this.deptId = deptId; 37 | } 38 | 39 | @Override 40 | public String toString() { 41 | return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) 42 | .append("roleId", getRoleId()) 43 | .append("deptId", getDeptId()) 44 | .toString(); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /Fly/fly-system/src/main/java/com/zzk/system/domain/SysRoleMenu.java: -------------------------------------------------------------------------------- 1 | package com.zzk.system.domain; 2 | 3 | import org.apache.commons.lang3.builder.ToStringBuilder; 4 | import org.apache.commons.lang3.builder.ToStringStyle; 5 | 6 | /** 7 | * 角色和菜单关联 sys_role_menu 8 | * 9 | * @author ruoyi 10 | */ 11 | public class SysRoleMenu 12 | { 13 | /** 角色ID */ 14 | private Long roleId; 15 | 16 | /** 菜单ID */ 17 | private Long menuId; 18 | 19 | public Long getRoleId() 20 | { 21 | return roleId; 22 | } 23 | 24 | public void setRoleId(Long roleId) 25 | { 26 | this.roleId = roleId; 27 | } 28 | 29 | public Long getMenuId() 30 | { 31 | return menuId; 32 | } 33 | 34 | public void setMenuId(Long menuId) 35 | { 36 | this.menuId = menuId; 37 | } 38 | 39 | @Override 40 | public String toString() { 41 | return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) 42 | .append("roleId", getRoleId()) 43 | .append("menuId", getMenuId()) 44 | .toString(); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /Fly/fly-system/src/main/java/com/zzk/system/domain/SysUserPost.java: -------------------------------------------------------------------------------- 1 | package com.zzk.system.domain; 2 | 3 | import org.apache.commons.lang3.builder.ToStringBuilder; 4 | import org.apache.commons.lang3.builder.ToStringStyle; 5 | 6 | /** 7 | * 用户和岗位关联 sys_user_post 8 | * 9 | * @author ruoyi 10 | */ 11 | public class SysUserPost 12 | { 13 | /** 用户ID */ 14 | private Long userId; 15 | 16 | /** 岗位ID */ 17 | private Long postId; 18 | 19 | public Long getUserId() 20 | { 21 | return userId; 22 | } 23 | 24 | public void setUserId(Long userId) 25 | { 26 | this.userId = userId; 27 | } 28 | 29 | public Long getPostId() 30 | { 31 | return postId; 32 | } 33 | 34 | public void setPostId(Long postId) 35 | { 36 | this.postId = postId; 37 | } 38 | 39 | @Override 40 | public String toString() { 41 | return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) 42 | .append("userId", getUserId()) 43 | .append("postId", getPostId()) 44 | .toString(); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /Fly/fly-system/src/main/java/com/zzk/system/domain/SysUserRole.java: -------------------------------------------------------------------------------- 1 | package com.zzk.system.domain; 2 | 3 | import org.apache.commons.lang3.builder.ToStringBuilder; 4 | import org.apache.commons.lang3.builder.ToStringStyle; 5 | 6 | /** 7 | * 用户和角色关联 sys_user_role 8 | * 9 | * @author ruoyi 10 | */ 11 | public class SysUserRole 12 | { 13 | /** 用户ID */ 14 | private Long userId; 15 | 16 | /** 角色ID */ 17 | private Long roleId; 18 | 19 | public Long getUserId() 20 | { 21 | return userId; 22 | } 23 | 24 | public void setUserId(Long userId) 25 | { 26 | this.userId = userId; 27 | } 28 | 29 | public Long getRoleId() 30 | { 31 | return roleId; 32 | } 33 | 34 | public void setRoleId(Long roleId) 35 | { 36 | this.roleId = roleId; 37 | } 38 | 39 | @Override 40 | public String toString() { 41 | return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) 42 | .append("userId", getUserId()) 43 | .append("roleId", getRoleId()) 44 | .toString(); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /client/.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | # Licensed to the Apache Software Foundation (ASF) under one 2 | # or more contributor license agreements. See the NOTICE file 3 | # distributed with this work for additional information 4 | # regarding copyright ownership. The ASF licenses this file 5 | # to you under the Apache License, Version 2.0 (the 6 | # "License"); you may not use this file except in compliance 7 | # with the License. You may obtain a copy of the License at 8 | # 9 | # https://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, 12 | # software distributed under the License is distributed on an 13 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 14 | # KIND, either express or implied. See the License for the 15 | # specific language governing permissions and limitations 16 | # under the License. 17 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.7/apache-maven-3.8.7-bin.zip 18 | wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar 19 | -------------------------------------------------------------------------------- /fly-ui/src/api/login.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 登录方法 4 | export function login(username, password, code, uuid) { 5 | const data = { 6 | username, 7 | password, 8 | code, 9 | uuid 10 | } 11 | return request({ 12 | url: '/login', 13 | headers: { 14 | isToken: false 15 | }, 16 | method: 'post', 17 | data: data 18 | }) 19 | } 20 | 21 | // 注册方法 22 | export function register(data) { 23 | return request({ 24 | url: '/register', 25 | headers: { 26 | isToken: false 27 | }, 28 | method: 'post', 29 | data: data 30 | }) 31 | } 32 | 33 | // 获取用户详细信息 34 | export function getInfo() { 35 | return request({ 36 | url: '/getInfo', 37 | method: 'get' 38 | }) 39 | } 40 | 41 | // 退出方法 42 | export function logout() { 43 | return request({ 44 | url: '/logout', 45 | method: 'post' 46 | }) 47 | } 48 | 49 | // 获取验证码 50 | export function getCodeImg() { 51 | return request({ 52 | url: '/captchaImage', 53 | headers: { 54 | isToken: false 55 | }, 56 | method: 'get', 57 | timeout: 20000 58 | }) 59 | } -------------------------------------------------------------------------------- /fly-ui/src/utils/dict/DictMeta.js: -------------------------------------------------------------------------------- 1 | import { mergeRecursive } from "@/utils/ruoyi"; 2 | import DictOptions from './DictOptions' 3 | 4 | /** 5 | * @classdesc 字典元数据 6 | * @property {String} type 类型 7 | * @property {Function} request 请求 8 | * @property {String} label 标签字段 9 | * @property {String} value 值字段 10 | */ 11 | export default class DictMeta { 12 | constructor(options) { 13 | this.type = options.type 14 | this.request = options.request 15 | this.responseConverter = options.responseConverter 16 | this.labelField = options.labelField 17 | this.valueField = options.valueField 18 | this.lazy = options.lazy === true 19 | } 20 | } 21 | 22 | 23 | /** 24 | * 解析字典元数据 25 | * @param {Object} options 26 | * @returns {DictMeta} 27 | */ 28 | DictMeta.parse= function(options) { 29 | let opts = null 30 | if (typeof options === 'string') { 31 | opts = DictOptions.metas[options] || {} 32 | opts.type = options 33 | } else if (typeof options === 'object') { 34 | opts = options 35 | } 36 | opts = mergeRecursive(DictOptions.metas['*'], opts) 37 | return new DictMeta(opts) 38 | } 39 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/international.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fly-ui/src/api/system/dict/data.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 查询字典数据列表 4 | export function listData(query) { 5 | return request({ 6 | url: '/system/dict/data/list', 7 | method: 'get', 8 | params: query 9 | }) 10 | } 11 | 12 | // 查询字典数据详细 13 | export function getData(dictCode) { 14 | return request({ 15 | url: '/system/dict/data/' + dictCode, 16 | method: 'get' 17 | }) 18 | } 19 | 20 | // 根据字典类型查询字典数据信息 21 | export function getDicts(dictType) { 22 | return request({ 23 | url: '/system/dict/data/type/' + dictType, 24 | method: 'get' 25 | }) 26 | } 27 | 28 | // 新增字典数据 29 | export function addData(data) { 30 | return request({ 31 | url: '/system/dict/data', 32 | method: 'post', 33 | data: data 34 | }) 35 | } 36 | 37 | // 修改字典数据 38 | export function updateData(data) { 39 | return request({ 40 | url: '/system/dict/data', 41 | method: 'put', 42 | data: data 43 | }) 44 | } 45 | 46 | // 删除字典数据 47 | export function delData(dictCode) { 48 | return request({ 49 | url: '/system/dict/data/' + dictCode, 50 | method: 'delete' 51 | }) 52 | } 53 | -------------------------------------------------------------------------------- /Fly/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2018 RuoYi 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/question.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/src/main/java/com/zzk/client/clientServe/ClientHeartbeatHandler.java: -------------------------------------------------------------------------------- 1 | package com.zzk.client.clientServe; 2 | 3 | import io.netty.buffer.ByteBuf; 4 | import io.netty.buffer.Unpooled; 5 | import io.netty.channel.ChannelHandlerContext; 6 | 7 | import static io.netty.handler.codec.dns.DnsRecordType.A; 8 | 9 | public class ClientHeartbeatHandler extends CustomHeartbeatHandler { 10 | public ClientHeartbeatHandler() { 11 | super("server"); 12 | } 13 | 14 | @Override 15 | protected void handleData(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf) { 16 | } 17 | 18 | @Override 19 | protected void handleReaderIdle(ChannelHandlerContext ctx) { 20 | super.handleReaderIdle(ctx); 21 | System.err.println("---client " + ctx.channel().remoteAddress().toString() + " reader timeout, close it---"); 22 | ctx.close(); 23 | } 24 | 25 | @Override 26 | protected void handleAllIdle(ChannelHandlerContext ctx) { 27 | byte[] data = new byte[]{0x03,0x00,0x40,0x04,0x00,0x00,0x00,0x01, (byte) 0x8C, (byte) 0xDD}; 28 | ctx.writeAndFlush (data); 29 | super.handleAllIdle (ctx); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/wechat.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fly-ui/src/components/Map/search/search.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 搜索 12 | 13 | 14 | 15 | 16 | 17 | 42 | 43 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/annotation/Log.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.annotation; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | import com.zzk.common.enums.BusinessType; 9 | import com.zzk.common.enums.OperatorType; 10 | 11 | /** 12 | * 自定义操作日志记录注解 13 | * 14 | * @author ruoyi 15 | * 16 | */ 17 | @Target({ ElementType.PARAMETER, ElementType.METHOD }) 18 | @Retention(RetentionPolicy.RUNTIME) 19 | @Documented 20 | public @interface Log 21 | { 22 | /** 23 | * 模块 24 | */ 25 | public String title() default ""; 26 | 27 | /** 28 | * 功能 29 | */ 30 | public BusinessType businessType() default BusinessType.OTHER; 31 | 32 | /** 33 | * 操作人类别 34 | */ 35 | public OperatorType operatorType() default OperatorType.MANAGE; 36 | 37 | /** 38 | * 是否保存请求的参数 39 | */ 40 | public boolean isSaveRequestData() default true; 41 | 42 | /** 43 | * 是否保存响应的参数 44 | */ 45 | public boolean isSaveResponseData() default true; 46 | } 47 | -------------------------------------------------------------------------------- /Fly/fly-generator/src/main/resources/vm/js/api.js.vm: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 查询${functionName}列表 4 | export function list${BusinessName}(query) { 5 | return request({ 6 | url: '/${moduleName}/${businessName}/list', 7 | method: 'get', 8 | params: query 9 | }) 10 | } 11 | 12 | // 查询${functionName}详细 13 | export function get${BusinessName}(${pkColumn.javaField}) { 14 | return request({ 15 | url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, 16 | method: 'get' 17 | }) 18 | } 19 | 20 | // 新增${functionName} 21 | export function add${BusinessName}(data) { 22 | return request({ 23 | url: '/${moduleName}/${businessName}', 24 | method: 'post', 25 | data: data 26 | }) 27 | } 28 | 29 | // 修改${functionName} 30 | export function update${BusinessName}(data) { 31 | return request({ 32 | url: '/${moduleName}/${businessName}', 33 | method: 'put', 34 | data: data 35 | }) 36 | } 37 | 38 | // 删除${functionName} 39 | export function del${BusinessName}(${pkColumn.javaField}) { 40 | return request({ 41 | url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, 42 | method: 'delete' 43 | }) 44 | } 45 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/skill.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Fly/fly-framework/src/main/java/com/zzk/framework/datasource/DynamicDataSourceContextHolder.java: -------------------------------------------------------------------------------- 1 | package com.zzk.framework.datasource; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | 6 | /** 7 | * 数据源切换处理 8 | * 9 | * @author ruoyi 10 | */ 11 | public class DynamicDataSourceContextHolder 12 | { 13 | public static final Logger log = LoggerFactory.getLogger(DynamicDataSourceContextHolder.class); 14 | 15 | /** 16 | * 使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本, 17 | * 所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 18 | */ 19 | private static final ThreadLocal CONTEXT_HOLDER = new ThreadLocal<>(); 20 | 21 | /** 22 | * 设置数据源的变量 23 | */ 24 | public static void setDataSourceType(String dsType) 25 | { 26 | log.info("切换到{}数据源", dsType); 27 | CONTEXT_HOLDER.set(dsType); 28 | } 29 | 30 | /** 31 | * 获得数据源的变量 32 | */ 33 | public static String getDataSourceType() 34 | { 35 | return CONTEXT_HOLDER.get(); 36 | } 37 | 38 | /** 39 | * 清空数据源变量 40 | */ 41 | public static void clearDataSourceType() 42 | { 43 | CONTEXT_HOLDER.remove(); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /client/src/main/java/com/zzk/client/clientServe/EncoderHandler.java: -------------------------------------------------------------------------------- 1 | package com.zzk.client.clientServe; 2 | 3 | import io.netty.buffer.ByteBuf; 4 | import io.netty.channel.ChannelHandlerContext; 5 | import io.netty.handler.codec.MessageToByteEncoder; 6 | import org.slf4j.Logger; 7 | import org.slf4j.LoggerFactory; 8 | import org.springframework.stereotype.Component; 9 | 10 | /** 11 | * @description: 12 | * @program: nettyTestDemo 13 | * @author: zzk 14 | * @created: 2021/12/04 19:02 15 | */ 16 | @Component 17 | public class EncoderHandler extends MessageToByteEncoder { 18 | private static final Logger logger = LoggerFactory.getLogger(EncoderHandler.class); 19 | protected void encode(ChannelHandlerContext ctx, Object msg, ByteBuf out) throws Exception { 20 | 21 | TcpProtocol protocol = new TcpProtocol (); 22 | out.writeByte(protocol.getHeader1()); 23 | out.writeByte(protocol.getHeader2()); 24 | out.writeByte (((byte[])msg).length); 25 | out.writeBytes((byte[]) msg); 26 | out.writeByte(protocol.getTail1()); 27 | out.writeByte(protocol.getTail2()); 28 | logger.debug("数据编码成功:"+out); 29 | 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/people.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/constant/ScheduleConstants.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.constant; 2 | 3 | /** 4 | * 任务调度通用常量 5 | * 6 | * @author ruoyi 7 | */ 8 | public class ScheduleConstants 9 | { 10 | public static final String TASK_CLASS_NAME = "TASK_CLASS_NAME"; 11 | 12 | /** 执行目标key */ 13 | public static final String TASK_PROPERTIES = "TASK_PROPERTIES"; 14 | 15 | /** 默认 */ 16 | public static final String MISFIRE_DEFAULT = "0"; 17 | 18 | /** 立即触发执行 */ 19 | public static final String MISFIRE_IGNORE_MISFIRES = "1"; 20 | 21 | /** 触发一次执行 */ 22 | public static final String MISFIRE_FIRE_AND_PROCEED = "2"; 23 | 24 | /** 不触发立即执行 */ 25 | public static final String MISFIRE_DO_NOTHING = "3"; 26 | 27 | public enum Status 28 | { 29 | /** 30 | * 正常 31 | */ 32 | NORMAL("0"), 33 | /** 34 | * 暂停 35 | */ 36 | PAUSE("1"); 37 | 38 | private String value; 39 | 40 | private Status(String value) 41 | { 42 | this.value = value; 43 | } 44 | 45 | public String getValue() 46 | { 47 | return value; 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/post.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/constant/CacheConstants.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.constant; 2 | 3 | /** 4 | * 缓存的key 常量 5 | * 6 | * @author ruoyi 7 | */ 8 | public class CacheConstants 9 | { 10 | /** 11 | * 登录用户 redis key 12 | */ 13 | public static final String LOGIN_TOKEN_KEY = "login_tokens:"; 14 | 15 | /** 16 | * 验证码 redis key 17 | */ 18 | public static final String CAPTCHA_CODE_KEY = "captcha_codes:"; 19 | 20 | /** 21 | * 参数管理 cache key 22 | */ 23 | public static final String SYS_CONFIG_KEY = "sys_config:"; 24 | 25 | /** 26 | * 字典管理 cache key 27 | */ 28 | public static final String SYS_DICT_KEY = "sys_dict:"; 29 | 30 | /** 31 | * 防重提交 redis key 32 | */ 33 | public static final String REPEAT_SUBMIT_KEY = "repeat_submit:"; 34 | 35 | /** 36 | * 限流 redis key 37 | */ 38 | public static final String RATE_LIMIT_KEY = "rate_limit:"; 39 | 40 | /** 41 | * 登录账户密码错误次数 redis key 42 | */ 43 | public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:"; 44 | 45 | /** 46 | * 飞行器登录 47 | */ 48 | public static final String DRONE_LOGIN_key ="drone_login:"; 49 | 50 | 51 | 52 | } 53 | -------------------------------------------------------------------------------- /fly-ui/src/layout/components/InnerLink/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | 12 | 48 | -------------------------------------------------------------------------------- /Fly/fly-admin/src/main/java/com/zzk/web/netty/Handler/EncoderHandler.java: -------------------------------------------------------------------------------- 1 | package com.zzk.web.netty.Handler; 2 | 3 | import com.zzk.web.netty.TcpServer; 4 | import io.netty.buffer.ByteBuf; 5 | import io.netty.channel.ChannelHandlerContext; 6 | import io.netty.handler.codec.MessageToByteEncoder; 7 | import org.slf4j.Logger; 8 | import org.slf4j.LoggerFactory; 9 | import org.springframework.stereotype.Component; 10 | 11 | /** 12 | * @description: 13 | * @program: nettyTestDemo 14 | * @author: zzk 15 | * @created: 2021/12/04 19:02 16 | */ 17 | @Component 18 | public class EncoderHandler extends MessageToByteEncoder { 19 | private static final Logger logger = LoggerFactory.getLogger(TcpServer.class); 20 | protected void encode(ChannelHandlerContext ctx, Object msg, ByteBuf out) throws Exception { 21 | 22 | TcpProtocol protocol = new TcpProtocol (); 23 | out.writeByte(protocol.getHeader1()); 24 | out.writeByte(protocol.getHeader2()); 25 | out.writeByte (((byte[])msg).length); 26 | out.writeBytes((byte[]) msg); 27 | out.writeByte(protocol.getTail1()); 28 | out.writeByte(protocol.getTail2()); 29 | logger.debug("数据编码成功:"+out); 30 | 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Fly/fly-system/src/main/java/com/zzk/system/service/fly/IHistoryPathService.java: -------------------------------------------------------------------------------- 1 | package com.zzk.system.service.fly; 2 | 3 | import com.mongodb.client.result.DeleteResult; 4 | import com.mongodb.client.result.UpdateResult; 5 | import com.zzk.system.domain.fly.HistoryPath; 6 | import com.zzk.system.domain.vo.fly.HistoryPathQueryVo; 7 | 8 | /** 9 | * @description: 历史路径服务层 10 | * @program: Fly 11 | * @author: zzk 12 | * @created: 2023/03/27 14:01 13 | */ 14 | public interface IHistoryPathService { 15 | /** 16 | * 上传路径 17 | * @param path 18 | * @return 19 | */ 20 | HistoryPath uploadPath(HistoryPath path); 21 | 22 | /** 23 | * 查询历史路径list 24 | * @param pathQueryVo 25 | * @return 26 | */ 27 | Object list(HistoryPathQueryVo pathQueryVo); 28 | 29 | /** 30 | * 查询历史路径细节 31 | * @param id 32 | * @return 33 | */ 34 | HistoryPath queryPathDeatilsById(String id); 35 | 36 | /** 37 | * 删除历史路径 38 | * @param id 39 | * @return 40 | */ 41 | DeleteResult deleteHistoryPathById(String id); 42 | 43 | /** 44 | * 修改历史路径 45 | * @param historyPath 46 | * @return 47 | */ 48 | UpdateResult updatePath(HistoryPath historyPath); 49 | } 50 | -------------------------------------------------------------------------------- /Fly/fly-system/src/main/java/com/zzk/system/domain/fly/Location.java: -------------------------------------------------------------------------------- 1 | package com.zzk.system.domain.fly; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | import org.springframework.data.mongodb.core.mapping.Field; 7 | import org.springframework.format.annotation.DateTimeFormat; 8 | 9 | import java.util.Date; 10 | 11 | /** 12 | * @description: 位置 13 | * @program: Fly 14 | * @author: zzk 15 | * @created: 2023/03/09 16:29 16 | */ 17 | @Data 18 | @AllArgsConstructor 19 | @NoArgsConstructor 20 | public class Location { 21 | 22 | /** 23 | * 日期+时间 24 | */ 25 | @Field("dateTime") 26 | @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) 27 | private Date dateTime; 28 | /** 29 | * 纬度 30 | */ 31 | @Field("lat") 32 | private String lat; //纬度 33 | /** 34 | * 精度 35 | */ 36 | @Field("lng") 37 | private String lng; //经度 38 | 39 | /** 40 | * 速度 41 | */ 42 | @Field("speed") 43 | private String speed; 44 | /** 45 | * 所在高度 46 | */ 47 | @Field("altitude") 48 | private String altitude; 49 | /** 50 | * 方向 51 | */ 52 | @Field("direction") 53 | private String direction; 54 | 55 | } 56 | -------------------------------------------------------------------------------- /fly-ui/src/api/system/menu.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 查询菜单列表 4 | export function listMenu(query) { 5 | return request({ 6 | url: '/system/menu/list', 7 | method: 'get', 8 | params: query 9 | }) 10 | } 11 | 12 | // 查询菜单详细 13 | export function getMenu(menuId) { 14 | return request({ 15 | url: '/system/menu/' + menuId, 16 | method: 'get' 17 | }) 18 | } 19 | 20 | // 查询菜单下拉树结构 21 | export function treeselect() { 22 | return request({ 23 | url: '/system/menu/treeselect', 24 | method: 'get' 25 | }) 26 | } 27 | 28 | // 根据角色ID查询菜单下拉树结构 29 | export function roleMenuTreeselect(roleId) { 30 | return request({ 31 | url: '/system/menu/roleMenuTreeselect/' + roleId, 32 | method: 'get' 33 | }) 34 | } 35 | 36 | // 新增菜单 37 | export function addMenu(data) { 38 | return request({ 39 | url: '/system/menu', 40 | method: 'post', 41 | data: data 42 | }) 43 | } 44 | 45 | // 修改菜单 46 | export function updateMenu(data) { 47 | return request({ 48 | url: '/system/menu', 49 | method: 'put', 50 | data: data 51 | }) 52 | } 53 | 54 | // 删除菜单 55 | export function delMenu(menuId) { 56 | return request({ 57 | url: '/system/menu/' + menuId, 58 | method: 'delete' 59 | }) 60 | } -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/checkbox.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/language.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Fly/fly-framework/src/main/java/com/zzk/framework/web/domain/server/Mem.java: -------------------------------------------------------------------------------- 1 | package com.zzk.framework.web.domain.server; 2 | 3 | import com.zzk.common.utils.Arith; 4 | 5 | /** 6 | * 內存相关信息 7 | * 8 | * @author ruoyi 9 | */ 10 | public class Mem 11 | { 12 | /** 13 | * 内存总量 14 | */ 15 | private double total; 16 | 17 | /** 18 | * 已用内存 19 | */ 20 | private double used; 21 | 22 | /** 23 | * 剩余内存 24 | */ 25 | private double free; 26 | 27 | public double getTotal() 28 | { 29 | return Arith.div(total, (1024 * 1024 * 1024), 2); 30 | } 31 | 32 | public void setTotal(long total) 33 | { 34 | this.total = total; 35 | } 36 | 37 | public double getUsed() 38 | { 39 | return Arith.div(used, (1024 * 1024 * 1024), 2); 40 | } 41 | 42 | public void setUsed(long used) 43 | { 44 | this.used = used; 45 | } 46 | 47 | public double getFree() 48 | { 49 | return Arith.div(free, (1024 * 1024 * 1024), 2); 50 | } 51 | 52 | public void setFree(long free) 53 | { 54 | this.free = free; 55 | } 56 | 57 | public double getUsage() 58 | { 59 | return Arith.mul(Arith.div(used, total, 4), 100); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Fly/fly-quartz/src/main/java/com/zzk/quartz/service/ISysJobLogService.java: -------------------------------------------------------------------------------- 1 | package com.zzk.quartz.service; 2 | 3 | import java.util.List; 4 | import com.zzk.quartz.domain.SysJobLog; 5 | 6 | /** 7 | * 定时任务调度日志信息信息 服务层 8 | * 9 | * @author ruoyi 10 | */ 11 | public interface ISysJobLogService 12 | { 13 | /** 14 | * 获取quartz调度器日志的计划任务 15 | * 16 | * @param jobLog 调度日志信息 17 | * @return 调度任务日志集合 18 | */ 19 | public List selectJobLogList(SysJobLog jobLog); 20 | 21 | /** 22 | * 通过调度任务日志ID查询调度信息 23 | * 24 | * @param jobLogId 调度任务日志ID 25 | * @return 调度任务日志对象信息 26 | */ 27 | public SysJobLog selectJobLogById(Long jobLogId); 28 | 29 | /** 30 | * 新增任务日志 31 | * 32 | * @param jobLog 调度日志信息 33 | */ 34 | public void addJobLog(SysJobLog jobLog); 35 | 36 | /** 37 | * 批量删除调度日志信息 38 | * 39 | * @param logIds 需要删除的日志ID 40 | * @return 结果 41 | */ 42 | public int deleteJobLogByIds(Long[] logIds); 43 | 44 | /** 45 | * 删除任务日志 46 | * 47 | * @param jobId 调度日志ID 48 | * @return 结果 49 | */ 50 | public int deleteJobLogById(Long jobId); 51 | 52 | /** 53 | * 清空任务日志 54 | */ 55 | public void cleanJobLog(); 56 | } 57 | -------------------------------------------------------------------------------- /Fly/fly-system/src/main/java/com/zzk/system/service/ISysUserOnlineService.java: -------------------------------------------------------------------------------- 1 | package com.zzk.system.service; 2 | 3 | import com.zzk.common.core.domain.model.LoginUser; 4 | import com.zzk.system.domain.SysUserOnline; 5 | 6 | /** 7 | * 在线用户 服务层 8 | * 9 | * @author ruoyi 10 | */ 11 | public interface ISysUserOnlineService 12 | { 13 | /** 14 | * 通过登录地址查询信息 15 | * 16 | * @param ipaddr 登录地址 17 | * @param user 用户信息 18 | * @return 在线用户信息 19 | */ 20 | public SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user); 21 | 22 | /** 23 | * 通过用户名称查询信息 24 | * 25 | * @param userName 用户名称 26 | * @param user 用户信息 27 | * @return 在线用户信息 28 | */ 29 | public SysUserOnline selectOnlineByUserName(String userName, LoginUser user); 30 | 31 | /** 32 | * 通过登录地址/用户名称查询信息 33 | * 34 | * @param ipaddr 登录地址 35 | * @param userName 用户名称 36 | * @param user 用户信息 37 | * @return 在线用户信息 38 | */ 39 | public SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user); 40 | 41 | /** 42 | * 设置在线用户信息 43 | * 44 | * @param user 用户信息 45 | * @return 在线用户 46 | */ 47 | public SysUserOnline loginUserToUserOnline(LoginUser user); 48 | } 49 | -------------------------------------------------------------------------------- /Fly/fly-system/src/main/java/com/zzk/system/service/fly/IPlanPathService.java: -------------------------------------------------------------------------------- 1 | package com.zzk.system.service.fly; 2 | 3 | import com.mongodb.client.result.DeleteResult; 4 | import com.mongodb.client.result.UpdateResult; 5 | import com.zzk.system.domain.fly.HistoryPath; 6 | import com.zzk.system.domain.fly.PlanPath; 7 | import com.zzk.system.domain.vo.fly.PlanPathQueryVo; 8 | 9 | /** 10 | * @description: 规划航线Service 11 | * @program: Fly 12 | * @author: zzk 13 | * @created: 2023/04/02 16:42 14 | */ 15 | public interface IPlanPathService { 16 | 17 | 18 | /** 19 | * 上传路径 20 | * @param path 21 | * @return 22 | */ 23 | PlanPath uploadPath(PlanPath path); 24 | 25 | /** 26 | * 查询计划列表 27 | * @param pathQueryVo 28 | * @return 29 | */ 30 | Object list(PlanPathQueryVo pathQueryVo); 31 | 32 | /** 33 | * 查询规划路径细节 34 | * @param id 35 | * @return 36 | */ 37 | PlanPath queryPathDeatilsById(String id); 38 | 39 | /** 40 | * 删除规划 41 | * @param id 42 | * @return 43 | */ 44 | DeleteResult deletePlanById(String id); 45 | 46 | /** 47 | * 更新规划路径 48 | * @param planPath 49 | * @return 50 | */ 51 | UpdateResult updatePath(PlanPath planPath); 52 | 53 | } 54 | -------------------------------------------------------------------------------- /fly-ui/src/api/system/dict/type.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 查询字典类型列表 4 | export function listType(query) { 5 | return request({ 6 | url: '/system/dict/type/list', 7 | method: 'get', 8 | params: query 9 | }) 10 | } 11 | 12 | // 查询字典类型详细 13 | export function getType(dictId) { 14 | return request({ 15 | url: '/system/dict/type/' + dictId, 16 | method: 'get' 17 | }) 18 | } 19 | 20 | // 新增字典类型 21 | export function addType(data) { 22 | return request({ 23 | url: '/system/dict/type', 24 | method: 'post', 25 | data: data 26 | }) 27 | } 28 | 29 | // 修改字典类型 30 | export function updateType(data) { 31 | return request({ 32 | url: '/system/dict/type', 33 | method: 'put', 34 | data: data 35 | }) 36 | } 37 | 38 | // 删除字典类型 39 | export function delType(dictId) { 40 | return request({ 41 | url: '/system/dict/type/' + dictId, 42 | method: 'delete' 43 | }) 44 | } 45 | 46 | // 刷新字典缓存 47 | export function refreshCache() { 48 | return request({ 49 | url: '/system/dict/type/refreshCache', 50 | method: 'delete' 51 | }) 52 | } 53 | 54 | // 获取字典选择框列表 55 | export function optionselect() { 56 | return request({ 57 | url: '/system/dict/type/optionselect', 58 | method: 'get' 59 | }) 60 | } -------------------------------------------------------------------------------- /fly-ui/src/utils/jsencrypt.js: -------------------------------------------------------------------------------- 1 | import JSEncrypt from 'jsencrypt/bin/jsencrypt.min' 2 | 3 | // 密钥对生成 http://web.chacuo.net/netrsakeypair 4 | 5 | const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' + 6 | 'nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==' 7 | 8 | const privateKey = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n' + 9 | '7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKN\n' + 10 | 'PuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gA\n' + 11 | 'kM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWow\n' + 12 | 'cSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99Ecv\n' + 13 | 'DQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthh\n' + 14 | 'YhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3\n' + 15 | 'UP8iWi1Qw0Y=' 16 | 17 | // 加密 18 | export function encrypt(txt) { 19 | const encryptor = new JSEncrypt() 20 | encryptor.setPublicKey(publicKey) // 设置公钥 21 | return encryptor.encrypt(txt) // 对数据进行加密 22 | } 23 | 24 | // 解密 25 | export function decrypt(txt) { 26 | const encryptor = new JSEncrypt() 27 | encryptor.setPrivateKey(privateKey) // 设置私钥 28 | return encryptor.decrypt(txt) // 对数据进行解密 29 | } 30 | 31 | -------------------------------------------------------------------------------- /fly-ui/src/directive/dialog/dragWidth.js: -------------------------------------------------------------------------------- 1 | /** 2 | * v-dialogDragWidth 可拖动弹窗宽度(右侧边) 3 | * Copyright (c) 2019 ruoyi 4 | */ 5 | 6 | export default { 7 | bind(el) { 8 | const dragDom = el.querySelector('.el-dialog'); 9 | const lineEl = document.createElement('div'); 10 | lineEl.style = 'width: 5px; background: inherit; height: 80%; position: absolute; right: 0; top: 0; bottom: 0; margin: auto; z-index: 1; cursor: w-resize;'; 11 | lineEl.addEventListener('mousedown', 12 | function (e) { 13 | // 鼠标按下,计算当前元素距离可视区的距离 14 | const disX = e.clientX - el.offsetLeft; 15 | // 当前宽度 16 | const curWidth = dragDom.offsetWidth; 17 | document.onmousemove = function (e) { 18 | e.preventDefault(); // 移动时禁用默认事件 19 | // 通过事件委托,计算移动的距离 20 | const l = e.clientX - disX; 21 | dragDom.style.width = `${curWidth + l}px`; 22 | }; 23 | document.onmouseup = function (e) { 24 | document.onmousemove = null; 25 | document.onmouseup = null; 26 | }; 27 | }, false); 28 | dragDom.appendChild(lineEl); 29 | } 30 | } -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/exception/GlobalException.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.exception; 2 | 3 | /** 4 | * 全局异常 5 | * 6 | * @author ruoyi 7 | */ 8 | public class GlobalException extends RuntimeException 9 | { 10 | private static final long serialVersionUID = 1L; 11 | 12 | /** 13 | * 错误提示 14 | */ 15 | private String message; 16 | 17 | /** 18 | * 错误明细,内部调试错误 19 | * 20 | * 和 {@link CommonResult#getDetailMessage()} 一致的设计 21 | */ 22 | private String detailMessage; 23 | 24 | /** 25 | * 空构造方法,避免反序列化问题 26 | */ 27 | public GlobalException() 28 | { 29 | } 30 | 31 | public GlobalException(String message) 32 | { 33 | this.message = message; 34 | } 35 | 36 | public String getDetailMessage() 37 | { 38 | return detailMessage; 39 | } 40 | 41 | public GlobalException setDetailMessage(String detailMessage) 42 | { 43 | this.detailMessage = detailMessage; 44 | return this; 45 | } 46 | 47 | @Override 48 | public String getMessage() 49 | { 50 | return message; 51 | } 52 | 53 | public GlobalException setMessage(String message) 54 | { 55 | this.message = message; 56 | return this; 57 | } 58 | } -------------------------------------------------------------------------------- /Fly/fly-quartz/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | fly 7 | com.zzk 8 | 3.8.5 9 | 10 | 4.0.0 11 | 12 | fly-quartz 13 | 14 | 15 | quartz定时任务 16 | 17 | 18 | 19 | 20 | 21 | 22 | org.quartz-scheduler 23 | quartz 24 | 25 | 26 | com.mchange 27 | c3p0 28 | 29 | 30 | 31 | 32 | 33 | 34 | com.zzk 35 | fly-common 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /Fly/fly-admin/src/main/resources/i18n/messages.properties: -------------------------------------------------------------------------------- 1 | #错误消息 2 | not.null=* 必须填写 3 | user.jcaptcha.error=验证码错误 4 | user.jcaptcha.expire=验证码已失效 5 | user.not.exists=用户不存在/密码错误 6 | user.password.not.match=用户不存在/密码错误 7 | user.password.retry.limit.count=密码输入错误{0}次 8 | user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定{1}分钟 9 | user.password.delete=对不起,您的账号已被删除 10 | user.blocked=用户已封禁,请联系管理员 11 | role.blocked=角色已封禁,请联系管理员 12 | user.logout.success=退出成功 13 | 14 | length.not.valid=长度必须在{min}到{max}个字符之间 15 | 16 | user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成,且必须以非数字开头 17 | user.password.not.valid=* 5-50个字符 18 | 19 | user.email.not.valid=邮箱格式错误 20 | user.mobile.phone.number.not.valid=手机号格式错误 21 | user.login.success=登录成功 22 | user.register.success=注册成功 23 | user.notfound=请重新登录 24 | user.forcelogout=管理员强制退出,请重新登录 25 | user.unknown.error=未知错误,请重新登录 26 | 27 | ##文件上传消息 28 | upload.exceed.maxSize=上传的文件大小超出限制的文件大小!允许的文件最大大小是:{0}MB! 29 | upload.filename.exceed.length=上传的文件名最长{0}个字符 30 | 31 | ##权限 32 | no.permission=您没有数据的权限,请联系管理员添加权限 [{0}] 33 | no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}] 34 | no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}] 35 | no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}] 36 | no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}] 37 | no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}] 38 | -------------------------------------------------------------------------------- /Fly/fly-generator/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | fly 7 | com.zzk 8 | 3.8.5 9 | 10 | 4.0.0 11 | 12 | fly-generator 13 | 14 | 15 | generator代码生成 16 | 17 | 18 | 19 | 20 | 21 | 22 | org.apache.velocity 23 | velocity-engine-core 24 | 25 | 26 | 27 | 28 | commons-collections 29 | commons-collections 30 | 31 | 32 | 33 | 34 | com.zzk 35 | fly-common 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /Fly/fly-system/src/main/resources/mapper/system/SysUserPostMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | delete from sys_user_post where user_id=#{userId} 14 | 15 | 16 | 17 | select count(1) from sys_user_post where post_id=#{postId} 18 | 19 | 20 | 21 | delete from sys_user_post where user_id in 22 | 23 | #{userId} 24 | 25 | 26 | 27 | 28 | insert into sys_user_post(user_id, post_id) values 29 | 30 | (#{item.userId},#{item.postId}) 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /fly-ui/src/api/system/config.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 查询参数列表 4 | export function listConfig(query) { 5 | return request({ 6 | url: '/system/config/list', 7 | method: 'get', 8 | params: query 9 | }) 10 | } 11 | 12 | // 查询参数详细 13 | export function getConfig(configId) { 14 | return request({ 15 | url: '/system/config/' + configId, 16 | method: 'get' 17 | }) 18 | } 19 | 20 | // 根据参数键名查询参数值 21 | export function getConfigKey(configKey) { 22 | return request({ 23 | url: '/system/config/configKey/' + configKey, 24 | method: 'get' 25 | }) 26 | } 27 | 28 | // 新增参数配置 29 | export function addConfig(data) { 30 | return request({ 31 | url: '/system/config', 32 | method: 'post', 33 | data: data 34 | }) 35 | } 36 | 37 | // 修改参数配置 38 | export function updateConfig(data) { 39 | return request({ 40 | url: '/system/config', 41 | method: 'put', 42 | data: data 43 | }) 44 | } 45 | 46 | // 删除参数配置 47 | export function delConfig(configId) { 48 | return request({ 49 | url: '/system/config/' + configId, 50 | method: 'delete' 51 | }) 52 | } 53 | 54 | // 刷新参数缓存 55 | export function refreshCache() { 56 | return request({ 57 | url: '/system/config/refreshCache', 58 | method: 'delete' 59 | }) 60 | } 61 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/eye-open.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Fly/fly-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | select count(1) from sys_role_menu where menu_id = #{menuId} 14 | 15 | 16 | 17 | delete from sys_role_menu where role_id=#{roleId} 18 | 19 | 20 | 21 | delete from sys_role_menu where role_id in 22 | 23 | #{roleId} 24 | 25 | 26 | 27 | 28 | insert into sys_role_menu(role_id, menu_id) values 29 | 30 | (#{item.roleId},#{item.menuId}) 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /Fly/fly-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | delete from sys_role_dept where role_id=#{roleId} 14 | 15 | 16 | 17 | select count(1) from sys_role_dept where dept_id=#{deptId} 18 | 19 | 20 | 21 | delete from sys_role_dept where role_id in 22 | 23 | #{roleId} 24 | 25 | 26 | 27 | 28 | insert into sys_role_dept(role_id, dept_id) values 29 | 30 | (#{item.roleId},#{item.deptId}) 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /fly-ui/src/components/Screenfull/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 47 | 48 | 58 | -------------------------------------------------------------------------------- /Fly/fly-common/src/main/java/com/zzk/common/core/domain/model/LoginBody.java: -------------------------------------------------------------------------------- 1 | package com.zzk.common.core.domain.model; 2 | 3 | /** 4 | * 用户登录对象 5 | * 6 | * @author ruoyi 7 | */ 8 | public class LoginBody 9 | { 10 | /** 11 | * 用户名 12 | */ 13 | private String username; 14 | 15 | /** 16 | * 用户密码 17 | */ 18 | private String password; 19 | 20 | /** 21 | * 验证码 22 | */ 23 | private String code; 24 | 25 | /** 26 | * 唯一标识 27 | */ 28 | private String uuid; 29 | 30 | public String getUsername() 31 | { 32 | return username; 33 | } 34 | 35 | public void setUsername(String username) 36 | { 37 | this.username = username; 38 | } 39 | 40 | public String getPassword() 41 | { 42 | return password; 43 | } 44 | 45 | public void setPassword(String password) 46 | { 47 | this.password = password; 48 | } 49 | 50 | public String getCode() 51 | { 52 | return code; 53 | } 54 | 55 | public void setCode(String code) 56 | { 57 | this.code = code; 58 | } 59 | 60 | public String getUuid() 61 | { 62 | return uuid; 63 | } 64 | 65 | public void setUuid(String uuid) 66 | { 67 | this.uuid = uuid; 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /Fly/fly-system/src/main/java/com/zzk/system/domain/vo/fly/PlanPathQueryVo.java: -------------------------------------------------------------------------------- 1 | package com.zzk.system.domain.vo.fly; 2 | 3 | import com.zzk.system.domain.fly.Location; 4 | import lombok.Data; 5 | import org.bson.types.ObjectId; 6 | import org.springframework.data.mongodb.core.mapping.Field; 7 | import org.springframework.format.annotation.DateTimeFormat; 8 | 9 | import java.util.Date; 10 | import java.util.List; 11 | 12 | /** 13 | * @description: 查询规划航迹Vo 14 | * @program: Fly 15 | * @author: zzk 16 | * @created: 2023/04/02 16:55 17 | */ 18 | @Data 19 | public class PlanPathQueryVo { 20 | private Integer pageNum = 1; 21 | private Integer pageSize = 10; 22 | 23 | 24 | /** 25 | * 无人机ObjectId 26 | */ 27 | @Field("droneObjectId") 28 | private String droneObjectId; 29 | 30 | /** 31 | * 计划名称名称 32 | */ 33 | @Field("planName") 34 | private String planName; 35 | 36 | 37 | 38 | /** 39 | * 创建用户id 40 | */ 41 | @Field("userId") 42 | private String userId; 43 | /** 44 | * 创建用户名称 45 | */ 46 | @Field("username") 47 | private String username; 48 | 49 | /** 50 | * 计划创建时间 51 | */ 52 | @Field("createdAt") 53 | @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) 54 | private Date createdAt; 55 | 56 | 57 | 58 | } 59 | -------------------------------------------------------------------------------- /fly-ui/src/api/monitor/cache.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 查询缓存详细 4 | export function getCache() { 5 | return request({ 6 | url: '/monitor/cache', 7 | method: 'get' 8 | }) 9 | } 10 | 11 | // 查询缓存名称列表 12 | export function listCacheName() { 13 | return request({ 14 | url: '/monitor/cache/getNames', 15 | method: 'get' 16 | }) 17 | } 18 | 19 | // 查询缓存键名列表 20 | export function listCacheKey(cacheName) { 21 | return request({ 22 | url: '/monitor/cache/getKeys/' + cacheName, 23 | method: 'get' 24 | }) 25 | } 26 | 27 | // 查询缓存内容 28 | export function getCacheValue(cacheName, cacheKey) { 29 | return request({ 30 | url: '/monitor/cache/getValue/' + cacheName + '/' + cacheKey, 31 | method: 'get' 32 | }) 33 | } 34 | 35 | // 清理指定名称缓存 36 | export function clearCacheName(cacheName) { 37 | return request({ 38 | url: '/monitor/cache/clearCacheName/' + cacheName, 39 | method: 'delete' 40 | }) 41 | } 42 | 43 | // 清理指定键名缓存 44 | export function clearCacheKey(cacheKey) { 45 | return request({ 46 | url: '/monitor/cache/clearCacheKey/' + cacheKey, 47 | method: 'delete' 48 | }) 49 | } 50 | 51 | // 清理全部缓存 52 | export function clearCacheAll() { 53 | return request({ 54 | url: '/monitor/cache/clearCacheAll', 55 | method: 'delete' 56 | }) 57 | } 58 | -------------------------------------------------------------------------------- /fly-ui/src/views/fly/flylist/testmap.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 44 | 45 | 48 | -------------------------------------------------------------------------------- /Fly/fly-framework/src/main/java/com/zzk/framework/manager/AsyncManager.java: -------------------------------------------------------------------------------- 1 | package com.zzk.framework.manager; 2 | 3 | import java.util.TimerTask; 4 | import java.util.concurrent.ScheduledExecutorService; 5 | import java.util.concurrent.TimeUnit; 6 | import com.zzk.common.utils.Threads; 7 | import com.zzk.common.utils.spring.SpringUtils; 8 | 9 | /** 10 | * 异步任务管理器 11 | * 12 | * @author ruoyi 13 | */ 14 | public class AsyncManager 15 | { 16 | /** 17 | * 操作延迟10毫秒 18 | */ 19 | private final int OPERATE_DELAY_TIME = 10; 20 | 21 | /** 22 | * 异步操作任务调度线程池 23 | */ 24 | private ScheduledExecutorService executor = SpringUtils.getBean("scheduledExecutorService"); 25 | 26 | /** 27 | * 单例模式 28 | */ 29 | private AsyncManager(){} 30 | 31 | private static AsyncManager me = new AsyncManager(); 32 | 33 | public static AsyncManager me() 34 | { 35 | return me; 36 | } 37 | 38 | /** 39 | * 执行任务 40 | * 41 | * @param task 任务 42 | */ 43 | public void execute(TimerTask task) 44 | { 45 | executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS); 46 | } 47 | 48 | /** 49 | * 停止任务线程池 50 | */ 51 | public void shutdown() 52 | { 53 | Threads.shutdownAndAwaitTermination(executor); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /Fly/fly-system/src/main/java/com/zzk/system/mapper/SysNoticeMapper.java: -------------------------------------------------------------------------------- 1 | package com.zzk.system.mapper; 2 | 3 | import java.util.List; 4 | import com.zzk.system.domain.SysNotice; 5 | 6 | /** 7 | * 通知公告表 数据层 8 | * 9 | * @author ruoyi 10 | */ 11 | public interface SysNoticeMapper 12 | { 13 | /** 14 | * 查询公告信息 15 | * 16 | * @param noticeId 公告ID 17 | * @return 公告信息 18 | */ 19 | public SysNotice selectNoticeById(Long noticeId); 20 | 21 | /** 22 | * 查询公告列表 23 | * 24 | * @param notice 公告信息 25 | * @return 公告集合 26 | */ 27 | public List selectNoticeList(SysNotice notice); 28 | 29 | /** 30 | * 新增公告 31 | * 32 | * @param notice 公告信息 33 | * @return 结果 34 | */ 35 | public int insertNotice(SysNotice notice); 36 | 37 | /** 38 | * 修改公告 39 | * 40 | * @param notice 公告信息 41 | * @return 结果 42 | */ 43 | public int updateNotice(SysNotice notice); 44 | 45 | /** 46 | * 批量删除公告 47 | * 48 | * @param noticeId 公告ID 49 | * @return 结果 50 | */ 51 | public int deleteNoticeById(Long noticeId); 52 | 53 | /** 54 | * 批量删除公告信息 55 | * 56 | * @param noticeIds 需要删除的公告ID 57 | * @return 结果 58 | */ 59 | public int deleteNoticeByIds(Long[] noticeIds); 60 | } 61 | -------------------------------------------------------------------------------- /Fly/fly-system/src/main/java/com/zzk/system/service/ISysNoticeService.java: -------------------------------------------------------------------------------- 1 | package com.zzk.system.service; 2 | 3 | import java.util.List; 4 | import com.zzk.system.domain.SysNotice; 5 | 6 | /** 7 | * 公告 服务层 8 | * 9 | * @author ruoyi 10 | */ 11 | public interface ISysNoticeService 12 | { 13 | /** 14 | * 查询公告信息 15 | * 16 | * @param noticeId 公告ID 17 | * @return 公告信息 18 | */ 19 | public SysNotice selectNoticeById(Long noticeId); 20 | 21 | /** 22 | * 查询公告列表 23 | * 24 | * @param notice 公告信息 25 | * @return 公告集合 26 | */ 27 | public List selectNoticeList(SysNotice notice); 28 | 29 | /** 30 | * 新增公告 31 | * 32 | * @param notice 公告信息 33 | * @return 结果 34 | */ 35 | public int insertNotice(SysNotice notice); 36 | 37 | /** 38 | * 修改公告 39 | * 40 | * @param notice 公告信息 41 | * @return 结果 42 | */ 43 | public int updateNotice(SysNotice notice); 44 | 45 | /** 46 | * 删除公告信息 47 | * 48 | * @param noticeId 公告ID 49 | * @return 结果 50 | */ 51 | public int deleteNoticeById(Long noticeId); 52 | 53 | /** 54 | * 批量删除公告信息 55 | * 56 | * @param noticeIds 需要删除的公告ID 57 | * @return 结果 58 | */ 59 | public int deleteNoticeByIds(Long[] noticeIds); 60 | } 61 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/validCode.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/radio.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/select.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fly-ui/src/components/Hamburger/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 12 | 13 | 14 | 15 | 16 | 32 | 33 | 45 | -------------------------------------------------------------------------------- /fly-ui/src/assets/icons/svg/upload.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fly-ui/src/components/DictData/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import store from '@/store' 3 | import DataDict from '@/utils/dict' 4 | import { getDicts as getDicts } from '@/api/system/dict/data' 5 | 6 | function searchDictByKey(dict, key) { 7 | if (key == null && key == "") { 8 | return null 9 | } 10 | try { 11 | for (let i = 0; i < dict.length; i++) { 12 | if (dict[i].key == key) { 13 | return dict[i].value 14 | } 15 | } 16 | } catch (e) { 17 | return null 18 | } 19 | } 20 | 21 | function install() { 22 | Vue.use(DataDict, { 23 | metas: { 24 | '*': { 25 | labelField: 'dictLabel', 26 | valueField: 'dictValue', 27 | request(dictMeta) { 28 | const storeDict = searchDictByKey(store.getters.dict, dictMeta.type) 29 | if (storeDict) { 30 | return new Promise(resolve => { resolve(storeDict) }) 31 | } else { 32 | return new Promise((resolve, reject) => { 33 | getDicts(dictMeta.type).then(res => { 34 | store.dispatch('dict/setDict', { key: dictMeta.type, value: res.data }) 35 | resolve(res.data) 36 | }).catch(error => { 37 | reject(error) 38 | }) 39 | }) 40 | } 41 | }, 42 | }, 43 | }, 44 | }) 45 | } 46 | 47 | export default { 48 | install, 49 | } -------------------------------------------------------------------------------- /fly-ui/src/layout/components/AppMain.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 28 | 29 | 53 | 54 | 62 | -------------------------------------------------------------------------------- /fly-ui/src/components/DictTag/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {{ item.label }} 12 | 20 | {{ item.label }} 21 | 22 | 23 | 24 | 25 | 26 | 27 | 48 | --------------------------------------------------------------------------------